minor screen reader improvements

This commit is contained in:
Gani Georgiev
2026-04-18 22:11:42 +03:00
parent 624c3357be
commit 075e20efae
88 changed files with 298 additions and 256 deletions

View File

@@ -1,6 +1,6 @@
<p align="center"> <p align="center">
<a href="https://pocketbase.io" target="_blank" rel="noopener"> <a href="https://pocketbase.io" target="_blank" rel="noopener">
<img src="https://i.imgur.com/3FTfaXH.png" alt="PocketBase - open source backend in 1 file" /> <img src="https://i.imgur.com/aCBbjKx.png" alt="PocketBase - open source backend in 1 file" />
</a> </a>
</p> </p>

View File

@@ -1,4 +1,4 @@
import{t as e}from"./expandInfo-DGS0CLSa.js";import{t as n}from"./fieldsInfo-Bz62125-.js";import{t as r}from"./filterSyntax-UQrUrYb5.js";function i(i){let a=app.utils.getApiExampleURL(),o=i.listRule===null,s={collectionId:i.id,collectionName:i.name},c=[{title:200,value:JSON.stringify({page:1,perPage:30,totalPages:1,totalItems:2,items:[Object.assign(s,app.utils.getDummyFieldsData(i)),Object.assign(s,app.utils.getDummyFieldsData(i))]},null,2)},{title:400,value:` import{t as e}from"./expandInfo-DGS0CLSa.js";import{t as n}from"./fieldsInfo-Bz62125-.js";import{t as r}from"./filterSyntax-Df6AnI5x.js";function i(i){let a=app.utils.getApiExampleURL(),o=i.listRule===null,s={collectionId:i.id,collectionName:i.name},c=[{title:200,value:JSON.stringify({page:1,perPage:30,totalPages:1,totalItems:2,items:[Object.assign(s,app.utils.getDummyFieldsData(i)),Object.assign(s,app.utils.getDummyFieldsData(i))]},null,2)},{title:400,value:`
{ {
"status": 400, "status": 400,
"message": "Something went wrong while processing your request.", "message": "Something went wrong while processing your request.",

View File

@@ -0,0 +1 @@
function e(){let e=store({show:!1});return t.div({className:`filter-details m-t-10`},t.button({type:`button`,className:`btn secondary sm`,onclick:()=>e.show=!e.show},()=>e.show?[t.span({className:`txt`},`Hide details`),t.i({className:`ri-arrow-up-s-line`,ariaHidden:!0})]:[t.span({className:`txt`},`Show details`),t.i({className:`ri-arrow-down-s-line`,ariaHidden:!0})]),app.components.slide(()=>e.show,t.div({className:`block p-t-5`},t.p(null,`The filter syntax follows the format `,t.code(null,t.span({className:`txt-success`},`OPERAND`),t.span({className:`txt-danger`},` OPERATOR `),t.span({className:`txt-success`},`OPERAND`)),`, where:`),t.ul(null,t.li(null,t.span({className:`txt-code txt-success`},`OPERAND`),` could be any of the above field literal, function, string (single or double quoted), number, null, true, false`),t.li(null,t.span({className:`txt-code txt-danger`},`OPERATOR`),` is one of:`,t.ul(null,t.li(null,t.code({className:`filter-op`},`=`),` Equal`),t.li(null,t.code({className:`filter-op`},`!=`),` Not equal`),t.li(null,t.code({className:`filter-op`},`>`),` Greater than`),t.li(null,t.code({className:`filter-op`},`>=`),` Greater than or equal`),t.li(null,t.code({className:`filter-op`},`<`),` Less than`),t.li(null,t.code({className:`filter-op`},`<=`),` Less than or equal`),t.li(null,t.code({className:`filter-op`},`~`),` Like/Contains`,t.div({className:`txt-sm txt-hint`},t.em(null,`(auto wraps the right string OPERAND in a "%" for wildcard match if not explicitly set)`))),t.li(null,t.code({className:`filter-op`},`!~`),` NOT Like/Contains`,t.div({className:`txt-sm txt-hint`},t.em(null,`(auto wraps the right string OPERAND in a "%" for wildcard match if not explicitly set)`))),t.li(null,t.code({className:`filter-op`},`?=`),t.span({className:`txt-hint`},` Any/At-least-one-of`),` Equal`),t.li(null,t.code({className:`filter-op`},`?!=`),t.span({className:`txt-hint`},` Any/At-least-one-of`),` Not equal`),t.li(null,t.code({className:`filter-op`},`?>`),t.span({className:`txt-hint`},` Any/At-least-one-of`),` Greater than`),t.li(null,t.code({className:`filter-op`},`?>=`),t.span({className:`txt-hint`},` Any/At-least-one-of`),` Greater than or equal`),t.li(null,t.code({className:`filter-op`},`?<`),t.span({className:`txt-hint`},` Any/At-least-one-of`),` Less than`),t.li(null,t.code({className:`filter-op`},`?<=`),t.span({className:`txt-hint`},` Any/At-least-one-of`),` Less than or equal`),t.li(null,t.code({className:`filter-op`},`?~`),t.span({className:`txt-hint`},` Any/At-least-one-of`),` Like/Contains`,t.div({className:`txt-sm txt-hint`},t.em(null,`(auto wraps the right string OPERAND in a "%" for wildcard match if not explicitly set)`))),t.li(null,t.code({className:`filter-op`},`?!~`),t.span({className:`txt-hint`},` Any/At-least-one-of`),` NOT Like/Contains`,t.div({className:`txt-sm txt-hint`},t.em(null,`(auto wraps the right string OPERAND in a "%" for wildcard match if not explicitly set)`)))),t.p(null,`To group and combine several expressions you could use brackets `,t.code(null,`(...)`),`, `,t.code(null,`&&`),`, (AND) and `,t.code(null,`||`),` (OR) tokens.`))))))}export{e as t};

View File

@@ -1 +0,0 @@
function e(){let e=store({show:!1});return t.div({className:`filter-details m-t-10`},t.button({type:`button`,className:`btn secondary sm`,onclick:()=>e.show=!e.show},()=>e.show?[t.span({className:`txt`},`Hide details`),t.i({className:`ri-arrow-up-s-line`})]:[t.span({className:`txt`},`Show details`),t.i({className:`ri-arrow-down-s-line`})]),app.components.slide(()=>e.show,t.div({className:`block p-t-5`},t.p(null,`The filter syntax follows the format `,t.code(null,t.span({className:`txt-success`},`OPERAND`),t.span({className:`txt-danger`},` OPERATOR `),t.span({className:`txt-success`},`OPERAND`)),`, where:`),t.ul(null,t.li(null,t.span({className:`txt-code txt-success`},`OPERAND`),` could be any of the above field literal, function, string (single or double quoted), number, null, true, false`),t.li(null,t.span({className:`txt-code txt-danger`},`OPERATOR`),` is one of:`,t.ul(null,t.li(null,t.code({className:`filter-op`},`=`),` Equal`),t.li(null,t.code({className:`filter-op`},`!=`),` Not equal`),t.li(null,t.code({className:`filter-op`},`>`),` Greater than`),t.li(null,t.code({className:`filter-op`},`>=`),` Greater than or equal`),t.li(null,t.code({className:`filter-op`},`<`),` Less than`),t.li(null,t.code({className:`filter-op`},`<=`),` Less than or equal`),t.li(null,t.code({className:`filter-op`},`~`),` Like/Contains`,t.div({className:`txt-sm txt-hint`},t.em(null,`(auto wraps the right string OPERAND in a "%" for wildcard match if not explicitly set)`))),t.li(null,t.code({className:`filter-op`},`!~`),` NOT Like/Contains`,t.div({className:`txt-sm txt-hint`},t.em(null,`(auto wraps the right string OPERAND in a "%" for wildcard match if not explicitly set)`))),t.li(null,t.code({className:`filter-op`},`?=`),t.span({className:`txt-hint`},` Any/At-least-one-of`),` Equal`),t.li(null,t.code({className:`filter-op`},`?!=`),t.span({className:`txt-hint`},` Any/At-least-one-of`),` Not equal`),t.li(null,t.code({className:`filter-op`},`?>`),t.span({className:`txt-hint`},` Any/At-least-one-of`),` Greater than`),t.li(null,t.code({className:`filter-op`},`?>=`),t.span({className:`txt-hint`},` Any/At-least-one-of`),` Greater than or equal`),t.li(null,t.code({className:`filter-op`},`?<`),t.span({className:`txt-hint`},` Any/At-least-one-of`),` Less than`),t.li(null,t.code({className:`filter-op`},`?<=`),t.span({className:`txt-hint`},` Any/At-least-one-of`),` Less than or equal`),t.li(null,t.code({className:`filter-op`},`?~`),t.span({className:`txt-hint`},` Any/At-least-one-of`),` Like/Contains`,t.div({className:`txt-sm txt-hint`},t.em(null,`(auto wraps the right string OPERAND in a "%" for wildcard match if not explicitly set)`))),t.li(null,t.code({className:`filter-op`},`?!~`),t.span({className:`txt-hint`},` Any/At-least-one-of`),` NOT Like/Contains`,t.div({className:`txt-sm txt-hint`},t.em(null,`(auto wraps the right string OPERAND in a "%" for wildcard match if not explicitly set)`)))),t.p(null,`To group and combine several expressions you could use brackets `,t.code(null,`(...)`),`, `,t.code(null,`&&`),`, (AND) and `,t.code(null,`||`),` (OR) tokens.`))))))}export{e as t};

81
ui/dist/assets/index-CZaohvip.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
import{i as e,t as n}from"./pocketbase.es-B_4DUNUU.js";function r(r){let i=r.params?.token||``,a=e(i);if(!a.newEmail||!a.collectionId){app.toasts.error(`Invalid or expired email change token.`),window.location.hash=`#/`;return}app.store.title=`Confirm email change`;let o=store({password:``,isSubmitting:!1,isSuccess:!1,showPassword:!1});async function s(){if(o.isSubmitting)return;o.isSubmitting=!0;let e=new n(app.pb.baseURL);try{await e.collection(a.collectionId).confirmEmailChange(i,o.password),o.isSuccess=!0}catch(e){app.checkApiError(e),o.isSuccess=!1}o.isSubmitting=!1}return t.div({pbEvent:`pageConfirmEmailChange`,className:`wrapper sm m-auto p-b-base`},t.header({className:`txt-center m-b-base`},t.img({className:`main-logo`,src:()=>app.store.mainLogo,ariaHidden:!0,alt:`App logo`}),t.h5({className:`m-t-10`},()=>app.store.title)),()=>o.isSuccess?t.div({pbEvent:`confirmEmailChangeAlert`,className:`alert success txt-center`},t.p(null,`The email was successfully changed.`),t.p(null,`You can go back and sign in with your new email address.`)):t.form({pbEvent:`confirmEmailChangeForm`,className:`grid confirm-email-change-form`,onsubmit:e=>{e.preventDefault(),s()}},t.div({className:`col-12`},t.div({className:`content txt-center m-b-sm`},`Type your password to confirm changing your email address to `,t.strong(null,a.newEmail),`:`),t.div({className:`fields`},t.div({className:`field`},t.label({htmlFor:`password_confirm`},`Password`),t.input({id:`password_confirm`,name:`password`,required:!0,autofocus:!0,type:()=>o.showPassword?`text`:`password`,value:()=>o.password,oninput:e=>o.password=e.target.value})),t.div({className:`field addon`},t.button({type:`button`,tabIndex:-1,className:`btn sm transparent secondary circle tooltip-right`,ariaDescription:app.attrs.tooltip(()=>o.showPassword?`Hide password`:`Show password`),onclick:()=>o.showPassword=!o.showPassword},t.i({className:()=>o.showPassword?`ri-eye-off-line`:`ri-eye-line`}))))),t.div({className:`col-12`},t.button({className:()=>`btn lg block ${o.isSubmitting?`loading`:``}`,disabled:()=>o.isSubmitting},t.span({className:`txt`},`Confirm new email`)))))}export{r as pageConfirmEmailChange}; import{i as e,t as n}from"./pocketbase.es-B_4DUNUU.js";function r(r){let i=r.params?.token||``,a=e(i);if(!a.newEmail||!a.collectionId){app.toasts.error(`Invalid or expired email change token.`),window.location.hash=`#/`;return}app.store.title=`Confirm email change`;let o=store({password:``,isSubmitting:!1,isSuccess:!1,showPassword:!1});async function s(){if(o.isSubmitting)return;o.isSubmitting=!0;let e=new n(app.pb.baseURL);try{await e.collection(a.collectionId).confirmEmailChange(i,o.password),o.isSuccess=!0}catch(e){app.checkApiError(e),o.isSuccess=!1}o.isSubmitting=!1}return t.div({pbEvent:`pageConfirmEmailChange`,className:`wrapper sm m-auto p-b-base`},t.header({className:`txt-center m-b-base`},t.img({className:`main-logo`,src:()=>app.store.mainLogo,ariaHidden:!0,alt:`App logo`}),t.h5({className:`m-t-10`},()=>app.store.title)),()=>o.isSuccess?t.div({pbEvent:`confirmEmailChangeAlert`,className:`alert success txt-center`},t.p(null,`The email was successfully changed.`),t.p(null,`You can go back and sign in with your new email address.`)):t.form({pbEvent:`confirmEmailChangeForm`,className:`grid confirm-email-change-form`,onsubmit:e=>{e.preventDefault(),s()}},t.div({className:`col-12`},t.div({className:`content txt-center m-b-sm`},`Type your password to confirm changing your email address to `,t.strong(null,a.newEmail),`:`),t.div({className:`fields`},t.div({className:`field`},t.label({htmlFor:`password_confirm`},`Password`),t.input({id:`password_confirm`,name:`password`,required:!0,autofocus:!0,type:()=>o.showPassword?`text`:`password`,value:()=>o.password,oninput:e=>o.password=e.target.value})),t.div({className:`field addon`},t.button({type:`button`,tabIndex:-1,className:`btn sm transparent secondary circle tooltip-right`,ariaLabel:app.attrs.tooltip(()=>o.showPassword?`Hide password`:`Show password`),onclick:()=>o.showPassword=!o.showPassword},t.i({className:()=>o.showPassword?`ri-eye-off-line`:`ri-eye-line`,ariaHidden:!0}))))),t.div({className:`col-12`},t.button({className:()=>`btn lg block ${o.isSubmitting?`loading`:``}`,disabled:()=>o.isSubmitting},t.span({className:`txt`},`Confirm new email`)))))}export{r as pageConfirmEmailChange};

View File

@@ -1 +1 @@
import{i as e,t as n}from"./pocketbase.es-B_4DUNUU.js";function r(r){let i=r.params?.token||``,a=e(i);if(!a.email||!a.collectionId){app.toasts.error(`Invalid or expired password reset token.`),window.location.hash=`#/`;return}app.store.title=`Confirm password reset`;let o=store({newPassword:``,newPasswordConfirm:``,showNewPassword:!1,showNewPasswordConfirm:!1,isSubmitting:!1,isSuccess:!1});async function s(){if(o.isSubmitting)return;o.isSubmitting=!0;let e=new n(app.pb.baseURL);try{await e.collection(a.collectionId).confirmPasswordReset(i,o.newPassword,o.newPasswordConfirm),o.isSuccess=!0}catch(e){app.checkApiError(e)}o.isSubmitting=!1}return t.div({pbEvent:`pageConfirmPasswordReset`,className:`wrapper sm m-auto p-b-base`},t.header({className:`txt-center m-b-base`},t.img({className:`main-logo`,src:()=>app.store.mainLogo,ariaHidden:!0,alt:`App logo`}),t.h5({className:`m-t-10`},()=>app.store.title)),()=>o.isSuccess?t.div({pbEvent:`confirmPasswordResetAlert`,className:`alert success txt-center`},t.p(null,`The password was successfully changed.`),t.p(null,`You can go back to sign in with your new password.`)):t.form({pbEvent:`confirmPasswordResetForm`,className:`grid confirm-password-reset-form`,onsubmit:e=>{e.preventDefault(),s()}},t.div({className:`col-12`},t.div({className:`content txt-center m-b-sm`},`Type your new password for `,t.strong(null,a.email),`:`),t.div({className:`fields`},t.div({className:`field`},t.label({htmlFor:`newPassword`},`New password`),t.input({id:`newPassword`,name:`password`,required:!0,autofocus:!0,autocomplete:`new-password`,type:()=>o.showNewPassword?`text`:`password`,value:()=>o.newPassword,oninput:e=>o.newPassword=e.target.value})),t.div({className:`field addon`},t.button({type:`button`,tabIndex:-1,className:`btn sm transparent secondary circle tooltip-right`,ariaDescription:app.attrs.tooltip(()=>o.showNewPassword?`Hide password`:`Show password`),onclick:()=>o.showNewPassword=!o.showNewPassword},t.i({className:()=>o.showNewPassword?`ri-eye-off-line`:`ri-eye-line`}))))),t.div({className:`col-12`},t.div({className:`fields`},t.div({className:`field`},t.label({htmlFor:`newPasswordConfirm`},`New password confirm`),t.input({id:`newPasswordConfirm`,name:`passwordConfirm`,required:!0,autocomplete:`new-password`,type:()=>o.showNewPasswordConfirm?`text`:`password`,value:()=>o.newPasswordConfirm,oninput:e=>o.newPasswordConfirm=e.target.value})),t.div({className:`field addon`},t.button({type:`button`,tabIndex:-1,className:`btn sm transparent secondary circle tooltip-right`,ariaDescription:app.attrs.tooltip(()=>o.showNewPasswordConfirm?`Hide password`:`Show password`),onclick:()=>o.showNewPasswordConfirm=!o.showNewPasswordConfirm},t.i({className:()=>o.showNewPasswordConfirm?`ri-eye-off-line`:`ri-eye-line`}))))),t.div({className:`col-12`},t.button({className:()=>`btn lg block ${o.isSubmitting?`loading`:``}`,disabled:()=>o.isSubmitting},t.span({className:`txt`},`Set new password`)))))}export{r as pageConfirmPasswordReset}; import{i as e,t as n}from"./pocketbase.es-B_4DUNUU.js";function r(r){let i=r.params?.token||``,a=e(i);if(!a.email||!a.collectionId){app.toasts.error(`Invalid or expired password reset token.`),window.location.hash=`#/`;return}app.store.title=`Confirm password reset`;let o=store({newPassword:``,newPasswordConfirm:``,showNewPassword:!1,showNewPasswordConfirm:!1,isSubmitting:!1,isSuccess:!1});async function s(){if(o.isSubmitting)return;o.isSubmitting=!0;let e=new n(app.pb.baseURL);try{await e.collection(a.collectionId).confirmPasswordReset(i,o.newPassword,o.newPasswordConfirm),o.isSuccess=!0}catch(e){app.checkApiError(e)}o.isSubmitting=!1}return t.div({pbEvent:`pageConfirmPasswordReset`,className:`wrapper sm m-auto p-b-base`},t.header({className:`txt-center m-b-base`},t.img({className:`main-logo`,src:()=>app.store.mainLogo,ariaHidden:!0,alt:`App logo`}),t.h5({className:`m-t-10`},()=>app.store.title)),()=>o.isSuccess?t.div({pbEvent:`confirmPasswordResetAlert`,className:`alert success txt-center`},t.p(null,`The password was successfully changed.`),t.p(null,`You can go back to sign in with your new password.`)):t.form({pbEvent:`confirmPasswordResetForm`,className:`grid confirm-password-reset-form`,onsubmit:e=>{e.preventDefault(),s()}},t.div({className:`col-12`},t.div({className:`content txt-center m-b-sm`},`Type your new password for `,t.strong(null,a.email),`:`),t.div({className:`fields`},t.div({className:`field`},t.label({htmlFor:`newPassword`},`New password`),t.input({id:`newPassword`,name:`password`,required:!0,autofocus:!0,autocomplete:`new-password`,type:()=>o.showNewPassword?`text`:`password`,value:()=>o.newPassword,oninput:e=>o.newPassword=e.target.value})),t.div({className:`field addon`},t.button({type:`button`,tabIndex:-1,className:`btn sm transparent secondary circle tooltip-right`,ariaLabel:app.attrs.tooltip(()=>o.showNewPassword?`Hide password`:`Show password`),onclick:()=>o.showNewPassword=!o.showNewPassword},t.i({className:()=>o.showNewPassword?`ri-eye-off-line`:`ri-eye-line`,ariaHidden:!0}))))),t.div({className:`col-12`},t.div({className:`fields`},t.div({className:`field`},t.label({htmlFor:`newPasswordConfirm`},`New password confirm`),t.input({id:`newPasswordConfirm`,name:`passwordConfirm`,required:!0,autocomplete:`new-password`,type:()=>o.showNewPasswordConfirm?`text`:`password`,value:()=>o.newPasswordConfirm,oninput:e=>o.newPasswordConfirm=e.target.value})),t.div({className:`field addon`},t.button({type:`button`,tabIndex:-1,className:`btn sm transparent secondary circle tooltip-right`,ariaLabel:app.attrs.tooltip(()=>o.showNewPasswordConfirm?`Hide password`:`Show password`),onclick:()=>o.showNewPasswordConfirm=!o.showNewPasswordConfirm},t.i({className:()=>o.showNewPasswordConfirm?`ri-eye-off-line`:`ri-eye-line`,ariaHidden:!0}))))),t.div({className:`col-12`},t.button({className:()=>`btn lg block ${o.isSubmitting?`loading`:``}`,disabled:()=>o.isSubmitting},t.span({className:`txt`},`Set new password`)))))}export{r as pageConfirmPasswordReset};

View File

@@ -1 +1 @@
import{a as e,i as n}from"./pocketbase.es-B_4DUNUU.js";function r(r){let i=r.params?.token||``;if(n(i).type!=`auth`||e(i)){app.toasts.error(`The installer token is invalid or has expired.`),window.location.hash=`#/`;return}app.store.title=`Setup your PocketBase instance`;let a=store({email:``,password:``,passwordConfirm:``,showPassword:!1,showPasswordConfirm:!1,isSubmitting:!1,isUploading:!1,get isBusy(){return a.isSubmitting||a.isUploading}});async function o(){if(!a.isBusy){a.isSubmitting=!0;try{await app.pb.collection(`_superusers`).create({email:a.email,password:a.password,passwordConfirm:a.passwordConfirm},{headers:{Authorization:i}}),await app.pb.collection(`_superusers`).authWithPassword(a.email,a.password),window.location.hash=`#/`}catch(e){app.checkApiError(e)}a.isSubmitting=!1}}let s=`backupFileInput`;function c(){let e=document.getElementById(s);e&&(e.value=``)}function l(e){e&&app.modals.confirm(t.h6(null,`Note that we don't perform validations for the uploaded backup files. Proceed with caution and only if you trust the file source.\n\nDo you really want to upload and initialize "${e.name}"?`),()=>{u(e)},()=>{c()})}async function u(e){if(!(!e||a.isBusy)){a.isUploading=!0;try{await app.pb.backups.upload({file:e},{headers:{Authorization:i}}),await app.pb.backups.restore(e.name,{headers:{Authorization:i}}),app.toasts.info(`Please wait while extracting the uploaded archive!`),await new Promise(e=>setTimeout(e,3e3)),window.location.href=`#/`}catch(e){app.checkApiError(e)}c(),a.isUploading=!1}}return t.div({pbEvent:`pageInstaller`,className:`wrapper sm m-auto p-b-base`},t.header({className:`txt-center m-b-base`},t.img({className:`main-logo`,src:()=>app.store.mainLogo,ariaHidden:!0,alt:`App logo`}),t.h5({className:`m-t-10`},()=>app.store.title)),t.form({pbEvent:`installerForm`,className:`grid installer-form`,onsubmit:e=>{e.preventDefault(),o(a)}},t.div({className:`col-12 txt-center`},`Create your first superuser account in order to continue:`),t.div({className:`col-12`},t.div({className:`field`},t.label({htmlFor:`superuser_email`},`Email`),t.input({id:`superuser_email`,name:`email`,type:`email`,required:!0,autofocus:!0,autocomplete:`off`,disabled:()=>a.isBusy,value:()=>a.email,oninput:e=>a.email=e.target.value}))),t.div({className:`col-12`},t.div({className:`fields`},t.div({className:`field`},t.label({htmlFor:`superuser_password`},`Password`),t.input({id:`superuser_password`,name:`password`,min:10,required:!0,disabled:()=>a.isBusy,type:()=>a.showPassword?`text`:`password`,value:()=>a.password,oninput:e=>a.password=e.target.value})),t.div({className:`field addon`},t.button({type:`button`,tabIndex:-1,className:`btn sm transparent secondary circle tooltip-right`,ariaDescription:app.attrs.tooltip(()=>a.showPassword?`Hide password`:`Show password`),onclick:()=>a.showPassword=!a.showPassword},t.i({className:()=>a.showPassword?`ri-eye-off-line`:`ri-eye-line`})))),t.div({className:`field-help`},`Recommended at least 10 characters.`)),t.div({className:`col-12`},t.div({className:`fields`},t.div({className:`field`},t.label({htmlFor:`superuser_password_confirm`},`Password confirm`),t.input({id:`superuser_password_confirm`,name:`passwordConfirm`,required:!0,disabled:()=>a.isBusy,type:()=>a.showPasswordConfirm?`text`:`password`,value:()=>a.passwordConfirm,oninput:e=>a.passwordConfirm=e.target.value})),t.div({className:`field addon`},t.button({type:`button`,tabIndex:-1,className:`btn sm transparent secondary circle tooltip-right`,ariaDescription:app.attrs.tooltip(()=>a.showPasswordConfirm?`Hide password`:`Show password`),onclick:()=>a.showPasswordConfirm=!a.showPasswordConfirm},t.i({className:()=>a.showPasswordConfirm?`ri-eye-off-line`:`ri-eye-line`}))))),t.div({className:`col-12`},t.button({className:()=>`btn lg next block ${a.isSubmitting?`loading`:``}`,disabled:()=>a.isBusy},t.span({className:`txt`},`Create superuser and login`),t.i({className:`ri-arrow-right-line`})))),t.hr(),t.label({htmlFor:s,className:()=>`btn secondary transparent lg block ${a.isBusy?`disabled`:``} ${a.isUploading?`loading`:``}`},t.i({className:`ri-upload-cloud-line`}),t.span({className:`txt`},`Or initialize from backup`)),t.input({id:s,type:`file`,className:`hidden`,accept:`.zip`,onchange:e=>{l(e.target?.files?.[0])}}))}export{r as pageInstaller}; import{a as e,i as n}from"./pocketbase.es-B_4DUNUU.js";function r(r){let i=r.params?.token||``;if(n(i).type!=`auth`||e(i)){app.toasts.error(`The installer token is invalid or has expired.`),window.location.hash=`#/`;return}app.store.title=`Setup your PocketBase instance`;let a=store({email:``,password:``,passwordConfirm:``,showPassword:!1,showPasswordConfirm:!1,isSubmitting:!1,isUploading:!1,get isBusy(){return a.isSubmitting||a.isUploading}});async function o(){if(!a.isBusy){a.isSubmitting=!0;try{await app.pb.collection(`_superusers`).create({email:a.email,password:a.password,passwordConfirm:a.passwordConfirm},{headers:{Authorization:i}}),await app.pb.collection(`_superusers`).authWithPassword(a.email,a.password),window.location.hash=`#/`}catch(e){app.checkApiError(e)}a.isSubmitting=!1}}let s=`backupFileInput`;function c(){let e=document.getElementById(s);e&&(e.value=``)}function l(e){e&&app.modals.confirm(t.h6(null,`Note that we don't perform validations for the uploaded backup files. Proceed with caution and only if you trust the file source.\n\nDo you really want to upload and initialize "${e.name}"?`),()=>{u(e)},()=>{c()})}async function u(e){if(!(!e||a.isBusy)){a.isUploading=!0;try{await app.pb.backups.upload({file:e},{headers:{Authorization:i}}),await app.pb.backups.restore(e.name,{headers:{Authorization:i}}),app.toasts.info(`Please wait while extracting the uploaded archive!`),await new Promise(e=>setTimeout(e,3e3)),window.location.href=`#/`}catch(e){app.checkApiError(e)}c(),a.isUploading=!1}}return t.div({pbEvent:`pageInstaller`,className:`wrapper sm m-auto p-b-base`},t.header({className:`txt-center m-b-base`},t.img({className:`main-logo`,src:()=>app.store.mainLogo,ariaHidden:!0,alt:`App logo`}),t.h5({className:`m-t-10`},()=>app.store.title)),t.form({pbEvent:`installerForm`,className:`grid installer-form`,onsubmit:e=>{e.preventDefault(),o(a)}},t.div({className:`col-12 txt-center`},`Create your first superuser account in order to continue:`),t.div({className:`col-12`},t.div({className:`field`},t.label({htmlFor:`superuser_email`},`Email`),t.input({id:`superuser_email`,name:`email`,type:`email`,required:!0,autofocus:!0,autocomplete:`off`,disabled:()=>a.isBusy,value:()=>a.email,oninput:e=>a.email=e.target.value}))),t.div({className:`col-12`},t.div({className:`fields`},t.div({className:`field`},t.label({htmlFor:`superuser_password`},`Password`),t.input({id:`superuser_password`,name:`password`,min:10,required:!0,disabled:()=>a.isBusy,type:()=>a.showPassword?`text`:`password`,value:()=>a.password,oninput:e=>a.password=e.target.value})),t.div({className:`field addon`},t.button({type:`button`,tabIndex:-1,className:`btn sm transparent secondary circle tooltip-right`,ariaLabel:app.attrs.tooltip(()=>a.showPassword?`Hide password`:`Show password`),onclick:()=>a.showPassword=!a.showPassword},t.i({className:()=>a.showPassword?`ri-eye-off-line`:`ri-eye-line`,ariaHidden:!0})))),t.div({className:`field-help`},`Recommended at least 10 characters.`)),t.div({className:`col-12`},t.div({className:`fields`},t.div({className:`field`},t.label({htmlFor:`superuser_password_confirm`},`Password confirm`),t.input({id:`superuser_password_confirm`,name:`passwordConfirm`,required:!0,disabled:()=>a.isBusy,type:()=>a.showPasswordConfirm?`text`:`password`,value:()=>a.passwordConfirm,oninput:e=>a.passwordConfirm=e.target.value})),t.div({className:`field addon`},t.button({type:`button`,tabIndex:-1,className:`btn sm transparent secondary circle tooltip-right`,ariaLabel:app.attrs.tooltip(()=>a.showPasswordConfirm?`Hide password`:`Show password`),onclick:()=>a.showPasswordConfirm=!a.showPasswordConfirm},t.i({className:()=>a.showPasswordConfirm?`ri-eye-off-line`:`ri-eye-line`,ariaHidden:!0}))))),t.div({className:`col-12`},t.button({className:()=>`btn lg next block ${a.isSubmitting?`loading`:``}`,disabled:()=>a.isBusy},t.span({className:`txt`},`Create superuser and login`),t.i({className:`ri-arrow-right-line`,ariaHidden:!0})))),t.hr(),t.label({htmlFor:s,className:()=>`btn secondary transparent lg block ${a.isBusy?`disabled`:``} ${a.isUploading?`loading`:``}`},t.i({className:`ri-upload-cloud-line`,ariaHidden:!0}),t.span({className:`txt`},`Or initialize from backup`)),t.input({id:s,type:`file`,className:`hidden`,accept:`.zip`,onchange:e=>{l(e.target?.files?.[0])}}))}export{r as pageInstaller};

View File

@@ -1 +1 @@
function e(e){app.store.title=`Forgotten superuser password`;let n=store({email:``,isSubmitting:!1,success:!1});async function r(){if(!n.isSubmitting){n.isSubmitting=!0;try{await app.pb.collection(`_superusers`).requestPasswordReset(n.email),n.success=!0}catch(e){app.checkApiError(e)}n.isSubmitting=!1}}return t.div({pbEvent:`pageSuperuserPasswordReset`,className:`wrapper sm m-auto p-b-base`},t.header({className:`txt-center m-b-base`},t.img({className:`main-logo`,src:()=>app.store.mainLogo,ariaHidden:!0,alt:`App logo`}),t.h5({className:`m-t-10`},()=>app.store.title)),()=>n.success?t.div({pbEvent:`superuserPasswordResetAlert`,className:`alert success txt-center`},t.p(null,`Check `,t.strong(null,n.email),` for the recovery link!`)):t.form({pbEvent:`superuserPasswordResetForm`,className:`grid request-password-reset-form`,onsubmit:e=>{e.preventDefault(),r()}},t.div({className:`col-12`},t.div({className:`content txt-center m-b-sm`},t.p(null,`Enter the email associated with your account and we'll send you a recovery link:`)),t.div({className:`field`},t.label({htmlFor:`password_reset_email`},`Email`),t.input({id:`password_reset_email`,name:`email`,type:`email`,required:!0,autofocus:!0,value:()=>n.email,oninput:e=>n.email=e.target.value}))),t.div({className:`col-12`},t.button({className:()=>`btn lg block ${n.isSubmitting?`loading`:``}`,disabled:()=>n.isSubmitting},t.i({className:`ri-mail-send-line`}),t.span({className:`txt`},`Send recovery link`)))),t.div({className:`block m-t-sm txt-center`},t.a({href:`#/login`,className:`link-hint`},`Back to login`)))}export{e as pageRequestSuperuserPasswordReset}; function e(e){app.store.title=`Forgotten superuser password`;let n=store({email:``,isSubmitting:!1,success:!1});async function r(){if(!n.isSubmitting){n.isSubmitting=!0;try{await app.pb.collection(`_superusers`).requestPasswordReset(n.email),n.success=!0}catch(e){app.checkApiError(e)}n.isSubmitting=!1}}return t.div({pbEvent:`pageSuperuserPasswordReset`,className:`wrapper sm m-auto p-b-base`},t.header({className:`txt-center m-b-base`},t.img({className:`main-logo`,src:()=>app.store.mainLogo,ariaHidden:!0,alt:`App logo`}),t.h5({className:`m-t-10`},()=>app.store.title)),()=>n.success?t.div({pbEvent:`superuserPasswordResetAlert`,className:`alert success txt-center`},t.p(null,`Check `,t.strong(null,n.email),` for the recovery link!`)):t.form({pbEvent:`superuserPasswordResetForm`,className:`grid request-password-reset-form`,onsubmit:e=>{e.preventDefault(),r()}},t.div({className:`col-12`},t.div({className:`content txt-center m-b-sm`},t.p(null,`Enter the email associated with your account and we'll send you a recovery link:`)),t.div({className:`field`},t.label({htmlFor:`password_reset_email`},`Email`),t.input({id:`password_reset_email`,name:`email`,type:`email`,required:!0,autofocus:!0,value:()=>n.email,oninput:e=>n.email=e.target.value}))),t.div({className:`col-12`},t.button({className:()=>`btn lg block ${n.isSubmitting?`loading`:``}`,disabled:()=>n.isSubmitting},t.i({className:`ri-mail-send-line`,ariaHidden:!0}),t.span({className:`txt`},`Send recovery link`)))),t.div({className:`block m-t-sm txt-center`},t.a({href:`#/login`,className:`link-hint`},`Back to login`)))}export{e as pageRequestSuperuserPasswordReset};

2
ui/dist/index.html vendored
View File

@@ -13,7 +13,7 @@
<!-- prism --> <!-- prism -->
<script src="./libs/prism/prism.js" data-manual></script> <script src="./libs/prism/prism.js" data-manual></script>
<script type="module" crossorigin src="./assets/index-CZmartev.js"></script> <script type="module" crossorigin src="./assets/index-CZaohvip.js"></script>
<link rel="modulepreload" crossorigin href="./assets/pocketbase.es-B_4DUNUU.js"> <link rel="modulepreload" crossorigin href="./assets/pocketbase.es-B_4DUNUU.js">
<link rel="stylesheet" crossorigin href="./assets/index-CCCeZnET.css"> <link rel="stylesheet" crossorigin href="./assets/index-CCCeZnET.css">
</head> </head>

View File

@@ -15,13 +15,13 @@ export function filterSyntax() {
if (data.show) { if (data.show) {
return [ return [
t.span({ className: "txt" }, "Hide details"), t.span({ className: "txt" }, "Hide details"),
t.i({ className: "ri-arrow-up-s-line" }), t.i({ className: "ri-arrow-up-s-line", ariaHidden: true }),
]; ];
} }
return [ return [
t.span({ className: "txt" }, "Show details"), t.span({ className: "txt" }, "Show details"),
t.i({ className: "ri-arrow-down-s-line" }), t.i({ className: "ri-arrow-down-s-line", ariaHidden: true }),
]; ];
}, },
), ),

View File

@@ -101,13 +101,14 @@ export function pageConfirmEmailChange(route) {
type: "button", type: "button",
tabIndex: -1, tabIndex: -1,
className: "btn sm transparent secondary circle tooltip-right", className: "btn sm transparent secondary circle tooltip-right",
ariaDescription: app.attrs.tooltip(() => ariaLabel: app.attrs.tooltip(() =>
data.showPassword ? "Hide password" : "Show password" data.showPassword ? "Hide password" : "Show password"
), ),
onclick: () => (data.showPassword = !data.showPassword), onclick: () => (data.showPassword = !data.showPassword),
}, },
t.i({ t.i({
className: () => (data.showPassword ? "ri-eye-off-line" : "ri-eye-line"), className: () => (data.showPassword ? "ri-eye-off-line" : "ri-eye-line"),
ariaHidden: true,
}), }),
), ),
), ),

