@tinyrack/issuary-server 0.24.0 → 0.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/public/assets/2fa-BlpDkf-r.js +2 -0
- package/public/assets/{2fa-6btYq1AL.js.map → 2fa-BlpDkf-r.js.map} +1 -1
- package/public/assets/{2fa-Dxh4Kxy-.js → 2fa-DIpGlpoI.js} +2 -2
- package/public/assets/{2fa-Dxh4Kxy-.js.map → 2fa-DIpGlpoI.js.map} +1 -1
- package/public/assets/2fa-tzTSqiOS.js +2 -0
- package/public/assets/{2fa-UcpXAI9J.js.map → 2fa-tzTSqiOS.js.map} +1 -1
- package/public/assets/{2fa-D3ieXkuh.js → 2fa-waFAdIa0.js} +2 -2
- package/public/assets/{2fa-D3ieXkuh.js.map → 2fa-waFAdIa0.js.map} +1 -1
- package/public/assets/DialogHandle-ChG5Sj7T.js +2 -0
- package/public/assets/{DialogHandle-tiMUnjZQ.js.map → DialogHandle-ChG5Sj7T.js.map} +1 -1
- package/public/assets/{admin-B8RQbf4_.js → admin-Ii29X08B.js} +2 -2
- package/public/assets/{admin-B8RQbf4_.js.map → admin-Ii29X08B.js.map} +1 -1
- package/public/assets/{admin-users-Dz1QNdy3.js → admin-users-d7tT-cjc.js} +2 -2
- package/public/assets/{admin-users-Dz1QNdy3.js.map → admin-users-d7tT-cjc.js.map} +1 -1
- package/public/assets/alert-leqyvHOp.js.map +1 -1
- package/public/assets/{auth-choice-row-DWzfcZQY.js → auth-choice-row-DUvFyo7b.js} +2 -2
- package/public/assets/{auth-choice-row-DWzfcZQY.js.map → auth-choice-row-DUvFyo7b.js.map} +1 -1
- package/public/assets/{auth-field-DsLGh1U-.js → auth-field-BSlAWkbx.js} +2 -2
- package/public/assets/{auth-field-DsLGh1U-.js.map → auth-field-BSlAWkbx.js.map} +1 -1
- package/public/assets/auth-layout-CcJy6dVY.js +2 -0
- package/public/assets/auth-layout-CcJy6dVY.js.map +1 -0
- package/public/assets/{auth-page-header-COvqWINf.js → auth-page-header-ZLhtQ7Et.js} +2 -2
- package/public/assets/{auth-page-header-COvqWINf.js.map → auth-page-header-ZLhtQ7Et.js.map} +1 -1
- package/public/assets/{authorization-context-banner-DVx1TsPY.js → authorization-context-banner-DfkjwE93.js} +2 -2
- package/public/assets/{authorization-context-banner-DVx1TsPY.js.map → authorization-context-banner-DfkjwE93.js.map} +1 -1
- package/public/assets/{avatar-BCLugfaZ.js → avatar-D-70MKp8.js} +2 -2
- package/public/assets/{avatar-BCLugfaZ.js.map → avatar-D-70MKp8.js.map} +1 -1
- package/public/assets/badge-CsOfUji0.js.map +1 -1
- package/public/assets/checkbox-C3UmXoKz.js +2 -0
- package/public/assets/{checkbox-CFVDS3zJ.js.map → checkbox-C3UmXoKz.js.map} +1 -1
- package/public/assets/config-DTQCUlfZ.js.map +1 -1
- package/public/assets/{consent-ChiWc7Ql.js → consent-BJgO9pEV.js} +2 -2
- package/public/assets/{consent-ChiWc7Ql.js.map → consent-BJgO9pEV.js.map} +1 -1
- package/public/assets/{consent-CKOohdYI.js → consent-D_yGE8TR.js} +2 -2
- package/public/assets/{consent-CKOohdYI.js.map → consent-D_yGE8TR.js.map} +1 -1
- package/public/assets/createLucideIcon-BPpAIXR_.js.map +1 -1
- package/public/assets/{email-Crjg1dcr.js → email-DAa8JGoC.js} +2 -2
- package/public/assets/{email-Crjg1dcr.js.map → email-DAa8JGoC.js.map} +1 -1
- package/public/assets/email-tzTSqiOS.js +2 -0
- package/public/assets/{email-UcpXAI9J.js.map → email-tzTSqiOS.js.map} +1 -1
- package/public/assets/{error-VfMv226c.js → error-Dj4QQ8vW.js} +2 -2
- package/public/assets/{error-VfMv226c.js.map → error-Dj4QQ8vW.js.map} +1 -1
- package/public/assets/field-CEs4ugVJ.js +3 -0
- package/public/assets/{field-89zKYDVL.js.map → field-CEs4ugVJ.js.map} +1 -1
- package/public/assets/{forgot-Dr88fVMq.js → forgot-CYMAWPVu.js} +2 -2
- package/public/assets/{forgot-Dr88fVMq.js.map → forgot-CYMAWPVu.js.map} +1 -1
- package/public/assets/forgot-tzTSqiOS.js +2 -0
- package/public/assets/{forgot-UcpXAI9J.js.map → forgot-tzTSqiOS.js.map} +1 -1
- package/public/assets/{index-CZ0rWM7l.js → index-H6CJKjiN.js} +3 -3
- package/public/assets/{index-CZ0rWM7l.js.map → index-H6CJKjiN.js.map} +1 -1
- package/public/assets/{index-CDD8owGK.css → index-kD9gQA-w.css} +1 -1
- package/public/assets/{initial-avatar-ocwNWL38.js → initial-avatar-DjSqgENY.js} +2 -2
- package/public/assets/{initial-avatar-ocwNWL38.js.map → initial-avatar-DjSqgENY.js.map} +1 -1
- package/public/assets/{input-GPigtjgi.js → input-BHPUSlfp.js} +2 -2
- package/public/assets/{input-GPigtjgi.js.map → input-BHPUSlfp.js.map} +1 -1
- package/public/assets/link-C-WdTj3F.js.map +1 -1
- package/public/assets/{login-CQeTLmIu.js → login-CBinfk4L.js} +2 -2
- package/public/assets/{login-CQeTLmIu.js.map → login-CBinfk4L.js.map} +1 -1
- package/public/assets/login-tzTSqiOS.js +2 -0
- package/public/assets/{login-UcpXAI9J.js.map → login-tzTSqiOS.js.map} +1 -1
- package/public/assets/{modal-BV3gpI-p.js → modal-CwoBUXp3.js} +2 -2
- package/public/assets/{modal-BV3gpI-p.js.map → modal-CwoBUXp3.js.map} +1 -1
- package/public/assets/{passkey-Bf7n49Z7.js → passkey-Jw2CRzJp.js} +2 -2
- package/public/assets/{passkey-Bf7n49Z7.js.map → passkey-Jw2CRzJp.js.map} +1 -1
- package/public/assets/{passkey-CT3G7pCL.js → passkey-V_tav53p.js} +2 -2
- package/public/assets/{passkey-CT3G7pCL.js.map → passkey-V_tav53p.js.map} +1 -1
- package/public/assets/passkey-tzTSqiOS.js +2 -0
- package/public/assets/{passkey-UcpXAI9J.js.map → passkey-tzTSqiOS.js.map} +1 -1
- package/public/assets/{password-BKI5GTRs.js → password-6QOqTV_s.js} +2 -2
- package/public/assets/{password-BKI5GTRs.js.map → password-6QOqTV_s.js.map} +1 -1
- package/public/assets/{password-strength-DTWF07Px.js → password-strength-DtGMHOD-.js} +2 -2
- package/public/assets/{password-strength-DTWF07Px.js.map → password-strength-DtGMHOD-.js.map} +1 -1
- package/public/assets/password-tzTSqiOS.js +2 -0
- package/public/assets/{password-UcpXAI9J.js.map → password-tzTSqiOS.js.map} +1 -1
- package/public/assets/pin-input-DdhzDNy9.js +2 -0
- package/public/assets/{pin-input-BGOLfkwL.js.map → pin-input-DdhzDNy9.js.map} +1 -1
- package/public/assets/{profile-DSTMtoUf.js → profile-DVjIWt8X.js} +2 -2
- package/public/assets/{profile-DSTMtoUf.js.map → profile-DVjIWt8X.js.map} +1 -1
- package/public/assets/profile-SHr6F-7b.js +2 -0
- package/public/assets/profile-SHr6F-7b.js.map +1 -0
- package/public/assets/{recovery-DbgpqG6f.js → recovery-CvNl-yt9.js} +2 -2
- package/public/assets/{recovery-DbgpqG6f.js.map → recovery-CvNl-yt9.js.map} +1 -1
- package/public/assets/{register-B2Lixapy.js → register-SFXa5EeL.js} +2 -2
- package/public/assets/{register-B2Lixapy.js.map → register-SFXa5EeL.js.map} +1 -1
- package/public/assets/register-tzTSqiOS.js +2 -0
- package/public/assets/{register-UcpXAI9J.js.map → register-tzTSqiOS.js.map} +1 -1
- package/public/assets/{reset-C-Qjl2Qy.js → reset-l-pLzjwe.js} +2 -2
- package/public/assets/{reset-C-Qjl2Qy.js.map → reset-l-pLzjwe.js.map} +1 -1
- package/public/assets/reset-tzTSqiOS.js +2 -0
- package/public/assets/{reset-UcpXAI9J.js.map → reset-tzTSqiOS.js.map} +1 -1
- package/public/assets/{select-BKx4bF4A.js → select-D2H87qXJ.js} +2 -2
- package/public/assets/{select-BKx4bF4A.js.map → select-D2H87qXJ.js.map} +1 -1
- package/public/assets/select-tzTSqiOS.js +2 -0
- package/public/assets/{select-UcpXAI9J.js.map → select-tzTSqiOS.js.map} +1 -1
- package/public/assets/separator-B0Bvh1he.js.map +1 -1
- package/public/assets/shell-header-bar-BPgCjFPv.js +2 -0
- package/public/assets/shell-header-bar-BPgCjFPv.js.map +1 -0
- package/public/assets/{terms-Vgpg5IZK.js → terms-D5rfQhog.js} +2 -2
- package/public/assets/{terms-Vgpg5IZK.js.map → terms-D5rfQhog.js.map} +1 -1
- package/public/assets/{terms-DSTMtoUf.js → terms-DVjIWt8X.js} +2 -2
- package/public/assets/{terms-DSTMtoUf.js.map → terms-DVjIWt8X.js.map} +1 -1
- package/public/assets/{terms-checkbox-list-DqbXU4qw.js → terms-checkbox-list-BKJcS2pJ.js} +2 -2
- package/public/assets/{terms-checkbox-list-DqbXU4qw.js.map → terms-checkbox-list-BKJcS2pJ.js.map} +1 -1
- package/public/assets/{totp-g0-s50HZ.js → totp-BbQi-gsF.js} +2 -2
- package/public/assets/{totp-g0-s50HZ.js.map → totp-BbQi-gsF.js.map} +1 -1
- package/public/assets/{totp-Cjns-PoB.js → totp-wY0Zji8E.js} +2 -2
- package/public/assets/{totp-Cjns-PoB.js.map → totp-wY0Zji8E.js.map} +1 -1
- package/public/assets/{use-totp-setup-CtTaklH-.js → use-totp-setup-OH_GTMxA.js} +3 -3
- package/public/assets/{use-totp-setup-CtTaklH-.js.map → use-totp-setup-OH_GTMxA.js.map} +1 -1
- package/public/assets/{useAriaLabelledBy-7uIPXK-0.js → useAriaLabelledBy-9o83pv9X.js} +2 -2
- package/public/assets/{useAriaLabelledBy-7uIPXK-0.js.map → useAriaLabelledBy-9o83pv9X.js.map} +1 -1
- package/public/assets/useQuery-CI5Ukuae.js +2 -0
- package/public/assets/{useQuery-pOdkMV4B.js.map → useQuery-CI5Ukuae.js.map} +1 -1
- package/public/assets/{users-B1hvVo3B.js → users-DqCnblEo.js} +2 -2
- package/public/assets/{users-B1hvVo3B.js.map → users-DqCnblEo.js.map} +1 -1
- package/public/index.html +2 -2
- package/public/assets/2fa-6btYq1AL.js +0 -2
- package/public/assets/2fa-UcpXAI9J.js +0 -2
- package/public/assets/DialogHandle-tiMUnjZQ.js +0 -2
- package/public/assets/auth-layout-DGTylGtX.js +0 -2
- package/public/assets/auth-layout-DGTylGtX.js.map +0 -1
- package/public/assets/checkbox-CFVDS3zJ.js +0 -2
- package/public/assets/email-UcpXAI9J.js +0 -2
- package/public/assets/field-89zKYDVL.js +0 -3
- package/public/assets/forgot-UcpXAI9J.js +0 -2
- package/public/assets/login-UcpXAI9J.js +0 -2
- package/public/assets/passkey-UcpXAI9J.js +0 -2
- package/public/assets/password-UcpXAI9J.js +0 -2
- package/public/assets/pin-input-BGOLfkwL.js +0 -2
- package/public/assets/profile-RpDmbWNA.js +0 -2
- package/public/assets/profile-RpDmbWNA.js.map +0 -1
- package/public/assets/register-UcpXAI9J.js +0 -2
- package/public/assets/reset-UcpXAI9J.js +0 -2
- package/public/assets/select-UcpXAI9J.js +0 -2
- package/public/assets/shell-header-bar-CgyNXbPS.js +0 -2
- package/public/assets/shell-header-bar-CgyNXbPS.js.map +0 -1
- package/public/assets/useQuery-pOdkMV4B.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"users-B1hvVo3B.js","names":["useMutation","useQueryClient","useSuspenseQuery","TRBadge","TRButton","TRCard","useState","useTranslation","AdminGateScreen","AdminShell","AdminUserFormModal","AdminUsersFilterBar","getActiveQuickFilter","AdminUsersNotice","AdminUsersSummary","AdminUsersTable","AdminUsersToolbar","adminUsersQueryOptions","createAdminUser","deleteAdminUser","normalizeAdminUsersQuery","updateAdminUser","appConfigQueryOptions","Route","AdminUsersPage","user","useRouteContext","select","context","role","AdminUsersGate","SessionUser","data","config","admin","enabled","AdminUsersContent","t","queryClient","draftQuery","setDraftQuery","draftIncludeDeleted","setDraftIncludeDeleted","filters","setFilters","notice","setNotice","NoticeState","modal","setModal","UserModalState","activeUsers","users","filter","managedUser","deleted_at","length","configUsers","managed_by","databaseUsers","activeQuickFilter","hasActiveFilters","query","includeDeleted","managedBy","undefined","pageStart","pagination","total","page","page_size","pageEnd","Math","min","noticeOn","message","tone","noticeFail","createMutation","mutationFn","onSuccess","nextUser","invalidateQueries","queryKey","email","onError","updateMutation","deleteMutation","isMutating","isPending","applySearch","current","trim","clearFilters","applyQuickFilter","nextFilter","QuickFilter","type","pageSize","values","mutate","sub","component"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/search.mjs","../../../frontend/src/features/admin/users/admin-users-filters.ts","../../../frontend/src/features/admin/users/admin-user-form-modal.tsx","../../../frontend/src/features/admin/users/admin-users-filter-bar.tsx","../../../frontend/src/features/admin/users/admin-users-notice.tsx","../../../frontend/src/features/admin/users/admin-users-summary.tsx","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/table/table-body.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/table/table-caption.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/table/table-cell.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/table/table-footer.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/table/table-head.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/table/table-header.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/table/table-root.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/table/table-row.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/table/index.js","../../../frontend/src/features/admin/users/admin-users-table.tsx","../../../frontend/src/features/admin/users/admin-users-toolbar.tsx","../../../frontend/src/routes/admin/users/index.tsx?tsr-split=component"],"sourcesContent":["/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n];\nconst Search = createLucideIcon(\"search\", __iconNode);\n\nexport { __iconNode, Search as default };\n//# sourceMappingURL=search.mjs.map\n","import type {\n AdminUser,\n normalizeAdminUsersQuery,\n} from '#frontend/queries/admin-users.ts';\n\nexport type QuickFilter = 'all' | 'database' | 'config' | 'admins';\n\nexport type NoticeState = {\n tone: 'success' | 'error';\n message: string;\n} | null;\n\nexport type UserModalState =\n | { type: 'create' }\n | { type: 'edit'; user: AdminUser }\n | { type: 'delete'; user: AdminUser }\n | null;\n\nexport function parseUserRole(\n value: FormDataEntryValue | null,\n): 'user' | 'admin' {\n return value === 'admin' ? 'admin' : 'user';\n}\n\nexport function getActiveQuickFilter(\n filters: ReturnType<typeof normalizeAdminUsersQuery>,\n): QuickFilter {\n if (filters.role === 'admin') return 'admins';\n if (filters.managedBy === 'database') return 'database';\n if (filters.managedBy === 'config') return 'config';\n return 'all';\n}\n","import { TRButton } from '@tinyrack/ui/components/button';\nimport { TRCheckbox } from '@tinyrack/ui/components/checkbox';\nimport { TRField } from '@tinyrack/ui/components/field';\nimport { TRInput } from '@tinyrack/ui/components/input';\nimport { TRSelect } from '@tinyrack/ui/components/select';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { CheckIcon, TriangleAlertIcon } from 'lucide-react';\nimport type { FormEvent } from 'react';\nimport { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Modal, ModalActions } from '#frontend/components/ui/modal.tsx';\nimport {\n parseUserRole,\n type UserModalState,\n} from '#frontend/features/admin/users/admin-users-filters.ts';\n\ntype AdminUserFormModalProps = {\n modal: UserModalState;\n isMutating: boolean;\n onClose: () => void;\n onCreate: (values: {\n email: string;\n password: string;\n role: 'user' | 'admin';\n email_verified: boolean;\n }) => void;\n onUpdate: (values: {\n sub: string;\n email: string;\n role: 'user' | 'admin';\n email_verified: boolean;\n }) => void;\n onDelete: (sub: string) => void;\n};\n\nexport function AdminUserFormModal({\n modal,\n isMutating,\n onClose,\n onCreate,\n onUpdate,\n onDelete,\n}: AdminUserFormModalProps) {\n const { t } = useTranslation();\n const defaultValues = useMemo(\n () => (modal?.type === 'edit' ? modal.user : null),\n [modal],\n );\n\n if (!modal) return null;\n\n if (modal.type === 'delete') {\n return (\n <Modal\n isOpen\n onClose={onClose}\n title={t('admin.users.deleteTitle', { email: modal.user.email })}\n variant=\"destructive\"\n >\n <div className=\"flex flex-col gap-tinyrack-xs rounded-tinyrack-md border border-tinyrack-danger-border bg-tinyrack-danger-surface p-tinyrack-lg text-tinyrack-danger-foreground\">\n <div className=\"flex items-center gap-tinyrack-sm\">\n <TriangleAlertIcon aria-hidden className=\"size-tinyrack-lg\" />\n <TRText as=\"p\" weight=\"medium\">\n {t('admin.users.deleteWarning')}\n </TRText>\n </div>\n <TRText as=\"p\" variant=\"bodySm\">\n {t('admin.users.deleteDescription')}\n </TRText>\n </div>\n <ModalActions>\n <TRButton\n disabled={isMutating}\n onClick={onClose}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.cancel')}\n </TRButton>\n <TRButton\n disabled={isMutating}\n intent=\"danger\"\n onClick={() => onDelete(modal.user.sub)}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.deleteConfirm')}\n </TRButton>\n </ModalActions>\n </Modal>\n );\n }\n\n const title =\n modal.type === 'create'\n ? t('admin.users.create')\n : t('admin.users.editTitle');\n const submit =\n modal.type === 'create'\n ? t('admin.users.createSubmit')\n : t('admin.users.save');\n\n const handleSubmit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const formData = new FormData(event.currentTarget);\n const values = {\n email: String(formData.get('email') ?? ''),\n role: parseUserRole(formData.get('role')),\n email_verified: formData.get('email_verified') === 'on',\n };\n if (modal.type === 'create') {\n onCreate({\n ...values,\n password: String(formData.get('password') ?? ''),\n });\n } else {\n onUpdate({ sub: modal.user.sub, ...values });\n }\n };\n\n return (\n <Modal\n description={\n modal.type === 'create'\n ? t('admin.users.createHint')\n : t('admin.users.editHint')\n }\n isOpen\n onClose={onClose}\n title={title}\n >\n <form\n className=\"mt-tinyrack-lg flex flex-col gap-tinyrack-lg\"\n onSubmit={handleSubmit}\n >\n <TRField.Root>\n <TRField.Label htmlFor=\"admin-user-email\">\n {t('profile.email.label')}\n </TRField.Label>\n <TRInput\n defaultValue={defaultValues?.email ?? ''}\n id=\"admin-user-email\"\n name=\"email\"\n required\n type=\"email\"\n uiSize=\"sm\"\n />\n </TRField.Root>\n\n {modal.type === 'create' ? (\n <TRField.Root>\n <TRField.Label htmlFor=\"admin-user-password\">\n {t('admin.users.password')}\n </TRField.Label>\n <TRInput\n id=\"admin-user-password\"\n name=\"password\"\n required\n type=\"password\"\n uiSize=\"sm\"\n />\n </TRField.Root>\n ) : null}\n\n <TRField.Root>\n <TRField.Label htmlFor=\"admin-user-role\">\n {t('admin.users.role')}\n </TRField.Label>\n <TRSelect.Root\n defaultValue={defaultValues?.role ?? 'user'}\n name=\"role\"\n >\n <TRSelect.Trigger id=\"admin-user-role\" uiSize=\"sm\">\n <TRSelect.Value />\n </TRSelect.Trigger>\n <TRSelect.Positioner>\n <TRSelect.Popup>\n <TRSelect.List>\n {['user', 'admin'].map((role) => (\n <TRSelect.Item key={role} value={role}>\n <TRSelect.ItemText>\n {t(\n `admin.users.role${role === 'user' ? 'User' : 'Admin'}`,\n )}\n </TRSelect.ItemText>\n <TRSelect.ItemIndicator>\n <CheckIcon aria-hidden />\n </TRSelect.ItemIndicator>\n </TRSelect.Item>\n ))}\n </TRSelect.List>\n </TRSelect.Popup>\n </TRSelect.Positioner>\n </TRSelect.Root>\n </TRField.Root>\n\n <TRField.Root>\n <div className=\"flex items-center gap-tinyrack-md rounded-tinyrack-md border border-tinyrack-border bg-tinyrack-surface px-tinyrack-md py-tinyrack-sm\">\n <TRCheckbox.Root\n aria-label={t('admin.users.emailVerified')}\n defaultChecked={defaultValues?.email_verified ?? false}\n name=\"email_verified\"\n uiSize=\"md\"\n value=\"on\"\n >\n <TRCheckbox.Indicator />\n </TRCheckbox.Root>\n <TRField.Label className=\"cursor-pointer\">\n {t('admin.users.emailVerified')}\n </TRField.Label>\n </div>\n </TRField.Root>\n\n <ModalActions>\n <TRButton\n disabled={isMutating}\n onClick={onClose}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.cancel')}\n </TRButton>\n <TRButton\n disabled={isMutating}\n intent=\"primary\"\n type=\"submit\"\n uiSize=\"sm\"\n >\n {submit}\n </TRButton>\n </ModalActions>\n </form>\n </Modal>\n );\n}\n","import { TRBadge } from '@tinyrack/ui/components/badge';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRSelect } from '@tinyrack/ui/components/select';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { CheckIcon } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport type { QuickFilter } from '#frontend/features/admin/users/admin-users-filters.ts';\n\ntype AdminUsersFilterBarProps = {\n pageStart: number;\n pageEnd: number;\n total: number;\n query: string;\n includeDeleted: boolean;\n activeQuickFilter: QuickFilter;\n hasActiveFilters: boolean;\n onClearFilters: () => void;\n pageSize: number;\n onPageSizeChange: (pageSize: number) => void;\n};\n\nconst PAGE_SIZES = [10, 20, 50];\n\n/** What the current result set is filtered by, and how much of it is shown. */\nexport function AdminUsersFilterBar({\n pageStart,\n pageEnd,\n total,\n query,\n includeDeleted,\n activeQuickFilter,\n hasActiveFilters,\n onClearFilters,\n pageSize,\n onPageSizeChange,\n}: AdminUsersFilterBarProps) {\n const { t } = useTranslation();\n\n return (\n <div className=\"flex flex-wrap items-center justify-between gap-tinyrack-md px-tinyrack-xl\">\n <div className=\"flex flex-wrap items-center gap-tinyrack-sm\">\n <TRText color=\"muted\" variant=\"bodySm\">\n {t('admin.users.showingRange', {\n from: pageStart,\n to: pageEnd,\n total,\n })}\n </TRText>\n {query ? (\n <TRBadge uiSize=\"md\" variant=\"neutral\">\n {t('admin.users.queryChip', { query })}\n </TRBadge>\n ) : null}\n {includeDeleted ? (\n <TRBadge uiSize=\"md\" variant=\"warning\">\n {t('admin.users.includeDeleted')}\n </TRBadge>\n ) : null}\n {activeQuickFilter !== 'all' ? (\n <TRBadge uiSize=\"md\">\n {t(`admin.users.filter.${activeQuickFilter}`)}\n </TRBadge>\n ) : null}\n {hasActiveFilters ? (\n <TRButton\n appearance=\"ghost\"\n onClick={onClearFilters}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.clearFilters')}\n </TRButton>\n ) : null}\n </div>\n\n <div className=\"flex items-center gap-tinyrack-sm\">\n <TRText color=\"muted\" variant=\"bodySm\">\n {t('admin.users.pageSize')}\n </TRText>\n <TRSelect.Root\n onValueChange={(value) => {\n if (typeof value === 'number') onPageSizeChange(value);\n }}\n value={pageSize}\n >\n <TRSelect.Trigger aria-label={t('admin.users.pageSize')} uiSize=\"sm\">\n <TRSelect.Value />\n </TRSelect.Trigger>\n <TRSelect.Portal>\n <TRSelect.Positioner>\n <TRSelect.Popup>\n <TRSelect.List>\n {PAGE_SIZES.map((size) => (\n <TRSelect.Item key={size} value={size}>\n <TRSelect.ItemText>{size}</TRSelect.ItemText>\n <TRSelect.ItemIndicator>\n <CheckIcon />\n </TRSelect.ItemIndicator>\n </TRSelect.Item>\n ))}\n </TRSelect.List>\n </TRSelect.Popup>\n </TRSelect.Positioner>\n </TRSelect.Portal>\n </TRSelect.Root>\n </div>\n </div>\n );\n}\n","import { TRAlert } from '@tinyrack/ui/components/alert';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { CheckIcon, TriangleAlertIcon, XIcon } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport type { NoticeState } from '#frontend/features/admin/users/admin-users-filters.ts';\n\ntype AdminUsersNoticeProps = {\n notice: NonNullable<NoticeState>;\n onDismiss: () => void;\n};\n\n/**\n * Result of the last create/update/delete.\n *\n * Stays an inline banner rather than becoming a toast now that the shell\n * mounts a viewport: Base UI renders toasts as `dialog`/`alertdialog` inside a\n * `region`, never as a live `status`, so a toast would silently drop the\n * polite announcement this makes.\n */\nexport function AdminUsersNotice({ notice, onDismiss }: AdminUsersNoticeProps) {\n const { t } = useTranslation();\n const isSuccess = notice.tone === 'success';\n\n return (\n <TRAlert.Root\n aria-live={isSuccess ? 'polite' : 'assertive'}\n role={isSuccess ? 'status' : 'alert'}\n variant={isSuccess ? 'success' : 'danger'}\n >\n {isSuccess ? (\n <CheckIcon aria-hidden className=\"size-tinyrack-xl\" />\n ) : (\n <TriangleAlertIcon aria-hidden className=\"size-tinyrack-xl\" />\n )}\n <TRAlert.Title>{notice.message}</TRAlert.Title>\n <TRButton\n appearance=\"ghost\"\n aria-label={t('common.close')}\n className=\"ms-auto\"\n onClick={onDismiss}\n type=\"button\"\n uiSize=\"sm\"\n >\n <XIcon aria-hidden className=\"size-tinyrack-lg\" />\n </TRButton>\n </TRAlert.Root>\n );\n}\n","import { useTranslation } from 'react-i18next';\nimport { AdminStat } from '#frontend/features/admin/admin-stat.tsx';\n\ntype AdminUsersSummaryProps = {\n active: number;\n config: number;\n database: number;\n};\n\n/** Counts for the page currently in view, not the whole directory. */\nexport function AdminUsersSummary({\n active,\n config,\n database,\n}: AdminUsersSummaryProps) {\n const { t } = useTranslation();\n const hint = t('admin.users.currentPage');\n\n return (\n <div className=\"flex flex-col overflow-hidden rounded-tinyrack-lg border border-tinyrack-border bg-tinyrack-surface shadow-tinyrack-raised lg:flex-row lg:divide-x lg:divide-tinyrack-border\">\n <AdminStat\n hint={hint}\n label={t('admin.users.activeOnPage')}\n value={active}\n />\n <AdminStat\n hint={hint}\n label={t('admin.users.configOnPage')}\n value={config}\n />\n <AdminStat\n hint={hint}\n label={t('admin.users.databaseOnPage')}\n value={database}\n />\n </div>\n );\n}\n","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-body.tsx\nfunction TRTableBody({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"tbody\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-body\", className)\n\t});\n}\n//#endregion\nexport { TRTableBody };\n\n//# sourceMappingURL=table-body.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-caption.tsx\nfunction TRTableCaption({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"caption\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-caption\", className)\n\t});\n}\n//#endregion\nexport { TRTableCaption };\n\n//# sourceMappingURL=table-caption.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-cell.tsx\nfunction TRTableCell({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"td\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-cell\", className)\n\t});\n}\n//#endregion\nexport { TRTableCell };\n\n//# sourceMappingURL=table-cell.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-footer.tsx\nfunction TRTableFooter({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"tfoot\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-footer\", className)\n\t});\n}\n//#endregion\nexport { TRTableFooter };\n\n//# sourceMappingURL=table-footer.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-head.tsx\nfunction TRTableHead({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"th\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-head\", className)\n\t});\n}\n//#endregion\nexport { TRTableHead };\n\n//# sourceMappingURL=table-head.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-header.tsx\nfunction TRTableHeader({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"thead\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-header\", className)\n\t});\n}\n//#endregion\nexport { TRTableHeader };\n\n//# sourceMappingURL=table-header.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-root.tsx\nfunction TRTableRoot({ className, containerClassName, containerProps, containerRef, density = \"comfortable\", striped = false, ...props }) {\n\tconst { className: containerPropsClassName, ref: containerPropsRef, ...restContainerProps } = containerProps ?? {};\n\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\t...restContainerProps,\n\t\tclassName: mergeClassNames(\"tr-table-container\", containerClassName, containerPropsClassName),\n\t\tref: containerRef ?? containerPropsRef,\n\t\tchildren: /* @__PURE__ */ jsx(\"table\", {\n\t\t\t...props,\n\t\t\tclassName: mergeClassNames(\"tr-table\", className),\n\t\t\t\"data-density\": density,\n\t\t\t\"data-striped\": striped ? \"true\" : void 0\n\t\t})\n\t});\n}\n//#endregion\nexport { TRTableRoot };\n\n//# sourceMappingURL=table-root.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-row.tsx\nfunction TRTableRow({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"tr\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-row\", className)\n\t});\n}\n//#endregion\nexport { TRTableRow };\n\n//# sourceMappingURL=table-row.js.map","import { TRTableBody } from \"./table-body.js\";\nimport { TRTableCaption } from \"./table-caption.js\";\nimport { TRTableCell } from \"./table-cell.js\";\nimport { TRTableFooter } from \"./table-footer.js\";\nimport { TRTableHead } from \"./table-head.js\";\nimport { TRTableHeader } from \"./table-header.js\";\nimport { TRTableRoot } from \"./table-root.js\";\nimport { TRTableRow } from \"./table-row.js\";\n//#region src/components/table/index.tsx\nconst TRTable = {\n\tRoot: TRTableRoot,\n\tCaption: TRTableCaption,\n\tHeader: TRTableHeader,\n\tBody: TRTableBody,\n\tFooter: TRTableFooter,\n\tRow: TRTableRow,\n\tHead: TRTableHead,\n\tCell: TRTableCell\n};\n//#endregion\nexport { TRTable, TRTableBody, TRTableCaption, TRTableCell, TRTableFooter, TRTableHead, TRTableHeader, TRTableRoot, TRTableRow };\n\n//# sourceMappingURL=index.js.map","import { TRBadge } from '@tinyrack/ui/components/badge';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRTable } from '@tinyrack/ui/components/table';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { useTranslation } from 'react-i18next';\nimport {\n formatAdminRole,\n formatManagedBy,\n} from '#frontend/features/admin/format-admin-user.ts';\nimport type { AdminUser } from '#frontend/queries/admin-users.ts';\n\ntype AdminUsersTableProps = {\n users: AdminUser[];\n onEdit: (user: AdminUser) => void;\n onDelete: (user: AdminUser) => void;\n};\n\nexport function AdminUsersTable({\n users,\n onEdit,\n onDelete,\n}: AdminUsersTableProps) {\n const { t } = useTranslation();\n\n return (\n <div className=\"overflow-x-auto pb-tinyrack-sm\">\n <TRTable.Root density=\"compact\" striped>\n <TRTable.Header>\n <TRTable.Row>\n <TRTable.Head>{t('profile.email.label')}</TRTable.Head>\n <TRTable.Head>{t('admin.users.role')}</TRTable.Head>\n <TRTable.Head>{t('admin.users.source')}</TRTable.Head>\n <TRTable.Head>{t('admin.users.emailVerified')}</TRTable.Head>\n <TRTable.Head>{t('admin.users.secondFactor')}</TRTable.Head>\n <TRTable.Head>{t('admin.users.status')}</TRTable.Head>\n <TRTable.Head>{t('admin.users.actions')}</TRTable.Head>\n </TRTable.Row>\n </TRTable.Header>\n <TRTable.Body>\n {users.map((managedUser) => (\n <TRTable.Row key={managedUser.sub}>\n <TRTable.Cell>\n <div className=\"flex flex-col gap-tinyrack-3xs\">\n <TRText as=\"div\" variant=\"bodySm\" weight=\"medium\">\n {managedUser.email}\n </TRText>\n {/*\n Mono on a bare span: a font utility on `TRText` loses to\n the component's own per-variant `font-family` rule.\n */}\n <TRText\n as=\"div\"\n className=\"max-w-tinyrack-measure-lg\"\n color=\"muted\"\n truncate\n variant=\"caption\"\n >\n <span className=\"font-tinyrack-mono\">\n {managedUser.sub}\n </span>\n </TRText>\n </div>\n </TRTable.Cell>\n {/*\n `whitespace-nowrap` on every badge: without it a narrow\n viewport squeezes these columns until the labels break one\n letter per line. Keeping them intact makes the table wider\n than the phone, which is what the horizontal scroller below\n is for.\n */}\n <TRTable.Cell>\n <TRBadge\n className=\"whitespace-nowrap\"\n uiSize=\"md\"\n variant={managedUser.role === 'admin' ? 'neutral' : undefined}\n >\n {formatAdminRole(t, managedUser.role)}\n </TRBadge>\n </TRTable.Cell>\n <TRTable.Cell>\n <TRBadge\n className=\"whitespace-nowrap\"\n uiSize=\"md\"\n variant={\n managedUser.managed_by === 'config' ? 'warning' : 'info'\n }\n >\n {formatManagedBy(t, managedUser.managed_by)}\n </TRBadge>\n </TRTable.Cell>\n <TRTable.Cell>\n {managedUser.email_verified ? t('common.yes') : t('common.no')}\n </TRTable.Cell>\n <TRTable.Cell>\n {managedUser.totp_registered\n ? t('admin.users.secondFactorTotp')\n : managedUser.passkey_count > 0\n ? t(\n managedUser.passkey_count === 1\n ? 'admin.users.secondFactorPasskey'\n : 'admin.users.secondFactorPasskeys',\n { count: managedUser.passkey_count },\n )\n : t('common.none')}\n </TRTable.Cell>\n <TRTable.Cell>\n {/*\n `variant` here is a test contract: the directory test reads\n `[data-variant=\"success\"]` out of the row to assert the\n status. Changing these tones breaks it.\n */}\n <TRBadge\n className=\"whitespace-nowrap\"\n uiSize=\"md\"\n variant={managedUser.deleted_at ? 'danger' : 'success'}\n >\n {managedUser.deleted_at\n ? t('admin.users.deleted')\n : t('admin.users.active')}\n </TRBadge>\n </TRTable.Cell>\n <TRTable.Cell>\n {managedUser.managed_by === 'database' &&\n !managedUser.deleted_at ? (\n <div className=\"inline-flex items-center whitespace-nowrap rounded-tinyrack-md border border-tinyrack-border bg-tinyrack-surface-muted\">\n <TRButton\n appearance=\"ghost\"\n aria-label={t('admin.users.editUser', {\n email: managedUser.email,\n })}\n onClick={() => onEdit(managedUser)}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.edit')}\n </TRButton>\n <TRButton\n appearance=\"outline\"\n aria-label={t('admin.users.deleteUser', {\n email: managedUser.email,\n })}\n intent=\"danger\"\n onClick={() => onDelete(managedUser)}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.delete')}\n </TRButton>\n </div>\n ) : (\n <TRBadge className=\"whitespace-nowrap\" uiSize=\"md\">\n {t('admin.users.readonly')}\n </TRBadge>\n )}\n </TRTable.Cell>\n </TRTable.Row>\n ))}\n {users.length === 0 ? (\n <TRTable.Row>\n <TRTable.Cell\n className=\"py-tinyrack-3xl text-center text-tinyrack-text-muted\"\n colSpan={7}\n >\n {t('admin.users.emptyFiltered')}\n </TRTable.Cell>\n </TRTable.Row>\n ) : null}\n </TRTable.Body>\n </TRTable.Root>\n </div>\n );\n}\n","import { TRButton } from '@tinyrack/ui/components/button';\nimport { TRCard } from '@tinyrack/ui/components/card';\nimport { TRCheckbox } from '@tinyrack/ui/components/checkbox';\nimport { TRField } from '@tinyrack/ui/components/field';\nimport { TRInput } from '@tinyrack/ui/components/input';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { PlusIcon, SearchIcon, UsersIcon } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport type { QuickFilter } from '#frontend/features/admin/users/admin-users-filters.ts';\n\ntype AdminUsersToolbarProps = {\n total: number;\n draftQuery: string;\n onDraftQueryChange: (value: string) => void;\n draftIncludeDeleted: boolean;\n onDraftIncludeDeletedChange: (value: boolean) => void;\n onSearch: () => void;\n onCreate: () => void;\n activeQuickFilter: QuickFilter;\n onQuickFilter: (filter: QuickFilter) => void;\n};\n\nconst QUICK_FILTERS: QuickFilter[] = ['all', 'database', 'config', 'admins'];\n\nexport function AdminUsersToolbar({\n total,\n draftQuery,\n onDraftQueryChange,\n draftIncludeDeleted,\n onDraftIncludeDeletedChange,\n onSearch,\n onCreate,\n activeQuickFilter,\n onQuickFilter,\n}: AdminUsersToolbarProps) {\n const { t } = useTranslation();\n\n return (\n <div className=\"flex flex-col gap-tinyrack-lg border-tinyrack-border border-b-tinyrack-default bg-tinyrack-surface-muted p-tinyrack-xl xl:flex-row xl:items-end xl:justify-between\">\n <div className=\"flex flex-col gap-tinyrack-sm\">\n <div className=\"flex items-center gap-tinyrack-sm\">\n <UsersIcon\n aria-hidden\n className=\"size-tinyrack-lg text-tinyrack-success-foreground\"\n />\n <TRText color=\"muted\" variant=\"label\">\n {t('admin.users.directoryEyebrow')}\n </TRText>\n </div>\n <TRCard.Title>{t('admin.users.directory')}</TRCard.Title>\n <TRCard.Description className=\"text-tinyrack-sm\">\n {t('admin.users.total', { count: total })}\n </TRCard.Description>\n </div>\n\n <div className=\"flex flex-col gap-tinyrack-md xl:items-end\">\n <div className=\"flex flex-col gap-tinyrack-sm lg:flex-row lg:items-center\">\n <TRInput\n aria-label={t('admin.users.searchPlaceholder')}\n className=\"w-full lg:w-tinyrack-overlay-width-sm\"\n onChange={(event) => onDraftQueryChange(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') onSearch();\n }}\n placeholder={t('admin.users.searchPlaceholder')}\n type=\"search\"\n uiSize=\"sm\"\n value={draftQuery}\n />\n\n {/*\n `aria-label` rather than relying on the label association: the\n design system's checkbox is a `button[role=checkbox]`, and the\n accessible-name path through `Field.Label` for a non-input control\n is not something to gamble a test contract on.\n */}\n <TRField.Root>\n <div className=\"flex items-center gap-tinyrack-sm rounded-tinyrack-md border border-tinyrack-border bg-tinyrack-surface px-tinyrack-md py-tinyrack-sm\">\n <TRCheckbox.Root\n aria-label={t('admin.users.includeDeleted')}\n checked={draftIncludeDeleted}\n onCheckedChange={(checked) =>\n onDraftIncludeDeletedChange(checked === true)\n }\n uiSize=\"md\"\n >\n <TRCheckbox.Indicator />\n </TRCheckbox.Root>\n <TRField.Label className=\"cursor-pointer\">\n {t('admin.users.includeDeleted')}\n </TRField.Label>\n </div>\n </TRField.Root>\n\n <TRButton\n appearance=\"outline\"\n onClick={onSearch}\n type=\"button\"\n uiSize=\"sm\"\n >\n <SearchIcon aria-hidden className=\"size-tinyrack-lg\" />\n {t('admin.users.search')}\n </TRButton>\n <TRButton\n intent=\"primary\"\n onClick={onCreate}\n type=\"button\"\n uiSize=\"sm\"\n >\n <PlusIcon aria-hidden className=\"size-tinyrack-lg\" />\n {t('admin.users.create')}\n </TRButton>\n </div>\n\n <div className=\"inline-flex items-center gap-tinyrack-3xs rounded-tinyrack-md border border-tinyrack-border bg-tinyrack-surface-muted p-tinyrack-xs\">\n {QUICK_FILTERS.map((filter) => (\n <TRButton\n appearance={activeQuickFilter === filter ? 'solid' : 'ghost'}\n intent={activeQuickFilter === filter ? 'primary' : undefined}\n key={filter}\n onClick={() => onQuickFilter(filter)}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t(`admin.users.filter.${filter}`)}\n </TRButton>\n ))}\n </div>\n </div>\n </div>\n );\n}\n","import {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from '@tanstack/react-query';\nimport { createFileRoute, redirect } from '@tanstack/react-router';\nimport { TRBadge } from '@tinyrack/ui/components/badge';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRCard } from '@tinyrack/ui/components/card';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { AdminGateScreen } from '#frontend/features/admin/admin-gate-screen.tsx';\nimport { AdminShell } from '#frontend/features/admin/admin-shell.tsx';\nimport { AdminUserFormModal } from '#frontend/features/admin/users/admin-user-form-modal.tsx';\nimport { AdminUsersFilterBar } from '#frontend/features/admin/users/admin-users-filter-bar.tsx';\nimport {\n getActiveQuickFilter,\n type NoticeState,\n type QuickFilter,\n type UserModalState,\n} from '#frontend/features/admin/users/admin-users-filters.ts';\nimport { AdminUsersNotice } from '#frontend/features/admin/users/admin-users-notice.tsx';\nimport { AdminUsersSummary } from '#frontend/features/admin/users/admin-users-summary.tsx';\nimport { AdminUsersTable } from '#frontend/features/admin/users/admin-users-table.tsx';\nimport { AdminUsersToolbar } from '#frontend/features/admin/users/admin-users-toolbar.tsx';\nimport {\n adminUsersQueryOptions,\n createAdminUser,\n deleteAdminUser,\n normalizeAdminUsersQuery,\n updateAdminUser,\n} from '#frontend/queries/admin-users.ts';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\nimport type { SessionUser } from '#frontend/queries/session.ts';\n\nexport const Route = createFileRoute('/admin/users/')({\n component: AdminUsersPage,\n beforeLoad: async ({ context }) => {\n if (!context.user) {\n throw redirect({ to: '/login' });\n }\n },\n});\n\nfunction AdminUsersPage() {\n const user = Route.useRouteContext({ select: (context) => context.user });\n\n if (user?.role !== 'admin') {\n return <AdminGateScreen reason=\"access-required\" />;\n }\n\n return <AdminUsersGate user={user} />;\n}\n\nfunction AdminUsersGate({ user }: { user: SessionUser }) {\n const { data: config } = useSuspenseQuery(appConfigQueryOptions);\n if (!config.admin.enabled) {\n return <AdminGateScreen reason=\"console-disabled\" />;\n }\n return <AdminUsersContent user={user} />;\n}\n\nfunction AdminUsersContent({ user }: { user: SessionUser }) {\n const { t } = useTranslation();\n const queryClient = useQueryClient();\n const [draftQuery, setDraftQuery] = useState('');\n const [draftIncludeDeleted, setDraftIncludeDeleted] = useState(false);\n const [filters, setFilters] = useState(() => normalizeAdminUsersQuery());\n const [notice, setNotice] = useState<NoticeState>(null);\n const [modal, setModal] = useState<UserModalState>(null);\n const { data } = useSuspenseQuery(adminUsersQueryOptions(filters));\n\n const activeUsers = data.users.filter(\n (managedUser) => !managedUser.deleted_at,\n ).length;\n const configUsers = data.users.filter(\n (managedUser) => managedUser.managed_by === 'config',\n ).length;\n const databaseUsers = data.users.filter(\n (managedUser) => managedUser.managed_by === 'database',\n ).length;\n const activeQuickFilter = getActiveQuickFilter(filters);\n const hasActiveFilters =\n filters.query !== '' ||\n filters.includeDeleted ||\n filters.managedBy !== undefined ||\n filters.role !== undefined;\n const pageStart =\n data.pagination.total === 0\n ? 0\n : (data.pagination.page - 1) * data.pagination.page_size + 1;\n const pageEnd = Math.min(\n data.pagination.page * data.pagination.page_size,\n data.pagination.total,\n );\n\n const noticeOn = (message: string) => setNotice({ tone: 'success', message });\n const noticeFail = () =>\n setNotice({ tone: 'error', message: t('admin.users.operationFailed') });\n\n const createMutation = useMutation({\n mutationFn: createAdminUser,\n onSuccess: ({ user: nextUser }) => {\n void queryClient.invalidateQueries({ queryKey: ['admin', 'users'] });\n noticeOn(t('admin.users.createdNotice', { email: nextUser.email }));\n setModal(null);\n },\n onError: noticeFail,\n });\n\n const updateMutation = useMutation({\n mutationFn: updateAdminUser,\n onSuccess: ({ user: nextUser }) => {\n void queryClient.invalidateQueries({ queryKey: ['admin', 'users'] });\n noticeOn(t('admin.users.updatedNotice', { email: nextUser.email }));\n setModal(null);\n },\n onError: noticeFail,\n });\n\n const deleteMutation = useMutation({\n mutationFn: deleteAdminUser,\n onSuccess: ({ user: nextUser }) => {\n void queryClient.invalidateQueries({ queryKey: ['admin', 'users'] });\n noticeOn(t('admin.users.deletedNotice', { email: nextUser.email }));\n setModal(null);\n },\n onError: noticeFail,\n });\n\n const isMutating =\n createMutation.isPending ||\n updateMutation.isPending ||\n deleteMutation.isPending;\n\n const applySearch = () => {\n setFilters((current) => ({\n ...current,\n query: draftQuery.trim(),\n includeDeleted: draftIncludeDeleted,\n page: 1,\n }));\n };\n\n const clearFilters = () => {\n setDraftQuery('');\n setDraftIncludeDeleted(false);\n setFilters(normalizeAdminUsersQuery());\n };\n\n const applyQuickFilter = (nextFilter: QuickFilter) => {\n setFilters((current) => ({\n ...current,\n page: 1,\n managedBy:\n nextFilter === 'database'\n ? 'database'\n : nextFilter === 'config'\n ? 'config'\n : undefined,\n role: nextFilter === 'admins' ? 'admin' : undefined,\n }));\n };\n\n return (\n <AdminShell\n current=\"users\"\n description={t('admin.users.description')}\n title={t('admin.users.title')}\n user={user}\n >\n <AdminUsersSummary\n active={activeUsers}\n config={configUsers}\n database={databaseUsers}\n />\n\n {notice ? (\n <AdminUsersNotice notice={notice} onDismiss={() => setNotice(null)} />\n ) : null}\n\n <TRCard.Root\n className=\"overflow-hidden shadow-tinyrack-raised\"\n data-testid=\"admin-users-directory\"\n variant=\"outlined\"\n >\n <TRCard.Content className=\"gap-tinyrack-lg p-0\">\n <AdminUsersToolbar\n activeQuickFilter={activeQuickFilter}\n draftIncludeDeleted={draftIncludeDeleted}\n draftQuery={draftQuery}\n onCreate={() => setModal({ type: 'create' })}\n onDraftIncludeDeletedChange={setDraftIncludeDeleted}\n onDraftQueryChange={setDraftQuery}\n onQuickFilter={applyQuickFilter}\n onSearch={applySearch}\n total={data.pagination.total}\n />\n\n <AdminUsersFilterBar\n activeQuickFilter={activeQuickFilter}\n hasActiveFilters={hasActiveFilters}\n includeDeleted={filters.includeDeleted}\n onClearFilters={clearFilters}\n onPageSizeChange={(pageSize) =>\n setFilters((current) => ({ ...current, page: 1, pageSize }))\n }\n pageEnd={pageEnd}\n pageSize={filters.pageSize}\n pageStart={pageStart}\n query={filters.query}\n total={data.pagination.total}\n />\n\n <AdminUsersTable\n onDelete={(managedUser) =>\n setModal({ type: 'delete', user: managedUser })\n }\n onEdit={(managedUser) =>\n setModal({ type: 'edit', user: managedUser })\n }\n users={data.users}\n />\n\n <div className=\"flex items-center justify-between border-tinyrack-border border-t-tinyrack-default bg-tinyrack-surface-muted p-tinyrack-lg\">\n <TRButton\n appearance=\"outline\"\n disabled={filters.page <= 1}\n onClick={() =>\n setFilters((current) => ({\n ...current,\n page: current.page - 1,\n }))\n }\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.previous')}\n </TRButton>\n <TRBadge uiSize=\"md\">\n {t('admin.users.page', { page: data.pagination.page })}\n </TRBadge>\n <TRButton\n appearance=\"outline\"\n disabled={\n data.pagination.page * data.pagination.page_size >=\n data.pagination.total\n }\n onClick={() =>\n setFilters((current) => ({\n ...current,\n page: current.page + 1,\n }))\n }\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.next')}\n </TRButton>\n </div>\n </TRCard.Content>\n </TRCard.Root>\n\n <AdminUserFormModal\n isMutating={isMutating}\n modal={modal}\n onClose={() => setModal(null)}\n onCreate={(values) => createMutation.mutate(values)}\n onDelete={(sub) => deleteMutation.mutate(sub)}\n onUpdate={(values) => updateMutation.mutate(values)}\n />\n </AdminShell>\n );\n}\n"],"x_google_ignoreList":[0,6,7,8,9,10,11,12,13,14],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"users-DqCnblEo.js","names":["useMutation","useQueryClient","useSuspenseQuery","TRBadge","TRButton","TRCard","useState","useTranslation","AdminGateScreen","AdminShell","AdminUserFormModal","AdminUsersFilterBar","getActiveQuickFilter","AdminUsersNotice","AdminUsersSummary","AdminUsersTable","AdminUsersToolbar","adminUsersQueryOptions","createAdminUser","deleteAdminUser","normalizeAdminUsersQuery","updateAdminUser","appConfigQueryOptions","Route","AdminUsersPage","user","useRouteContext","select","context","role","AdminUsersGate","SessionUser","data","config","admin","enabled","AdminUsersContent","t","queryClient","draftQuery","setDraftQuery","draftIncludeDeleted","setDraftIncludeDeleted","filters","setFilters","notice","setNotice","NoticeState","modal","setModal","UserModalState","activeUsers","users","filter","managedUser","deleted_at","length","configUsers","managed_by","databaseUsers","activeQuickFilter","hasActiveFilters","query","includeDeleted","managedBy","undefined","pageStart","pagination","total","page","page_size","pageEnd","Math","min","noticeOn","message","tone","noticeFail","createMutation","mutationFn","onSuccess","nextUser","invalidateQueries","queryKey","email","onError","updateMutation","deleteMutation","isMutating","isPending","applySearch","current","trim","clearFilters","applyQuickFilter","nextFilter","QuickFilter","type","pageSize","values","mutate","sub","component"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/search.mjs","../../../frontend/src/features/admin/users/admin-users-filters.ts","../../../frontend/src/features/admin/users/admin-user-form-modal.tsx","../../../frontend/src/features/admin/users/admin-users-filter-bar.tsx","../../../frontend/src/features/admin/users/admin-users-notice.tsx","../../../frontend/src/features/admin/users/admin-users-summary.tsx","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.1_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/table/table-body.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.1_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/table/table-caption.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.1_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/table/table-cell.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.1_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/table/table-footer.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.1_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/table/table-head.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.1_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/table/table-header.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.1_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/table/table-root.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.1_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/table/table-row.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.1_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/table/index.js","../../../frontend/src/features/admin/users/admin-users-table.tsx","../../../frontend/src/features/admin/users/admin-users-toolbar.tsx","../../../frontend/src/routes/admin/users/index.tsx?tsr-split=component"],"sourcesContent":["/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n];\nconst Search = createLucideIcon(\"search\", __iconNode);\n\nexport { __iconNode, Search as default };\n//# sourceMappingURL=search.mjs.map\n","import type {\n AdminUser,\n normalizeAdminUsersQuery,\n} from '#frontend/queries/admin-users.ts';\n\nexport type QuickFilter = 'all' | 'database' | 'config' | 'admins';\n\nexport type NoticeState = {\n tone: 'success' | 'error';\n message: string;\n} | null;\n\nexport type UserModalState =\n | { type: 'create' }\n | { type: 'edit'; user: AdminUser }\n | { type: 'delete'; user: AdminUser }\n | null;\n\nexport function parseUserRole(\n value: FormDataEntryValue | null,\n): 'user' | 'admin' {\n return value === 'admin' ? 'admin' : 'user';\n}\n\nexport function getActiveQuickFilter(\n filters: ReturnType<typeof normalizeAdminUsersQuery>,\n): QuickFilter {\n if (filters.role === 'admin') return 'admins';\n if (filters.managedBy === 'database') return 'database';\n if (filters.managedBy === 'config') return 'config';\n return 'all';\n}\n","import { TRButton } from '@tinyrack/ui/components/button';\nimport { TRCheckbox } from '@tinyrack/ui/components/checkbox';\nimport { TRField } from '@tinyrack/ui/components/field';\nimport { TRInput } from '@tinyrack/ui/components/input';\nimport { TRSelect } from '@tinyrack/ui/components/select';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { CheckIcon, TriangleAlertIcon } from 'lucide-react';\nimport type { FormEvent } from 'react';\nimport { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Modal, ModalActions } from '#frontend/components/ui/modal.tsx';\nimport {\n parseUserRole,\n type UserModalState,\n} from '#frontend/features/admin/users/admin-users-filters.ts';\n\ntype AdminUserFormModalProps = {\n modal: UserModalState;\n isMutating: boolean;\n onClose: () => void;\n onCreate: (values: {\n email: string;\n password: string;\n role: 'user' | 'admin';\n email_verified: boolean;\n }) => void;\n onUpdate: (values: {\n sub: string;\n email: string;\n role: 'user' | 'admin';\n email_verified: boolean;\n }) => void;\n onDelete: (sub: string) => void;\n};\n\nexport function AdminUserFormModal({\n modal,\n isMutating,\n onClose,\n onCreate,\n onUpdate,\n onDelete,\n}: AdminUserFormModalProps) {\n const { t } = useTranslation();\n const defaultValues = useMemo(\n () => (modal?.type === 'edit' ? modal.user : null),\n [modal],\n );\n\n if (!modal) return null;\n\n if (modal.type === 'delete') {\n return (\n <Modal\n isOpen\n onClose={onClose}\n title={t('admin.users.deleteTitle', { email: modal.user.email })}\n variant=\"destructive\"\n >\n <div className=\"flex flex-col gap-tinyrack-xs rounded-tinyrack-md border border-tinyrack-danger-border bg-tinyrack-danger-surface p-tinyrack-lg text-tinyrack-danger-foreground\">\n <div className=\"flex items-center gap-tinyrack-sm\">\n <TriangleAlertIcon aria-hidden className=\"size-tinyrack-lg\" />\n <TRText as=\"p\" weight=\"medium\">\n {t('admin.users.deleteWarning')}\n </TRText>\n </div>\n <TRText as=\"p\" variant=\"bodySm\">\n {t('admin.users.deleteDescription')}\n </TRText>\n </div>\n <ModalActions>\n <TRButton\n disabled={isMutating}\n onClick={onClose}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.cancel')}\n </TRButton>\n <TRButton\n disabled={isMutating}\n intent=\"danger\"\n onClick={() => onDelete(modal.user.sub)}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.deleteConfirm')}\n </TRButton>\n </ModalActions>\n </Modal>\n );\n }\n\n const title =\n modal.type === 'create'\n ? t('admin.users.create')\n : t('admin.users.editTitle');\n const submit =\n modal.type === 'create'\n ? t('admin.users.createSubmit')\n : t('admin.users.save');\n\n const handleSubmit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const formData = new FormData(event.currentTarget);\n const values = {\n email: String(formData.get('email') ?? ''),\n role: parseUserRole(formData.get('role')),\n email_verified: formData.get('email_verified') === 'on',\n };\n if (modal.type === 'create') {\n onCreate({\n ...values,\n password: String(formData.get('password') ?? ''),\n });\n } else {\n onUpdate({ sub: modal.user.sub, ...values });\n }\n };\n\n return (\n <Modal\n description={\n modal.type === 'create'\n ? t('admin.users.createHint')\n : t('admin.users.editHint')\n }\n isOpen\n onClose={onClose}\n title={title}\n >\n <form\n className=\"mt-tinyrack-lg flex flex-col gap-tinyrack-lg\"\n onSubmit={handleSubmit}\n >\n <TRField.Root>\n <TRField.Label htmlFor=\"admin-user-email\">\n {t('profile.email.label')}\n </TRField.Label>\n <TRInput\n defaultValue={defaultValues?.email ?? ''}\n id=\"admin-user-email\"\n name=\"email\"\n required\n type=\"email\"\n uiSize=\"sm\"\n />\n </TRField.Root>\n\n {modal.type === 'create' ? (\n <TRField.Root>\n <TRField.Label htmlFor=\"admin-user-password\">\n {t('admin.users.password')}\n </TRField.Label>\n <TRInput\n id=\"admin-user-password\"\n name=\"password\"\n required\n type=\"password\"\n uiSize=\"sm\"\n />\n </TRField.Root>\n ) : null}\n\n <TRField.Root>\n <TRField.Label htmlFor=\"admin-user-role\">\n {t('admin.users.role')}\n </TRField.Label>\n <TRSelect.Root\n defaultValue={defaultValues?.role ?? 'user'}\n name=\"role\"\n >\n <TRSelect.Trigger id=\"admin-user-role\" uiSize=\"sm\">\n <TRSelect.Value />\n </TRSelect.Trigger>\n <TRSelect.Positioner>\n <TRSelect.Popup>\n <TRSelect.List>\n {['user', 'admin'].map((role) => (\n <TRSelect.Item key={role} value={role}>\n <TRSelect.ItemText>\n {t(\n `admin.users.role${role === 'user' ? 'User' : 'Admin'}`,\n )}\n </TRSelect.ItemText>\n <TRSelect.ItemIndicator>\n <CheckIcon aria-hidden />\n </TRSelect.ItemIndicator>\n </TRSelect.Item>\n ))}\n </TRSelect.List>\n </TRSelect.Popup>\n </TRSelect.Positioner>\n </TRSelect.Root>\n </TRField.Root>\n\n <TRField.Root>\n <div className=\"flex items-center gap-tinyrack-md rounded-tinyrack-md border border-tinyrack-border bg-tinyrack-surface px-tinyrack-md py-tinyrack-sm\">\n <TRCheckbox.Root\n aria-label={t('admin.users.emailVerified')}\n defaultChecked={defaultValues?.email_verified ?? false}\n name=\"email_verified\"\n uiSize=\"md\"\n value=\"on\"\n >\n <TRCheckbox.Indicator />\n </TRCheckbox.Root>\n <TRField.Label className=\"cursor-pointer\">\n {t('admin.users.emailVerified')}\n </TRField.Label>\n </div>\n </TRField.Root>\n\n <ModalActions>\n <TRButton\n disabled={isMutating}\n onClick={onClose}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.cancel')}\n </TRButton>\n <TRButton\n disabled={isMutating}\n intent=\"primary\"\n type=\"submit\"\n uiSize=\"sm\"\n >\n {submit}\n </TRButton>\n </ModalActions>\n </form>\n </Modal>\n );\n}\n","import { TRBadge } from '@tinyrack/ui/components/badge';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRSelect } from '@tinyrack/ui/components/select';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { CheckIcon } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport type { QuickFilter } from '#frontend/features/admin/users/admin-users-filters.ts';\n\ntype AdminUsersFilterBarProps = {\n pageStart: number;\n pageEnd: number;\n total: number;\n query: string;\n includeDeleted: boolean;\n activeQuickFilter: QuickFilter;\n hasActiveFilters: boolean;\n onClearFilters: () => void;\n pageSize: number;\n onPageSizeChange: (pageSize: number) => void;\n};\n\nconst PAGE_SIZES = [10, 20, 50];\n\n/** What the current result set is filtered by, and how much of it is shown. */\nexport function AdminUsersFilterBar({\n pageStart,\n pageEnd,\n total,\n query,\n includeDeleted,\n activeQuickFilter,\n hasActiveFilters,\n onClearFilters,\n pageSize,\n onPageSizeChange,\n}: AdminUsersFilterBarProps) {\n const { t } = useTranslation();\n\n return (\n <div className=\"flex flex-wrap items-center justify-between gap-tinyrack-md px-tinyrack-xl\">\n <div className=\"flex flex-wrap items-center gap-tinyrack-sm\">\n <TRText color=\"muted\" variant=\"bodySm\">\n {t('admin.users.showingRange', {\n from: pageStart,\n to: pageEnd,\n total,\n })}\n </TRText>\n {query ? (\n <TRBadge uiSize=\"md\" variant=\"neutral\">\n {t('admin.users.queryChip', { query })}\n </TRBadge>\n ) : null}\n {includeDeleted ? (\n <TRBadge uiSize=\"md\" variant=\"warning\">\n {t('admin.users.includeDeleted')}\n </TRBadge>\n ) : null}\n {activeQuickFilter !== 'all' ? (\n <TRBadge uiSize=\"md\">\n {t(`admin.users.filter.${activeQuickFilter}`)}\n </TRBadge>\n ) : null}\n {hasActiveFilters ? (\n <TRButton\n appearance=\"ghost\"\n onClick={onClearFilters}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.clearFilters')}\n </TRButton>\n ) : null}\n </div>\n\n <div className=\"flex items-center gap-tinyrack-sm\">\n <TRText color=\"muted\" variant=\"bodySm\">\n {t('admin.users.pageSize')}\n </TRText>\n <TRSelect.Root\n onValueChange={(value) => {\n if (typeof value === 'number') onPageSizeChange(value);\n }}\n value={pageSize}\n >\n <TRSelect.Trigger aria-label={t('admin.users.pageSize')} uiSize=\"sm\">\n <TRSelect.Value />\n </TRSelect.Trigger>\n <TRSelect.Portal>\n <TRSelect.Positioner>\n <TRSelect.Popup>\n <TRSelect.List>\n {PAGE_SIZES.map((size) => (\n <TRSelect.Item key={size} value={size}>\n <TRSelect.ItemText>{size}</TRSelect.ItemText>\n <TRSelect.ItemIndicator>\n <CheckIcon />\n </TRSelect.ItemIndicator>\n </TRSelect.Item>\n ))}\n </TRSelect.List>\n </TRSelect.Popup>\n </TRSelect.Positioner>\n </TRSelect.Portal>\n </TRSelect.Root>\n </div>\n </div>\n );\n}\n","import { TRAlert } from '@tinyrack/ui/components/alert';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { CheckIcon, TriangleAlertIcon, XIcon } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport type { NoticeState } from '#frontend/features/admin/users/admin-users-filters.ts';\n\ntype AdminUsersNoticeProps = {\n notice: NonNullable<NoticeState>;\n onDismiss: () => void;\n};\n\n/**\n * Result of the last create/update/delete.\n *\n * Stays an inline banner rather than becoming a toast now that the shell\n * mounts a viewport: Base UI renders toasts as `dialog`/`alertdialog` inside a\n * `region`, never as a live `status`, so a toast would silently drop the\n * polite announcement this makes.\n */\nexport function AdminUsersNotice({ notice, onDismiss }: AdminUsersNoticeProps) {\n const { t } = useTranslation();\n const isSuccess = notice.tone === 'success';\n\n return (\n <TRAlert.Root\n aria-live={isSuccess ? 'polite' : 'assertive'}\n role={isSuccess ? 'status' : 'alert'}\n variant={isSuccess ? 'success' : 'danger'}\n >\n {isSuccess ? (\n <CheckIcon aria-hidden className=\"size-tinyrack-xl\" />\n ) : (\n <TriangleAlertIcon aria-hidden className=\"size-tinyrack-xl\" />\n )}\n <TRAlert.Title>{notice.message}</TRAlert.Title>\n <TRButton\n appearance=\"ghost\"\n aria-label={t('common.close')}\n className=\"ms-auto\"\n onClick={onDismiss}\n type=\"button\"\n uiSize=\"sm\"\n >\n <XIcon aria-hidden className=\"size-tinyrack-lg\" />\n </TRButton>\n </TRAlert.Root>\n );\n}\n","import { useTranslation } from 'react-i18next';\nimport { AdminStat } from '#frontend/features/admin/admin-stat.tsx';\n\ntype AdminUsersSummaryProps = {\n active: number;\n config: number;\n database: number;\n};\n\n/** Counts for the page currently in view, not the whole directory. */\nexport function AdminUsersSummary({\n active,\n config,\n database,\n}: AdminUsersSummaryProps) {\n const { t } = useTranslation();\n const hint = t('admin.users.currentPage');\n\n return (\n <div className=\"flex flex-col overflow-hidden rounded-tinyrack-lg border border-tinyrack-border bg-tinyrack-surface shadow-tinyrack-raised lg:flex-row lg:divide-x lg:divide-tinyrack-border\">\n <AdminStat\n hint={hint}\n label={t('admin.users.activeOnPage')}\n value={active}\n />\n <AdminStat\n hint={hint}\n label={t('admin.users.configOnPage')}\n value={config}\n />\n <AdminStat\n hint={hint}\n label={t('admin.users.databaseOnPage')}\n value={database}\n />\n </div>\n );\n}\n","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-body.tsx\nfunction TRTableBody({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"tbody\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-body\", className)\n\t});\n}\n//#endregion\nexport { TRTableBody };\n\n//# sourceMappingURL=table-body.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-caption.tsx\nfunction TRTableCaption({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"caption\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-caption\", className)\n\t});\n}\n//#endregion\nexport { TRTableCaption };\n\n//# sourceMappingURL=table-caption.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-cell.tsx\nfunction TRTableCell({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"td\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-cell\", className)\n\t});\n}\n//#endregion\nexport { TRTableCell };\n\n//# sourceMappingURL=table-cell.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-footer.tsx\nfunction TRTableFooter({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"tfoot\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-footer\", className)\n\t});\n}\n//#endregion\nexport { TRTableFooter };\n\n//# sourceMappingURL=table-footer.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-head.tsx\nfunction TRTableHead({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"th\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-head\", className)\n\t});\n}\n//#endregion\nexport { TRTableHead };\n\n//# sourceMappingURL=table-head.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-header.tsx\nfunction TRTableHeader({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"thead\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-header\", className)\n\t});\n}\n//#endregion\nexport { TRTableHeader };\n\n//# sourceMappingURL=table-header.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-root.tsx\nfunction TRTableRoot({ className, containerClassName, containerProps, containerRef, density = \"comfortable\", striped = false, ...props }) {\n\tconst { className: containerPropsClassName, ref: containerPropsRef, ...restContainerProps } = containerProps ?? {};\n\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\t...restContainerProps,\n\t\tclassName: mergeClassNames(\"tr-table-container\", containerClassName, containerPropsClassName),\n\t\tref: containerRef ?? containerPropsRef,\n\t\tchildren: /* @__PURE__ */ jsx(\"table\", {\n\t\t\t...props,\n\t\t\tclassName: mergeClassNames(\"tr-table\", className),\n\t\t\t\"data-density\": density,\n\t\t\t\"data-striped\": striped ? \"true\" : void 0\n\t\t})\n\t});\n}\n//#endregion\nexport { TRTableRoot };\n\n//# sourceMappingURL=table-root.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/table/table-row.tsx\nfunction TRTableRow({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"tr\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-table-row\", className)\n\t});\n}\n//#endregion\nexport { TRTableRow };\n\n//# sourceMappingURL=table-row.js.map","import { TRTableBody } from \"./table-body.js\";\nimport { TRTableCaption } from \"./table-caption.js\";\nimport { TRTableCell } from \"./table-cell.js\";\nimport { TRTableFooter } from \"./table-footer.js\";\nimport { TRTableHead } from \"./table-head.js\";\nimport { TRTableHeader } from \"./table-header.js\";\nimport { TRTableRoot } from \"./table-root.js\";\nimport { TRTableRow } from \"./table-row.js\";\n//#region src/components/table/index.tsx\nconst TRTable = {\n\tRoot: TRTableRoot,\n\tCaption: TRTableCaption,\n\tHeader: TRTableHeader,\n\tBody: TRTableBody,\n\tFooter: TRTableFooter,\n\tRow: TRTableRow,\n\tHead: TRTableHead,\n\tCell: TRTableCell\n};\n//#endregion\nexport { TRTable, TRTableBody, TRTableCaption, TRTableCell, TRTableFooter, TRTableHead, TRTableHeader, TRTableRoot, TRTableRow };\n\n//# sourceMappingURL=index.js.map","import { TRBadge } from '@tinyrack/ui/components/badge';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRTable } from '@tinyrack/ui/components/table';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { useTranslation } from 'react-i18next';\nimport {\n formatAdminRole,\n formatManagedBy,\n} from '#frontend/features/admin/format-admin-user.ts';\nimport type { AdminUser } from '#frontend/queries/admin-users.ts';\n\ntype AdminUsersTableProps = {\n users: AdminUser[];\n onEdit: (user: AdminUser) => void;\n onDelete: (user: AdminUser) => void;\n};\n\nexport function AdminUsersTable({\n users,\n onEdit,\n onDelete,\n}: AdminUsersTableProps) {\n const { t } = useTranslation();\n\n return (\n <div className=\"overflow-x-auto pb-tinyrack-sm\">\n <TRTable.Root density=\"compact\" striped>\n <TRTable.Header>\n <TRTable.Row>\n <TRTable.Head>{t('profile.email.label')}</TRTable.Head>\n <TRTable.Head>{t('admin.users.role')}</TRTable.Head>\n <TRTable.Head>{t('admin.users.source')}</TRTable.Head>\n <TRTable.Head>{t('admin.users.emailVerified')}</TRTable.Head>\n <TRTable.Head>{t('admin.users.secondFactor')}</TRTable.Head>\n <TRTable.Head>{t('admin.users.status')}</TRTable.Head>\n <TRTable.Head>{t('admin.users.actions')}</TRTable.Head>\n </TRTable.Row>\n </TRTable.Header>\n <TRTable.Body>\n {users.map((managedUser) => (\n <TRTable.Row key={managedUser.sub}>\n <TRTable.Cell>\n <div className=\"flex flex-col gap-tinyrack-3xs\">\n <TRText as=\"div\" variant=\"bodySm\" weight=\"medium\">\n {managedUser.email}\n </TRText>\n {/*\n Mono on a bare span: a font utility on `TRText` loses to\n the component's own per-variant `font-family` rule.\n */}\n <TRText\n as=\"div\"\n className=\"max-w-tinyrack-measure-lg\"\n color=\"muted\"\n truncate\n variant=\"caption\"\n >\n <span className=\"font-tinyrack-mono\">\n {managedUser.sub}\n </span>\n </TRText>\n </div>\n </TRTable.Cell>\n {/*\n `whitespace-nowrap` on every badge: without it a narrow\n viewport squeezes these columns until the labels break one\n letter per line. Keeping them intact makes the table wider\n than the phone, which is what the horizontal scroller below\n is for.\n */}\n <TRTable.Cell>\n <TRBadge\n className=\"whitespace-nowrap\"\n uiSize=\"md\"\n variant={managedUser.role === 'admin' ? 'neutral' : undefined}\n >\n {formatAdminRole(t, managedUser.role)}\n </TRBadge>\n </TRTable.Cell>\n <TRTable.Cell>\n <TRBadge\n className=\"whitespace-nowrap\"\n uiSize=\"md\"\n variant={\n managedUser.managed_by === 'config' ? 'warning' : 'info'\n }\n >\n {formatManagedBy(t, managedUser.managed_by)}\n </TRBadge>\n </TRTable.Cell>\n <TRTable.Cell>\n {managedUser.email_verified ? t('common.yes') : t('common.no')}\n </TRTable.Cell>\n <TRTable.Cell>\n {managedUser.totp_registered\n ? t('admin.users.secondFactorTotp')\n : managedUser.passkey_count > 0\n ? t(\n managedUser.passkey_count === 1\n ? 'admin.users.secondFactorPasskey'\n : 'admin.users.secondFactorPasskeys',\n { count: managedUser.passkey_count },\n )\n : t('common.none')}\n </TRTable.Cell>\n <TRTable.Cell>\n {/*\n `variant` here is a test contract: the directory test reads\n `[data-variant=\"success\"]` out of the row to assert the\n status. Changing these tones breaks it.\n */}\n <TRBadge\n className=\"whitespace-nowrap\"\n uiSize=\"md\"\n variant={managedUser.deleted_at ? 'danger' : 'success'}\n >\n {managedUser.deleted_at\n ? t('admin.users.deleted')\n : t('admin.users.active')}\n </TRBadge>\n </TRTable.Cell>\n <TRTable.Cell>\n {managedUser.managed_by === 'database' &&\n !managedUser.deleted_at ? (\n <div className=\"inline-flex items-center whitespace-nowrap rounded-tinyrack-md border border-tinyrack-border bg-tinyrack-surface-muted\">\n <TRButton\n appearance=\"ghost\"\n aria-label={t('admin.users.editUser', {\n email: managedUser.email,\n })}\n onClick={() => onEdit(managedUser)}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.edit')}\n </TRButton>\n <TRButton\n appearance=\"outline\"\n aria-label={t('admin.users.deleteUser', {\n email: managedUser.email,\n })}\n intent=\"danger\"\n onClick={() => onDelete(managedUser)}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.delete')}\n </TRButton>\n </div>\n ) : (\n <TRBadge className=\"whitespace-nowrap\" uiSize=\"md\">\n {t('admin.users.readonly')}\n </TRBadge>\n )}\n </TRTable.Cell>\n </TRTable.Row>\n ))}\n {users.length === 0 ? (\n <TRTable.Row>\n <TRTable.Cell\n className=\"py-tinyrack-3xl text-center text-tinyrack-text-muted\"\n colSpan={7}\n >\n {t('admin.users.emptyFiltered')}\n </TRTable.Cell>\n </TRTable.Row>\n ) : null}\n </TRTable.Body>\n </TRTable.Root>\n </div>\n );\n}\n","import { TRButton } from '@tinyrack/ui/components/button';\nimport { TRCard } from '@tinyrack/ui/components/card';\nimport { TRCheckbox } from '@tinyrack/ui/components/checkbox';\nimport { TRField } from '@tinyrack/ui/components/field';\nimport { TRInput } from '@tinyrack/ui/components/input';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { PlusIcon, SearchIcon, UsersIcon } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport type { QuickFilter } from '#frontend/features/admin/users/admin-users-filters.ts';\n\ntype AdminUsersToolbarProps = {\n total: number;\n draftQuery: string;\n onDraftQueryChange: (value: string) => void;\n draftIncludeDeleted: boolean;\n onDraftIncludeDeletedChange: (value: boolean) => void;\n onSearch: () => void;\n onCreate: () => void;\n activeQuickFilter: QuickFilter;\n onQuickFilter: (filter: QuickFilter) => void;\n};\n\nconst QUICK_FILTERS: QuickFilter[] = ['all', 'database', 'config', 'admins'];\n\nexport function AdminUsersToolbar({\n total,\n draftQuery,\n onDraftQueryChange,\n draftIncludeDeleted,\n onDraftIncludeDeletedChange,\n onSearch,\n onCreate,\n activeQuickFilter,\n onQuickFilter,\n}: AdminUsersToolbarProps) {\n const { t } = useTranslation();\n\n return (\n <div className=\"flex flex-col gap-tinyrack-lg border-tinyrack-border border-b-tinyrack-default bg-tinyrack-surface-muted p-tinyrack-xl xl:flex-row xl:items-end xl:justify-between\">\n <div className=\"flex flex-col gap-tinyrack-sm\">\n <div className=\"flex items-center gap-tinyrack-sm\">\n <UsersIcon\n aria-hidden\n className=\"size-tinyrack-lg text-tinyrack-success-foreground\"\n />\n <TRText color=\"muted\" variant=\"label\">\n {t('admin.users.directoryEyebrow')}\n </TRText>\n </div>\n <TRCard.Title>{t('admin.users.directory')}</TRCard.Title>\n <TRCard.Description className=\"text-tinyrack-sm\">\n {t('admin.users.total', { count: total })}\n </TRCard.Description>\n </div>\n\n <div className=\"flex flex-col gap-tinyrack-md xl:items-end\">\n <div className=\"flex flex-col gap-tinyrack-sm lg:flex-row lg:items-center\">\n <TRInput\n aria-label={t('admin.users.searchPlaceholder')}\n className=\"w-full lg:w-tinyrack-overlay-width-sm\"\n onChange={(event) => onDraftQueryChange(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') onSearch();\n }}\n placeholder={t('admin.users.searchPlaceholder')}\n type=\"search\"\n uiSize=\"sm\"\n value={draftQuery}\n />\n\n {/*\n `aria-label` rather than relying on the label association: the\n design system's checkbox is a `button[role=checkbox]`, and the\n accessible-name path through `Field.Label` for a non-input control\n is not something to gamble a test contract on.\n */}\n <TRField.Root>\n <div className=\"flex items-center gap-tinyrack-sm rounded-tinyrack-md border border-tinyrack-border bg-tinyrack-surface px-tinyrack-md py-tinyrack-sm\">\n <TRCheckbox.Root\n aria-label={t('admin.users.includeDeleted')}\n checked={draftIncludeDeleted}\n onCheckedChange={(checked) =>\n onDraftIncludeDeletedChange(checked === true)\n }\n uiSize=\"md\"\n >\n <TRCheckbox.Indicator />\n </TRCheckbox.Root>\n <TRField.Label className=\"cursor-pointer\">\n {t('admin.users.includeDeleted')}\n </TRField.Label>\n </div>\n </TRField.Root>\n\n <TRButton\n appearance=\"outline\"\n onClick={onSearch}\n type=\"button\"\n uiSize=\"sm\"\n >\n <SearchIcon aria-hidden className=\"size-tinyrack-lg\" />\n {t('admin.users.search')}\n </TRButton>\n <TRButton\n intent=\"primary\"\n onClick={onCreate}\n type=\"button\"\n uiSize=\"sm\"\n >\n <PlusIcon aria-hidden className=\"size-tinyrack-lg\" />\n {t('admin.users.create')}\n </TRButton>\n </div>\n\n <div className=\"inline-flex items-center gap-tinyrack-3xs rounded-tinyrack-md border border-tinyrack-border bg-tinyrack-surface-muted p-tinyrack-xs\">\n {QUICK_FILTERS.map((filter) => (\n <TRButton\n appearance={activeQuickFilter === filter ? 'solid' : 'ghost'}\n intent={activeQuickFilter === filter ? 'primary' : undefined}\n key={filter}\n onClick={() => onQuickFilter(filter)}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t(`admin.users.filter.${filter}`)}\n </TRButton>\n ))}\n </div>\n </div>\n </div>\n );\n}\n","import {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from '@tanstack/react-query';\nimport { createFileRoute, redirect } from '@tanstack/react-router';\nimport { TRBadge } from '@tinyrack/ui/components/badge';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRCard } from '@tinyrack/ui/components/card';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { AdminGateScreen } from '#frontend/features/admin/admin-gate-screen.tsx';\nimport { AdminShell } from '#frontend/features/admin/admin-shell.tsx';\nimport { AdminUserFormModal } from '#frontend/features/admin/users/admin-user-form-modal.tsx';\nimport { AdminUsersFilterBar } from '#frontend/features/admin/users/admin-users-filter-bar.tsx';\nimport {\n getActiveQuickFilter,\n type NoticeState,\n type QuickFilter,\n type UserModalState,\n} from '#frontend/features/admin/users/admin-users-filters.ts';\nimport { AdminUsersNotice } from '#frontend/features/admin/users/admin-users-notice.tsx';\nimport { AdminUsersSummary } from '#frontend/features/admin/users/admin-users-summary.tsx';\nimport { AdminUsersTable } from '#frontend/features/admin/users/admin-users-table.tsx';\nimport { AdminUsersToolbar } from '#frontend/features/admin/users/admin-users-toolbar.tsx';\nimport {\n adminUsersQueryOptions,\n createAdminUser,\n deleteAdminUser,\n normalizeAdminUsersQuery,\n updateAdminUser,\n} from '#frontend/queries/admin-users.ts';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\nimport type { SessionUser } from '#frontend/queries/session.ts';\n\nexport const Route = createFileRoute('/admin/users/')({\n component: AdminUsersPage,\n beforeLoad: async ({ context }) => {\n if (!context.user) {\n throw redirect({ to: '/login' });\n }\n },\n});\n\nfunction AdminUsersPage() {\n const user = Route.useRouteContext({ select: (context) => context.user });\n\n if (user?.role !== 'admin') {\n return <AdminGateScreen reason=\"access-required\" />;\n }\n\n return <AdminUsersGate user={user} />;\n}\n\nfunction AdminUsersGate({ user }: { user: SessionUser }) {\n const { data: config } = useSuspenseQuery(appConfigQueryOptions);\n if (!config.admin.enabled) {\n return <AdminGateScreen reason=\"console-disabled\" />;\n }\n return <AdminUsersContent user={user} />;\n}\n\nfunction AdminUsersContent({ user }: { user: SessionUser }) {\n const { t } = useTranslation();\n const queryClient = useQueryClient();\n const [draftQuery, setDraftQuery] = useState('');\n const [draftIncludeDeleted, setDraftIncludeDeleted] = useState(false);\n const [filters, setFilters] = useState(() => normalizeAdminUsersQuery());\n const [notice, setNotice] = useState<NoticeState>(null);\n const [modal, setModal] = useState<UserModalState>(null);\n const { data } = useSuspenseQuery(adminUsersQueryOptions(filters));\n\n const activeUsers = data.users.filter(\n (managedUser) => !managedUser.deleted_at,\n ).length;\n const configUsers = data.users.filter(\n (managedUser) => managedUser.managed_by === 'config',\n ).length;\n const databaseUsers = data.users.filter(\n (managedUser) => managedUser.managed_by === 'database',\n ).length;\n const activeQuickFilter = getActiveQuickFilter(filters);\n const hasActiveFilters =\n filters.query !== '' ||\n filters.includeDeleted ||\n filters.managedBy !== undefined ||\n filters.role !== undefined;\n const pageStart =\n data.pagination.total === 0\n ? 0\n : (data.pagination.page - 1) * data.pagination.page_size + 1;\n const pageEnd = Math.min(\n data.pagination.page * data.pagination.page_size,\n data.pagination.total,\n );\n\n const noticeOn = (message: string) => setNotice({ tone: 'success', message });\n const noticeFail = () =>\n setNotice({ tone: 'error', message: t('admin.users.operationFailed') });\n\n const createMutation = useMutation({\n mutationFn: createAdminUser,\n onSuccess: ({ user: nextUser }) => {\n void queryClient.invalidateQueries({ queryKey: ['admin', 'users'] });\n noticeOn(t('admin.users.createdNotice', { email: nextUser.email }));\n setModal(null);\n },\n onError: noticeFail,\n });\n\n const updateMutation = useMutation({\n mutationFn: updateAdminUser,\n onSuccess: ({ user: nextUser }) => {\n void queryClient.invalidateQueries({ queryKey: ['admin', 'users'] });\n noticeOn(t('admin.users.updatedNotice', { email: nextUser.email }));\n setModal(null);\n },\n onError: noticeFail,\n });\n\n const deleteMutation = useMutation({\n mutationFn: deleteAdminUser,\n onSuccess: ({ user: nextUser }) => {\n void queryClient.invalidateQueries({ queryKey: ['admin', 'users'] });\n noticeOn(t('admin.users.deletedNotice', { email: nextUser.email }));\n setModal(null);\n },\n onError: noticeFail,\n });\n\n const isMutating =\n createMutation.isPending ||\n updateMutation.isPending ||\n deleteMutation.isPending;\n\n const applySearch = () => {\n setFilters((current) => ({\n ...current,\n query: draftQuery.trim(),\n includeDeleted: draftIncludeDeleted,\n page: 1,\n }));\n };\n\n const clearFilters = () => {\n setDraftQuery('');\n setDraftIncludeDeleted(false);\n setFilters(normalizeAdminUsersQuery());\n };\n\n const applyQuickFilter = (nextFilter: QuickFilter) => {\n setFilters((current) => ({\n ...current,\n page: 1,\n managedBy:\n nextFilter === 'database'\n ? 'database'\n : nextFilter === 'config'\n ? 'config'\n : undefined,\n role: nextFilter === 'admins' ? 'admin' : undefined,\n }));\n };\n\n return (\n <AdminShell\n current=\"users\"\n description={t('admin.users.description')}\n title={t('admin.users.title')}\n user={user}\n >\n <AdminUsersSummary\n active={activeUsers}\n config={configUsers}\n database={databaseUsers}\n />\n\n {notice ? (\n <AdminUsersNotice notice={notice} onDismiss={() => setNotice(null)} />\n ) : null}\n\n <TRCard.Root\n className=\"overflow-hidden shadow-tinyrack-raised\"\n data-testid=\"admin-users-directory\"\n variant=\"outlined\"\n >\n <TRCard.Content className=\"gap-tinyrack-lg p-0\">\n <AdminUsersToolbar\n activeQuickFilter={activeQuickFilter}\n draftIncludeDeleted={draftIncludeDeleted}\n draftQuery={draftQuery}\n onCreate={() => setModal({ type: 'create' })}\n onDraftIncludeDeletedChange={setDraftIncludeDeleted}\n onDraftQueryChange={setDraftQuery}\n onQuickFilter={applyQuickFilter}\n onSearch={applySearch}\n total={data.pagination.total}\n />\n\n <AdminUsersFilterBar\n activeQuickFilter={activeQuickFilter}\n hasActiveFilters={hasActiveFilters}\n includeDeleted={filters.includeDeleted}\n onClearFilters={clearFilters}\n onPageSizeChange={(pageSize) =>\n setFilters((current) => ({ ...current, page: 1, pageSize }))\n }\n pageEnd={pageEnd}\n pageSize={filters.pageSize}\n pageStart={pageStart}\n query={filters.query}\n total={data.pagination.total}\n />\n\n <AdminUsersTable\n onDelete={(managedUser) =>\n setModal({ type: 'delete', user: managedUser })\n }\n onEdit={(managedUser) =>\n setModal({ type: 'edit', user: managedUser })\n }\n users={data.users}\n />\n\n <div className=\"flex items-center justify-between border-tinyrack-border border-t-tinyrack-default bg-tinyrack-surface-muted p-tinyrack-lg\">\n <TRButton\n appearance=\"outline\"\n disabled={filters.page <= 1}\n onClick={() =>\n setFilters((current) => ({\n ...current,\n page: current.page - 1,\n }))\n }\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.previous')}\n </TRButton>\n <TRBadge uiSize=\"md\">\n {t('admin.users.page', { page: data.pagination.page })}\n </TRBadge>\n <TRButton\n appearance=\"outline\"\n disabled={\n data.pagination.page * data.pagination.page_size >=\n data.pagination.total\n }\n onClick={() =>\n setFilters((current) => ({\n ...current,\n page: current.page + 1,\n }))\n }\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.next')}\n </TRButton>\n </div>\n </TRCard.Content>\n </TRCard.Root>\n\n <AdminUserFormModal\n isMutating={isMutating}\n modal={modal}\n onClose={() => setModal(null)}\n onCreate={(values) => createMutation.mutate(values)}\n onDelete={(sub) => deleteMutation.mutate(sub)}\n onUpdate={(values) => updateMutation.mutate(values)}\n />\n </AdminShell>\n );\n}\n"],"x_google_ignoreList":[0,6,7,8,9,10,11,12,13,14],"mappings":"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"}
|
package/public/index.html
CHANGED
|
@@ -18,12 +18,12 @@
|
|
|
18
18
|
<!-- Preload critical API data for faster initial render -->
|
|
19
19
|
<link rel="preload" href="/api/config" as="fetch" crossorigin="anonymous" />
|
|
20
20
|
<link rel="preload" href="/api/user/session" as="fetch" crossorigin="anonymous" />
|
|
21
|
-
<script type="module" crossorigin src="/assets/index-
|
|
21
|
+
<script type="module" crossorigin src="/assets/index-H6CJKjiN.js"></script>
|
|
22
22
|
<link rel="modulepreload" crossorigin href="/assets/createLucideIcon-BPpAIXR_.js">
|
|
23
23
|
<link rel="modulepreload" crossorigin href="/assets/config-DTQCUlfZ.js">
|
|
24
24
|
<link rel="modulepreload" crossorigin href="/assets/mutationOptions-DyYFUbyn.js">
|
|
25
25
|
<link rel="modulepreload" crossorigin href="/assets/zod-C87S6Tec.js">
|
|
26
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
26
|
+
<link rel="stylesheet" crossorigin href="/assets/index-kD9gQA-w.css">
|
|
27
27
|
</head>
|
|
28
28
|
<body>
|
|
29
29
|
<div id="root"></div>
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{J as e,Z as t,b as n,c as r,h as i,q as a,v as o}from"./createLucideIcon-BPpAIXR_.js";import{H as s,L as c,P as l,Qt as u,Zt as d,_t as f,g as p,hn as m,j as h,ut as g,vt as _,w as v,y}from"./config-DTQCUlfZ.js";import{$ as b,B as x,F as S,G as C,H as w,I as T,J as E,K as D,L as O,O as k,Q as A,R as j,U as M,W as N,Z as P,c as F,k as I,l as L,m as R,q as z}from"./shell-header-bar-CgyNXbPS.js";var B=t(e(),1),V=B.createContext(void 0);function H(e){let t=B.useContext(V);if(!e&&t===void 0)throw Error(o(27));return t}var U=B.forwardRef(function(e,t){let{render:n,className:a,style:o,disabled:s=!1,nativeButton:u=!0,...d}=e,f=H(),p=f.useState(`open`),{getButtonProps:m,buttonRef:h}=i({disabled:s,native:u}),g={disabled:s};function _(e){p&&f.setOpen(!1,l(c,e.nativeEvent))}return r(`button`,e,{state:g,ref:[t,h],props:[{onClick:_},d,m]})}),W=B.forwardRef(function(e,t){let{render:n,className:i,style:a,id:o,...s}=e,c=H(),l=k(o);return c.useSyncedValueWithCleanup(`descriptionElementId`,l),r(`p`,e,{ref:t,props:[{id:l},s]})}),G=B.createContext(void 0);function K(){let e=B.useContext(G);if(e===void 0)throw Error(o(26));return e}var q=a(),J=B.forwardRef(function(e,t){let{keepMounted:n=!1,...r}=e,i=H(),a=i.useState(`mounted`),o=i.useState(`modal`),s=i.useState(`open`);return a||n?(0,q.jsx)(G.Provider,{value:n,children:(0,q.jsxs)(h,{ref:t,...r,children:[a&&o===!0&&(0,q.jsx)(L,{ref:i.context.internalBackdropRef,inert:_(!s)}),e.children]})}):null});function ee({store:e,parentContext:t,isDrawer:r}){let i=e.useState(`open`),a=e.useState(`disablePointerDismissal`),o=e.useState(`modal`),s=e.useState(`popupElement`),c=e.useState(`floatingRootContext`),[l,f]=B.useState(0),[p,m]=B.useState(0),h=l===0,g=A(c,{outsidePressEvent(){return e.context.internalBackdropRef.current||e.context.backdropRef.current?`intentional`:{mouse:o===`trap-focus`?`sloppy`:`intentional`,touch:`sloppy`}},outsidePress(t){if(!e.context.outsidePressEnabledRef.current||`button`in t&&t.button!==0)return!1;if(`touches`in t){if(t.type===`touchend`){if(t.changedTouches.length!==1||t.touches.length!==0)return!1}else if(t.touches.length!==1)return!1}let n=u(t);if(h&&!a){if(o){let t=e.context.internalBackdropRef.current,r=e.context.backdropRef.current;return t||r?t===n||r===n||d(n,s)&&!n?.hasAttribute(`data-base-ui-portal`):!0}return!0}return!1},escapeKey:h});return F(i&&o===!0,s),e.useContextCallback(`onNestedDialogOpen`,(e,t)=>{f(e),m(t)}),n(()=>(t?.onNestedDialogOpen&&(i?t.onNestedDialogOpen(l+1,p+ +!!r):t.onNestedDialogOpen(0,0)),()=>{t?.onNestedDialogOpen&&i&&t.onNestedDialogOpen(0,0)}),[r,i,l,p,t]),C(e,{activeTriggerProps:g.reference,inactiveTriggerProps:g.trigger,popupProps:g.floating,nestedOpenDialogCount:l,nestedOpenDrawerCount:p}),null}var Y={...j,modal:e=>e.modal,nested:e=>e.nested,nestedOpenDialogCount:e=>e.nestedOpenDialogCount,nestedOpenDrawerCount:e=>e.nestedOpenDrawerCount,disablePointerDismissal:e=>e.disablePointerDismissal,openMethod:e=>e.openMethod,descriptionElementId:e=>e.descriptionElementId,titleElementId:e=>e.titleElementId,viewportElement:e=>e.viewportElement,role:e=>e.role},te=class extends m{constructor(e,t,n){let r=new v,i=X(e,r,t,n);super(i,Z(r),Y)}setOpen=(e,t)=>{if(t.preventUnmountOnClose=()=>{this.set(`preventUnmountingOnClose`,!0)},!e&&t.trigger==null&&this.state.activeTriggerId!=null&&(t.trigger=this.state.activeTriggerElement??void 0),this.context.onOpenChange?.(e,t),t.isCanceled)return;this.state.floatingRootContext.dispatchOpenChange(e,t);let n={open:e};w(n,e,t.trigger),this.update(n)}};function ne(){let e=new v;return new I(Object.freeze(X(void 0,e)),Object.freeze(Z(e)),Y)}function X(e,t,n,r=!1){let i={...T(),modal:!0,disablePointerDismissal:!1,viewportElement:null,descriptionElementId:void 0,titleElementId:void 0,openMethod:null,nested:!1,nestedOpenDialogCount:0,nestedOpenDrawerCount:0,role:`dialog`,...e};return i.floatingRootContext=O(t,n,r),i}function Z(e){return{popupRef:B.createRef(),backdropRef:B.createRef(),internalBackdropRef:B.createRef(),outsidePressEnabledRef:{current:!0},triggerElements:e,onOpenChange:void 0,onOpenChangeComplete:void 0}}function re(e,t){let{children:n,open:r,defaultOpen:i=!1,onOpenChange:a,onOpenChangeComplete:o,disablePointerDismissal:c=!1,modal:u=!0,actionsRef:d,handle:f,triggerId:p,defaultTriggerId:m=null}=t,h=e===`drawer`,g=e===`alert-dialog`,_=g?!0:u,v=g||c,y=g?`alertdialog`:`dialog`,b=H(!0),S={modal:_,disablePointerDismissal:v,nested:b!=null,role:y},C=D((e,t)=>new te({open:i,openProp:r,activeTriggerId:m,triggerIdProp:p,...S},e,t),!0);C.useControlledProp(`openProp`,r),C.useControlledProp(`triggerIdProp`,p),C.useSyncedValues(S),C.useContextCallback(`onOpenChange`,a),C.useContextCallback(`onOpenChangeComplete`,o);let w=C.useState(`open`),T=C.useState(`mounted`),E=C.useState(`payload`);z(C,w),M(C);let{forceUnmount:O}=N(w,C);B.useImperativeHandle(d,()=>({unmount:O,close:()=>C.setOpen(!1,l(s))}),[O,C]);let k=w||T;return(0,q.jsxs)(V.Provider,{value:C,children:[f&&(0,q.jsx)(x,{handle:f,store:C}),k&&(0,q.jsx)(ee,{store:C,parentContext:b?.context,isDrawer:h}),typeof n==`function`?n({payload:E}):n]})}var ie=B.forwardRef(function(e,t){let{render:n,className:i,style:a,id:o,...s}=e,c=H(),l=k(o);return c.useSyncedValueWithCleanup(`titleElementId`,l),r(`h2`,e,{ref:t,props:[{id:l},s]})}),ae=B.forwardRef(function(e,t){let{render:n,className:a,style:s,disabled:c=!1,nativeButton:l=!0,id:u,payload:d,handle:f,...p}=e,m=H(!0),h=S(f)??m;if(!h)throw Error(o(79));let _=k(u),v=h.useState(`floatingRootContext`),x=h.useState(`isOpenedByTrigger`,_),C=h.useState(`triggerPopupId`,_),w=B.useRef(null),{registerTrigger:T,isMountedByThisTrigger:D}=E(_,w,h,{payload:d}),{getButtonProps:O,buttonRef:A}=i({disabled:c,native:l}),j=b(v),M=R(()=>h.select(`open`),e=>{h.set(`openMethod`,e)}),N={disabled:c,open:x},P=h.useState(`triggerProps`,D);return r(`button`,e,{state:N,ref:[A,t,T,w],props:[j.reference,P,M,{[g]:``,id:_,"aria-haspopup":`dialog`,"aria-expanded":x,"aria-controls":C},p,O],stateAttributesMapping:y})}),Q={...p,...f,nestedDialogOpen(e){return e?{"data-nested-dialog-open":``}:null}},oe=B.forwardRef(function(e,t){let{render:n,className:i,style:a,children:o,...s}=e,c=K(),l=H(),u=l.useState(`open`),d=l.useState(`nested`),f=l.useState(`transitionStatus`),p=l.useState(`nestedOpenDialogCount`),m=l.useState(`mounted`),h=l.useStateSetter(`viewportElement`);return r(`div`,e,{enabled:c||m,state:{open:u,nested:d,transitionStatus:f,nestedDialogOpen:p>0},ref:[t,h],stateAttributesMapping:Q,props:[{role:`presentation`,hidden:!m,style:{pointerEvents:u?void 0:`none`},children:o},s]})}),$=class extends P{constructor(){super(ne(),`Dialog`,!1)}open(e){this.openByTrigger(e)}openWithPayload(e){let t=this.attachedStore;t!==null&&(t.set(`payload`,e),t.setOpen(!0,l(s)))}close(){this.closePopup()}get isOpen(){return this.attachedStore?.select(`open`)??!1}};function se(){return new $}export{ae as a,J as c,U as d,H as f,Q as i,K as l,se as n,ie as o,oe as r,re as s,$ as t,W as u};
|
|
2
|
-
//# sourceMappingURL=DialogHandle-tiMUnjZQ.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{n as e,q as t}from"./createLucideIcon-BPpAIXR_.js";import{A as n,j as r,t as i}from"./shell-header-bar-CgyNXbPS.js";var a=t();function o(){let{title:t,iconUrl:n}=r();return!t&&!n?null:(0,a.jsxs)(`div`,{className:`flex min-w-0 items-center gap-tinyrack-sm`,children:[n&&(0,a.jsx)(`img`,{alt:``,className:`size-tinyrack-xl object-contain`,src:n}),t&&(0,a.jsx)(e,{as:`h1`,truncate:!0,variant:`headingMd`,weight:`heading`,children:t})]})}var s={form:`max-w-tinyrack-measure-xl`,wide:`max-w-tinyrack-overlay-md`};function c({children:e,width:t=`form`}){return(0,a.jsxs)(`div`,{className:`flex min-h-dvh flex-col bg-tinyrack-surface`,children:[(0,a.jsx)(n,{}),(0,a.jsx)(i,{}),(0,a.jsx)(`main`,{className:`flex flex-1 px-tinyrack-lg py-tinyrack-xl`,children:(0,a.jsxs)(`div`,{className:`auth-enter m-auto flex w-full flex-col gap-tinyrack-xl ${s[t]}`,children:[(0,a.jsx)(o,{}),e]})})]})}export{c as t};
|
|
2
|
-
//# sourceMappingURL=auth-layout-DGTylGtX.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth-layout-DGTylGtX.js","names":[],"sources":["../../../frontend/src/features/layout/auth-brand-header.tsx","../../../frontend/src/features/layout/auth-layout.tsx"],"sourcesContent":["import { TRText } from '@tinyrack/ui/components/text';\nimport { useBranding } from '#frontend/features/layout/use-branding.ts';\n\n/**\n * The deployment identity shown at the start of the centred auth column.\n *\n * The product name remains the page's `h1`, so screen titles become `h2` when\n * branding is configured. With no product name, `AuthPageHeader` promotes the\n * screen title to `h1`. The decorative icon does not affect that hierarchy.\n */\nexport function AuthBrandHeader() {\n const { title, iconUrl } = useBranding();\n\n if (!title && !iconUrl) {\n return null;\n }\n\n return (\n <div className=\"flex min-w-0 items-center gap-tinyrack-sm\">\n {iconUrl && (\n <img alt=\"\" className=\"size-tinyrack-xl object-contain\" src={iconUrl} />\n )}\n {title && (\n <TRText as=\"h1\" truncate variant=\"headingMd\" weight=\"heading\">\n {title}\n </TRText>\n )}\n </div>\n );\n}\n","import { Toaster } from '#frontend/components/ui/toaster.tsx';\nimport { AuthBrandHeader } from '#frontend/features/layout/auth-brand-header.tsx';\nimport { ShellHeaderBar } from '#frontend/features/layout/shell-header-bar.tsx';\n\ntype AuthLayoutProps = {\n children: React.ReactNode;\n /**\n * `form` (default) fits a single column of fields. `wide` is for screens\n * that present a list to review before deciding — consent scopes, terms,\n * account selection, recovery codes.\n */\n width?: 'form' | 'wide';\n};\n\nconst widthClasses: Record<NonNullable<AuthLayoutProps['width']>, string> = {\n form: 'max-w-tinyrack-measure-xl',\n wide: 'max-w-tinyrack-overlay-md',\n};\n\n/**\n * The shell every auth screen sits in.\n *\n * A single, flat column keeps the deployment identity and the current task on\n * one reading line at every breakpoint. The column uses auto block margins so\n * short tasks sit centrally while long consent and setup flows keep their\n * viewport padding and scroll instead of overflowing above the canvas.\n */\nexport function AuthLayout({ children, width = 'form' }: AuthLayoutProps) {\n return (\n <div className=\"flex min-h-dvh flex-col bg-tinyrack-surface\">\n <Toaster />\n <ShellHeaderBar />\n <main className=\"flex flex-1 px-tinyrack-lg py-tinyrack-xl\">\n {/*\n The stack owns vertical rhythm so screens compose as a flat list of\n brand, header, alerts, form, and footer blocks. `m-auto` centres both\n axes only when space is available and collapses safely for tall flows.\n */}\n <div\n className={`auth-enter m-auto flex w-full flex-col gap-tinyrack-xl ${widthClasses[width]}`}\n >\n <AuthBrandHeader />\n {children}\n </div>\n </main>\n </div>\n );\n}\n"],"mappings":"qIAUA,SAAgB,GAAkB,CAChC,GAAM,CAAE,QAAO,WAAY,EAAY,EAMvC,MAJI,CAAC,GAAS,CAAC,EACN,MAIP,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,qDAAf,CACG,IACC,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,IAAI,GAAG,UAAU,kCAAkC,IAAK,CAAU,CAAA,EAExE,IACC,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,GAAG,KAAK,SAAA,GAAS,QAAQ,YAAY,OAAO,mBACjD,CACK,CAAA,CAEP,GAET,CCfA,IAAM,EAAsE,CAC1E,KAAM,4BACN,KAAM,2BACR,EAUA,SAAgB,EAAW,CAAE,WAAU,QAAQ,QAA2B,CACxE,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,uDAAf,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAU,CAAA,GACV,EAAA,EAAA,IAAA,CAAC,EAAD,CAAiB,CAAA,GACjB,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,sDAMd,EAAA,EAAA,KAAA,CAAC,MAAD,CACE,UAAW,0DAA0D,EAAa,cADpF,EAGE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAkB,CAAA,EACjB,CACE,GACD,CAAA,CACH,GAET"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{G as e,J as t,M as n,S as r,Z as i,b as a,c as o,d as s,f as c,g as l,h as u,m as d,q as f,v as p,y as m}from"./createLucideIcon-BPpAIXR_.js";import{P as ee,Y as te,_t as ne,bn as h,bt as re,pt as g,xt as ie}from"./config-DTQCUlfZ.js";import{O as ae,S as oe,T as se,X as ce,b as le,g as ue,h as de,w as _,y as fe}from"./shell-header-bar-CgyNXbPS.js";import{n as pe}from"./FieldItemContext-BeNfhOsU.js";import{t as me}from"./useAriaLabelledBy-7uIPXK-0.js";var v=i(t(),1);function he(e){if(!e)return null;for(let t of e.elements){let e=t.tagName;if(e===`BUTTON`||e===`INPUT`){let e=t;if(e.type===`submit`)return e}}return null}function y(e){return{checked(t){return e.indeterminate?{}:t?{"data-checked":``}:{"data-unchecked":``}},..._}}var b=v.createContext(void 0);function ge(){return v.useContext(b)}var x=v.createContext(void 0);function S(){let e=v.useContext(x);if(e===void 0)throw Error(p(14));return e}var C=f(),_e=`data-parent`,w=v.forwardRef(function(e,t){let{checked:i,className:f,defaultChecked:p=!1,"aria-labelledby":ne,disabled:h=!1,form:g,id:ce,indeterminate:_=!1,inputRef:b,name:S,onCheckedChange:w,parent:T=!1,readOnly:E=!1,render:ve,required:D=!1,uncheckedValue:O,value:k,nativeButton:A=!1,style:ye,...be}=e,{clearErrors:xe}=ue(),{disabled:Se,name:Ce,setDirty:we,setFilled:j,setFocused:M,setTouched:Te,state:N,validationMode:Ee,validityData:De,validation:Oe}=oe(),ke=pe(),{labelId:Ae,controlId:je,registerControlId:P,getDescriptionProps:F}=fe(),I=ge(),L=I?.allValues===void 0?void 0:I.parent,R=L!==void 0,z=Se||ke.disabled||I?.disabled||h,B=Ce??S,V=k??B,Me=ae(),Ne=ae(),H=ce||je;R&&(T?H=Ne:V===void 0?H||=Ne:H=`${L.id}-${V}`);let U={};R&&(T?U=L.getParentProps():V!==void 0&&(U=L.getChildProps(V)));let{checked:Pe=i,indeterminate:Fe=_,onCheckedChange:Ie,...Le}=U,W=I?.value,G=v.useRef(null),K=r(()=>Symbol()),q=v.useRef(!1),{getButtonProps:Re,buttonRef:ze}=u({disabled:z,native:A}),J=I?.validation??Oe,[Y,Be]=se({controlled:V!==void 0&&W!==void 0&&!T?W.includes(V):Pe,default:p,name:`Checkbox`,state:`checked`}),X=R?!!Pe:Y,Z=R&&Fe||_;a(()=>{P!==c&&(q.current=!0,P(K.current,H))},[H,P,K]),v.useEffect(()=>{let e=K.current;return()=>{!q.current||P===c||(q.current=!1,P(e,void 0))}},[P,K]),le(G,Me,Y,void 0,!I&&!z,S);let Q=v.useRef(null),Ve=J.registerInput,He=I?V:void 0,Ue=v.useCallback(e=>Ve(e,{controlRef:G,value:He}),[Ve,He]),We=d(b,Q,T?void 0:Ue),Ge=me(ne,Ae,Q,!A,H??void 0);a(()=>{Q.current&&(Q.current.indeterminate=Z,Y&&j(!0))},[Y,Z,j]),de(Y,()=>{I||(xe(B),j(Y),we(Y!==De.initialValue),J.change(Y))});let Ke=m({checked:Y,disabled:z,form:g,name:T?void 0:B,id:A?void 0:H??void 0,required:D,ref:We,style:B?ie:re,tabIndex:-1,type:`checkbox`,"aria-hidden":!0,onChange(e){if(e.nativeEvent.defaultPrevented)return;if(E){e.preventDefault();return}let t=e.currentTarget.checked,n=ee(te,e.nativeEvent);if(w?.(t,n),!n.isCanceled&&(Ie?.(t,n),!n.isCanceled&&(Be(t),V!==void 0&&I!==void 0&&!T&&!R))){let e=t?[...I.value,V]:I.value.filter(e=>e!==V);I.setValue(e,n)}},onClick(e){e.stopPropagation()},onFocus(){G.current?.focus()}},k===void 0?s:{value:(I?Y&&k:k)||``},F,e=>J.getValidationProps(z,e));v.useEffect(()=>{if(!L||V===void 0)return;let e=L.disabledStatesRef.current;return e.set(V,z),()=>{e.delete(V)}},[L,z,V]);let $=v.useMemo(()=>({...N,checked:X,disabled:z,readOnly:E,required:D,indeterminate:Z}),[N,X,z,E,D,Z]),qe=y($),Je=o(`span`,e,{state:$,ref:[ze,G,t],props:[{id:A?H??void 0:Me,role:`checkbox`,"aria-checked":Z?`mixed`:X,"aria-readonly":E||void 0,"aria-required":D||void 0,"aria-labelledby":Ge,[_e]:T?``:void 0,onFocus(){z||M(!0)},onBlur(){let e=Q.current;e&&(Te(!0),M(!1),Ee===`onBlur`&&J.commit(I?W:e.checked))},onKeyDown(e){if(e.key!==`Enter`||(e.preventBaseUIHandler(),e.defaultPrevented))return;let t=Q.current?.form??null,r=e.currentTarget,i=e.nativeEvent,a=e.preventDefault,o=i.preventDefault,s=!1;e.preventDefault=()=>{s=!0,a.call(e)},i.preventDefault=()=>{s=!0,o.call(i)},o.call(i),n(r).queueMicrotask(()=>{e.preventDefault=a,i.preventDefault=o,s||he(t)?.click()})},onClick(e){if(E||z)return;e.preventDefault();let t=Q.current;t&&l(t,e)}},be,Le,Re,F,e=>J.getValidationProps(z,e)],stateAttributesMapping:qe});return(0,C.jsxs)(x.Provider,{value:$,children:[Je,!Y&&!I&&B&&!T&&O!==void 0&&(0,C.jsx)(`input`,{type:`hidden`,form:g,name:B,value:O,disabled:z}),(0,C.jsx)(`input`,{...Ke,suppressHydrationWarning:!0})]})}),T=h(v.forwardRef(function(e,t){let{render:n,className:r,style:i,keepMounted:a=!1,...s}=e,c=S(),l=c.checked||c.indeterminate,{mounted:u,transitionStatus:d,setMounted:f}=ce(l),p=v.useRef(null),m={...c,transitionStatus:d};g({open:l,ref:p,onComplete(){l||f(!1)}});let ee={...y(c),...ne},te=a||u,h=o(`span`,e,{ref:[t,p],state:m,stateAttributesMapping:ee,props:s});return te?h:null}),`tr-checkbox-indicator`);function E({checked:t,className:n,ref:r,uiSize:i=`md`,...a}){let o=(0,v.useRef)(null),[s,c]=(0,v.useState)(0);return(0,v.useEffect)(()=>{if(t!==void 0)return;let e=e=>{let t=e.target;if(!(t instanceof HTMLFormElement))return;let n=o.current?.nextElementSibling??null;for(;n instanceof HTMLInputElement;){if(n.type===`checkbox`&&n.form===t){c(e=>e+1);return}n=n.nextElementSibling}};return document.addEventListener(`reset`,e,!0),()=>document.removeEventListener(`reset`,e,!0)},[t]),(0,v.createElement)(w,{...a,checked:t,className:e(`tr-checkbox`,n),"data-ui-size":i,key:s,ref:e=>{o.current=e,typeof r==`function`?r(e):r&&(r.current=e)}})}var ve={Root:E,Indicator:T};export{ve as t};
|
|
2
|
-
//# sourceMappingURL=checkbox-CFVDS3zJ.js.map
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{G as e,J as t,S as n,Z as r,_ as i,b as a,c as o,d as s,q as c,v as l,x as u,y as d}from"./createLucideIcon-BPpAIXR_.js";import{P as f,Xt as p,Y as m,_t as h,bn as g,pt as _,un as v,xn as y}from"./config-DTQCUlfZ.js";import{C as b,O as x,S,T as C,X as w,_ as T,b as E,d as D,g as O,v as k,w as A,x as j,y as M}from"./shell-header-bar-CgyNXbPS.js";import{n as N,t as P}from"./FieldItemContext-BeNfhOsU.js";var F=c(),I=r(t(),1),L=I.createContext(void 0);function R(e=!1){let t=I.useContext(L);if(!t&&!e)throw Error(l(86));return t}var z=function(e){let t=x(),r=e.controlId===void 0?t:e.controlId,[i,a]=I.useState(r),[o,s]=I.useState(e.labelId),[c,l]=I.useState([]),d=n(()=>new Map),{messageIds:f}=M(),p=u((e,t)=>{let n=d.current;if(t===void 0){n.delete(e);return}n.set(e,t),a(e=>{if(n.size===0)return;let t;for(let r of n.values()){if(e!==void 0&&r===e)return e;t===void 0&&(t=r)}return t})}),m=I.useCallback(e=>{let t=e[`aria-describedby`]?e[`aria-describedby`].split(` `):[];return t.push(...f,...c),{...e,"aria-describedby":Array.from(new Set(t)).join(` `)||void 0}},[f,c]),h=I.useMemo(()=>({controlId:i,registerControlId:p,labelId:o,setLabelId:s,messageIds:c,setMessageIds:l,getDescriptionProps:m}),[i,p,o,s,c,l,m]);return(0,F.jsx)(k.Provider,{value:h,children:e.children})};function B(e,t){return{...e,state:{...e.state,valid:!t&&e.state.valid}}}var V=Object.keys(b);function H(e,t){return e.matches(`:disabled`)?!1:!t||e.form===t?!0:e.form===null&&!e.hasAttribute(`form`)}function U(e,t){let n=null;for(let r of e.keys())if(H(r,t)){if(!r.validity.valid)return r;n??=r}return n}function W(e,t){for(let e of t.keys())e.setCustomValidity(``);e?.setCustomValidity(``)}function ee(e){let{elementRef:t,formRef:r}=O(),{setValidityData:i,validate:a,validityData:o,validationDebounceTime:c,invalid:l,markedDirtyRef:f,state:p,shouldValidateOnChange:m,registeredFieldIdRef:h}=e,{controlId:g,getDescriptionProps:_}=M(),y=v(),x=I.useRef(null),S=n(()=>new Map).current,C=I.useRef(0),w=I.useCallback((e,t)=>(S.set(e,t),()=>{S.delete(e)}),[S]),T=u(()=>{let e=U(S,t.current);return e&&S.get(e)?.controlRef.current||null}),E=u(async(e,n=!1)=>{C.current+=1;let s=C.current;function c(e,t=l){let n=h.current??g;if(n==null)return;let i=r.current.fields.get(n);if(!i)return;let a=B(e,t);r.current.fields.set(n,{...i,validityData:a})}function u(t,n){let r={value:e,state:{...b,valid:!0},error:``,errors:[],initialValue:o.initialValue};W(t,S),c(r,n),i(r)}let d=S.size>0?U(S,t.current):x.current;if(n){if(p.valid!==!1||!d)return;let e=d.validity;if(!e.valueMissing){u(d,!1);return}for(let t of V)if(t!==`valid`&&t!==`valueMissing`&&t!==`customError`&&e[t])return}function _(e){let t=V.reduce((t,n)=>(t[n]=e.validity[n],t),{}),n=!1;for(let e of V)if(e!==`valid`){if(e===`valueMissing`&&t[e])n=!0;else if(t[e])return t}return n&&!f.current&&(t.valid=!0,t.valueMissing=!1),t}y.clear();let v=null,w=[],T=d?_(d):{...b,valid:!0},E,D=m();if(d&&d.validationMessage&&!D)E=d.validationMessage,w=[d.validationMessage];else{let t=Array.from(r.current.fields.values()).reduce((e,t)=>(t.name&&(e[t.name]=t.getValue()),e),{}),n=a(e,t);if(typeof n==`object`&&n&&`then`in n){if(v=await n,s!==C.current)return}else v=n;v===null?D&&(W(d,S),T.customError=!1,d&&d.validationMessage?(E=d.validationMessage,w=[d.validationMessage]):(!d||d.validity.valid)&&!T.valid&&(T.valid=!0)):(T.valid=!1,T.customError=!0,Array.isArray(v)?(w=v,d?.setCustomValidity(v.join(`
|
|
2
|
-
`))):v&&(w=[v],d?.setCustomValidity(v)))}let O={value:e,state:T,error:E??(Array.isArray(v)?v[0]:v??``),errors:w,initialValue:o.initialValue};c(O),i(O)}),D=u(e=>{y.clear();let t=m();t&&e!==``&&c?(C.current+=1,y.start(c,()=>{E(e)})):E(e,!t)}),k=I.useCallback((e,t={})=>d(_(t),p.valid===!1&&!p.disabled&&!e?{"aria-invalid":!0}:s),[_,p.disabled,p.valid]);return I.useMemo(()=>({getValidationProps:k,inputRef:x,registeredInputs:S,registerInput:w,getInputControl:T,commit:E,change:D}),[k,S,w,T,E,D])}function te(e){let{commit:t,invalid:n,markedDirtyRef:r,name:i,setRegisteredFieldName:o,registeredFieldIdRef:s,setValidityData:c,validityData:l}=e,{formRef:d}=O(),f=I.useRef(null),p=I.useRef(null),m=I.useRef(!1),h=u(()=>{let e=p.current;if(e)return e.getValue?e.getValue():e.value});function g(e){return e.value===void 0?h():e.value}let _=u(()=>{let e=p.current;if(r.current=!0,!e){t(l.value);return}t(g(e))});function v(){let e=p.current;!e||!e.id||d.current.fields.set(e.id,{getValue:h,name:i??e.name,controlRef:e.controlRef,validityData:B(l,n),validate:_})}function y(e=p.current?.id){e&&d.current.fields.delete(e)}function b(e){if(m.current)return;m.current=!0;let t=g(e);c(e=>e.initialValue===t?e:{...e,initialValue:t})}return a(()=>{let e=p.current;!e||!e.id||(o(i?void 0:e.name),d.current.fields.set(e.id,{getValue:h,name:i??e.name,controlRef:e.controlRef,validityData:B(l,n),validate:_}))},[d,h,n,i,o,_,l]),a(()=>{let e=d.current.fields;return()=>{let t=p.current?.id;t&&e.delete(t)}},[d]),[_,u((e,t)=>{if(!t){f.current===e&&(f.current=null,y(),p.current=null,o(void 0),s.current=void 0);return}let n=p.current?.id;f.current=e,p.current=t,i||o(t.name),s.current=t.id,n&&n!==t.id&&y(n),b(t),v()})]}var G=I.forwardRef(function(e,t){let{errors:n,validationMode:r,submitAttemptedRef:i}=O(),{render:s,className:c,validate:l,validationDebounceTime:d=0,validationMode:f=r,name:p,disabled:m=!1,invalid:h,dirty:g,touched:_,actionsRef:v,style:y,...x}=e,S=R(!0)?.disabled,C=u(l||(()=>null)),w=S||m,[T,E]=I.useState(!1),[D,k]=I.useState(!1),[M,N]=I.useState(!1),[P,L]=I.useState(!1),z=g??D,B=_??T,V=I.useRef(z),H=I.useRef(void 0),[U,W]=I.useState(),G=p??U;a(()=>{g!==void 0&&(V.current=g)},[g]);let K=u(e=>{g===void 0&&(e&&(V.current=!0),k(e))}),ne=u(e=>{_===void 0&&E(e)}),q=u(()=>f===`onChange`||f===`onSubmit`&&i.current),J=G&&Object.hasOwn(n,G)?n[G]:null,re=!!(Array.isArray(J)?J.length:J),Y=h===!0||re,[X,Z]=I.useState({state:b,error:``,errors:[],value:null,initialValue:null}),ie=!Y&&(w?null:X.state.valid),Q=I.useMemo(()=>({disabled:w,touched:B,dirty:z,valid:ie,filled:M,focused:P}),[w,B,z,ie,M,P]),$=ee({setValidityData:Z,validate:C,validityData:X,validationDebounceTime:d,invalid:Y,markedDirtyRef:V,state:Q,shouldValidateOnChange:q,registeredFieldIdRef:H}),[ae,oe]=te({commit:$.commit,invalid:Y,markedDirtyRef:V,name:p,setRegisteredFieldName:W,registeredFieldIdRef:H,setValidityData:Z,validityData:X});I.useImperativeHandle(v,()=>({validate:ae}),[ae]);let se=I.useMemo(()=>({invalid:Y,name:G,validityData:X,setValidityData:Z,disabled:w,setTouched:ne,setDirty:K,setFilled:N,setFocused:L,validationMode:f,shouldValidateOnChange:q,state:Q,registerFieldControl:oe,validation:$}),[Y,G,X,w,ne,K,N,L,f,q,Q,oe,$]),ce=o(`div`,e,{ref:t,state:Q,props:x,stateAttributesMapping:A});return(0,F.jsx)(j.Provider,{value:se,children:ce})}),K=I.forwardRef(function(e,t){return(0,F.jsx)(z,{children:(0,F.jsx)(G,{...e,ref:t})})}),ne=I.forwardRef(function(e,t){let{render:n,className:r,style:i,id:a,nativeLabel:s=!0,...c}=e,l=S(!1),u=N(),{labelId:d}=M(),f={...l.state,disabled:l.disabled||u.disabled},p=I.useRef(null),m=D({id:d??a,native:s});return o(`label`,e,{ref:[t,p],state:f,props:[m,c],stateAttributesMapping:A})}),q={...A,...h},J=I.forwardRef(function(e,t){let{render:n,id:r,className:i,match:s,style:c,...l}=e,u=x(r),{validityData:d,state:f,name:p}=S(!1),{setMessageIds:m}=M(),{errors:h}=O(),g=p&&Object.hasOwn(h,p)?h[p]:null,v=!!(Array.isArray(g)?g.length:g),y=typeof s==`string`,b=!1;b=s===!0?!0:f.disabled?!1:y?!!d.state[s]:v||d.state.valid===!1;let{mounted:C,transitionStatus:T,setMounted:E}=w(b);a(()=>{if(!(!b||!u))return m(e=>e.concat(u)),()=>{m(e=>e.filter(e=>e!==u))}},[b,u,m]);let D=I.useRef(null),[k,A]=I.useState(null),[j,N]=I.useState(null),P=d.error;!y&&v?P=g:d.errors.length>1&&(P=d.errors);let L=P;Array.isArray(P)&&(L=P.length>1?(0,F.jsx)(`ul`,{children:P.map(e=>(0,F.jsx)(`li`,{children:e},e))}):P[0]);let R=Array.isArray(P)?JSON.stringify(P):P;b&&R!==j&&(N(R),A(L)),_({open:b,ref:D,onComplete(){b||E(!1)}});let z={...f,transitionStatus:T},B=o(`div`,e,{ref:[t,D],state:z,props:[{id:u,children:b?L:k},l],stateAttributesMapping:q,enabled:C});return C?B:null}),re=I.forwardRef(function(e,t){let{render:n,id:r,className:i,style:s,...c}=e,l=x(r),u=S(!1),d=N(),{setMessageIds:f}=M(),p={...u.state,disabled:u.disabled||d.disabled};return a(()=>{if(l)return f(e=>e.concat(l)),()=>{f(e=>e.filter(e=>e!==l))}},[l,f]),o(`p`,e,{ref:t,state:p,props:[{id:l},c],stateAttributesMapping:A})}),Y=I.forwardRef(function(e,t){let{render:n,className:r,id:s,name:c,value:l,disabled:d=!1,onValueChange:h,defaultValue:g,autoFocus:_=!1,style:v,...y}=e,{state:b,name:x,disabled:w,setTouched:D,setDirty:k,validityData:j,setFocused:N,setFilled:P,validationMode:F,validation:L}=S(),{clearErrors:R}=O(),z=w||d,B=x??c,V={...b,disabled:z},{labelId:H}=M(),U=T({id:s});a(()=>{let e=l!=null;L.inputRef.current?.value||e&&l!==``?P(!0):e&&l===``&&P(!1)},[L.inputRef,P,l]);let W=I.useRef(null);a(()=>{_&&W.current===p(i(W.current))&&N(!0)},[_,N]);let[ee]=C({controlled:l,default:g,name:`FieldControl`,state:`value`}),te=l!==void 0,G=te?ee:void 0,K=u(()=>L.inputRef.current?.value);return E(L.inputRef,U,G,K,!z,c),o(`input`,e,{ref:[t,W],state:V,props:[{id:U,disabled:z,name:B,ref:L.inputRef,"aria-labelledby":H,autoFocus:_,...te?{value:G}:{defaultValue:g},onChange(e){let t=e.currentTarget.value;h?.(t,f(m,e.nativeEvent)),k(t!==(j.initialValue??``)),P(t!==``),e.nativeEvent.defaultPrevented||(R(B),L.change(t))},onFocus(){N(!0)},onBlur(e){D(!0),N(!1),F===`onBlur`&&L.commit(e.currentTarget.value)},onKeyDown(e){e.currentTarget.tagName===`INPUT`&&e.key===`Enter`&&(D(!0),L.commit(e.currentTarget.value))}},y,e=>L.getValidationProps(z,e)],stateAttributesMapping:A})}),X=function(e){let{children:t}=e,{validityData:n,invalid:r}=S(!1),i=I.useMemo(()=>B(n,r),[n,r]),{transitionStatus:a}=w(i.state.valid===!1),o=I.useMemo(()=>({...i,validity:i.state,transitionStatus:a}),[i,a]);return(0,F.jsx)(I.Fragment,{children:t(o)})},Z=I.forwardRef(function(e,t){let{render:n,className:r,style:i,disabled:a=!1,...s}=e,{state:c,disabled:l}=S(!1),u=l||a,d={...c,disabled:u},f=I.useMemo(()=>({disabled:u}),[u]),p=o(`div`,e,{ref:t,state:d,props:s,stateAttributesMapping:A});return(0,F.jsx)(z,{children:(0,F.jsx)(P.Provider,{value:f,children:p})})});function ie({className:t,uiSize:n=`md`,...r}){return y(),(0,F.jsx)(Y,{...r,className:e(`tr-field-control`,t),"data-ui-size":n})}var Q=g(re,`tr-field-description`),$=g(J,`tr-field-error`),ae=g(Z,`tr-field-item`),oe=g(ne,`tr-label`);function se({className:t,...n}){return(0,F.jsx)(K,{...n,className:e(`tr-field`,t)})}var ce={Root:se,Label:oe,Error:$,Description:Q,Control:ie,Validity:g(X,`tr-field-validity`),Item:ae};export{Y as n,ce as t};
|
|
3
|
-
//# sourceMappingURL=field-89zKYDVL.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{G as e,J as t,Z as n,_ as r,b as i,c as a,i as o,q as s,v as c,x as l}from"./createLucideIcon-BPpAIXR_.js";import{F as u,G as d,P as f,S as ee,U as p,Vt as m,W as h,Zt as te,bn as g,bt as ne,k as _,q as re,xt as v}from"./config-DTQCUlfZ.js";import{S as ie,T as ae,_ as oe,b as se,g as ce,h as le,i as y,u as b,w as x,y as ue}from"./shell-header-bar-CgyNXbPS.js";import{t as S}from"./useAriaLabelledBy-7uIPXK-0.js";import{t as C}from"./field-89zKYDVL.js";import{t as w}from"./separator-B0Bvh1he.js";var T=n(t(),1),E=T.createContext(void 0);function de(){let e=T.useContext(E);if(e===void 0)throw Error(c(98));return e}function D(e,t,n){return{...e,value:t,index:n,filled:t!==``}}var O={value:()=>null,length:()=>null,...x},k={value:()=>null,index:()=>null,...x},A={numeric:{slotPattern:`\\d{1}`,getRootPattern:e=>`\\d{${e}}`,regexp:/[^\d]/g,inputMode:`numeric`},alpha:{slotPattern:`[a-zA-Z]{1}`,getRootPattern:e=>`[a-zA-Z]{${e}}`,regexp:/[^a-zA-Z]/g,inputMode:`text`},alphanumeric:{slotPattern:`[a-zA-Z0-9]{1}`,getRootPattern:e=>`[a-zA-Z0-9]{${e}}`,regexp:/[^a-zA-Z0-9]/g,inputMode:`text`}};function j(e){return e===`none`?null:A[e]}function M(e){return(e??``).replace(/\s/g,``)}function fe(e,t){return t?e.replace(t.regexp,``):e}function N(e,t,n,r){let i=M(e),a=j(n),o=fe(i,a),s=i.length>o.length;if(r){let e=r(o);s||=o.length>e.length,o=fe(e,a),s||=e.length>o.length}let c=t<0?0:t,l=Array.from(o);return[l.slice(0,c).join(``),s||l.length>c]}function P(e,t,n,r){return N(e,t,n,r)[0]}function pe(e,t,n,r,i,a){let o=P(n,r,i,a);return P(`${e.slice(0,t)}${o}${e.slice(t+o.length)}`,r,i,a)}function F(e,t){return t<0||t>=e.length?e:`${e.slice(0,t)}${e.slice(t+1)}`}var I=s(),L=T.forwardRef(function(e,t){let{"aria-describedby":n,"aria-labelledby":o,id:s,autoComplete:c=`one-time-code`,defaultValue:d,value:ee,onValueChange:p,onValueComplete:m,form:h,length:g,autoSubmit:re=!1,mask:y=!1,inputMode:x,validationType:C=`numeric`,normalizeValue:w,disabled:de=!1,readOnly:D=!1,required:k=!1,name:A,onValueInvalid:M,render:fe,className:pe,style:F,...L}=e,{setDirty:z,validityData:B,disabled:V,setFilled:H,invalid:U,name:me,state:he,validation:W,validationMode:ge,setFocused:_e,setTouched:ve}=ie(),{clearErrors:ye}=ce(),{getDescriptionProps:be,labelId:xe}=ue(),G=V||de,K=me??A,[Se,Ce]=ae({controlled:ee,default:d,name:`OTPField`,state:`value`}),we=T.useRef(null),q=T.useRef([]),Te=T.useRef(null),J=T.useRef(null),Ee=T.useMemo(()=>({get current(){return q.current[0]??null}}),[]),Y=oe({id:s}),De=S(o,xe,Ee,!0,Y),Oe=o==null?De:void 0,ke=R(n,be({})[`aria-describedby`]),Ae=j(C),je=Ae?.slotPattern,Me=Ae?.getRootPattern(g),Ne=x??Ae?.inputMode,Pe=Number.isInteger(g)&&g>0,X=P(Se,g,C,w),Z=_(X),Q=X!==``,[Fe,Ie]=T.useState(0),[Le,Re]=T.useState(()=>Math.min(X.length,g-1)),[ze,Be]=T.useState(!1),Ve=ze?Math.min(Le,Math.max(g-1,0)):Math.min(X.length,g-1);i(()=>{H(Q)},[Q,H]),se(Ee,Y,X,void 0,!G,A);let $=l(e=>{let t=Math.min(Math.max(e,0),Math.max(q.current.length-1,0)),n=q.current[t];n?.focus(),n?.select()}),He=l((e,t)=>{Te.current={index:e,value:t}});function Ue(){let e=W.inputRef.current?.form??q.current[0]?.form??null;if(h){let t=r(we.current).getElementById(h);t?.tagName===`FORM`&&(e=t)}e&&typeof e.requestSubmit==`function`&&e.requestSubmit()}function We(e,t){m?.(e,t),re&&Ue()}le(X,()=>{ye(K),z(X!==B.initialValue),W.change(X);let e=Te.current;e!=null&&(Te.current=null,e.value===X&&$(e.index));let t=J.current;t!=null&&(J.current=null,t.value===X&&We(X,t.eventDetails))});let Ge=l((e,t)=>{let n=P(e,g,C,w),r=(t.reason===`input-change`||t.reason===`input-paste`)&&n.length===g&&(Z.current.length!==g||t.reason===`input-paste`)?u(t.reason,t.event):null;return n===Z.current?(r!=null&&We(n,r),null):(p?.(n,t),t.isCanceled?null:(Ce(n),r==null?n.length!==g&&(J.current=null):J.current={value:n,eventDetails:r},n))}),Ke=l((e,t)=>{M?.(e,t)}),qe=l((e,t)=>{if(e>Z.current.length){$(Math.min(Z.current.length,g-1));return}Re(e),Be(!0),_e(!0),t.currentTarget.select()}),Je=l(e=>{te(we.current,e.relatedTarget)||(ve(!0),Be(!1),_e(!1),ge===`onBlur`&&W.commit(Z.current))}),Ye=T.useCallback(e=>{if(Y!=null)return e===0?Y:`${Y}-${e+1}`},[Y]),Xe=T.useMemo(()=>({...he,complete:X.length===g,disabled:G,filled:Q,focused:ze,length:g,readOnly:D,required:k,value:X}),[G,he,Q,ze,g,D,k,X]),Ze=T.useMemo(()=>({autoComplete:c,activeIndex:Ve,disabled:G,form:h,focusInput:$,queueFocusInput:He,getInputId:Ye,handleInputBlur:Je,handleInputFocus:qe,inputMode:Ne,inputAriaLabelledBy:Oe,invalid:U,length:g,mask:y,pattern:je,reportValueInvalid:Ke,readOnly:D,required:k,normalizeValue:w,setValue:Ge,state:Xe,validationType:C,value:X}),[Ve,c,G,$,h,Ye,Je,qe,Ne,Oe,U,g,y,je,He,D,Ke,k,w,Ge,Xe,C,X]),Qe=a(`div`,e,{ref:[t,we],state:Xe,props:[{role:`group`,"aria-describedby":ke,"aria-labelledby":De},L],stateAttributesMapping:O});return(0,I.jsx)(b,{elementsRef:q,onMapChange:e=>{Ie(e.size)},children:(0,I.jsxs)(E.Provider,{value:Ze,children:[Qe,Pe&&(0,I.jsx)(`input`,{...W.getValidationProps(G,{onFocus(){$(0)},onChange(e){if(e.nativeEvent.defaultPrevented||G||D)return;let t=e.currentTarget.value,[n,r]=N(t,g,C,w);r&&Ke(t,u(`input-change`,e.nativeEvent));let i=Ge(n,f(`input-change`,e.nativeEvent));i!=null&&i!==``&&He(i.length-1,i)}}),ref:W.inputRef,type:`text`,id:Y&&K==null?`${Y}-hidden-input`:void 0,form:h,name:K,value:X,autoComplete:c,inputMode:Ne,minLength:g,maxLength:g,pattern:Me,disabled:G,readOnly:D,required:k,"aria-hidden":!0,tabIndex:-1,style:K?v:ne})]})})});function R(...e){let t=e.flatMap(e=>e?.split(/\s+/).filter(Boolean)??[]);return t.length>0?Array.from(new Set(t)).join(` `):void 0}var z=g(T.forwardRef(function(e,t){let{"aria-label":n,"aria-labelledby":r,render:i,className:o,style:s,...c}=e,{activeIndex:l,autoComplete:te,disabled:g,form:ne,focusInput:_,queueFocusInput:v,getInputId:ie,handleInputBlur:ae,handleInputFocus:oe,inputMode:se,inputAriaLabelledBy:ce,invalid:le,length:b,mask:x,pattern:ue,reportValueInvalid:S,readOnly:C,required:w,normalizeValue:E,setValue:O,state:A,validationType:j,value:M}=de(),{ref:fe,index:P}=y({guess:!0}),I=T.useRef(null),L=ee(),R=M[P]??``,z=D(A,R,P),B=n,V=r??ce,H=P===0?void 0:B,U={id:ie(P),value:R,type:x?`password`:`text`,inputMode:se,autoComplete:P===0?te:`off`,autoCorrect:`off`,spellCheck:`false`,enterKeyHint:P===b-1?`done`:`next`,maxLength:P===0?b:void 0,tabIndex:l===P?0:-1,disabled:g,form:ne,pattern:ue,readOnly:C,required:w,"aria-labelledby":H==null?V:void 0,"aria-invalid":!g&&le?!0:void 0,"aria-label":H,onMouseDown(e){e.defaultPrevented||g||(e.preventDefault(),_(P))},onFocus(e){e.defaultPrevented||g||oe(P,e)},onBlur(e){e.defaultPrevented||ae(e)},onChange(e){if(e.defaultPrevented||g||C)return;let t=e.currentTarget.value,[n,r]=N(t,b,j,E);if(r&&S(t,u(p,e.nativeEvent)),n===``){t===``?O(F(M,P),f(h,e.nativeEvent)):R!==``&&(e.currentTarget.value=R,e.currentTarget.select());return}let i=pe(M,P,n,b,j,E),a=O(i,f(p,e.nativeEvent));if(a!=null){let e=Math.min(P+n.length,b-1);v(e,a)}},onKeyDown(e){if(e.defaultPrevented||g)return;let t=Math.max(b-1,0),n=Math.min(M.length,t),r=(e.ctrlKey||e.metaKey)&&!e.altKey,i=L===`rtl`,a=i?`ArrowRight`:`ArrowLeft`,o=i?`ArrowLeft`:`ArrowRight`;if(e.key===a){m(e),_(r?0:Math.max(0,P-1));return}if(e.key===o){m(e),_(r?n:Math.min(t,P+1));return}if(e.key===`Home`||e.key===`ArrowUp`){m(e),_(0);return}if(e.key===`End`||e.key===`ArrowDown`){m(e),_(n);return}if(C)return;function s(t,n){let r=O(t,f(re,e.nativeEvent));r!=null&&v(n,r)}if(e.key===`Backspace`&&r){m(e),s(``,0);return}if(e.key===`Delete`){m(e),s(F(M,P),P);return}let c=e.currentTarget.value,l=e.currentTarget.selectionStart===0&&e.currentTarget.selectionEnd===c.length;if(e.key.length===1&&l&&R===e.key){m(e),P<b-1&&_(P+1);return}if(e.key===`Backspace`){m(e);let t=Math.max(0,P-1);s(F(M,R===``?t:P),t)}},onPaste(e){if(e.defaultPrevented||g||C)return;let t=``;try{t=e.clipboardData?.getData(`text/plain`)??``}catch{return}e.preventDefault();let[n,r]=N(t,b,j,E);if(r&&S(t,u(d,e.nativeEvent)),n===``)return;let i=O(pe(M,P,n,b,j,E),f(d,e.nativeEvent));if(i!=null){let e=Math.min(P+n.length,b-1);v(e,i)}}};return a(`input`,e,{ref:[t,fe,I],state:z,props:[U,c],stateAttributesMapping:k})}),`tr-otp-field-digit`,{tracksFocusModality:!0});function B({appearance:t=`solid`,className:n,uiSize:r=`md`,...i}){return(0,I.jsx)(L,{...i,className:e(`tr-otp-field`,n),"data-appearance":t,"data-ui-size":r})}function V({className:t,orientation:n=`vertical`,...r}){return(0,I.jsx)(w,{...r,className:e(`tr-otp-field-separator`,t),orientation:n})}var H={Root:B,Input:z,Separator:V},U=(0,T.forwardRef)(function({length:e=6,error:t,disabled:n=!1,onComplete:r,onChange:i,value:a,autoFocus:s=!1,className:c=``},l){let{t:u}=o(),d=(0,T.useId)(),f=(0,T.useRef)(null),[ee,p]=(0,T.useState)(a??``);(0,T.useEffect)(()=>{a!==void 0&&p(a)},[a]),(0,T.useImperativeHandle)(l,()=>({focus:()=>{(f.current?.querySelector(`input`))?.focus()},clear:()=>{p(``),(f.current?.querySelector(`input`))?.focus()}}),[]);let m=(0,T.useCallback)(e=>{p(e),i?.(e)},[i]),h=(0,T.useCallback)(e=>{r?.(e)},[r]);return(0,I.jsxs)(C.Root,{className:c,ref:f,children:[(0,I.jsx)(C.Label,{className:`sr-only`,htmlFor:d,children:u(`common.otp.label`)}),(0,I.jsx)(H.Root,{disabled:n,id:d,length:e,onValueChange:m,onValueComplete:h,uiSize:`md`,validationType:`numeric`,value:ee,children:Array.from({length:e},(t,n)=>(0,I.jsx)(H.Input,{"aria-label":n===0?void 0:u(`common.otp.digit`,{label:u(`common.otp.label`),position:n+1,total:e}),autoFocus:s&&n===0},n))}),t&&(0,I.jsx)(`p`,{className:`mt-tinyrack-sm text-center text-tinyrack-danger-foreground text-tinyrack-sm`,"data-testid":`pin-input-error`,children:t.message})]})});export{U as t};
|
|
2
|
-
//# sourceMappingURL=pin-input-BGOLfkwL.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{J as e,U as t,Z as n,i as r,n as i,q as a,r as o,s,t as c}from"./createLucideIcon-BPpAIXR_.js";import{On as l,Sr as u,i as d,n as f,r as p,t as m}from"./config-DTQCUlfZ.js";import{t as h}from"./mutationOptions-DyYFUbyn.js";import{t as g}from"./useMutation-BWZ0G4Td.js";import{A as _,D as v,t as y,tt as b}from"./shell-header-bar-CgyNXbPS.js";import{t as x}from"./useQuery-pOdkMV4B.js";import{a as S,i as C,n as w,r as T,t as E}from"./use-totp-setup-CtTaklH-.js";import{t as D}from"./auth-field-DsLGh1U-.js";import{t as O}from"./fingerprint-pattern-DP62Vk8x.js";import{t as k}from"./key-round-CdvHb8vT.js";import{i as A}from"./provider-logos-u1YURWQr.js";import{n as ee,t as te}from"./logout-B5T52P8u.js";import{t as j}from"./shield-check-D_p8H0ni.js";import{t as M}from"./trash-2-DZdKBLvC.js";import{t as N}from"./triangle-alert-CqNn0kPs.js";import{t as P}from"./zod-C87S6Tec.js";import{B as F,C as ne,R as I,S as L,T as re,w as R,x as ie,z}from"./index-CZ0rWM7l.js";import{t as ae}from"./badge-CsOfUji0.js";import{t as oe}from"./auth-page-header-COvqWINf.js";import{t as B}from"./alert-leqyvHOp.js";import{t as se}from"./initial-avatar-ocwNWL38.js";import{t as V}from"./promise-OpBtq8tG.js";import{n as H,t as U}from"./modal-BV3gpI-p.js";import{a as W,i as G,n as K,r as q}from"./passkey-J1qnYp9A.js";import{r as J,t as Y}from"./standard-schema-e8gtSzGE.js";import{n as ce,r as le}from"./totp-BNZ904Zm.js";var ue=c(`cloud`,[[`path`,{d:`M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z`,key:`p7xjir`}]]),de=c(`link-2-off`,[[`path`,{d:`M9 17H7A5 5 0 0 1 7 7`,key:`10o201`}],[`path`,{d:`M15 7h2a5 5 0 0 1 4 8`,key:`1d3206`}],[`line`,{x1:`8`,x2:`12`,y1:`12`,y2:`12`,key:`rvw6j4`}],[`line`,{x1:`2`,x2:`22`,y1:`2`,y2:`22`,key:`a6p6uj`}]]),fe=c(`pencil`,[[`path`,{d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z`,key:`1a8usu`}],[`path`,{d:`m15 5 4 4`,key:`1mk7zo`}]]),pe=c(`settings`,[[`path`,{d:`M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915`,key:`1i5ecw`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),me=c(`smartphone`,[[`rect`,{width:`14`,height:`20`,x:`5`,y:`2`,rx:`2`,ry:`2`,key:`1yt0o3`}],[`path`,{d:`M12 18h.01`,key:`mhygvu`}]]),X=n(e(),1),Z=a();function he({isConfigManaged:e,isDeletionEnabled:t,onDeleteClick:n}){let{t:a}=r();return t?(0,Z.jsxs)(F.Root,{className:`border-tinyrack-danger-border bg-tinyrack-danger-surface`,variant:`outlined`,children:[(0,Z.jsxs)(F.Header,{className:`border-tinyrack-danger-border border-b-tinyrack-default px-tinyrack-lg py-tinyrack-md`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-tinyrack-sm`,children:[(0,Z.jsx)(N,{"aria-hidden":!0,className:`size-tinyrack-lg text-tinyrack-danger-foreground`}),(0,Z.jsx)(F.Title,{className:`text-tinyrack-danger-foreground`,children:a(`profile.dangerZone.title`)})]}),(0,Z.jsx)(F.Description,{children:a(`profile.dangerZone.description`)})]}),(0,Z.jsx)(F.Content,{className:`px-tinyrack-lg py-tinyrack-md`,children:(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-tinyrack-lg`,children:[(0,Z.jsxs)(`div`,{className:`flex min-w-0 flex-1 flex-col gap-tinyrack-3xs`,children:[(0,Z.jsx)(i,{as:`p`,variant:`bodySm`,weight:`medium`,children:a(`profile.deleteAccount.title`)}),(0,Z.jsx)(i,{as:`p`,color:`muted`,variant:`caption`,children:a(e?`profile.deleteAccount.configManaged`:`profile.deleteAccount.description`)})]}),(0,Z.jsxs)(s,{appearance:`outline`,"data-testid":`profile-delete-account`,disabled:e,intent:`danger`,onClick:n,type:`button`,uiSize:`sm`,children:[(0,Z.jsx)(M,{"aria-hidden":!0,className:`size-tinyrack-lg`}),a(`profile.deleteAccount.button`)]})]})})]}):null}function Q({icon:e,active:t,title:n,status:r,note:a,actions:o}){let s;return s=(0,X.isValidElement)(e)?e:(0,Z.jsx)(e,{"aria-hidden":!0,className:`size-tinyrack-lg ${t?`text-tinyrack-success-foreground`:`text-tinyrack-text-muted`}`}),(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-tinyrack-lg p-tinyrack-lg`,children:[(0,Z.jsxs)(`div`,{className:`flex min-w-0 flex-1 items-center gap-tinyrack-md`,children:[(0,Z.jsx)(`div`,{className:`flex size-9 shrink-0 items-center justify-center rounded-tinyrack-md ${t?`bg-tinyrack-success-surface`:`bg-tinyrack-surface-muted`}`,children:s}),(0,Z.jsxs)(`div`,{className:`flex min-w-0 flex-1 flex-col gap-tinyrack-3xs`,children:[(0,Z.jsx)(i,{as:`div`,variant:`bodySm`,weight:`medium`,children:n}),(0,Z.jsx)(i,{as:`div`,color:`muted`,variant:`caption`,children:r}),a]})]}),o&&(0,Z.jsx)(`div`,{className:`flex shrink-0 flex-wrap justify-end gap-tinyrack-xs`,children:o})]})}function ge({providers:e,unlinkingProvider:t,getAuthorizeUrl:n,onUnlinkRequest:i}){let{t:a}=r();return e.length===0?null:(0,Z.jsxs)(F.Root,{variant:`outlined`,children:[(0,Z.jsxs)(F.Header,{className:`border-tinyrack-border border-b-tinyrack-default px-tinyrack-lg py-tinyrack-md`,children:[(0,Z.jsx)(F.Title,{children:a(`profile.linkedAccounts.title`)}),(0,Z.jsx)(F.Description,{children:a(`profile.linkedAccounts.description`)})]}),(0,Z.jsx)(F.Content,{className:`divide-y divide-tinyrack-border p-0`,children:e.map(e=>(0,Z.jsx)(Q,{actions:e.linked?(0,Z.jsx)(s,{appearance:`ghost`,intent:`danger`,loading:t===e.id,loadingLabel:a(`profile.linkedAccounts.unlinking`),onClick:()=>i(e),type:`button`,uiSize:`sm`,children:t===e.id?void 0:a(`profile.linkedAccounts.unlink`)}):(0,Z.jsx)(z,{appearance:`outline`,intent:`neutral`,render:(0,Z.jsx)(`a`,{href:n(e.id,`link`,`/profile`)}),uiSize:`sm`,children:a(`profile.linkedAccounts.link`)}),active:e.linked,icon:(0,Z.jsx)(A,{className:`size-tinyrack-lg`,iconUrl:e.icon_url,providerId:e.id}),status:e.linked?a(`profile.linkedAccounts.connected`):a(`profile.linkedAccounts.notConnected`),title:e.display_name},e.id))})]})}function _e({passkeyCount:e,onOpenModal:t}){let{t:n}=r(),i=e>0;return(0,Z.jsx)(Q,{actions:(0,Z.jsx)(s,{appearance:`ghost`,intent:`primary`,onClick:()=>t(i?`manage`:`setup`),type:`button`,uiSize:`sm`,children:n(i?`profile.passkey.manage`:`profile.passkey.add`)}),active:i,icon:O,status:i?n(`profile.passkey.status.enabled`,{count:e}):n(`profile.passkey.status.disabled`),title:n(`profile.passkey.title`)})}function ve({hasPassword:e,hasLinkedOAuth:t,isConfigManaged:n,hasSecondFactorOnly:a,onOpenModal:o}){let{t:c}=r();return(0,Z.jsx)(Q,{actions:n?void 0:e?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(s,{appearance:`ghost`,"data-testid":`profile-password-change`,intent:`primary`,onClick:()=>o(`change`),type:`button`,uiSize:`sm`,children:c(`profile.password.change`)}),t?(0,Z.jsx)(s,{appearance:`ghost`,"data-testid":`profile-password-remove`,intent:`danger`,onClick:()=>o(`remove`),type:`button`,uiSize:`sm`,children:c(`profile.password.remove`)}):null,!t&&a&&(0,Z.jsxs)(v.Root,{children:[(0,Z.jsx)(v.Trigger,{render:(0,Z.jsx)(s,{appearance:`ghost`,disabled:!0,type:`button`,uiSize:`sm`,children:c(`profile.password.remove`)})}),(0,Z.jsx)(v.Portal,{children:(0,Z.jsx)(v.Positioner,{children:(0,Z.jsx)(v.Popup,{className:`max-w-tinyrack-measure-lg rounded-tinyrack-md border border-tinyrack-border bg-tinyrack-surface p-tinyrack-md text-tinyrack-text text-tinyrack-xs shadow-tinyrack-overlay`,children:(0,Z.jsxs)(`div`,{className:`flex items-start gap-tinyrack-sm`,children:[(0,Z.jsx)(S,{"aria-hidden":!0,className:`size-tinyrack-lg shrink-0 text-tinyrack-warning-foreground`}),(0,Z.jsx)(`div`,{children:c(`profile.password.removeDisabledReason`)})]})})})})]})]}):(0,Z.jsx)(s,{appearance:`ghost`,"data-testid":`profile-password-set`,intent:`primary`,onClick:()=>o(`set`),type:`button`,uiSize:`sm`,children:c(`profile.password.set`)}),active:e,icon:k,note:n?(0,Z.jsxs)(i,{as:`div`,className:`flex items-center gap-tinyrack-xs`,color:`muted`,variant:`caption`,children:[(0,Z.jsx)(pe,{"aria-hidden":!0,className:`size-tinyrack-md shrink-0`}),(0,Z.jsx)(`span`,{children:c(`profile.password.configManaged`)})]}):void 0,status:c(e?`profile.password.status.set`:`profile.password.status.notSet`),title:c(`profile.password.title`)})}function ye({totpEnabled:e,recoveryCodesMissing:t,onOpenModal:n}){let{t:i}=r();return(0,Z.jsx)(Q,{actions:e?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(s,{appearance:`ghost`,"data-testid":`profile-totp-regenerate`,intent:`primary`,onClick:()=>n(`regenerate`),type:`button`,uiSize:`sm`,children:i(`profile.totp.regenerate`)}),(0,Z.jsx)(s,{appearance:`ghost`,"data-testid":`profile-totp-disable`,intent:`danger`,onClick:()=>n(`disable`),type:`button`,uiSize:`sm`,children:i(`profile.totp.disable`)})]}):(0,Z.jsx)(s,{appearance:`ghost`,"data-testid":`profile-totp-enable`,intent:`primary`,onClick:()=>n(`setup`),type:`button`,uiSize:`sm`,children:i(`profile.totp.enable`)}),active:e,icon:j,status:i(e?t?`profile.totp.status.recoveryCodesMissing`:`profile.totp.status.enabled`:`profile.totp.status.disabled`),title:i(`profile.totp.title`)})}var be={error:I,warning:N,info:S};function $({variant:e,children:t}){return(0,Z.jsx)(B,{"data-testid":`alert-banner-${e}`,icon:be[e],type:e,children:t})}function xe({isOpen:e,onClose:t,providerName:n,isPending:i,onConfirm:a}){let{t:o}=r(),[c,l]=(0,X.useState)(null),u=()=>{i||(l(null),t())};return(0,Z.jsx)(U,{description:o(`profile.linkedAccounts.unlinkModal.description`,{provider:n}),icon:de,isOpen:e,onClose:u,preventClose:i,title:o(`profile.linkedAccounts.unlinkModal.title`),variant:`destructive`,children:(0,Z.jsxs)(`div`,{className:`mt-tinyrack-lg flex flex-col gap-tinyrack-md`,children:[(0,Z.jsx)($,{variant:`warning`,children:o(`profile.linkedAccounts.unlinkModal.warning`,{provider:n})}),c&&(0,Z.jsx)($,{variant:`error`,children:c}),(0,Z.jsxs)(H,{children:[(0,Z.jsx)(s,{appearance:`outline`,"data-testid":`unlink-oauth-cancel`,disabled:i,intent:`neutral`,onClick:u,type:`button`,uiSize:`sm`,children:o(`profile.linkedAccounts.unlinkModal.cancel`)}),(0,Z.jsx)(s,{"data-testid":`unlink-oauth-unlink`,disabled:i,intent:`danger`,loading:i,loadingLabel:o(`profile.linkedAccounts.unlinking`),onClick:async()=>{l(null);try{await a(),u()}catch{l(o(`profile.linkedAccounts.unlinkError`))}},type:`button`,uiSize:`sm`,children:o(`profile.linkedAccounts.unlink`)})]})]})})}function Se({label:e,value:t}){return(0,Z.jsxs)(`div`,{className:`flex items-center justify-between gap-tinyrack-lg px-tinyrack-lg py-tinyrack-md`,children:[(0,Z.jsx)(i,{className:`shrink-0`,color:`muted`,variant:`caption`,children:e}),(0,Z.jsx)(i,{truncate:!0,variant:`bodySm`,weight:`medium`,children:t})]})}function Ce({user:e}){let{t}=r();return(0,Z.jsxs)(F.Root,{variant:`outlined`,children:[(0,Z.jsxs)(F.Header,{className:`border-tinyrack-border border-b-tinyrack-default px-tinyrack-lg py-tinyrack-md`,children:[(0,Z.jsx)(F.Title,{children:t(`profile.account.title`)}),(0,Z.jsx)(F.Description,{children:t(`profile.account.description`)})]}),(0,Z.jsxs)(F.Content,{className:`divide-y divide-tinyrack-border p-0`,children:[(0,Z.jsx)(Se,{label:t(`profile.id.label`),value:e.sub}),(0,Z.jsx)(Se,{label:t(`profile.email.label`),value:e.email})]})]})}function we({children:e,headerActions:t}){return(0,Z.jsxs)(`div`,{className:`flex min-h-dvh flex-col bg-tinyrack-surface`,children:[(0,Z.jsx)(_,{}),(0,Z.jsx)(y,{actions:t,brand:!0}),(0,Z.jsx)(`main`,{className:`flex flex-1 justify-center px-tinyrack-lg py-tinyrack-xl`,children:(0,Z.jsx)(`div`,{className:`auth-enter flex w-full max-w-tinyrack-overlay-md flex-col gap-tinyrack-xl`,children:e})})]})}var Te=h({mutationFn:async e=>d(await p.api.user.password.$post({json:e}))}),Ee=h({mutationFn:async e=>d(await p.api.user.password.$put({json:e}))}),De=h({mutationFn:async e=>d(await p.api.user.password.$delete({json:e}))});function Oe({isOpen:e,onClose:t}){let{t:n}=r(),i=u(),{data:a}=b(m),c=a.auth.password.policy,l=J({resolver:Y((0,X.useMemo)(()=>P.object({currentPassword:P.string().min(1,n(`validation.password.required`)),newPassword:P.string().min(c.min_length,n(`validation.password.min`,{count:c.min_length})).max(c.max_length,n(`validation.password.max`,{count:c.max_length})),confirmPassword:P.string()}).refine(e=>e.newPassword===e.confirmPassword,{message:n(`validation.confirmPassword.mismatch`),path:[`confirmPassword`]}),[c.max_length,c.min_length,n])),defaultValues:{currentPassword:``,newPassword:``,confirmPassword:``}}),d=g({...Ee,onSuccess:()=>{i.invalidateQueries({queryKey:L.queryKey}),f()}}),f=()=>{l.reset(),t()},p=l.handleSubmit(async e=>{try{await d.mutateAsync({current_password:e.currentPassword,new_password:e.newPassword})}catch(e){e instanceof o&&e.code===`INVALID_CURRENT_PASSWORD`?l.setError(`currentPassword`,{message:n(`profile.password.changeModal.invalidCurrent`)}):l.setError(`root`,{message:n(`profile.password.changeModal.error`)})}});return(0,Z.jsx)(U,{description:n(`profile.password.changeModal.description`),icon:k,isOpen:e,onClose:f,title:n(`profile.password.changeModal.title`),children:(0,Z.jsxs)(`form`,{className:`mt-tinyrack-lg flex flex-col gap-tinyrack-md`,onSubmit:p,children:[(0,Z.jsx)(D,{error:l.formState.errors.currentPassword,errorTestId:`change-password-error-currentPassword`,id:`current-password`,label:n(`profile.password.changeModal.currentPassword`),placeholder:n(`profile.password.changeModal.currentPasswordPlaceholder`),...l.register(`currentPassword`),type:`password`}),(0,Z.jsx)(D,{error:l.formState.errors.newPassword,errorTestId:`change-password-error-newPassword`,id:`new-password-change`,label:n(`profile.password.changeModal.newPassword`),placeholder:n(`profile.password.changeModal.newPasswordPlaceholder`),...l.register(`newPassword`),type:`password`}),(0,Z.jsx)(D,{error:l.formState.errors.confirmPassword,errorTestId:`change-password-error-confirmPassword`,id:`confirm-password-change`,label:n(`profile.password.changeModal.confirmPassword`),placeholder:n(`profile.password.changeModal.confirmPasswordPlaceholder`),...l.register(`confirmPassword`),type:`password`}),l.formState.errors.root&&(0,Z.jsx)($,{variant:`error`,children:l.formState.errors.root.message}),(0,Z.jsxs)(H,{children:[(0,Z.jsx)(s,{appearance:`outline`,"data-testid":`change-password-cancel`,disabled:d.isPending,intent:`neutral`,onClick:f,type:`button`,uiSize:`sm`,children:n(`profile.password.changeModal.cancel`)}),(0,Z.jsx)(s,{"data-testid":`change-password-submit`,disabled:d.isPending,intent:`primary`,loading:d.isPending,loadingLabel:n(`profile.password.changeModal.submitting`),type:`submit`,uiSize:`sm`,children:d.isPending?void 0:n(`profile.password.changeModal.submit`)})]})]})})}var ke=h({mutationFn:async()=>d(await p.api.user.$delete())});function Ae({isOpen:e,onClose:t,retentionDays:n}){let{t:i}=r(),a=l(),o=u(),c=J({resolver:Y((0,X.useMemo)(()=>P.object({confirmation:P.string().refine(e=>e.toLowerCase()===i(`profile.deleteAccount.modal.confirmPlaceholder`).toLowerCase(),{message:i(`validation.confirmText.mismatch`)})}),[i])),defaultValues:{confirmation:``}}),d=g({...ke,onSuccess:async()=>{o.setQueryData(L.queryKey,{user:null}),await V(),a.navigate({to:`/login`})}}),f=()=>{d.isPending||(c.reset(),t())},p=c.handleSubmit(async()=>{try{await d.mutateAsync()}catch{c.setError(`root`,{message:i(`profile.deleteAccount.error`)})}});return(0,Z.jsx)(U,{icon:M,isOpen:e,onClose:f,preventClose:d.isPending,title:i(`profile.deleteAccount.modal.title`),variant:`destructive`,children:(0,Z.jsxs)(`form`,{className:`mt-tinyrack-lg flex flex-col gap-tinyrack-md`,onSubmit:p,children:[(0,Z.jsx)($,{variant:`error`,children:(0,Z.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-xs`,children:[(0,Z.jsx)(`p`,{children:i(`profile.deleteAccount.modal.description`,{days:n})}),(0,Z.jsx)(`p`,{className:`text-tinyrack-xs opacity-tinyrack-hover`,children:i(`profile.deleteAccount.modal.warning`)})]})}),(0,Z.jsx)(D,{autoComplete:`off`,error:c.formState.errors.confirmation,errorTestId:`delete-account-error`,id:`delete-confirmation`,label:i(`profile.deleteAccount.modal.confirmLabel`),placeholder:i(`profile.deleteAccount.modal.confirmPlaceholder`),...c.register(`confirmation`),type:`text`}),c.formState.errors.root&&(0,Z.jsx)($,{variant:`error`,children:c.formState.errors.root.message}),(0,Z.jsxs)(H,{children:[(0,Z.jsx)(s,{appearance:`outline`,"data-testid":`delete-account-cancel`,disabled:d.isPending,intent:`neutral`,onClick:f,type:`button`,uiSize:`sm`,children:i(`profile.deleteAccount.modal.cancel`)}),(0,Z.jsx)(s,{"data-testid":`delete-account-submit`,disabled:d.isPending,intent:`danger`,loading:d.isPending,loadingLabel:i(`profile.deleteAccount.modal.confirming`),type:`submit`,uiSize:`sm`,children:d.isPending?void 0:i(`profile.deleteAccount.modal.confirm`)})]})]})})}function je({isOpen:e,onClose:t}){let{t:n}=r(),i=u(),a=J({resolver:Y((0,X.useMemo)(()=>P.object({code:P.string().length(6,n(`validation.totp.length`)).regex(/^\d{6}$/,n(`validation.totp.digits`))}),[n])),defaultValues:{code:``}}),c=g({...ce,onSuccess:()=>{i.invalidateQueries({queryKey:L.queryKey}),l()}}),l=()=>{a.reset(),t()},d=a.handleSubmit(async e=>{try{await c.mutateAsync({code:e.code})}catch(e){if(e instanceof o&&e.code===`CANNOT_REMOVE_LAST_SECOND_FACTOR`){a.setError(`code`,{message:n(`profile.totp.disableModal.cannotRemoveLastSecondFactor`)});return}a.setError(`code`,{message:n(`profile.totp.disableModal.error`)})}});return(0,Z.jsx)(U,{description:n(`profile.totp.disableModal.description`),icon:j,isOpen:e,onClose:l,title:n(`profile.totp.disableModal.title`),variant:`destructive`,children:(0,Z.jsxs)(`form`,{className:`mt-tinyrack-lg flex flex-col gap-tinyrack-md`,onSubmit:d,children:[(0,Z.jsx)($,{variant:`warning`,children:n(`profile.totp.disableModal.warning`)}),(0,Z.jsx)(D,{autoComplete:`one-time-code`,error:a.formState.errors.code,errorTestId:`disable-totp-error`,id:`disable-totp-code`,inputMode:`numeric`,label:n(`profile.totp.disableModal.codeLabel`),maxLength:6,pattern:`[0-9]*`,placeholder:`000000`,...a.register(`code`),type:`text`}),(0,Z.jsxs)(H,{children:[(0,Z.jsx)(s,{appearance:`outline`,"data-testid":`disable-totp-cancel`,disabled:c.isPending,intent:`neutral`,onClick:l,type:`button`,uiSize:`sm`,children:n(`profile.totp.disableModal.cancel`)}),(0,Z.jsx)(s,{"data-testid":`disable-totp-submit`,disabled:c.isPending,intent:`danger`,loading:c.isPending,loadingLabel:n(`profile.totp.disableModal.disabling`),type:`submit`,uiSize:`sm`,children:c.isPending?void 0:n(`profile.totp.disableModal.disable`)})]})]})})}function Me({isOpen:e,onClose:n,onAddNew:i}){let{t:a}=r(),c=u(),[l,d]=(0,X.useState)(null),[p,m]=(0,X.useState)(null),[h,_]=(0,X.useState)(null),[v,y]=(0,X.useState)(null),{data:b,isLoading:S}=x({...q,enabled:e}),C=g({...K,onSuccess:()=>{c.invalidateQueries({queryKey:f.passkeys()}),c.invalidateQueries({queryKey:L.queryKey})},onSettled:()=>{m(null)}}),w=(0,X.useCallback)(()=>{d(null),m(null),_(null),y(null),n()},[n]),T=e=>{_(e.id),y(null)},E=()=>{_(null),y(null)},D=async e=>{m(e.id),_(null);try{await C.mutateAsync({id:e.id})}catch(e){if(e instanceof o&&e.code===`CANNOT_REMOVE_LAST_SECOND_FACTOR`){y(a(`profile.passkey.manageModal.cannotRemoveLastSecondFactor`));return}y(a(`profile.passkey.manageModal.deleteError`))}},k=e=>new Date(e).toLocaleDateString(void 0,{year:`numeric`,month:`short`,day:`numeric`}),A=b?.passkeys||[];return(0,Z.jsxs)(U,{icon:O,isOpen:e,onClose:w,size:`lg`,title:a(`profile.passkey.manageModal.title`),children:[(0,Z.jsxs)(`div`,{className:`mt-tinyrack-lg flex flex-col gap-tinyrack-sm`,children:[v&&(0,Z.jsx)($,{variant:`error`,children:v}),S&&(0,Z.jsx)(`div`,{className:`flex justify-center py-tinyrack-xl`,children:(0,Z.jsx)(t,{uiSize:`md`})}),!S&&A.length===0&&(0,Z.jsx)(`div`,{className:`py-tinyrack-xl text-center text-tinyrack-sm text-tinyrack-text-muted`,"data-testid":`passkeys-empty`,children:(0,Z.jsx)(`p`,{children:a(`profile.passkey.manageModal.noPasskeys`)})}),!S&&A.length>0&&(0,Z.jsx)(`div`,{className:`flex flex-col gap-tinyrack-sm`,children:A.map(e=>(0,Z.jsx)(Ne,{formatDate:k,isConfirmingDelete:h===e.id,isDeleting:p===e.id,isEditing:l?.id===e.id,onCancelDelete:E,onCancelEdit:()=>d(null),onConfirmDelete:()=>D(e),onEdit:()=>d(e),onRequestDelete:()=>T(e),passkey:e},e.id))})]}),(0,Z.jsxs)(H,{children:[(0,Z.jsx)(s,{appearance:`outline`,"data-testid":`manage-passkeys-close`,intent:`neutral`,onClick:w,type:`button`,uiSize:`sm`,children:a(`profile.passkey.manageModal.close`)}),(0,Z.jsx)(s,{"data-testid":`manage-passkeys-add-new`,intent:`primary`,onClick:()=>{w(),i()},type:`button`,uiSize:`sm`,children:a(`profile.passkey.manageModal.addNew`)})]})]})}function Ne({passkey:e,isDeleting:t,isEditing:n,isConfirmingDelete:i,onEdit:a,onCancelEdit:o,onRequestDelete:c,onConfirmDelete:l,onCancelDelete:d,formatDate:p}){let{t:m}=r(),h=u(),_=J({resolver:Y((0,X.useMemo)(()=>P.object({name:P.string().min(1,m(`validation.passkey.name.required`)).max(100,m(`validation.passkey.name.max`))}),[m])),defaultValues:{name:e.name||``}}),v=g({...W,onSuccess:()=>{h.invalidateQueries({queryKey:f.passkeys()}),o()}}),y=_.handleSubmit(async t=>{try{await v.mutateAsync({id:e.id,name:t.name})}catch{_.setError(`name`,{message:m(`profile.passkey.manageModal.renameError`)})}});return n?(0,Z.jsxs)(`form`,{className:`flex flex-col gap-tinyrack-xs rounded-tinyrack-md bg-tinyrack-surface-muted p-tinyrack-sm`,onSubmit:y,children:[(0,Z.jsx)(D,{"data-testid":`passkey-rename-input`,error:_.formState.errors.name,errorTestId:`passkey-rename-error`,hideLabel:!0,label:m(`profile.passkey.manageModal.nameLabel`),placeholder:m(`profile.passkey.manageModal.namePlaceholder`),..._.register(`name`),type:`text`}),(0,Z.jsxs)(`div`,{className:`flex justify-end gap-tinyrack-xs`,children:[(0,Z.jsx)(s,{appearance:`ghost`,disabled:v.isPending,onClick:()=>{_.reset(),o()},type:`button`,uiSize:`sm`,children:m(`profile.passkey.manageModal.cancelEdit`)}),(0,Z.jsx)(s,{disabled:v.isPending,intent:`primary`,type:`submit`,uiSize:`sm`,children:v.isPending?m(`profile.passkey.manageModal.saving`):m(`profile.passkey.manageModal.save`)})]})]}):i?(0,Z.jsxs)(`div`,{className:`flex items-center justify-between rounded-tinyrack-md border border-tinyrack-danger-border bg-tinyrack-danger-surface p-tinyrack-sm text-tinyrack-danger-foreground`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-tinyrack-sm`,children:[(0,Z.jsx)(M,{className:`size-tinyrack-lg`}),(0,Z.jsx)(`span`,{className:`text-tinyrack-xs`,children:m(`profile.passkey.manageModal.deleteConfirmInline`)})]}),(0,Z.jsxs)(`div`,{className:`flex gap-tinyrack-xs`,children:[(0,Z.jsx)(s,{appearance:`ghost`,onClick:d,type:`button`,uiSize:`sm`,children:m(`profile.passkey.manageModal.cancelEdit`)}),(0,Z.jsx)(s,{intent:`danger`,onClick:l,type:`button`,uiSize:`sm`,children:m(`profile.passkey.manageModal.delete`)})]})]}):(0,Z.jsxs)(`div`,{className:`flex items-center justify-between rounded-tinyrack-md bg-tinyrack-surface-muted p-tinyrack-sm`,"data-testid":`passkey-item`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-tinyrack-sm`,children:[e.device_type===`multiDevice`?(0,Z.jsx)(ue,{className:`size-tinyrack-lg text-tinyrack-primary-foreground`}):(0,Z.jsx)(me,{className:`size-tinyrack-lg text-tinyrack-primary-foreground`}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(`div`,{className:`font-tinyrack-medium text-tinyrack-xs`,children:e.name||m(`profile.passkey.manageModal.unnamedPasskey`)}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-tinyrack-xs text-tinyrack-text-muted text-tinyrack-xs`,children:[(0,Z.jsx)(`span`,{children:m(`profile.passkey.manageModal.createdAt`,{date:p(e.created_at)})}),e.backed_up&&(0,Z.jsx)(ae,{uiSize:`md`,variant:`success`,children:m(`profile.passkey.manageModal.backedUp`)})]})]})]}),(0,Z.jsxs)(`div`,{className:`flex gap-tinyrack-xs`,children:[(0,Z.jsx)(s,{appearance:`ghost`,"aria-label":m(`profile.passkey.manageModal.rename`),onClick:a,type:`button`,uiSize:`sm`,children:(0,Z.jsx)(fe,{className:`size-tinyrack-lg`})}),(0,Z.jsx)(s,{appearance:`ghost`,"aria-label":m(`profile.passkey.manageModal.delete`),disabled:t,intent:`danger`,loading:t,onClick:c,type:`button`,uiSize:`sm`,children:t?void 0:(0,Z.jsx)(M,{className:`size-tinyrack-lg`})})]})]})}function Pe({isOpen:e,onClose:t}){let{t:n}=r(),i=l(),a=u(),{data:s}=b(m),[c,d]=(0,X.useState)(`verify`),[f,p]=(0,X.useState)(null),[h,_]=(0,X.useState)(null),v=g({...le,onSuccess:async e=>{p(e),d(`recovery`),await a.invalidateQueries({queryKey:L.queryKey})}}),y=(0,X.useCallback)(()=>{d(`verify`),p(null),_(null),v.reset()},[v]),x=(0,X.useCallback)(()=>{y(),t()},[t,y]),S=(0,X.useCallback)(async e=>{_(null);try{await v.mutateAsync({code:e})}catch(e){if(e instanceof o){if(e.code===`INVALID_TOTP_CODE`)throw e;if(e.code===`UNAUTHORIZED`){a.setQueryData(L.queryKey,{user:null}),await V(),i.navigate({to:`/login`});return}if(e.code===`TOTP_NOT_ENABLED`||e.code===`VALIDATION_ERROR`){await a.invalidateQueries({queryKey:L.queryKey}),x();return}}_(n(`profile.totp.regenerateModal.unexpectedError`))}},[x,v,a,i,n]);return s.auth.password.totp.enabled?(0,Z.jsx)(U,{description:n(c===`verify`?`profile.totp.regenerateModal.description`:`profile.totp.regenerateModal.recoveryDescription`),icon:j,isOpen:e,onClose:x,preventClose:c===`recovery`,size:`sm`,title:n(c===`verify`?`profile.totp.regenerateModal.title`:`profile.totp.regenerateModal.recoveryTitle`),children:c===`verify`?(0,Z.jsxs)(`div`,{className:`mt-tinyrack-lg`,children:[h&&(0,Z.jsx)(`div`,{className:`mb-tinyrack-md`,children:(0,Z.jsx)($,{variant:`error`,children:h})}),(0,Z.jsx)(T,{invalidMessage:n(`profile.totp.regenerateModal.error`),isPending:v.isPending,onSubmit:S,pendingText:n(`profile.totp.regenerateModal.submitting`),submitLabel:n(`profile.totp.regenerateModal.submit`)})]}):(0,Z.jsx)(`div`,{className:`mt-tinyrack-lg`,children:(0,Z.jsx)(C,{onConfirm:x,recoveryCodes:f?.recovery_codes??[]})})}):null}function Fe({isOpen:e,onClose:t}){let{t:n}=r(),i=u(),a=J({resolver:Y((0,X.useMemo)(()=>P.object({currentPassword:P.string().min(1,n(`validation.password.required`))}),[n])),defaultValues:{currentPassword:``}}),c=g({...De,onSuccess:()=>{i.invalidateQueries({queryKey:L.queryKey}),l()}}),l=()=>{a.reset(),t()},d=a.handleSubmit(async e=>{try{await c.mutateAsync({current_password:e.currentPassword})}catch(e){if(e instanceof o){if(e.code===`INVALID_CURRENT_PASSWORD`){a.setError(`currentPassword`,{message:n(`profile.password.removeModal.invalidCurrent`)});return}if(e.code===`CANNOT_REMOVE_LAST_AUTH_METHOD`){a.setError(`root`,{message:n(`profile.password.removeModal.noOAuth`)});return}if(e.code===`CANNOT_REMOVE_PASSWORD_WITH_SECOND_FACTOR_ONLY`){a.setError(`root`,{message:n(`profile.password.removeModal.noOAuthWith2FA`)});return}}a.setError(`root`,{message:n(`profile.password.removeModal.error`)})}});return(0,Z.jsx)(U,{description:n(`profile.password.removeModal.description`),icon:k,isOpen:e,onClose:l,title:n(`profile.password.removeModal.title`),variant:`destructive`,children:(0,Z.jsxs)(`form`,{className:`mt-tinyrack-lg flex flex-col gap-tinyrack-md`,onSubmit:d,children:[(0,Z.jsx)(D,{error:a.formState.errors.currentPassword,errorTestId:`remove-password-error`,id:`current-password-remove`,label:n(`profile.password.removeModal.currentPassword`),placeholder:n(`profile.password.removeModal.currentPasswordPlaceholder`),...a.register(`currentPassword`),type:`password`}),a.formState.errors.root&&(0,Z.jsx)($,{variant:`error`,children:a.formState.errors.root.message}),(0,Z.jsxs)(H,{children:[(0,Z.jsx)(s,{appearance:`outline`,"data-testid":`remove-password-cancel`,disabled:c.isPending,intent:`neutral`,onClick:l,type:`button`,uiSize:`sm`,children:n(`profile.password.removeModal.cancel`)}),(0,Z.jsx)(s,{"data-testid":`remove-password-submit`,disabled:c.isPending,intent:`danger`,loading:c.isPending,loadingLabel:n(`profile.password.removeModal.submitting`),type:`submit`,uiSize:`sm`,children:c.isPending?void 0:n(`profile.password.removeModal.submit`)})]})]})})}function Ie({isOpen:e,onClose:t}){let{t:n}=r(),i=u(),{data:a}=b(m),o=a.auth.password.policy,c=J({resolver:Y((0,X.useMemo)(()=>P.object({password:P.string().min(o.min_length,n(`validation.password.min`,{count:o.min_length})).max(o.max_length,n(`validation.password.max`,{count:o.max_length})),confirmPassword:P.string()}).refine(e=>e.password===e.confirmPassword,{message:n(`validation.confirmPassword.mismatch`),path:[`confirmPassword`]}),[o.max_length,o.min_length,n])),defaultValues:{password:``,confirmPassword:``}}),l=g({...Te,onSuccess:()=>{i.invalidateQueries({queryKey:L.queryKey}),d()}}),d=()=>{c.reset(),t()},f=c.handleSubmit(async e=>{try{await l.mutateAsync({password:e.password})}catch{c.setError(`root`,{message:n(`profile.password.setModal.error`)})}});return(0,Z.jsx)(U,{description:n(`profile.password.setModal.description`),icon:k,isOpen:e,onClose:d,title:n(`profile.password.setModal.title`),children:(0,Z.jsxs)(`form`,{className:`mt-tinyrack-lg flex flex-col gap-tinyrack-md`,onSubmit:f,children:[(0,Z.jsx)(D,{error:c.formState.errors.password,errorTestId:`set-password-error-password`,id:`new-password`,label:n(`profile.password.setModal.newPassword`),placeholder:n(`profile.password.setModal.newPasswordPlaceholder`),...c.register(`password`),type:`password`}),(0,Z.jsx)(D,{error:c.formState.errors.confirmPassword,errorTestId:`set-password-error-confirmPassword`,id:`confirm-password`,label:n(`profile.password.setModal.confirmPassword`),placeholder:n(`profile.password.setModal.confirmPasswordPlaceholder`),...c.register(`confirmPassword`),type:`password`}),c.formState.errors.root&&(0,Z.jsx)($,{variant:`error`,children:c.formState.errors.root.message}),(0,Z.jsxs)(H,{children:[(0,Z.jsx)(s,{appearance:`outline`,"data-testid":`set-password-cancel`,disabled:l.isPending,intent:`neutral`,onClick:d,type:`button`,uiSize:`sm`,children:n(`profile.password.setModal.cancel`)}),(0,Z.jsx)(s,{"data-testid":`set-password-submit`,disabled:l.isPending,intent:`primary`,loading:l.isPending,loadingLabel:n(`profile.password.setModal.submitting`),type:`submit`,uiSize:`sm`,children:l.isPending?void 0:n(`profile.password.setModal.submit`)})]})]})})}function Le({isOpen:e,onClose:n,isRequired:i=!1,canSwitchToTotp:a=!1,onSwitchToTotp:o}){let{t:c}=r(),l=u(),[d,p]=(0,X.useState)(`name`),[m,h]=(0,X.useState)(null),_=J({resolver:Y((0,X.useMemo)(()=>P.object({name:P.string().max(100,c(`validation.passkey.name.max`)).optional().transform(e=>e?.trim()||void 0)}),[c])),defaultValues:{name:``}}),v=g({...G,onSuccess:()=>{l.invalidateQueries({queryKey:f.passkeys()}),l.invalidateQueries({queryKey:L.queryKey}),y()},onError:e=>{p(`name`),e.name===`NotAllowedError`?h(c(`profile.passkey.setupModal.cancelled`)):h(c(`profile.passkey.setupModal.error`))}}),y=(0,X.useCallback)(()=>{_.reset(),p(`name`),h(null),n()},[_,n]),b=_.handleSubmit(async e=>{p(`register`),h(null);try{await v.mutateAsync({name:e.name})}catch{}}),x=v.isPending;return(0,Z.jsxs)(U,{description:i?c(`profile.passkey.setupModal.requiredDescription`):void 0,icon:O,isOpen:e,onClose:y,preventClose:i,size:`sm`,title:c(`profile.passkey.setupModal.title`),children:[d===`name`&&(0,Z.jsxs)(`form`,{className:`mt-tinyrack-lg flex flex-col gap-tinyrack-md`,onSubmit:b,children:[(0,Z.jsx)(`p`,{className:`text-tinyrack-text-muted text-tinyrack-xs`,children:c(`profile.passkey.setupModal.description`)}),m&&(0,Z.jsx)($,{variant:`error`,children:m}),(0,Z.jsx)(D,{error:_.formState.errors.name,errorTestId:`setup-passkey-error`,hint:c(`profile.passkey.setupModal.nameHint`),id:`passkey-name`,label:c(`profile.passkey.setupModal.nameLabel`),placeholder:c(`profile.passkey.setupModal.namePlaceholder`),..._.register(`name`),type:`text`}),(0,Z.jsxs)(H,{children:[(0,Z.jsx)(s,{appearance:`outline`,"data-testid":`setup-passkey-cancel`,intent:`neutral`,onClick:y,type:`button`,uiSize:`sm`,children:c(`profile.passkey.setupModal.cancel`)}),(0,Z.jsx)(s,{"data-testid":`setup-passkey-continue`,intent:`primary`,type:`submit`,uiSize:`sm`,children:c(`profile.passkey.setupModal.continue`)})]}),a&&o&&(0,Z.jsx)(`p`,{className:`mt-tinyrack-sm text-center text-tinyrack-xs`,children:(0,Z.jsx)(s,{appearance:`ghost`,intent:`primary`,onClick:o,type:`button`,uiSize:`sm`,children:c(`profile.passkey.setupModal.switchToTotp`)})})]}),d===`register`&&(0,Z.jsxs)(`div`,{className:`mt-tinyrack-lg`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-col items-center gap-tinyrack-md py-tinyrack-xl`,"data-testid":`setup-passkey-loading`,children:[(0,Z.jsx)(t,{uiSize:`md`}),(0,Z.jsx)(`p`,{className:`text-center text-tinyrack-text-muted text-tinyrack-xs`,children:c(`profile.passkey.setupModal.waitingForDevice`)})]}),(0,Z.jsx)(H,{children:(0,Z.jsx)(s,{appearance:`outline`,"data-testid":`setup-passkey-cancel`,disabled:x,intent:`neutral`,onClick:y,type:`button`,uiSize:`sm`,children:c(`profile.passkey.setupModal.cancel`)})})]})]})}function Re({isOpen:e,onClose:n,isRequired:i=!1,canSwitchToPasskey:a=!1,onSwitchToPasskey:o}){let{t:c}=r(),{step:l,setupData:u,recoveryCodes:d,isSetupPending:f,isVerifyPending:p,isConfirmPending:m,startSetup:h,verify:g,goToVerify:_,goToQr:v,confirmRecoveryCodes:y,reset:b}=E({autoStart:!1,onConfirmSuccess:()=>{b(),n()}}),x=(0,X.useCallback)(()=>{b(),n()},[n,b]),S=(0,X.useCallback)(()=>{!u&&!f&&h()},[u,f,h]);e&&!u&&!f&&l!==`error`&&S();let D=(0,X.useCallback)(async e=>{await g(e)},[g]),O=c(l===`recovery`?`setupTotp.recoveryCodes.title`:`profile.totp.setupModal.title`);return(0,Z.jsxs)(U,{description:i?c(`profile.totp.setupModal.requiredDescription`):void 0,icon:j,isOpen:e,onClose:x,preventClose:i||l===`recovery`,size:`sm`,title:O,children:[f&&(0,Z.jsx)(`div`,{className:`flex justify-center py-tinyrack-xl`,"data-testid":`setup-totp-loading`,children:(0,Z.jsx)(t,{uiSize:`md`})}),l===`error`&&(0,Z.jsxs)(`div`,{className:`mt-tinyrack-lg flex flex-col gap-tinyrack-md`,children:[(0,Z.jsx)($,{variant:`error`,children:c(`profile.totp.setupModal.setupError`)}),(0,Z.jsxs)(H,{children:[(0,Z.jsx)(s,{appearance:`outline`,intent:`neutral`,onClick:x,type:`button`,uiSize:`sm`,children:c(`profile.totp.setupModal.cancel`)}),(0,Z.jsx)(s,{intent:`primary`,onClick:h,type:`button`,uiSize:`sm`,children:c(`profile.totp.setupModal.retry`)})]})]}),u&&l===`qr`&&(0,Z.jsx)(`div`,{className:`mt-tinyrack-lg`,children:(0,Z.jsx)(w,{additionalActions:(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(H,{children:(0,Z.jsx)(s,{appearance:`outline`,intent:`neutral`,onClick:x,type:`button`,uiSize:`sm`,children:c(`profile.totp.setupModal.cancel`)})}),a&&o&&(0,Z.jsx)(`p`,{className:`mt-tinyrack-sm text-center text-tinyrack-xs`,children:(0,Z.jsx)(s,{appearance:`ghost`,intent:`primary`,onClick:o,type:`button`,uiSize:`sm`,children:c(`profile.totp.setupModal.switchToPasskey`)})})]}),onNext:_,setupData:u})}),u&&l===`verify`&&(0,Z.jsx)(`div`,{className:`mt-tinyrack-lg`,children:(0,Z.jsx)(T,{isPending:p,onBack:v,onSubmit:D})}),l===`recovery`&&d.length>0&&(0,Z.jsx)(`div`,{className:`mt-tinyrack-lg`,children:(0,Z.jsx)(C,{isLoading:m,onConfirm:y,recoveryCodes:d})})]})}var ze={access_denied:`oauth.error.accessDenied`,temporarily_unavailable:`oauth.error.temporarilyUnavailable`,server_error:`oauth.error.serverError`};function Be(){let{t:e}=r(),t=l(),n=u(),a=ie.useSearch().oauth_error,o=a?e(ze[a]??`oauth.error.failed`):void 0,[c,d]=(0,X.useState)(null),[f,p]=(0,X.useState)(null),[h,_]=(0,X.useState)(null),[v,y]=(0,X.useState)(null),[x,S]=(0,X.useState)(null),[C,w]=(0,X.useState)(!1),{data:T}=b(L),{data:E}=b(R),{data:D}=b(m),O=g({...te,onSuccess:async()=>{n.setQueryData(L.queryKey,{user:null}),await V(),t.navigate({to:`/login`})},onSettled:()=>{n.invalidateQueries({queryKey:L.queryKey})}}),k=g({...re,onSuccess:()=>{n.invalidateQueries({queryKey:R.queryKey})},onSettled:()=>{d(null)}}),A=async()=>{f&&(d(f.id),await k.mutateAsync(f.id))};if(!T.user)return null;let j=T.user,M=E.available_providers,N=M.some(e=>e.linked),P=j.managed_by===`config`,z=D.auth.password,ae=D.auth.passkey,H=z.totp.enabled,U=ae.enabled,W=D.account_deletion.enabled,G=D.account_deletion.retention,K=(()=>{let e=G.match(/^(\d+)([dmy])$/);if(!e)return 30;let t=parseInt(e[1],10);switch(e[2]){case`d`:return t;case`m`:return t*30;case`y`:return t*365;default:return 30}})(),q=!P&&H,J=!P&&U,Y=M.length>0;return(0,Z.jsxs)(we,{headerActions:(0,Z.jsx)(s,{appearance:`ghost`,"aria-label":e(`profile.logout`),"data-testid":`profile-logout`,disabled:O.isPending,loading:O.isPending,onClick:()=>O.mutate(),type:`button`,uiSize:`sm`,children:O.isPending?void 0:(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(ee,{"aria-hidden":!0,className:`size-tinyrack-lg`}),(0,Z.jsx)(`span`,{className:`hidden sm:inline`,children:e(`profile.logout`)})]})}),children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-tinyrack-lg`,children:[(0,Z.jsx)(se,{email:j.email,size:`lg`}),(0,Z.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-tinyrack-3xs`,children:[(0,Z.jsx)(oe,{title:e(`profile.title`)}),(0,Z.jsx)(i,{as:`p`,color:`muted`,"data-testid":`profile-user-email`,truncate:!0,variant:`bodySm`,children:j.email})]})]}),o&&(0,Z.jsx)(B,{icon:I,type:`error`,children:o}),j&&(0,Z.jsx)(Ce,{user:j}),(0,Z.jsxs)(F.Root,{variant:`outlined`,children:[(0,Z.jsxs)(F.Header,{className:`border-tinyrack-border border-b-tinyrack-default px-tinyrack-lg py-tinyrack-md`,children:[(0,Z.jsx)(F.Title,{children:e(`profile.security.title`)}),(0,Z.jsx)(F.Description,{children:e(`profile.security.description`)})]}),q&&j.totp_recovery_codes_missing&&(0,Z.jsx)(`div`,{className:`border-tinyrack-border border-b-tinyrack-default px-tinyrack-lg py-tinyrack-md`,"data-testid":`profile-totp-recovery-warning`,children:(0,Z.jsx)(B,{icon:I,type:`warning`,children:e(`profile.totp.recoveryCodesMissing`)})}),(0,Z.jsxs)(F.Content,{className:`divide-y divide-tinyrack-border p-0`,children:[(0,Z.jsx)(ve,{hasLinkedOAuth:N,hasPassword:j.has_password,hasSecondFactorOnly:j.has_password&&!N&&(j.totp_registered||j.passkey_count>0),isConfigManaged:P,onOpenModal:_}),q&&(0,Z.jsx)(ye,{onOpenModal:y,recoveryCodesMissing:j.totp_recovery_codes_missing,totpEnabled:j.totp_registered}),J&&(0,Z.jsx)(_e,{onOpenModal:S,passkeyCount:j.passkey_count})]})]}),Y&&(0,Z.jsx)(ge,{getAuthorizeUrl:ne,onUnlinkRequest:e=>p({id:e.id,name:e.display_name}),providers:M,unlinkingProvider:c}),(0,Z.jsx)(he,{isConfigManaged:P,isDeletionEnabled:W,onDeleteClick:()=>w(!0)}),(0,Z.jsx)(Ie,{isOpen:h===`set`,onClose:()=>_(null)}),(0,Z.jsx)(Oe,{isOpen:h===`change`,onClose:()=>_(null)}),(0,Z.jsx)(Fe,{isOpen:h===`remove`,onClose:()=>_(null)}),(0,Z.jsx)(Re,{isOpen:v===`setup`,onClose:()=>y(null)}),(0,Z.jsx)(je,{isOpen:v===`disable`,onClose:()=>y(null)}),(0,Z.jsx)(Pe,{isOpen:v===`regenerate`,onClose:()=>y(null)}),(0,Z.jsx)(Le,{isOpen:x===`setup`,onClose:()=>S(null)}),(0,Z.jsx)(Me,{isOpen:x===`manage`,onAddNew:()=>S(`setup`),onClose:()=>S(null)}),(0,Z.jsx)(xe,{isOpen:f!==null,isPending:k.isPending,onClose:()=>p(null),onConfirm:A,providerName:f?.name??``}),(0,Z.jsx)(Ae,{isOpen:C,onClose:()=>w(!1),retentionDays:K})]})}export{Be as component};
|
|
2
|
-
//# sourceMappingURL=profile-RpDmbWNA.js.map
|