@datatechsolutions/ui 3.13.1 → 3.14.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/dist/astrlabe/graph-node.js +6 -6
- package/dist/astrlabe/graph-node.mjs +2 -2
- package/dist/astrlabe/index.js +114 -114
- package/dist/astrlabe/index.mjs +6 -6
- package/dist/astrlabe/workflow-canvas.js +6 -6
- package/dist/astrlabe/workflow-canvas.mjs +5 -5
- package/dist/{chunk-VCL5LDS5.js → chunk-2II2NLAZ.js} +38 -38
- package/dist/{chunk-VCL5LDS5.js.map → chunk-2II2NLAZ.js.map} +1 -1
- package/dist/{chunk-O4RZCDP2.mjs → chunk-2SBVFLPZ.mjs} +19 -2
- package/dist/chunk-2SBVFLPZ.mjs.map +1 -0
- package/dist/{chunk-TRNDFSM6.mjs → chunk-33ZWFDVG.mjs} +14 -14
- package/dist/chunk-33ZWFDVG.mjs.map +1 -0
- package/dist/{chunk-VWZ53TE2.js → chunk-4HZ55YKZ.js} +9 -9
- package/dist/{chunk-VWZ53TE2.js.map → chunk-4HZ55YKZ.js.map} +1 -1
- package/dist/{chunk-ULSG4JLR.js → chunk-4P72IJOM.js} +6 -6
- package/dist/{chunk-ULSG4JLR.js.map → chunk-4P72IJOM.js.map} +1 -1
- package/dist/{chunk-4Z5NZINA.js → chunk-5SCZB5UI.js} +122 -122
- package/dist/chunk-5SCZB5UI.js.map +1 -0
- package/dist/{chunk-Y65X2NHF.mjs → chunk-5YCH7FHT.mjs} +3 -3
- package/dist/{chunk-Y65X2NHF.mjs.map → chunk-5YCH7FHT.mjs.map} +1 -1
- package/dist/{chunk-DTFU3ZTD.js → chunk-6NBQTIXX.js} +9 -9
- package/dist/{chunk-DTFU3ZTD.js.map → chunk-6NBQTIXX.js.map} +1 -1
- package/dist/{chunk-CVEI4RQP.js → chunk-6NEESZVO.js} +4 -4
- package/dist/{chunk-CVEI4RQP.js.map → chunk-6NEESZVO.js.map} +1 -1
- package/dist/{chunk-AC54BNSK.js → chunk-72XZ7DSF.js} +13 -13
- package/dist/{chunk-AC54BNSK.js.map → chunk-72XZ7DSF.js.map} +1 -1
- package/dist/{chunk-ZPV7X4ZE.mjs → chunk-7NHJSD4A.mjs} +6 -6
- package/dist/{chunk-ZPV7X4ZE.mjs.map → chunk-7NHJSD4A.mjs.map} +1 -1
- package/dist/{chunk-CKY2QIRR.js → chunk-7SDB2VC2.js} +4 -4
- package/dist/{chunk-CKY2QIRR.js.map → chunk-7SDB2VC2.js.map} +1 -1
- package/dist/{chunk-FV42SSLP.js → chunk-A5OMGPMR.js} +4 -4
- package/dist/{chunk-FV42SSLP.js.map → chunk-A5OMGPMR.js.map} +1 -1
- package/dist/{chunk-54T5F65C.js → chunk-AUCS2KF4.js} +17 -17
- package/dist/{chunk-54T5F65C.js.map → chunk-AUCS2KF4.js.map} +1 -1
- package/dist/{chunk-QEACOJXX.mjs → chunk-F4KHAKTP.mjs} +102 -46
- package/dist/chunk-F4KHAKTP.mjs.map +1 -0
- package/dist/{chunk-Q7QPHZOV.js → chunk-FHGWXWVZ.js} +67 -67
- package/dist/{chunk-Q7QPHZOV.js.map → chunk-FHGWXWVZ.js.map} +1 -1
- package/dist/{chunk-RWZ2PLMQ.js → chunk-FZUV7GNB.js} +175 -118
- package/dist/chunk-FZUV7GNB.js.map +1 -0
- package/dist/{chunk-RMPXGEFL.mjs → chunk-HQNIETHV.mjs} +8 -8
- package/dist/{chunk-RMPXGEFL.mjs.map → chunk-HQNIETHV.mjs.map} +1 -1
- package/dist/{chunk-VPRAESA7.mjs → chunk-KDDXDQR2.mjs} +3 -3
- package/dist/{chunk-VPRAESA7.mjs.map → chunk-KDDXDQR2.mjs.map} +1 -1
- package/dist/{chunk-PM7A5I3X.js → chunk-LJGPMMKB.js} +113 -113
- package/dist/{chunk-PM7A5I3X.js.map → chunk-LJGPMMKB.js.map} +1 -1
- package/dist/{chunk-EBARYRSA.js → chunk-MXQ2EYG2.js} +19 -2
- package/dist/chunk-MXQ2EYG2.js.map +1 -0
- package/dist/{chunk-SCGICCQM.mjs → chunk-N6SGVUTR.mjs} +7 -10
- package/dist/chunk-N6SGVUTR.mjs.map +1 -0
- package/dist/{chunk-7IAWXG43.js → chunk-NIZSQJRW.js} +33 -33
- package/dist/{chunk-7IAWXG43.js.map → chunk-NIZSQJRW.js.map} +1 -1
- package/dist/{chunk-UUTTS3VV.mjs → chunk-NXWIT4YQ.mjs} +8 -11
- package/dist/chunk-NXWIT4YQ.mjs.map +1 -0
- package/dist/{chunk-DJHNSBIR.mjs → chunk-OTQXU4WG.mjs} +26 -26
- package/dist/{chunk-DJHNSBIR.mjs.map → chunk-OTQXU4WG.mjs.map} +1 -1
- package/dist/{chunk-3VCSMSJB.mjs → chunk-PO66V2PN.mjs} +9 -9
- package/dist/{chunk-3VCSMSJB.mjs.map → chunk-PO66V2PN.mjs.map} +1 -1
- package/dist/{chunk-B3TA74C4.js → chunk-PXGESUKI.js} +57 -60
- package/dist/chunk-PXGESUKI.js.map +1 -0
- package/dist/{chunk-YHD6SJIN.mjs → chunk-Q2FUNDCP.mjs} +4 -4
- package/dist/{chunk-YHD6SJIN.mjs.map → chunk-Q2FUNDCP.mjs.map} +1 -1
- package/dist/{chunk-4MNKVDTJ.mjs → chunk-Q5TZTA6H.mjs} +4 -4
- package/dist/{chunk-4MNKVDTJ.mjs.map → chunk-Q5TZTA6H.mjs.map} +1 -1
- package/dist/{chunk-4QCO4CBC.mjs → chunk-T7DROKWJ.mjs} +4 -4
- package/dist/{chunk-4QCO4CBC.mjs.map → chunk-T7DROKWJ.mjs.map} +1 -1
- package/dist/{chunk-WX44DAQD.mjs → chunk-TQADF23S.mjs} +3 -3
- package/dist/{chunk-WX44DAQD.mjs.map → chunk-TQADF23S.mjs.map} +1 -1
- package/dist/{chunk-4VEQJAXJ.mjs → chunk-U7VMFQFN.mjs} +5 -5
- package/dist/{chunk-4VEQJAXJ.mjs.map → chunk-U7VMFQFN.mjs.map} +1 -1
- package/dist/{chunk-M4KRQXOT.mjs → chunk-WE35EV7J.mjs} +3 -3
- package/dist/{chunk-M4KRQXOT.mjs.map → chunk-WE35EV7J.mjs.map} +1 -1
- package/dist/{chunk-RSCRIDMW.mjs → chunk-WTSMTLSP.mjs} +39 -45
- package/dist/chunk-WTSMTLSP.mjs.map +1 -0
- package/dist/{chunk-RPNMDGRA.js → chunk-YFMMZHL5.js} +37 -40
- package/dist/chunk-YFMMZHL5.js.map +1 -0
- package/dist/{chunk-XYMHIZ3K.mjs → chunk-ZBX7UCAP.mjs} +7 -7
- package/dist/{chunk-XYMHIZ3K.mjs.map → chunk-ZBX7UCAP.mjs.map} +1 -1
- package/dist/{chunk-RUZPOHJW.js → chunk-ZE6U4N4Q.js} +42 -42
- package/dist/{chunk-RUZPOHJW.js.map → chunk-ZE6U4N4Q.js.map} +1 -1
- package/dist/{chunk-UPWJRCAD.js → chunk-ZIRD3X6G.js} +220 -226
- package/dist/chunk-ZIRD3X6G.js.map +1 -0
- package/dist/index.d.mts +77 -7
- package/dist/index.d.ts +77 -7
- package/dist/index.js +708 -704
- package/dist/index.mjs +3 -3
- package/dist/platform/admin/index.js +12 -12
- package/dist/platform/admin/index.mjs +6 -6
- package/dist/platform/agents-workspace.js +9 -9
- package/dist/platform/agents-workspace.mjs +8 -8
- package/dist/platform/app-shell.js +5 -5
- package/dist/platform/app-shell.mjs +4 -4
- package/dist/platform/auth/index.js +29 -29
- package/dist/platform/auth/index.mjs +6 -6
- package/dist/platform/billing/index.js +7 -7
- package/dist/platform/billing/index.mjs +5 -5
- package/dist/platform/impersonation/index.js +5 -5
- package/dist/platform/impersonation/index.mjs +4 -4
- package/dist/platform/index.js +97 -97
- package/dist/platform/index.mjs +22 -22
- package/dist/platform/pages/index.d.mts +103 -1
- package/dist/platform/pages/index.d.ts +103 -1
- package/dist/platform/pages/index.js +934 -488
- package/dist/platform/pages/index.js.map +1 -1
- package/dist/platform/pages/index.mjs +530 -90
- package/dist/platform/pages/index.mjs.map +1 -1
- package/dist/platform/settings/index.js +9 -9
- package/dist/platform/settings/index.mjs +8 -8
- package/dist/platform/workflow-canvas-shell.js +7 -7
- package/dist/platform/workflow-canvas-shell.mjs +6 -6
- package/package.json +1 -1
- package/dist/chunk-4Z5NZINA.js.map +0 -1
- package/dist/chunk-B3TA74C4.js.map +0 -1
- package/dist/chunk-EBARYRSA.js.map +0 -1
- package/dist/chunk-O4RZCDP2.mjs.map +0 -1
- package/dist/chunk-QEACOJXX.mjs.map +0 -1
- package/dist/chunk-RPNMDGRA.js.map +0 -1
- package/dist/chunk-RSCRIDMW.mjs.map +0 -1
- package/dist/chunk-RWZ2PLMQ.js.map +0 -1
- package/dist/chunk-SCGICCQM.mjs.map +0 -1
- package/dist/chunk-TRNDFSM6.mjs.map +0 -1
- package/dist/chunk-UPWJRCAD.js.map +0 -1
- package/dist/chunk-UUTTS3VV.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/platform/pages/users-page-view.tsx","../src/platform/pages/roles-page-view.tsx","../src/platform/workflow-workspace.tsx"],"names":["useState","useMemo","jsxs","jsx","HeroSection","UserGroupIcon","SearchBar","FormSection","ChipPicker","Button","CreateActionButton","EntityCard","InlineForm","FormSelect","GlassModal","FormGrid","FormInput","ShieldCheckIcon","Badge","useLocale","Workspace"],"mappings":"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","file":"chunk-7IAWXG43.js","sourcesContent":["import { useMemo, useState, type FormEvent } from 'react'\nimport { UserGroupIcon } from '@heroicons/react/24/outline'\nimport {\n Button,\n ChipPicker,\n CreateActionButton,\n EntityCard,\n FormGrid,\n FormInput,\n FormSection,\n GlassModal,\n FormSelect,\n HeroSection,\n InlineForm,\n SearchBar,\n type ActiveFilter,\n} from '@ui/index'\nimport type { UserRole, ManagedUser, UsersPageViewProps } from '@datatechsolutions/shared-domain/common'\n\nconst ROLE_OPTIONS: Array<{ value: UserRole; label: string }> = [\n { value: 'admin', label: 'Admin' },\n { value: 'manager', label: 'Manager' },\n { value: 'analyst', label: 'Analyst' },\n { value: 'viewer', label: 'Viewer' },\n]\n\nexport function UsersPageView({ labels, users, onCreateUser, onUpdateRole }: UsersPageViewProps) {\n const [createOpen, setCreateOpen] = useState(false)\n const [searchTerm, setSearchTerm] = useState('')\n const [filtersOpen, setFiltersOpen] = useState(false)\n const [selectedRoles, setSelectedRoles] = useState<string[]>([])\n const [activeFilter, setActiveFilter] = useState<'all' | 'active' | 'inactive'>('all')\n\n // `UsersPageViewProps` lives in shared-domain and doesn't yet declare the\n // new optional filter labels. Cast locally instead of mutating the shared\n // type — frontends pass extra keys as PT-BR strings and we fall back to\n // sensible defaults when omitted.\n const labelsAny = labels as Record<string, string | undefined>\n\n const isEmpty = users.length === 0\n\n const filteredUsers = useMemo(() => {\n const term = searchTerm.trim().toLowerCase()\n return users.filter((user) => {\n if (term && !user.name.toLowerCase().includes(term) && !user.email.toLowerCase().includes(term)) return false\n if (selectedRoles.length > 0 && !selectedRoles.includes(user.role)) return false\n if (activeFilter === 'active' && !user.active) return false\n if (activeFilter === 'inactive' && user.active) return false\n return true\n })\n }, [users, searchTerm, selectedRoles, activeFilter])\n\n const roleChipItems = useMemo(\n () => ROLE_OPTIONS.map((opt) => ({\n id: opt.value,\n name: opt.label,\n style: { bg: 'bg-violet-500/15 text-violet-700 dark:text-violet-300', text: '' },\n })),\n [],\n )\n\n const activeLabelFor = (value: 'all' | 'active' | 'inactive'): string => {\n if (value === 'active') return labelsAny.statusActive ?? labels.statusActive\n if (value === 'inactive') return labelsAny.statusInactive ?? labels.statusInactive\n return labelsAny.statusAll ?? 'Todos'\n }\n\n const activeFilters = useMemo<ActiveFilter[]>(() => {\n const chips: ActiveFilter[] = []\n for (const value of selectedRoles) {\n chips.push({ type: 'role', value, label: roleChipItems.find((i) => i.id === value)?.name ?? value })\n }\n if (activeFilter !== 'all') {\n chips.push({ type: 'active', value: activeFilter, label: activeLabelFor(activeFilter) })\n }\n return chips\n }, [selectedRoles, activeFilter, roleChipItems])\n\n const filterCount = activeFilters.length\n\n const removeFilter = (filter: ActiveFilter) => {\n if (filter.type === 'role') setSelectedRoles((prev) => prev.filter((v) => v !== filter.value))\n if (filter.type === 'active') setActiveFilter('all')\n }\n\n const clearAllFilters = () => {\n setSelectedRoles([])\n setActiveFilter('all')\n }\n\n return (\n <div className=\"space-y-4\">\n <HeroSection\n icon={<UserGroupIcon className=\"h-5 w-5\" />}\n label={labels.title}\n title={labels.title}\n subtitle={labels.subtitle}\n gradient=\"from-violet-500 to-indigo-600\"\n toolbar={!isEmpty ? (\n <SearchBar\n searchTerm={searchTerm}\n onSearchChange={setSearchTerm}\n placeholder={labelsAny.searchPlaceholder ?? labels.title}\n noBorder\n activeFilters={activeFilters}\n onRemoveFilter={removeFilter}\n onClearAll={filterCount > 0 ? clearAllFilters : undefined}\n filtersModal={{\n open: filtersOpen,\n onOpen: () => setFiltersOpen(true),\n onClose: () => setFiltersOpen(false),\n title: labelsAny.filtersTitle ?? 'Filtros',\n count: filterCount,\n onClear: filterCount > 0 ? clearAllFilters : undefined,\n children: (\n <div className=\"space-y-5\">\n <FormSection title={labelsAny.filterByRole ?? labels.role}>\n <ChipPicker\n items={roleChipItems}\n selectedIds={selectedRoles}\n onChange={setSelectedRoles}\n selectedLabel={labelsAny.selected ?? 'selecionados'}\n selectAllLabel={labelsAny.selectAll ?? 'Selecionar todos'}\n clearLabel={labelsAny.clear ?? 'Limpar'}\n />\n </FormSection>\n\n <FormSection title={labelsAny.filterByStatus ?? labels.status}>\n <div className=\"flex flex-wrap gap-2\">\n {(['all', 'active', 'inactive'] as const).map((value) => (\n activeFilter === value\n ? <Button key={value} type=\"button\" size=\"sm\" color=\"ios-glass-blue\" onClick={() => setActiveFilter(value)}>{activeLabelFor(value)}</Button>\n : <Button key={value} type=\"button\" size=\"sm\" outline onClick={() => setActiveFilter(value)}>{activeLabelFor(value)}</Button>\n ))}\n </div>\n </FormSection>\n </div>\n ),\n }}\n />\n ) : undefined}\n actions={(\n <CreateActionButton\n mode=\"desktop\"\n label={labels.create}\n onClick={() => setCreateOpen(true)}\n accent=\"violet\"\n />\n )}\n />\n\n <CreateActionButton\n mode=\"mobile\"\n label={labels.create}\n onClick={() => setCreateOpen(true)}\n accent=\"violet\"\n />\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold text-slate-900 dark:text-slate-100\">{labels.list}</h3>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {filteredUsers.map((user: ManagedUser) => (\n <EntityCard\n key={user.email}\n accentGradient=\"from-violet-500 to-indigo-700\"\n icon={(\n <div className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-violet-500/10 text-violet-600 dark:bg-violet-500/20 dark:text-violet-400\">\n <UserGroupIcon className=\"h-6 w-6\" />\n </div>\n )}\n title={user.name}\n subtitle={user.email}\n status={(\n <span\n className={`shrink-0 rounded-full px-2 py-0.5 text-[10px] font-semibold ${\n user.active\n ? 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-300'\n : 'bg-slate-100 text-slate-700 dark:bg-slate-800 dark:text-slate-300'\n }`}\n >\n {user.active ? labels.statusActive : labels.statusInactive}\n </span>\n )}\n footer={(\n <form\n onSubmit={(event) => {\n event.preventDefault()\n const formData = new FormData(event.currentTarget)\n const role = String(formData.get('role') ?? 'viewer') as UserRole\n onUpdateRole({ email: user.email, role })\n }}\n >\n <InlineForm>\n <FormSelect name=\"role\" options={ROLE_OPTIONS} defaultValue={user.role} />\n <Button type=\"submit\" outline size=\"sm\">{labels.save}</Button>\n </InlineForm>\n </form>\n )}\n />\n ))}\n </div>\n </section>\n\n <GlassModal\n open={createOpen}\n onClose={() => setCreateOpen(false)}\n title={labels.create}\n maxWidth=\"lg\"\n showFormFooter\n cancelLabel={labels.list}\n submitLabel={labels.add}\n onSubmit={(event: FormEvent) => {\n const formData = new FormData(event.currentTarget as HTMLFormElement)\n const name = String(formData.get('name') ?? '').trim()\n const email = String(formData.get('email') ?? '').trim().toLowerCase()\n const role = String(formData.get('role') ?? 'viewer') as UserRole\n if (!name || !email) return\n onCreateUser({ name, email, role })\n setCreateOpen(false)\n }}\n >\n <FormGrid>\n <FormInput name=\"name\" label={labels.name} placeholder={labels.userNamePlaceholder} required />\n <FormInput name=\"email\" label={labels.email} placeholder={labels.userEmailPlaceholder} required type=\"email\" />\n <FormSelect name=\"role\" label={labels.role} options={ROLE_OPTIONS} />\n </FormGrid>\n </GlassModal>\n </div>\n )\n}\n","import { useState, type FormEvent } from 'react'\nimport { ShieldCheckIcon } from '@heroicons/react/24/outline'\nimport {\n Badge,\n CreateActionButton,\n EntityCard,\n FormGrid,\n FormInput,\n GlassModal,\n FormSelect,\n HeroSection,\n SearchBar,\n} from '@ui/index'\nimport type { UserRole, RolesPageViewProps } from '@datatechsolutions/shared-domain/common'\nimport type { PlatformRoleDefinition } from '../rbac'\n\nexport type RolesPageViewExtraProps = {\n /**\n * App-defined role definitions, e.g. `{ admin: { id, label, description }, ... }`.\n * Each app passes the output of its own `createPlatformRbac()` call.\n */\n roleDefinitions: Record<string, PlatformRoleDefinition<string>>\n /**\n * Display options surfaced in the role-assignment modal select. Each\n * entry is `{ value: roleId, label: localizedLabel }`.\n */\n roleOptions: Array<{ value: string; label: string }>\n}\n\nexport function RolesPageView({\n labels,\n users,\n onAssignRole,\n roleDefinitions,\n roleOptions,\n}: RolesPageViewProps & RolesPageViewExtraProps) {\n const [assignOpen, setAssignOpen] = useState(false)\n const [searchTerm, setSearchTerm] = useState('')\n\n const allRoleDefinitions = Object.values(roleDefinitions)\n const allUsers = users\n const term = searchTerm.trim().toLowerCase()\n const filteredRoleDefinitions = term\n ? allRoleDefinitions.filter((role) => role.label.toLowerCase().includes(term))\n : allRoleDefinitions\n const filteredUsers = term\n ? allUsers.filter((user) =>\n user.name.toLowerCase().includes(term) || user.email.toLowerCase().includes(term),\n )\n : allUsers\n const isEmpty = allRoleDefinitions.length === 0 && allUsers.length === 0\n const labelsAny = labels as Record<string, string>\n\n return (\n <div className=\"space-y-4\">\n <HeroSection\n icon={<ShieldCheckIcon className=\"h-5 w-5\" />}\n label={labels.title}\n title={labels.title}\n subtitle={labels.subtitle}\n gradient=\"from-emerald-500 to-teal-600\"\n toolbar={!isEmpty ? (\n <SearchBar\n searchTerm={searchTerm}\n onSearchChange={setSearchTerm}\n placeholder={labelsAny.searchPlaceholder ?? labels.title}\n noBorder\n />\n ) : undefined}\n actions={(\n <CreateActionButton\n mode=\"desktop\"\n label={labels.assign}\n onClick={() => setAssignOpen(true)}\n accent=\"emerald\"\n />\n )}\n />\n\n <CreateActionButton\n mode=\"mobile\"\n label={labels.assign}\n onClick={() => setAssignOpen(true)}\n accent=\"emerald\"\n />\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold text-slate-900 dark:text-slate-100\">{labels.definitions}</h3>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n {filteredRoleDefinitions.map((role) => (\n <EntityCard\n key={role.id}\n accentGradient=\"from-emerald-500 to-teal-700\"\n icon={(\n <div className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-emerald-500/10 text-emerald-600 dark:bg-emerald-500/20 dark:text-emerald-400\">\n <ShieldCheckIcon className=\"h-6 w-6\" />\n </div>\n )}\n title={role.label}\n subtitle={role.id}\n >\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">{role.description}</p>\n <p className=\"mt-2 text-xs font-medium text-slate-600 dark:text-slate-300\">\n {labels.permissionsEnabled}\n </p>\n </EntityCard>\n ))}\n </div>\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold text-slate-900 dark:text-slate-100\">{labels.current}</h3>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {filteredUsers.map((user) => (\n <EntityCard\n key={user.email}\n accentGradient=\"from-violet-500 to-indigo-700\"\n icon={(\n <div className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-violet-500/10 text-violet-600 dark:bg-violet-500/20 dark:text-violet-400\">\n <ShieldCheckIcon className=\"h-6 w-6\" />\n </div>\n )}\n title={user.name}\n subtitle={user.email}\n status={(\n <Badge color=\"violet\" size=\"xs\">{user.role}</Badge>\n )}\n />\n ))}\n </div>\n </section>\n\n <GlassModal\n open={assignOpen}\n onClose={() => setAssignOpen(false)}\n title={labels.assign}\n maxWidth=\"lg\"\n showFormFooter\n cancelLabel={labels.current}\n submitLabel={labels.apply}\n onSubmit={(event: FormEvent) => {\n const formData = new FormData(event.currentTarget as HTMLFormElement)\n const email = String(formData.get('email') ?? '').trim().toLowerCase()\n const role = String(formData.get('role') ?? 'viewer') as UserRole\n if (!email) return\n onAssignRole({ email, role })\n setAssignOpen(false)\n }}\n >\n <FormGrid>\n <FormInput name=\"email\" label={labels.userEmail} placeholder=\"user@company.com\" required />\n <FormSelect name=\"role\" label={labels.role} options={roleOptions} />\n </FormGrid>\n </GlassModal>\n </div>\n )\n}\n","import { Workspace } from '@ui/astrlabe/workflow-canvas'\nimport type { WorkflowGraph as UiWorkflowGraph } from '@ui/astrlabe/contracts'\nimport type { WorkflowWorkspaceProps } from '@datatechsolutions/shared-domain/common'\nimport { useLocale } from '@ui/lib/i18n-context'\n\n/**\n * Thin wrapper that forwards a workflow graph into the visual canvas while\n * threading the active locale from the i18n context. The graph type from\n * `shared-domain` is structurally identical to ui's contract type — the\n * cast keeps callers from having to import both.\n */\nexport function WorkflowWorkspace({ graph }: WorkflowWorkspaceProps) {\n const locale = useLocale()\n return <Workspace initialGraph={graph as unknown as UiWorkflowGraph} locale={locale} />\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/platform/pages/users-page-view.tsx","../src/platform/pages/roles-page-view.tsx","../src/platform/workflow-workspace.tsx"],"names":["useState","useMemo","jsxs","jsx","HeroSection","UserGroupIcon","SearchBar","FormSection","ChipPicker","Button","CreateActionButton","EntityCard","InlineForm","FormSelect","GlassModal","FormGrid","FormInput","ShieldCheckIcon","Badge","useLocale","Workspace"],"mappings":"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","file":"chunk-NIZSQJRW.js","sourcesContent":["import { useMemo, useState, type FormEvent } from 'react'\nimport { UserGroupIcon } from '@heroicons/react/24/outline'\nimport {\n Button,\n ChipPicker,\n CreateActionButton,\n EntityCard,\n FormGrid,\n FormInput,\n FormSection,\n GlassModal,\n FormSelect,\n HeroSection,\n InlineForm,\n SearchBar,\n type ActiveFilter,\n} from '@ui/index'\nimport type { UserRole, ManagedUser, UsersPageViewProps } from '@datatechsolutions/shared-domain/common'\n\nconst ROLE_OPTIONS: Array<{ value: UserRole; label: string }> = [\n { value: 'admin', label: 'Admin' },\n { value: 'manager', label: 'Manager' },\n { value: 'analyst', label: 'Analyst' },\n { value: 'viewer', label: 'Viewer' },\n]\n\nexport function UsersPageView({ labels, users, onCreateUser, onUpdateRole }: UsersPageViewProps) {\n const [createOpen, setCreateOpen] = useState(false)\n const [searchTerm, setSearchTerm] = useState('')\n const [filtersOpen, setFiltersOpen] = useState(false)\n const [selectedRoles, setSelectedRoles] = useState<string[]>([])\n const [activeFilter, setActiveFilter] = useState<'all' | 'active' | 'inactive'>('all')\n\n // `UsersPageViewProps` lives in shared-domain and doesn't yet declare the\n // new optional filter labels. Cast locally instead of mutating the shared\n // type — frontends pass extra keys as PT-BR strings and we fall back to\n // sensible defaults when omitted.\n const labelsAny = labels as Record<string, string | undefined>\n\n const isEmpty = users.length === 0\n\n const filteredUsers = useMemo(() => {\n const term = searchTerm.trim().toLowerCase()\n return users.filter((user) => {\n if (term && !user.name.toLowerCase().includes(term) && !user.email.toLowerCase().includes(term)) return false\n if (selectedRoles.length > 0 && !selectedRoles.includes(user.role)) return false\n if (activeFilter === 'active' && !user.active) return false\n if (activeFilter === 'inactive' && user.active) return false\n return true\n })\n }, [users, searchTerm, selectedRoles, activeFilter])\n\n const roleChipItems = useMemo(\n () => ROLE_OPTIONS.map((opt) => ({\n id: opt.value,\n name: opt.label,\n style: { bg: 'bg-violet-500/15 text-violet-700 dark:text-violet-300', text: '' },\n })),\n [],\n )\n\n const activeLabelFor = (value: 'all' | 'active' | 'inactive'): string => {\n if (value === 'active') return labelsAny.statusActive ?? labels.statusActive\n if (value === 'inactive') return labelsAny.statusInactive ?? labels.statusInactive\n return labelsAny.statusAll ?? 'Todos'\n }\n\n const activeFilters = useMemo<ActiveFilter[]>(() => {\n const chips: ActiveFilter[] = []\n for (const value of selectedRoles) {\n chips.push({ type: 'role', value, label: roleChipItems.find((i) => i.id === value)?.name ?? value })\n }\n if (activeFilter !== 'all') {\n chips.push({ type: 'active', value: activeFilter, label: activeLabelFor(activeFilter) })\n }\n return chips\n }, [selectedRoles, activeFilter, roleChipItems])\n\n const filterCount = activeFilters.length\n\n const removeFilter = (filter: ActiveFilter) => {\n if (filter.type === 'role') setSelectedRoles((prev) => prev.filter((v) => v !== filter.value))\n if (filter.type === 'active') setActiveFilter('all')\n }\n\n const clearAllFilters = () => {\n setSelectedRoles([])\n setActiveFilter('all')\n }\n\n return (\n <div className=\"space-y-4\">\n <HeroSection\n icon={<UserGroupIcon className=\"h-5 w-5\" />}\n label={labels.title}\n title={labels.title}\n subtitle={labels.subtitle}\n gradient=\"from-violet-500 to-indigo-600\"\n toolbar={!isEmpty ? (\n <SearchBar\n searchTerm={searchTerm}\n onSearchChange={setSearchTerm}\n placeholder={labelsAny.searchPlaceholder ?? labels.title}\n noBorder\n activeFilters={activeFilters}\n onRemoveFilter={removeFilter}\n onClearAll={filterCount > 0 ? clearAllFilters : undefined}\n filtersModal={{\n open: filtersOpen,\n onOpen: () => setFiltersOpen(true),\n onClose: () => setFiltersOpen(false),\n title: labelsAny.filtersTitle ?? 'Filtros',\n count: filterCount,\n onClear: filterCount > 0 ? clearAllFilters : undefined,\n children: (\n <div className=\"space-y-5\">\n <FormSection title={labelsAny.filterByRole ?? labels.role}>\n <ChipPicker\n items={roleChipItems}\n selectedIds={selectedRoles}\n onChange={setSelectedRoles}\n selectedLabel={labelsAny.selected ?? 'selecionados'}\n selectAllLabel={labelsAny.selectAll ?? 'Selecionar todos'}\n clearLabel={labelsAny.clear ?? 'Limpar'}\n />\n </FormSection>\n\n <FormSection title={labelsAny.filterByStatus ?? labels.status}>\n <div className=\"flex flex-wrap gap-2\">\n {(['all', 'active', 'inactive'] as const).map((value) => (\n activeFilter === value\n ? <Button key={value} type=\"button\" size=\"sm\" color=\"ios-glass-blue\" onClick={() => setActiveFilter(value)}>{activeLabelFor(value)}</Button>\n : <Button key={value} type=\"button\" size=\"sm\" outline onClick={() => setActiveFilter(value)}>{activeLabelFor(value)}</Button>\n ))}\n </div>\n </FormSection>\n </div>\n ),\n }}\n />\n ) : undefined}\n actions={(\n <CreateActionButton\n mode=\"desktop\"\n label={labels.create}\n onClick={() => setCreateOpen(true)}\n accent=\"violet\"\n />\n )}\n />\n\n <CreateActionButton\n mode=\"mobile\"\n label={labels.create}\n onClick={() => setCreateOpen(true)}\n accent=\"violet\"\n />\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold text-slate-900 dark:text-slate-100\">{labels.list}</h3>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {filteredUsers.map((user: ManagedUser) => (\n <EntityCard\n key={user.email}\n accentGradient=\"from-violet-500 to-indigo-700\"\n icon={(\n <div className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-violet-500/10 text-violet-600 dark:bg-violet-500/20 dark:text-violet-400\">\n <UserGroupIcon className=\"h-6 w-6\" />\n </div>\n )}\n title={user.name}\n subtitle={user.email}\n status={(\n <span\n className={`shrink-0 rounded-full px-2 py-0.5 text-[10px] font-semibold ${\n user.active\n ? 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-300'\n : 'bg-slate-100 text-slate-700 dark:bg-slate-800 dark:text-slate-300'\n }`}\n >\n {user.active ? labels.statusActive : labels.statusInactive}\n </span>\n )}\n footer={(\n <form\n onSubmit={(event) => {\n event.preventDefault()\n const formData = new FormData(event.currentTarget)\n const role = String(formData.get('role') ?? 'viewer') as UserRole\n onUpdateRole({ email: user.email, role })\n }}\n >\n <InlineForm>\n <FormSelect name=\"role\" options={ROLE_OPTIONS} defaultValue={user.role} />\n <Button type=\"submit\" outline size=\"sm\">{labels.save}</Button>\n </InlineForm>\n </form>\n )}\n />\n ))}\n </div>\n </section>\n\n <GlassModal\n open={createOpen}\n onClose={() => setCreateOpen(false)}\n title={labels.create}\n maxWidth=\"lg\"\n showFormFooter\n cancelLabel={labels.list}\n submitLabel={labels.add}\n onSubmit={(event: FormEvent) => {\n const formData = new FormData(event.currentTarget as HTMLFormElement)\n const name = String(formData.get('name') ?? '').trim()\n const email = String(formData.get('email') ?? '').trim().toLowerCase()\n const role = String(formData.get('role') ?? 'viewer') as UserRole\n if (!name || !email) return\n onCreateUser({ name, email, role })\n setCreateOpen(false)\n }}\n >\n <FormGrid>\n <FormInput name=\"name\" label={labels.name} placeholder={labels.userNamePlaceholder} required />\n <FormInput name=\"email\" label={labels.email} placeholder={labels.userEmailPlaceholder} required type=\"email\" />\n <FormSelect name=\"role\" label={labels.role} options={ROLE_OPTIONS} />\n </FormGrid>\n </GlassModal>\n </div>\n )\n}\n","import { useState, type FormEvent } from 'react'\nimport { ShieldCheckIcon } from '@heroicons/react/24/outline'\nimport {\n Badge,\n CreateActionButton,\n EntityCard,\n FormGrid,\n FormInput,\n GlassModal,\n FormSelect,\n HeroSection,\n SearchBar,\n} from '@ui/index'\nimport type { UserRole, RolesPageViewProps } from '@datatechsolutions/shared-domain/common'\nimport type { PlatformRoleDefinition } from '../rbac'\n\nexport type RolesPageViewExtraProps = {\n /**\n * App-defined role definitions, e.g. `{ admin: { id, label, description }, ... }`.\n * Each app passes the output of its own `createPlatformRbac()` call.\n */\n roleDefinitions: Record<string, PlatformRoleDefinition<string>>\n /**\n * Display options surfaced in the role-assignment modal select. Each\n * entry is `{ value: roleId, label: localizedLabel }`.\n */\n roleOptions: Array<{ value: string; label: string }>\n}\n\nexport function RolesPageView({\n labels,\n users,\n onAssignRole,\n roleDefinitions,\n roleOptions,\n}: RolesPageViewProps & RolesPageViewExtraProps) {\n const [assignOpen, setAssignOpen] = useState(false)\n const [searchTerm, setSearchTerm] = useState('')\n\n const allRoleDefinitions = Object.values(roleDefinitions)\n const allUsers = users\n const term = searchTerm.trim().toLowerCase()\n const filteredRoleDefinitions = term\n ? allRoleDefinitions.filter((role) => role.label.toLowerCase().includes(term))\n : allRoleDefinitions\n const filteredUsers = term\n ? allUsers.filter((user) =>\n user.name.toLowerCase().includes(term) || user.email.toLowerCase().includes(term),\n )\n : allUsers\n const isEmpty = allRoleDefinitions.length === 0 && allUsers.length === 0\n const labelsAny = labels as Record<string, string>\n\n return (\n <div className=\"space-y-4\">\n <HeroSection\n icon={<ShieldCheckIcon className=\"h-5 w-5\" />}\n label={labels.title}\n title={labels.title}\n subtitle={labels.subtitle}\n gradient=\"from-emerald-500 to-teal-600\"\n toolbar={!isEmpty ? (\n <SearchBar\n searchTerm={searchTerm}\n onSearchChange={setSearchTerm}\n placeholder={labelsAny.searchPlaceholder ?? labels.title}\n noBorder\n />\n ) : undefined}\n actions={(\n <CreateActionButton\n mode=\"desktop\"\n label={labels.assign}\n onClick={() => setAssignOpen(true)}\n accent=\"emerald\"\n />\n )}\n />\n\n <CreateActionButton\n mode=\"mobile\"\n label={labels.assign}\n onClick={() => setAssignOpen(true)}\n accent=\"emerald\"\n />\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold text-slate-900 dark:text-slate-100\">{labels.definitions}</h3>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n {filteredRoleDefinitions.map((role) => (\n <EntityCard\n key={role.id}\n accentGradient=\"from-emerald-500 to-teal-700\"\n icon={(\n <div className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-emerald-500/10 text-emerald-600 dark:bg-emerald-500/20 dark:text-emerald-400\">\n <ShieldCheckIcon className=\"h-6 w-6\" />\n </div>\n )}\n title={role.label}\n subtitle={role.id}\n >\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">{role.description}</p>\n <p className=\"mt-2 text-xs font-medium text-slate-600 dark:text-slate-300\">\n {labels.permissionsEnabled}\n </p>\n </EntityCard>\n ))}\n </div>\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold text-slate-900 dark:text-slate-100\">{labels.current}</h3>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {filteredUsers.map((user) => (\n <EntityCard\n key={user.email}\n accentGradient=\"from-violet-500 to-indigo-700\"\n icon={(\n <div className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-violet-500/10 text-violet-600 dark:bg-violet-500/20 dark:text-violet-400\">\n <ShieldCheckIcon className=\"h-6 w-6\" />\n </div>\n )}\n title={user.name}\n subtitle={user.email}\n status={(\n <Badge color=\"violet\" size=\"xs\">{user.role}</Badge>\n )}\n />\n ))}\n </div>\n </section>\n\n <GlassModal\n open={assignOpen}\n onClose={() => setAssignOpen(false)}\n title={labels.assign}\n maxWidth=\"lg\"\n showFormFooter\n cancelLabel={labels.current}\n submitLabel={labels.apply}\n onSubmit={(event: FormEvent) => {\n const formData = new FormData(event.currentTarget as HTMLFormElement)\n const email = String(formData.get('email') ?? '').trim().toLowerCase()\n const role = String(formData.get('role') ?? 'viewer') as UserRole\n if (!email) return\n onAssignRole({ email, role })\n setAssignOpen(false)\n }}\n >\n <FormGrid>\n <FormInput name=\"email\" label={labels.userEmail} placeholder=\"user@company.com\" required />\n <FormSelect name=\"role\" label={labels.role} options={roleOptions} />\n </FormGrid>\n </GlassModal>\n </div>\n )\n}\n","import { Workspace } from '@ui/astrlabe/workflow-canvas'\nimport type { WorkflowGraph as UiWorkflowGraph } from '@ui/astrlabe/contracts'\nimport type { WorkflowWorkspaceProps } from '@datatechsolutions/shared-domain/common'\nimport { useLocale } from '@ui/lib/i18n-context'\n\n/**\n * Thin wrapper that forwards a workflow graph into the visual canvas while\n * threading the active locale from the i18n context. The graph type from\n * `shared-domain` is structurally identical to ui's contract type — the\n * cast keeps callers from having to import both.\n */\nexport function WorkflowWorkspace({ graph }: WorkflowWorkspaceProps) {\n const locale = useLocale()\n return <Workspace initialGraph={graph as unknown as UiWorkflowGraph} locale={locale} />\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { PasswordStrengthMeter } from './chunk-
|
|
3
|
-
import { SectionCard, SearchInput, InlineSpinner, EmptyState, Avatar, StatusBadge, DynamicIslandConfirm, GlassModal, Input, PasswordInput, Sheet } from './chunk-
|
|
2
|
+
import { PasswordStrengthMeter } from './chunk-TQADF23S.mjs';
|
|
3
|
+
import { SectionCard, SearchInput, InlineSpinner, EmptyState, Avatar, StatusBadge, DynamicIslandConfirm, GlassModal, Input, PasswordInput, PickerTile, Sheet } from './chunk-F4KHAKTP.mjs';
|
|
4
4
|
import { useTranslations, useFormatter } from './chunk-ZEFNBGYI.mjs';
|
|
5
|
-
import { Badge, Button } from './chunk-
|
|
5
|
+
import { Badge, Button } from './chunk-2SBVFLPZ.mjs';
|
|
6
6
|
import { triggerHaptic } from './chunk-D2JF6C3E.mjs';
|
|
7
7
|
import { useState, useCallback, useEffect } from 'react';
|
|
8
8
|
import { UsersIcon, ShieldCheckIcon, KeyIcon, TrashIcon, UserPlusIcon, BuildingOffice2Icon, PencilSquareIcon, PlusIcon } from '@heroicons/react/24/outline';
|
|
@@ -329,13 +329,10 @@ function AdminUserForm({
|
|
|
329
329
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
330
330
|
/* @__PURE__ */ jsx("label", { className: "mb-1.5 block text-sm font-medium text-gray-900 dark:text-white", children: t("admin.userForm.roleLabel") }),
|
|
331
331
|
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-3 gap-2 sm:grid-cols-4", children: roles.map((role) => /* @__PURE__ */ jsx(
|
|
332
|
-
|
|
332
|
+
PickerTile,
|
|
333
333
|
{
|
|
334
|
-
|
|
335
|
-
onClick: () =>
|
|
336
|
-
setSelectedRole(role);
|
|
337
|
-
triggerHaptic("light");
|
|
338
|
-
},
|
|
334
|
+
selected: selectedRole === role,
|
|
335
|
+
onClick: () => setSelectedRole(role),
|
|
339
336
|
className: `rounded-xl border px-2 py-2 text-xs font-semibold backdrop-blur-xl transition ${selectedRole === role ? "border-indigo-400/80 bg-gradient-to-br from-indigo-100/85 via-white/80 to-sky-100/75 text-slate-900 dark:border-indigo-300/70 dark:bg-[linear-gradient(140deg,rgba(99,102,241,0.32)_0%,rgba(30,41,59,0.72)_100%)] dark:text-indigo-100" : "border-white/55 bg-gradient-to-br from-white/82 via-white/66 to-slate-100/62 text-slate-700 hover:from-white/92 hover:to-sky-100/72 dark:border-white/15 dark:bg-[linear-gradient(140deg,rgba(30,41,59,0.72)_0%,rgba(15,23,42,0.62)_100%)] dark:text-slate-100 dark:hover:bg-[linear-gradient(140deg,rgba(51,65,85,0.76)_0%,rgba(30,41,59,0.68)_100%)]"}`,
|
|
340
337
|
children: role
|
|
341
338
|
},
|
|
@@ -1006,5 +1003,5 @@ function AdminPermissionList({ client }) {
|
|
|
1006
1003
|
}
|
|
1007
1004
|
|
|
1008
1005
|
export { AdminOrganizationForm, AdminOrganizationList, AdminPermissionList, AdminUserForm, AdminUserList };
|
|
1009
|
-
//# sourceMappingURL=chunk-
|
|
1010
|
-
//# sourceMappingURL=chunk-
|
|
1006
|
+
//# sourceMappingURL=chunk-NXWIT4YQ.mjs.map
|
|
1007
|
+
//# sourceMappingURL=chunk-NXWIT4YQ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/platform/admin/admin-user-list.tsx","../src/platform/admin/admin-user-form.tsx","../src/platform/admin/admin-organization-list.tsx","../src/platform/admin/admin-organization-form.tsx","../src/platform/admin/admin-permission-list.tsx"],"names":["useState","useCallback","jsx","jsxs","useEffect","Fragment","TrashIcon","BuildingOffice2Icon","KeyIcon","PlusIcon"],"mappings":"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","file":"chunk-NXWIT4YQ.mjs","sourcesContent":["import { useState, useEffect, useCallback } from 'react'\nimport { useTranslations, useFormatter } from '@ui/lib/i18n-context'\nimport {\n SectionCard,\n Button,\n SearchInput,\n Badge,\n StatusBadge,\n EmptyState,\n InlineSpinner,\n DynamicIslandConfirm,\n Avatar,\n triggerHaptic,\n} from '@ui/index'\nimport {\n UsersIcon,\n PlusIcon,\n TrashIcon,\n KeyIcon,\n ShieldCheckIcon,\n} from '@heroicons/react/24/outline'\n\nexport type { AdminUserListProps } from '@datatechsolutions/shared-domain'\nimport type { AdminUserListProps, AdminUserSummary } from '@datatechsolutions/shared-domain'\n\nconst PAGE_SIZE = 20\n\nexport function AdminUserList({ client, onUserSelect }: AdminUserListProps) {\n const t = useTranslations('windsock')\n const format = useFormatter()\n\n const [users, setUsers] = useState<AdminUserSummary[]>([])\n const [total, setTotal] = useState(0)\n const [isLoading, setIsLoading] = useState(true)\n const [search, setSearch] = useState('')\n const [offset, setOffset] = useState(0)\n const [deleteTarget, setDeleteTarget] = useState<AdminUserSummary | null>(null)\n const [isDeletingUser, setIsDeletingUser] = useState(false)\n\n const fetchUsers = useCallback(async (searchQuery: string, pageOffset: number) => {\n setIsLoading(true)\n try {\n const result = await client.listUsers({\n search: searchQuery || undefined,\n limit: PAGE_SIZE,\n offset: pageOffset,\n })\n setUsers(result.items)\n setTotal(result.total)\n } catch {\n // Fail gracefully — show empty state\n } finally {\n setIsLoading(false)\n }\n }, [client])\n\n useEffect(() => {\n fetchUsers(search, offset)\n }, [fetchUsers, search, offset])\n\n const handleSearch = useCallback((value: string) => {\n setSearch(value)\n setOffset(0)\n }, [])\n\n const handleNextPage = useCallback(() => {\n triggerHaptic('light')\n setOffset((previous) => previous + PAGE_SIZE)\n }, [])\n\n const handlePreviousPage = useCallback(() => {\n triggerHaptic('light')\n setOffset((previous) => Math.max(0, previous - PAGE_SIZE))\n }, [])\n\n const handleDeleteRequest = useCallback((user: AdminUserSummary) => {\n triggerHaptic('warning')\n setDeleteTarget(user)\n }, [])\n\n const handleDeleteConfirm = useCallback(async () => {\n if (!deleteTarget) return\n setIsDeletingUser(true)\n triggerHaptic('medium')\n try {\n await client.deleteUser(deleteTarget.id)\n setDeleteTarget(null)\n triggerHaptic('success')\n fetchUsers(search, offset)\n } catch {\n triggerHaptic('error')\n } finally {\n setIsDeletingUser(false)\n }\n }, [deleteTarget, client, fetchUsers, search, offset])\n\n const handleDeleteCancel = useCallback(() => {\n triggerHaptic('light')\n setDeleteTarget(null)\n }, [])\n\n const handleUserClick = useCallback((user: AdminUserSummary) => {\n triggerHaptic('light')\n onUserSelect?.(user)\n }, [onUserSelect])\n\n const totalPages = Math.ceil(total / PAGE_SIZE)\n const currentPage = Math.floor(offset / PAGE_SIZE) + 1\n\n const roleBadgeColor = (role: string) => {\n if (role === 'owner' || role === 'super_admin') return 'purple' as const\n if (role === 'admin') return 'blue' as const\n if (role === 'manager') return 'amber' as const\n return 'zinc' as const\n }\n\n return (\n <>\n <SectionCard\n header={{\n icon: <UsersIcon className=\"h-5 w-5 text-white\" />,\n title: t('admin.users.title'),\n subtitle: t('admin.users.subtitle'),\n gradient: 'from-blue-500 via-indigo-500 to-violet-500',\n }}\n padded={false}\n >\n {/* Search + filters */}\n <div className=\"liquid-divider p-4\">\n <SearchInput\n value={search}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => handleSearch(event.target.value)}\n placeholder={t('admin.users.searchPlaceholder')}\n />\n </div>\n\n {/* Content */}\n {isLoading ? (\n <div className=\"flex items-center justify-center gap-2 p-8 text-sm text-slate-500 dark:text-slate-400\">\n <InlineSpinner />\n <span>{t('admin.users.loading')}</span>\n </div>\n ) : users.length === 0 ? (\n <div className=\"p-4 sm:p-6\">\n <EmptyState\n message={t('admin.users.emptyMessage')}\n description={t('admin.users.emptyDescription')}\n icon={UsersIcon}\n variant=\"card\"\n />\n </div>\n ) : (\n <>\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"liquid-divider\">\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {t('admin.users.columnUser')}\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {t('admin.users.columnRole')}\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {t('admin.users.columnStatus')}\n </th>\n <th className=\"hidden px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400 sm:table-cell\">\n {t('admin.users.columnSecurity')}\n </th>\n <th className=\"hidden px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400 md:table-cell\">\n {t('admin.users.columnLastLogin')}\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {t('admin.users.columnActions')}\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-gray-200/60 dark:divide-white/10\">\n {users.map((user) => (\n <tr\n key={user.id}\n className=\"cursor-pointer transition-colors hover:bg-white/40 dark:hover:bg-white/5\"\n onClick={() => handleUserClick(user)}\n >\n <td className=\"px-4 py-3\">\n <div className=\"flex items-center gap-3\">\n <Avatar\n src={user.image ?? undefined}\n initials={(user.name ?? user.email).slice(0, 2).toUpperCase()}\n alt={user.name ?? user.email}\n />\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-medium text-slate-900 dark:text-white\">\n {user.name ?? user.email}\n </p>\n <p className=\"truncate text-xs text-slate-500 dark:text-slate-400\">\n {user.email}\n </p>\n </div>\n </div>\n </td>\n <td className=\"px-4 py-3\">\n <Badge color={roleBadgeColor(user.role)}>{user.role}</Badge>\n </td>\n <td className=\"px-4 py-3\">\n <StatusBadge\n status={user.status === 'active' ? 'active' : 'inactive'}\n label={user.status}\n size=\"sm\"\n />\n </td>\n <td className=\"hidden px-4 py-3 sm:table-cell\">\n <div className=\"flex items-center gap-2\">\n {user.mfaEnabled && (\n <span title={t('admin.users.mfaEnabled')}>\n <ShieldCheckIcon className=\"h-4 w-4 text-emerald-500\" />\n </span>\n )}\n {user.emailVerified && (\n <span title={t('admin.users.emailVerified')}>\n <KeyIcon className=\"h-4 w-4 text-blue-500\" />\n </span>\n )}\n </div>\n </td>\n <td className=\"hidden px-4 py-3 text-slate-500 dark:text-slate-400 md:table-cell\">\n {user.lastLoginAt\n ? format.relativeTime(new Date(user.lastLoginAt))\n : t('admin.users.neverLoggedIn')}\n </td>\n <td className=\"px-4 py-3 text-right\">\n <Button\n size=\"sm\"\n color=\"ios-glass-red\"\n onClick={(event: React.MouseEvent) => {\n event.stopPropagation()\n handleDeleteRequest(user)\n }}\n >\n <TrashIcon className=\"h-3.5 w-3.5\" />\n </Button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n {/* Pagination */}\n {totalPages > 1 && (\n <div className=\"flex items-center justify-between border-t border-slate-200/60 px-4 py-3 dark:border-white/10\">\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">\n {t('admin.users.pagination', { current: currentPage, total: totalPages, count: total })}\n </p>\n <div className=\"flex gap-2\">\n <Button\n size=\"sm\"\n outline\n onClick={handlePreviousPage}\n disabled={offset === 0}\n >\n {t('admin.users.previousPage')}\n </Button>\n <Button\n size=\"sm\"\n outline\n onClick={handleNextPage}\n disabled={offset + PAGE_SIZE >= total}\n >\n {t('admin.users.nextPage')}\n </Button>\n </div>\n </div>\n )}\n </>\n )}\n </SectionCard>\n\n {/* Delete confirmation */}\n <DynamicIslandConfirm\n open={deleteTarget !== null}\n onClose={handleDeleteCancel}\n onConfirm={handleDeleteConfirm}\n title={t('admin.users.deleteConfirmTitle', { name: deleteTarget?.name ?? deleteTarget?.email ?? '' })}\n icon={<TrashIcon className=\"h-5 w-5 text-white\" />}\n iconBackground=\"bg-ios-red\"\n confirmLabel={t('admin.users.deleteConfirmButton')}\n cancelLabel={t('admin.users.deleteCancelButton')}\n />\n </>\n )\n}\n","import { useState, useCallback } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n GlassModal,\n Input,\n PasswordInput,\n Button,\n PickerTile,\n triggerHaptic,\n} from '@ui/index'\nimport { UserPlusIcon } from '@heroicons/react/24/outline'\nimport { PasswordStrengthMeter } from '../auth/components'\n\nexport type { AdminUserFormProps } from '@datatechsolutions/shared-domain'\nimport type { AdminUserFormProps, AdminCreateUserInput } from '@datatechsolutions/shared-domain'\nimport type { AppRole } from '@datatechsolutions/shared-domain'\n\nconst DEFAULT_ROLES: AppRole[] = ['viewer', 'member', 'operator', 'analyst', 'manager', 'admin', 'owner']\n\nexport function AdminUserForm({\n open,\n onClose,\n onSubmit,\n roles = DEFAULT_ROLES,\n}: AdminUserFormProps) {\n const t = useTranslations('windsock')\n\n const [email, setEmail] = useState('')\n const [name, setName] = useState('')\n const [password, setPassword] = useState('')\n const [selectedRole, setSelectedRole] = useState<AppRole>('viewer')\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const resetForm = useCallback(() => {\n setEmail('')\n setName('')\n setPassword('')\n setSelectedRole('viewer')\n setError(null)\n }, [])\n\n const handleClose = useCallback(() => {\n resetForm()\n onClose()\n }, [resetForm, onClose])\n\n const handleSubmit = useCallback(async () => {\n if (!email.trim()) {\n setError(t('admin.userForm.errorEmailRequired'))\n triggerHaptic('error')\n return\n }\n\n setError(null)\n setIsSubmitting(true)\n triggerHaptic('light')\n\n try {\n const data: AdminCreateUserInput = {\n email: email.trim().toLowerCase(),\n name: name.trim() || undefined,\n password: password || undefined,\n role: selectedRole,\n }\n\n await onSubmit(data)\n triggerHaptic('success')\n resetForm()\n onClose()\n } catch {\n setError(t('admin.userForm.errorCreateFailed'))\n triggerHaptic('error')\n } finally {\n setIsSubmitting(false)\n }\n }, [email, name, password, selectedRole, onSubmit, onClose, resetForm, t])\n\n return (\n <GlassModal\n open={open}\n onClose={handleClose}\n title={t('admin.userForm.title')}\n subtitle={t('admin.userForm.subtitle')}\n icon={<UserPlusIcon className=\"h-5 w-5 text-white\" />}\n maxWidth=\"md\"\n >\n <form\n onSubmit={(event) => {\n event.preventDefault()\n handleSubmit()\n }}\n className=\"space-y-4 p-4 sm:p-6\"\n >\n <Input\n label={t('admin.userForm.emailLabel')}\n type=\"email\"\n value={email}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setEmail(event.target.value)}\n placeholder={t('admin.userForm.emailPlaceholder')}\n disabled={isSubmitting}\n autoComplete=\"email\"\n autoFocus\n />\n\n <Input\n label={t('admin.userForm.nameLabel')}\n value={name}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setName(event.target.value)}\n placeholder={t('admin.userForm.namePlaceholder')}\n disabled={isSubmitting}\n autoComplete=\"name\"\n />\n\n <PasswordInput\n label={t('admin.userForm.passwordLabel')}\n value={password}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setPassword(event.target.value)}\n placeholder={t('admin.userForm.passwordPlaceholder')}\n disabled={isSubmitting}\n autoComplete=\"new-password\"\n />\n {password && <PasswordStrengthMeter password={password} />}\n\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-gray-900 dark:text-white\">\n {t('admin.userForm.roleLabel')}\n </label>\n <div className=\"grid grid-cols-3 gap-2 sm:grid-cols-4\">\n {roles.map((role) => (\n <PickerTile\n key={role}\n selected={selectedRole === role}\n onClick={() => setSelectedRole(role)}\n className={`rounded-xl border px-2 py-2 text-xs font-semibold backdrop-blur-xl transition ${\n selectedRole === role\n ? 'border-indigo-400/80 bg-gradient-to-br from-indigo-100/85 via-white/80 to-sky-100/75 text-slate-900 dark:border-indigo-300/70 dark:bg-[linear-gradient(140deg,rgba(99,102,241,0.32)_0%,rgba(30,41,59,0.72)_100%)] dark:text-indigo-100'\n : 'border-white/55 bg-gradient-to-br from-white/82 via-white/66 to-slate-100/62 text-slate-700 hover:from-white/92 hover:to-sky-100/72 dark:border-white/15 dark:bg-[linear-gradient(140deg,rgba(30,41,59,0.72)_0%,rgba(15,23,42,0.62)_100%)] dark:text-slate-100 dark:hover:bg-[linear-gradient(140deg,rgba(51,65,85,0.76)_0%,rgba(30,41,59,0.68)_100%)]'\n }`}\n >\n {role}\n </PickerTile>\n ))}\n </div>\n </div>\n\n {error && (\n <p className=\"text-sm text-red-600 dark:text-red-400\" role=\"alert\">{error}</p>\n )}\n\n <div className=\"flex gap-3 pt-2\">\n <Button\n type=\"button\"\n outline\n onClick={handleClose}\n disabled={isSubmitting}\n className=\"flex-1\"\n >\n {t('admin.userForm.cancelButton')}\n </Button>\n <Button\n type=\"submit\"\n color=\"ios-glass-blue\"\n loading={isSubmitting}\n disabled={isSubmitting || !email.trim()}\n className=\"flex-1\"\n >\n {t('admin.userForm.createButton')}\n </Button>\n </div>\n </form>\n </GlassModal>\n )\n}\n","import { useState, useEffect, useCallback } from 'react'\nimport { useTranslations, useFormatter } from '@ui/lib/i18n-context'\nimport {\n SectionCard,\n Button,\n SearchInput,\n StatusBadge,\n EmptyState,\n InlineSpinner,\n DynamicIslandConfirm,\n triggerHaptic,\n} from '@ui/index'\nimport {\n BuildingOffice2Icon,\n TrashIcon,\n} from '@heroicons/react/24/outline'\nimport type { AuthOrganization } from '@datatechsolutions/shared-domain'\n\nexport type { AdminOrganizationListProps } from '@datatechsolutions/shared-domain'\nimport type { AdminOrganizationListProps } from '@datatechsolutions/shared-domain'\n\nexport function AdminOrganizationList({ client, onOrganizationSelect }: AdminOrganizationListProps) {\n const t = useTranslations('windsock')\n const format = useFormatter()\n\n const [organizations, setOrganizations] = useState<AuthOrganization[]>([])\n const [filteredOrganizations, setFilteredOrganizations] = useState<AuthOrganization[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [search, setSearch] = useState('')\n const [deleteTarget, setDeleteTarget] = useState<AuthOrganization | null>(null)\n const [isDeleting, setIsDeleting] = useState(false)\n\n const fetchOrganizations = useCallback(async () => {\n setIsLoading(true)\n try {\n const result = await client.listOrganizations()\n setOrganizations(result)\n } catch {\n // Fail gracefully\n } finally {\n setIsLoading(false)\n }\n }, [client])\n\n useEffect(() => {\n fetchOrganizations()\n }, [fetchOrganizations])\n\n useEffect(() => {\n if (!search.trim()) {\n setFilteredOrganizations(organizations)\n return\n }\n const query = search.toLowerCase()\n setFilteredOrganizations(\n organizations.filter((organization) =>\n organization.name.toLowerCase().includes(query) ||\n organization.displayName?.toLowerCase().includes(query) ||\n organization.description?.toLowerCase().includes(query),\n ),\n )\n }, [organizations, search])\n\n const handleOrganizationClick = useCallback((organization: AuthOrganization) => {\n triggerHaptic('light')\n onOrganizationSelect?.(organization)\n }, [onOrganizationSelect])\n\n const handleDeleteRequest = useCallback((organization: AuthOrganization) => {\n triggerHaptic('warning')\n setDeleteTarget(organization)\n }, [])\n\n const handleDeleteConfirm = useCallback(async () => {\n if (!deleteTarget) return\n setIsDeleting(true)\n triggerHaptic('medium')\n try {\n await client.deleteOrganization(deleteTarget.id)\n setDeleteTarget(null)\n triggerHaptic('success')\n fetchOrganizations()\n } catch {\n triggerHaptic('error')\n } finally {\n setIsDeleting(false)\n }\n }, [deleteTarget, client, fetchOrganizations])\n\n const handleDeleteCancel = useCallback(() => {\n triggerHaptic('light')\n setDeleteTarget(null)\n }, [])\n\n return (\n <>\n <SectionCard\n header={{\n icon: <BuildingOffice2Icon className=\"h-5 w-5 text-white\" />,\n title: t('admin.organizations.title'),\n subtitle: t('admin.organizations.subtitle'),\n gradient: 'from-emerald-500 via-teal-500 to-cyan-500',\n }}\n padded={false}\n >\n {/* Search */}\n <div className=\"liquid-divider p-4\">\n <SearchInput\n value={search}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setSearch(event.target.value)}\n placeholder={t('admin.organizations.searchPlaceholder')}\n />\n </div>\n\n {/* Content */}\n {isLoading ? (\n <div className=\"flex items-center justify-center gap-2 p-8 text-sm text-slate-500 dark:text-slate-400\">\n <InlineSpinner />\n <span>{t('admin.organizations.loading')}</span>\n </div>\n ) : filteredOrganizations.length === 0 ? (\n <div className=\"p-4 sm:p-6\">\n <EmptyState\n message={t('admin.organizations.emptyMessage')}\n description={t('admin.organizations.emptyDescription')}\n icon={BuildingOffice2Icon}\n variant=\"card\"\n />\n </div>\n ) : (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"liquid-divider\">\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {t('admin.organizations.columnName')}\n </th>\n <th className=\"hidden px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400 sm:table-cell\">\n {t('admin.organizations.columnDisplayName')}\n </th>\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {t('admin.organizations.columnStatus')}\n </th>\n <th className=\"hidden px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400 md:table-cell\">\n {t('admin.organizations.columnCreated')}\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {t('admin.organizations.columnActions')}\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-gray-200/60 dark:divide-white/10\">\n {filteredOrganizations.map((organization) => (\n <tr\n key={organization.id}\n className=\"cursor-pointer transition-colors hover:bg-white/40 dark:hover:bg-white/5\"\n onClick={() => handleOrganizationClick(organization)}\n >\n <td className=\"px-4 py-3\">\n <p className=\"text-sm font-medium text-slate-900 dark:text-white\">\n {organization.name}\n </p>\n {organization.description && (\n <p className=\"mt-0.5 truncate text-xs text-slate-500 dark:text-slate-400\">\n {organization.description}\n </p>\n )}\n </td>\n <td className=\"hidden px-4 py-3 text-slate-500 dark:text-slate-400 sm:table-cell\">\n {organization.displayName ?? '—'}\n </td>\n <td className=\"px-4 py-3\">\n <StatusBadge\n status={organization.enabled ? 'active' : 'inactive'}\n label={organization.enabled ? t('admin.organizations.statusEnabled') : t('admin.organizations.statusDisabled')}\n size=\"sm\"\n />\n </td>\n <td className=\"hidden px-4 py-3 text-slate-500 dark:text-slate-400 md:table-cell\">\n {format.dateTime(new Date(organization.createdAt), {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n })}\n </td>\n <td className=\"px-4 py-3 text-right\">\n <Button\n size=\"sm\"\n color=\"ios-glass-red\"\n onClick={(event: React.MouseEvent) => {\n event.stopPropagation()\n handleDeleteRequest(organization)\n }}\n >\n <TrashIcon className=\"h-3.5 w-3.5\" />\n </Button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </SectionCard>\n\n {/* Delete confirmation */}\n <DynamicIslandConfirm\n open={deleteTarget !== null}\n onClose={handleDeleteCancel}\n onConfirm={handleDeleteConfirm}\n title={t('admin.organizations.deleteConfirmTitle', { name: deleteTarget?.displayName ?? deleteTarget?.name ?? '' })}\n icon={<TrashIcon className=\"h-5 w-5 text-white\" />}\n iconBackground=\"bg-ios-red\"\n confirmLabel={t('admin.organizations.deleteConfirmButton')}\n cancelLabel={t('admin.organizations.deleteCancelButton')}\n />\n </>\n )\n}\n","import { useState, useEffect, useCallback } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport {\n GlassModal,\n Input,\n Button,\n triggerHaptic,\n} from '@ui/index'\nimport { BuildingOffice2Icon } from '@heroicons/react/24/outline'\n\nexport type { AdminOrganizationFormProps } from '@datatechsolutions/shared-domain'\nimport type {\n AdminOrganizationFormProps,\n AdminCreateOrganizationInput,\n AdminUpdateOrganizationInput,\n} from '@datatechsolutions/shared-domain'\n\nexport function AdminOrganizationForm({\n open,\n onClose,\n organization,\n onSubmit,\n}: AdminOrganizationFormProps) {\n const t = useTranslations('windsock')\n\n const isEditing = organization !== null && organization !== undefined\n\n const [name, setName] = useState('')\n const [displayName, setDisplayName] = useState('')\n const [description, setDescription] = useState('')\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n if (organization) {\n setName(organization.name)\n setDisplayName(organization.displayName ?? '')\n setDescription(organization.description ?? '')\n } else {\n setName('')\n setDisplayName('')\n setDescription('')\n }\n setError(null)\n }, [organization, open])\n\n const handleClose = useCallback(() => {\n setError(null)\n onClose()\n }, [onClose])\n\n const handleSubmit = useCallback(async () => {\n if (!name.trim()) {\n setError(t('admin.organizationForm.errorNameRequired'))\n triggerHaptic('error')\n return\n }\n\n setError(null)\n setIsSubmitting(true)\n triggerHaptic('light')\n\n try {\n if (isEditing) {\n const data: AdminUpdateOrganizationInput = {\n name: name.trim(),\n displayName: displayName.trim() || null,\n description: description.trim() || null,\n }\n await onSubmit(data)\n } else {\n const data: AdminCreateOrganizationInput = {\n name: name.trim(),\n displayName: displayName.trim() || undefined,\n description: description.trim() || undefined,\n }\n await onSubmit(data)\n }\n triggerHaptic('success')\n onClose()\n } catch {\n setError(isEditing\n ? t('admin.organizationForm.errorUpdateFailed')\n : t('admin.organizationForm.errorCreateFailed'),\n )\n triggerHaptic('error')\n } finally {\n setIsSubmitting(false)\n }\n }, [name, displayName, description, isEditing, onSubmit, onClose, t])\n\n return (\n <GlassModal\n open={open}\n onClose={handleClose}\n title={isEditing ? t('admin.organizationForm.editTitle') : t('admin.organizationForm.createTitle')}\n subtitle={isEditing ? t('admin.organizationForm.editSubtitle') : t('admin.organizationForm.createSubtitle')}\n icon={<BuildingOffice2Icon className=\"h-5 w-5 text-white\" />}\n maxWidth=\"md\"\n >\n <form\n onSubmit={(event) => {\n event.preventDefault()\n handleSubmit()\n }}\n className=\"space-y-4 p-4 sm:p-6\"\n >\n <Input\n label={t('admin.organizationForm.nameLabel')}\n value={name}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setName(event.target.value)}\n placeholder={t('admin.organizationForm.namePlaceholder')}\n disabled={isSubmitting}\n autoFocus\n />\n\n <Input\n label={t('admin.organizationForm.displayNameLabel')}\n value={displayName}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setDisplayName(event.target.value)}\n placeholder={t('admin.organizationForm.displayNamePlaceholder')}\n disabled={isSubmitting}\n />\n\n <Input\n label={t('admin.organizationForm.descriptionLabel')}\n value={description}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setDescription(event.target.value)}\n placeholder={t('admin.organizationForm.descriptionPlaceholder')}\n disabled={isSubmitting}\n />\n\n {error && (\n <p className=\"text-sm text-red-600 dark:text-red-400\" role=\"alert\">{error}</p>\n )}\n\n <div className=\"flex gap-3 pt-2\">\n <Button\n type=\"button\"\n outline\n onClick={handleClose}\n disabled={isSubmitting}\n className=\"flex-1\"\n >\n {t('admin.organizationForm.cancelButton')}\n </Button>\n <Button\n type=\"submit\"\n color=\"ios-glass-blue\"\n loading={isSubmitting}\n disabled={isSubmitting || !name.trim()}\n className=\"flex-1\"\n >\n {isEditing ? t('admin.organizationForm.saveButton') : t('admin.organizationForm.createButton')}\n </Button>\n </div>\n </form>\n </GlassModal>\n )\n}\n","import { useState, useEffect, useCallback } from 'react'\nimport { useTranslations, useFormatter } from '@ui/lib/i18n-context'\nimport {\n SectionCard,\n Button,\n Input,\n SearchInput,\n Badge,\n EmptyState,\n InlineSpinner,\n Sheet,\n DynamicIslandConfirm,\n triggerHaptic,\n} from '@ui/index'\nimport {\n KeyIcon,\n PlusIcon,\n PencilSquareIcon,\n TrashIcon,\n} from '@heroicons/react/24/outline'\nimport type { AdminPermission } from '@datatechsolutions/shared-domain'\n\nexport type { AdminPermissionListProps } from '@datatechsolutions/shared-domain'\nimport type {\n AdminPermissionListProps,\n AdminCreatePermissionInput,\n AdminUpdatePermissionInput,\n} from '@datatechsolutions/shared-domain'\n\nexport function AdminPermissionList({ client }: AdminPermissionListProps) {\n const t = useTranslations('windsock')\n const format = useFormatter()\n\n const [permissions, setPermissions] = useState<AdminPermission[]>([])\n const [filteredPermissions, setFilteredPermissions] = useState<AdminPermission[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [search, setSearch] = useState('')\n\n // Form state\n const [isFormOpen, setIsFormOpen] = useState(false)\n const [editingPermission, setEditingPermission] = useState<AdminPermission | null>(null)\n const [formId, setFormId] = useState('')\n const [formName, setFormName] = useState('')\n const [formDescription, setFormDescription] = useState('')\n const [formResource, setFormResource] = useState('')\n const [formAction, setFormAction] = useState('')\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [formError, setFormError] = useState<string | null>(null)\n\n // Delete state\n const [deleteTarget, setDeleteTarget] = useState<AdminPermission | null>(null)\n const [isDeleting, setIsDeleting] = useState(false)\n\n const fetchPermissions = useCallback(async () => {\n setIsLoading(true)\n try {\n const result = await client.listPermissions()\n setPermissions(result)\n } catch {\n // Fail gracefully\n } finally {\n setIsLoading(false)\n }\n }, [client])\n\n useEffect(() => {\n fetchPermissions()\n }, [fetchPermissions])\n\n useEffect(() => {\n if (!search.trim()) {\n setFilteredPermissions(permissions)\n return\n }\n const query = search.toLowerCase()\n setFilteredPermissions(\n permissions.filter((permission) =>\n permission.name.toLowerCase().includes(query) ||\n permission.description?.toLowerCase().includes(query) ||\n permission.resource?.toLowerCase().includes(query) ||\n permission.action?.toLowerCase().includes(query),\n ),\n )\n }, [permissions, search])\n\n // ── Form handlers ───────────────────────────────────────────────────\n\n const handleOpenCreate = useCallback(() => {\n triggerHaptic('light')\n setEditingPermission(null)\n setFormId('')\n setFormName('')\n setFormDescription('')\n setFormResource('')\n setFormAction('')\n setFormError(null)\n setIsFormOpen(true)\n }, [])\n\n const handleOpenEdit = useCallback((permission: AdminPermission) => {\n triggerHaptic('light')\n setEditingPermission(permission)\n setFormId(permission.id)\n setFormName(permission.name)\n setFormDescription(permission.description ?? '')\n setFormResource(permission.resource ?? '')\n setFormAction(permission.action ?? '')\n setFormError(null)\n setIsFormOpen(true)\n }, [])\n\n const handleCloseForm = useCallback(() => {\n triggerHaptic('light')\n setIsFormOpen(false)\n }, [])\n\n const handleSubmitForm = useCallback(async () => {\n const isEditing = editingPermission !== null\n\n if (!isEditing && !formId.trim()) {\n setFormError(t('admin.permissions.errorIdRequired'))\n triggerHaptic('error')\n return\n }\n if (!formName.trim()) {\n setFormError(t('admin.permissions.errorNameRequired'))\n triggerHaptic('error')\n return\n }\n\n setFormError(null)\n setIsSubmitting(true)\n triggerHaptic('light')\n\n try {\n if (isEditing) {\n const data: AdminUpdatePermissionInput = {\n name: formName.trim(),\n description: formDescription.trim() || undefined,\n resource: formResource.trim() || undefined,\n action: formAction.trim() || undefined,\n }\n await client.updatePermission(editingPermission.id, data)\n } else {\n const data: AdminCreatePermissionInput = {\n id: formId.trim(),\n name: formName.trim(),\n description: formDescription.trim() || undefined,\n resource: formResource.trim() || undefined,\n action: formAction.trim() || undefined,\n }\n await client.createPermission(data)\n }\n triggerHaptic('success')\n setIsFormOpen(false)\n fetchPermissions()\n } catch {\n setFormError(\n isEditing\n ? t('admin.permissions.errorUpdateFailed')\n : t('admin.permissions.errorCreateFailed'),\n )\n triggerHaptic('error')\n } finally {\n setIsSubmitting(false)\n }\n }, [editingPermission, formId, formName, formDescription, formResource, formAction, client, fetchPermissions, t])\n\n // ── Delete handlers ─────────────────────────────────────────────────\n\n const handleDeleteRequest = useCallback((permission: AdminPermission) => {\n triggerHaptic('warning')\n setDeleteTarget(permission)\n }, [])\n\n const handleDeleteConfirm = useCallback(async () => {\n if (!deleteTarget) return\n setIsDeleting(true)\n triggerHaptic('medium')\n try {\n await client.deletePermission(deleteTarget.id)\n setDeleteTarget(null)\n triggerHaptic('success')\n fetchPermissions()\n } catch {\n triggerHaptic('error')\n } finally {\n setIsDeleting(false)\n }\n }, [deleteTarget, client, fetchPermissions])\n\n const handleDeleteCancel = useCallback(() => {\n triggerHaptic('light')\n setDeleteTarget(null)\n }, [])\n\n return (\n <>\n <SectionCard\n header={{\n icon: <KeyIcon className=\"h-5 w-5 text-white\" />,\n title: t('admin.permissions.title'),\n subtitle: t('admin.permissions.subtitle'),\n gradient: 'from-violet-500 via-purple-500 to-pink-500',\n rightContent: (\n <Button size=\"sm\" color=\"ios-glass-blue\" onClick={handleOpenCreate}>\n <PlusIcon className=\"mr-1 h-3.5 w-3.5\" />\n {t('admin.permissions.createButton')}\n </Button>\n ),\n }}\n padded={false}\n >\n {/* Search */}\n <div className=\"liquid-divider p-4\">\n <SearchInput\n value={search}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setSearch(event.target.value)}\n placeholder={t('admin.permissions.searchPlaceholder')}\n />\n </div>\n\n {/* Content */}\n {isLoading ? (\n <div className=\"flex items-center justify-center gap-2 p-8 text-sm text-slate-500 dark:text-slate-400\">\n <InlineSpinner />\n <span>{t('admin.permissions.loading')}</span>\n </div>\n ) : filteredPermissions.length === 0 ? (\n <div className=\"p-4 sm:p-6\">\n <EmptyState\n message={t('admin.permissions.emptyMessage')}\n description={t('admin.permissions.emptyDescription')}\n icon={KeyIcon}\n action={{\n label: t('admin.permissions.createButton'),\n onClick: handleOpenCreate,\n }}\n variant=\"card\"\n />\n </div>\n ) : (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"liquid-divider\">\n <th className=\"px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {t('admin.permissions.columnName')}\n </th>\n <th className=\"hidden px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400 sm:table-cell\">\n {t('admin.permissions.columnResource')}\n </th>\n <th className=\"hidden px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400 sm:table-cell\">\n {t('admin.permissions.columnAction')}\n </th>\n <th className=\"hidden px-4 py-3 text-left text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400 md:table-cell\">\n {t('admin.permissions.columnCreated')}\n </th>\n <th className=\"px-4 py-3 text-right text-xs font-medium uppercase tracking-wide text-slate-500 dark:text-slate-400\">\n {t('admin.permissions.columnActions')}\n </th>\n </tr>\n </thead>\n <tbody className=\"divide-y divide-gray-200/60 dark:divide-white/10\">\n {filteredPermissions.map((permission) => (\n <tr key={permission.id} className=\"transition-colors hover:bg-white/40 dark:hover:bg-white/5\">\n <td className=\"px-4 py-3\">\n <div>\n <p className=\"text-sm font-medium text-slate-900 dark:text-white\">\n {permission.name}\n </p>\n {permission.description && (\n <p className=\"mt-0.5 truncate text-xs text-slate-500 dark:text-slate-400\">\n {permission.description}\n </p>\n )}\n </div>\n </td>\n <td className=\"hidden px-4 py-3 sm:table-cell\">\n {permission.resource ? (\n <Badge color=\"blue\">{permission.resource}</Badge>\n ) : (\n <span className=\"text-slate-400 dark:text-slate-500\">—</span>\n )}\n </td>\n <td className=\"hidden px-4 py-3 sm:table-cell\">\n {permission.action ? (\n <Badge color=\"amber\">{permission.action}</Badge>\n ) : (\n <span className=\"text-slate-400 dark:text-slate-500\">—</span>\n )}\n </td>\n <td className=\"hidden px-4 py-3 text-slate-500 dark:text-slate-400 md:table-cell\">\n {format.dateTime(new Date(permission.createdAt), {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n })}\n </td>\n <td className=\"px-4 py-3 text-right\">\n <div className=\"flex items-center justify-end gap-1\">\n <Button\n size=\"sm\"\n outline\n onClick={() => handleOpenEdit(permission)}\n >\n <PencilSquareIcon className=\"h-3.5 w-3.5\" />\n </Button>\n <Button\n size=\"sm\"\n color=\"ios-glass-red\"\n onClick={() => handleDeleteRequest(permission)}\n >\n <TrashIcon className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </SectionCard>\n\n {/* Create/Edit permission sheet */}\n <Sheet\n open={isFormOpen}\n onClose={handleCloseForm}\n title={editingPermission\n ? t('admin.permissions.editSheetTitle')\n : t('admin.permissions.createSheetTitle')}\n side=\"bottom\"\n size=\"md\"\n >\n <div className=\"space-y-4 p-4 sm:p-6\">\n {!editingPermission && (\n <Input\n label={t('admin.permissions.formIdLabel')}\n value={formId}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setFormId(event.target.value)}\n placeholder={t('admin.permissions.formIdPlaceholder')}\n disabled={isSubmitting}\n autoFocus\n />\n )}\n\n <Input\n label={t('admin.permissions.formNameLabel')}\n value={formName}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setFormName(event.target.value)}\n placeholder={t('admin.permissions.formNamePlaceholder')}\n disabled={isSubmitting}\n autoFocus={!!editingPermission}\n />\n\n <Input\n label={t('admin.permissions.formDescriptionLabel')}\n value={formDescription}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setFormDescription(event.target.value)}\n placeholder={t('admin.permissions.formDescriptionPlaceholder')}\n disabled={isSubmitting}\n />\n\n <div className=\"grid grid-cols-2 gap-3\">\n <Input\n label={t('admin.permissions.formResourceLabel')}\n value={formResource}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setFormResource(event.target.value)}\n placeholder={t('admin.permissions.formResourcePlaceholder')}\n disabled={isSubmitting}\n />\n <Input\n label={t('admin.permissions.formActionLabel')}\n value={formAction}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setFormAction(event.target.value)}\n placeholder={t('admin.permissions.formActionPlaceholder')}\n disabled={isSubmitting}\n />\n </div>\n\n {formError && (\n <p className=\"text-sm text-red-600 dark:text-red-400\" role=\"alert\">{formError}</p>\n )}\n\n <div className=\"flex gap-3\">\n <Button\n outline\n onClick={handleCloseForm}\n disabled={isSubmitting}\n className=\"flex-1\"\n >\n {t('admin.permissions.formCancelButton')}\n </Button>\n <Button\n color=\"ios-glass-blue\"\n onClick={handleSubmitForm}\n loading={isSubmitting}\n disabled={isSubmitting || !formName.trim() || (!editingPermission && !formId.trim())}\n className=\"flex-1\"\n >\n {editingPermission\n ? t('admin.permissions.formSaveButton')\n : t('admin.permissions.formCreateButton')}\n </Button>\n </div>\n </div>\n </Sheet>\n\n {/* Delete confirmation */}\n <DynamicIslandConfirm\n open={deleteTarget !== null}\n onClose={handleDeleteCancel}\n onConfirm={handleDeleteConfirm}\n title={t('admin.permissions.deleteConfirmTitle', { name: deleteTarget?.name ?? '' })}\n icon={<TrashIcon className=\"h-5 w-5 text-white\" />}\n iconBackground=\"bg-ios-red\"\n confirmLabel={t('admin.permissions.deleteConfirmButton')}\n cancelLabel={t('admin.permissions.deleteCancelButton')}\n />\n </>\n )\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { OtpInput, SocialLoginButtons, AuthLayout, PasswordStrengthMeter } from './chunk-
|
|
3
|
-
import { useAuth, SegmentedControl, Spinner, Input, Text, TextLink, Card, useSocialProviders, PasswordInput, FormCheckbox, EmptyState, BaseForm, CardContent, Avatar, ListCard, ListCardItem, InlineSpinner, DynamicIslandConfirm } from './chunk-
|
|
2
|
+
import { OtpInput, SocialLoginButtons, AuthLayout, PasswordStrengthMeter } from './chunk-TQADF23S.mjs';
|
|
3
|
+
import { useAuth, SegmentedControl, Spinner, Input, Text, TextLink, Card, useSocialProviders, PasswordInput, FormCheckbox, EmptyState, BaseForm, CardContent, Avatar, ListCard, ListCardItem, InlineSpinner, DynamicIslandConfirm } from './chunk-F4KHAKTP.mjs';
|
|
4
4
|
import { useTranslations } from './chunk-ZEFNBGYI.mjs';
|
|
5
|
-
import { Button, Badge } from './chunk-
|
|
5
|
+
import { Button, Badge } from './chunk-2SBVFLPZ.mjs';
|
|
6
6
|
import { triggerHaptic } from './chunk-D2JF6C3E.mjs';
|
|
7
7
|
import { useState, useCallback, useEffect, Fragment as Fragment$1 } from 'react';
|
|
8
8
|
import { EnvelopeIcon, UserIcon, LockClosedIcon, CheckCircleIcon, DevicePhoneMobileIcon, PaperAirplaneIcon, ShieldExclamationIcon, BuildingOffice2Icon } from '@heroicons/react/24/outline';
|
|
@@ -206,8 +206,8 @@ function SignIn({
|
|
|
206
206
|
}
|
|
207
207
|
const content = /* @__PURE__ */ jsxs("div", { className: "space-y-5", children: [
|
|
208
208
|
/* @__PURE__ */ jsxs("div", { className: "text-center", children: [
|
|
209
|
-
/* @__PURE__ */ jsx("h2", { className: "text-2xl font-bold text-
|
|
210
|
-
/* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-
|
|
209
|
+
/* @__PURE__ */ jsx("h2", { className: "text-2xl font-bold text-slate-900 dark:text-white", children: t("signInTitle") }),
|
|
210
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-slate-500 dark:text-slate-400", children: t("signInSubtitle") })
|
|
211
211
|
] }),
|
|
212
212
|
error && /* @__PURE__ */ jsx("div", { className: "rounded-xl bg-red-50 dark:bg-red-900/20 px-4 py-3 text-sm text-ios-red", role: "alert", children: error }),
|
|
213
213
|
/* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, className: "space-y-4", children: [
|
|
@@ -252,8 +252,8 @@ function SignIn({
|
|
|
252
252
|
] }),
|
|
253
253
|
effectiveSocialProviders.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
254
254
|
/* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
255
|
-
/* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center", children: /* @__PURE__ */ jsx("div", { className: "w-full border-t border-
|
|
256
|
-
/* @__PURE__ */ jsx("div", { className: "relative flex justify-center text-xs", children: /* @__PURE__ */ jsx("span", { className: "bg-white/80 px-3 text-
|
|
255
|
+
/* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center", children: /* @__PURE__ */ jsx("div", { className: "w-full border-t border-slate-200/60 dark:border-white/10" }) }),
|
|
256
|
+
/* @__PURE__ */ jsx("div", { className: "relative flex justify-center text-xs", children: /* @__PURE__ */ jsx("span", { className: "bg-white/80 px-3 text-slate-400 dark:bg-slate-900/80 dark:text-slate-500", children: t("orContinueWith") }) })
|
|
257
257
|
] }),
|
|
258
258
|
/* @__PURE__ */ jsx(
|
|
259
259
|
SocialLoginButtons,
|
|
@@ -445,8 +445,8 @@ function SignUp({
|
|
|
445
445
|
const isFormValid = name.trim() !== "" && email.trim() !== "" && password !== "" && termsAccepted;
|
|
446
446
|
const content = /* @__PURE__ */ jsxs("div", { className: "space-y-5", children: [
|
|
447
447
|
/* @__PURE__ */ jsxs("div", { className: "text-center", children: [
|
|
448
|
-
/* @__PURE__ */ jsx("h2", { className: "text-2xl font-bold text-
|
|
449
|
-
/* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-
|
|
448
|
+
/* @__PURE__ */ jsx("h2", { className: "text-2xl font-bold text-slate-900 dark:text-white", children: t("signUpTitle") }),
|
|
449
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-slate-500 dark:text-slate-400", children: t("signUpSubtitle") })
|
|
450
450
|
] }),
|
|
451
451
|
error && /* @__PURE__ */ jsx("div", { className: "rounded-xl bg-red-50 dark:bg-red-900/20 px-4 py-3 text-sm text-ios-red", role: "alert", children: error }),
|
|
452
452
|
/* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, className: "space-y-4", children: [
|
|
@@ -525,8 +525,8 @@ function SignUp({
|
|
|
525
525
|
] }),
|
|
526
526
|
effectiveSocialProviders.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
527
527
|
/* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
528
|
-
/* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center", children: /* @__PURE__ */ jsx("div", { className: "w-full border-t border-
|
|
529
|
-
/* @__PURE__ */ jsx("div", { className: "relative flex justify-center text-xs", children: /* @__PURE__ */ jsx("span", { className: "bg-white dark:bg-
|
|
528
|
+
/* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center", children: /* @__PURE__ */ jsx("div", { className: "w-full border-t border-slate-200 dark:border-white/10" }) }),
|
|
529
|
+
/* @__PURE__ */ jsx("div", { className: "relative flex justify-center text-xs", children: /* @__PURE__ */ jsx("span", { className: "bg-white dark:bg-slate-900 px-3 text-slate-400 dark:text-slate-500", children: t("orContinueWith") }) })
|
|
530
530
|
] }),
|
|
531
531
|
/* @__PURE__ */ jsx(
|
|
532
532
|
SocialLoginButtons,
|
|
@@ -801,8 +801,8 @@ function PasswordlessSignIn({
|
|
|
801
801
|
);
|
|
802
802
|
const inputContent = /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
|
|
803
803
|
/* @__PURE__ */ jsxs("div", { className: "text-center", children: [
|
|
804
|
-
/* @__PURE__ */ jsx("h2", { className: "text-2xl font-bold text-
|
|
805
|
-
/* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-
|
|
804
|
+
/* @__PURE__ */ jsx("h2", { className: "text-2xl font-bold text-slate-900 dark:text-white", children: t("passwordlessTitle") }),
|
|
805
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-slate-500 dark:text-slate-400", children: t("passwordlessSubtitle") })
|
|
806
806
|
] }),
|
|
807
807
|
allowedChannels.length > 1 && /* @__PURE__ */ jsx("div", { className: "flex justify-center", children: /* @__PURE__ */ jsx(
|
|
808
808
|
SegmentedControl,
|
|
@@ -863,8 +863,8 @@ function PasswordlessSignIn({
|
|
|
863
863
|
] });
|
|
864
864
|
const verifyContent = /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
|
|
865
865
|
/* @__PURE__ */ jsxs("div", { className: "text-center", children: [
|
|
866
|
-
/* @__PURE__ */ jsx("h2", { className: "text-xl font-bold text-
|
|
867
|
-
/* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-
|
|
866
|
+
/* @__PURE__ */ jsx("h2", { className: "text-xl font-bold text-slate-900 dark:text-white", children: t("passwordlessEnterCodeTitle") }),
|
|
867
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-slate-500 dark:text-slate-400", children: channel === "email" ? t("passwordlessEnterCodeEmailSubtitle", { email: identifier }) : t("passwordlessEnterCodeSmsSubtitle", { phone: identifier }) })
|
|
868
868
|
] }),
|
|
869
869
|
error && /* @__PURE__ */ jsx("div", { className: "rounded-xl bg-red-50 dark:bg-red-900/20 px-4 py-3 text-sm text-ios-red text-center", role: "alert", children: error }),
|
|
870
870
|
/* @__PURE__ */ jsx(
|
|
@@ -1020,13 +1020,13 @@ function ConsentScreen({
|
|
|
1020
1020
|
function SsoConnectorList({ connectors, onSelect, loading = false }) {
|
|
1021
1021
|
const t = useTranslations("windsock");
|
|
1022
1022
|
if (loading) {
|
|
1023
|
-
return /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center gap-2 py-8 text-sm text-
|
|
1023
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center gap-2 py-8 text-sm text-slate-500 dark:text-slate-400", children: [
|
|
1024
1024
|
/* @__PURE__ */ jsx(InlineSpinner, {}),
|
|
1025
1025
|
/* @__PURE__ */ jsx("span", { children: t("sso.connectorList.loading") })
|
|
1026
1026
|
] });
|
|
1027
1027
|
}
|
|
1028
1028
|
if (connectors.length === 0) {
|
|
1029
|
-
return /* @__PURE__ */ jsx("p", { className: "py-6 text-center text-sm text-
|
|
1029
|
+
return /* @__PURE__ */ jsx("p", { className: "py-6 text-center text-sm text-slate-500 dark:text-slate-400", children: t("sso.connectorList.empty") });
|
|
1030
1030
|
}
|
|
1031
1031
|
return /* @__PURE__ */ jsx(ListCard, { children: connectors.map((connector) => {
|
|
1032
1032
|
const initials = connector.name.split(" ").map((word) => word[0]).join("").slice(0, 2).toUpperCase();
|
|
@@ -1043,12 +1043,12 @@ function SsoConnectorList({ connectors, onSelect, loading = false }) {
|
|
|
1043
1043
|
),
|
|
1044
1044
|
trailing: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
1045
1045
|
/* @__PURE__ */ jsx(Badge, { color: "zinc", children: connector.type === "saml" ? t("sso.connectorList.typeSaml") : t("sso.connectorList.typeOidc") }),
|
|
1046
|
-
/* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-4 w-4 text-
|
|
1046
|
+
/* @__PURE__ */ jsx(ChevronRightIcon, { className: "h-4 w-4 text-slate-400" })
|
|
1047
1047
|
] }),
|
|
1048
1048
|
onClick: () => onSelect(connector),
|
|
1049
1049
|
children: /* @__PURE__ */ jsxs("div", { children: [
|
|
1050
|
-
/* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-
|
|
1051
|
-
connector.domain && /* @__PURE__ */ jsx("p", { className: "text-xs text-
|
|
1050
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-slate-900 dark:text-white", children: connector.name }),
|
|
1051
|
+
connector.domain && /* @__PURE__ */ jsx("p", { className: "text-xs text-slate-500 dark:text-slate-400", children: connector.domain })
|
|
1052
1052
|
] })
|
|
1053
1053
|
},
|
|
1054
1054
|
connector.id
|
|
@@ -1106,8 +1106,8 @@ function SsoEmailForm({
|
|
|
1106
1106
|
if (phase === "connectors") {
|
|
1107
1107
|
const connectorsContent = /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
1108
1108
|
/* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
|
|
1109
|
-
/* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-
|
|
1110
|
-
/* @__PURE__ */ jsx("p", { className: "text-xs text-
|
|
1109
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-slate-900 dark:text-white", children: t("sso.emailForm.connectorsTitle") }),
|
|
1110
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-slate-500 dark:text-slate-400", children: t("sso.emailForm.connectorsSubtitle", { email }) })
|
|
1111
1111
|
] }),
|
|
1112
1112
|
/* @__PURE__ */ jsx(
|
|
1113
1113
|
SsoConnectorList,
|
|
@@ -1127,8 +1127,8 @@ function SsoEmailForm({
|
|
|
1127
1127
|
}
|
|
1128
1128
|
const emailContent = /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
1129
1129
|
/* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
|
|
1130
|
-
/* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-
|
|
1131
|
-
/* @__PURE__ */ jsx("p", { className: "text-xs text-
|
|
1130
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-slate-900 dark:text-white", children: t("sso.emailForm.title") }),
|
|
1131
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-slate-500 dark:text-slate-400", children: t("sso.emailForm.subtitle") })
|
|
1132
1132
|
] }),
|
|
1133
1133
|
/* @__PURE__ */ jsxs(BaseForm, { onSubmit: handleEmailSubmit, submitLabel: t("sso.emailForm.continueButton"), showFooter: false, children: [
|
|
1134
1134
|
/* @__PURE__ */ jsx(
|
|
@@ -1293,5 +1293,5 @@ function UserButton({ menuItems = [], onSignOut, avatarUrl, labels }) {
|
|
|
1293
1293
|
}
|
|
1294
1294
|
|
|
1295
1295
|
export { ConsentScreen, ForgotPassword, MfaChallenge, PasswordlessSignIn, ResetPassword, SignIn, SignUp, SsoConnectorList, SsoEmailForm, UserButton, VerifyEmail };
|
|
1296
|
-
//# sourceMappingURL=chunk-
|
|
1297
|
-
//# sourceMappingURL=chunk-
|
|
1296
|
+
//# sourceMappingURL=chunk-OTQXU4WG.mjs.map
|
|
1297
|
+
//# sourceMappingURL=chunk-OTQXU4WG.mjs.map
|