View File

@@ -103,13 +103,14 @@ export function pageConfirmPasswordReset(route) {
type: "button", type: "button",
tabIndex: -1, tabIndex: -1,
className: "btn sm transparent secondary circle tooltip-right", className: "btn sm transparent secondary circle tooltip-right",
ariaDescription: app.attrs.tooltip(() => ariaLabel: app.attrs.tooltip(() =>
data.showNewPassword ? "Hide password" : "Show password" data.showNewPassword ? "Hide password" : "Show password"
), ),
onclick: () => (data.showNewPassword = !data.showNewPassword), onclick: () => (data.showNewPassword = !data.showNewPassword),
}, },
t.i({ t.i({
className: () => (data.showNewPassword ? "ri-eye-off-line" : "ri-eye-line"), className: () => (data.showNewPassword ? "ri-eye-off-line" : "ri-eye-line"),
ariaHidden: true,
}), }),
), ),
), ),
@@ -139,13 +140,14 @@ export function pageConfirmPasswordReset(route) {
type: "button", type: "button",
tabIndex: -1, tabIndex: -1,
className: "btn sm transparent secondary circle tooltip-right", className: "btn sm transparent secondary circle tooltip-right",
ariaDescription: app.attrs.tooltip(() => ariaLabel: app.attrs.tooltip(() =>
data.showNewPasswordConfirm ? "Hide password" : "Show password" data.showNewPasswordConfirm ? "Hide password" : "Show password"
), ),
onclick: () => (data.showNewPasswordConfirm = !data.showNewPasswordConfirm), onclick: () => (data.showNewPasswordConfirm = !data.showNewPasswordConfirm),
}, },
t.i({ t.i({
className: () => (data.showNewPasswordConfirm ? "ri-eye-off-line" : "ri-eye-line"), className: () => (data.showNewPasswordConfirm ? "ri-eye-off-line" : "ri-eye-line"),
ariaHidden: true,
}), }),
), ),
), ),

