@alepha/ui 0.18.1 → 0.18.3
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/admin/{AdminApiKeys-C-6_Q-lH.js → AdminApiKeys-Dy_k-4Vd.js} +17 -38
- package/dist/admin/AdminApiKeys-Dy_k-4Vd.js.map +1 -0
- package/dist/admin/{AdminAudits-Bgbf04hO.js → AdminAudits-CKiFMSSU.js} +23 -19
- package/dist/admin/AdminAudits-CKiFMSSU.js.map +1 -0
- package/dist/admin/AdminDashboard-PhC_dZqo.js +67 -0
- package/dist/admin/AdminDashboard-PhC_dZqo.js.map +1 -0
- package/dist/admin/{AdminFiles-B9a7G3cY.js → AdminFiles-DFTjijGp.js} +3 -7
- package/dist/admin/AdminFiles-DFTjijGp.js.map +1 -0
- package/dist/admin/{AdminJobDashboard-DaTwf5OY.js → AdminJobDashboard-BL8gGPDp.js} +2 -2
- package/dist/admin/{AdminJobDashboard-DaTwf5OY.js.map → AdminJobDashboard-BL8gGPDp.js.map} +1 -1
- package/dist/admin/{AdminJobExecutions-B9cek5dl.js → AdminJobExecutions-D9E-CS-U.js} +24 -36
- package/dist/admin/AdminJobExecutions-D9E-CS-U.js.map +1 -0
- package/dist/admin/{AdminJobRegistry-DFgV3oqx.js → AdminJobRegistry-Ci9ue1zC.js} +10 -18
- package/dist/admin/AdminJobRegistry-Ci9ue1zC.js.map +1 -0
- package/dist/admin/AdminLayout-I6TlUMPc.js +61 -0
- package/dist/admin/AdminLayout-I6TlUMPc.js.map +1 -0
- package/dist/admin/AdminNotifications-ZPHCYrv7.js +542 -0
- package/dist/admin/AdminNotifications-ZPHCYrv7.js.map +1 -0
- package/dist/admin/{AdminParameters-DHw9ATgl.js → AdminParameters-CqgvhRsb.js} +120 -105
- package/dist/admin/AdminParameters-CqgvhRsb.js.map +1 -0
- package/dist/admin/{AdminSessions-BhGJPI3z.js → AdminSessions-Bz5NRuoW.js} +48 -53
- package/dist/admin/AdminSessions-Bz5NRuoW.js.map +1 -0
- package/dist/admin/{AdminUserLayout-BdC4Te8m.js → AdminUserLayout-lXT6I0Qq.js} +14 -8
- package/dist/admin/AdminUserLayout-lXT6I0Qq.js.map +1 -0
- package/dist/admin/{AdminUserProfile-DAt23fqY.js → AdminUserProfile-vFBLoJ3h.js} +3 -3
- package/dist/admin/{AdminUserProfile-DAt23fqY.js.map → AdminUserProfile-vFBLoJ3h.js.map} +1 -1
- package/dist/admin/{AdminUserSessions-1uzcx02z.js → AdminUserSessions-CT_YDim0.js} +33 -35
- package/dist/admin/AdminUserSessions-CT_YDim0.js.map +1 -0
- package/dist/admin/AdminUsers-D1UfGya9.js +206 -0
- package/dist/admin/AdminUsers-D1UfGya9.js.map +1 -0
- package/dist/admin/{AuthLayout-DFJvCvzw.js → AuthLayout-_frhdgOO.js} +2 -2
- package/dist/admin/{AuthLayout-DFJvCvzw.js.map → AuthLayout-_frhdgOO.js.map} +1 -1
- package/dist/admin/{IconGoogle-CSQLPYwX.js → IconGoogle-Ch1m3Uzl.js} +1 -1
- package/dist/admin/{IconGoogle-CSQLPYwX.js.map → IconGoogle-Ch1m3Uzl.js.map} +1 -1
- package/dist/admin/Login-xtNmQtGh.js +275 -0
- package/dist/admin/Login-xtNmQtGh.js.map +1 -0
- package/dist/{auth/Profile-BMX_Ar_s.js → admin/Profile-_AtPUwAP.js} +31 -27
- package/dist/admin/Profile-_AtPUwAP.js.map +1 -0
- package/dist/admin/{Register-Cs10l8vX.js → Register-JcCjHUUn.js} +199 -143
- package/dist/admin/Register-JcCjHUUn.js.map +1 -0
- package/dist/admin/{ResetPassword-BwDdfkGH.js → ResetPassword-CwGBPLJO.js} +7 -7
- package/dist/admin/ResetPassword-CwGBPLJO.js.map +1 -0
- package/dist/admin/{VerifyEmail-DfXHAiQl.js → VerifyEmail-hNxWejWf.js} +23 -8
- package/dist/admin/VerifyEmail-hNxWejWf.js.map +1 -0
- package/dist/admin/{core-2xoLiT0o.js → core-CYaRQ8O-.js} +2082 -688
- package/dist/admin/core-CYaRQ8O-.js.map +1 -0
- package/dist/admin/index.d.ts +112 -48
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +467 -69
- package/dist/admin/index.js.map +1 -1
- package/dist/auth/{AuthLayout-CAE1pX9s.js → AuthLayout-AvLlcLjS.js} +2 -2
- package/dist/auth/{AuthLayout-CAE1pX9s.js.map → AuthLayout-AvLlcLjS.js.map} +1 -1
- package/dist/auth/Login-BA1E8IZl.js +275 -0
- package/dist/auth/Login-BA1E8IZl.js.map +1 -0
- package/dist/{admin/Profile-B-c9pCPf.js → auth/Profile-YcWdeuFz.js} +31 -27
- package/dist/auth/Profile-YcWdeuFz.js.map +1 -0
- package/dist/auth/{Register-6hi_cpfF.js → Register-CPhEO5MG.js} +198 -142
- package/dist/auth/Register-CPhEO5MG.js.map +1 -0
- package/dist/{demo/ResetPassword-DWN0lzr5.js → auth/ResetPassword-DCtGcneA.js} +7 -7
- package/dist/auth/ResetPassword-DCtGcneA.js.map +1 -0
- package/dist/{demo/VerifyEmail-DZWL72K4.js → auth/VerifyEmail-DkH7NBfn.js} +23 -8
- package/dist/auth/VerifyEmail-DkH7NBfn.js.map +1 -0
- package/dist/auth/{core-niW0sFLv.js → core-D5jIAVF2.js} +1385 -329
- package/dist/auth/core-D5jIAVF2.js.map +1 -0
- package/dist/auth/index.d.ts +105 -49
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +29 -26
- package/dist/auth/index.js.map +1 -1
- package/dist/core/index.d.ts +210 -74
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2247 -834
- package/dist/core/index.js.map +1 -1
- package/dist/demo/{AuthLayout-jLa0aKsI.js → AuthLayout-Brri4A-L.js} +2 -2
- package/dist/demo/{AuthLayout-jLa0aKsI.js.map → AuthLayout-Brri4A-L.js.map} +1 -1
- package/dist/demo/DemoButton-wiCxZZ_L.js +182 -0
- package/dist/demo/DemoButton-wiCxZZ_L.js.map +1 -0
- package/dist/demo/DemoControlSelect-D7ILObVg.js +305 -0
- package/dist/demo/DemoControlSelect-D7ILObVg.js.map +1 -0
- package/dist/demo/DemoDataTable-DZ5Y8pFX.js +362 -0
- package/dist/demo/DemoDataTable-DZ5Y8pFX.js.map +1 -0
- package/dist/demo/{DemoDialog-4ItHLf9t.js → DemoDialog-CUWdLHim.js} +2 -2
- package/dist/demo/{DemoDialog-4ItHLf9t.js.map → DemoDialog-CUWdLHim.js.map} +1 -1
- package/dist/demo/{DemoFlex-EtVq8QfX.js → DemoFlex-a8OhMMvq.js} +3 -3
- package/dist/demo/{DemoFlex-EtVq8QfX.js.map → DemoFlex-a8OhMMvq.js.map} +1 -1
- package/dist/demo/{DemoHeading-BS-vGfkI.js → DemoHeading-C13OVDfS.js} +3 -3
- package/dist/demo/{DemoHeading-BS-vGfkI.js.map → DemoHeading-C13OVDfS.js.map} +1 -1
- package/dist/demo/{DemoHome-Clbn8AmS.js → DemoHome-D_De3UiT.js} +2 -2
- package/dist/demo/{DemoHome-Clbn8AmS.js.map → DemoHome-D_De3UiT.js.map} +1 -1
- package/dist/demo/{DemoJsonViewer-DkIX_ky2.js → DemoJsonViewer-B50s9aGM.js} +3 -3
- package/dist/demo/{DemoJsonViewer-DkIX_ky2.js.map → DemoJsonViewer-B50s9aGM.js.map} +1 -1
- package/dist/demo/{DemoLayout-C56xb5EE.js → DemoLayout-CHU8WTwO.js} +14 -5
- package/dist/demo/DemoLayout-CHU8WTwO.js.map +1 -0
- package/dist/demo/{DemoLogin-BZwpicOS.js → DemoLogin-BBlrWpml.js} +49 -32
- package/dist/demo/DemoLogin-BBlrWpml.js.map +1 -0
- package/dist/demo/{DemoRegister-C7_qc4MJ.js → DemoRegister-BuNE3_-f.js} +49 -50
- package/dist/demo/DemoRegister-BuNE3_-f.js.map +1 -0
- package/dist/demo/{DemoResetPassword-BI1Ct4Dw.js → DemoResetPassword-D_IjjjOJ.js} +12 -16
- package/dist/demo/DemoResetPassword-D_IjjjOJ.js.map +1 -0
- package/dist/demo/{DemoSidebar-CcBo4ltC.js → DemoSidebar-Giy2HRBD.js} +3 -3
- package/dist/demo/{DemoSidebar-CcBo4ltC.js.map → DemoSidebar-Giy2HRBD.js.map} +1 -1
- package/dist/demo/{DemoText-CzXuUn3g.js → DemoText-ubcw-vog.js} +3 -3
- package/dist/demo/{DemoText-CzXuUn3g.js.map → DemoText-ubcw-vog.js.map} +1 -1
- package/dist/demo/{DemoToast-BgHDhWrX.js → DemoToast-9die_dYT.js} +2 -2
- package/dist/demo/{DemoToast-BgHDhWrX.js.map → DemoToast-9die_dYT.js.map} +1 -1
- package/dist/demo/{DemoTypeForm-DDzWoMSV.js → DemoTypeForm-D_d6OVKL.js} +8 -4
- package/dist/demo/DemoTypeForm-D_d6OVKL.js.map +1 -0
- package/dist/demo/DemoVerifyEmail-B43KlF4F.js +34 -0
- package/dist/demo/DemoVerifyEmail-B43KlF4F.js.map +1 -0
- package/dist/demo/Login-C12N4oGs.js +275 -0
- package/dist/demo/Login-C12N4oGs.js.map +1 -0
- package/dist/demo/{Profile-CWqti7FB.js → Profile-DS5q4vOh.js} +31 -27
- package/dist/demo/Profile-DS5q4vOh.js.map +1 -0
- package/dist/demo/{Register-a70LPgs2.js → Register-B4hLBeEv.js} +198 -142
- package/dist/demo/Register-B4hLBeEv.js.map +1 -0
- package/dist/{auth/ResetPassword-CqfTk1FI.js → demo/ResetPassword-D8g9ha1N.js} +7 -7
- package/dist/demo/ResetPassword-D8g9ha1N.js.map +1 -0
- package/dist/demo/{Showcase-Dq3MISpd.js → Showcase-D6Fxt4X4.js} +64 -65
- package/dist/demo/Showcase-D6Fxt4X4.js.map +1 -0
- package/dist/{auth/VerifyEmail-nWiSTMjF.js → demo/VerifyEmail-BjDo0cZA.js} +23 -8
- package/dist/demo/VerifyEmail-BjDo0cZA.js.map +1 -0
- package/dist/demo/{auth-d6n3xbug.js → auth-ByVTreDl.js} +8 -8
- package/dist/demo/{auth-d6n3xbug.js.map → auth-ByVTreDl.js.map} +1 -1
- package/dist/demo/{core-RCUw1Q-a.js → core-DFgB3yU4.js} +2182 -756
- package/dist/demo/core-DFgB3yU4.js.map +1 -0
- package/dist/demo/index.d.ts +1 -0
- package/dist/demo/index.d.ts.map +1 -1
- package/dist/demo/index.js +24 -18
- package/dist/demo/index.js.map +1 -1
- package/package.json +7 -7
- package/src/admin/{AdminRouter.ts → AdminRouter.tsx} +150 -18
- package/src/admin/components/AdminDashboard.tsx +52 -0
- package/src/admin/components/AdminLayout.tsx +32 -40
- package/src/admin/components/audits/AdminAudits.tsx +22 -16
- package/src/admin/components/files/AdminFiles.tsx +1 -6
- package/src/admin/components/jobs/AdminJobExecutions.tsx +33 -39
- package/src/admin/components/jobs/AdminJobRegistry.tsx +9 -18
- package/src/admin/components/keys/AdminApiKeys.tsx +23 -41
- package/src/admin/components/notifications/AdminNotifications.tsx +519 -0
- package/src/admin/components/parameters/ParameterDetails.tsx +12 -270
- package/src/admin/components/parameters/ParameterDetailsConfigForm.tsx +238 -0
- package/src/admin/components/parameters/ParameterDetailsLoading.tsx +24 -0
- package/src/admin/components/parameters/ParameterHistory.tsx +10 -11
- package/src/admin/components/parameters/ParameterTree.tsx +28 -184
- package/src/admin/components/parameters/ParameterTreeNode.tsx +151 -0
- package/src/admin/components/sessions/AdminSessions.tsx +71 -71
- package/src/admin/components/shared/AdminResourceHeader.tsx +2 -25
- package/src/admin/components/shared/AdminResourceHeaderMenuItem.tsx +37 -0
- package/src/admin/components/shared/AdminResourceTabs.tsx +2 -26
- package/src/admin/components/shared/AdminResourceTabsItem.tsx +36 -0
- package/src/admin/components/users/AdminUserSessions.tsx +33 -31
- package/src/admin/components/users/AdminUsers.tsx +184 -72
- package/src/admin/index.ts +2 -2
- package/src/admin/primitives/$uiAdmin.ts +1 -1
- package/src/auth/components/Login.tsx +188 -121
- package/src/auth/components/Profile.tsx +1 -22
- package/src/auth/components/ProfileField.tsx +39 -0
- package/src/auth/components/Register.tsx +215 -158
- package/src/auth/components/ResetPassword.tsx +7 -11
- package/src/auth/components/VerifyEmail.tsx +35 -10
- package/src/auth/components/buttons/UserButton.tsx +20 -24
- package/src/auth/index.ts +1 -0
- package/src/core/atoms/alephaSidebarAtom.ts +1 -1
- package/src/core/atoms/alephaThemeListAtom.ts +14 -1
- package/src/core/atoms/alephaThemeOverridesAtom.ts +17 -0
- package/src/core/atoms/themes/editorial.ts +184 -0
- package/src/core/atoms/themes/monochrome.ts +197 -0
- package/src/core/atoms/themes/rosePine.ts +208 -0
- package/src/core/atoms/themes/softBrutalism.ts +221 -0
- package/src/core/atoms/themes/terminal.ts +186 -0
- package/src/core/components/Flex.tsx +101 -1
- package/src/core/components/Text.tsx +1 -1
- package/src/core/components/buttons/ActionButton.tsx +109 -87
- package/src/core/components/buttons/DarkModeButton.tsx +3 -3
- package/src/core/components/buttons/LanguageButton.tsx +1 -1
- package/src/core/components/buttons/OmnibarButton.tsx +1 -2
- package/src/core/components/buttons/ThemeButton.tsx +40 -11
- package/src/core/components/buttons/ThemeExpertModal.tsx +184 -0
- package/src/core/components/buttons/ToggleSidebarButton.tsx +1 -2
- package/src/core/components/data/DetailDrawer.tsx +102 -96
- package/src/core/components/data/DetailList.tsx +2 -1
- package/src/core/components/layout/AppBar.tsx +10 -0
- package/src/core/components/layout/Breadcrumb.tsx +3 -6
- package/src/core/components/layout/DashboardShell.tsx +28 -11
- package/src/core/components/layout/Sidebar.tsx +18 -235
- package/src/core/components/layout/SidebarCollapsedItem.tsx +91 -0
- package/src/core/components/layout/SidebarItem.tsx +146 -0
- package/src/core/components/layout/index.ts +3 -1
- package/src/core/constants/ui.ts +5 -5
- package/src/core/form/components/Control.tsx +31 -29
- package/src/core/form/components/ControlArray.tsx +13 -39
- package/src/core/form/components/ControlDate.tsx +10 -21
- package/src/core/form/components/ControlNumber.tsx +4 -33
- package/src/core/form/components/ControlQueryBuilder.tsx +12 -175
- package/src/core/form/components/ControlQueryBuilderHelp.tsx +165 -0
- package/src/core/form/components/ControlSelect.browser.spec.tsx +343 -0
- package/src/core/form/components/ControlSelect.tsx +294 -92
- package/src/core/form/components/TypeForm.browser.spec.tsx +3 -3
- package/src/core/form/components/TypeForm.tsx +5 -2
- package/src/core/form/index.ts +8 -1
- package/src/core/form/utils/parseInput.ts +7 -3
- package/src/core/hooks/useTheme.ts +26 -3
- package/src/core/index.ts +9 -2
- package/src/core/interfaces/AlephaTheme.ts +2 -0
- package/src/core/json/components/JsonViewer.tsx +103 -319
- package/src/core/json/components/JsonViewerCopyButton.tsx +46 -0
- package/src/core/json/components/JsonViewerRowNode.tsx +120 -0
- package/src/core/json/components/JsonViewerShared.ts +76 -0
- package/src/core/providers/ThemeProvider.ts +108 -8
- package/src/core/services/DialogService.tsx +24 -3
- package/src/core/styles.css +33 -20
- package/src/core/table/components/ColumnPicker.tsx +3 -3
- package/src/core/table/components/DataTable.tsx +233 -143
- package/src/core/table/components/DataTableFilters.tsx +6 -16
- package/src/core/table/components/DataTablePagination.tsx +58 -29
- package/src/core/table/components/DataTableToolbar.tsx +16 -7
- package/src/core/table/components/FilterPicker.tsx +3 -3
- package/src/core/table/index.ts +1 -0
- package/src/core/table/interfaces/types.ts +42 -9
- package/src/core/utils/icons.tsx +2 -2
- package/src/demo/DemoRouter.ts +8 -1
- package/src/demo/components/DemoLayout.tsx +12 -2
- package/src/demo/components/auth/DemoLogin.tsx +35 -28
- package/src/demo/components/auth/DemoRegister.tsx +35 -49
- package/src/demo/components/auth/DemoResetPassword.tsx +5 -9
- package/src/demo/components/auth/DemoVerifyEmail.tsx +7 -6
- package/src/demo/components/core/DemoButton.tsx +123 -103
- package/src/demo/components/core/DemoControlSelect.tsx +325 -0
- package/src/demo/components/core/DemoDataTable.tsx +255 -241
- package/src/demo/components/core/DemoTypeForm.tsx +7 -2
- package/src/demo/components/shared/MacWindow.tsx +5 -11
- package/src/demo/components/shared/Showcase.tsx +28 -42
- package/dist/admin/AdminApiKeys-C-6_Q-lH.js.map +0 -1
- package/dist/admin/AdminAudits-Bgbf04hO.js.map +0 -1
- package/dist/admin/AdminFiles-B9a7G3cY.js.map +0 -1
- package/dist/admin/AdminJobExecutions-B9cek5dl.js.map +0 -1
- package/dist/admin/AdminJobRegistry-DFgV3oqx.js.map +0 -1
- package/dist/admin/AdminLayout-DHsvWxVB.js +0 -70
- package/dist/admin/AdminLayout-DHsvWxVB.js.map +0 -1
- package/dist/admin/AdminParameters-DHw9ATgl.js.map +0 -1
- package/dist/admin/AdminSessions-BhGJPI3z.js.map +0 -1
- package/dist/admin/AdminUserLayout-BdC4Te8m.js.map +0 -1
- package/dist/admin/AdminUserSessions-1uzcx02z.js.map +0 -1
- package/dist/admin/AdminUsers-C85c3eiQ.js +0 -121
- package/dist/admin/AdminUsers-C85c3eiQ.js.map +0 -1
- package/dist/admin/Login-BGheURrg.js +0 -219
- package/dist/admin/Login-BGheURrg.js.map +0 -1
- package/dist/admin/Profile-B-c9pCPf.js.map +0 -1
- package/dist/admin/Register-Cs10l8vX.js.map +0 -1
- package/dist/admin/ResetPassword-BwDdfkGH.js.map +0 -1
- package/dist/admin/VerifyEmail-DfXHAiQl.js.map +0 -1
- package/dist/admin/auth-Dr0Cf8I7.js +0 -319
- package/dist/admin/auth-Dr0Cf8I7.js.map +0 -1
- package/dist/admin/core-2xoLiT0o.js.map +0 -1
- package/dist/auth/Login-Denw_UGy.js +0 -219
- package/dist/auth/Login-Denw_UGy.js.map +0 -1
- package/dist/auth/Profile-BMX_Ar_s.js.map +0 -1
- package/dist/auth/Register-6hi_cpfF.js.map +0 -1
- package/dist/auth/ResetPassword-CqfTk1FI.js.map +0 -1
- package/dist/auth/VerifyEmail-nWiSTMjF.js.map +0 -1
- package/dist/auth/core-niW0sFLv.js.map +0 -1
- package/dist/demo/DemoButton-BmaWZVwf.js +0 -178
- package/dist/demo/DemoButton-BmaWZVwf.js.map +0 -1
- package/dist/demo/DemoDataTable-Z9xyV221.js +0 -362
- package/dist/demo/DemoDataTable-Z9xyV221.js.map +0 -1
- package/dist/demo/DemoLayout-C56xb5EE.js.map +0 -1
- package/dist/demo/DemoLogin-BZwpicOS.js.map +0 -1
- package/dist/demo/DemoRegister-C7_qc4MJ.js.map +0 -1
- package/dist/demo/DemoResetPassword-BI1Ct4Dw.js.map +0 -1
- package/dist/demo/DemoTypeForm-DDzWoMSV.js.map +0 -1
- package/dist/demo/DemoVerifyEmail-C_Irdnov.js +0 -30
- package/dist/demo/DemoVerifyEmail-C_Irdnov.js.map +0 -1
- package/dist/demo/Login-hSOU3jZc.js +0 -219
- package/dist/demo/Login-hSOU3jZc.js.map +0 -1
- package/dist/demo/Profile-CWqti7FB.js.map +0 -1
- package/dist/demo/Register-a70LPgs2.js.map +0 -1
- package/dist/demo/ResetPassword-DWN0lzr5.js.map +0 -1
- package/dist/demo/Showcase-Dq3MISpd.js.map +0 -1
- package/dist/demo/VerifyEmail-DZWL72K4.js.map +0 -1
- package/dist/demo/core-RCUw1Q-a.js.map +0 -1
- package/src/demo/styles.css +0 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { _ as ActionButton, b as useToast, l as Flex$1, m as useDialog, r as DataTable, s as Text$1 } from "./core-CYaRQ8O-.js";
|
|
2
|
+
import { t } from "alepha";
|
|
3
|
+
import { useI18n } from "alepha/react/i18n";
|
|
4
|
+
import { Avatar, Badge } from "@mantine/core";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { useState } from "react";
|
|
7
|
+
import { IconEye, IconTrash, IconUserOff, IconUserPlus } from "@tabler/icons-react";
|
|
8
|
+
import { useRouter } from "alepha/react/router";
|
|
9
|
+
import { useClient } from "alepha/react";
|
|
10
|
+
|
|
11
|
+
//#region ../../src/admin/components/users/AdminUsers.tsx
|
|
12
|
+
const filters = t.object({
|
|
13
|
+
query: t.optional(t.text()),
|
|
14
|
+
enabled: t.optional(t.boolean()),
|
|
15
|
+
emailVerified: t.optional(t.boolean())
|
|
16
|
+
});
|
|
17
|
+
const AdminUsers = (props) => {
|
|
18
|
+
const client = useClient();
|
|
19
|
+
const router = useRouter();
|
|
20
|
+
const { l } = useI18n();
|
|
21
|
+
const dialog = useDialog();
|
|
22
|
+
const toast = useToast();
|
|
23
|
+
const [refreshKey, setRefreshKey] = useState(0);
|
|
24
|
+
const refresh = () => setRefreshKey((k) => k + 1);
|
|
25
|
+
const handleToggleEnabled = async (user) => {
|
|
26
|
+
const enabled = !user.enabled;
|
|
27
|
+
if (!await dialog.confirm({
|
|
28
|
+
title: enabled ? "Enable user" : "Disable user",
|
|
29
|
+
message: enabled ? `Enable ${user.email || user.username || "this user"}?` : `Disable ${user.email || user.username || "this user"}? They will no longer be able to sign in.`
|
|
30
|
+
})) return;
|
|
31
|
+
await client.updateUser({
|
|
32
|
+
params: { id: user.id },
|
|
33
|
+
query: { userRealmName: props.userRealmName },
|
|
34
|
+
body: { enabled }
|
|
35
|
+
});
|
|
36
|
+
toast.success({ message: enabled ? "User enabled" : "User disabled" });
|
|
37
|
+
refresh();
|
|
38
|
+
};
|
|
39
|
+
const handleDelete = async (user) => {
|
|
40
|
+
if (!await dialog.confirm({
|
|
41
|
+
title: "Delete user",
|
|
42
|
+
message: `Permanently delete ${user.email || user.username || "this user"}? This action cannot be undone.`
|
|
43
|
+
})) return;
|
|
44
|
+
await client.deleteUser({
|
|
45
|
+
params: { id: user.id },
|
|
46
|
+
query: { userRealmName: props.userRealmName }
|
|
47
|
+
});
|
|
48
|
+
toast.success({ message: "User deleted" });
|
|
49
|
+
refresh();
|
|
50
|
+
};
|
|
51
|
+
const handleBulkDisable = async (items, clearSelection) => {
|
|
52
|
+
const enabledUsers = items.filter((u) => u.enabled);
|
|
53
|
+
if (enabledUsers.length === 0) {
|
|
54
|
+
toast.danger({ message: "No active users in selection" });
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (!await dialog.confirm({
|
|
58
|
+
title: "Disable users",
|
|
59
|
+
message: `Disable ${enabledUsers.length} user(s)? They will no longer be able to sign in.`
|
|
60
|
+
})) return;
|
|
61
|
+
for (const user of enabledUsers) await client.updateUser({
|
|
62
|
+
params: { id: user.id },
|
|
63
|
+
query: { userRealmName: props.userRealmName },
|
|
64
|
+
body: { enabled: false }
|
|
65
|
+
});
|
|
66
|
+
toast.success({ message: `${enabledUsers.length} user(s) disabled` });
|
|
67
|
+
clearSelection();
|
|
68
|
+
refresh();
|
|
69
|
+
};
|
|
70
|
+
return /* @__PURE__ */ jsx(Flex$1, {
|
|
71
|
+
p: "md",
|
|
72
|
+
flex: 1,
|
|
73
|
+
direction: "column",
|
|
74
|
+
children: /* @__PURE__ */ jsx(DataTable, {
|
|
75
|
+
withCheckbox: true,
|
|
76
|
+
withExport: true,
|
|
77
|
+
checkboxActions: [{
|
|
78
|
+
intent: "danger",
|
|
79
|
+
label: "Disable selected",
|
|
80
|
+
icon: /* @__PURE__ */ jsx(IconUserOff, {}),
|
|
81
|
+
onClick: (ctx) => handleBulkDisable(ctx.selectedItems, ctx.clearSelection)
|
|
82
|
+
}],
|
|
83
|
+
submitOnInit: true,
|
|
84
|
+
defaultSize: 10,
|
|
85
|
+
defaultFilters: ["query"],
|
|
86
|
+
tableProps: {
|
|
87
|
+
horizontalSpacing: "xs",
|
|
88
|
+
verticalSpacing: "xs"
|
|
89
|
+
},
|
|
90
|
+
onFilterChange: (_key, _value, form) => form.submit(),
|
|
91
|
+
filters,
|
|
92
|
+
items: async (filters) => {
|
|
93
|
+
return await client.findUsers({ query: {
|
|
94
|
+
...filters,
|
|
95
|
+
userRealmName: props.userRealmName
|
|
96
|
+
} });
|
|
97
|
+
},
|
|
98
|
+
columns: {
|
|
99
|
+
user: {
|
|
100
|
+
label: "User",
|
|
101
|
+
value: (item) => {
|
|
102
|
+
const name = `${item.firstName || ""} ${item.lastName || ""}`.trim() || item.username || "Anonymous";
|
|
103
|
+
return /* @__PURE__ */ jsx(ActionButton, {
|
|
104
|
+
variant: "transparent",
|
|
105
|
+
href: `/admin/users/${item.id}`,
|
|
106
|
+
children: /* @__PURE__ */ jsxs(Flex$1, {
|
|
107
|
+
gap: "xs",
|
|
108
|
+
centerY: true,
|
|
109
|
+
children: [/* @__PURE__ */ jsx(Avatar, {
|
|
110
|
+
size: "sm",
|
|
111
|
+
name
|
|
112
|
+
}), /* @__PURE__ */ jsxs(Flex$1, {
|
|
113
|
+
col: true,
|
|
114
|
+
children: [/* @__PURE__ */ jsx(Text$1, {
|
|
115
|
+
size: "sm",
|
|
116
|
+
bold: true,
|
|
117
|
+
children: name
|
|
118
|
+
}), /* @__PURE__ */ jsx(Text$1, {
|
|
119
|
+
size: "xs",
|
|
120
|
+
muted: true,
|
|
121
|
+
children: item.email || "—"
|
|
122
|
+
})]
|
|
123
|
+
})]
|
|
124
|
+
})
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
username: {
|
|
129
|
+
label: "Username",
|
|
130
|
+
defaultHidden: true,
|
|
131
|
+
value: (item) => /* @__PURE__ */ jsx(Text$1, {
|
|
132
|
+
size: "sm",
|
|
133
|
+
ff: "monospace",
|
|
134
|
+
children: item.username || "—"
|
|
135
|
+
})
|
|
136
|
+
},
|
|
137
|
+
roles: {
|
|
138
|
+
label: "Roles",
|
|
139
|
+
value: (item) => item.roles.length > 0 ? /* @__PURE__ */ jsx(Flex$1, {
|
|
140
|
+
gap: 4,
|
|
141
|
+
children: item.roles.map((role) => /* @__PURE__ */ jsx(Badge, {
|
|
142
|
+
size: "xs",
|
|
143
|
+
variant: "default",
|
|
144
|
+
children: role
|
|
145
|
+
}, role))
|
|
146
|
+
}) : /* @__PURE__ */ jsx(Text$1, {
|
|
147
|
+
size: "xs",
|
|
148
|
+
muted: true,
|
|
149
|
+
children: "No roles"
|
|
150
|
+
})
|
|
151
|
+
},
|
|
152
|
+
enabled: {
|
|
153
|
+
label: "Status",
|
|
154
|
+
value: (item) => /* @__PURE__ */ jsx(Badge, {
|
|
155
|
+
size: "sm",
|
|
156
|
+
variant: "light",
|
|
157
|
+
color: item.enabled ? "green" : "red",
|
|
158
|
+
children: item.enabled ? "Active" : "Disabled"
|
|
159
|
+
})
|
|
160
|
+
},
|
|
161
|
+
emailVerified: {
|
|
162
|
+
label: "Email",
|
|
163
|
+
value: (item) => /* @__PURE__ */ jsx(Badge, {
|
|
164
|
+
size: "sm",
|
|
165
|
+
variant: "light",
|
|
166
|
+
color: item.emailVerified ? "green" : "gray",
|
|
167
|
+
children: item.emailVerified ? "Verified" : "Unverified"
|
|
168
|
+
})
|
|
169
|
+
},
|
|
170
|
+
createdAt: {
|
|
171
|
+
label: "Joined",
|
|
172
|
+
sortable: true,
|
|
173
|
+
sortKey: "createdAt",
|
|
174
|
+
value: (item) => /* @__PURE__ */ jsx(Text$1, {
|
|
175
|
+
size: "xs",
|
|
176
|
+
muted: true,
|
|
177
|
+
children: l(item.createdAt, { date: "fromNow" })
|
|
178
|
+
})
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
rowActions: (item) => [
|
|
182
|
+
{
|
|
183
|
+
label: "View profile",
|
|
184
|
+
icon: IconEye,
|
|
185
|
+
onClick: () => router.push("adminUserProfile", { params: { userId: item.id } })
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
label: item.enabled ? "Disable user" : "Enable user",
|
|
189
|
+
icon: item.enabled ? IconUserOff : IconUserPlus,
|
|
190
|
+
color: item.enabled ? "red" : "green",
|
|
191
|
+
onClick: () => handleToggleEnabled(item)
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
label: "Delete user",
|
|
195
|
+
icon: IconTrash,
|
|
196
|
+
color: "red",
|
|
197
|
+
onClick: () => handleDelete(item)
|
|
198
|
+
}
|
|
199
|
+
]
|
|
200
|
+
}, refreshKey)
|
|
201
|
+
});
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
//#endregion
|
|
205
|
+
export { AdminUsers as default };
|
|
206
|
+
//# sourceMappingURL=AdminUsers-D1UfGya9.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminUsers-D1UfGya9.js","names":["Flex","Text"],"sources":["../../src/admin/components/users/AdminUsers.tsx"],"sourcesContent":["import {\n ActionButton,\n DataTable,\n Flex,\n Text,\n useDialog,\n useToast,\n} from \"@alepha/ui\";\nimport { Avatar, Badge } from \"@mantine/core\";\nimport {\n IconEye,\n IconTrash,\n IconUserOff,\n IconUserPlus,\n} from \"@tabler/icons-react\";\nimport { type Page, t } from \"alepha\";\nimport type { AdminUserController, UserEntity } from \"alepha/api/users\";\nimport { useClient } from \"alepha/react\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { useRouter } from \"alepha/react/router\";\nimport { useState } from \"react\";\nimport type { AdminRouter } from \"../../AdminRouter.tsx\";\n\nexport interface AdminUsersProps {\n userRealmName?: string;\n}\n\nconst filters = t.object({\n query: t.optional(t.text()),\n enabled: t.optional(t.boolean()),\n emailVerified: t.optional(t.boolean()),\n});\n\nconst AdminUsers = (props: AdminUsersProps) => {\n const client = useClient<AdminUserController>();\n const router = useRouter<AdminRouter>();\n const { l } = useI18n();\n const dialog = useDialog();\n const toast = useToast();\n const [refreshKey, setRefreshKey] = useState(0);\n\n const refresh = () => setRefreshKey((k) => k + 1);\n\n const handleToggleEnabled = async (user: UserEntity) => {\n const enabled = !user.enabled;\n const confirmed = await dialog.confirm({\n title: enabled ? \"Enable user\" : \"Disable user\",\n message: enabled\n ? `Enable ${user.email || user.username || \"this user\"}?`\n : `Disable ${user.email || user.username || \"this user\"}? They will no longer be able to sign in.`,\n });\n if (!confirmed) return;\n await client.updateUser({\n params: { id: user.id },\n query: { userRealmName: props.userRealmName },\n body: { enabled },\n });\n toast.success({\n message: enabled ? \"User enabled\" : \"User disabled\",\n });\n refresh();\n };\n\n const handleDelete = async (user: UserEntity) => {\n const confirmed = await dialog.confirm({\n title: \"Delete user\",\n message: `Permanently delete ${user.email || user.username || \"this user\"}? This action cannot be undone.`,\n });\n if (!confirmed) return;\n await client.deleteUser({\n params: { id: user.id },\n query: { userRealmName: props.userRealmName },\n });\n toast.success({ message: \"User deleted\" });\n refresh();\n };\n\n const handleBulkDisable = async (\n items: UserEntity[],\n clearSelection: () => void,\n ) => {\n const enabledUsers = items.filter((u) => u.enabled);\n if (enabledUsers.length === 0) {\n toast.danger({ message: \"No active users in selection\" });\n return;\n }\n const confirmed = await dialog.confirm({\n title: \"Disable users\",\n message: `Disable ${enabledUsers.length} user(s)? They will no longer be able to sign in.`,\n });\n if (!confirmed) return;\n for (const user of enabledUsers) {\n await client.updateUser({\n params: { id: user.id },\n query: { userRealmName: props.userRealmName },\n body: { enabled: false },\n });\n }\n toast.success({\n message: `${enabledUsers.length} user(s) disabled`,\n });\n clearSelection();\n refresh();\n };\n\n return (\n <Flex p={\"md\"} flex={1} direction=\"column\">\n <DataTable<UserEntity, typeof filters>\n withCheckbox\n withExport\n checkboxActions={[\n {\n intent: \"danger\",\n label: \"Disable selected\",\n icon: <IconUserOff />,\n onClick: (ctx) =>\n handleBulkDisable(ctx.selectedItems, ctx.clearSelection),\n },\n ]}\n key={refreshKey}\n submitOnInit\n defaultSize={10}\n defaultFilters={[\"query\"]}\n tableProps={{\n horizontalSpacing: \"xs\",\n verticalSpacing: \"xs\",\n }}\n onFilterChange={(_key, _value, form) => form.submit()}\n filters={filters}\n items={async (filters) => {\n const response = await client.findUsers({\n query: {\n ...filters,\n userRealmName: props.userRealmName,\n },\n });\n return response as Page<UserEntity>;\n }}\n columns={{\n user: {\n label: \"User\",\n value: (item) => {\n const name =\n `${item.firstName || \"\"} ${item.lastName || \"\"}`.trim() ||\n item.username ||\n \"Anonymous\";\n\n return (\n <ActionButton\n variant={\"transparent\"}\n href={`/admin/users/${item.id}`}\n >\n <Flex gap={\"xs\"} centerY>\n <Avatar size={\"sm\"} name={name} />\n <Flex col>\n <Text size={\"sm\"} bold>\n {name}\n </Text>\n <Text size=\"xs\" muted>\n {item.email || \"\\u2014\"}\n </Text>\n </Flex>\n </Flex>\n </ActionButton>\n );\n },\n },\n username: {\n label: \"Username\",\n defaultHidden: true,\n value: (item) => (\n <Text size=\"sm\" ff=\"monospace\">\n {item.username || \"\\u2014\"}\n </Text>\n ),\n },\n roles: {\n label: \"Roles\",\n value: (item) =>\n item.roles.length > 0 ? (\n <Flex gap={4}>\n {item.roles.map((role: string) => (\n <Badge key={role} size=\"xs\" variant=\"default\">\n {role}\n </Badge>\n ))}\n </Flex>\n ) : (\n <Text size=\"xs\" muted>\n No roles\n </Text>\n ),\n },\n enabled: {\n label: \"Status\",\n value: (item) => (\n <Badge\n size=\"sm\"\n variant=\"light\"\n color={item.enabled ? \"green\" : \"red\"}\n >\n {item.enabled ? \"Active\" : \"Disabled\"}\n </Badge>\n ),\n },\n emailVerified: {\n label: \"Email\",\n value: (item) => (\n <Badge\n size=\"sm\"\n variant=\"light\"\n color={item.emailVerified ? \"green\" : \"gray\"}\n >\n {item.emailVerified ? \"Verified\" : \"Unverified\"}\n </Badge>\n ),\n },\n createdAt: {\n label: \"Joined\",\n sortable: true,\n sortKey: \"createdAt\",\n value: (item) => (\n <Text size=\"xs\" muted>\n {l(item.createdAt, { date: \"fromNow\" })}\n </Text>\n ),\n },\n }}\n rowActions={(item) => [\n {\n label: \"View profile\",\n icon: IconEye,\n onClick: () =>\n router.push(\"adminUserProfile\", {\n params: { userId: item.id },\n }),\n },\n {\n label: item.enabled ? \"Disable user\" : \"Enable user\",\n icon: item.enabled ? IconUserOff : IconUserPlus,\n color: item.enabled ? \"red\" : \"green\",\n onClick: () => handleToggleEnabled(item),\n },\n {\n label: \"Delete user\",\n icon: IconTrash,\n color: \"red\",\n onClick: () => handleDelete(item),\n },\n ]}\n />\n </Flex>\n );\n};\n\nexport default AdminUsers;\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { y as AlephaMantineProvider } from "./core-
|
|
1
|
+
import { y as AlephaMantineProvider } from "./core-CYaRQ8O-.js";
|
|
2
2
|
import { Flex } from "@mantine/core";
|
|
3
3
|
import { jsx } from "react/jsx-runtime";
|
|
4
4
|
import { NestedView } from "alepha/react/router";
|
|
@@ -19,4 +19,4 @@ const AuthLayout = () => {
|
|
|
19
19
|
|
|
20
20
|
//#endregion
|
|
21
21
|
export { AuthLayout as default };
|
|
22
|
-
//# sourceMappingURL=AuthLayout-
|
|
22
|
+
//# sourceMappingURL=AuthLayout-_frhdgOO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthLayout-
|
|
1
|
+
{"version":3,"file":"AuthLayout-_frhdgOO.js","names":[],"sources":["../../src/auth/components/AuthLayout.tsx"],"sourcesContent":["import { AlephaMantineProvider } from \"@alepha/ui\";\nimport { Flex } from \"@mantine/core\";\nimport { NestedView } from \"alepha/react/router\";\n\nconst AuthLayout = () => {\n return (\n <AlephaMantineProvider omnibar={false}>\n <Flex flex={1} align={\"center\"} h={\"100vh\"} justify={\"center\"}>\n <NestedView />\n </Flex>\n </AlephaMantineProvider>\n );\n};\n\nexport default AuthLayout;\n"],"mappings":";;;;;;AAIA,MAAM,mBAAmB;AACvB,QACE,oBAAC;EAAsB,SAAS;YAC9B,oBAAC;GAAK,MAAM;GAAG,OAAO;GAAU,GAAG;GAAS,SAAS;aACnD,oBAAC,eAAa;IACT;GACe"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IconGoogle-
|
|
1
|
+
{"version":3,"file":"IconGoogle-Ch1m3Uzl.js","names":[],"sources":["../../src/auth/components/icons/IconGithub.tsx","../../src/auth/components/icons/IconGoogle.tsx"],"sourcesContent":["const IconGithub = () => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 1024 1024\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z\"\n transform=\"scale(64)\"\n fill={\"var(--alepha-text)\"}\n />\n </svg>\n );\n};\n\nexport default IconGithub;\n","const IconGoogle = () => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n >\n <path\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\n fill=\"#4285F4\"\n />\n <path\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n fill=\"#34A853\"\n />\n <path\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n fill=\"#FBBC05\"\n />\n <path\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n fill=\"#EA4335\"\n />\n <path d=\"M1 1h22v22H1z\" fill=\"none\" />\n </svg>\n );\n};\n\nexport default IconGoogle;\n"],"mappings":";;;AAAA,MAAM,mBAAmB;AACvB,QACE,oBAAC;EACC,OAAM;EACN,QAAO;EACP,SAAQ;EACR,MAAK;EACL,OAAM;YAEN,oBAAC;GACC,UAAS;GACT,UAAS;GACT,GAAE;GACF,WAAU;GACV,MAAM;IACN;GACE;;;;;AChBV,MAAM,mBAAmB;AACvB,QACE,qBAAC;EACC,OAAM;EACN,QAAO;EACP,SAAQ;EACR,OAAM;;GAEN,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IAAK,GAAE;IAAgB,MAAK;KAAS;;GAClC"}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { t as __exportAll } from "./rolldown-runtime-CjeV3_4I.js";
|
|
2
|
+
import { _ as ActionButton, a as Control, n as capitalize } from "./core-CYaRQ8O-.js";
|
|
3
|
+
import { n as IconGithub, t as IconGoogle } from "./IconGoogle-Ch1m3Uzl.js";
|
|
4
|
+
import { AlephaError, t } from "alepha";
|
|
5
|
+
import { FormValidationError, useForm } from "alepha/react/form";
|
|
6
|
+
import { useI18n } from "alepha/react/i18n";
|
|
7
|
+
import { Card, Flex, Image, Text, Title } from "@mantine/core";
|
|
8
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
import { useMemo } from "react";
|
|
10
|
+
import { IconLock, IconPhoto, IconUser } from "@tabler/icons-react";
|
|
11
|
+
import { useRouter } from "alepha/react/router";
|
|
12
|
+
import { useAuth } from "alepha/react/auth";
|
|
13
|
+
import { HttpError } from "alepha/server";
|
|
14
|
+
|
|
15
|
+
//#region ../../src/auth/components/Login.tsx
|
|
16
|
+
var Login_exports = /* @__PURE__ */ __exportAll({ default: () => Login });
|
|
17
|
+
const Login = (props) => {
|
|
18
|
+
const auth = useAuth();
|
|
19
|
+
const router = useRouter();
|
|
20
|
+
const { tr } = useI18n();
|
|
21
|
+
const redirect = router.query.r || "/";
|
|
22
|
+
const credentialsProvider = props.realmConfig.authenticationMethods.find((it) => it.type === "CREDENTIALS");
|
|
23
|
+
const settings = props.realmConfig.settings;
|
|
24
|
+
const loginMethods = useMemo(() => {
|
|
25
|
+
const methods = [];
|
|
26
|
+
if (settings.username !== "none") methods.push("username");
|
|
27
|
+
if (settings.email !== "none") methods.push("email");
|
|
28
|
+
if (settings.phoneNumber !== "none") methods.push("phone");
|
|
29
|
+
return methods;
|
|
30
|
+
}, [settings]);
|
|
31
|
+
const identifierTitle = useMemo(() => {
|
|
32
|
+
if (loginMethods.length === 0) return tr("loginUsername");
|
|
33
|
+
if (loginMethods.length === 1) {
|
|
34
|
+
if (loginMethods[0] === "username") return tr("loginUsername");
|
|
35
|
+
if (loginMethods[0] === "email") return tr("loginEmail");
|
|
36
|
+
if (loginMethods[0] === "phone") return tr("loginPhone");
|
|
37
|
+
}
|
|
38
|
+
const labels = loginMethods.map((m) => {
|
|
39
|
+
if (m === "username") return tr("loginUsername").toLowerCase();
|
|
40
|
+
if (m === "email") return tr("loginEmail").toLowerCase();
|
|
41
|
+
if (m === "phone") return tr("loginPhone").toLowerCase();
|
|
42
|
+
return m;
|
|
43
|
+
});
|
|
44
|
+
return capitalize(`${labels.slice(0, -1).join(", ")} or ${labels[labels.length - 1]}`);
|
|
45
|
+
}, [loginMethods, tr]);
|
|
46
|
+
const form = useForm({
|
|
47
|
+
schema: t.object({
|
|
48
|
+
identifier: t.string({ minLength: 1 }),
|
|
49
|
+
password: t.string({ minLength: settings.passwordPolicy?.minLength || 6 })
|
|
50
|
+
}),
|
|
51
|
+
handler: async (data) => {
|
|
52
|
+
if (!credentialsProvider) throw new AlephaError("Credentials provider not configured");
|
|
53
|
+
try {
|
|
54
|
+
await auth.login(credentialsProvider.name, {
|
|
55
|
+
username: data.identifier,
|
|
56
|
+
password: data.password,
|
|
57
|
+
realm: props.realmConfig.realmName
|
|
58
|
+
});
|
|
59
|
+
await router.push(router.query.r || "/");
|
|
60
|
+
} catch (error) {
|
|
61
|
+
if (error instanceof HttpError && error.error === "InvalidCredentialsError") throw new FormValidationError({
|
|
62
|
+
message: "Invalid identifier or password",
|
|
63
|
+
path: "/password"
|
|
64
|
+
});
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
const getAutoCompleteType = () => {
|
|
70
|
+
if (loginMethods.includes("email")) return "email";
|
|
71
|
+
if (loginMethods.includes("username")) return "username";
|
|
72
|
+
if (loginMethods.includes("phone")) return "tel";
|
|
73
|
+
return "username";
|
|
74
|
+
};
|
|
75
|
+
const externalLoginMethods = props.realmConfig.authenticationMethods.filter((method) => method.type !== "CREDENTIALS");
|
|
76
|
+
const showOrDivider = credentialsProvider && externalLoginMethods.length > 0;
|
|
77
|
+
const realmQuery = props.realmConfig.realmName ? `?realm=${encodeURIComponent(props.realmConfig.realmName)}` : "";
|
|
78
|
+
const formContent = /* @__PURE__ */ jsxs(Flex, {
|
|
79
|
+
direction: "column",
|
|
80
|
+
gap: "md",
|
|
81
|
+
children: [
|
|
82
|
+
(settings.logoUrl || settings.displayName || settings.description) && /* @__PURE__ */ jsxs(Flex, {
|
|
83
|
+
direction: "column",
|
|
84
|
+
gap: "xs",
|
|
85
|
+
align: "center",
|
|
86
|
+
mb: "xs",
|
|
87
|
+
children: [
|
|
88
|
+
settings.logoUrl && /* @__PURE__ */ jsx(Image, {
|
|
89
|
+
src: settings.logoUrl,
|
|
90
|
+
alt: settings.displayName || props.realmConfig.realmName,
|
|
91
|
+
h: 48,
|
|
92
|
+
w: "auto",
|
|
93
|
+
fit: "contain"
|
|
94
|
+
}),
|
|
95
|
+
settings.displayName && /* @__PURE__ */ jsx(Title, {
|
|
96
|
+
order: 4,
|
|
97
|
+
ta: "center",
|
|
98
|
+
children: settings.displayName
|
|
99
|
+
}),
|
|
100
|
+
settings.description && /* @__PURE__ */ jsx(Text, {
|
|
101
|
+
size: "sm",
|
|
102
|
+
c: "dimmed",
|
|
103
|
+
ta: "center",
|
|
104
|
+
children: settings.description
|
|
105
|
+
})
|
|
106
|
+
]
|
|
107
|
+
}),
|
|
108
|
+
credentialsProvider && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("form", {
|
|
109
|
+
...form.props,
|
|
110
|
+
children: /* @__PURE__ */ jsxs(Flex, {
|
|
111
|
+
direction: "column",
|
|
112
|
+
flex: 1,
|
|
113
|
+
gap: "md",
|
|
114
|
+
children: [
|
|
115
|
+
/* @__PURE__ */ jsx(Control, {
|
|
116
|
+
label: identifierTitle,
|
|
117
|
+
input: form.input.identifier,
|
|
118
|
+
icon: IconUser,
|
|
119
|
+
text: { autoComplete: getAutoCompleteType() }
|
|
120
|
+
}),
|
|
121
|
+
/* @__PURE__ */ jsx(Control, {
|
|
122
|
+
label: tr("loginPassword"),
|
|
123
|
+
input: form.input.password,
|
|
124
|
+
icon: IconLock,
|
|
125
|
+
password: { autoComplete: "current-password" }
|
|
126
|
+
}),
|
|
127
|
+
/* @__PURE__ */ jsx(ActionButton, {
|
|
128
|
+
variant: "filled",
|
|
129
|
+
form,
|
|
130
|
+
children: tr("loginSignIn")
|
|
131
|
+
})
|
|
132
|
+
]
|
|
133
|
+
})
|
|
134
|
+
}), settings.resetPasswordAllowed && /* @__PURE__ */ jsx(Text, {
|
|
135
|
+
size: "sm",
|
|
136
|
+
ta: "center",
|
|
137
|
+
children: /* @__PURE__ */ jsx(ActionButton, {
|
|
138
|
+
href: `${props.resetPasswordPath ?? "/auth/reset-password"}${realmQuery}`,
|
|
139
|
+
anchorProps: { inherit: true },
|
|
140
|
+
children: tr("loginForgotPassword")
|
|
141
|
+
})
|
|
142
|
+
})] }),
|
|
143
|
+
showOrDivider && /* @__PURE__ */ jsxs(Flex, {
|
|
144
|
+
align: "center",
|
|
145
|
+
justify: "center",
|
|
146
|
+
gap: "md",
|
|
147
|
+
children: [
|
|
148
|
+
/* @__PURE__ */ jsx(Flex, {
|
|
149
|
+
flex: 1,
|
|
150
|
+
h: "1px",
|
|
151
|
+
bg: "var(--alepha-border)"
|
|
152
|
+
}),
|
|
153
|
+
/* @__PURE__ */ jsx(Text, {
|
|
154
|
+
size: "xs",
|
|
155
|
+
c: "dimmed",
|
|
156
|
+
children: tr("loginOr")
|
|
157
|
+
}),
|
|
158
|
+
/* @__PURE__ */ jsx(Flex, {
|
|
159
|
+
flex: 1,
|
|
160
|
+
h: "1px",
|
|
161
|
+
bg: "var(--alepha-border)"
|
|
162
|
+
})
|
|
163
|
+
]
|
|
164
|
+
}),
|
|
165
|
+
externalLoginMethods.length > 0 && /* @__PURE__ */ jsx(Flex, {
|
|
166
|
+
direction: "column",
|
|
167
|
+
gap: "sm",
|
|
168
|
+
children: externalLoginMethods.map((method) => /* @__PURE__ */ jsx(ActionButton, {
|
|
169
|
+
variant: "default",
|
|
170
|
+
leftSection: leftSection(method.name.toLowerCase()),
|
|
171
|
+
onClick: () => auth.login(method.name, {
|
|
172
|
+
redirect,
|
|
173
|
+
realm: props.realmConfig.realmName
|
|
174
|
+
}),
|
|
175
|
+
children: tr("loginContinueWith", { args: [capitalize(method.name)] })
|
|
176
|
+
}, method.type))
|
|
177
|
+
}),
|
|
178
|
+
settings.registrationAllowed && /* @__PURE__ */ jsxs(Text, {
|
|
179
|
+
size: "sm",
|
|
180
|
+
ta: "center",
|
|
181
|
+
children: [
|
|
182
|
+
tr("loginNoAccount"),
|
|
183
|
+
" ",
|
|
184
|
+
/* @__PURE__ */ jsx(ActionButton, {
|
|
185
|
+
href: `${props.registerPath ?? "/auth/register"}${realmQuery}`,
|
|
186
|
+
anchorProps: { inherit: true },
|
|
187
|
+
children: tr("loginSignUp")
|
|
188
|
+
})
|
|
189
|
+
]
|
|
190
|
+
})
|
|
191
|
+
]
|
|
192
|
+
});
|
|
193
|
+
if (props.variant === "split") return /* @__PURE__ */ jsx(Flex, {
|
|
194
|
+
flex: 1,
|
|
195
|
+
justify: "center",
|
|
196
|
+
align: "center",
|
|
197
|
+
children: /* @__PURE__ */ jsx(Card, {
|
|
198
|
+
withBorder: true,
|
|
199
|
+
p: 0,
|
|
200
|
+
w: 720,
|
|
201
|
+
bg: "var(--alepha-elevated)",
|
|
202
|
+
style: { overflow: "hidden" },
|
|
203
|
+
children: /* @__PURE__ */ jsxs(Flex, {
|
|
204
|
+
mih: 480,
|
|
205
|
+
children: [props.image ? /* @__PURE__ */ jsx(Flex, {
|
|
206
|
+
flex: 1,
|
|
207
|
+
style: {
|
|
208
|
+
backgroundImage: `url(${props.image})`,
|
|
209
|
+
backgroundSize: "cover",
|
|
210
|
+
backgroundPosition: "center"
|
|
211
|
+
}
|
|
212
|
+
}) : /* @__PURE__ */ jsx(Flex, {
|
|
213
|
+
flex: 1,
|
|
214
|
+
justify: "center",
|
|
215
|
+
align: "center",
|
|
216
|
+
bg: "var(--mantine-color-gray-light)",
|
|
217
|
+
style: { borderRight: "1px solid var(--mantine-color-default-border)" },
|
|
218
|
+
children: /* @__PURE__ */ jsx(Flex, {
|
|
219
|
+
justify: "center",
|
|
220
|
+
align: "center",
|
|
221
|
+
w: 120,
|
|
222
|
+
h: 80,
|
|
223
|
+
style: {
|
|
224
|
+
border: "2px dashed var(--mantine-color-default-border)",
|
|
225
|
+
borderRadius: "var(--mantine-radius-sm)"
|
|
226
|
+
},
|
|
227
|
+
children: /* @__PURE__ */ jsx(IconPhoto, {
|
|
228
|
+
size: 32,
|
|
229
|
+
style: { opacity: .3 }
|
|
230
|
+
})
|
|
231
|
+
})
|
|
232
|
+
}), /* @__PURE__ */ jsxs(Flex, {
|
|
233
|
+
flex: 1,
|
|
234
|
+
direction: "column",
|
|
235
|
+
gap: "md",
|
|
236
|
+
p: "xl",
|
|
237
|
+
justify: "center",
|
|
238
|
+
children: [formContent, /* @__PURE__ */ jsx(ActionButton, {
|
|
239
|
+
variant: "subtle",
|
|
240
|
+
href: "/",
|
|
241
|
+
children: tr("loginCancel")
|
|
242
|
+
})]
|
|
243
|
+
})]
|
|
244
|
+
})
|
|
245
|
+
})
|
|
246
|
+
});
|
|
247
|
+
return /* @__PURE__ */ jsx(Flex, {
|
|
248
|
+
flex: 1,
|
|
249
|
+
justify: "center",
|
|
250
|
+
align: "center",
|
|
251
|
+
children: /* @__PURE__ */ jsxs(Flex, {
|
|
252
|
+
direction: "column",
|
|
253
|
+
gap: "sm",
|
|
254
|
+
w: 360,
|
|
255
|
+
children: [/* @__PURE__ */ jsx(Card, {
|
|
256
|
+
withBorder: true,
|
|
257
|
+
p: "lg",
|
|
258
|
+
bg: "var(--alepha-elevated)",
|
|
259
|
+
children: formContent
|
|
260
|
+
}), /* @__PURE__ */ jsx(ActionButton, {
|
|
261
|
+
variant: "subtle",
|
|
262
|
+
href: "/",
|
|
263
|
+
children: tr("loginCancel")
|
|
264
|
+
})]
|
|
265
|
+
})
|
|
266
|
+
});
|
|
267
|
+
};
|
|
268
|
+
const leftSection = (name) => {
|
|
269
|
+
if (name === "google") return /* @__PURE__ */ jsx(IconGoogle, {});
|
|
270
|
+
if (name === "github") return /* @__PURE__ */ jsx(IconGithub, {});
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
//#endregion
|
|
274
|
+
export { Login_exports as t };
|
|
275
|
+
//# sourceMappingURL=Login-xtNmQtGh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Login-xtNmQtGh.js","names":[],"sources":["../../src/auth/components/Login.tsx"],"sourcesContent":["import { ActionButton, Control, capitalize } from \"@alepha/ui\";\nimport { Card, Flex, Image, Text, Title } from \"@mantine/core\";\nimport { IconLock, IconPhoto, IconUser } from \"@tabler/icons-react\";\nimport { AlephaError, t } from \"alepha\";\nimport type { RealmConfig } from \"alepha/api/users\";\nimport { useAuth } from \"alepha/react/auth\";\nimport { FormValidationError, useForm } from \"alepha/react/form\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { useRouter } from \"alepha/react/router\";\nimport { HttpError } from \"alepha/server\";\nimport { useMemo } from \"react\";\nimport type { AuthI18n } from \"../AuthI18n.ts\";\nimport IconGithub from \"./icons/IconGithub.tsx\";\nimport IconGoogle from \"./icons/IconGoogle.tsx\";\n\nexport interface LoginProps {\n realmConfig: RealmConfig;\n registerPath?: string;\n resetPasswordPath?: string;\n variant?: \"card\" | \"split\";\n image?: string;\n}\n\nconst Login = (props: LoginProps) => {\n const auth = useAuth();\n const router = useRouter();\n const { tr } = useI18n<AuthI18n, \"en\">();\n const redirect = router.query.r || \"/\";\n\n const credentialsProvider = props.realmConfig.authenticationMethods.find(\n (it) => it.type === \"CREDENTIALS\",\n );\n\n const settings = props.realmConfig.settings;\n\n // Determine what login methods are available\n const loginMethods = useMemo(() => {\n const methods = [];\n if (settings.username !== \"none\") methods.push(\"username\");\n if (settings.email !== \"none\") methods.push(\"email\");\n if (settings.phoneNumber !== \"none\") methods.push(\"phone\");\n return methods;\n }, [settings]);\n\n // Create identifier title based on enabled methods\n const identifierTitle = useMemo(() => {\n if (loginMethods.length === 0) return tr(\"loginUsername\");\n if (loginMethods.length === 1) {\n if (loginMethods[0] === \"username\") return tr(\"loginUsername\");\n if (loginMethods[0] === \"email\") return tr(\"loginEmail\");\n if (loginMethods[0] === \"phone\") return tr(\"loginPhone\");\n }\n const labels = loginMethods.map((m) => {\n if (m === \"username\") return tr(\"loginUsername\").toLowerCase();\n if (m === \"email\") return tr(\"loginEmail\").toLowerCase();\n if (m === \"phone\") return tr(\"loginPhone\").toLowerCase();\n return m;\n });\n return capitalize(\n `${labels.slice(0, -1).join(\", \")} or ${labels[labels.length - 1]}`,\n );\n }, [loginMethods, tr]);\n\n const form = useForm({\n schema: t.object({\n identifier: t.string({\n minLength: 1,\n }),\n password: t.string({\n minLength: settings.passwordPolicy?.minLength || 6,\n }),\n }),\n handler: async (data) => {\n if (!credentialsProvider) {\n throw new AlephaError(\"Credentials provider not configured\");\n }\n\n try {\n await auth.login(credentialsProvider.name, {\n username: data.identifier,\n password: data.password,\n realm: props.realmConfig.realmName,\n });\n await router.push(router.query.r || \"/\");\n } catch (error) {\n if (\n error instanceof HttpError &&\n error.error === \"InvalidCredentialsError\"\n ) {\n throw new FormValidationError({\n message: \"Invalid identifier or password\",\n path: \"/password\",\n });\n }\n throw error;\n }\n },\n });\n\n const getAutoCompleteType = () => {\n if (loginMethods.includes(\"email\")) {\n return \"email\";\n }\n if (loginMethods.includes(\"username\")) {\n return \"username\";\n }\n if (loginMethods.includes(\"phone\")) {\n return \"tel\";\n }\n return \"username\";\n };\n\n const externalLoginMethods = props.realmConfig.authenticationMethods.filter(\n (method) => method.type !== \"CREDENTIALS\",\n );\n\n const showOrDivider = credentialsProvider && externalLoginMethods.length > 0;\n\n const realmQuery = props.realmConfig.realmName\n ? `?realm=${encodeURIComponent(props.realmConfig.realmName)}`\n : \"\";\n\n const formContent = (\n <Flex direction=\"column\" gap={\"md\"}>\n {/* Realm branding */}\n {(settings.logoUrl || settings.displayName || settings.description) && (\n <Flex direction=\"column\" gap={\"xs\"} align=\"center\" mb=\"xs\">\n {settings.logoUrl && (\n <Image\n src={settings.logoUrl}\n alt={settings.displayName || props.realmConfig.realmName}\n h={48}\n w=\"auto\"\n fit=\"contain\"\n />\n )}\n {settings.displayName && (\n <Title order={4} ta=\"center\">\n {settings.displayName}\n </Title>\n )}\n {settings.description && (\n <Text size=\"sm\" c=\"dimmed\" ta=\"center\">\n {settings.description}\n </Text>\n )}\n </Flex>\n )}\n\n {/* Credentials login form */}\n {credentialsProvider && (\n <>\n <form {...form.props}>\n <Flex direction=\"column\" flex={1} gap={\"md\"}>\n <Control\n label={identifierTitle}\n input={form.input.identifier}\n icon={IconUser}\n text={{\n autoComplete: getAutoCompleteType(),\n }}\n />\n <Control\n label={tr(\"loginPassword\")}\n input={form.input.password}\n icon={IconLock}\n password={{\n autoComplete: \"current-password\",\n }}\n />\n <ActionButton variant={\"filled\"} form={form}>\n {tr(\"loginSignIn\")}\n </ActionButton>\n </Flex>\n </form>\n {settings.resetPasswordAllowed && (\n <Text size=\"sm\" ta=\"center\">\n <ActionButton\n href={`${props.resetPasswordPath ?? \"/auth/reset-password\"}${realmQuery}`}\n anchorProps={{ inherit: true }}\n >\n {tr(\"loginForgotPassword\")}\n </ActionButton>\n </Text>\n )}\n </>\n )}\n\n {/* OR divider - only when both credentials AND external methods exist */}\n {showOrDivider && (\n <Flex align=\"center\" justify=\"center\" gap={\"md\"}>\n <Flex flex={1} h={\"1px\"} bg={\"var(--alepha-border)\"} />\n <Text size=\"xs\" c={\"dimmed\"}>\n {tr(\"loginOr\")}\n </Text>\n <Flex flex={1} h={\"1px\"} bg={\"var(--alepha-border)\"} />\n </Flex>\n )}\n\n {/* External login methods */}\n {externalLoginMethods.length > 0 && (\n <Flex direction=\"column\" gap={\"sm\"}>\n {externalLoginMethods.map((method) => (\n <ActionButton\n variant={\"default\"}\n key={method.type}\n leftSection={leftSection(method.name.toLowerCase())}\n onClick={() =>\n auth.login(method.name, {\n redirect,\n realm: props.realmConfig.realmName,\n })\n }\n >\n {tr(\"loginContinueWith\", {\n args: [capitalize(method.name)],\n })}\n </ActionButton>\n ))}\n </Flex>\n )}\n\n {/* Registration link */}\n {settings.registrationAllowed && (\n <Text size=\"sm\" ta=\"center\">\n {tr(\"loginNoAccount\")}{\" \"}\n <ActionButton\n href={`${props.registerPath ?? \"/auth/register\"}${realmQuery}`}\n anchorProps={{ inherit: true }}\n >\n {tr(\"loginSignUp\")}\n </ActionButton>\n </Text>\n )}\n </Flex>\n );\n\n if (props.variant === \"split\") {\n return (\n <Flex flex={1} justify={\"center\"} align={\"center\"}>\n <Card\n withBorder\n p={0}\n w={720}\n bg={\"var(--alepha-elevated)\"}\n style={{ overflow: \"hidden\" }}\n >\n <Flex mih={480}>\n {props.image ? (\n <Flex\n flex={1}\n style={{\n backgroundImage: `url(${props.image})`,\n backgroundSize: \"cover\",\n backgroundPosition: \"center\",\n }}\n />\n ) : (\n <Flex\n flex={1}\n justify=\"center\"\n align=\"center\"\n bg=\"var(--mantine-color-gray-light)\"\n style={{\n borderRight: \"1px solid var(--mantine-color-default-border)\",\n }}\n >\n <Flex\n justify=\"center\"\n align=\"center\"\n w={120}\n h={80}\n style={{\n border: \"2px dashed var(--mantine-color-default-border)\",\n borderRadius: \"var(--mantine-radius-sm)\",\n }}\n >\n <IconPhoto size={32} style={{ opacity: 0.3 }} />\n </Flex>\n </Flex>\n )}\n <Flex\n flex={1}\n direction=\"column\"\n gap={\"md\"}\n p={\"xl\"}\n justify={\"center\"}\n >\n {formContent}\n <ActionButton variant={\"subtle\"} href={\"/\"}>\n {tr(\"loginCancel\")}\n </ActionButton>\n </Flex>\n </Flex>\n </Card>\n </Flex>\n );\n }\n\n return (\n <Flex flex={1} justify={\"center\"} align={\"center\"}>\n <Flex direction=\"column\" gap={\"sm\"} w={360}>\n <Card withBorder p={\"lg\"} bg={\"var(--alepha-elevated)\"}>\n {formContent}\n </Card>\n <ActionButton variant={\"subtle\"} href={\"/\"}>\n {tr(\"loginCancel\")}\n </ActionButton>\n </Flex>\n </Flex>\n );\n};\n\nexport default Login;\n\nconst leftSection = (name: string) => {\n if (name === \"google\") {\n return <IconGoogle />;\n }\n\n if (name === \"github\") {\n return <IconGithub />;\n }\n};\n"],"mappings":"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"}
|
|
@@ -1,10 +1,39 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { _ as ActionButton } from "./core-CYaRQ8O-.js";
|
|
2
2
|
import { Avatar, Badge, Card, Flex, Text, Title } from "@mantine/core";
|
|
3
3
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
4
|
import { IconAt, IconCalendar, IconId, IconShield, IconUser } from "@tabler/icons-react";
|
|
5
5
|
import { useRouter } from "alepha/react/router";
|
|
6
6
|
import { useAuth } from "alepha/react/auth";
|
|
7
7
|
|
|
8
|
+
//#region ../../src/auth/components/ProfileField.tsx
|
|
9
|
+
const ProfileField = (props) => {
|
|
10
|
+
const { icon, label, children } = props;
|
|
11
|
+
return /* @__PURE__ */ jsxs(Flex, {
|
|
12
|
+
gap: "sm",
|
|
13
|
+
align: "flex-start",
|
|
14
|
+
children: [/* @__PURE__ */ jsx(Flex, {
|
|
15
|
+
c: "dimmed",
|
|
16
|
+
mt: 2,
|
|
17
|
+
children: icon
|
|
18
|
+
}), /* @__PURE__ */ jsxs(Flex, {
|
|
19
|
+
direction: "column",
|
|
20
|
+
gap: 2,
|
|
21
|
+
flex: 1,
|
|
22
|
+
children: [/* @__PURE__ */ jsx(Text, {
|
|
23
|
+
size: "xs",
|
|
24
|
+
c: "dimmed",
|
|
25
|
+
tt: "uppercase",
|
|
26
|
+
fw: 500,
|
|
27
|
+
children: label
|
|
28
|
+
}), /* @__PURE__ */ jsx(Text, {
|
|
29
|
+
size: "sm",
|
|
30
|
+
children
|
|
31
|
+
})]
|
|
32
|
+
})]
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
//#endregion
|
|
8
37
|
//#region ../../src/auth/components/Profile.tsx
|
|
9
38
|
const Profile = () => {
|
|
10
39
|
const auth = useAuth();
|
|
@@ -124,32 +153,7 @@ const Profile = () => {
|
|
|
124
153
|
})
|
|
125
154
|
});
|
|
126
155
|
};
|
|
127
|
-
const ProfileField = ({ icon, label, children }) => {
|
|
128
|
-
return /* @__PURE__ */ jsxs(Flex, {
|
|
129
|
-
gap: "sm",
|
|
130
|
-
align: "flex-start",
|
|
131
|
-
children: [/* @__PURE__ */ jsx(Flex, {
|
|
132
|
-
c: "dimmed",
|
|
133
|
-
mt: 2,
|
|
134
|
-
children: icon
|
|
135
|
-
}), /* @__PURE__ */ jsxs(Flex, {
|
|
136
|
-
direction: "column",
|
|
137
|
-
gap: 2,
|
|
138
|
-
flex: 1,
|
|
139
|
-
children: [/* @__PURE__ */ jsx(Text, {
|
|
140
|
-
size: "xs",
|
|
141
|
-
c: "dimmed",
|
|
142
|
-
tt: "uppercase",
|
|
143
|
-
fw: 500,
|
|
144
|
-
children: label
|
|
145
|
-
}), /* @__PURE__ */ jsx(Text, {
|
|
146
|
-
size: "sm",
|
|
147
|
-
children
|
|
148
|
-
})]
|
|
149
|
-
})]
|
|
150
|
-
});
|
|
151
|
-
};
|
|
152
156
|
|
|
153
157
|
//#endregion
|
|
154
158
|
export { Profile as default };
|
|
155
|
-
//# sourceMappingURL=Profile-
|
|
159
|
+
//# sourceMappingURL=Profile-_AtPUwAP.js.map
|