From 3566ba37299ee25ded4c6ae551283ffe97ecece4 Mon Sep 17 00:00:00 2001 From: Gani Georgiev Date: Wed, 22 Apr 2026 23:15:46 +0300 Subject: [PATCH] exclude expand from the record draft --- ui/dist/assets/{index-DzC-D-6z.js => index-CZV9KoEP.js} | 2 +- ui/dist/index.html | 2 +- ui/src/records/recordUpsertModal.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename ui/dist/assets/{index-DzC-D-6z.js => index-CZV9KoEP.js} (93%) diff --git a/ui/dist/assets/index-DzC-D-6z.js b/ui/dist/assets/index-CZV9KoEP.js similarity index 93% rename from ui/dist/assets/index-DzC-D-6z.js rename to ui/dist/assets/index-CZV9KoEP.js index 4a488782..12080423 100644 --- a/ui/dist/assets/index-DzC-D-6z.js +++ b/ui/dist/assets/index-CZV9KoEP.js @@ -41,7 +41,7 @@ import{a as e,n,r,t as i}from"./pocketbase.es-B_4DUNUU.js";var a=Object.create,o // load the token into the store final token = '...'; pb.authStore.save(token, null); - `,footnote:t.div({className:`txt-right`},t.a({href:`https://github.com/pocketbase/dart-sdk`,target:`_blank`,rel:`noopener noreferrer`,textContent:`Dart SDK docs`}))}]})),t.footer({className:`modal-footer`},t.button({type:`button`,className:`btn transparent m-r-auto`,disabled:()=>r.isLoading,onclick:()=>app.modals.close()},t.span({className:`txt`},`Close`)),t.button({hidden:()=>r.token,type:`submit`,"html-form":n+`_form`,className:()=>`btn expanded-lg ${r.isLoading?`loading`:``}`,disabled:()=>r.isLoading},t.span({className:`txt`},`Generate token`)),t.button({hidden:()=>!r.token,type:`button`,className:()=>`btn secondary expanded-lg ${r.isLoading?`loading`:``}`,onclick:()=>o()},t.span({className:`txt`},`Generate new one`))))}window.app=window.app||{},window.app.modals=window.app.modals||{},window.app.modals.openRecordUpsert=function(e,n=null,r={onbeforeopen:null,onafteropen:null,onbeforeclose:null,onafterclose:null,onsave:null,ondelete:null,onduplicate:null,ontokensreset:null,onpasswordresetsend:null,onverificationsend:null}){app.store.errors=null;let i=At(e,n,r);i&&(document.body.appendChild(i),app.modals.open(i))};var Et=[`expand`];function Dt(e,n=Et){if(n.find(n=>e[n]!==void 0)){e=Object.assign({},e);for(let r of n)delete e[r]}return e}function Ot(e){e=Dt(e),app.utils.copyToClipboard(JSON.stringify(e,null,2)),app.toasts.success(`Record copied to clipboard!`)}function kt(e){return e?JSON.stringify(e):``}var z=`main`,B=`authProviders`;function At(e,n,r){if(!e?.id){console.warn(`[recordUpsertModal] missing required collection`);return}let i,a=`record_upsert_`+app.utils.randomString(),o=app.utils.getLocalHistory(app.consts.COLUMNS_STORAGE_PREFIX+e.id,{}),s=store({isLoading:!0,isSaving:!1,isLocked:!1,originalRecord:{},record:{},initialDraft:null,activeTab:z,get isNew(){return app.utils.isEmpty(s.originalRecord?.id)},get isAuthCollection(){return e.type==`auth`},get isSuperusersCollection(){return e.name==`_superusers`},get showTabs(){return!s.isNew&&s.isAuthCollection&&!s.isSuperusersCollection},get excludedFields(){let e=[`id`];return s.isAuthCollection&&e.push(`email`,`emailVisibility`,`verified`,`password`,`tokenKey`),e},get initialDraftHash(){return kt(s.initialDraft)},get recordHash(){return kt(s.record)},get originalRecordHash(){return kt(s.originalRecord)},get hasChanges(){return s.originalRecordHash!=s.recordHash},get isFormDisabled(){return s.isLoading||s.isSaving||!s.isNew&&!s.hasChanges}});function c(){return`draft_`+e.id+`_`+(s.originalRecord?.id||``)}function l(){return window.localStorage.getItem(c())||``}function u(){try{let e=l();if(e)return JSON.parse(e)}catch(e){console.warn(`getDraft failure:`,e),f()}return null}function d(e){try{window.localStorage.setItem(c(),e)}catch(e){console.warn(`saveDraft failure:`,e),f()}}function f(){window.localStorage.removeItem(c()),s.initialDraft=null}function p(){if(!s.initialDraft)return;app.store.errors&&(app.store.errors=null);let e=JSON.parse(JSON.stringify(s.initialDraft));f(),s.record=e}let m;function h(){s.initialDraft=u(),m?.unwatch(),m=watch(()=>s.recordHash,(e,n)=>{n!==void 0&&(s.hasChanges?d(s.recordHash):f())})}async function g(n){if(s.isLoading=!0,m?.unwatch(),n=app.utils.isObject(n)?n:{id:n||``},!n.id){s.originalRecord=JSON.parse(JSON.stringify(n)),s.record=JSON.parse(JSON.stringify(n)),s.isLoading=!1,s.isLocked=!1,h();return}try{s.isLocked=!!app.store.settings?.meta?.hideControls,s.originalRecord=JSON.parse(JSON.stringify(n)),s.record=JSON.parse(JSON.stringify(n));let r=await app.pb.collection(e.name).getOne(n.id,{requestKey:`upsert_load_`+n.id});n.expand&&(r.expand=JSON.parse(JSON.stringify(n.expand))),Object.assign(s.originalRecord,JSON.parse(JSON.stringify(r))),Object.assign(s.record,JSON.parse(JSON.stringify(r))),s.isLoading=!1,h()}catch(e){e?.isAbort||(app.checkApiError(e),s.isLoading=!1,setTimeout(()=>app.modals.close(i,!0),0))}}async function _(){let n={};for(let e in s.record){if(e==`expand`||e.startsWith(`@@`))continue;let r=s.record[e]?.__raw||s.record[e];r===void 0&&(r=null),n[e]=r}for(let r of e.fields){let i=app.fieldTypes[r.type]?.onrecordsave;i&&await i({collection:e,originalRecord:s.originalRecord,record:s.record,field:r,payload:n})}return n}async function v(n=!0){if(!(s.isLocked||s.isSaving||!s.isNew&&!s.hasChanges)){s.isSaving=!0;try{let a=await _(),o=app.utils.isEmpty(s.originalRecord?.id),c;c=o?await app.pb.collection(e.name).create(a):await app.pb.collection(e.name).update(s.originalRecord.id,a),f(),o?(s.originalRecord=structuredClone(c),s.record=structuredClone(c)):(Object.assign(s.originalRecord,structuredClone(c)),Object.assign(s.record,structuredClone(c))),r.onsave?.(c,o),app.store.errors=null;let l;l=o?`Successfully created ${e.name} "${c.id}".`:`Successfully updated ${e.name} "${c.id}".`,app.toasts.success(l,{key:`recordSave`}),s.isSaving=!1,n&&app.modals.close(i,!0)}catch(e){e?.isAbort||(s.isSaving=!1,app.checkApiError(e,!1),app.toasts.error(e.message||`Failed to save record.`,{key:`recordSave`}))}}}function ee(){f(),s.record=JSON.parse(JSON.stringify(s.originalRecord))}async function te(){let n=s.originalRecord?JSON.parse(JSON.stringify(s.originalRecord)):{};n.id=``;for(let r of e.fields){let i=app.fieldTypes[r.type]?.onrecordduplicate;i&&await i({collection:e,field:r,originalRecord:s.originalRecord,clone:n})}f(),r.onduplicate?.(n),g(n)}function ne(){return[t.div({className:`modal-content`},t.form({id:a+`form`,className:`grid`,inert:()=>s.isLoading||s.isSaving,onsubmit:e=>{e.preventDefault()},onmount:e=>{e._quickSaveHandler=e=>{(e.ctrlKey||e.metaKey)&&e.code==`KeyS`&&(e.preventDefault(),v(!1))},window.addEventListener(`keydown`,e._quickSaveHandler)},onunmount:e=>{e?._quickSaveHandler&&window.removeEventListener(`keydown`,e?._quickSaveHandler)}},()=>{if(!(s.isLoading||s.hasChanges||app.utils.isEmpty(s.initialDraft)||s.initialDraftHash==s.recordHash))return t.div({className:`col-12`},t.div({className:`alert warning flex gap-sm`},t.div({className:`content`},`The record has previous unsaved changes.`),t.button({type:`button`,className:`btn sm outline`,onclick:()=>p()},t.span({className:`txt`},`Restore draft`)),t.button({type:`button`,className:`btn sm secondary transparent circle m-l-auto`,ariaLabel:app.attrs.tooltip(`Discard draft`,`left`),onclick:()=>{f()}},t.i({className:`ri-close-line`,ariaHidden:!0}))))},()=>{let n=e.fields?.find(e=>e.primaryKey);return t.div({className:`col-12`},app.fieldTypes[n.type].input({get collection(){return e},get originalRecord(){return s.originalRecord},get record(){return s.record},get field(){return n}}))},()=>{if(!s.isAuthCollection)return;let n=[t.div({className:`col-12`},H(e,s)),t.div({className:`col-12`},It(e,s))];return s.isSuperusersCollection||n.push(t.div({className:`col-12`},Ft(e,s))),n},()=>{let n=[],r=s.excludedFields;for(let i of e.fields)!app.fieldTypes[i.type]?.input||r.includes(i.name)||n.push(t.div({className:()=>`col-12 ${i.hidden&&!o[i.id]?`hidden-field-blur`:``}`},()=>app.fieldTypes[i.type].input({get collection(){return e},get originalRecord(){return s.originalRecord},get record(){return s.record},get field(){return i}})));return n.length&&s.isAuthCollection&&n.unshift(t.div({className:`col-12`},t.hr({className:`m-0`}))),n})),t.footer({className:`modal-footer`},t.button({type:`button`,className:`btn transparent m-r-auto`,disabled:()=>s.isSaving,onclick:()=>app.modals.close(i)},t.span({className:`txt`},`Close`)),t.button({hidden:()=>!s.isLocked,type:`button`,className:`btn outline`,disabled:()=>s.isFormDisabled,onclick:()=>s.isLocked=!1},t.i({className:`ri-lock-unlock-line`,ariaHidden:!0}),t.span({className:`txt`},`Unlock to save`)),t.div({hidden:()=>s.isLocked,className:`btns`},t.button({type:`button`,className:()=>`btn expanded-lg ${s.isLoading||s.isSaving?`loading`:``}`,disabled:()=>s.isLocked||s.isFormDisabled,onclick:()=>v()},t.span({className:`txt`},()=>s.isNew?`Create`:`Save changes`)),t.button({type:`button`,className:()=>`btn p-5`,title:`Save options`,disabled:()=>s.isLocked||s.isFormDisabled,"html-popovertarget":a+`save_options`},t.i({className:`ri-arrow-up-s-line`,ariaHidden:!0})),t.div({id:a+`save_options`,className:`dropdown nowrap`,popover:`auto`},t.button({type:`button`,className:`dropdown-item`,onclick:e=>{e.target.closest(`.dropdown`).hidePopover(),v(!1)}},t.span({className:`txt`},`Save and continue`),t.small({className:`txt-hint`},`(Ctrl+S)`)),t.hr(),t.button({type:`button`,className:`dropdown-item`,onclick:e=>{e.target.closest(`.dropdown`).hidePopover(),ee()}},t.span({className:`txt`},`Reset form`)))))]}return i=t.div({pbEvent:`recordUpsertModal`,className:`modal record-upsert-modal`,onbeforeopen:()=>(g(n),r.onbeforeopen?.(el)),onafteropen:e=>{r.onafteropen?.(e)},onbeforeclose:(e,n)=>n?r.onbeforeclose?.(e):s.isLoading||s.isSaving?!1:s.hasChanges?new Promise(n=>{app.modals.confirm(`You have unsaved changes. Do you really want to discard them?`,()=>(f(),n(r.onbeforeclose?.(e))),()=>n(!1),{yesButton:`Yes, discard`})}):r.onbeforeclose?.(e),onafterclose:e=>{r.onafterclose?.(e),e?.remove()},onunmount:()=>{m?.unwatch()}},t.header({className:()=>`modal-header ${s.showTabs?`isolated`:``}`},t.div({className:`grid`},t.div({className:`col-12 flex`},t.h6({className:`modal-title`},()=>s.isLoading?t.span({className:`loader sm`}):[t.span(null,()=>s.isNew?`Create `:`Edit `),t.strong({className:`txt-ellipsis collection-name`,style:`max-width: 220px`},()=>e.name),t.span(null,` record`)]),t.div({className:`flex-fill`}),()=>{if(!app.utils.isEmpty(s.originalRecord?.id))return[t.button({type:`button`,className:`btn sm circle transparent`,title:`More options`,disabled:()=>s.isLoading,"html-popovertarget":a+`modal-header-dropdown`},t.i({className:`ri-more-line`,ariaHidden:!0})),t.div({id:a+`modal-header-dropdown`,className:`dropdown nowrap modal-header-dropdown`,popover:`auto`},()=>{if(!s.isAuthCollection)return;let n=[];return!s.originalRecord.verified&&s.originalRecord.email&&!s.isSuperusersCollection&&n.push(Mt(e,s,r)),s.originalRecord.email&&n.push(V(e,s,r)),n.push(Nt(e,s,r)),n.push(jt(e,s,r)),n.push(t.hr()),n},t.button({type:`button`,className:`dropdown-item`,onclick:e=>{e.target.closest(`.dropdown`).hidePopover(),Ot(s.originalRecord)}},t.i({className:`ri-braces-line`,ariaHidden:!0}),t.span({className:`txt`},`Copy JSON`)),()=>{if(e.type!=`view`)return[t.button({type:`button`,className:`dropdown-item`,onclick:e=>{e.target.closest(`.dropdown`).hidePopover(),s.hasChanges?app.modals.confirm(`You have unsaved changes. Do you really want to discard them?`,te,null,{yesButton:`Yes, discard`}):te()}},t.i({className:`ri-file-copy-line`,ariaHidden:!0}),t.span({className:`txt`},`Duplicate`)),t.hr(),Pt(e,s,r)]})]}),()=>{if(s.showTabs)return t.div({className:`col-12`},t.nav({className:`tabs-header equal-width`},t.button({type:`button`,disabled:()=>s.isLoading||s.isSaving,className:()=>`tab-item ${s.activeTab==z?`active`:s.hasChanges?`txt-warning`:``}`,ariaDescription:app.attrs.tooltip(()=>s.hasChanges&&s.activeTab!=z?`Has unsaved changes`:``),onclick:()=>s.activeTab=z},t.span({className:`txt`},()=>s.isAuthCollection?`Account`:`Main`)),t.button({type:`button`,disabled:()=>s.isLoading||s.isSaving,className:()=>`tab-item ${s.activeTab==B?`active`:``}`,onclick:()=>s.activeTab=B},t.span({className:`txt`},`Auth providers`))))})),()=>!s.isNew&&!s.isSuperusersCollection&&s.activeTab==B?Lt(e,s):ne()),i}function jt(e,n,r){let i=store({isSubmitting:!1});async function a(){if(!(i.isSubmitting||!n.record.id)){i.isSubmitting=!0;try{let i={},a=e.fields.find(e=>e.name==`tokenKey`);a.autogeneratePattern?i[`tokenKey:autogenerate`]=``:i.tokenKey=app.utils.randomSecret(a.max<<0||Math.max(2*a.min<<0,50));let o=await app.pb.collection(e.name).update(n.record.id,i);r.ontokensreset?.(o);let s=e.fields?.filter(e=>e.type==`autodate`)||[];for(let e of s){let r=o[e.name];n.initialDraft&&(n.initialDraft[e.name]=r),n.originalRecord[e.name]=r,n.record[e.name]=r}app.toasts.success(`Successfully reset all tokens for the selected record.`)}catch(e){app.checkApiError(e)}i.isSubmitting=!1}}return t.button({type:`button`,className:`dropdown-item`,disabled:()=>i.isSubmitting,onclick:e=>{e.target.closest(`.dropdown`).hidePopover(),app.modals.confirm(`Do you really want to reset all issued tokens for the selected auth record?`,a,null,{yesButton:`Reset all tokens`})}},t.i({className:`ri-reset-left-line`,ariaHidden:!0}),t.span({className:`txt`},`Reset issued tokens`))}function V(e,n,r){let i=store({isSubmitting:!1});async function a(){if(!(i.isSubmitting||!n.originalRecord?.email)){i.isSubmitting=!0;try{await app.pb.collection(e.name).requestPasswordReset(n.originalRecord.email),r.onpasswordresetsend?.(JSON.parse(JSON.stringify(n.originalRecord))),app.toasts.success(`Successfully sent password reset email to ${n.originalRecord.email}.`)}catch(e){app.checkApiError(e)}i.isSubmitting=!1}}return t.button({type:`button`,className:`dropdown-item`,disabled:()=>i.isSubmitting,onclick:e=>{e.target.closest(`.dropdown`).hidePopover(),app.modals.confirm(`Do you really want to send password reset email to ${n.originalRecord?.email}?`,a,null,{yesButton:`Send`})}},t.i({className:`ri-mail-lock-line`,ariaHidden:!0}),t.span({className:`txt`},`Send password reset email`))}function Mt(e,n,r){let i=store({isSubmitting:!1});async function a(){if(!(i.isSubmitting||!n.originalRecord?.email||n.originalRecord?.verified)){i.isSubmitting=!0;try{await app.pb.collection(e.name).requestVerification(n.originalRecord.email),r.onverificationsend?.(JSON.parse(JSON.stringify(n.originalRecord))),app.toasts.success(`Successfully sent verification email to ${n.originalRecord.email}.`)}catch(e){app.checkApiError(e)}i.isSubmitting=!1}}return t.button({type:`button`,className:`dropdown-item`,disabled:()=>i.isSubmitting,onclick:e=>{e.target.closest(`.dropdown`).hidePopover(),app.modals.confirm(`Do you really want to send verification email to ${n.originalRecord?.email}?`,a,null,{yesButton:`Send`})}},t.i({className:`ri-mail-check-line`,ariaHidden:!0}),t.span({className:`txt`},`Send verification email`))}function Nt(e,n,r){return t.button({type:`button`,className:`dropdown-item`,onclick:e=>{e.target.closest(`.dropdown`).hidePopover(),app.modals.openRecordImpersontate(n.originalRecord)}},t.i({className:`ri-id-card-line`,ariaHidden:!0}),t.span({className:`txt`},`Impersonate`))}function Pt(e,n,r){let i=store({isSubmitting:!1});async function a(){if(!(i.isSubmitting||!n.originalRecord?.id)){i.isSubmitting=!0;try{await app.pb.collection(e.name).delete(n.originalRecord.id),r.ondelete?.(JSON.parse(JSON.stringify(n.originalRecord))),app.toasts.success(`Successfully deleted record "${n.originalRecord.id}".`)}catch(e){app.checkApiError(e)}i.isSubmitting=!1}}return t.button({type:`button`,className:`dropdown-item txt-danger`,disabled:()=>i.isSubmitting,onclick:e=>{e.target.closest(`.dropdown`).hidePopover(),app.modals.confirm(`Do you really want to delete the selected record?`,async()=>{await a(),app.modals.close(e.target.closest(`.modal`))},null,{yesButton:`Delete record`})}},t.i({className:`ri-delete-bin-7-line`,ariaHidden:!0}),t.span({className:`txt`},`Delete`))}function H(e,n){let r=e.fields.find(e=>e.name==`email`);if(!r){console.warn(`missing expected email field`);return}let i=`auth_email_`+app.utils.randomString();return t.div({className:`record-field-input field-type-email field-type-auth-email`},t.div({className:`fields`},t.div({className:`field`},t.label({htmlFor:i},t.i({className:app.fieldTypes.email.icon,ariaHidden:!0}),t.span({className:`txt`},()=>r.name)),t.input({type:`email`,id:i,spellcheck:!1,name:()=>r.name,required:()=>r.required,value:()=>n.record[r.name]||``,oninput:e=>n.record[r.name]=e.target.value})),t.div({className:`field addon`},t.button({type:`button`,className:()=>`btn sm transparent ${n.record.emailVisibility?`success`:`secondary`}`,ariaDescription:app.attrs.tooltip(`Make email public or private`,`top-right`),onclick:()=>{n.record.emailVisibility=!n.record.emailVisibility}},t.span({className:`txt`},`Public: `,()=>n.record.emailVisibility?`On`:`Off`)))),()=>{if(r.help)return t.div({className:`field-help`},r.help)})}function Ft(e,n){let r=e.fields.find(e=>e.name==`verified`);if(!r){console.warn(`missing expected verified field`);return}let i=app.fieldTypes.bool.input({get field(){return r},get collection(){return e},get record(){return n.record},get originalRecord(){return n.originalRecord}});return i.addEventListener(`change`,e=>{n.originalRecord.verified!=n.record.verified&&app.modals.confirm(`Do you really want to manually change the verified account state from "${!n.record.verified}" to "${n.record.verified}"?`,null,()=>{n.record.verified=!n.record.verified},{yesButton:`Yes, `+(n.record.verified?`verify`:`unverify`)})}),i}function It(e,n){let r=`auth_pass_`+app.utils.randomString(),i=store({changePassword:!1,get isNew(){return app.utils.isEmpty(n.originalRecord?.id)}});function a(){delete n.record.password,delete n.record.passwordConfirm,app.store.errors&&(delete app.store.errors.password,delete app.store.errors.passwordConfirm)}return t.div({className:`record-field-input field-type-password field-type-auth-password`,onmount:e=>{e._watchers?.forEach(e=>e?.unwatch()),e._watchers=[watch(()=>{i.changePassword||(app.store.errors?.password||app.store.errors?.passwordConfirm||n.record.password||n.record.passwordConfirm)&&(i.changePassword=!0)})]},onunmount:e=>{e._watchers?.forEach(e=>e?.unwatch())}},t.div({hidden:()=>i.isNew,className:`field`},t.input({type:`checkbox`,id:r+`_change`,className:`switch`,checked:()=>i.changePassword,onchange:e=>{i.changePassword=e.target.checked,e.target.checked||a()}}),t.label({htmlFor:r+`_change`},t.span({className:`txt`},`change password`))),app.components.slide(()=>i.isNew||i.changePassword,t.div({className:()=>`fields ${i.isNew?``:`m-t-sm`}`},t.div({className:`field`},t.label({htmlFor:r+`_password`},t.i({className:`ri-lock-line`,ariaHidden:!0}),t.span({className:`txt`},`Password`)),t.input({type:`password`,id:r+`_password`,spellcheck:!1,name:`password`,className:`inline-error`,autocomplete:`new-password`,required:()=>i.isNew||i.changePassword,value:()=>n.record.password||``,oninput:e=>{e.target.value?n.record.password=e.target.value:delete n.record.password}})),t.div({className:`delimiter`}),t.div({className:`field`},t.label({htmlFor:r+`_password_confirm`},t.i({className:`ri-lock-line`,ariaHidden:!0}),t.span({className:`txt`},`Confirm`)),t.input({type:`password`,id:r+`_password_confirm`,spellcheck:!1,name:`passwordConfirm`,className:`inline-error`,autocomplete:`new-password`,required:()=>i.isNew||i.changePassword,value:()=>n.record.passwordConfirm||``,oninput:e=>{e.target.value?n.record.passwordConfirm=e.target.value:delete n.record.passwordConfirm}}))),()=>{let n=e.fields?.find(e=>e.name==`password`)?.help||``;if(n)return t.div({className:`field-help`},n)},t.div({className:`field-help`},t.span({className:`txt link-hint`,role:`button`,onclick:e=>{e.preventDefault();let r=app.utils.randomSecret(20);n.record.password=r,n.record.passwordConfirm=r,app.utils.copyToClipboard(r),app.toasts.info(`Generated and copied random password to clipboard.`)}},`Generate and set random password`))))}function Lt(e,n){let r=store({isLoading:!1,externalAuths:[]});async function i(){r.isLoading=!0;try{r.externalAuths=await app.pb.collection(`_externalAuths`).getFullList({filter:app.pb.filter(`collectionRef={:collectionId} && recordRef={:recordId}`,{collectionId:n.record.collectionId,recordId:n.record.id})}),r.isLoading=!1}catch(e){e?.isAbort&&(app.pb.checkApiError(e),r.isLoading=!1)}}function a(e){let n=(app.store.oauth2Providers?.find(n=>n.name==e.provider)||{}).displayName||e.provider;app.modals.confirm(`Do you really want to unlink the ${n} provider?`,()=>app.pb.collection(`_externalAuths`).delete(e.id).then(()=>{app.toasts.success(`Successfully unlinked ${n}.`),i()}).catch(e=>{app.checkApiError(e)}),null,{yesButton:`Unlink`})}return[t.div({className:`modal-content`},t.div({className:`list`,onmount:()=>{i()}},()=>r.isLoading?t.div({className:`list-item`},t.div({className:`skeleton-loader`})):r.externalAuths.length?r.externalAuths.map(e=>{let n=app.store.oauth2Providers?.find(n=>n.name==e.provider)||{};return t.div({className:`list-item`},t.figure({className:`provider-logo`},()=>n.logo?t.img({src:`data:image/svg+xml;base64,`+btoa(n.logo),alt:e.provider+` logo`}):t.i({className:app.utils.fallbackProviderIcon,ariaHidden:!0})),t.div({className:`content`},t.span({className:`txt-nowrap`},()=>n.displayName||e.provider),t.small({className:`txt-hint`},`ID: `,()=>e.providerId)),t.div({className:`actions`},t.button({type:`button`,className:`btn sm secondary transparent circle`,ariaLabel:app.attrs.tooltip(`Unlink`,`left`),onclick:()=>a(e)},t.i({className:`ri-close-line`,ariaHidden:!0}))))}):t.div({className:`list-item`},t.div({className:`block txt-hint txt-center`},`No external auth providers found.`)))),t.footer({className:`modal-footer`},t.button({type:`button`,className:`btn transparent m-r-auto`,onclick:()=>app.modals.close()},t.span({className:`txt`},`Close`)))]}var Rt=10,zt=500,Bt=`pb:lazyExpandSummaryRels`,Vt={},Ht={};function Ut(e){let n=new Set;return t.div({className:`record-field-view field-type-relation`,onunmount:()=>{for(let e of n)document.removeEventListener(Bt,e);n.clear(),n=null}},()=>{let r=app.utils.toArray(e.record[e.field.name]);if(!r.length)return t.span({className:`missing-value`});let i=e.meta||{},a=app.utils.toArray(i.parents);if(a.includes(e.record.id))return t.span({className:`marker recursive`},`(recursive)`);let o=JSON.parse(JSON.stringify(i));o.parents=a.concat(e.record.id);let s=[],c=e.short?3:1e3,l=app.utils.toArray(e.record.expand?.[e.field.name]);for(let i=0;i=c){s.push(t.span({className:`marker more`},`(`,r.length-c,` more)`));break}let a=r[i],u=l.find(e=>e?.id==a);if(u)s.push(app.components.recordSummary(u,o));else if(s.push(t.span({className:`label relation-id animate-delayed-fadeIn`},app.components.copyButton(a),a)),o.parents.length{i.detail.id==a&&i.detail.collectionId==e.field.collectionId&&(Wt(e.record,e.field,structuredClone(i.detail),r),document.removeEventListener(Bt,o),n.delete(o))};n.add(o),document.addEventListener(Bt,o)}}return Gt(e.field.collectionId),s})}function Wt(e,n,r,i=0){if(e.expand=e.expand||{},n.maxSelect>1){e.expand[n.name]=app.utils.toArray(e.expand[n.name]);let a=e.expand[n.name].findIndex(e=>e?.id==r.id);a>=0?e.expand[n.name][a]=r:e.expand[n.name][i]?e.expand[n.name].push(r):e.expand[n.name][i]=r}else e.expand[n.name]=r}function Gt(e){e&&(clearTimeout(Ht[e]),Ht[e]=setTimeout(()=>{let n=Array.from(Vt[e]||[]);if(n.length)for(Vt[e].clear(),Vt[e]=null,Ht[e]=null;n.length;){let r=n.splice(0,zt),i=[],a=app.store.collections.find(n=>n.id==e)?.fields?.filter(e=>!e.hidden&&e.presentable&&e.type==`relation`)||[];for(let e of a)i.push(e.name);i=i.join(`,`)||void 0;let o=Kt(e,a),s;s=r.length==1?app.pb.collection(e).getOne(r[0],{requestKey:null,expand:i,fields:o}):app.pb.collection(e).getFullList({requestKey:null,expand:i,filter:r.map(e=>app.pb.filter(`id={:id}`,{id:e})).join(`||`),fields:o}),s.then(e=>{if(e=app.utils.toArray(e),e.length)for(let n of e)document.dispatchEvent(new CustomEvent(Bt,{detail:n}))}).catch(e=>{console.warn(`failed to lazily expand presentable relation`,e)})}},0))}function Kt(e,n=[],r=200){let i=app.store.collections.find(n=>n.id==e)?.fields?.filter(e=>e.type==`editor`).map(e=>`${e.name}:excerpt(${r},true)`)||[];for(let e of n){let n=app.store.collections?.find(n=>n.id==e.collectionId)?.fields?.filter(e=>e.type==`editor`)?.map(n=>`expand.${e.name}.${n.name}:excerpt(${r},true)`);n?.length&&(i.push(`expand.${e.name}.*`),i=i.concat(n))}if(i.length>0)return[`*`,`expand.*`].concat(i).join(`,`)}window.app=window.app||{},window.app.components=window.app.components||{};var qt=40,Jt=/^([\+\-])?(\w+)$/;window.app.consts=window.app.consts||{},window.app.consts.COLUMNS_STORAGE_PREFIX=`pbColumns_`,window.app.components.recordsList=function(e={}){let n=`records_list_`+app.utils.randomString(),r=store({collection:{},filter:``,sort:``,reset:void 0,rid:void 0,id:void 0,hidden:void 0,className:``,onchange:(e,n)=>{},onselect:e=>{}}),i=app.utils.extendStore(r,e),a=store({isLoading:!1,records:[],lastPage:0,lastTotalItems:0,bulkSelected:{},columnsPreferences:{},get canLoadMore(){return a.lastTotalItems>=qt},get totalSelected(){return Object.keys(a.bulkSelected).length},get areAllSelected(){return a.records.length&&a.records.length==a.totalSelected},get firstAutoUpdatedField(){return r.collection?.fields?.find(e=>e.type==`autodate`&&e.onUpdate)},get isSuperusersCollection(){return r.collection?.type==`auth`&&r.collection?.name==`_superusers`}});async function o(){a.records=[],a.lastPage=0,a.lastTotalItems=0,a.bulkSelected={}}function s(){r.onchange?.(r.filter,r.sort)}async function c(e=!1){if(r.collection?.id){a.isLoading=!0;try{let i=app.utils.normalizeSearchFilter(r.filter,r.collection.fields.filter(e=>!e.hidden).map(e=>e.name)),s=[],c=r.collection.fields?.filter(e=>!e.hidden&&e.type==`relation`)||[];for(let e of c)s.push(e.name);let l=Kt(r.collection.id,c),u=r.sort||void 0,d=u?.match(Jt),f=d?r.collection.fields.find(e=>!e.hidden&&e.name===d[2]):null;f?f?.type==`relation`&&(u=app.store.collections?.find(e=>e.id==f.collectionId)?.fields?.filter(e=>e.presentable)?.map(e=>(d[1]||``)+d[2]+`.`+e.name)?.join(`,`)):u=r.collection.type==`view`?void 0:`-@rowid`;let p=e?1:a.lastPage+1,m=await app.pb.collection(r.collection.name).getList(p,qt,{requestKey:n,skipTotal:1,filter:i,sort:u,expand:s.join(`,`)||void 0,fields:l});m.page==1&&o(),a.lastPage=m.page,a.lastTotalItems=m.items.length;for(let e=0;e1&&e%15==0&&await new Promise(e=>setTimeout(e,20));a.isLoading=!1}catch(e){e.isAbort||(a.isLoading=!1,o(),app.checkApiError(e))}}}function l(e=!0){let n={};if(e)for(let e of a.records)n[e.id]=e;a.bulkSelected=n}function u(){let e=JSON.parse(JSON.stringify(Object.values(a.bulkSelected)));if(e.length){for(let n of e)n.expand&&delete n.expand;return e.length==1?app.utils.downloadJSON(e[0],r.collection.name+`_`+e[0].id+`.json`):app.utils.downloadJSON(e,`${e.length}_${r.collection.name}_records.json`)}}async function d(){let e=Object.keys(a.bulkSelected);if(!e.length)return;let n=e.slice();for(;n.length;){let e=n.splice(0,100),i=[];for(let n of e)i.push(app.pb.collection(r.collection.name).delete(n));try{await Promise.all(i)}catch(e){app.checkApiError(e),l(!1),c(!0);return}}l(!1),app.toasts.success(`Successfully deleted ${e.length} ${e.length==1?`record`:`records`}.`)}function f(e){return a.firstAutoUpdatedField?e.id+e[a.firstAutoUpdatedField.name]+r.collection?.updated+Object.keys(e):JSON.stringify(e)+r.collection?.updated}function p(e){return a.columnsPreferences[e.id]===void 0?e.hidden:!a.columnsPreferences[e.id]}let m,h={"record:save":e=>{if(e.detail.collectionId!=r.collection?.id)return;let n=a.records.find(n=>n.id==e.detail.id);n&&Object.assign(n,JSON.parse(JSON.stringify(e.detail))),c(!0)},"record:delete":e=>{e.detail.collectionId!=r.collection?.id&&e.detail.collectionName!=r.collection?.name||(delete a.bulkSelected[e.detail.id],app.utils.removeByKey(a.records,`id`,e.detail.id),clearTimeout(m),m=setTimeout(()=>{a.records?.length||c(!0)},100))}};return t.div({pbEvent:`recordsList`,rid:r.rid,id:()=>r.id,hidden:()=>r.hidden,className:()=>`page-table-wrapper ${r.className}`,onmount:e=>{for(let e in h)document.addEventListener(e,h[e]);i.push(watch(()=>r.collection?.id,(e,n)=>{a.columnsPreferences=app.utils.getLocalHistory(app.consts.COLUMNS_STORAGE_PREFIX+e,{}),n&&n!=e&&o()})),i.push(watch(()=>(r.collection?.id||``)+(r.filter||``)+(r.sort||``)+(r.reset||``),(e,n)=>{e!=n&&c(!0)})),i.push(watch(()=>a.lastPage,n=>{n==1&&e&&(e.scrollTop=0)})),i.push(watch(()=>JSON.stringify(a.columnsPreferences),(e,n)=>{r.collection?.id&&n&&app.utils.saveLocalHistory(app.consts.COLUMNS_STORAGE_PREFIX+r.collection.id,a.columnsPreferences)}))},onunmount:()=>{app.pb.cancelRequest(n),clearTimeout(m),i.forEach(e=>e?.unwatch());for(let e in h)document.removeEventListener(e,h[e])}},t.table({pbEvent:`recordsListTable`,className:()=>`records-table responsive-table ${a.records.length>qt?`optimize`:``}`},t.thead({className:`sticky`},t.tr(null,t.th({className:`col-bulk-select`},t.div({className:`field`,hidden:()=>a.isLoading},t.input({id:`all_`+n,type:`checkbox`,disabled:()=>!a.records.length,checked:()=>a.areAllSelected,onchange:e=>l(e.target.checked)}),t.label({htmlFor:`all_`+n})),t.span({className:`loader`,hidden:()=>!a.isLoading})),()=>{let e=r.collection?.fields||[],n=[];for(let i of e)!app.fieldTypes[i.type]?.view||a.isSuperusersCollection&&i.name==`verified`||n.push(t.th({hidden:()=>p(i),className:()=>{let e=``;return r.sort==i.name||r.sort==`+`+i.name?e=`asc`:r.sort==`-`+i.name&&(e=`desc`),`sort-handle ${e} col-field-type-${i.type} col-field-name-${i.name}`},onclick:e=>{let n=`-`+i.name;r.sort==n&&(n=i.name),r.sort=n,s()}},t.div({className:`inline-flex gap-5`},t.i({ariaHidden:!0,className:()=>i.primaryKey?`ri-key-line`:app.fieldTypes[i.type]?.icon||app.utils.fallbackFieldIcon}),t.span({className:`txt`,textContent:i.name}))));return n},t.th({className:`col-meta`},()=>U(r,a)))),t.tbody(null,()=>a.records.length?a.records.map((e,i)=>t.tr({rid:f(e),tabIndex:0,className:`handle`,onclick:n=>{n.preventDefault(),r.onselect(e)},onkeypress:n=>{(n.key==`Enter`||n.key==` `)&&(n.preventDefault(),r.onselect(e))}},t.td({className:`col-bulk-select`,onclick:e=>e.stopPropagation(),onkeypress:e=>e.stopPropagation()},t.div({className:`field`},t.input({type:`checkbox`,id:()=>n+e.id,checked:()=>!!a.bulkSelected[e.id],onchange:n=>{let r=JSON.parse(JSON.stringify(a.bulkSelected));n.target.checked?r[e.id]=e:delete r[e.id],a.bulkSelected=r}}),t.label({htmlFor:n+e.id}))),()=>{let n=[],i=r.collection?.fields||[];for(let r of i){let i=app.fieldTypes[r.type]?.view;i&&(a.isSuperusersCollection&&r.name==`verified`||n.push(t.td({"html-data-name":r.name,hidden:()=>p(r),className:`col-field-type-${r.type} col-field-name-${r.name}`},()=>i({short:!0,get record(){return e},get field(){return r}}))))}return n},t.td({className:`col-meta`},t.i({className:`ri-arrow-right-line m-r-10`,ariaHidden:!0})))):t.tr(null,t.td({colSpan:99,style:`height:59px`},()=>a.isLoading?t.span({className:`skeleton-loader`}):t.div({className:`sticky-content txt-center txt-hint`},t.p({className:`txt-bold`},`No records found.`),t.button({hidden:()=>r.filter?.length||r.collection?.type==`view`,type:`button`,className:`btn secondary expanded-lg`,onclick(){app.modals.openRecordUpsert(r.collection)}},t.i({className:`ri-add-line`}),t.span({className:`txt`},`New record`)),t.button({hidden:()=>!r.filter?.length,type:`button`,className:`btn secondary expanded-lg`,onclick(){r.filter=``,s()}},t.span({className:`txt`},`Clear search`))))),t.tr({hidden:()=>!a.canLoadMore},t.td({colSpan:99},t.button({className:()=>`btn lg secondary load-more-btn ${a.isLoading?`transparent loading`:``}`,disabled:()=>a.isLoading,onclick:()=>c()},t.span({className:`txt`},`Load more`)))))),t.div({className:`bulkbar-wrapper`},t.div({hidden:()=>!a.totalSelected,className:`bulkbar records-bulkbar`},t.span({className:`txt`},`Selected `,t.strong(null,()=>a.totalSelected),()=>` ${a.totalSelected==1?`record`:`records`}`),t.button({type:`button`,className:`btn sm secondary pill m-r-auto`,onclick:()=>l(!1)},t.span({className:`txt`},`Reset`)),()=>{if(r.collection?.type!=`view`)return t.button({type:`button`,className:`btn sm pill outline danger`,onclick:()=>{app.modals.confirm(`Do you really want to delete the selected records?`,d)}},t.i({className:`ri-delete-bin-7-line`,ariaHidden:!0}),t.span({className:`txt`},`Delete`))},t.button({type:`button`,className:`btn sm pill`,onclick:()=>u()},t.i({className:`ri-download-line`,ariaHidden:!0}),t.span({className:`txt`},`JSON`)))))};function U(e,n){let r=`cols_`+app.utils.randomString(),i=t.div({className:`dropdown sm nowrap records-list-columns-dropdown gap-0`,popover:`auto`},()=>{if(!e.collection?.fields)return;let i=[],a=e.collection.type==`auth`;for(let o of e.collection.fields)o.primaryKey||!app.fieldTypes[o.type].view||a&&o.name==`tokenKey`||i.push(t.div({className:`dropdown-item`,onclick:e=>{e.target.querySelector(`label`)?.click()}},t.div({className:`field`},t.input({type:`checkbox`,className:`switch sm`,id:()=>r+o.name,checked:()=>n.columnsPreferences[o.id]===void 0?!o.hidden:!!n.columnsPreferences[o.id],onchange:e=>{n.columnsPreferences[o.id]=e.target.checked}}),t.label({htmlFor:()=>r+o.name},o.name))));return i});return t.button({hidden:()=>e.collection?.fields.length<=1,type:`button`,title:`Toggle columns`,className:`btn sm secondary transparent circle`,popoverTargetElement:i},t.i({className:`ri-more-2-line`,ariaHidden:!0}),i)}window.app=window.app||{},window.app.components=window.app.components||{};var W=`@toDelete`;window.app.components.fieldSettings=function(e,n={}){let r=`base_`+app.utils.randomString(),i=store({showHidden:!0,showPresentable:!0,showDuplicate:!0,showRemove:!0,header:e=>null,content:e=>null,footer:e=>null}),a=app.utils.extendStore(i,n);function o(){let n=JSON.parse(JSON.stringify(e.field));n.id=``,n.system=!1,n.name=G(e.collection.fields,n.name+`_copy`),n.__detailsOpen=!0,n.primaryKey&&=!1,n[`@toDelete`]&&delete n[W],e.collection.fields.splice(e.fieldIndex+1,0,n)}function s(){e.field.id?e.field[W]=!0:e.collection.fields.splice(e.fieldIndex,1)}return t.details({"html-class":`accordion record-field-settings`,className:()=>`accordion record-field-settings field-type-${e.field.type} ${e.field[`@toDelete`]?`deleted`:``}`,name:`collection_field`,onmount:n=>{e.field.__detailsOpen&&(delete e.field.__detailsOpen,n.open=!0),a.push(watch(()=>e.field.name,(n,r)=>{n=app.utils.slugify(n),e.field.name=n,r!==void 0&&(Xt(e.collection,r,n),Yt(e.collection,r,n))})),a.push(watch(()=>e.field[W],n=>{n&&e.originalField?.name&&e.field.name!=e.originalField.name&&(e.field.name=e.originalField.name)})),a.push(watch(()=>{e.field.presentable&&e.field.hidden&&(e.field.presentable=!1,app.toasts.info(`The field cannot be presentable if hidden.`))})),a.push(watch(()=>{(e.field.name==`id`||e.collection.type==`auth`&&[`password`,`tokenKey`].includes(e.field.name))&&e.originalField&&e.field.required!=e.originalField.required&&(e.field.required=e.originalField.required,app.toasts.info(`The option cannot be changed for field "${e.field.name}".`))})),a.push(watch(()=>{(e.field.name==`id`||e.collection.type==`auth`&&[`password`,`tokenKey`,`email`].includes(e.field.name))&&e.originalField&&e.field.hidden!=e.originalField.hidden&&(e.field.hidden=e.originalField.hidden,app.toasts.info(`The option cannot be changed for field "${e.field.name}".`))}))},onunmount:e=>{a.forEach(e=>e?.unwatch())}},t.summary({tabIndex:-1,onfocusout:()=>!1,onclick:()=>!1,onkeyup:()=>!1},t.span({className:`sort-handle`},t.i({className:`ri-draggable`})),t.header({className:`header-fields`,inert:()=>e.field[W],onclick:e=>{e.stopPropagation(),e.preventDefault()}},t.div({className:`fields`},t.label({htmlFor:r+`.name`,className:()=>`field addon ${e.field.system?`txt-disabled`:``}`},t.i({className:app.fieldTypes[e.field.type]?.icon||app.utils.fallbackFieldIcon,ariaDescription:app.attrs.tooltip(()=>e.field.system?e.field.type+` (system)`:e.field.type)})),t.div({className:`field prop-name`},t.input({type:`text`,id:r+`.name`,name:()=>`fields.${e.fieldIndex}.name`,required:!0,spellcheck:!1,placeholder:`Field name*`,className:`inline-error`,disabled:()=>e.field[`@toDelete`]||e.field.system,value:()=>e.field.name||``,oninput:n=>{n.isComposing||(e.field.name=n.target.value)},onmount:n=>{n.addEventListener(`compositionend`,n=>{e.field.name=n.target.value}),setTimeout(()=>{n&&e.field.__focus&&(n.select(),delete e.field.__focus)},0)}}),t.div({className:`field-labels`},()=>{let n=[];return e.field.required&&n.push(t.span({className:`label success`},`Required`)),e.field.hidden?n.push(t.span({className:`label danger`},`Hidden`)):e.field.presentable&&n.push(t.span({className:`label info`},`Presentable`)),n}))),e=>typeof i.header==`function`?i.header(e):i.header),t.button({type:`button`,className:()=>`btn sm circle transparent secondary ${app.utils.isEmpty(app.utils.getByPath(app.store.errors,`fields.${e.fieldIndex}`))?``:`txt-danger`}`,title:`Field options`,hidden:()=>e.field[W],onclick:e=>{let n=e.target.closest(`details`);n&&(n.open=!n.open)}},t.i({className:`ri-settings-3-line`,ariaHidden:!0})),t.button({type:`button`,className:`btn sm circle transparent warning`,hidden:()=>!e.field[W],onclick:()=>delete e.field[W],ariaLabel:app.attrs.tooltip(`Restore`)},t.i({className:`ri-restart-line`,ariaHidden:!0}))),e=>typeof i.content==`function`?i.content(e):i.content,t.footer({className:`record-field-settings-footer`},e=>typeof i.footer==`function`?i.footer(e):i.footer,()=>{if(i.showPresentable)return t.div({className:`field prop-presentable`},t.input({type:`checkbox`,id:r+`.presentable`,name:()=>`fields.${e.fieldIndex}.presentable`,className:`sm`,disabled:()=>e.field.hidden,checked:()=>!!e.field.presentable,onchange:n=>e.field.presentable=n.target.checked}),t.label({htmlFor:r+`.presentable`},t.span({className:`txt`},`Presentable`),t.i({className:`ri-information-line link-hint`,ariaDescription:app.attrs.tooltip(()=>{let n=`Whether the field should be preferred in the Superuser UI relation listings (default to auto).`;return e.field.hidden&&(n+=` + `,footnote:t.div({className:`txt-right`},t.a({href:`https://github.com/pocketbase/dart-sdk`,target:`_blank`,rel:`noopener noreferrer`,textContent:`Dart SDK docs`}))}]})),t.footer({className:`modal-footer`},t.button({type:`button`,className:`btn transparent m-r-auto`,disabled:()=>r.isLoading,onclick:()=>app.modals.close()},t.span({className:`txt`},`Close`)),t.button({hidden:()=>r.token,type:`submit`,"html-form":n+`_form`,className:()=>`btn expanded-lg ${r.isLoading?`loading`:``}`,disabled:()=>r.isLoading},t.span({className:`txt`},`Generate token`)),t.button({hidden:()=>!r.token,type:`button`,className:()=>`btn secondary expanded-lg ${r.isLoading?`loading`:``}`,onclick:()=>o()},t.span({className:`txt`},`Generate new one`))))}window.app=window.app||{},window.app.modals=window.app.modals||{},window.app.modals.openRecordUpsert=function(e,n=null,r={onbeforeopen:null,onafteropen:null,onbeforeclose:null,onafterclose:null,onsave:null,ondelete:null,onduplicate:null,ontokensreset:null,onpasswordresetsend:null,onverificationsend:null}){app.store.errors=null;let i=At(e,n,r);i&&(document.body.appendChild(i),app.modals.open(i))};var Et=[`expand`];function Dt(e,n=Et){if(n.find(n=>e[n]!==void 0)){e=Object.assign({},e);for(let r of n)delete e[r]}return e}function Ot(e){e=Dt(e),app.utils.copyToClipboard(JSON.stringify(e,null,2)),app.toasts.success(`Record copied to clipboard!`)}function kt(e){return e?JSON.stringify(Dt(e)):``}var z=`main`,B=`authProviders`;function At(e,n,r){if(!e?.id){console.warn(`[recordUpsertModal] missing required collection`);return}let i,a=`record_upsert_`+app.utils.randomString(),o=app.utils.getLocalHistory(app.consts.COLUMNS_STORAGE_PREFIX+e.id,{}),s=store({isLoading:!0,isSaving:!1,isLocked:!1,originalRecord:{},record:{},initialDraft:null,activeTab:z,get isNew(){return app.utils.isEmpty(s.originalRecord?.id)},get isAuthCollection(){return e.type==`auth`},get isSuperusersCollection(){return e.name==`_superusers`},get showTabs(){return!s.isNew&&s.isAuthCollection&&!s.isSuperusersCollection},get excludedFields(){let e=[`id`];return s.isAuthCollection&&e.push(`email`,`emailVisibility`,`verified`,`password`,`tokenKey`),e},get initialDraftHash(){return kt(s.initialDraft)},get recordHash(){return kt(s.record)},get originalRecordHash(){return kt(s.originalRecord)},get hasChanges(){return s.originalRecordHash!=s.recordHash},get isFormDisabled(){return s.isLoading||s.isSaving||!s.isNew&&!s.hasChanges}});function c(){return`draft_`+e.id+`_`+(s.originalRecord?.id||``)}function l(){return window.localStorage.getItem(c())||``}function u(){try{let e=l();if(e)return JSON.parse(e)}catch(e){console.warn(`getDraft failure:`,e),f()}return null}function d(e){try{window.localStorage.setItem(c(),e)}catch(e){console.warn(`saveDraft failure:`,e),f()}}function f(){window.localStorage.removeItem(c()),s.initialDraft=null}function p(){if(!s.initialDraft)return;app.store.errors&&(app.store.errors=null);let e=JSON.parse(JSON.stringify(s.initialDraft));f(),s.record=e}let m;function h(){s.initialDraft=u(),m?.unwatch(),m=watch(()=>s.recordHash,(e,n)=>{n!==void 0&&(s.hasChanges?d(s.recordHash):f())})}async function g(n){if(s.isLoading=!0,m?.unwatch(),n=app.utils.isObject(n)?n:{id:n||``},!n.id){s.originalRecord=JSON.parse(JSON.stringify(n)),s.record=JSON.parse(JSON.stringify(n)),s.isLoading=!1,s.isLocked=!1,h();return}try{s.isLocked=!!app.store.settings?.meta?.hideControls,s.originalRecord=JSON.parse(JSON.stringify(n)),s.record=JSON.parse(JSON.stringify(n));let r=await app.pb.collection(e.name).getOne(n.id,{requestKey:`upsert_load_`+n.id});n.expand&&(r.expand=JSON.parse(JSON.stringify(n.expand))),Object.assign(s.originalRecord,JSON.parse(JSON.stringify(r))),Object.assign(s.record,JSON.parse(JSON.stringify(r))),s.isLoading=!1,h()}catch(e){e?.isAbort||(app.checkApiError(e),s.isLoading=!1,setTimeout(()=>app.modals.close(i,!0),0))}}async function _(){let n={};for(let e in s.record){if(e==`expand`||e.startsWith(`@@`))continue;let r=s.record[e]?.__raw||s.record[e];r===void 0&&(r=null),n[e]=r}for(let r of e.fields){let i=app.fieldTypes[r.type]?.onrecordsave;i&&await i({collection:e,originalRecord:s.originalRecord,record:s.record,field:r,payload:n})}return n}async function v(n=!0){if(!(s.isLocked||s.isSaving||!s.isNew&&!s.hasChanges)){s.isSaving=!0;try{let a=await _(),o=app.utils.isEmpty(s.originalRecord?.id),c;c=o?await app.pb.collection(e.name).create(a):await app.pb.collection(e.name).update(s.originalRecord.id,a),f(),o?(s.originalRecord=structuredClone(c),s.record=structuredClone(c)):(Object.assign(s.originalRecord,structuredClone(c)),Object.assign(s.record,structuredClone(c))),r.onsave?.(c,o),app.store.errors=null;let l;l=o?`Successfully created ${e.name} "${c.id}".`:`Successfully updated ${e.name} "${c.id}".`,app.toasts.success(l,{key:`recordSave`}),s.isSaving=!1,n&&app.modals.close(i,!0)}catch(e){e?.isAbort||(s.isSaving=!1,app.checkApiError(e,!1),app.toasts.error(e.message||`Failed to save record.`,{key:`recordSave`}))}}}function ee(){f(),s.record=JSON.parse(JSON.stringify(s.originalRecord))}async function te(){let n=s.originalRecord?JSON.parse(JSON.stringify(s.originalRecord)):{};n.id=``;for(let r of e.fields){let i=app.fieldTypes[r.type]?.onrecordduplicate;i&&await i({collection:e,field:r,originalRecord:s.originalRecord,clone:n})}f(),r.onduplicate?.(n),g(n)}function ne(){return[t.div({className:`modal-content`},t.form({id:a+`form`,className:`grid`,inert:()=>s.isLoading||s.isSaving,onsubmit:e=>{e.preventDefault()},onmount:e=>{e._quickSaveHandler=e=>{(e.ctrlKey||e.metaKey)&&e.code==`KeyS`&&(e.preventDefault(),v(!1))},window.addEventListener(`keydown`,e._quickSaveHandler)},onunmount:e=>{e?._quickSaveHandler&&window.removeEventListener(`keydown`,e?._quickSaveHandler)}},()=>{if(!(s.isLoading||s.hasChanges||app.utils.isEmpty(s.initialDraft)||s.initialDraftHash==s.recordHash))return t.div({className:`col-12`},t.div({className:`alert warning flex gap-sm`},t.div({className:`content`},`The record has previous unsaved changes.`),t.button({type:`button`,className:`btn sm outline`,onclick:()=>p()},t.span({className:`txt`},`Restore draft`)),t.button({type:`button`,className:`btn sm secondary transparent circle m-l-auto`,ariaLabel:app.attrs.tooltip(`Discard draft`,`left`),onclick:()=>{f()}},t.i({className:`ri-close-line`,ariaHidden:!0}))))},()=>{let n=e.fields?.find(e=>e.primaryKey);return t.div({className:`col-12`},app.fieldTypes[n.type].input({get collection(){return e},get originalRecord(){return s.originalRecord},get record(){return s.record},get field(){return n}}))},()=>{if(!s.isAuthCollection)return;let n=[t.div({className:`col-12`},H(e,s)),t.div({className:`col-12`},It(e,s))];return s.isSuperusersCollection||n.push(t.div({className:`col-12`},Ft(e,s))),n},()=>{let n=[],r=s.excludedFields;for(let i of e.fields)!app.fieldTypes[i.type]?.input||r.includes(i.name)||n.push(t.div({className:()=>`col-12 ${i.hidden&&!o[i.id]?`hidden-field-blur`:``}`},()=>app.fieldTypes[i.type].input({get collection(){return e},get originalRecord(){return s.originalRecord},get record(){return s.record},get field(){return i}})));return n.length&&s.isAuthCollection&&n.unshift(t.div({className:`col-12`},t.hr({className:`m-0`}))),n})),t.footer({className:`modal-footer`},t.button({type:`button`,className:`btn transparent m-r-auto`,disabled:()=>s.isSaving,onclick:()=>app.modals.close(i)},t.span({className:`txt`},`Close`)),t.button({hidden:()=>!s.isLocked,type:`button`,className:`btn outline`,disabled:()=>s.isFormDisabled,onclick:()=>s.isLocked=!1},t.i({className:`ri-lock-unlock-line`,ariaHidden:!0}),t.span({className:`txt`},`Unlock to save`)),t.div({hidden:()=>s.isLocked,className:`btns`},t.button({type:`button`,className:()=>`btn expanded-lg ${s.isLoading||s.isSaving?`loading`:``}`,disabled:()=>s.isLocked||s.isFormDisabled,onclick:()=>v()},t.span({className:`txt`},()=>s.isNew?`Create`:`Save changes`)),t.button({type:`button`,className:()=>`btn p-5`,title:`Save options`,disabled:()=>s.isLocked||s.isFormDisabled,"html-popovertarget":a+`save_options`},t.i({className:`ri-arrow-up-s-line`,ariaHidden:!0})),t.div({id:a+`save_options`,className:`dropdown nowrap`,popover:`auto`},t.button({type:`button`,className:`dropdown-item`,onclick:e=>{e.target.closest(`.dropdown`).hidePopover(),v(!1)}},t.span({className:`txt`},`Save and continue`),t.small({className:`txt-hint`},`(Ctrl+S)`)),t.hr(),t.button({type:`button`,className:`dropdown-item`,onclick:e=>{e.target.closest(`.dropdown`).hidePopover(),ee()}},t.span({className:`txt`},`Reset form`)))))]}return i=t.div({pbEvent:`recordUpsertModal`,className:`modal record-upsert-modal`,onbeforeopen:()=>(g(n),r.onbeforeopen?.(el)),onafteropen:e=>{r.onafteropen?.(e)},onbeforeclose:(e,n)=>n?r.onbeforeclose?.(e):s.isLoading||s.isSaving?!1:s.hasChanges?new Promise(n=>{app.modals.confirm(`You have unsaved changes. Do you really want to discard them?`,()=>(f(),n(r.onbeforeclose?.(e))),()=>n(!1),{yesButton:`Yes, discard`})}):r.onbeforeclose?.(e),onafterclose:e=>{r.onafterclose?.(e),e?.remove()},onunmount:()=>{m?.unwatch()}},t.header({className:()=>`modal-header ${s.showTabs?`isolated`:``}`},t.div({className:`grid`},t.div({className:`col-12 flex`},t.h6({className:`modal-title`},()=>s.isLoading?t.span({className:`loader sm`}):[t.span(null,()=>s.isNew?`Create `:`Edit `),t.strong({className:`txt-ellipsis collection-name`,style:`max-width: 220px`},()=>e.name),t.span(null,` record`)]),t.div({className:`flex-fill`}),()=>{if(!app.utils.isEmpty(s.originalRecord?.id))return[t.button({type:`button`,className:`btn sm circle transparent`,title:`More options`,disabled:()=>s.isLoading,"html-popovertarget":a+`modal-header-dropdown`},t.i({className:`ri-more-line`,ariaHidden:!0})),t.div({id:a+`modal-header-dropdown`,className:`dropdown nowrap modal-header-dropdown`,popover:`auto`},()=>{if(!s.isAuthCollection)return;let n=[];return!s.originalRecord.verified&&s.originalRecord.email&&!s.isSuperusersCollection&&n.push(Mt(e,s,r)),s.originalRecord.email&&n.push(V(e,s,r)),n.push(Nt(e,s,r)),n.push(jt(e,s,r)),n.push(t.hr()),n},t.button({type:`button`,className:`dropdown-item`,onclick:e=>{e.target.closest(`.dropdown`).hidePopover(),Ot(s.originalRecord)}},t.i({className:`ri-braces-line`,ariaHidden:!0}),t.span({className:`txt`},`Copy JSON`)),()=>{if(e.type!=`view`)return[t.button({type:`button`,className:`dropdown-item`,onclick:e=>{e.target.closest(`.dropdown`).hidePopover(),s.hasChanges?app.modals.confirm(`You have unsaved changes. Do you really want to discard them?`,te,null,{yesButton:`Yes, discard`}):te()}},t.i({className:`ri-file-copy-line`,ariaHidden:!0}),t.span({className:`txt`},`Duplicate`)),t.hr(),Pt(e,s,r)]})]}),()=>{if(s.showTabs)return t.div({className:`col-12`},t.nav({className:`tabs-header equal-width`},t.button({type:`button`,disabled:()=>s.isLoading||s.isSaving,className:()=>`tab-item ${s.activeTab==z?`active`:s.hasChanges?`txt-warning`:``}`,ariaDescription:app.attrs.tooltip(()=>s.hasChanges&&s.activeTab!=z?`Has unsaved changes`:``),onclick:()=>s.activeTab=z},t.span({className:`txt`},()=>s.isAuthCollection?`Account`:`Main`)),t.button({type:`button`,disabled:()=>s.isLoading||s.isSaving,className:()=>`tab-item ${s.activeTab==B?`active`:``}`,onclick:()=>s.activeTab=B},t.span({className:`txt`},`Auth providers`))))})),()=>!s.isNew&&!s.isSuperusersCollection&&s.activeTab==B?Lt(e,s):ne()),i}function jt(e,n,r){let i=store({isSubmitting:!1});async function a(){if(!(i.isSubmitting||!n.record.id)){i.isSubmitting=!0;try{let i={},a=e.fields.find(e=>e.name==`tokenKey`);a.autogeneratePattern?i[`tokenKey:autogenerate`]=``:i.tokenKey=app.utils.randomSecret(a.max<<0||Math.max(2*a.min<<0,50));let o=await app.pb.collection(e.name).update(n.record.id,i);r.ontokensreset?.(o);let s=e.fields?.filter(e=>e.type==`autodate`)||[];for(let e of s){let r=o[e.name];n.initialDraft&&(n.initialDraft[e.name]=r),n.originalRecord[e.name]=r,n.record[e.name]=r}app.toasts.success(`Successfully reset all tokens for the selected record.`)}catch(e){app.checkApiError(e)}i.isSubmitting=!1}}return t.button({type:`button`,className:`dropdown-item`,disabled:()=>i.isSubmitting,onclick:e=>{e.target.closest(`.dropdown`).hidePopover(),app.modals.confirm(`Do you really want to reset all issued tokens for the selected auth record?`,a,null,{yesButton:`Reset all tokens`})}},t.i({className:`ri-reset-left-line`,ariaHidden:!0}),t.span({className:`txt`},`Reset issued tokens`))}function V(e,n,r){let i=store({isSubmitting:!1});async function a(){if(!(i.isSubmitting||!n.originalRecord?.email)){i.isSubmitting=!0;try{await app.pb.collection(e.name).requestPasswordReset(n.originalRecord.email),r.onpasswordresetsend?.(JSON.parse(JSON.stringify(n.originalRecord))),app.toasts.success(`Successfully sent password reset email to ${n.originalRecord.email}.`)}catch(e){app.checkApiError(e)}i.isSubmitting=!1}}return t.button({type:`button`,className:`dropdown-item`,disabled:()=>i.isSubmitting,onclick:e=>{e.target.closest(`.dropdown`).hidePopover(),app.modals.confirm(`Do you really want to send password reset email to ${n.originalRecord?.email}?`,a,null,{yesButton:`Send`})}},t.i({className:`ri-mail-lock-line`,ariaHidden:!0}),t.span({className:`txt`},`Send password reset email`))}function Mt(e,n,r){let i=store({isSubmitting:!1});async function a(){if(!(i.isSubmitting||!n.originalRecord?.email||n.originalRecord?.verified)){i.isSubmitting=!0;try{await app.pb.collection(e.name).requestVerification(n.originalRecord.email),r.onverificationsend?.(JSON.parse(JSON.stringify(n.originalRecord))),app.toasts.success(`Successfully sent verification email to ${n.originalRecord.email}.`)}catch(e){app.checkApiError(e)}i.isSubmitting=!1}}return t.button({type:`button`,className:`dropdown-item`,disabled:()=>i.isSubmitting,onclick:e=>{e.target.closest(`.dropdown`).hidePopover(),app.modals.confirm(`Do you really want to send verification email to ${n.originalRecord?.email}?`,a,null,{yesButton:`Send`})}},t.i({className:`ri-mail-check-line`,ariaHidden:!0}),t.span({className:`txt`},`Send verification email`))}function Nt(e,n,r){return t.button({type:`button`,className:`dropdown-item`,onclick:e=>{e.target.closest(`.dropdown`).hidePopover(),app.modals.openRecordImpersontate(n.originalRecord)}},t.i({className:`ri-id-card-line`,ariaHidden:!0}),t.span({className:`txt`},`Impersonate`))}function Pt(e,n,r){let i=store({isSubmitting:!1});async function a(){if(!(i.isSubmitting||!n.originalRecord?.id)){i.isSubmitting=!0;try{await app.pb.collection(e.name).delete(n.originalRecord.id),r.ondelete?.(JSON.parse(JSON.stringify(n.originalRecord))),app.toasts.success(`Successfully deleted record "${n.originalRecord.id}".`)}catch(e){app.checkApiError(e)}i.isSubmitting=!1}}return t.button({type:`button`,className:`dropdown-item txt-danger`,disabled:()=>i.isSubmitting,onclick:e=>{e.target.closest(`.dropdown`).hidePopover(),app.modals.confirm(`Do you really want to delete the selected record?`,async()=>{await a(),app.modals.close(e.target.closest(`.modal`))},null,{yesButton:`Delete record`})}},t.i({className:`ri-delete-bin-7-line`,ariaHidden:!0}),t.span({className:`txt`},`Delete`))}function H(e,n){let r=e.fields.find(e=>e.name==`email`);if(!r){console.warn(`missing expected email field`);return}let i=`auth_email_`+app.utils.randomString();return t.div({className:`record-field-input field-type-email field-type-auth-email`},t.div({className:`fields`},t.div({className:`field`},t.label({htmlFor:i},t.i({className:app.fieldTypes.email.icon,ariaHidden:!0}),t.span({className:`txt`},()=>r.name)),t.input({type:`email`,id:i,spellcheck:!1,name:()=>r.name,required:()=>r.required,value:()=>n.record[r.name]||``,oninput:e=>n.record[r.name]=e.target.value})),t.div({className:`field addon`},t.button({type:`button`,className:()=>`btn sm transparent ${n.record.emailVisibility?`success`:`secondary`}`,ariaDescription:app.attrs.tooltip(`Make email public or private`,`top-right`),onclick:()=>{n.record.emailVisibility=!n.record.emailVisibility}},t.span({className:`txt`},`Public: `,()=>n.record.emailVisibility?`On`:`Off`)))),()=>{if(r.help)return t.div({className:`field-help`},r.help)})}function Ft(e,n){let r=e.fields.find(e=>e.name==`verified`);if(!r){console.warn(`missing expected verified field`);return}let i=app.fieldTypes.bool.input({get field(){return r},get collection(){return e},get record(){return n.record},get originalRecord(){return n.originalRecord}});return i.addEventListener(`change`,e=>{n.originalRecord.verified!=n.record.verified&&app.modals.confirm(`Do you really want to manually change the verified account state from "${!n.record.verified}" to "${n.record.verified}"?`,null,()=>{n.record.verified=!n.record.verified},{yesButton:`Yes, `+(n.record.verified?`verify`:`unverify`)})}),i}function It(e,n){let r=`auth_pass_`+app.utils.randomString(),i=store({changePassword:!1,get isNew(){return app.utils.isEmpty(n.originalRecord?.id)}});function a(){delete n.record.password,delete n.record.passwordConfirm,app.store.errors&&(delete app.store.errors.password,delete app.store.errors.passwordConfirm)}return t.div({className:`record-field-input field-type-password field-type-auth-password`,onmount:e=>{e._watchers?.forEach(e=>e?.unwatch()),e._watchers=[watch(()=>{i.changePassword||(app.store.errors?.password||app.store.errors?.passwordConfirm||n.record.password||n.record.passwordConfirm)&&(i.changePassword=!0)})]},onunmount:e=>{e._watchers?.forEach(e=>e?.unwatch())}},t.div({hidden:()=>i.isNew,className:`field`},t.input({type:`checkbox`,id:r+`_change`,className:`switch`,checked:()=>i.changePassword,onchange:e=>{i.changePassword=e.target.checked,e.target.checked||a()}}),t.label({htmlFor:r+`_change`},t.span({className:`txt`},`change password`))),app.components.slide(()=>i.isNew||i.changePassword,t.div({className:()=>`fields ${i.isNew?``:`m-t-sm`}`},t.div({className:`field`},t.label({htmlFor:r+`_password`},t.i({className:`ri-lock-line`,ariaHidden:!0}),t.span({className:`txt`},`Password`)),t.input({type:`password`,id:r+`_password`,spellcheck:!1,name:`password`,className:`inline-error`,autocomplete:`new-password`,required:()=>i.isNew||i.changePassword,value:()=>n.record.password||``,oninput:e=>{e.target.value?n.record.password=e.target.value:delete n.record.password}})),t.div({className:`delimiter`}),t.div({className:`field`},t.label({htmlFor:r+`_password_confirm`},t.i({className:`ri-lock-line`,ariaHidden:!0}),t.span({className:`txt`},`Confirm`)),t.input({type:`password`,id:r+`_password_confirm`,spellcheck:!1,name:`passwordConfirm`,className:`inline-error`,autocomplete:`new-password`,required:()=>i.isNew||i.changePassword,value:()=>n.record.passwordConfirm||``,oninput:e=>{e.target.value?n.record.passwordConfirm=e.target.value:delete n.record.passwordConfirm}}))),()=>{let n=e.fields?.find(e=>e.name==`password`)?.help||``;if(n)return t.div({className:`field-help`},n)},t.div({className:`field-help`},t.span({className:`txt link-hint`,role:`button`,onclick:e=>{e.preventDefault();let r=app.utils.randomSecret(20);n.record.password=r,n.record.passwordConfirm=r,app.utils.copyToClipboard(r),app.toasts.info(`Generated and copied random password to clipboard.`)}},`Generate and set random password`))))}function Lt(e,n){let r=store({isLoading:!1,externalAuths:[]});async function i(){r.isLoading=!0;try{r.externalAuths=await app.pb.collection(`_externalAuths`).getFullList({filter:app.pb.filter(`collectionRef={:collectionId} && recordRef={:recordId}`,{collectionId:n.record.collectionId,recordId:n.record.id})}),r.isLoading=!1}catch(e){e?.isAbort&&(app.pb.checkApiError(e),r.isLoading=!1)}}function a(e){let n=(app.store.oauth2Providers?.find(n=>n.name==e.provider)||{}).displayName||e.provider;app.modals.confirm(`Do you really want to unlink the ${n} provider?`,()=>app.pb.collection(`_externalAuths`).delete(e.id).then(()=>{app.toasts.success(`Successfully unlinked ${n}.`),i()}).catch(e=>{app.checkApiError(e)}),null,{yesButton:`Unlink`})}return[t.div({className:`modal-content`},t.div({className:`list`,onmount:()=>{i()}},()=>r.isLoading?t.div({className:`list-item`},t.div({className:`skeleton-loader`})):r.externalAuths.length?r.externalAuths.map(e=>{let n=app.store.oauth2Providers?.find(n=>n.name==e.provider)||{};return t.div({className:`list-item`},t.figure({className:`provider-logo`},()=>n.logo?t.img({src:`data:image/svg+xml;base64,`+btoa(n.logo),alt:e.provider+` logo`}):t.i({className:app.utils.fallbackProviderIcon,ariaHidden:!0})),t.div({className:`content`},t.span({className:`txt-nowrap`},()=>n.displayName||e.provider),t.small({className:`txt-hint`},`ID: `,()=>e.providerId)),t.div({className:`actions`},t.button({type:`button`,className:`btn sm secondary transparent circle`,ariaLabel:app.attrs.tooltip(`Unlink`,`left`),onclick:()=>a(e)},t.i({className:`ri-close-line`,ariaHidden:!0}))))}):t.div({className:`list-item`},t.div({className:`block txt-hint txt-center`},`No external auth providers found.`)))),t.footer({className:`modal-footer`},t.button({type:`button`,className:`btn transparent m-r-auto`,onclick:()=>app.modals.close()},t.span({className:`txt`},`Close`)))]}var Rt=10,zt=500,Bt=`pb:lazyExpandSummaryRels`,Vt={},Ht={};function Ut(e){let n=new Set;return t.div({className:`record-field-view field-type-relation`,onunmount:()=>{for(let e of n)document.removeEventListener(Bt,e);n.clear(),n=null}},()=>{let r=app.utils.toArray(e.record[e.field.name]);if(!r.length)return t.span({className:`missing-value`});let i=e.meta||{},a=app.utils.toArray(i.parents);if(a.includes(e.record.id))return t.span({className:`marker recursive`},`(recursive)`);let o=JSON.parse(JSON.stringify(i));o.parents=a.concat(e.record.id);let s=[],c=e.short?3:1e3,l=app.utils.toArray(e.record.expand?.[e.field.name]);for(let i=0;i=c){s.push(t.span({className:`marker more`},`(`,r.length-c,` more)`));break}let a=r[i],u=l.find(e=>e?.id==a);if(u)s.push(app.components.recordSummary(u,o));else if(s.push(t.span({className:`label relation-id animate-delayed-fadeIn`},app.components.copyButton(a),a)),o.parents.length{i.detail.id==a&&i.detail.collectionId==e.field.collectionId&&(Wt(e.record,e.field,structuredClone(i.detail),r),document.removeEventListener(Bt,o),n.delete(o))};n.add(o),document.addEventListener(Bt,o)}}return Gt(e.field.collectionId),s})}function Wt(e,n,r,i=0){if(e.expand=e.expand||{},n.maxSelect>1){e.expand[n.name]=app.utils.toArray(e.expand[n.name]);let a=e.expand[n.name].findIndex(e=>e?.id==r.id);a>=0?e.expand[n.name][a]=r:e.expand[n.name][i]?e.expand[n.name].push(r):e.expand[n.name][i]=r}else e.expand[n.name]=r}function Gt(e){e&&(clearTimeout(Ht[e]),Ht[e]=setTimeout(()=>{let n=Array.from(Vt[e]||[]);if(n.length)for(Vt[e].clear(),Vt[e]=null,Ht[e]=null;n.length;){let r=n.splice(0,zt),i=[],a=app.store.collections.find(n=>n.id==e)?.fields?.filter(e=>!e.hidden&&e.presentable&&e.type==`relation`)||[];for(let e of a)i.push(e.name);i=i.join(`,`)||void 0;let o=Kt(e,a),s;s=r.length==1?app.pb.collection(e).getOne(r[0],{requestKey:null,expand:i,fields:o}):app.pb.collection(e).getFullList({requestKey:null,expand:i,filter:r.map(e=>app.pb.filter(`id={:id}`,{id:e})).join(`||`),fields:o}),s.then(e=>{if(e=app.utils.toArray(e),e.length)for(let n of e)document.dispatchEvent(new CustomEvent(Bt,{detail:n}))}).catch(e=>{console.warn(`failed to lazily expand presentable relation`,e)})}},0))}function Kt(e,n=[],r=200){let i=app.store.collections.find(n=>n.id==e)?.fields?.filter(e=>e.type==`editor`).map(e=>`${e.name}:excerpt(${r},true)`)||[];for(let e of n){let n=app.store.collections?.find(n=>n.id==e.collectionId)?.fields?.filter(e=>e.type==`editor`)?.map(n=>`expand.${e.name}.${n.name}:excerpt(${r},true)`);n?.length&&(i.push(`expand.${e.name}.*`),i=i.concat(n))}if(i.length>0)return[`*`,`expand.*`].concat(i).join(`,`)}window.app=window.app||{},window.app.components=window.app.components||{};var qt=40,Jt=/^([\+\-])?(\w+)$/;window.app.consts=window.app.consts||{},window.app.consts.COLUMNS_STORAGE_PREFIX=`pbColumns_`,window.app.components.recordsList=function(e={}){let n=`records_list_`+app.utils.randomString(),r=store({collection:{},filter:``,sort:``,reset:void 0,rid:void 0,id:void 0,hidden:void 0,className:``,onchange:(e,n)=>{},onselect:e=>{}}),i=app.utils.extendStore(r,e),a=store({isLoading:!1,records:[],lastPage:0,lastTotalItems:0,bulkSelected:{},columnsPreferences:{},get canLoadMore(){return a.lastTotalItems>=qt},get totalSelected(){return Object.keys(a.bulkSelected).length},get areAllSelected(){return a.records.length&&a.records.length==a.totalSelected},get firstAutoUpdatedField(){return r.collection?.fields?.find(e=>e.type==`autodate`&&e.onUpdate)},get isSuperusersCollection(){return r.collection?.type==`auth`&&r.collection?.name==`_superusers`}});async function o(){a.records=[],a.lastPage=0,a.lastTotalItems=0,a.bulkSelected={}}function s(){r.onchange?.(r.filter,r.sort)}async function c(e=!1){if(r.collection?.id){a.isLoading=!0;try{let i=app.utils.normalizeSearchFilter(r.filter,r.collection.fields.filter(e=>!e.hidden).map(e=>e.name)),s=[],c=r.collection.fields?.filter(e=>!e.hidden&&e.type==`relation`)||[];for(let e of c)s.push(e.name);let l=Kt(r.collection.id,c),u=r.sort||void 0,d=u?.match(Jt),f=d?r.collection.fields.find(e=>!e.hidden&&e.name===d[2]):null;f?f?.type==`relation`&&(u=app.store.collections?.find(e=>e.id==f.collectionId)?.fields?.filter(e=>e.presentable)?.map(e=>(d[1]||``)+d[2]+`.`+e.name)?.join(`,`)):u=r.collection.type==`view`?void 0:`-@rowid`;let p=e?1:a.lastPage+1,m=await app.pb.collection(r.collection.name).getList(p,qt,{requestKey:n,skipTotal:1,filter:i,sort:u,expand:s.join(`,`)||void 0,fields:l});m.page==1&&o(),a.lastPage=m.page,a.lastTotalItems=m.items.length;for(let e=0;e1&&e%15==0&&await new Promise(e=>setTimeout(e,20));a.isLoading=!1}catch(e){e.isAbort||(a.isLoading=!1,o(),app.checkApiError(e))}}}function l(e=!0){let n={};if(e)for(let e of a.records)n[e.id]=e;a.bulkSelected=n}function u(){let e=JSON.parse(JSON.stringify(Object.values(a.bulkSelected)));if(e.length){for(let n of e)n.expand&&delete n.expand;return e.length==1?app.utils.downloadJSON(e[0],r.collection.name+`_`+e[0].id+`.json`):app.utils.downloadJSON(e,`${e.length}_${r.collection.name}_records.json`)}}async function d(){let e=Object.keys(a.bulkSelected);if(!e.length)return;let n=e.slice();for(;n.length;){let e=n.splice(0,100),i=[];for(let n of e)i.push(app.pb.collection(r.collection.name).delete(n));try{await Promise.all(i)}catch(e){app.checkApiError(e),l(!1),c(!0);return}}l(!1),app.toasts.success(`Successfully deleted ${e.length} ${e.length==1?`record`:`records`}.`)}function f(e){return a.firstAutoUpdatedField?e.id+e[a.firstAutoUpdatedField.name]+r.collection?.updated+Object.keys(e):JSON.stringify(e)+r.collection?.updated}function p(e){return a.columnsPreferences[e.id]===void 0?e.hidden:!a.columnsPreferences[e.id]}let m,h={"record:save":e=>{if(e.detail.collectionId!=r.collection?.id)return;let n=a.records.find(n=>n.id==e.detail.id);n&&Object.assign(n,JSON.parse(JSON.stringify(e.detail))),c(!0)},"record:delete":e=>{e.detail.collectionId!=r.collection?.id&&e.detail.collectionName!=r.collection?.name||(delete a.bulkSelected[e.detail.id],app.utils.removeByKey(a.records,`id`,e.detail.id),clearTimeout(m),m=setTimeout(()=>{a.records?.length||c(!0)},100))}};return t.div({pbEvent:`recordsList`,rid:r.rid,id:()=>r.id,hidden:()=>r.hidden,className:()=>`page-table-wrapper ${r.className}`,onmount:e=>{for(let e in h)document.addEventListener(e,h[e]);i.push(watch(()=>r.collection?.id,(e,n)=>{a.columnsPreferences=app.utils.getLocalHistory(app.consts.COLUMNS_STORAGE_PREFIX+e,{}),n&&n!=e&&o()})),i.push(watch(()=>(r.collection?.id||``)+(r.filter||``)+(r.sort||``)+(r.reset||``),(e,n)=>{e!=n&&c(!0)})),i.push(watch(()=>a.lastPage,n=>{n==1&&e&&(e.scrollTop=0)})),i.push(watch(()=>JSON.stringify(a.columnsPreferences),(e,n)=>{r.collection?.id&&n&&app.utils.saveLocalHistory(app.consts.COLUMNS_STORAGE_PREFIX+r.collection.id,a.columnsPreferences)}))},onunmount:()=>{app.pb.cancelRequest(n),clearTimeout(m),i.forEach(e=>e?.unwatch());for(let e in h)document.removeEventListener(e,h[e])}},t.table({pbEvent:`recordsListTable`,className:()=>`records-table responsive-table ${a.records.length>qt?`optimize`:``}`},t.thead({className:`sticky`},t.tr(null,t.th({className:`col-bulk-select`},t.div({className:`field`,hidden:()=>a.isLoading},t.input({id:`all_`+n,type:`checkbox`,disabled:()=>!a.records.length,checked:()=>a.areAllSelected,onchange:e=>l(e.target.checked)}),t.label({htmlFor:`all_`+n})),t.span({className:`loader`,hidden:()=>!a.isLoading})),()=>{let e=r.collection?.fields||[],n=[];for(let i of e)!app.fieldTypes[i.type]?.view||a.isSuperusersCollection&&i.name==`verified`||n.push(t.th({hidden:()=>p(i),className:()=>{let e=``;return r.sort==i.name||r.sort==`+`+i.name?e=`asc`:r.sort==`-`+i.name&&(e=`desc`),`sort-handle ${e} col-field-type-${i.type} col-field-name-${i.name}`},onclick:e=>{let n=`-`+i.name;r.sort==n&&(n=i.name),r.sort=n,s()}},t.div({className:`inline-flex gap-5`},t.i({ariaHidden:!0,className:()=>i.primaryKey?`ri-key-line`:app.fieldTypes[i.type]?.icon||app.utils.fallbackFieldIcon}),t.span({className:`txt`,textContent:i.name}))));return n},t.th({className:`col-meta`},()=>U(r,a)))),t.tbody(null,()=>a.records.length?a.records.map((e,i)=>t.tr({rid:f(e),tabIndex:0,className:`handle`,onclick:n=>{n.preventDefault(),r.onselect(e)},onkeypress:n=>{(n.key==`Enter`||n.key==` `)&&(n.preventDefault(),r.onselect(e))}},t.td({className:`col-bulk-select`,onclick:e=>e.stopPropagation(),onkeypress:e=>e.stopPropagation()},t.div({className:`field`},t.input({type:`checkbox`,id:()=>n+e.id,checked:()=>!!a.bulkSelected[e.id],onchange:n=>{let r=JSON.parse(JSON.stringify(a.bulkSelected));n.target.checked?r[e.id]=e:delete r[e.id],a.bulkSelected=r}}),t.label({htmlFor:n+e.id}))),()=>{let n=[],i=r.collection?.fields||[];for(let r of i){let i=app.fieldTypes[r.type]?.view;i&&(a.isSuperusersCollection&&r.name==`verified`||n.push(t.td({"html-data-name":r.name,hidden:()=>p(r),className:`col-field-type-${r.type} col-field-name-${r.name}`},()=>i({short:!0,get record(){return e},get field(){return r}}))))}return n},t.td({className:`col-meta`},t.i({className:`ri-arrow-right-line m-r-10`,ariaHidden:!0})))):t.tr(null,t.td({colSpan:99,style:`height:59px`},()=>a.isLoading?t.span({className:`skeleton-loader`}):t.div({className:`sticky-content txt-center txt-hint`},t.p({className:`txt-bold`},`No records found.`),t.button({hidden:()=>r.filter?.length||r.collection?.type==`view`,type:`button`,className:`btn secondary expanded-lg`,onclick(){app.modals.openRecordUpsert(r.collection)}},t.i({className:`ri-add-line`}),t.span({className:`txt`},`New record`)),t.button({hidden:()=>!r.filter?.length,type:`button`,className:`btn secondary expanded-lg`,onclick(){r.filter=``,s()}},t.span({className:`txt`},`Clear search`))))),t.tr({hidden:()=>!a.canLoadMore},t.td({colSpan:99},t.button({className:()=>`btn lg secondary load-more-btn ${a.isLoading?`transparent loading`:``}`,disabled:()=>a.isLoading,onclick:()=>c()},t.span({className:`txt`},`Load more`)))))),t.div({className:`bulkbar-wrapper`},t.div({hidden:()=>!a.totalSelected,className:`bulkbar records-bulkbar`},t.span({className:`txt`},`Selected `,t.strong(null,()=>a.totalSelected),()=>` ${a.totalSelected==1?`record`:`records`}`),t.button({type:`button`,className:`btn sm secondary pill m-r-auto`,onclick:()=>l(!1)},t.span({className:`txt`},`Reset`)),()=>{if(r.collection?.type!=`view`)return t.button({type:`button`,className:`btn sm pill outline danger`,onclick:()=>{app.modals.confirm(`Do you really want to delete the selected records?`,d)}},t.i({className:`ri-delete-bin-7-line`,ariaHidden:!0}),t.span({className:`txt`},`Delete`))},t.button({type:`button`,className:`btn sm pill`,onclick:()=>u()},t.i({className:`ri-download-line`,ariaHidden:!0}),t.span({className:`txt`},`JSON`)))))};function U(e,n){let r=`cols_`+app.utils.randomString(),i=t.div({className:`dropdown sm nowrap records-list-columns-dropdown gap-0`,popover:`auto`},()=>{if(!e.collection?.fields)return;let i=[],a=e.collection.type==`auth`;for(let o of e.collection.fields)o.primaryKey||!app.fieldTypes[o.type].view||a&&o.name==`tokenKey`||i.push(t.div({className:`dropdown-item`,onclick:e=>{e.target.querySelector(`label`)?.click()}},t.div({className:`field`},t.input({type:`checkbox`,className:`switch sm`,id:()=>r+o.name,checked:()=>n.columnsPreferences[o.id]===void 0?!o.hidden:!!n.columnsPreferences[o.id],onchange:e=>{n.columnsPreferences[o.id]=e.target.checked}}),t.label({htmlFor:()=>r+o.name},o.name))));return i});return t.button({hidden:()=>e.collection?.fields.length<=1,type:`button`,title:`Toggle columns`,className:`btn sm secondary transparent circle`,popoverTargetElement:i},t.i({className:`ri-more-2-line`,ariaHidden:!0}),i)}window.app=window.app||{},window.app.components=window.app.components||{};var W=`@toDelete`;window.app.components.fieldSettings=function(e,n={}){let r=`base_`+app.utils.randomString(),i=store({showHidden:!0,showPresentable:!0,showDuplicate:!0,showRemove:!0,header:e=>null,content:e=>null,footer:e=>null}),a=app.utils.extendStore(i,n);function o(){let n=JSON.parse(JSON.stringify(e.field));n.id=``,n.system=!1,n.name=G(e.collection.fields,n.name+`_copy`),n.__detailsOpen=!0,n.primaryKey&&=!1,n[`@toDelete`]&&delete n[W],e.collection.fields.splice(e.fieldIndex+1,0,n)}function s(){e.field.id?e.field[W]=!0:e.collection.fields.splice(e.fieldIndex,1)}return t.details({"html-class":`accordion record-field-settings`,className:()=>`accordion record-field-settings field-type-${e.field.type} ${e.field[`@toDelete`]?`deleted`:``}`,name:`collection_field`,onmount:n=>{e.field.__detailsOpen&&(delete e.field.__detailsOpen,n.open=!0),a.push(watch(()=>e.field.name,(n,r)=>{n=app.utils.slugify(n),e.field.name=n,r!==void 0&&(Xt(e.collection,r,n),Yt(e.collection,r,n))})),a.push(watch(()=>e.field[W],n=>{n&&e.originalField?.name&&e.field.name!=e.originalField.name&&(e.field.name=e.originalField.name)})),a.push(watch(()=>{e.field.presentable&&e.field.hidden&&(e.field.presentable=!1,app.toasts.info(`The field cannot be presentable if hidden.`))})),a.push(watch(()=>{(e.field.name==`id`||e.collection.type==`auth`&&[`password`,`tokenKey`].includes(e.field.name))&&e.originalField&&e.field.required!=e.originalField.required&&(e.field.required=e.originalField.required,app.toasts.info(`The option cannot be changed for field "${e.field.name}".`))})),a.push(watch(()=>{(e.field.name==`id`||e.collection.type==`auth`&&[`password`,`tokenKey`,`email`].includes(e.field.name))&&e.originalField&&e.field.hidden!=e.originalField.hidden&&(e.field.hidden=e.originalField.hidden,app.toasts.info(`The option cannot be changed for field "${e.field.name}".`))}))},onunmount:e=>{a.forEach(e=>e?.unwatch())}},t.summary({tabIndex:-1,onfocusout:()=>!1,onclick:()=>!1,onkeyup:()=>!1},t.span({className:`sort-handle`},t.i({className:`ri-draggable`})),t.header({className:`header-fields`,inert:()=>e.field[W],onclick:e=>{e.stopPropagation(),e.preventDefault()}},t.div({className:`fields`},t.label({htmlFor:r+`.name`,className:()=>`field addon ${e.field.system?`txt-disabled`:``}`},t.i({className:app.fieldTypes[e.field.type]?.icon||app.utils.fallbackFieldIcon,ariaDescription:app.attrs.tooltip(()=>e.field.system?e.field.type+` (system)`:e.field.type)})),t.div({className:`field prop-name`},t.input({type:`text`,id:r+`.name`,name:()=>`fields.${e.fieldIndex}.name`,required:!0,spellcheck:!1,placeholder:`Field name*`,className:`inline-error`,disabled:()=>e.field[`@toDelete`]||e.field.system,value:()=>e.field.name||``,oninput:n=>{n.isComposing||(e.field.name=n.target.value)},onmount:n=>{n.addEventListener(`compositionend`,n=>{e.field.name=n.target.value}),setTimeout(()=>{n&&e.field.__focus&&(n.select(),delete e.field.__focus)},0)}}),t.div({className:`field-labels`},()=>{let n=[];return e.field.required&&n.push(t.span({className:`label success`},`Required`)),e.field.hidden?n.push(t.span({className:`label danger`},`Hidden`)):e.field.presentable&&n.push(t.span({className:`label info`},`Presentable`)),n}))),e=>typeof i.header==`function`?i.header(e):i.header),t.button({type:`button`,className:()=>`btn sm circle transparent secondary ${app.utils.isEmpty(app.utils.getByPath(app.store.errors,`fields.${e.fieldIndex}`))?``:`txt-danger`}`,title:`Field options`,hidden:()=>e.field[W],onclick:e=>{let n=e.target.closest(`details`);n&&(n.open=!n.open)}},t.i({className:`ri-settings-3-line`,ariaHidden:!0})),t.button({type:`button`,className:`btn sm circle transparent warning`,hidden:()=>!e.field[W],onclick:()=>delete e.field[W],ariaLabel:app.attrs.tooltip(`Restore`)},t.i({className:`ri-restart-line`,ariaHidden:!0}))),e=>typeof i.content==`function`?i.content(e):i.content,t.footer({className:`record-field-settings-footer`},e=>typeof i.footer==`function`?i.footer(e):i.footer,()=>{if(i.showPresentable)return t.div({className:`field prop-presentable`},t.input({type:`checkbox`,id:r+`.presentable`,name:()=>`fields.${e.fieldIndex}.presentable`,className:`sm`,disabled:()=>e.field.hidden,checked:()=>!!e.field.presentable,onchange:n=>e.field.presentable=n.target.checked}),t.label({htmlFor:r+`.presentable`},t.span({className:`txt`},`Presentable`),t.i({className:`ri-information-line link-hint`,ariaDescription:app.attrs.tooltip(()=>{let n=`Whether the field should be preferred in the Superuser UI relation listings (default to auto).`;return e.field.hidden&&(n+=` The field cannot be presentable if hidden.`),n})})))},()=>{if(i.showHidden)return t.div({className:`field prop-hidden`},t.input({type:`checkbox`,id:r+`.hidden`,className:`sm`,name:()=>`fields.${e.fieldIndex}.hidden`,checked:()=>!!e.field.hidden,onchange:n=>e.field.hidden=n.target.checked}),t.label({htmlFor:r+`.hidden`},t.span({className:`txt`},`Hidden`),t.i({className:`ri-information-line link-hint`,ariaDescription:app.attrs.tooltip(`Hide from the JSON API response and filters.`)})))},t.button({hidden:()=>!i.showDuplicate&&(!i.showRemove||e.field.system),type:`button`,title:`More options`,className:`btn sm circle transparent secondary more-btn m-l-auto`,"html-popovertarget":r+`_options_dropdown`},t.i({className:`ri-more-line`,ariaHidden:!0})),t.div({id:r+`_options_dropdown`,className:`dropdown sm field-options-dropdown`,popover:`auto`},()=>{if(i.showDuplicate)return t.button({type:`button`,className:`dropdown-item`,role:`menuitem`,textContent:`Duplicate`,onclick:e=>{o(),e.target.closest(`.dropdown`).hidePopover()}})},()=>{if(!(!i.showRemove||e.field.system))return t.button({type:`button`,className:`dropdown-item`,role:`menuitem`,textContent:`Remove`,onclick:e=>{s(),e.target.closest(`.dropdown`).hidePopover(),e.target.closest(`details`).open=!1}})})))};function G(e,n=`field`){let r=n,i=2,a=n.match(/\d+$/)?.[0]||``,o=a?n.substring(0,n.length-a.length):n;for(;e?.find(e=>e.name.toLowerCase()==r.toLowerCase());)r=o+((a<<0)+i),i++;return r}function Yt(e,n,r){if(!r||n===void 0||n===r||!e?.passwordAuth?.identityFields?.length)return;let i=e.passwordAuth.identityFields;for(let e=0;e!e[`@toDelete`]&&e.name==n)||(e.indexes=e.indexes.map(e=>app.utils.replaceIndexColumn(e,n,r)))}function Zt(e){let n=`text_`+app.utils.randomString(),r=store({get hasAutogenerate(){return!app.utils.isEmpty(e.field.autogeneratePattern)&&app.utils.isEmpty(e.originalRecord?.id)},get isDisabled(){return!app.utils.isEmpty(e.originalRecord?.id)&&e.field.primaryKey},get isRequired(){return e.field.required&&!r.hasAutogenerate&&!r.isDisabled}});return t.div({className:`record-field-input field-type-text`},t.div({className:`fields`},t.div({className:`field`},t.label({htmlFor:n},t.i({ariaHidden:!0,className:()=>e.field.primaryKey?`ri-key-line`:app.fieldTypes.text.icon}),t.span({className:`txt`},()=>e.field.name)),t.div({className:`autoexpand-wrapper`},t.textarea({id:n,rows:1,name:()=>e.field.name,required:()=>r.isRequired,disabled:()=>r.isDisabled,placeholder:()=>r.hasAutogenerate?`Leave empty to autogenerate...`:``,value:()=>e.record[e.field.name]||``,oninput:n=>e.record[e.field.name]=n.target.value||``}),t.div({className:`input`},()=>e.record[e.field.name],` `))),()=>{if(!e.field.primaryKey||!e.originalRecord?.id)return;let n=e.collection?.fields?.filter(e=>e.type==`autodate`)||[];if(!n.length)return;let r=[];for(let i of n)r.push(`${i.name}: ${app.utils.displayValue(e.record[i.name])}`);return t.div({className:`field addon`},t.i({className:`ri-information-line txt-hint link-faded`,ariaDescription:app.attrs.tooltip(r.join(` `),`left`)}))}),()=>{if(e.field.help)return t.div({className:`field-help`},e.field.help)})}function Qt(e){let n=`f_`+app.utils.randomString();return app.components.fieldSettings(e,{content:()=>t.div({className:`grid sm`},t.div({className:`col-sm-6`},t.div({className:`field`},t.label({htmlFor:n+`.min`},t.span({className:`txt`},`Min length`),t.i({className:`ri-information-line link-hint`,ariaDescription:app.attrs.tooltip(`Clear the field or set it to 0 for no limit.`)})),t.input({type:`number`,id:n+`.min`,name:()=>`fields.${e.fieldIndex}.min`,step:1,min:0,max:2**53-1,placeholder:`No min limit`,value:()=>e.field.min||``,oninput:n=>{e.field.min=parseInt(n.target.value,10)}}))),t.div({className:`col-sm-6`},t.div({className:`field`},t.label({htmlFor:n+`.max`},t.span({className:`txt`},`Max length`),t.i({className:`ri-information-line link-hint`,ariaDescription:app.attrs.tooltip(`Clear the field or set it to 0 to fallback to the default limit.`)})),t.input({type:`number`,id:n+`.max`,name:()=>`fields.${e.fieldIndex}.max`,step:1,min:()=>e.field.min||0,max:2**53-1,placeholder:`Default to max 5000 characters`,value:()=>e.field.max||``,oninput:n=>{e.field.max=parseInt(n.target.value,10)}}))),t.div({className:`col-sm-6`},t.div({className:`field`},t.label({htmlFor:n+`.pattern`},t.span({className:`txt`},`Validation pattern`),()=>{if(e.field.primaryKey)return t.i({className:`ri-information-line link-hint`,ariaDescription:app.attrs.tooltip(`All record ids have forbidden characters and unique case-insensitive (ASCII) validations in addition to the user defined regex pattern.`)})}),t.input({type:`text`,id:n+`.pattern`,name:()=>`fields.${e.fieldIndex}.pattern`,value:()=>e.field.pattern||``,oninput:n=>e.field.pattern=n.target.value})),t.div({className:`field-help`},`Ex. `,t.code(null,`^[a-z0-9]+$`))),t.div({className:`col-sm-6`},t.div({className:`field`},t.label({htmlFor:n+`.autogeneratePattern`},t.span({className:`txt`},`Autogenerate pattern`),t.i({className:`ri-information-line link-hint`,ariaDescription:app.attrs.tooltip(`Set and autogenerate text matching the pattern on missing record create value.`)})),t.input({type:`text`,id:n+`.autogeneratePattern`,name:()=>`fields.${e.fieldIndex}.autogeneratePattern`,value:()=>e.field.autogeneratePattern||``,oninput:n=>e.field.autogeneratePattern=n.target.value})),t.div({className:`field-help`},`Ex. `,t.code(null,`[a-z0-9]{30}`))),t.div({className:`col-sm-12`},t.div({className:`field`},t.label({htmlFor:n+`.help`},`Help text`),t.input({type:`text`,id:n+`.help`,name:()=>`fields.${e.fieldIndex}.help`,value:()=>e.field.help||``,oninput:n=>e.field.help=n.target.value})))),footer:()=>[t.div({className:`field`},t.input({className:`sm`,type:`checkbox`,id:n+`.required`,name:()=>`fields.${e.fieldIndex}.required`,checked:()=>!!e.field.required,onchange:n=>e.field.required=n.target.checked}),t.label({htmlFor:n+`.required`},t.span({className:`txt`},`Required`),t.small({className:`txt-hint`},`(!='')`),t.i({className:`ri-information-line link-hint`,ariaDescription:app.attrs.tooltip(`Requires the field value to be nonempty string`)})))]})}function $t(e){return t.div({className:`record-field-view field-type-text`},()=>{let n=e.record[e.field.name]||``;if(n==``)return t.span({className:`missing-value`});if(e.field.primaryKey){let r=null;return e.record?.collectionName==`_superusers`&&app.store.superuser?.id==e.record?.id&&(r=t.strong({className:`txt`,textContent:` (you)`})),t.span({className:`label`},app.components.copyButton(n),t.span({className:`txt-ellipsis`},app.utils.truncate(n),r))}return e.short?t.span({className:`txt txt-ellipsis`,textContent:app.utils.truncate(n)}):n})}window.app=window.app||{},window.app.fieldTypes=window.app.fieldTypes||{},window.app.fieldTypes.text={icon:`ri-text`,label:`Plain text`,settings:Qt,input:Zt,view:$t,filterModifiers:e=>[`lower`],dummyData:(e,n=!1)=>e.primaryKey?app.utils.randomString(15):`example text`};function en(e){let n=`editor_`+app.utils.randomString(),r=store({lazyEditor:null});return t.div({className:`record-field-input field-type-editor large-modal`,onmount:()=>{requestAnimationFrame(()=>{r.lazyEditor=app.components.tinymce({id:n,required:()=>e.field.required,convertURLs:()=>e.field.convertURLs,name:()=>e.field.name,value:()=>e.record[e.field.name]||``,onchange:n=>{e.record[e.field.name]=n}})})}},t.div({className:`field`},t.label({htmlFor:n},t.i({className:app.fieldTypes.editor.icon,ariaHidden:!0}),t.span({className:`txt`},()=>e.field.name)),()=>r.lazyEditor),()=>{if(e.field.help)return t.div({className:`field-help`},e.field.help)})}function tn(e){let n=`f_`+app.utils.randomString();return store({showInfo:!1}),app.components.fieldSettings(e,{content:()=>t.div({className:`grid sm`},t.div({className:`col-sm-12`},t.div({className:`field`},t.label({htmlFor:n+`.maxSize`},t.span(null,`Max size `),t.small(null,`(bytes)`)),t.input({type:`number`,id:n+`.maxSize`,name:()=>`fields.${e.fieldIndex}.maxSize`,min:0,step:1,max:2**53-1,placeholder:`Default to max ~5MB`,value:()=>e.field.maxSize||``,oninput:n=>{e.field.maxSize=parseInt(n.target.value,10)}}))),t.div({className:`col-sm-12`},t.div({className:`field`},t.label({htmlFor:n+`.help`},`Help text`),t.input({type:`text`,id:n+`.help`,name:()=>`fields.${e.fieldIndex}.help`,value:()=>e.field.help||``,oninput:n=>e.field.help=n.target.value})))),footer:()=>[t.div({className:`field`},t.input({className:`sm`,type:`checkbox`,id:n+`.required`,name:()=>`fields.${e.fieldIndex}.required`,checked:()=>!!e.field.required,onchange:n=>e.field.required=n.target.checked}),t.label({htmlFor:n+`.required`},t.span({className:`txt`},`Required`),t.i({className:`ri-information-line link-hint`,ariaDescription:app.attrs.tooltip(`Requires the field value to be nonempty string`)}))),t.div({className:`field`},t.input({className:`sm`,type:`checkbox`,id:n+`.convertURLs`,name:()=>`fields.${e.fieldIndex}.convertURLs`,checked:()=>!!e.field.convertURLs,onchange:n=>e.field.convertURLs=n.target.checked}),t.label({htmlFor:n+`.convertURLs`},t.span({className:`txt`},`Strip URLs domain`),t.i({className:`ri-information-line link-hint`,ariaDescription:app.attrs.tooltip(`This could help making the editor content more portable between environments since there will be no local base url to replace.`)})))]})}function K(e){return t.div({className:`record-field-view field-type-editor`},()=>{if(e.short){let n=e.record[e.field.name];return n?t.span({className:`txt`,textContent:app.utils.truncate(app.utils.plainText(n),200)}):t.span({className:`missing-value`})}return app.components.tinymce({readonly:!0,className:`large-modal`,value:()=>e.record[e.field.name]||``})})}window.app=window.app||{},window.app.fieldTypes=window.app.fieldTypes||{},window.app.fieldTypes.editor={icon:`ri-edit-2-line`,label:`Rich editor`,settings:tn,input:en,view:K,filterModifiers:e=>[`lower`],dummyData:(e,n=!1)=>`Lorem ipsum dolor sit amet...`};function nn(e){let n=`number_`+app.utils.randomString();return t.div({className:`record-field-input field-type-number`},t.div({className:`field`},t.label({htmlFor:n},t.i({className:app.fieldTypes.number.icon,ariaHidden:!0}),t.span({className:`txt`},()=>e.field.name)),t.input({type:`number`,id:n,step:`any`,name:()=>e.field.name,required:()=>e.field.required,min:()=>e.field.min,max:()=>e.field.max,value:()=>e.record[e.field.name]||0,oninput:n=>e.record[e.field.name]=Number(n.target.value)})),()=>{if(e.field.help)return t.div({className:`field-help`},e.field.help)})}function rn(e){let n=`f_`+app.utils.randomString();return app.components.fieldSettings(e,{content:()=>t.div({className:`grid sm`},t.div({className:`col-sm-6`},t.div({className:`field`},t.label({htmlFor:n+`.min`},`Min`),t.input({type:`text`,id:n+`.min`,name:()=>`fields.${e.fieldIndex}.min`,value:()=>typeof e.field.min==`number`?e.field.min:``,oninput:n=>{n.target.value?e.field.min=Number(n.target.value):e.field.min=null}}))),t.div({className:`col-sm-6`},t.div({className:`field`},t.label({htmlFor:n+`.max`},`Max`),t.input({type:`text`,id:n+`.max`,min:()=>e.field.min,name:()=>`fields.${e.fieldIndex}.max`,value:()=>typeof e.field.max==`number`?e.field.max:``,oninput:n=>{n.target.value?e.field.max=Number(n.target.value):e.field.max=null}}))),t.div({className:`col-sm-12`},t.div({className:`field`},t.label({htmlFor:n+`.help`},`Help text`),t.input({type:`text`,id:n+`.help`,name:()=>`fields.${e.fieldIndex}.help`,value:()=>e.field.help||``,oninput:n=>e.field.help=n.target.value})))),footer:()=>[t.div({className:`field`},t.input({className:`sm`,type:`checkbox`,id:n+`.required`,name:()=>`fields.${e.fieldIndex}.required`,checked:()=>!!e.field.required,onchange:n=>e.field.required=n.target.checked}),t.label({htmlFor:n+`.required`},t.span({className:`txt`},`Required`),t.small({className:`txt-hint`},`(!=0)`),t.i({className:`ri-information-line link-hint`,ariaDescription:app.attrs.tooltip(`Requires the field value to be not 0.`)}))),t.div({className:`field`},t.input({className:`sm`,type:`checkbox`,id:n+`.onlyInt`,name:()=>`fields.${e.fieldIndex}.onlyInt`,checked:()=>!!e.field.onlyInt,onchange:n=>e.field.onlyInt=n.target.checked}),t.label({htmlFor:n+`.onlyInt`},t.span({className:`txt`},`No decimals`),t.i({className:`ri-information-line link-hint`,ariaDescription:app.attrs.tooltip(`Existing decimal numbers will not be affected.`)})))]})}function an(e){return t.div({className:`record-field-view field-type-number`},t.span({className:`txt`},()=>e.record[e.field.name]))}window.app=window.app||{},window.app.fieldTypes=window.app.fieldTypes||{},window.app.fieldTypes.number={icon:`ri-hashtag`,label:`Number`,settings:rn,input:nn,view:an,dummyData:(e,n=!1)=>123.456};function on(e){let n=`bool_`+app.utils.randomString();return t.div({className:`record-field-input field-type-bool`},t.div({className:`field`},t.input({type:`checkbox`,id:n,className:`switch`,name:()=>e.field.name,required:()=>e.field.required,checked:()=>e.record[e.field.name]||!1,onchange:n=>e.record[e.field.name]=n.target.checked||!1}),t.label({htmlFor:n},()=>e.field.name)),()=>{if(e.field.help)return t.div({className:`field-help`},e.field.help)})}function sn(e){let n=`f_`+app.utils.randomString();return app.components.fieldSettings(e,{content:()=>t.div({className:`grid sm`},t.div({className:`col-sm-12`},t.div({className:`field`},t.label({htmlFor:n+`.help`},`Help text`),t.input({type:`text`,id:n+`.help`,name:()=>`fields.${e.fieldIndex}.help`,value:()=>e.field.help||``,oninput:n=>e.field.help=n.target.value})))),footer:()=>[t.div({className:`field`},t.input({className:`sm`,type:`checkbox`,id:n+`.required`,name:()=>`fields.${e.fieldIndex}.required`,checked:()=>!!e.field.required,onchange:n=>e.field.required=n.target.checked}),t.label({htmlFor:n+`.required`},t.span({className:`txt`},`Required`),t.small({className:`txt-hint`},`(=true)`),t.i({className:`ri-information-line link-hint`,ariaDescription:app.attrs.tooltip(`Requires the field value to be true.`)})))]})}function cn(e){return t.div({className:`record-field-view field-type-bool`},t.span({className:()=>`label ${e.record[e.field.name]?`success`:``}`},()=>e.record[e.field.name]?`True`:`False`))}window.app=window.app||{},window.app.fieldTypes=window.app.fieldTypes||{},window.app.fieldTypes.bool={icon:`ri-toggle-line`,label:`Bool`,settings:sn,input:on,view:cn,dummyData:(e,n=!1)=>[!0,!1][Math.floor(Math.random()*2)]};function ln(e){let n=`email_`+app.utils.randomString();return t.div({className:`record-field-input field-type-email`},t.div({className:`field`},t.label({htmlFor:n},t.i({className:app.fieldTypes.email.icon,ariaHidden:!0}),t.span({className:`txt`},()=>e.field.name)),t.input({type:`email`,id:n,spellcheck:!1,autocomplete:!1,name:()=>e.field.name,required:()=>e.field.required,value:()=>e.record[e.field.name]||``,oninput:n=>e.record[e.field.name]=n.target.value})),()=>{if(e.field.help)return t.div({className:`field-help`},e.field.help)})}function un(e){let n=`f_`+app.utils.randomString();return app.components.fieldSettings(e,{content:()=>t.div({className:`grid sm`},t.div({className:`col-sm-6`},t.div({className:`field`},t.label({htmlFor:n+`.exceptDomains`},t.span({className:`txt`},`Except domains`),t.i({className:`ri-information-line link-hint`,ariaDescription:app.attrs.tooltip(`List of domains that are NOT allowed. This field is disabled if "Only domains" is set.`)})),t.input({type:`text`,id:n+`.exceptDomains`,disabled:()=>!app.utils.isEmpty(e.field.onlyDomains),name:()=>`fields.${e.fieldIndex}.exceptDomains`,value:()=>app.utils.joinNonEmpty(e.field.exceptDomains),onchange:n=>e.field.exceptDomains=app.utils.splitNonEmpty(n.target.value,`,`)})),t.div({className:`field-help`},`Use comma as separator.`)),t.div({className:`col-sm-6`},t.div({className:`field`},t.label({htmlFor:n+`.onlyDomains`},t.span({className:`txt`},`Only domains`),t.i({className:`ri-information-line link-hint`,ariaDescription:app.attrs.tooltip(`List of domains that are ONLY allowed. diff --git a/ui/dist/index.html b/ui/dist/index.html index 38bc8631..89a836d3 100644 --- a/ui/dist/index.html +++ b/ui/dist/index.html @@ -13,7 +13,7 @@ - + diff --git a/ui/src/records/recordUpsertModal.js b/ui/src/records/recordUpsertModal.js index 1a5f9be3..a7886a0f 100644 --- a/ui/src/records/recordUpsertModal.js +++ b/ui/src/records/recordUpsertModal.js @@ -73,7 +73,7 @@ function serializeRecord(record) { return ""; } - return JSON.stringify(record); + return JSON.stringify(redacted(record)); } const TAB_MAIN = "main";