View File

@@ -180,13 +180,14 @@ export function pageInstaller(route) {
type: "button", type: "button",
tabIndex: -1, tabIndex: -1,
className: "btn sm transparent secondary circle tooltip-right", className: "btn sm transparent secondary circle tooltip-right",
ariaDescription: app.attrs.tooltip(() => ariaLabel: app.attrs.tooltip(() =>
data.showPassword ? "Hide password" : "Show password" data.showPassword ? "Hide password" : "Show password"
), ),
onclick: () => (data.showPassword = !data.showPassword), onclick: () => (data.showPassword = !data.showPassword),
}, },
t.i({ t.i({
className: () => (data.showPassword ? "ri-eye-off-line" : "ri-eye-line"), className: () => (data.showPassword ? "ri-eye-off-line" : "ri-eye-line"),
ariaHidden: true,
}), }),
), ),
), ),
@@ -217,13 +218,14 @@ export function pageInstaller(route) {
type: "button", type: "button",
tabIndex: -1, tabIndex: -1,
className: "btn sm transparent secondary circle tooltip-right", className: "btn sm transparent secondary circle tooltip-right",
ariaDescription: app.attrs.tooltip(() => ariaLabel: app.attrs.tooltip(() =>
data.showPasswordConfirm ? "Hide password" : "Show password" data.showPasswordConfirm ? "Hide password" : "Show password"
), ),
onclick: () => (data.showPasswordConfirm = !data.showPasswordConfirm), onclick: () => (data.showPasswordConfirm = !data.showPasswordConfirm),
}, },
t.i({ t.i({
className: () => (data.showPasswordConfirm ? "ri-eye-off-line" : "ri-eye-line"), className: () => (data.showPasswordConfirm ? "ri-eye-off-line" : "ri-eye-line"),
ariaHidden: true,
}), }),
), ),
), ),
@@ -237,7 +239,7 @@ export function pageInstaller(route) {
disabled: () => data.isBusy, disabled: () => data.isBusy,
}, },
t.span({ className: "txt" }, "Create superuser and login"), t.span({ className: "txt" }, "Create superuser and login"),
t.i({ className: "ri-arrow-right-line" }), t.i({ className: "ri-arrow-right-line", ariaHidden: true }),
), ),
), ),
), ),
@@ -250,7 +252,7 @@ export function pageInstaller(route) {
data.isUploading ? "loading" : "" data.isUploading ? "loading" : ""
}`, }`,
}, },
t.i({ className: "ri-upload-cloud-line" }), t.i({ className: "ri-upload-cloud-line", ariaHidden: true }),
t.span({ className: "txt" }, "Or initialize from backup"), t.span({ className: "txt" }, "Or initialize from backup"),
), ),
t.input({ t.input({

View File

@@ -78,7 +78,7 @@ export function pageRequestSuperuserPasswordReset(route) {
className: () => `btn lg block ${data.isSubmitting ? "loading" : ""}`, className: () => `btn lg block ${data.isSubmitting ? "loading" : ""}`,
disabled: () => data.isSubmitting, disabled: () => data.isSubmitting,
}, },
t.i({ className: "ri-mail-send-line" }), t.i({ className: "ri-mail-send-line", ariaHidden: true }),
t.span({ className: "txt" }, "Send recovery link"), t.span({ className: "txt" }, "Send recovery link"),
), ),
), ),

View File

@@ -187,13 +187,12 @@ function authWithPasswordForm(data) {
type: "button", type: "button",
tabIndex: -1, tabIndex: -1,
className: "btn sm transparent secondary circle tooltip-right", className: "btn sm transparent secondary circle tooltip-right",
ariaDescription: app.attrs.tooltip(() => ariaLabel: app.attrs.tooltip(() => data.showPassword ? "Hide password" : "Show password"),
data.showPassword ? "Hide password" : "Show password"
),
onclick: () => (data.showPassword = !data.showPassword), onclick: () => (data.showPassword = !data.showPassword),
}, },
t.i({ t.i({
className: () => (data.showPassword ? "ri-eye-off-line" : "ri-eye-line"), className: () => (data.showPassword ? "ri-eye-off-line" : "ri-eye-line"),
ariaHidden: true,
}), }),
), ),
), ),
@@ -215,7 +214,7 @@ function authWithPasswordForm(data) {
disabled: () => data.isPasswordAuthSubmitting, disabled: () => data.isPasswordAuthSubmitting,
}, },
t.span({ className: "txt" }, () => (data.totalSteps > 1 ? "Next" : "Login")), t.span({ className: "txt" }, () => (data.totalSteps > 1 ? "Next" : "Login")),
t.i({ className: "ri-arrow-right-line" }), t.i({ className: "ri-arrow-right-line", ariaHidden: true }),
), ),
), ),
); );
@@ -282,7 +281,7 @@ function requestOTPForm(data) {
className: () => `btn lg block ${data.isOTPRequestSubmitting ? "loading" : ""}`, className: () => `btn lg block ${data.isOTPRequestSubmitting ? "loading" : ""}`,
disabled: () => data.isOTPRequestSubmitting, disabled: () => data.isOTPRequestSubmitting,
}, },
t.i({ className: "ri-mail-send-line" }), t.i({ className: "ri-mail-send-line", ariaHidden: true }),
t.span({ className: "txt" }, "Send OTP"), t.span({ className: "txt" }, "Send OTP"),
), ),
), ),
@@ -378,9 +377,7 @@ function authWithOTPForm(data) {
type: "button", type: "button",
tabIndex: -1, tabIndex: -1,
className: "btn sm transparent secondary circle tooltip-right", className: "btn sm transparent secondary circle tooltip-right",
ariaDescription: app.attrs.tooltip(() => ariaLabel: app.attrs.tooltip(() => data.showPassword ? "Hide password" : "Show password"),
data.showPassword ? "Hide password" : "Show password"
),
onclick: () => (data.showPassword = !data.showPassword), onclick: () => (data.showPassword = !data.showPassword),
}, },
t.i({ t.i({
@@ -398,7 +395,7 @@ function authWithOTPForm(data) {
disabled: () => data.isOTPAuthSubmitting, disabled: () => data.isOTPAuthSubmitting,
}, },
t.span({ className: "txt" }, "Login"), t.span({ className: "txt" }, "Login"),
t.i({ className: "ri-arrow-right-line" }), t.i({ className: "ri-arrow-right-line", ariaHidden: true }),
), ),
t.div( t.div(
{ className: "block m-t-sm txt-center" }, { className: "block m-t-sm txt-center" },

View File

@@ -47,7 +47,7 @@ export function appHeader() {
}, },
() => { () => {
if (link.icon) { if (link.icon) {
return t.i({ className: link.icon }); return t.i({ className: link.icon, ariaHidden: true });
} }
}, },
t.span({ className: "txt" }, () => link.label), t.span({ className: "txt" }, () => link.label),
@@ -63,7 +63,7 @@ export function appHeader() {
"html-popovertarget": "logged-user-dropdown", "html-popovertarget": "logged-user-dropdown",
}, },
t.span({ className: "superuser-name txt-ellipsis" }, () => app.store.superuser?.email), t.span({ className: "superuser-name txt-ellipsis" }, () => app.store.superuser?.email),
t.i({ className: "ri-arrow-drop-down-line" }), t.i({ className: "ri-arrow-drop-down-line", ariaHidden: true }),
), ),
t.div( t.div(
{ {

View File

@@ -105,7 +105,7 @@ window.app.components.colorPicker = function(propsArg = {}) {
className: "link-hint predefined-colors-btn", className: "link-hint predefined-colors-btn",
"html-popovertarget": uniqueId + "predefined-colors-dropdown", "html-popovertarget": uniqueId + "predefined-colors-dropdown",
}, },
t.i({ className: "ri-arrow-down-s-line", roleHidden: true }), t.i({ className: "ri-arrow-down-s-line", ariaHidden: true }),
), ),
t.div( t.div(
{ {

View File

@@ -53,6 +53,7 @@ window.app.components.copyButton = function(textOrFunc, ...children) {
}, },
t.i({ t.i({
hidden: children?.length, hidden: children?.length,
ariaHidden: true,
className: () => `copy-icon ${data.active ? "ri-check-double-line" : "ri-file-copy-line"}`, className: () => `copy-icon ${data.active ? "ri-check-double-line" : "ri-file-copy-line"}`,
}), }),
...children, ...children,

View File

@@ -25,7 +25,7 @@ window.app.components.credits = function() {
}, },
() => { () => {
if (link.icon) { if (link.icon) {
return t.i({ className: link.icon }); return t.i({ className: link.icon, ariaHidden: true });
} }
}, },
t.span({ className: "txt" }, () => link.label), t.span({ className: "txt" }, () => link.label),

View File

@@ -335,6 +335,7 @@ window.app.components.erd = function(propsArg = {}) {
"html-data-field-name": () => field.name, "html-data-field-name": () => field.name,
}, },
t.i({ t.i({
ariaHidden: true,
title: () => field.type, title: () => field.type,
className: () => className: () =>
`field-icon ${ `field-icon ${

View File

@@ -243,7 +243,7 @@ window.app.components.fieldSettings = function(data, settingsArg = {}) {
} }
}, },
}, },
t.i({ className: "ri-settings-3-line" }), t.i({ className: "ri-settings-3-line", ariaHidden: true }),
), ),
t.button( t.button(
{ {
@@ -251,9 +251,9 @@ window.app.components.fieldSettings = function(data, settingsArg = {}) {
className: "btn sm circle transparent warning", className: "btn sm circle transparent warning",
hidden: () => !data.field[toDeleteProp], hidden: () => !data.field[toDeleteProp],
onclick: () => delete data.field[toDeleteProp], onclick: () => delete data.field[toDeleteProp],
ariaDescription: app.attrs.tooltip("Restore"), ariaLabel: app.attrs.tooltip("Restore"),
}, },
t.i({ className: "ri-restart-line" }), t.i({ className: "ri-restart-line", ariaHidden: true }),
), ),
), ),
(el) => { (el) => {
@@ -334,6 +334,7 @@ window.app.components.fieldSettings = function(data, settingsArg = {}) {
{ {
hidden: () => !settings.showDuplicate && (!settings.showRemove || data.field.system), hidden: () => !settings.showDuplicate && (!settings.showRemove || data.field.system),
type: "button", type: "button",
title: "More options",
className: "btn sm circle transparent secondary more-btn m-l-auto", className: "btn sm circle transparent secondary more-btn m-l-auto",
"html-popovertarget": uniqueId + "_options_dropdown", "html-popovertarget": uniqueId + "_options_dropdown",
}, },

View File

@@ -251,7 +251,7 @@ function initSearch(selectFunc = null) {
title: "Clear search", title: "Clear search",
onclick: () => reset(), onclick: () => reset(),
}, },
t.i({ className: "ri-close-line" }), t.i({ className: "ri-close-line", ariaHidden: true }),
); );
} }
}), }),

View File

@@ -37,7 +37,7 @@ window.app.components.refreshButton = function(propsArg = {}) {
hidden: () => props.hidden, hidden: () => props.hidden,
inert: () => props.inert, inert: () => props.inert,
type: "button", type: "button",
ariaDescription: app.attrs.tooltip(() => props.tooltip), ariaLabel: app.attrs.tooltip(() => props.tooltip),
disabled: () => props.disabled, disabled: () => props.disabled,
className: () => props.className, className: () => props.className,
onunmount: () => { onunmount: () => {
@@ -64,7 +64,7 @@ window.app.components.refreshButton = function(propsArg = {}) {
}, 500); }, 500);
}, },
}, },
t.i({ className: "ri-refresh-line" }), t.i({ className: "ri-refresh-line", ariaHidden: true }),
); );
return btn; return btn;

View File

@@ -111,13 +111,13 @@ window.app.components.s3Test = function(propsArg = {}) {
if (data.hasError) { if (data.hasError) {
return [ return [
t.i({ className: "ri-error-warning-line txt-warning" }), t.i({ className: "ri-error-warning-line txt-warning", ariaHidden: true }),
t.span({ className: "txt" }, "Failed to establish S3 connection"), t.span({ className: "txt" }, "Failed to establish S3 connection"),
]; ];
} }
return [ return [
t.i({ className: "ri-checkbox-circle-line txt-success" }), t.i({ className: "ri-checkbox-circle-line txt-success", ariaHidden: true }),
t.span({ className: "txt" }, "S3 connected successfully"), t.span({ className: "txt" }, "S3 connected successfully"),
]; ];
}, },

View File

@@ -116,6 +116,7 @@ window.app.components.searchHistoryButton = function(propsArg = {}) {
{ {
role: "button", role: "button",
className: "remove-btn link-hint m-l-auto p-l-5 p-r-5", className: "remove-btn link-hint m-l-auto p-l-5 p-r-5",
title: "Clear",
onauxclick: (e) => { onauxclick: (e) => {
e.stopPropagation(); e.stopPropagation();
return false; return false;
@@ -126,7 +127,7 @@ window.app.components.searchHistoryButton = function(propsArg = {}) {
return false; return false;
}, },
}, },
t.i({ className: "ri-close-line" }), t.i({ className: "ri-close-line", ariaHidden: true }),
), ),
); );
}); });
@@ -140,14 +141,15 @@ window.app.components.searchHistoryButton = function(propsArg = {}) {
hidden: () => props.hidden, hidden: () => props.hidden,
inert: () => props.inert, inert: () => props.inert,
type: "button", type: "button",
title: "Search history",
className: () => props.btnClassName, className: () => props.btnClassName,
"html-popovertarget": uniqueId, "html-popovertarget": uniqueId,
onunmount: () => { onunmount: () => {
watchers?.forEach((w) => w?.unwatch()); watchers?.forEach((w) => w?.unwatch());
}, },
}, },
t.i({ className: "ri-search-line" }), t.i({ className: "ri-search-line", ariaHidden: true }),
t.i({ className: "ri-arrow-drop-down-line" }), t.i({ className: "ri-arrow-drop-down-line", ariaHidden: true }),
dropdown, dropdown,
); );
}; };

View File

@@ -194,10 +194,11 @@ window.app.components.select = function(propsArg = {}) {
t.button( t.button(
{ {
type: "button", type: "button",
title: "Clear",
className: "btn sm secondary transparent circle", className: "btn sm secondary transparent circle",
onclick: () => clearSearch(true), onclick: () => clearSearch(true),
}, },
t.i({ className: "ri-close-line" }), t.i({ className: "ri-close-line", ariaHidden: true }),
), ),
), ),
), ),
@@ -248,7 +249,7 @@ window.app.components.select = function(propsArg = {}) {
tabIndex: -1, tabIndex: -1,
role: "button", role: "button",
className: "ri-close-line link-hint btn-option-unset", className: "ri-close-line link-hint btn-option-unset",
ariaDescription: app.attrs.tooltip("Unset", "left"), ariaLabel: app.attrs.tooltip("Unset", "left"),
onclick: () => { onclick: () => {
toggle(opt); toggle(opt);
return false; return false;

View File

@@ -137,7 +137,7 @@ function addToast(textOrElem, options = {}) {
title: "Clear", title: "Clear",
onclick: () => removeToast(toastRef), onclick: () => removeToast(toastRef),
}, },
t.i({ className: "ri-close-line" }), t.i({ className: "ri-close-line", ariaHidden: true }),
), ),
), ),
), ),

View File

@@ -1,6 +1,7 @@
const tolerance = 5; const tolerance = 5;
const tooltip = t.div({ const tooltip = t.div({
ariaHidden: true,
popover: "manual", popover: "manual",
className: "pb-tooltip", className: "pb-tooltip",
}); });

View File

@@ -77,7 +77,10 @@ window.app.components.uploadedFileThumb = function(propsArg = {}) {
}); });
} }
return t.i({ className: app.utils.fileTypeIcons[fileType] || "ri-file-line" }); return t.i({
className: app.utils.fileTypeIcons[fileType] || "ri-file-line",
ariaHidden: true,
});
}, },
); );
}; };

View File

@@ -58,7 +58,7 @@ window.app.components.addCollectionFieldButton = function(collection) {
className: "btn block outline", className: "btn block outline",
"html-popovertarget": uniqueId + "_dropdown", "html-popovertarget": uniqueId + "_dropdown",
}, },
t.i({ className: "ri-add-line" }), t.i({ className: "ri-add-line", ariaHidden: true }),
t.span({ className: "txt" }, "New field"), t.span({ className: "txt" }, "New field"),
), ),
t.div( t.div(
@@ -91,7 +91,7 @@ window.app.components.addCollectionFieldButton = function(collection) {
addNewField(type); addNewField(type);
}, },
}, },
t.i({ className: def.icon || app.utils.fallbackFieldIcon }), t.i({ className: def.icon || app.utils.fallbackFieldIcon, ariaHidden: true }),
t.span({ className: "txt" }, def.label || type), t.span({ className: "txt" }, def.label || type),
), ),
); );

View File

@@ -198,7 +198,7 @@ window.app.modals.openCollectionChangesConfirmation = async function(
{ className: "list-item" }, { className: "list-item" },
"Renamed collection ", "Renamed collection ",
t.strong({ className: "label warning" }, oldCollection?.name), t.strong({ className: "label warning" }, oldCollection?.name),
t.i({ className: "ri-arrow-right-line txt-sm" }), t.i({ className: "ri-arrow-right-line txt-sm", ariaHidden: true }),
t.strong({ className: "label success" }, newCollection?.name || "N/A"), t.strong({ className: "label success" }, newCollection?.name || "N/A"),
), ),
); );
@@ -218,7 +218,7 @@ window.app.modals.openCollectionChangesConfirmation = async function(
{ className: "list-item" }, { className: "list-item" },
"Renamed field ", "Renamed field ",
t.strong({ className: "label warning" }, oldField?.name), t.strong({ className: "label warning" }, oldField?.name),
t.i({ className: "ri-arrow-right-line txt-sm" }), t.i({ className: "ri-arrow-right-line txt-sm", ariaHidden: true }),
t.strong({ className: "label success" }, newField.name || "N/A"), t.strong({ className: "label success" }, newField.name || "N/A"),
); );
}); });
@@ -316,7 +316,7 @@ window.app.modals.openCollectionChangesConfirmation = async function(
oidc.name, oidc.name,
" host ", " host ",
t.strong({ className: "label warning" }, oidc.oldHost), t.strong({ className: "label warning" }, oidc.oldHost),
t.i({ className: "ri-arrow-right-line txt-sm" }), t.i({ className: "ri-arrow-right-line txt-sm", ariaHidden: true }),
t.strong({ className: "label success" }, oidc.newHost), t.strong({ className: "label success" }, oidc.newHost),
t.br(), t.br(),
t.span( t.span(

View File

@@ -73,7 +73,7 @@ export function collectionFieldsTab(upsertData) {
className: "label handle", className: "label handle",
onclick: () => app.modals.openIndexUpsert(upsertData.collection), onclick: () => app.modals.openIndexUpsert(upsertData.collection),
}, },
t.i({ className: "ri-add-line" }), t.i({ className: "ri-add-line", ariaHidden: true }),
t.span({ className: "txt" }, "New index"), t.span({ className: "txt" }, "New index"),
); );
}, },

View File

@@ -201,6 +201,7 @@ export function collectionRulesTab(upsertData) {
}, },
t.span({ className: "txt" }, "Additional auth collection rules"), t.span({ className: "txt" }, "Additional auth collection rules"),
t.i({ t.i({
ariaHidden: true,
className: () => (local.showAuthRules ? "ri-arrow-drop-up-line" : "ri-arrow-drop-down-line"), className: () => (local.showAuthRules ? "ri-arrow-drop-up-line" : "ri-arrow-drop-down-line"),
}), }),
), ),

View File

@@ -381,9 +381,10 @@ function collectionUpsertModal(rawCollection, modalSettings) {
{ {
type: "button", type: "button",
className: "btn sm circle transparent", className: "btn sm circle transparent",
title: "More options",
"html-popovertarget": uniqueId + "modal-header-dropdown", "html-popovertarget": uniqueId + "modal-header-dropdown",
}, },
t.i({ className: "ri-more-line" }), t.i({ className: "ri-more-line", ariaHidden: true }),
), ),
t.div( t.div(
{ {
@@ -403,7 +404,7 @@ function collectionUpsertModal(rawCollection, modalSettings) {
app.toasts.success("Collection copied to clipboard!"); app.toasts.success("Collection copied to clipboard!");
}, },
}, },
t.i({ className: "ri-braces-line" }), t.i({ className: "ri-braces-line", ariaHidden: true }),
t.span({ className: "txt" }, "Copy JSON"), t.span({ className: "txt" }, "Copy JSON"),
), ),
t.button( t.button(
@@ -425,7 +426,7 @@ function collectionUpsertModal(rawCollection, modalSettings) {
} }
}, },
}, },
t.i({ className: "ri-file-copy-line" }), t.i({ className: "ri-file-copy-line", ariaHidden: true }),
t.span({ className: "txt" }, "Duplicate"), t.span({ className: "txt" }, "Duplicate"),
), ),
t.hr(), t.hr(),
@@ -497,6 +498,7 @@ function collectionUpsertModal(rawCollection, modalSettings) {
), ),
t.i({ t.i({
hidden: () => !data.isNew, hidden: () => !data.isNew,
ariaHidden: true,
className: "ri-arrow-drop-down-line m-l-auto", className: "ri-arrow-drop-down-line m-l-auto",
}), }),
), ),
@@ -524,6 +526,7 @@ function collectionUpsertModal(rawCollection, modalSettings) {
}, },
}, },
t.i({ t.i({
ariaHidden: true,
className: app.collectionTypes[opt.value]?.icon className: app.collectionTypes[opt.value]?.icon
|| app.utils.fallbackCollectionIcon, || app.utils.fallbackCollectionIcon,
}), }),
@@ -606,11 +609,12 @@ function collectionUpsertModal(rawCollection, modalSettings) {
t.button( t.button(
{ {
type: "button", type: "button",
title: "Save options",
className: () => `btn p-5`, className: () => `btn p-5`,
disabled: () => !data.canSave, disabled: () => !data.canSave,
"html-popovertarget": uniqueId + "save_options", "html-popovertarget": uniqueId + "save_options",
}, },
t.i({ className: "ri-arrow-up-s-line" }), t.i({ className: "ri-arrow-up-s-line", ariaHidden: true }),
), ),
t.div( t.div(
{ id: uniqueId + "save_options", className: "dropdown nowrap", popover: "auto" }, { id: uniqueId + "save_options", className: "dropdown nowrap", popover: "auto" },
@@ -801,7 +805,7 @@ function truncateDropdownItem(data, modalSettings) {
); );
}, },
}, },
t.i({ className: "ri-eraser-line" }), t.i({ className: "ri-eraser-line", ariaHidden: true }),
t.span({ className: "txt" }, "Truncate"), t.span({ className: "txt" }, "Truncate"),
); );
} }
@@ -907,7 +911,7 @@ function deleteDropdownItem(data, modalSettings) {
); );
}, },
}, },
t.i({ className: "ri-delete-bin-7-line" }), t.i({ className: "ri-delete-bin-7-line", ariaHidden: true }),
t.span({ className: "txt" }, "Delete"), t.span({ className: "txt" }, "Delete"),
); );
} }

View File

@@ -144,7 +144,7 @@ export function collectionViewQueryTab(upsertData) {
className: "query-state", className: "query-state",
ariaDescription: app.attrs.tooltip("Invalid query", "left"), ariaDescription: app.attrs.tooltip("Invalid query", "left"),
}, },
t.i({ className: "ri-error-warning-fill txt-danger" }), t.i({ className: "ri-error-warning-fill txt-danger", ariaHidden: true }),
), ),
t.span( t.span(
{ {
@@ -152,7 +152,7 @@ export function collectionViewQueryTab(upsertData) {
className: "query-state", className: "query-state",
ariaDescription: app.attrs.tooltip("Valid query", "left"), ariaDescription: app.attrs.tooltip("Valid query", "left"),
}, },
t.i({ className: "ri-checkbox-circle-fill txt-success" }), t.i({ className: "ri-checkbox-circle-fill txt-success", ariaHidden: true }),
), ),
), ),
app.components.codeEditor({ app.components.codeEditor({

View File

@@ -79,9 +79,10 @@ function collectionsOverviewModal(settings = {}) {
{ {
type: "button", type: "button",
className: "btn sm secondary transparent circle modal-close-btn", className: "btn sm secondary transparent circle modal-close-btn",
title: "Close",
onclick: () => app.modals.close(modal), onclick: () => app.modals.close(modal),
}, },
t.i({ className: "ri-close-line" }), t.i({ className: "ri-close-line", ariaHidden: true }),
), ),
), ),
), ),
@@ -228,6 +229,7 @@ function rules(data) {
t.div( t.div(
{ className: "inline-flex gap-10" }, { className: "inline-flex gap-10" },
t.i({ t.i({
ariaHidden: true,
className: () => className: () =>
app.collectionTypes[collection.type]?.icon app.collectionTypes[collection.type]?.icon
|| app.utils.fallbackCollectionIcon, || app.utils.fallbackCollectionIcon,

View File

@@ -191,7 +191,7 @@ export function collectionsSidebar() {
}); });
}, },
}, },
t.i({ className: "ri-add-line" }), t.i({ className: "ri-add-line", ariaHidden: true }),
t.span({ textContent: "New collection" }), t.span({ textContent: "New collection" }),
), ),
), ),
@@ -210,7 +210,10 @@ function collectionItem(collection, data) {
title: () => collection.name, title: () => collection.name,
onclick: () => app.store.activeCollection = collection.name, onclick: () => app.store.activeCollection = collection.name,
}, },
t.i({ className: () => app.collectionTypes[collection.type]?.icon || app.utils.fallbackCollectionIcon }), t.i({
className: () => app.collectionTypes[collection.type]?.icon || app.utils.fallbackCollectionIcon,
ariaHidden: true,
}),
t.span({ className: "txt" }, () => collection.name), t.span({ className: "txt" }, () => collection.name),
() => { () => {
if ( if (

View File

@@ -50,7 +50,7 @@ export function emailTemplateAccordion(collection, key, propsArg = {}) {
}, },
t.summary( t.summary(
null, null,
t.i({ className: "ri-draft-line" }), t.i({ className: "ri-draft-line", ariaHidden: true }),
t.span({ className: "txt", textContent: () => props.title }), t.span({ className: "txt", textContent: () => props.title }),
() => { () => {
if (!app.utils.getByPath(app.store.errors, key)) { if (!app.utils.getByPath(app.store.errors, key)) {
@@ -58,6 +58,7 @@ export function emailTemplateAccordion(collection, key, propsArg = {}) {
} }
return t.i({ return t.i({
ariaHidden: true,
className: "ri-error-warning-fill txt-danger m-l-auto", className: "ri-error-warning-fill txt-danger m-l-auto",
ariaDescription: app.attrs.tooltip("Has errors", "left"), ariaDescription: app.attrs.tooltip("Has errors", "left"),
}); });

View File

@@ -247,7 +247,7 @@ function indexUpsertModal(collection, index = "", settings = {}) {
hidden: () => data.isNew, hidden: () => data.isNew,
type: "button", type: "button",
className: () => "btn sm circle transparent secondary", className: () => "btn sm circle transparent secondary",
ariaDescription: app.attrs.tooltip("Delete index", "left"), ariaLabel: app.attrs.tooltip("Delete index", "left"),
onclick: () => { onclick: () => {
app.modals.confirm( app.modals.confirm(
"Do you really want to remove the selected index from the collection?", "Do you really want to remove the selected index from the collection?",
@@ -255,7 +255,7 @@ function indexUpsertModal(collection, index = "", settings = {}) {
); );
}, },
}, },
t.i({ className: "ri-delete-bin-7-line" }), t.i({ className: "ri-delete-bin-7-line", ariaHidden: true }),
), ),
t.button( t.button(
{ {

View File

@@ -23,7 +23,7 @@ export function mfaAccordion(collection) {
}, },
t.summary( t.summary(
null, null,
t.i({ className: "ri-shield-check-line" }), t.i({ className: "ri-shield-check-line", ariaHidden: true }),
t.span({ className: "txt", textContent: "Multi-factor authentication (MFA)" }), t.span({ className: "txt", textContent: "Multi-factor authentication (MFA)" }),
t.span({ t.span({
className: () => `label m-l-auto ${data.config.enabled ? "success" : ""}`, className: () => `label m-l-auto ${data.config.enabled ? "success" : ""}`,

View File

@@ -19,7 +19,7 @@ window.app.oauth2.apple = function(providerInfo, namePrefix, data) {
}); });
}, },
}, },
t.i({ className: "ri-key-line" }), t.i({ className: "ri-key-line", ariaHidden: true }),
t.span({ className: "txt" }, "Generate secret"), t.span({ className: "txt" }, "Generate secret"),
), ),
); );
@@ -226,7 +226,7 @@ function appleSecretGeneratorModal(modalSettings = {}) {
type: "submit", type: "submit",
className: "btn expanded", className: "btn expanded",
}, },
t.i({ className: "ri-key-line" }), t.i({ className: "ri-key-line", ariaHidden: true }),
t.span({ className: "txt" }, "Generate secret"), t.span({ className: "txt" }, "Generate secret"),
), ),
), ),

View File

@@ -149,7 +149,6 @@ window.app.oauth2.oidc = function(providerInfo, namePrefix, data) {
{ htmlFor: uniqueId + ".extra.jwksURL" }, { htmlFor: uniqueId + ".extra.jwksURL" },
t.span({ className: "txt" }, "JWKS verification URL"), t.span({ className: "txt" }, "JWKS verification URL"),
t.i({ t.i({
ariaHidden: true,
className: "ri-information-line link-hint", className: "ri-information-line link-hint",
ariaDescription: app.attrs.tooltip( ariaDescription: app.attrs.tooltip(
"URL to the public token verification keys.", "URL to the public token verification keys.",
@@ -176,7 +175,6 @@ window.app.oauth2.oidc = function(providerInfo, namePrefix, data) {
{ htmlFor: uniqueId + ".extra.issuers" }, { htmlFor: uniqueId + ".extra.issuers" },
t.span({ className: "txt" }, "Issuers"), t.span({ className: "txt" }, "Issuers"),
t.i({ t.i({
ariaHidden: true,
className: "ri-information-line link-hint", className: "ri-information-line link-hint",
ariaDescription: app.attrs.tooltip( ariaDescription: app.attrs.tooltip(
"Comma separated list of accepted values for the iss token claim validation.", "Comma separated list of accepted values for the iss token claim validation.",
@@ -221,7 +219,6 @@ window.app.oauth2.oidc = function(providerInfo, namePrefix, data) {
t.span({ className: "txt", textContent: "Support PKCE" }), t.span({ className: "txt", textContent: "Support PKCE" }),
t.i({ t.i({
className: "ri-information-line link-hint", className: "ri-information-line link-hint",
ariaHidden: true,
ariaDescription: app.attrs.tooltip( ariaDescription: app.attrs.tooltip(
"Usually it should be safe to be always enabled as most providers will just ignore the extra query parameters if they don't support PKCE.", "Usually it should be safe to be always enabled as most providers will just ignore the extra query parameters if they don't support PKCE.",
), ),

View File

@@ -52,7 +52,7 @@ export function oauth2Accordion(collection) {
}, },
t.summary( t.summary(
null, null,
t.i({ className: "ri-profile-line" }), t.i({ className: "ri-profile-line", ariaHidden: true }),
t.span({ className: "txt", textContent: "OAuth2" }), t.span({ className: "txt", textContent: "OAuth2" }),
t.span({ t.span({
className: () => `label m-l-auto ${data.config.enabled ? "success" : ""}`, className: () => `label m-l-auto ${data.config.enabled ? "success" : ""}`,
@@ -118,7 +118,7 @@ export function oauth2Accordion(collection) {
}); });
} }
return t.i({ className: app.utils.fallbackProviderIcon }); return t.i({ className: app.utils.fallbackProviderIcon, ariaHidden: true });
}, },
), ),
t.div( t.div(
@@ -133,11 +133,12 @@ export function oauth2Accordion(collection) {
{ className: "actions" }, { className: "actions" },
t.button( t.button(
{ {
"type": "button", type: "button",
"className": "btn secondary transparent sm circle", title: "Options",
className: "btn secondary transparent sm circle",
"html-popovertarget": providerId + "dropdown", "html-popovertarget": providerId + "dropdown",
}, },
t.i({ className: "ri-more-2-line" }), t.i({ className: "ri-more-2-line", ariaHidden: true }),
), ),
t.div( t.div(
{ {
@@ -217,7 +218,7 @@ export function oauth2Accordion(collection) {
}); });
}, },
}, },
t.i({ className: "ri-add-line" }), t.i({ className: "ri-add-line", ariaHidden: true }),
t.span({ className: "txt " }, "Add provider"), t.span({ className: "txt " }, "Add provider"),
), ),
), ),
@@ -232,6 +233,7 @@ export function oauth2Accordion(collection) {
t.span({ className: "txt" }, "Optional users create fields mapping"), t.span({ className: "txt" }, "Optional users create fields mapping"),
t.i({ t.i({
className: () => (data.showMapping ? "ri-arrow-drop-up-line" : "ri-arrow-drop-down-line"), className: () => (data.showMapping ? "ri-arrow-drop-up-line" : "ri-arrow-drop-down-line"),
ariaHidden: true,
}), }),
), ),
app.components.slide( app.components.slide(

View File

@@ -23,7 +23,7 @@ export function otpAccordion(collection) {
}, },
t.summary( t.summary(
null, null,
t.i({ className: "ri-time-line" }), t.i({ className: "ri-time-line", ariaHidden: true }),
t.span({ className: "txt", textContent: "One-time password (OTP)" }), t.span({ className: "txt", textContent: "One-time password (OTP)" }),
t.span({ t.span({
className: () => `label m-l-auto ${data.config.enabled ? "success" : ""}`, className: () => `label m-l-auto ${data.config.enabled ? "success" : ""}`,

View File

@@ -216,7 +216,7 @@ export function pageCollections(route) {
{ {
type: "button", type: "button",
className: "btn circle transparent secondary tooltip-bottom btn-collection-settings", className: "btn circle transparent secondary tooltip-bottom btn-collection-settings",
ariaDescription: app.attrs.tooltip("Collection settings"), ariaLabel: app.attrs.tooltip("Collection settings"),
onclick: () => { onclick: () => {
app.modals.openCollectionUpsert(app.store.activeCollection, { app.modals.openCollectionUpsert(app.store.activeCollection, {
ontruncate: () => refreshRecordsList(), ontruncate: () => refreshRecordsList(),
@@ -231,7 +231,7 @@ export function pageCollections(route) {
}); });
}, },
}, },
t.i({ className: "ri-settings-3-line" }), t.i({ className: "ri-settings-3-line", ariaHidden: true }),
), ),
app.components.refreshButton({ app.components.refreshButton({
onclick: () => refreshRecordsList(), onclick: () => refreshRecordsList(),
@@ -249,7 +249,7 @@ export function pageCollections(route) {
className: "btn outline api-preview-btn", className: "btn outline api-preview-btn",
onclick: () => app.modals.openApiPreview(app.store.activeCollection), onclick: () => app.modals.openApiPreview(app.store.activeCollection),
}, },
t.i({ className: "ri-code-s-slash-line" }), t.i({ className: "ri-code-s-slash-line", ariaHidden: true }),
t.span({ className: "txt", textContent: "API preview" }), t.span({ className: "txt", textContent: "API preview" }),
), ),
() => { () => {
@@ -263,7 +263,7 @@ export function pageCollections(route) {
className: "btn new-record-btn", className: "btn new-record-btn",
onclick: () => app.modals.openRecordUpsert(app.store.activeCollection), onclick: () => app.modals.openRecordUpsert(app.store.activeCollection),
}, },
t.i({ className: "ri-add-line" }), t.i({ className: "ri-add-line", ariaHidden: true }),
t.span({ className: "txt", textContent: "New Record" }), t.span({ className: "txt", textContent: "New Record" }),
); );
}, },

View File

@@ -45,7 +45,7 @@ export function passwordAuthAccordion(collection) {
}, },
t.summary( t.summary(
null, null,
t.i({ className: "ri-lock-password-line" }), t.i({ className: "ri-lock-password-line", ariaHidden: true }),
t.span({ className: "txt", textContent: "Identity/Password" }), t.span({ className: "txt", textContent: "Identity/Password" }),
t.span({ t.span({
className: () => `label m-l-auto ${data.config.enabled ? "success" : ""}`, className: () => `label m-l-auto ${data.config.enabled ? "success" : ""}`,

View File

@@ -144,7 +144,7 @@ function providerPickerModal(settings = {}) {
}); });
} }
return t.i({ className: app.utils.fallbackProviderIcon }); return t.i({ className: app.utils.fallbackProviderIcon, ariaHidden: true });
}, },
), ),
t.div( t.div(

View File

@@ -94,7 +94,7 @@ function providerSettingsModal(providerConfig, settings) {
}); });
} }
return t.i({ className: app.utils.fallbackProviderIcon }); return t.i({ className: app.utils.fallbackProviderIcon, ariaHidden: true });
}, },
), ),
t.h6( t.h6(

View File

@@ -29,7 +29,7 @@ export function tokenOptionsAccordion(collection) {
}, },
t.summary( t.summary(
null, null,
t.i({ className: "ri-key-2-line" }), t.i({ className: "ri-key-2-line", ariaHidden: true }),
t.span({ className: "txt", textContent: "Token options (invalidate, duration)" }), t.span({ className: "txt", textContent: "Token options (invalidate, duration)" }),
), ),
t.div({ className: "grid sm" }, () => { t.div({ className: "grid sm" }, () => {

View File

@@ -13,7 +13,7 @@ export function input(props) {
{ className: "field" }, { className: "field" },
t.label( t.label(
{ htmlFor: uniqueId }, { htmlFor: uniqueId },
t.i({ className: app.fieldTypes.date.icon }), t.i({ className: app.fieldTypes.date.icon, ariaHidden: true }),
t.span({ className: "txt" }, () => props.field.name), t.span({ className: "txt" }, () => props.field.name),
), ),
t.input({ t.input({

View File

@@ -33,7 +33,7 @@ export function input(props) {
{ className: "field" }, { className: "field" },
t.label( t.label(
{ htmlFor: uniqueId }, { htmlFor: uniqueId },
t.i({ className: app.fieldTypes.editor.icon }), t.i({ className: app.fieldTypes.editor.icon, ariaHidden: true }),
t.span({ className: "txt" }, () => props.field.name), t.span({ className: "txt" }, () => props.field.name),
), ),
() => local.lazyEditor, () => local.lazyEditor,

View File

@@ -13,7 +13,7 @@ export function input(props) {
{ className: "field" }, { className: "field" },
t.label( t.label(
{ htmlFor: uniqueId }, { htmlFor: uniqueId },
t.i({ className: app.fieldTypes.email.icon }), t.i({ className: app.fieldTypes.email.icon, ariaHidden: true }),
t.span({ className: "txt" }, () => props.field.name), t.span({ className: "txt" }, () => props.field.name),
), ),
t.input({ t.input({

View File

@@ -126,7 +126,7 @@ export function input(props) {
{ className: () => `field ${props.field.required ? "required" : ""}` }, { className: () => `field ${props.field.required ? "required" : ""}` },
t.label( t.label(
{ htmlFor: uniqueId }, { htmlFor: uniqueId },
t.i({ className: app.fieldTypes.file.icon }), t.i({ className: app.fieldTypes.file.icon, ariaHidden: true }),
t.span({ className: "txt" }, () => props.field.name), t.span({ className: "txt" }, () => props.field.name),
), ),
fileInput, fileInput,
@@ -204,11 +204,11 @@ export function input(props) {
{ {
type: "button", type: "button",
className: "btn sm secondary transparent circle", className: "btn sm secondary transparent circle",
ariaDescription: app.attrs.tooltip("Remove file"), ariaLabel: app.attrs.tooltip("Remove file"),
hidden: () => isDeleted(nameOrFile), hidden: () => isDeleted(nameOrFile),
onclick: () => toDelete(nameOrFile), onclick: () => toDelete(nameOrFile),
}, },
t.i({ className: "ri-close-line" }), t.i({ className: "ri-close-line", ariaHidden: true }),
), ),
t.button( t.button(
{ {
@@ -240,7 +240,7 @@ export function input(props) {
document.activeElement?.blur(); document.activeElement?.blur();
}, },
}, },
t.i({ className: "ri-upload-cloud-line" }), t.i({ className: "ri-upload-cloud-line", ariaHidden: true }),
t.span({ className: "txt" }, "Upload or drop new file"), t.span({ className: "txt" }, "Upload or drop new file"),
), ),
), ),

View File

@@ -17,7 +17,7 @@ export function input(data) {
{ className: () => `field-list ${data.field.required ? "required" : ""}` }, { className: () => `field-list ${data.field.required ? "required" : ""}` },
t.label( t.label(
{ htmlFor: uniqueId }, { htmlFor: uniqueId },
t.i({ className: app.fieldTypes.geoPoint.icon }), t.i({ className: app.fieldTypes.geoPoint.icon, ariaHidden: true }),
t.span({ className: "txt" }, () => data.field.name), t.span({ className: "txt" }, () => data.field.name),
), ),
t.div( t.div(

View File

@@ -71,7 +71,7 @@ export function input(props) {
}, },
t.label( t.label(
{ htmlFor: uniqueId }, { htmlFor: uniqueId },
t.i({ className: app.fieldTypes.json.icon }), t.i({ className: app.fieldTypes.json.icon, ariaHidden: true }),
t.span({ className: "txt" }, () => props.field.name), t.span({ className: "txt" }, () => props.field.name),
t.span( t.span(
{ {
@@ -79,7 +79,7 @@ export function input(props) {
className: "json-state", className: "json-state",
ariaDescription: app.attrs.tooltip("Invalid JSON", "left"), ariaDescription: app.attrs.tooltip("Invalid JSON", "left"),
}, },
t.i({ className: "ri-error-warning-fill txt-danger" }), t.i({ className: "ri-error-warning-fill txt-danger", ariaHidden: true }),
), ),
t.span( t.span(
{ {
@@ -87,7 +87,7 @@ export function input(props) {
className: "json-state", className: "json-state",
ariaDescription: app.attrs.tooltip("Valid JSON", "left"), ariaDescription: app.attrs.tooltip("Valid JSON", "left"),
}, },
t.i({ className: "ri-checkbox-circle-fill txt-success" }), t.i({ className: "ri-checkbox-circle-fill txt-success", ariaHidden: true }),
), ),
), ),
app.components.codeEditor({ app.components.codeEditor({

View File

@@ -65,6 +65,7 @@ export function settings(data) {
t.span({ className: "txt" }, "String value normalizations"), t.span({ className: "txt" }, "String value normalizations"),
t.i({ t.i({
className: () => (local.showInfo ? "ri-arrow-up-s-line" : "ri-arrow-down-s-line"), className: () => (local.showInfo ? "ri-arrow-up-s-line" : "ri-arrow-down-s-line"),
ariaHidden: true,
}), }),
), ),
app.components.slide( app.components.slide(

View File

@@ -13,7 +13,7 @@ export function input(props) {
{ className: "field" }, { className: "field" },
t.label( t.label(
{ htmlFor: uniqueId }, { htmlFor: uniqueId },
t.i({ className: app.fieldTypes.number.icon }), t.i({ className: app.fieldTypes.number.icon, ariaHidden: true }),
t.span({ className: "txt" }, () => props.field.name), t.span({ className: "txt" }, () => props.field.name),
), ),
t.input({ t.input({

View File

@@ -107,7 +107,7 @@ export function input(props) {
{ className: () => `field ${props.field.required ? "required" : ""}` }, { className: () => `field ${props.field.required ? "required" : ""}` },
t.label( t.label(
{ htmlFor: uniqueId }, { htmlFor: uniqueId },
t.i({ className: app.fieldTypes.relation.icon }), t.i({ className: app.fieldTypes.relation.icon, ariaHidden: true }),
t.span({ className: "txt" }, () => props.field.name), t.span({ className: "txt" }, () => props.field.name),
), ),
t.output( t.output(
@@ -150,10 +150,10 @@ export function input(props) {
t.button( t.button(
{ {
className: "btn sm secondary transparent circle", className: "btn sm secondary transparent circle",
ariaDescription: app.attrs.tooltip("Remove"), ariaLabel: app.attrs.tooltip("Remove"),
onclick: () => remove(record.id), onclick: () => remove(record.id),
}, },
t.i({ className: "ri-close-line" }), t.i({ className: "ri-close-line", ariaHidden: true }),
), ),
), ),
); );
@@ -181,7 +181,7 @@ export function input(props) {
}); });
}, },
}, },
t.i({ className: "ri-magic-line" }), t.i({ className: "ri-magic-line", ariaHidden: true }),
t.span({ className: "txt" }, "Open records picker"), t.span({ className: "txt" }, "Open records picker"),
), ),
), ),

View File

@@ -71,7 +71,7 @@ export function settings(props) {
}); });
}, },
}, },
t.i({ className: "ri-add-line" }), t.i({ className: "ri-add-line", ariaHidden: true }),
t.span({ className: "txt" }, "New collection"), t.span({ className: "txt" }, "New collection"),
), ),
]; ];

View File

@@ -13,7 +13,7 @@ export function input(data) {
{ className: "field" }, { className: "field" },
t.label( t.label(
{ htmlFor: uniqueId }, { htmlFor: uniqueId },
t.i({ className: app.fieldTypes.select.icon }), t.i({ className: app.fieldTypes.select.icon, ariaHidden: true }),
t.span({ className: "txt" }, () => data.field.name), t.span({ className: "txt" }, () => data.field.name),
), ),
app.components.select({ app.components.select({

View File

@@ -28,6 +28,7 @@ export function input(props) {
t.label( t.label(
{ htmlFor: uniqueId }, { htmlFor: uniqueId },
t.i({ t.i({
ariaHidden: true,
className: () => (props.field.primaryKey ? "ri-key-line" : app.fieldTypes.text.icon), className: () => (props.field.primaryKey ? "ri-key-line" : app.fieldTypes.text.icon),
}), }),
t.span({ className: "txt" }, () => props.field.name), t.span({ className: "txt" }, () => props.field.name),

View File

@@ -13,7 +13,7 @@ export function input(props) {
{ className: "field" }, { className: "field" },
t.label( t.label(
{ htmlFor: uniqueId }, { htmlFor: uniqueId },
t.i({ className: app.fieldTypes.url.icon }), t.i({ className: app.fieldTypes.url.icon, ariaHidden: true }),
t.span({ className: "txt" }, () => props.field.name), t.span({ className: "txt" }, () => props.field.name),
), ),
t.input({ t.input({

View File

@@ -119,10 +119,11 @@ function logPreviewModal(logIdOrModel, settings) {
t.h5(null, "Log details"), t.h5(null, "Log details"),
t.button( t.button(
{ {
"className": "btn sm circle transparent m-l-auto", className: "btn sm circle transparent m-l-auto",
title: "More options",
"html-popovertarget": "log-meta-dropdown", "html-popovertarget": "log-meta-dropdown",
}, },
t.i({ className: "ri-more-line" }), t.i({ className: "ri-more-line", ariaHidden: true }),
), ),
t.div({ id: "log-meta-dropdown", className: "dropdown", popover: "auto" }, (el) => { t.div({ id: "log-meta-dropdown", className: "dropdown", popover: "auto" }, (el) => {
return t.button( return t.button(
@@ -133,7 +134,7 @@ function logPreviewModal(logIdOrModel, settings) {
el.hidePopover(); el.hidePopover();
}, },
}, },
t.i({ className: "ri-braces-line" }), t.i({ className: "ri-braces-line", ariaHidden: true }),
t.span({ className: "txt" }, "Copy JSON"), t.span({ className: "txt" }, "Copy JSON"),
); );
}), }),
@@ -266,7 +267,7 @@ function logPreviewModal(logIdOrModel, settings) {
className: "btn", className: "btn",
onclick: () => downloadJSON(data.log), onclick: () => downloadJSON(data.log),
}, },
t.i({ className: "ri-download-line" }), t.i({ className: "ri-download-line", ariaHidden: true }),
t.span({ className: "txt" }, "Download JSON"), t.span({ className: "txt" }, "Download JSON"),
), ),
), ),

View File

@@ -237,7 +237,7 @@ export function logsList(logsSettings) {
{ className: "col-field-name-level" }, { className: "col-field-name-level" },
t.div( t.div(
{ className: "inline-flex gap-5" }, { className: "inline-flex gap-5" },
t.i({ className: "ri-bookmark-line" }), t.i({ className: "ri-bookmark-line", ariaHidden: true }),
t.span({ textContent: "Level" }), t.span({ textContent: "Level" }),
), ),
), ),
@@ -245,7 +245,7 @@ export function logsList(logsSettings) {
{ className: "col-field-name-message" }, { className: "col-field-name-message" },
t.div( t.div(
{ className: "inline-flex gap-5" }, { className: "inline-flex gap-5" },
t.i({ className: "ri-file-list-2-line" }), t.i({ className: "ri-file-list-2-line", ariaHidden: true }),
t.span({ textContent: "Message" }), t.span({ textContent: "Message" }),
), ),
), ),
@@ -253,7 +253,7 @@ export function logsList(logsSettings) {
{ className: "col-field-type-date col-field-name-created" }, { className: "col-field-type-date col-field-name-created" },
t.div( t.div(
{ className: "inline-flex gap-5" }, { className: "inline-flex gap-5" },
t.i({ className: "ri-calendar-line" }), t.i({ className: "ri-calendar-line", ariaHidden: true }),
t.span({ textContent: "Created" }), t.span({ textContent: "Created" }),
), ),
), ),
@@ -406,7 +406,7 @@ export function logsList(logsSettings) {
), ),
t.td( t.td(
{ className: "col-meta" }, { className: "col-meta" },
t.i({ className: "ri-arrow-right-line" }), t.i({ className: "ri-arrow-right-line", ariaHidden: true }),
), ),
]; ];
}, },
@@ -459,7 +459,7 @@ export function logsList(logsSettings) {
className: "btn sm pill", className: "btn sm pill",
onclick: () => downloadSelected(), onclick: () => downloadSelected(),
}, },
t.i({ className: "ri-download-line" }), t.i({ className: "ri-download-line", ariaHidden: true }),
t.span({ className: "txt" }, "JSON"), t.span({ className: "txt" }, "JSON"),
), ),
), ),

View File

@@ -108,13 +108,13 @@ export function pageLogs(route) {
t.button( t.button(
{ {
className: "btn circle transparent secondary tooltip-right", className: "btn circle transparent secondary tooltip-right",
ariaDescription: app.attrs.tooltip("Logs settings"), ariaLabel: app.attrs.tooltip("Logs settings"),
onclick: () => onclick: () =>
app.modals.openLogsSettings({ app.modals.openLogsSettings({
onsave: () => refreshLogsList(), onsave: () => refreshLogsList(),
}), }),
}, },
t.i({ className: "ri-settings-3-line" }), t.i({ className: "ri-settings-3-line", ariaHidden: true }),
), ),
app.components.refreshButton({ app.components.refreshButton({
onclick: refreshLogsList, onclick: refreshLogsList,

View File

@@ -249,7 +249,7 @@ function recordFilePickerModal(settings = defaultSettings) {
{ className: "txt-lg collection-name m-r-auto" }, { className: "txt-lg collection-name m-r-auto" },
() => data.activeCollection?.name || "Select collection", () => data.activeCollection?.name || "Select collection",
), ),
t.i({ className: "ri-arrow-drop-down-line" }), t.i({ className: "ri-arrow-drop-down-line", ariaHidden: true }),
), ),
t.div( t.div(
{ id: "collections_dropdown" + uniqueId, className: "dropdown", popover: "hint" }, { id: "collections_dropdown" + uniqueId, className: "dropdown", popover: "hint" },
@@ -281,10 +281,10 @@ function recordFilePickerModal(settings = defaultSettings) {
{ {
type: "button", type: "button",
className: "btn circle transparent", className: "btn circle transparent",
ariaDescription: app.attrs.tooltip("Add new record"), ariaLabel: app.attrs.tooltip("Add new record"),
onclick: () => app.modals.openRecordUpsert(data.activeCollection), onclick: () => app.modals.openRecordUpsert(data.activeCollection),
}, },
t.i({ className: "ri-add-line txt-hint" }), t.i({ className: "ri-add-line txt-hint", ariaHidden: true }),
), ),
), ),
t.div( t.div(
@@ -323,7 +323,10 @@ function recordFilePickerModal(settings = defaultSettings) {
const ftype = app.utils.getFileType(name); const ftype = app.utils.getFileType(name);
return t.i({ className: app.utils.fileTypeIcons[ftype] || "ri-file-line" }); return t.i({
className: app.utils.fileTypeIcons[ftype] || "ri-file-line",
ariaHidden: true,
});
}, },
), ),
); );

View File

@@ -143,7 +143,7 @@ window.app.components.recordFileThumb = function(propsArg = {}) {
return img; return img;
} }
return t.i({ className: app.utils.fileTypeIcons[data.fileType] || "ri-file-line" }); return t.i({ className: app.utils.fileTypeIcons[data.fileType] || "ri-file-line", ariaHidden: true });
}, },
); );
}; };

View File

@@ -144,10 +144,11 @@ function recordPreviewModal(rawRecord, modalSettings) {
), ),
t.button( t.button(
{ {
"className": "btn sm circle transparent m-l-auto", title: "More options",
className: "btn sm circle transparent m-l-auto",
"html-popovertarget": uniqueId + "preview-dropdown", "html-popovertarget": uniqueId + "preview-dropdown",
}, },
t.i({ className: "ri-more-line" }), t.i({ className: "ri-more-line", ariaHidden: true }),
), ),
t.div({ id: uniqueId + "preview-dropdown", className: "dropdown", popover: "auto" }, (el) => { t.div({ id: uniqueId + "preview-dropdown", className: "dropdown", popover: "auto" }, (el) => {
return t.button( return t.button(
@@ -158,7 +159,7 @@ function recordPreviewModal(rawRecord, modalSettings) {
el.hidePopover(); el.hidePopover();
}, },
}, },
t.i({ className: "ri-braces-line" }), t.i({ className: "ri-braces-line", ariaHidden: true }),
t.span({ className: "txt" }, "Copy JSON"), t.span({ className: "txt" }, "Copy JSON"),
); );
}), }),
@@ -236,7 +237,7 @@ function recordPreviewModal(rawRecord, modalSettings) {
className: "btn", className: "btn",
onclick: () => downloadJSON(data.record), onclick: () => downloadJSON(data.record),
}, },
t.i({ className: "ri-download-line" }), t.i({ className: "ri-download-line", ariaHidden: true }),
t.span({ className: "txt" }, "Download JSON"), t.span({ className: "txt" }, "Download JSON"),
), ),
), ),

View File

@@ -175,7 +175,7 @@ const showRecordSummaryDropdownNoDelay = function(target, record) {
}, },
}, },
t.span({ className: "txt" }, "Edit relation record"), t.span({ className: "txt" }, "Edit relation record"),
t.i({ className: "ri-external-link-line" }), t.i({ className: "ri-external-link-line", ariaHidden: true }),
), ),
t.button( t.button(
{ {

View File

@@ -418,12 +418,12 @@ function recordUpsertModal(collection, rawRecord, modalSettings) {
{ {
type: "button", type: "button",
className: "btn sm secondary transparent circle m-l-auto", className: "btn sm secondary transparent circle m-l-auto",
ariaDescription: app.attrs.tooltip("Discard draft", "left"), ariaLabel: app.attrs.tooltip("Discard draft", "left"),
onclick: () => { onclick: () => {
deleteDraft(); deleteDraft();
}, },
}, },
t.i({ className: "ri-close-line" }), t.i({ className: "ri-close-line", ariaHidden: true }),
), ),
), ),
); );
@@ -539,7 +539,7 @@ function recordUpsertModal(collection, rawRecord, modalSettings) {
disabled: () => data.isFormDisabled, disabled: () => data.isFormDisabled,
onclick: () => data.isLocked = false, onclick: () => data.isLocked = false,
}, },
t.i({ className: "ri-lock-unlock-line" }), t.i({ className: "ri-lock-unlock-line", ariaHidden: true }),
t.span({ className: "txt" }, "Unlock to save"), t.span({ className: "txt" }, "Unlock to save"),
), ),
t.div( t.div(
@@ -560,10 +560,11 @@ function recordUpsertModal(collection, rawRecord, modalSettings) {
{ {
type: "button", type: "button",
className: () => `btn p-5`, className: () => `btn p-5`,
title: "Save options",
disabled: () => data.isLocked || data.isFormDisabled, disabled: () => data.isLocked || data.isFormDisabled,
"html-popovertarget": uniqueId + "save_options", "html-popovertarget": uniqueId + "save_options",
}, },
t.i({ className: "ri-arrow-up-s-line" }), t.i({ className: "ri-arrow-up-s-line", ariaHidden: true }),
), ),
t.div( t.div(
{ id: uniqueId + "save_options", className: "dropdown nowrap", popover: "auto" }, { id: uniqueId + "save_options", className: "dropdown nowrap", popover: "auto" },
@@ -693,10 +694,11 @@ function recordUpsertModal(collection, rawRecord, modalSettings) {
{ {
type: "button", type: "button",
className: "btn sm circle transparent", className: "btn sm circle transparent",
title: "More options",
disabled: () => data.isLoading, disabled: () => data.isLoading,
"html-popovertarget": uniqueId + "modal-header-dropdown", "html-popovertarget": uniqueId + "modal-header-dropdown",
}, },
t.i({ className: "ri-more-line" }), t.i({ className: "ri-more-line", ariaHidden: true }),
), ),
t.div( t.div(
{ {
@@ -742,7 +744,7 @@ function recordUpsertModal(collection, rawRecord, modalSettings) {
copyJSON(data.originalRecord); copyJSON(data.originalRecord);
}, },
}, },
t.i({ className: "ri-braces-line" }), t.i({ className: "ri-braces-line", ariaHidden: true }),
t.span({ className: "txt" }, "Copy JSON"), t.span({ className: "txt" }, "Copy JSON"),
), ),
() => { () => {
@@ -770,7 +772,7 @@ function recordUpsertModal(collection, rawRecord, modalSettings) {
} }
}, },
}, },
t.i({ className: "ri-file-copy-line" }), t.i({ className: "ri-file-copy-line", ariaHidden: true }),
t.span({ className: "txt" }, "Duplicate"), t.span({ className: "txt" }, "Duplicate"),
), ),
t.hr(), t.hr(),
@@ -902,7 +904,7 @@ function resetTokenKeyDropdownItem(collection, data, modalSettings) {
); );
}, },
}, },
t.i({ className: "ri-reset-left-line" }), t.i({ className: "ri-reset-left-line", ariaHidden: true }),
t.span({ className: "txt" }, "Reset issued tokens"), t.span({ className: "txt" }, "Reset issued tokens"),
); );
} }
@@ -947,7 +949,7 @@ function sendPasswordResetEmailDropdownItem(collection, data, modalSettings) {
); );
}, },
}, },
t.i({ className: "ri-mail-lock-line" }), t.i({ className: "ri-mail-lock-line", ariaHidden: true }),
t.span({ className: "txt" }, "Send password reset email"), t.span({ className: "txt" }, "Send password reset email"),
); );
} }
@@ -992,7 +994,7 @@ function sendVerificationDropdownItem(collection, data, modalSettings) {
); );
}, },
}, },
t.i({ className: "ri-mail-check-line" }), t.i({ className: "ri-mail-check-line", ariaHidden: true }),
t.span({ className: "txt" }, "Send verification email"), t.span({ className: "txt" }, "Send verification email"),
); );
} }
@@ -1007,7 +1009,7 @@ function impersonateDropdownItem(collection, data, modalSettings) {
app.modals.openRecordImpersontate(data.originalRecord); app.modals.openRecordImpersontate(data.originalRecord);
}, },
}, },
t.i({ className: "ri-id-card-line" }), t.i({ className: "ri-id-card-line", ariaHidden: true }),
t.span({ className: "txt" }, "Impersonate"), t.span({ className: "txt" }, "Impersonate"),
); );
} }
@@ -1055,7 +1057,7 @@ function deleteDropdownItem(collection, data, modalSettings) {
); );
}, },
}, },
t.i({ className: "ri-delete-bin-7-line" }), t.i({ className: "ri-delete-bin-7-line", ariaHidden: true }),
t.span({ className: "txt" }, "Delete"), t.span({ className: "txt" }, "Delete"),
); );
} }
@@ -1080,7 +1082,7 @@ function authFieldEmail(collection, data) {
{ className: "field" }, { className: "field" },
t.label( t.label(
{ htmlFor: uniqueId }, { htmlFor: uniqueId },
t.i({ className: app.fieldTypes.email.icon }), t.i({ className: app.fieldTypes.email.icon, ariaHidden: true }),
t.span({ className: "txt" }, () => emailField.name), t.span({ className: "txt" }, () => emailField.name),
), ),
t.input({ t.input({
@@ -1232,7 +1234,7 @@ function authFieldPassword(collection, data) {
{ className: "field" }, { className: "field" },
t.label( t.label(
{ htmlFor: uniqueId + "_password" }, { htmlFor: uniqueId + "_password" },
t.i({ className: "ri-lock-line" }), t.i({ className: "ri-lock-line", ariaHidden: true }),
t.span({ className: "txt" }, "Password"), t.span({ className: "txt" }, "Password"),
), ),
t.input({ t.input({
@@ -1258,7 +1260,7 @@ function authFieldPassword(collection, data) {
{ className: "field" }, { className: "field" },
t.label( t.label(
{ htmlFor: uniqueId + "_password_confirm" }, { htmlFor: uniqueId + "_password_confirm" },
t.i({ className: "ri-lock-line" }), t.i({ className: "ri-lock-line", ariaHidden: true }),
t.span({ className: "txt" }, "Confirm"), t.span({ className: "txt" }, "Confirm"),
), ),
t.input({ t.input({
@@ -1397,7 +1399,7 @@ function authProvidersTab(collection, data) {
}); });
} }
return t.i({ className: app.utils.fallbackProviderIcon }); return t.i({ className: app.utils.fallbackProviderIcon, ariaHidden: true });
}, },
), ),
t.div( t.div(
@@ -1414,10 +1416,10 @@ function authProvidersTab(collection, data) {
{ {
type: "button", type: "button",
className: "btn sm secondary transparent circle", className: "btn sm secondary transparent circle",
ariaDescription: app.attrs.tooltip("Unlink", "left"), ariaLabel: app.attrs.tooltip("Unlink", "left"),
onclick: () => confirmAndUnlink(externalAuth), onclick: () => confirmAndUnlink(externalAuth),
}, },
t.i({ className: "ri-close-line" }), t.i({ className: "ri-close-line", ariaHidden: true }),
), ),
), ),
); );

View File

@@ -421,6 +421,7 @@ window.app.components.recordsList = function(propsArg = {}) {
t.div( t.div(
{ className: "inline-flex gap-5" }, { className: "inline-flex gap-5" },
t.i({ t.i({
ariaHidden: true,
className: () => { className: () => {
if (field.primaryKey) { if (field.primaryKey) {
return "ri-key-line"; return "ri-key-line";
@@ -586,7 +587,10 @@ window.app.components.recordsList = function(propsArg = {}) {
return columns; return columns;
}, },
// columns, // columns,
t.td({ className: "col-meta" }, t.i({ className: "ri-arrow-right-line m-r-10" })), t.td(
{ className: "col-meta" },
t.i({ className: "ri-arrow-right-line m-r-10", ariaHidden: true }),
),
); );
}); });
}, },
@@ -644,7 +648,7 @@ window.app.components.recordsList = function(propsArg = {}) {
); );
}, },
}, },
t.i({ className: "ri-delete-bin-7-line" }), t.i({ className: "ri-delete-bin-7-line", ariaHidden: true }),
t.span({ className: "txt" }, "Delete"), t.span({ className: "txt" }, "Delete"),
); );
}, },
@@ -654,7 +658,7 @@ window.app.components.recordsList = function(propsArg = {}) {
className: "btn sm pill", className: "btn sm pill",
onclick: () => downloadSelected(), onclick: () => downloadSelected(),
}, },
t.i({ className: "ri-download-line" }), t.i({ className: "ri-download-line", ariaHidden: true }),
t.span({ className: "txt" }, "JSON"), t.span({ className: "txt" }, "JSON"),
), ),
), ),
@@ -726,10 +730,11 @@ function columnsDropdown(props, data) {
{ {
hidden: () => props.collection?.fields.length <= 1, hidden: () => props.collection?.fields.length <= 1,
type: "button", type: "button",
title: "Toggle columns",
className: "btn sm secondary transparent circle", className: "btn sm secondary transparent circle",
popoverTargetElement: dropdown, popoverTargetElement: dropdown,
}, },
t.i({ className: "ri-more-2-line" }), t.i({ className: "ri-more-2-line", ariaHidden: true }),
dropdown, dropdown,
); );
} }

View File

@@ -297,12 +297,12 @@ function recordsPickerModal(settings = defaultSettings) {
{ {
type: "button", type: "button",
className: "btn circle transparent", className: "btn circle transparent",
ariaDescription: app.attrs.tooltip("Add new record"), ariaLabel: app.attrs.tooltip("Add new record"),
onclick: () => { onclick: () => {
app.modals.openRecordUpsert(data.collection); app.modals.openRecordUpsert(data.collection);
}, },
}, },
t.i({ className: "ri-add-line txt-hint" }), t.i({ className: "ri-add-line txt-hint", ariaHidden: true }),
), ),
), ),
t.div( t.div(
@@ -329,6 +329,7 @@ function recordsPickerModal(settings = defaultSettings) {
t.span( t.span(
{ className: "state-icon" }, { className: "state-icon" },
t.i({ t.i({
ariaHidden: true,
className: () => className: () =>
isSelected(record) isSelected(record)
? "ri-checkbox-circle-fill txt-success" ? "ri-checkbox-circle-fill txt-success"
@@ -342,13 +343,13 @@ function recordsPickerModal(settings = defaultSettings) {
t.button( t.button(
{ {
className: "btn sm secondary transparent circle", className: "btn sm secondary transparent circle",
ariaDescription: app.attrs.tooltip("Edit"), ariaLabel: app.attrs.tooltip("Edit"),
onclick: (e) => { onclick: (e) => {
e.stopPropagation(); e.stopPropagation();
app.modals.openRecordUpsert(data.collection, record); app.modals.openRecordUpsert(data.collection, record);
}, },
}, },
t.i({ className: "ri-pencil-line" }), t.i({ className: "ri-pencil-line", ariaHidden: true }),
), ),
), ),
); );

View File

@@ -7,7 +7,7 @@ export function batchAccordion(pageData) {
}, },
t.summary( t.summary(
null, null,
t.i({ className: "ri-archive-stack-line" }), t.i({ className: "ri-archive-stack-line", ariaHidden: true }),
t.span({ className: "txt" }, "Batch API"), t.span({ className: "txt" }, "Batch API"),
t.div({ className: "flex-fill" }), t.div({ className: "flex-fill" }),
() => { () => {

View File

@@ -179,7 +179,9 @@ export function pageApplicationSettings() {
t.span({ className: "txt" }, "Hide/Lock collection and record controls"), t.span({ className: "txt" }, "Hide/Lock collection and record controls"),
t.i({ t.i({
className: "ri-information-line link-hint", className: "ri-information-line link-hint",
ariaDescription: app.attrs.tooltip("To prevent accidental changes when in production environment, collections create and update buttons will be hidden.\nRecords update will also require an extra unlock step before save.") ariaDescription: app.attrs.tooltip(
"To prevent accidental changes when in production environment, collections create and update buttons will be hidden.\nRecords update will also require an extra unlock step before save.",
),
}), }),
), ),
), ),

View File

@@ -214,7 +214,7 @@ export function rateLimitAccordion(pageData) {
}, },
t.summary( t.summary(
null, null,
t.i({ className: "ri-pulse-fill" }), t.i({ className: "ri-pulse-fill", ariaHidden: true }),
t.span({ className: "txt" }, "Rate limiting"), t.span({ className: "txt" }, "Rate limiting"),
t.div({ className: "flex-fill" }), t.div({ className: "flex-fill" }),
() => { () => {
@@ -397,7 +397,7 @@ export function rateLimitAccordion(pageData) {
className: "btn secondary sm", className: "btn secondary sm",
onclick: () => newRule(), onclick: () => newRule(),
}, },
t.i({ className: "ri-add-line" }), t.i({ className: "ri-add-line", ariaHidden: true }),
t.span({ className: "txt" }, "Add rate limit rule"), t.span({ className: "txt" }, "Add rate limit rule"),
), ),
t.button( t.button(

View File

@@ -52,7 +52,7 @@ export function trustedProxyAccordion(pageData) {
}, },
t.summary( t.summary(
null, null,
t.i({ className: "ri-route-line" }), t.i({ className: "ri-route-line", ariaHidden: true }),
t.span({ className: "txt" }, "User IP proxy headers"), t.span({ className: "txt" }, "User IP proxy headers"),
() => { () => {
if (proxyInfo.isLoading) { if (proxyInfo.isLoading) {

View File

@@ -74,7 +74,7 @@ export function backupUploadButton(onSuccess = null) {
t.button( t.button(
{ {
type: "button", type: "button",
ariaDescription: app.attrs.tooltip("Upload backup"), ariaLabel: app.attrs.tooltip("Upload backup"),
className: () => `btn sm transparent secondary circle ${data.isUploading ? "loading" : ""}`, className: () => `btn sm transparent secondary circle ${data.isUploading ? "loading" : ""}`,
disabled: () => data.isUploading, disabled: () => data.isUploading,
onclick: () => fileInput?.click(), onclick: () => fileInput?.click(),
@@ -82,7 +82,7 @@ export function backupUploadButton(onSuccess = null) {
app.pb.cancelRequest(uniqueId); app.pb.cancelRequest(uniqueId);
}, },
}, },
t.i({ className: "ri-upload-cloud-line" }), t.i({ className: "ri-upload-cloud-line", ariaHidden: true }),
), ),
fileInput, fileInput,
); );

View File

@@ -108,6 +108,7 @@ export function backupsForm(propsArg = {}) {
t.span({ className: "txt" }, "Backup options"), t.span({ className: "txt" }, "Backup options"),
t.i({ t.i({
className: () => (data.showForm ? "ri-arrow-up-s-line" : "ri-arrow-down-s-line"), className: () => (data.showForm ? "ri-arrow-up-s-line" : "ri-arrow-down-s-line"),
ariaHidden: true,
}), }),
), ),
app.components.slide( app.components.slide(
@@ -177,7 +178,7 @@ export function backupsForm(propsArg = {}) {
"html-popovertarget": "cron-presets-dropdown", "html-popovertarget": "cron-presets-dropdown",
}, },
t.span({ className: "txt" }, "Presets"), t.span({ className: "txt" }, "Presets"),
t.i({ className: "ri-arrow-drop-down-line" }), t.i({ className: "ri-arrow-drop-down-line", ariaHidden: true }),
), ),
t.div( t.div(
{ {

View File

@@ -133,7 +133,7 @@ export function backupsList(propsArg = {}) {
return data.backups.map((backup) => { return data.backups.map((backup) => {
return t.div( return t.div(
{ className: () => `list-item ${data.isLoading ? "faded" : ""}` }, { className: () => `list-item ${data.isLoading ? "faded" : ""}` },
t.i({ className: "ri-folder-zip-line" }), t.i({ className: "ri-folder-zip-line", ariaHidden: true }),
t.div( t.div(
{ className: "content" }, { className: "content" },
t.span({ t.span({
@@ -156,7 +156,7 @@ export function backupsList(propsArg = {}) {
t.button( t.button(
{ {
type: "button", type: "button",
ariaDescription: app.attrs.tooltip("Download"), ariaLabel: app.attrs.tooltip("Download"),
className: () => className: () =>
`btn sm circle secondary transparent ${ `btn sm circle secondary transparent ${
data.isDownloading[backup.key] ? "loading" : "" data.isDownloading[backup.key] ? "loading" : ""
@@ -164,22 +164,22 @@ export function backupsList(propsArg = {}) {
disabled: () => data.isDeleting[backup.key] || data.isDownloading[backup.key], disabled: () => data.isDeleting[backup.key] || data.isDownloading[backup.key],
onclick: () => downloadBackup(backup.key), onclick: () => downloadBackup(backup.key),
}, },
t.i({ className: "ri-download-line" }), t.i({ className: "ri-download-line", ariaHidden: true }),
), ),
t.button( t.button(
{ {
type: "button", type: "button",
ariaDescription: app.attrs.tooltip("Restore"), ariaLabel: app.attrs.tooltip("Restore"),
className: () => `btn sm circle secondary transparent`, className: () => `btn sm circle secondary transparent`,
disabled: () => data.isDeleting[backup.key] || data.isDownloading[backup.key], disabled: () => data.isDeleting[backup.key] || data.isDownloading[backup.key],
onclick: () => openBackupRestoreModal(backup.key), onclick: () => openBackupRestoreModal(backup.key),
}, },
t.i({ className: "ri-restart-line" }), t.i({ className: "ri-restart-line", ariaHidden: true }),
), ),
t.button( t.button(
{ {
type: "button", type: "button",
ariaDescription: app.attrs.tooltip("Delete"), ariaLabel: app.attrs.tooltip("Delete"),
className: () => className: () =>
`btn sm circle secondary transparent ${ `btn sm circle secondary transparent ${
data.isDeleting[backup.key] ? "loading" : "" data.isDeleting[backup.key] ? "loading" : ""
@@ -187,7 +187,7 @@ export function backupsList(propsArg = {}) {
disabled: () => data.isDeleting[backup.key] || data.isDownloading[backup.key], disabled: () => data.isDeleting[backup.key] || data.isDownloading[backup.key],
onclick: () => confirmBackupDelete(backup.key), onclick: () => confirmBackupDelete(backup.key),
}, },
t.i({ className: "ri-delete-bin-7-line" }), t.i({ className: "ri-delete-bin-7-line", ariaHidden: true }),
), ),
), ),
); );
@@ -209,7 +209,7 @@ export function backupsList(propsArg = {}) {
() => { () => {
if (data.canBackup) { if (data.canBackup) {
return [ return [
t.i({ className: "ri-play-circle-line" }), t.i({ className: "ri-play-circle-line", ariaHidden: true }),
t.span({ className: "txt" }, "Initialize new backup"), t.span({ className: "txt" }, "Initialize new backup"),
]; ];
} }

View File

@@ -97,13 +97,13 @@ export function cronsList(propsArg = {}) {
t.button( t.button(
{ {
type: "button", type: "button",
ariaDescription: app.attrs.tooltip("Run"), ariaLabel: app.attrs.tooltip("Run"),
className: () => className: () =>
`btn sm circle secondary transparent ${data.isRunning[cron.id] ? "loading" : ""}`, `btn sm circle secondary transparent ${data.isRunning[cron.id] ? "loading" : ""}`,
disabled: () => data.isRunning[cron.id], disabled: () => data.isRunning[cron.id],
onclick: () => runCron(cron.id), onclick: () => runCron(cron.id),
}, },
t.i({ className: "ri-play-large-line" }), t.i({ className: "ri-play-large-line", ariaHidden: true }),
), ),
), ),
); );

View File

@@ -195,7 +195,7 @@ function mailTestModal(preselectedCollectionIdOrName = "", template = "") {
className: () => `btn expanded ${data.isSending ? "loading" : ""}`, className: () => `btn expanded ${data.isSending ? "loading" : ""}`,
disabled: () => data.isSending || !data.canSubmit, disabled: () => data.isSending || !data.canSubmit,
}, },
t.i({ className: "ri-mail-send-line" }), t.i({ className: "ri-mail-send-line", ariaHidden: true }),
t.span({ className: "txt" }, "Send"), t.span({ className: "txt" }, "Send"),
), ),
), ),

View File

@@ -370,7 +370,7 @@ export function pageMailSettings(route) {
className: () => `btn expanded outline`, className: () => `btn expanded outline`,
onclick: () => app.modals.openMailTest(), onclick: () => app.modals.openMailTest(),
}, },
t.i({ className: "ri-mail-check-line" }), t.i({ className: "ri-mail-check-line", ariaHidden: true }),
t.span({ className: "txt" }, "Send test email"), t.span({ className: "txt" }, "Send test email"),
); );
}, },

View File

@@ -35,7 +35,7 @@ export function settingsSidebar() {
}, },
() => { () => {
if (link.icon) { if (link.icon) {
return t.i({ className: link.icon }); return t.i({ className: link.icon, ariaHidden: true });
} }
}, },
t.span({ className: "txt" }, () => link.label), t.span({ className: "txt" }, () => link.label),

View File

@@ -132,6 +132,7 @@ export function collectionsDiffTable(propsArg = {}) {
}), }),
t.i({ t.i({
className: "ri-arrow-right-line txt-sm", className: "ri-arrow-right-line txt-sm",
ariaHidden: true,
}), }),
]; ];
}, },

View File

@@ -179,7 +179,7 @@ export function pageExportCollections(route) {
{ className: "col-lg-12 txt-right" }, { className: "col-lg-12 txt-right" },
t.button( t.button(
{ className: "btn", onclick: download }, { className: "btn", onclick: download },
t.i({ className: "ri-download-line" }), t.i({ className: "ri-download-line", ariaHidden: true }),
t.span({ className: "txt" }, "Download as JSON"), t.span({ className: "txt" }, "Download as JSON"),
), ),
), ),

View File

@@ -446,6 +446,7 @@ export function pageImportCollections(route) {
}), }),
t.i({ t.i({
className: "ri-arrow-right-line txt-sm", className: "ri-arrow-right-line txt-sm",
ariaHidden: true,
}), }),
]; ];
}, },