@alepha/ui 0.18.2 → 0.19.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/admin/{AdminApiKeys-BJhIwfD6.js → AdminApiKeys-Bt1PjO6o.js} +3 -4
- package/dist/admin/{AdminApiKeys-BJhIwfD6.js.map → AdminApiKeys-Bt1PjO6o.js.map} +1 -1
- package/dist/admin/{AdminAudits-DzD_4cDt.js → AdminAudits-C7c1CN4c.js} +3 -4
- package/dist/admin/{AdminAudits-DzD_4cDt.js.map → AdminAudits-C7c1CN4c.js.map} +1 -1
- package/dist/admin/{AdminDashboard-C92tIc6x.js → AdminDashboard-C3RXpTp6.js} +3 -4
- package/dist/admin/{AdminDashboard-C92tIc6x.js.map → AdminDashboard-C3RXpTp6.js.map} +1 -1
- package/dist/admin/{AdminFiles-DLpfhBkf.js → AdminFiles-31ivR6Wq.js} +3 -4
- package/dist/admin/{AdminFiles-DLpfhBkf.js.map → AdminFiles-31ivR6Wq.js.map} +1 -1
- package/dist/admin/{AdminJobDashboard-KIOkeMgE.js → AdminJobDashboard-BABLe7hL.js} +73 -25
- package/dist/admin/AdminJobDashboard-BABLe7hL.js.map +1 -0
- package/dist/admin/{AdminJobExecutions-D0Yo_PU0.js → AdminJobExecutions-D-G8RIlr.js} +3 -4
- package/dist/admin/{AdminJobExecutions-D0Yo_PU0.js.map → AdminJobExecutions-D-G8RIlr.js.map} +1 -1
- package/dist/admin/{AdminJobRegistry-PFajqaGK.js → AdminJobRegistry-oIS3K9NX.js} +3 -4
- package/dist/admin/{AdminJobRegistry-PFajqaGK.js.map → AdminJobRegistry-oIS3K9NX.js.map} +1 -1
- package/dist/admin/{AdminLayout-B1DXZHDn.js → AdminLayout-BmZ9mtXh.js} +8 -25
- package/dist/admin/AdminLayout-BmZ9mtXh.js.map +1 -0
- package/dist/admin/AdminNotifications-DHdzksww.js +541 -0
- package/dist/admin/AdminNotifications-DHdzksww.js.map +1 -0
- package/dist/admin/{AdminParameters-BspPeqp_.js → AdminParameters-CyZQSXnN.js} +118 -112
- package/dist/admin/AdminParameters-CyZQSXnN.js.map +1 -0
- package/dist/admin/{AdminSessions-BnH5CZQl.js → AdminSessions--xwELDSO.js} +3 -4
- package/dist/admin/{AdminSessions-BnH5CZQl.js.map → AdminSessions--xwELDSO.js.map} +1 -1
- package/dist/admin/{AdminUserLayout-DUbC6-BI.js → AdminUserLayout-DvBTG5gd.js} +82 -115
- package/dist/admin/AdminUserLayout-DvBTG5gd.js.map +1 -0
- package/dist/admin/{AdminUserProfile-DuTUnjdG.js → AdminUserProfile-CzsPBl6Z.js} +7 -6
- package/dist/admin/AdminUserProfile-CzsPBl6Z.js.map +1 -0
- package/dist/admin/{AdminUserSessions-DvZdAGpL.js → AdminUserSessions-C-aUnhVN.js} +3 -4
- package/dist/admin/{AdminUserSessions-DvZdAGpL.js.map → AdminUserSessions-C-aUnhVN.js.map} +1 -1
- package/dist/admin/{AdminUsers-CR9z0g_5.js → AdminUsers-BYwei5sj.js} +4 -4
- package/dist/admin/AdminUsers-BYwei5sj.js.map +1 -0
- package/dist/admin/{AuthLayout-DsUfp9RG.js → AuthLayout-CkPGLJku.js} +3 -4
- package/dist/admin/{AuthLayout-DsUfp9RG.js.map → AuthLayout-CkPGLJku.js.map} +1 -1
- package/dist/{demo/IconGoogle-CSQLPYwX.js → admin/IconGoogle-8Nkx6yax.js} +2 -4
- package/dist/admin/{IconGoogle-Ch1m3Uzl.js.map → IconGoogle-8Nkx6yax.js.map} +1 -1
- package/dist/admin/Login-DSBqNsZc.js +274 -0
- package/dist/admin/Login-DSBqNsZc.js.map +1 -0
- package/dist/admin/{Profile-B2EcIDB9.js → Profile-CDRjJo0P.js} +31 -29
- package/dist/admin/Profile-CDRjJo0P.js.map +1 -0
- package/dist/admin/{Register-Z3fxRbUF.js → Register-4QGFOnfh.js} +201 -146
- package/dist/admin/Register-4QGFOnfh.js.map +1 -0
- package/dist/admin/{ResetPassword-_Y1qTTKh.js → ResetPassword-Gxc9L_mY.js} +9 -10
- package/dist/admin/ResetPassword-Gxc9L_mY.js.map +1 -0
- package/dist/admin/{VerifyEmail-Bg22bwcC.js → VerifyEmail-D7G5NnaN.js} +25 -11
- package/dist/admin/VerifyEmail-D7G5NnaN.js.map +1 -0
- package/dist/admin/adminUserAtom-DCi4wf-v.js +11 -0
- package/dist/admin/adminUserAtom-DCi4wf-v.js.map +1 -0
- package/dist/admin/{core-BVO_TQxb.js → core-D1AbU50V.js} +662 -570
- package/dist/admin/core-D1AbU50V.js.map +1 -0
- package/dist/admin/index.d.ts +141 -53
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +67 -49
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/rolldown-runtime-CiIaOW0V.js +13 -0
- package/dist/{demo/AuthLayout-DN-ClJQk.js → auth/AuthLayout-CfRKcTqP.js} +3 -4
- package/dist/auth/{AuthLayout-C161NeF6.js.map → AuthLayout-CfRKcTqP.js.map} +1 -1
- package/dist/{admin/IconGoogle-Ch1m3Uzl.js → auth/IconGoogle-8Nkx6yax.js} +2 -4
- package/dist/auth/{IconGoogle-Ch1m3Uzl.js.map → IconGoogle-8Nkx6yax.js.map} +1 -1
- package/dist/auth/Login-DJyweoPS.js +274 -0
- package/dist/auth/Login-DJyweoPS.js.map +1 -0
- package/dist/auth/{Profile-BMpXJ0oi.js → Profile-Cy93pNTw.js} +31 -29
- package/dist/auth/Profile-Cy93pNTw.js.map +1 -0
- package/dist/auth/{Register-2gx8qll-.js → Register-CSqzzitW.js} +201 -146
- package/dist/auth/Register-CSqzzitW.js.map +1 -0
- package/dist/{demo/ResetPassword-CAPj8MO3.js → auth/ResetPassword-B61QPlQi.js} +9 -10
- package/dist/auth/ResetPassword-B61QPlQi.js.map +1 -0
- package/dist/{demo/VerifyEmail-DFmdCdYs.js → auth/VerifyEmail-CqBJ11id.js} +25 -11
- package/dist/auth/VerifyEmail-CqBJ11id.js.map +1 -0
- package/dist/auth/{core-DyfeVr5c.js → core-C6D3pazL.js} +403 -343
- package/dist/auth/core-C6D3pazL.js.map +1 -0
- package/dist/auth/index.d.ts +93 -54
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +30 -31
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/rolldown-runtime-CiIaOW0V.js +13 -0
- package/dist/core/index.d.ts +123 -62
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +878 -776
- package/dist/core/index.js.map +1 -1
- package/dist/{auth/AuthLayout-C161NeF6.js → demo/AuthLayout-Dq5tSLSc.js} +3 -4
- package/dist/demo/{AuthLayout-DN-ClJQk.js.map → AuthLayout-Dq5tSLSc.js.map} +1 -1
- package/dist/demo/DemoButton-_Ws2w-J0.js +181 -0
- package/dist/demo/DemoButton-_Ws2w-J0.js.map +1 -0
- package/dist/demo/DemoControlSelect-ChP4ZOpQ.js +304 -0
- package/dist/demo/DemoControlSelect-ChP4ZOpQ.js.map +1 -0
- package/dist/demo/DemoDataTable-Hwf_UUni.js +361 -0
- package/dist/demo/DemoDataTable-Hwf_UUni.js.map +1 -0
- package/dist/demo/{DemoDialog-DW8QEvD1.js → DemoDialog-B01OMVRd.js} +3 -4
- package/dist/demo/{DemoDialog-DW8QEvD1.js.map → DemoDialog-B01OMVRd.js.map} +1 -1
- package/dist/demo/{DemoFlex-CAhLUanT.js → DemoFlex-870PEl0V.js} +4 -5
- package/dist/demo/{DemoFlex-CAhLUanT.js.map → DemoFlex-870PEl0V.js.map} +1 -1
- package/dist/demo/{DemoHeading-yIFmNjHB.js → DemoHeading-C1YR27fz.js} +4 -5
- package/dist/demo/{DemoHeading-yIFmNjHB.js.map → DemoHeading-C1YR27fz.js.map} +1 -1
- package/dist/demo/{DemoHome-BSGuBHus.js → DemoHome-DRbL2eGf.js} +4 -5
- package/dist/demo/{DemoHome-BSGuBHus.js.map → DemoHome-DRbL2eGf.js.map} +1 -1
- package/dist/demo/{DemoJsonViewer-DsA2IpgV.js → DemoJsonViewer-DoABiqBW.js} +4 -5
- package/dist/demo/{DemoJsonViewer-DsA2IpgV.js.map → DemoJsonViewer-DoABiqBW.js.map} +1 -1
- package/dist/demo/{DemoLayout-Cy6xjn6P.js → DemoLayout-CN_PDCX2.js} +16 -8
- package/dist/demo/DemoLayout-CN_PDCX2.js.map +1 -0
- package/dist/demo/{DemoLogin-vqxgTu4P.js → DemoLogin-B5x-ug3Q.js} +51 -35
- package/dist/demo/DemoLogin-B5x-ug3Q.js.map +1 -0
- package/dist/demo/{DemoRegister-YHPvPg77.js → DemoRegister-Q6sg2xuV.js} +51 -53
- package/dist/demo/DemoRegister-Q6sg2xuV.js.map +1 -0
- package/dist/demo/{DemoResetPassword-mOW18Zlm.js → DemoResetPassword-DrqZfmEw.js} +14 -19
- package/dist/demo/DemoResetPassword-DrqZfmEw.js.map +1 -0
- package/dist/demo/{DemoSidebar-od7aLjP_.js → DemoSidebar-CfKS6w1o.js} +4 -5
- package/dist/demo/{DemoSidebar-od7aLjP_.js.map → DemoSidebar-CfKS6w1o.js.map} +1 -1
- package/dist/demo/{DemoText-DU3JeRS0.js → DemoText-pT6Gi5b5.js} +4 -5
- package/dist/demo/{DemoText-DU3JeRS0.js.map → DemoText-pT6Gi5b5.js.map} +1 -1
- package/dist/demo/{DemoToast-CUJEiPRa.js → DemoToast-I13NBzQQ.js} +3 -4
- package/dist/demo/{DemoToast-CUJEiPRa.js.map → DemoToast-I13NBzQQ.js.map} +1 -1
- package/dist/demo/{DemoTypeForm-C1dNkahD.js → DemoTypeForm-BqzcrtvN.js} +9 -6
- package/dist/demo/DemoTypeForm-BqzcrtvN.js.map +1 -0
- package/dist/demo/DemoVerifyEmail-HwD8xfQw.js +33 -0
- package/dist/demo/DemoVerifyEmail-HwD8xfQw.js.map +1 -0
- package/dist/{auth/IconGoogle-Ch1m3Uzl.js → demo/IconGoogle-CwQy4G9y.js} +2 -4
- package/dist/demo/{IconGoogle-CSQLPYwX.js.map → IconGoogle-CwQy4G9y.js.map} +1 -1
- package/dist/demo/Login-CqG1iJbn.js +274 -0
- package/dist/demo/Login-CqG1iJbn.js.map +1 -0
- package/dist/demo/{Profile-BE_Y3co2.js → Profile-C0ojJCaG.js} +31 -29
- package/dist/demo/Profile-C0ojJCaG.js.map +1 -0
- package/dist/demo/{Register-fXHmBpr3.js → Register-KKZwr_lL.js} +201 -146
- package/dist/demo/Register-KKZwr_lL.js.map +1 -0
- package/dist/{auth/ResetPassword-DBxt9hKk.js → demo/ResetPassword-DMrLFEtr.js} +9 -10
- package/dist/demo/ResetPassword-DMrLFEtr.js.map +1 -0
- package/dist/demo/{Showcase-BtEU0pY9.js → Showcase-D49Wud2v.js} +65 -68
- package/dist/demo/Showcase-D49Wud2v.js.map +1 -0
- package/dist/{auth/VerifyEmail-Z80Ubajk.js → demo/VerifyEmail-BFCAFz6T.js} +25 -11
- package/dist/demo/VerifyEmail-BFCAFz6T.js.map +1 -0
- package/dist/demo/{auth-Djd7SKiw.js → auth-D9qTZzCa.js} +18 -35
- package/dist/demo/{auth-Djd7SKiw.js.map → auth-D9qTZzCa.js.map} +1 -1
- package/dist/demo/{core-B7LNjM78.js → core-DRtQklr3.js} +752 -647
- package/dist/demo/core-DRtQklr3.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 +25 -22
- package/dist/demo/index.js.map +1 -1
- package/dist/demo/rolldown-runtime-CiIaOW0V.js +13 -0
- package/package.json +19 -19
- package/src/admin/AdminRouter.tsx +42 -2
- package/src/admin/atoms/adminUserAtom.ts +7 -0
- package/src/admin/components/AdminLayout.tsx +2 -14
- package/src/admin/components/jobs/AdminJobDashboard.tsx +51 -20
- 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/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/AdminUserLayout.tsx +84 -127
- package/src/admin/components/users/AdminUserProfile.tsx +5 -2
- package/src/admin/components/users/AdminUsers.tsx +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 +19 -21
- package/src/auth/index.ts +1 -0
- package/src/core/components/Flex.tsx +34 -0
- package/src/core/components/buttons/ActionButton.tsx +105 -78
- package/src/core/components/data/DetailDrawer.tsx +102 -96
- package/src/core/components/data/DetailList.tsx +2 -1
- package/src/core/components/dialogs/PromptDialog.tsx +1 -1
- package/src/core/components/layout/Breadcrumb.tsx +4 -7
- package/src/core/components/layout/DashboardShell.tsx +18 -4
- package/src/core/components/layout/Sidebar.tsx +16 -241
- 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/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/index.ts +3 -1
- 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/services/DialogService.tsx +2 -2
- package/src/core/styles.css +13 -2
- package/src/core/table/components/ColumnPicker.tsx +3 -3
- package/src/core/table/components/DataTable.tsx +88 -29
- package/src/core/table/components/DataTableFilters.tsx +6 -11
- package/src/core/table/components/DataTablePagination.tsx +9 -3
- package/src/core/table/components/DataTableToolbar.tsx +7 -3
- package/src/core/table/components/FilterPicker.tsx +3 -3
- package/src/core/table/interfaces/types.ts +29 -0
- 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 -237
- 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/AdminJobDashboard-KIOkeMgE.js.map +0 -1
- package/dist/admin/AdminLayout-B1DXZHDn.js.map +0 -1
- package/dist/admin/AdminParameters-BspPeqp_.js.map +0 -1
- package/dist/admin/AdminUserLayout-DUbC6-BI.js.map +0 -1
- package/dist/admin/AdminUserProfile-DuTUnjdG.js.map +0 -1
- package/dist/admin/AdminUsers-CR9z0g_5.js.map +0 -1
- package/dist/admin/Login-DHbYJKwg.js +0 -219
- package/dist/admin/Login-DHbYJKwg.js.map +0 -1
- package/dist/admin/Profile-B2EcIDB9.js.map +0 -1
- package/dist/admin/Register-Z3fxRbUF.js.map +0 -1
- package/dist/admin/ResetPassword-_Y1qTTKh.js.map +0 -1
- package/dist/admin/VerifyEmail-Bg22bwcC.js.map +0 -1
- package/dist/admin/core-BVO_TQxb.js.map +0 -1
- package/dist/admin/rolldown-runtime-CjeV3_4I.js +0 -18
- package/dist/auth/Login-C7jIqf00.js +0 -219
- package/dist/auth/Login-C7jIqf00.js.map +0 -1
- package/dist/auth/Profile-BMpXJ0oi.js.map +0 -1
- package/dist/auth/Register-2gx8qll-.js.map +0 -1
- package/dist/auth/ResetPassword-DBxt9hKk.js.map +0 -1
- package/dist/auth/VerifyEmail-Z80Ubajk.js.map +0 -1
- package/dist/auth/core-DyfeVr5c.js.map +0 -1
- package/dist/auth/rolldown-runtime-CjeV3_4I.js +0 -18
- package/dist/demo/DemoButton-CGUyR9eM.js +0 -178
- package/dist/demo/DemoButton-CGUyR9eM.js.map +0 -1
- package/dist/demo/DemoDataTable-QFG-xXSx.js +0 -358
- package/dist/demo/DemoDataTable-QFG-xXSx.js.map +0 -1
- package/dist/demo/DemoLayout-Cy6xjn6P.js.map +0 -1
- package/dist/demo/DemoLogin-vqxgTu4P.js.map +0 -1
- package/dist/demo/DemoRegister-YHPvPg77.js.map +0 -1
- package/dist/demo/DemoResetPassword-mOW18Zlm.js.map +0 -1
- package/dist/demo/DemoTypeForm-C1dNkahD.js.map +0 -1
- package/dist/demo/DemoVerifyEmail-D9EcXZ38.js +0 -30
- package/dist/demo/DemoVerifyEmail-D9EcXZ38.js.map +0 -1
- package/dist/demo/Login-CoYf_P_F.js +0 -219
- package/dist/demo/Login-CoYf_P_F.js.map +0 -1
- package/dist/demo/Profile-BE_Y3co2.js.map +0 -1
- package/dist/demo/Register-fXHmBpr3.js.map +0 -1
- package/dist/demo/ResetPassword-CAPj8MO3.js.map +0 -1
- package/dist/demo/Showcase-BtEU0pY9.js.map +0 -1
- package/dist/demo/VerifyEmail-DFmdCdYs.js.map +0 -1
- package/dist/demo/core-B7LNjM78.js.map +0 -1
- package/dist/demo/rolldown-runtime-CjeV3_4I.js +0 -18
- package/src/demo/styles.css +0 -0
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import { _ as ActionButton, b as useToast, l as Flex$1, m as useDialog
|
|
2
|
-
import { t } from "
|
|
3
|
-
import { ActionIcon, Avatar, Badge, Button, Flex,
|
|
1
|
+
import { _ as ActionButton, b as useToast, l as Flex$1, m as useDialog } from "./core-D1AbU50V.js";
|
|
2
|
+
import { t as adminUserAtom } from "./adminUserAtom-DCi4wf-v.js";
|
|
3
|
+
import { ActionIcon, Avatar, Badge, Button, Flex, Menu, Tabs, Text, Tooltip } from "@mantine/core";
|
|
4
4
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
-
import {
|
|
5
|
+
import { useCallback, useEffect } from "react";
|
|
6
6
|
import { IconBan, IconChevronDown, IconChevronLeft, IconExternalLink, IconShieldCheck, IconTrash } from "@tabler/icons-react";
|
|
7
|
-
import { NestedView, useActive, useRouter
|
|
8
|
-
import { useClient } from "alepha/react";
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const ActionMenuItem = (props) => {
|
|
7
|
+
import { NestedView, useActive, useRouter } from "alepha/react/router";
|
|
8
|
+
import { useAlepha, useClient, useStore } from "alepha/react";
|
|
9
|
+
//#region ../../src/admin/components/shared/AdminResourceHeaderMenuItem.tsx
|
|
10
|
+
const AdminResourceHeaderMenuItem = (props) => {
|
|
12
11
|
const { action } = props;
|
|
13
12
|
const router = useRouter();
|
|
14
13
|
const menuItemProps = {};
|
|
@@ -22,6 +21,8 @@ const ActionMenuItem = (props) => {
|
|
|
22
21
|
children: action.label
|
|
23
22
|
});
|
|
24
23
|
};
|
|
24
|
+
//#endregion
|
|
25
|
+
//#region ../../src/admin/components/shared/AdminResourceHeader.tsx
|
|
25
26
|
const AdminResourceHeader = (props) => {
|
|
26
27
|
const { backHref, backLabel = "Back", avatar, avatarColor = "blue", title, subtitle, identifier, identifierLabel = "ID", status, badges = [], primaryAction, menuActions = [], externalUrl } = props;
|
|
27
28
|
const renderAvatar = () => {
|
|
@@ -123,17 +124,16 @@ const AdminResourceHeader = (props) => {
|
|
|
123
124
|
variant: "default",
|
|
124
125
|
rightSection: /* @__PURE__ */ jsx(IconChevronDown, { size: 16 }),
|
|
125
126
|
children: "Actions"
|
|
126
|
-
}) }), /* @__PURE__ */ jsx(Menu.Dropdown, { children: menuActions.map((action, index) => /* @__PURE__ */ jsx(
|
|
127
|
+
}) }), /* @__PURE__ */ jsx(Menu.Dropdown, { children: menuActions.map((action, index) => /* @__PURE__ */ jsx(AdminResourceHeaderMenuItem, { action }, index)) })]
|
|
127
128
|
})
|
|
128
129
|
]
|
|
129
130
|
})]
|
|
130
131
|
})]
|
|
131
132
|
});
|
|
132
133
|
};
|
|
133
|
-
|
|
134
134
|
//#endregion
|
|
135
|
-
//#region ../../src/admin/components/shared/
|
|
136
|
-
const
|
|
135
|
+
//#region ../../src/admin/components/shared/AdminResourceTabsItem.tsx
|
|
136
|
+
const AdminResourceTabsItem = (props) => {
|
|
137
137
|
const { tab } = props;
|
|
138
138
|
const router = useRouter();
|
|
139
139
|
const { isActive, isPending } = useActive({ href: tab.href });
|
|
@@ -149,148 +149,115 @@ const TabItem = (props) => {
|
|
|
149
149
|
children: [tab.label, tab.count !== void 0 && tab.count > 0 && ` (${tab.count})`]
|
|
150
150
|
});
|
|
151
151
|
};
|
|
152
|
+
//#endregion
|
|
153
|
+
//#region ../../src/admin/components/shared/AdminResourceTabs.tsx
|
|
152
154
|
const AdminResourceTabs = (props) => {
|
|
153
155
|
const { tabs, activeTab, children } = props;
|
|
154
156
|
return /* @__PURE__ */ jsxs(Tabs, {
|
|
155
157
|
value: activeTab,
|
|
156
158
|
variant: "default",
|
|
157
|
-
children: [/* @__PURE__ */ jsx(Tabs.List, { children: tabs.map((tab) => /* @__PURE__ */ jsx(
|
|
159
|
+
children: [/* @__PURE__ */ jsx(Tabs.List, { children: tabs.map((tab) => /* @__PURE__ */ jsx(AdminResourceTabsItem, { tab }, tab.value)) }), children]
|
|
158
160
|
});
|
|
159
161
|
};
|
|
160
|
-
|
|
161
162
|
//#endregion
|
|
162
163
|
//#region ../../src/admin/components/users/AdminUserLayout.tsx
|
|
163
|
-
const UserContext = createContext(null);
|
|
164
|
-
const useUser = () => {
|
|
165
|
-
const ctx = useContext(UserContext);
|
|
166
|
-
if (!ctx) throw new Error("useUser must be used within AdminUserLayout");
|
|
167
|
-
return ctx;
|
|
168
|
-
};
|
|
169
|
-
t.object({
|
|
170
|
-
email: t.optional(t.email()),
|
|
171
|
-
phoneNumber: t.optional(t.e164()),
|
|
172
|
-
firstName: t.optional(t.string()),
|
|
173
|
-
lastName: t.optional(t.string()),
|
|
174
|
-
roles: t.optional(t.array(t.string())),
|
|
175
|
-
enabled: t.optional(t.boolean())
|
|
176
|
-
});
|
|
177
164
|
const displayName = (u) => u.firstName || u.lastName ? `${u.firstName ?? ""} ${u.lastName ?? ""}`.trim() : u.username || u.email || "User";
|
|
178
165
|
const AdminUserLayout = (props) => {
|
|
179
166
|
const router = useRouter();
|
|
180
|
-
const state = useRouterState();
|
|
181
167
|
const client = useClient();
|
|
168
|
+
const alepha = useAlepha();
|
|
182
169
|
const dialog = useDialog();
|
|
183
170
|
const toast = useToast();
|
|
184
|
-
const
|
|
185
|
-
|
|
186
|
-
|
|
171
|
+
const [user] = useStore(adminUserAtom);
|
|
172
|
+
useEffect(() => {
|
|
173
|
+
alepha.store.set(adminUserAtom, props.user);
|
|
174
|
+
}, [props.user]);
|
|
175
|
+
const currentUser = user ?? props.user;
|
|
176
|
+
const userId = currentUser.id;
|
|
187
177
|
const realmQuery = { userRealmName: props.userRealmName };
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
}));
|
|
195
|
-
} finally {
|
|
196
|
-
setLoading(false);
|
|
197
|
-
}
|
|
178
|
+
useCallback(async () => {
|
|
179
|
+
const data = await client.getUser({
|
|
180
|
+
params: { id: userId },
|
|
181
|
+
query: realmQuery
|
|
182
|
+
});
|
|
183
|
+
alepha.store.set(adminUserAtom, data);
|
|
198
184
|
}, [userId, client]);
|
|
199
|
-
useEffect(() => {
|
|
200
|
-
loadUser();
|
|
201
|
-
}, [loadUser]);
|
|
202
185
|
const handleToggleEnabled = async () => {
|
|
203
|
-
|
|
204
|
-
const action = user.enabled ? "disable" : "enable";
|
|
186
|
+
const action = currentUser.enabled ? "disable" : "enable";
|
|
205
187
|
if (await dialog.confirm({
|
|
206
|
-
title: `${
|
|
207
|
-
message: `Are you sure you want to ${action} ${displayName(
|
|
188
|
+
title: `${currentUser.enabled ? "Disable" : "Enable"} User`,
|
|
189
|
+
message: `Are you sure you want to ${action} ${displayName(currentUser)}?`
|
|
208
190
|
})) {
|
|
209
|
-
|
|
210
|
-
params: { id:
|
|
191
|
+
const updated = await client.updateUser({
|
|
192
|
+
params: { id: currentUser.id },
|
|
211
193
|
query: realmQuery,
|
|
212
|
-
body: { enabled: !
|
|
213
|
-
})
|
|
194
|
+
body: { enabled: !currentUser.enabled }
|
|
195
|
+
});
|
|
196
|
+
alepha.store.set(adminUserAtom, updated);
|
|
214
197
|
toast.success({ title: `User ${action}d` });
|
|
215
198
|
}
|
|
216
199
|
};
|
|
217
200
|
const handleDelete = async () => {
|
|
218
|
-
if (!user) return;
|
|
219
201
|
if (await dialog.confirm({
|
|
220
202
|
title: "Delete User",
|
|
221
|
-
message: `Are you sure you want to delete ${displayName(
|
|
203
|
+
message: `Are you sure you want to delete ${displayName(currentUser)}? This cannot be undone.`,
|
|
222
204
|
confirmColor: "red",
|
|
223
205
|
confirmLabel: "Delete"
|
|
224
206
|
})) {
|
|
225
207
|
await client.deleteUser({
|
|
226
|
-
params: { id:
|
|
208
|
+
params: { id: currentUser.id },
|
|
227
209
|
query: realmQuery
|
|
228
210
|
});
|
|
229
211
|
toast.success({ title: "User deleted" });
|
|
230
212
|
router.push("adminUsers");
|
|
231
213
|
}
|
|
232
214
|
};
|
|
233
|
-
|
|
234
|
-
flex: 1,
|
|
235
|
-
justify: "center",
|
|
236
|
-
align: "center",
|
|
237
|
-
children: /* @__PURE__ */ jsx(Loader, {})
|
|
238
|
-
});
|
|
239
|
-
if (!user) return /* @__PURE__ */ jsx(Flex$1, {
|
|
215
|
+
return /* @__PURE__ */ jsxs(Flex$1, {
|
|
240
216
|
flex: 1,
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
value: {
|
|
250
|
-
user,
|
|
251
|
-
reload: loadUser
|
|
217
|
+
direction: "column",
|
|
218
|
+
gap: "lg",
|
|
219
|
+
p: "md",
|
|
220
|
+
m: "md",
|
|
221
|
+
style: {
|
|
222
|
+
backgroundColor: "var(--mantine-color-body)",
|
|
223
|
+
borderRadius: "var(--mantine-radius-md)",
|
|
224
|
+
border: "1px solid var(--mantine-color-default-border)"
|
|
252
225
|
},
|
|
253
|
-
children:
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
},
|
|
268
|
-
menuActions: [{
|
|
269
|
-
label: user.enabled ? "Disable" : "Enable",
|
|
270
|
-
icon: user.enabled ? IconBan : IconShieldCheck,
|
|
271
|
-
onClick: handleToggleEnabled
|
|
272
|
-
}, {
|
|
273
|
-
label: "Delete",
|
|
274
|
-
icon: IconTrash,
|
|
275
|
-
color: "red",
|
|
276
|
-
onClick: handleDelete
|
|
277
|
-
}]
|
|
278
|
-
}),
|
|
279
|
-
/* @__PURE__ */ jsx(AdminResourceTabs, { tabs: [{
|
|
280
|
-
value: "profile",
|
|
281
|
-
label: "Profile",
|
|
282
|
-
href: router.path("adminUserProfile", { params: { userId } })
|
|
226
|
+
children: [
|
|
227
|
+
/* @__PURE__ */ jsx(AdminResourceHeader, {
|
|
228
|
+
backHref: router.path("adminUsers"),
|
|
229
|
+
backLabel: "Users",
|
|
230
|
+
title: displayName(currentUser),
|
|
231
|
+
subtitle: currentUser.email || currentUser.username,
|
|
232
|
+
status: {
|
|
233
|
+
label: currentUser.enabled ? "Active" : "Disabled",
|
|
234
|
+
color: currentUser.enabled ? "green" : "gray"
|
|
235
|
+
},
|
|
236
|
+
menuActions: [{
|
|
237
|
+
label: currentUser.enabled ? "Disable" : "Enable",
|
|
238
|
+
icon: currentUser.enabled ? IconBan : IconShieldCheck,
|
|
239
|
+
onClick: handleToggleEnabled
|
|
283
240
|
}, {
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
241
|
+
label: "Delete",
|
|
242
|
+
icon: IconTrash,
|
|
243
|
+
color: "red",
|
|
244
|
+
onClick: handleDelete
|
|
245
|
+
}]
|
|
246
|
+
}),
|
|
247
|
+
/* @__PURE__ */ jsx(AdminResourceTabs, { tabs: [{
|
|
248
|
+
value: "profile",
|
|
249
|
+
label: "Profile",
|
|
250
|
+
href: router.path("adminUserProfile", { params: { userId } })
|
|
251
|
+
}, {
|
|
252
|
+
value: "sessions",
|
|
253
|
+
label: "Sessions",
|
|
254
|
+
href: router.path("adminUserSessions", { params: { userId } })
|
|
255
|
+
}] }),
|
|
256
|
+
/* @__PURE__ */ jsx(NestedView, {})
|
|
257
|
+
]
|
|
291
258
|
});
|
|
292
259
|
};
|
|
293
|
-
|
|
294
260
|
//#endregion
|
|
295
|
-
export { AdminUserLayout as default
|
|
296
|
-
|
|
261
|
+
export { AdminUserLayout as default };
|
|
262
|
+
|
|
263
|
+
//# sourceMappingURL=AdminUserLayout-DvBTG5gd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminUserLayout-DvBTG5gd.js","names":["Flex"],"sources":["../../src/admin/components/shared/AdminResourceHeaderMenuItem.tsx","../../src/admin/components/shared/AdminResourceHeader.tsx","../../src/admin/components/shared/AdminResourceTabsItem.tsx","../../src/admin/components/shared/AdminResourceTabs.tsx","../../src/admin/components/users/AdminUserLayout.tsx"],"sourcesContent":["import { Menu } from \"@mantine/core\";\nimport { useRouter } from \"alepha/react/router\";\nimport type { AdminResourceAction } from \"./AdminResourceHeader.tsx\";\n\nexport interface AdminResourceHeaderMenuItemProps {\n /**\n * Action configuration\n */\n action: AdminResourceAction;\n}\n\nconst AdminResourceHeaderMenuItem = (\n props: AdminResourceHeaderMenuItemProps,\n) => {\n const { action } = props;\n const router = useRouter();\n\n const menuItemProps: Record<string, unknown> = {};\n if (action.href) {\n Object.assign(menuItemProps, router.anchor(action.href));\n } else if (action.onClick) {\n menuItemProps.onClick = action.onClick;\n }\n\n return (\n <Menu.Item\n leftSection={action.icon ? <action.icon size={16} /> : undefined}\n color={action.color}\n disabled={action.disabled}\n {...menuItemProps}\n >\n {action.label}\n </Menu.Item>\n );\n};\n\nexport default AdminResourceHeaderMenuItem;\n","import { ActionButton } from \"@alepha/ui\";\nimport {\n ActionIcon,\n Avatar,\n Badge,\n Button,\n Flex,\n Menu,\n Text,\n Tooltip,\n} from \"@mantine/core\";\nimport {\n IconChevronDown,\n IconChevronLeft,\n IconExternalLink,\n} from \"@tabler/icons-react\";\nimport type { ComponentType, ReactNode } from \"react\";\nimport AdminResourceHeaderMenuItem from \"./AdminResourceHeaderMenuItem.tsx\";\n\nexport interface AdminResourceAction {\n label: string;\n icon?: ComponentType<{ size?: number }>;\n onClick?: () => void;\n href?: string;\n color?: string;\n disabled?: boolean;\n loading?: boolean;\n variant?: \"filled\" | \"light\" | \"outline\" | \"subtle\";\n}\n\nexport interface AdminResourceHeaderProps {\n /**\n * Back navigation URL\n */\n backHref?: string;\n\n /**\n * Back navigation label\n */\n backLabel?: string;\n\n /**\n * Avatar content (letter, image URL, or custom node)\n */\n avatar?: string | ReactNode;\n\n /**\n * Avatar color\n */\n avatarColor?: string;\n\n /**\n * Resource title (e.g., user name)\n */\n title: string;\n\n /**\n * Secondary text (e.g., email)\n */\n subtitle?: string;\n\n /**\n * Tertiary identifier to copy (e.g., user ID)\n */\n identifier?: string;\n\n /**\n * Label for the identifier tooltip\n */\n identifierLabel?: string;\n\n /**\n * Status badge\n */\n status?: {\n label: string;\n color: \"green\" | \"red\" | \"yellow\" | \"blue\" | \"gray\";\n };\n\n /**\n * Additional badges (e.g., roles)\n */\n badges?: Array<{\n label: string;\n color?: string;\n variant?: \"filled\" | \"light\" | \"outline\" | \"dot\";\n }>;\n\n /**\n * Primary action button\n */\n primaryAction?: AdminResourceAction;\n\n /**\n * Menu actions (shown in dropdown)\n */\n menuActions?: AdminResourceAction[];\n\n /**\n * External link URL\n */\n externalUrl?: string;\n\n /**\n * Loading state\n */\n loading?: boolean;\n}\n\nconst AdminResourceHeader = (props: AdminResourceHeaderProps) => {\n const {\n backHref,\n backLabel = \"Back\",\n avatar,\n avatarColor = \"blue\",\n title,\n subtitle,\n identifier,\n identifierLabel = \"ID\",\n status,\n badges = [],\n primaryAction,\n menuActions = [],\n externalUrl,\n } = props;\n\n const renderAvatar = () => {\n if (typeof avatar === \"string\") {\n if (avatar.startsWith(\"http\") || avatar.startsWith(\"/\")) {\n return (\n <Avatar src={avatar} size={56} radius=\"md\" color={avatarColor} />\n );\n }\n return (\n <Avatar size={56} radius=\"md\" color={avatarColor}>\n {avatar}\n </Avatar>\n );\n }\n if (avatar) {\n return avatar;\n }\n return (\n <Avatar size={56} radius=\"md\" color={avatarColor}>\n {title.charAt(0).toUpperCase()}\n </Avatar>\n );\n };\n\n return (\n <Flex direction=\"column\" gap=\"xs\">\n {/* Breadcrumb / Back navigation */}\n {backHref && (\n <Flex>\n <ActionButton\n variant=\"subtle\"\n size=\"xs\"\n href={backHref}\n leftSection={<IconChevronLeft size={14} />}\n c=\"dimmed\"\n >\n {backLabel}\n </ActionButton>\n </Flex>\n )}\n\n {/* Main header */}\n <Flex justify=\"space-between\" align=\"flex-start\" wrap=\"nowrap\">\n {/* Left: Avatar + Info */}\n <Flex gap=\"md\" wrap=\"nowrap\">\n {renderAvatar()}\n\n <Flex\n direction=\"column\"\n gap={2}\n justify=\"center\"\n style={{ minHeight: 56 }}\n >\n {/* Title row */}\n <Flex gap=\"xs\" align=\"center\">\n <Text size=\"md\" fw={600} lh={1.2}>\n {title}\n </Text>\n {status && (\n <Badge\n size=\"xs\"\n variant=\"light\"\n color={status.color}\n tt=\"lowercase\"\n >\n {status.label}\n </Badge>\n )}\n </Flex>\n\n {/* Subtitle */}\n {subtitle && (\n <Text size=\"xs\" c=\"dimmed\">\n {subtitle}\n </Text>\n )}\n </Flex>\n </Flex>\n\n {/* Right: Actions */}\n <Flex gap=\"xs\">\n {externalUrl && (\n <Tooltip label=\"Open in new tab\" openDelay={500}>\n <ActionIcon\n variant=\"subtle\"\n color=\"gray\"\n component=\"a\"\n href={externalUrl}\n target=\"_blank\"\n >\n <IconExternalLink size={18} />\n </ActionIcon>\n </Tooltip>\n )}\n\n {primaryAction && (\n <ActionButton\n variant={primaryAction.variant ?? \"light\"}\n color={primaryAction.color}\n onClick={primaryAction.onClick}\n href={primaryAction.href}\n loading={primaryAction.loading}\n disabled={primaryAction.disabled}\n leftSection={\n primaryAction.icon ? (\n <primaryAction.icon size={16} />\n ) : undefined\n }\n >\n {primaryAction.label}\n </ActionButton>\n )}\n\n {menuActions.length > 0 && (\n <Menu position=\"bottom-end\" shadow=\"md\" width={220}>\n <Menu.Target>\n <Button\n variant=\"default\"\n rightSection={<IconChevronDown size={16} />}\n >\n Actions\n </Button>\n </Menu.Target>\n <Menu.Dropdown>\n {menuActions.map((action, index) => (\n <AdminResourceHeaderMenuItem key={index} action={action} />\n ))}\n </Menu.Dropdown>\n </Menu>\n )}\n </Flex>\n </Flex>\n </Flex>\n );\n};\n\nexport default AdminResourceHeader;\n","import { Tabs } from \"@mantine/core\";\nimport { useActive, useRouter } from \"alepha/react/router\";\nimport type { AdminResourceTab } from \"./AdminResourceTabs.tsx\";\n\nexport interface AdminResourceTabsItemProps {\n /**\n * Tab configuration\n */\n tab: AdminResourceTab;\n}\n\nconst AdminResourceTabsItem = (props: AdminResourceTabsItemProps) => {\n const { tab } = props;\n const router = useRouter();\n const { isActive, isPending } = useActive({ href: tab.href });\n const anchorProps = router.anchor(tab.href);\n\n return (\n <Tabs.Tab\n value={tab.value}\n component=\"a\"\n leftSection={tab.icon ? <tab.icon size={16} /> : undefined}\n disabled={tab.disabled}\n data-active={isActive || undefined}\n style={{\n opacity: isPending ? 0.6 : 1,\n }}\n {...anchorProps}\n >\n {tab.label}\n {tab.count !== undefined && tab.count > 0 && ` (${tab.count})`}\n </Tabs.Tab>\n );\n};\n\nexport default AdminResourceTabsItem;\n","import { Tabs } from \"@mantine/core\";\nimport type { ComponentType, ReactNode } from \"react\";\nimport AdminResourceTabsItem from \"./AdminResourceTabsItem.tsx\";\n\nexport interface AdminResourceTab {\n /**\n * Tab key/value\n */\n value: string;\n\n /**\n * Tab label\n */\n label: string;\n\n /**\n * Tab icon\n */\n icon?: ComponentType<{ size?: number }>;\n\n /**\n * Navigation href\n */\n href: string;\n\n /**\n * Whether tab is disabled\n */\n disabled?: boolean;\n\n /**\n * Badge count to show\n */\n count?: number;\n}\n\nexport interface AdminResourceTabsProps {\n /**\n * Array of tab configurations\n */\n tabs: AdminResourceTab[];\n\n /**\n * Currently active tab value\n */\n activeTab?: string;\n\n /**\n * Content to render below tabs\n */\n children?: ReactNode;\n}\n\nconst AdminResourceTabs = (props: AdminResourceTabsProps) => {\n const { tabs, activeTab, children } = props;\n\n return (\n <Tabs value={activeTab} variant=\"default\">\n <Tabs.List>\n {tabs.map((tab) => (\n <AdminResourceTabsItem key={tab.value} tab={tab} />\n ))}\n </Tabs.List>\n\n {children}\n </Tabs>\n );\n};\n\nexport default AdminResourceTabs;\n","import { Flex, useDialog, useToast } from \"@alepha/ui\";\nimport { IconBan, IconShieldCheck, IconTrash } from \"@tabler/icons-react\";\nimport type { AdminUserController, UserEntity } from \"alepha/api/users\";\nimport { useAlepha, useClient, useStore } from \"alepha/react\";\nimport { NestedView, useRouter } from \"alepha/react/router\";\nimport { useCallback, useEffect } from \"react\";\nimport type { AdminRouter } from \"../../AdminRouter.ts\";\nimport { adminUserAtom } from \"../../atoms/adminUserAtom.ts\";\nimport AdminResourceHeader from \"../shared/AdminResourceHeader.tsx\";\nimport AdminResourceTabs from \"../shared/AdminResourceTabs.tsx\";\n\nexport interface AdminUserLayoutProps {\n user: UserEntity;\n userRealmName?: string;\n}\n\nconst displayName = (u: UserEntity) =>\n u.firstName || u.lastName\n ? `${u.firstName ?? \"\"} ${u.lastName ?? \"\"}`.trim()\n : u.username || u.email || \"User\";\n\nconst AdminUserLayout = (props: AdminUserLayoutProps) => {\n const router = useRouter<AdminRouter>();\n const client = useClient<AdminUserController>();\n const alepha = useAlepha();\n const dialog = useDialog();\n const toast = useToast();\n const [user] = useStore(adminUserAtom);\n\n useEffect(() => {\n alepha.store.set(adminUserAtom, props.user);\n }, [props.user]);\n\n const currentUser = user ?? props.user;\n const userId = currentUser.id;\n const realmQuery = { userRealmName: props.userRealmName };\n\n const reload = useCallback(async () => {\n const data = await client.getUser({\n params: { id: userId },\n query: realmQuery,\n });\n alepha.store.set(adminUserAtom, data);\n }, [userId, client]);\n\n const handleToggleEnabled = async () => {\n const action = currentUser.enabled ? \"disable\" : \"enable\";\n const confirmed = await dialog.confirm({\n title: `${currentUser.enabled ? \"Disable\" : \"Enable\"} User`,\n message: `Are you sure you want to ${action} ${displayName(currentUser)}?`,\n });\n if (confirmed) {\n const updated = await client.updateUser({\n params: { id: currentUser.id },\n query: realmQuery,\n body: { enabled: !currentUser.enabled },\n });\n alepha.store.set(adminUserAtom, updated);\n toast.success({ title: `User ${action}d` });\n }\n };\n\n const handleDelete = async () => {\n const confirmed = await dialog.confirm({\n title: \"Delete User\",\n message: `Are you sure you want to delete ${displayName(currentUser)}? This cannot be undone.`,\n confirmColor: \"red\",\n confirmLabel: \"Delete\",\n });\n if (confirmed) {\n await client.deleteUser({\n params: { id: currentUser.id },\n query: realmQuery,\n });\n toast.success({ title: \"User deleted\" });\n router.push(\"adminUsers\");\n }\n };\n\n return (\n <Flex\n flex={1}\n direction=\"column\"\n gap=\"lg\"\n p=\"md\"\n m=\"md\"\n style={{\n backgroundColor: \"var(--mantine-color-body)\",\n borderRadius: \"var(--mantine-radius-md)\",\n border: \"1px solid var(--mantine-color-default-border)\",\n }}\n >\n <AdminResourceHeader\n backHref={router.path(\"adminUsers\")}\n backLabel=\"Users\"\n title={displayName(currentUser)}\n subtitle={currentUser.email || currentUser.username}\n status={{\n label: currentUser.enabled ? \"Active\" : \"Disabled\",\n color: currentUser.enabled ? \"green\" : \"gray\",\n }}\n menuActions={[\n {\n label: currentUser.enabled ? \"Disable\" : \"Enable\",\n icon: currentUser.enabled ? IconBan : IconShieldCheck,\n onClick: handleToggleEnabled,\n },\n {\n label: \"Delete\",\n icon: IconTrash,\n color: \"red\",\n onClick: handleDelete,\n },\n ]}\n />\n\n <AdminResourceTabs\n tabs={[\n {\n value: \"profile\",\n label: \"Profile\",\n href: router.path(\"adminUserProfile\", {\n params: { userId },\n }),\n },\n {\n value: \"sessions\",\n label: \"Sessions\",\n href: router.path(\"adminUserSessions\", {\n params: { userId },\n }),\n },\n ]}\n />\n\n <NestedView />\n </Flex>\n );\n};\n\nexport default AdminUserLayout;\n"],"mappings":"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"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import { d as DetailList, l as Flex$1 } from "./core-
|
|
2
|
-
import {
|
|
1
|
+
import { d as DetailList, l as Flex$1 } from "./core-D1AbU50V.js";
|
|
2
|
+
import { t as adminUserAtom } from "./adminUserAtom-DCi4wf-v.js";
|
|
3
3
|
import { useI18n } from "alepha/react/i18n";
|
|
4
4
|
import { Badge } from "@mantine/core";
|
|
5
5
|
import { jsx } from "react/jsx-runtime";
|
|
6
|
-
|
|
6
|
+
import { useStore } from "alepha/react";
|
|
7
7
|
//#region ../../src/admin/components/users/AdminUserProfile.tsx
|
|
8
8
|
const AdminUserProfile = () => {
|
|
9
|
-
const
|
|
9
|
+
const [user] = useStore(adminUserAtom);
|
|
10
10
|
const { l } = useI18n();
|
|
11
|
+
if (!user) return null;
|
|
11
12
|
return /* @__PURE__ */ jsx(DetailList, { items: [
|
|
12
13
|
{
|
|
13
14
|
label: "ID",
|
|
@@ -63,7 +64,7 @@ const AdminUserProfile = () => {
|
|
|
63
64
|
}
|
|
64
65
|
] });
|
|
65
66
|
};
|
|
66
|
-
|
|
67
67
|
//#endregion
|
|
68
68
|
export { AdminUserProfile as default };
|
|
69
|
-
|
|
69
|
+
|
|
70
|
+
//# sourceMappingURL=AdminUserProfile-CzsPBl6Z.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminUserProfile-CzsPBl6Z.js","names":["Flex"],"sources":["../../src/admin/components/users/AdminUserProfile.tsx"],"sourcesContent":["import { DetailList, Flex } from \"@alepha/ui\";\nimport { Badge } from \"@mantine/core\";\nimport { useStore } from \"alepha/react\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { adminUserAtom } from \"../../atoms/adminUserAtom.ts\";\n\nconst AdminUserProfile = () => {\n const [user] = useStore(adminUserAtom);\n const { l } = useI18n();\n\n if (!user) return null;\n\n return (\n <DetailList\n items={[\n { label: \"ID\", value: user.id, copyable: user.id },\n { label: \"Username\", value: user.username },\n { label: \"Email\", value: user.email },\n {\n label: \"Email Verified\",\n value: user.emailVerified ? \"Yes\" : \"No\",\n },\n { label: \"Phone\", value: user.phoneNumber },\n { label: \"First Name\", value: user.firstName },\n { label: \"Last Name\", value: user.lastName },\n { label: \"Realm\", value: user.realm },\n {\n label: \"Roles\",\n value:\n user.roles.length > 0 ? (\n <Flex gap={4}>\n {user.roles.map((role) => (\n <Badge key={role} size=\"xs\" variant=\"default\">\n {role}\n </Badge>\n ))}\n </Flex>\n ) : null,\n },\n {\n label: \"Created\",\n value: String(l(user.createdAt, { date: \"lll\" })),\n },\n {\n label: \"Updated\",\n value: String(l(user.updatedAt, { date: \"lll\" })),\n },\n ]}\n />\n );\n};\n\nexport default AdminUserProfile;\n"],"mappings":";;;;;;;AAMA,MAAM,yBAAyB;CAC7B,MAAM,CAAC,QAAQ,SAAS,cAAc;CACtC,MAAM,EAAE,MAAM,SAAS;AAEvB,KAAI,CAAC,KAAM,QAAO;AAElB,QACE,oBAAC,YAAD,EACE,OAAO;EACL;GAAE,OAAO;GAAM,OAAO,KAAK;GAAI,UAAU,KAAK;GAAI;EAClD;GAAE,OAAO;GAAY,OAAO,KAAK;GAAU;EAC3C;GAAE,OAAO;GAAS,OAAO,KAAK;GAAO;EACrC;GACE,OAAO;GACP,OAAO,KAAK,gBAAgB,QAAQ;GACrC;EACD;GAAE,OAAO;GAAS,OAAO,KAAK;GAAa;EAC3C;GAAE,OAAO;GAAc,OAAO,KAAK;GAAW;EAC9C;GAAE,OAAO;GAAa,OAAO,KAAK;GAAU;EAC5C;GAAE,OAAO;GAAS,OAAO,KAAK;GAAO;EACrC;GACE,OAAO;GACP,OACE,KAAK,MAAM,SAAS,IAClB,oBAACA,QAAD;IAAM,KAAK;cACR,KAAK,MAAM,KAAK,SACf,oBAAC,OAAD;KAAkB,MAAK;KAAK,SAAQ;eACjC;KACK,EAFI,KAEJ,CACR;IACG,CAAA,GACL;GACP;EACD;GACE,OAAO;GACP,OAAO,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,OAAO,CAAC,CAAC;GAClD;EACD;GACE,OAAO;GACP,OAAO,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,OAAO,CAAC,CAAC;GAClD;EACF,EACD,CAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { b as useToast, l as Flex$1, m as useDialog,
|
|
1
|
+
import { b as useToast, l as Flex$1, m as useDialog, r as DataTable, s as Text$1 } from "./core-D1AbU50V.js";
|
|
2
2
|
import { t } from "alepha";
|
|
3
3
|
import { useI18n } from "alepha/react/i18n";
|
|
4
4
|
import { Badge } from "@mantine/core";
|
|
@@ -7,7 +7,6 @@ import { useState } from "react";
|
|
|
7
7
|
import { IconDeviceDesktop, IconDeviceMobile, IconDeviceTablet, IconTrash } from "@tabler/icons-react";
|
|
8
8
|
import { useRouterState } from "alepha/react/router";
|
|
9
9
|
import { useClient } from "alepha/react";
|
|
10
|
-
|
|
11
10
|
//#region ../../src/admin/components/users/AdminUserSessions.tsx
|
|
12
11
|
const emptyFilters = t.object({});
|
|
13
12
|
const getDeviceIcon = (device) => {
|
|
@@ -101,7 +100,7 @@ const AdminUserSessions = (props) => {
|
|
|
101
100
|
}]
|
|
102
101
|
}, refreshKey);
|
|
103
102
|
};
|
|
104
|
-
|
|
105
103
|
//#endregion
|
|
106
104
|
export { AdminUserSessions as default };
|
|
107
|
-
|
|
105
|
+
|
|
106
|
+
//# sourceMappingURL=AdminUserSessions-C-aUnhVN.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminUserSessions-
|
|
1
|
+
{"version":3,"file":"AdminUserSessions-C-aUnhVN.js","names":["Flex","Text"],"sources":["../../src/admin/components/users/AdminUserSessions.tsx"],"sourcesContent":["import { DataTable, Flex, Text, useDialog, useToast } from \"@alepha/ui\";\nimport { Badge } from \"@mantine/core\";\nimport {\n IconDeviceDesktop,\n IconDeviceMobile,\n IconDeviceTablet,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { type Page, t } from \"alepha\";\nimport type { AdminSessionController, SessionEntity } from \"alepha/api/users\";\nimport { useClient } from \"alepha/react\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { useRouterState } from \"alepha/react/router\";\nimport { useState } from \"react\";\n\nexport interface AdminUserSessionsProps {\n userRealmName?: string;\n}\n\nconst emptyFilters = t.object({});\n\nconst getDeviceIcon = (device?: string) => {\n switch (device) {\n case \"MOBILE\":\n return <IconDeviceMobile size={14} />;\n case \"TABLET\":\n return <IconDeviceTablet size={14} />;\n default:\n return <IconDeviceDesktop size={14} />;\n }\n};\n\nconst isExpired = (expiresAt: Date | string) =>\n new Date(expiresAt) < new Date();\n\nconst AdminUserSessions = (props: AdminUserSessionsProps) => {\n const state = useRouterState();\n const userId = state.params.userId as string;\n const client = useClient<AdminSessionController>();\n const { l } = useI18n();\n const dialog = useDialog();\n const toast = useToast();\n const [refreshKey, setRefreshKey] = useState(0);\n\n const handleDeleteSession = async (session: SessionEntity) => {\n const confirmed = await dialog.confirm({\n title: \"Revoke session\",\n message:\n \"Are you sure you want to revoke this session? The user will be signed out on this device.\",\n });\n if (!confirmed) return;\n await client.deleteSession({\n params: { id: session.id },\n query: { userRealmName: props.userRealmName },\n });\n toast.success(\"Session revoked\");\n setRefreshKey((k) => k + 1);\n };\n\n return (\n <DataTable<SessionEntity, typeof emptyFilters>\n key={refreshKey}\n submitOnInit\n defaultSize={10}\n filters={emptyFilters}\n tableProps={{\n horizontalSpacing: \"xs\",\n verticalSpacing: \"xs\",\n }}\n tableTrProps={(item) => ({\n style: {\n opacity: isExpired(item.expiresAt) ? 0.5 : 1,\n },\n })}\n items={async (filters) => {\n const response = await client.findSessions({\n query: {\n ...filters,\n userId,\n userRealmName: props.userRealmName,\n },\n });\n return response as Page<SessionEntity>;\n }}\n columns={{\n device: {\n label: \"Device\",\n value: (item) => (\n <Flex gap={4} align=\"center\">\n {getDeviceIcon(item.userAgent?.device)}\n <Text size=\"xs\">\n {item.userAgent\n ? `${item.userAgent.browser} / ${item.userAgent.os}`\n : \"—\"}\n </Text>\n </Flex>\n ),\n },\n ip: {\n label: \"IP\",\n value: (item) => (\n <Text size=\"xs\" ff=\"monospace\" muted>\n {item.ip || \"—\"}\n </Text>\n ),\n },\n status: {\n label: \"Status\",\n value: (item) => (\n <Badge\n size=\"sm\"\n variant=\"light\"\n color={isExpired(item.expiresAt) ? \"gray\" : \"green\"}\n >\n {isExpired(item.expiresAt) ? \"Expired\" : \"Active\"}\n </Badge>\n ),\n },\n createdAt: {\n label: \"Created\",\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: \"Revoke session\",\n icon: IconTrash,\n color: \"red\",\n onClick: () => handleDeleteSession(item),\n visible: !isExpired(item.expiresAt),\n },\n ]}\n />\n );\n};\n\nexport default AdminUserSessions;\n"],"mappings":";;;;;;;;;;AAmBA,MAAM,eAAe,EAAE,OAAO,EAAE,CAAC;AAEjC,MAAM,iBAAiB,WAAoB;AACzC,SAAQ,QAAR;EACE,KAAK,SACH,QAAO,oBAAC,kBAAD,EAAkB,MAAM,IAAM,CAAA;EACvC,KAAK,SACH,QAAO,oBAAC,kBAAD,EAAkB,MAAM,IAAM,CAAA;EACvC,QACE,QAAO,oBAAC,mBAAD,EAAmB,MAAM,IAAM,CAAA;;;AAI5C,MAAM,aAAa,cACjB,IAAI,KAAK,UAAU,mBAAG,IAAI,MAAM;AAElC,MAAM,qBAAqB,UAAkC;CAE3D,MAAM,SADQ,gBAAgB,CACT,OAAO;CAC5B,MAAM,SAAS,WAAmC;CAClD,MAAM,EAAE,MAAM,SAAS;CACvB,MAAM,SAAS,WAAW;CAC1B,MAAM,QAAQ,UAAU;CACxB,MAAM,CAAC,YAAY,iBAAiB,SAAS,EAAE;CAE/C,MAAM,sBAAsB,OAAO,YAA2B;AAM5D,MAAI,CALc,MAAM,OAAO,QAAQ;GACrC,OAAO;GACP,SACE;GACH,CAAC,CACc;AAChB,QAAM,OAAO,cAAc;GACzB,QAAQ,EAAE,IAAI,QAAQ,IAAI;GAC1B,OAAO,EAAE,eAAe,MAAM,eAAe;GAC9C,CAAC;AACF,QAAM,QAAQ,kBAAkB;AAChC,iBAAe,MAAM,IAAI,EAAE;;AAG7B,QACE,oBAAC,WAAD;EAEE,cAAA;EACA,aAAa;EACb,SAAS;EACT,YAAY;GACV,mBAAmB;GACnB,iBAAiB;GAClB;EACD,eAAe,UAAU,EACvB,OAAO,EACL,SAAS,UAAU,KAAK,UAAU,GAAG,KAAM,GAC5C,EACF;EACD,OAAO,OAAO,YAAY;AAQxB,UAPiB,MAAM,OAAO,aAAa,EACzC,OAAO;IACL,GAAG;IACH;IACA,eAAe,MAAM;IACtB,EACF,CAAC;;EAGJ,SAAS;GACP,QAAQ;IACN,OAAO;IACP,QAAQ,SACN,qBAACA,QAAD;KAAM,KAAK;KAAG,OAAM;eAApB,CACG,cAAc,KAAK,WAAW,OAAO,EACtC,oBAACC,QAAD;MAAM,MAAK;gBACR,KAAK,YACF,GAAG,KAAK,UAAU,QAAQ,KAAK,KAAK,UAAU,OAC9C;MACC,CAAA,CACF;;IAEV;GACD,IAAI;IACF,OAAO;IACP,QAAQ,SACN,oBAACA,QAAD;KAAM,MAAK;KAAK,IAAG;KAAY,OAAA;eAC5B,KAAK,MAAM;KACP,CAAA;IAEV;GACD,QAAQ;IACN,OAAO;IACP,QAAQ,SACN,oBAAC,OAAD;KACE,MAAK;KACL,SAAQ;KACR,OAAO,UAAU,KAAK,UAAU,GAAG,SAAS;eAE3C,UAAU,KAAK,UAAU,GAAG,YAAY;KACnC,CAAA;IAEX;GACD,WAAW;IACT,OAAO;IACP,QAAQ,SACN,oBAACA,QAAD;KAAM,MAAK;KAAK,OAAA;eACb,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;KAClC,CAAA;IAEV;GACF;EACD,aAAa,SAAS,CACpB;GACE,OAAO;GACP,MAAM;GACN,OAAO;GACP,eAAe,oBAAoB,KAAK;GACxC,SAAS,CAAC,UAAU,KAAK,UAAU;GACpC,CACF;EACD,EA3EK,WA2EL"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { _ as ActionButton, b as useToast, l as Flex$1, m as useDialog,
|
|
1
|
+
import { _ as ActionButton, b as useToast, l as Flex$1, m as useDialog, r as DataTable, s as Text$1 } from "./core-D1AbU50V.js";
|
|
2
2
|
import { t } from "alepha";
|
|
3
3
|
import { useI18n } from "alepha/react/i18n";
|
|
4
4
|
import { Avatar, Badge } from "@mantine/core";
|
|
@@ -7,7 +7,6 @@ import { useState } from "react";
|
|
|
7
7
|
import { IconEye, IconTrash, IconUserOff, IconUserPlus } from "@tabler/icons-react";
|
|
8
8
|
import { useRouter } from "alepha/react/router";
|
|
9
9
|
import { useClient } from "alepha/react";
|
|
10
|
-
|
|
11
10
|
//#region ../../src/admin/components/users/AdminUsers.tsx
|
|
12
11
|
const filters = t.object({
|
|
13
12
|
query: t.optional(t.text()),
|
|
@@ -111,6 +110,7 @@ const AdminUsers = (props) => {
|
|
|
111
110
|
name
|
|
112
111
|
}), /* @__PURE__ */ jsxs(Flex$1, {
|
|
113
112
|
col: true,
|
|
113
|
+
align: "start",
|
|
114
114
|
children: [/* @__PURE__ */ jsx(Text$1, {
|
|
115
115
|
size: "sm",
|
|
116
116
|
bold: true,
|
|
@@ -200,7 +200,7 @@ const AdminUsers = (props) => {
|
|
|
200
200
|
}, refreshKey)
|
|
201
201
|
});
|
|
202
202
|
};
|
|
203
|
-
|
|
204
203
|
//#endregion
|
|
205
204
|
export { AdminUsers as default };
|
|
206
|
-
|
|
205
|
+
|
|
206
|
+
//# sourceMappingURL=AdminUsers-BYwei5sj.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminUsers-BYwei5sj.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 align={\"start\"}>\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,8 +1,7 @@
|
|
|
1
|
-
import { y as AlephaMantineProvider } from "./core-
|
|
1
|
+
import { y as AlephaMantineProvider } from "./core-D1AbU50V.js";
|
|
2
2
|
import { Flex } from "@mantine/core";
|
|
3
3
|
import { jsx } from "react/jsx-runtime";
|
|
4
4
|
import { NestedView } from "alepha/react/router";
|
|
5
|
-
|
|
6
5
|
//#region ../../src/auth/components/AuthLayout.tsx
|
|
7
6
|
const AuthLayout = () => {
|
|
8
7
|
return /* @__PURE__ */ jsx(AlephaMantineProvider, {
|
|
@@ -16,7 +15,7 @@ const AuthLayout = () => {
|
|
|
16
15
|
})
|
|
17
16
|
});
|
|
18
17
|
};
|
|
19
|
-
|
|
20
18
|
//#endregion
|
|
21
19
|
export { AuthLayout as default };
|
|
22
|
-
|
|
20
|
+
|
|
21
|
+
//# sourceMappingURL=AuthLayout-CkPGLJku.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthLayout-
|
|
1
|
+
{"version":3,"file":"AuthLayout-CkPGLJku.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,uBAAD;EAAuB,SAAS;YAC9B,oBAAC,MAAD;GAAM,MAAM;GAAG,OAAO;GAAU,GAAG;GAAS,SAAS;aACnD,oBAAC,YAAD,EAAc,CAAA;GACT,CAAA;EACe,CAAA"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
-
|
|
3
2
|
//#region ../../src/auth/components/icons/IconGithub.tsx
|
|
4
3
|
const IconGithub = () => {
|
|
5
4
|
return /* @__PURE__ */ jsx("svg", {
|
|
@@ -17,7 +16,6 @@ const IconGithub = () => {
|
|
|
17
16
|
})
|
|
18
17
|
});
|
|
19
18
|
};
|
|
20
|
-
|
|
21
19
|
//#endregion
|
|
22
20
|
//#region ../../src/auth/components/icons/IconGoogle.tsx
|
|
23
21
|
const IconGoogle = () => {
|
|
@@ -50,7 +48,7 @@ const IconGoogle = () => {
|
|
|
50
48
|
]
|
|
51
49
|
});
|
|
52
50
|
};
|
|
53
|
-
|
|
54
51
|
//#endregion
|
|
55
52
|
export { IconGithub as n, IconGoogle as t };
|
|
56
|
-
|
|
53
|
+
|
|
54
|
+
//# sourceMappingURL=IconGoogle-8Nkx6yax.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IconGoogle-
|
|
1
|
+
{"version":3,"file":"IconGoogle-8Nkx6yax.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,OAAD;EACE,OAAM;EACN,QAAO;EACP,SAAQ;EACR,MAAK;EACL,OAAM;YAEN,oBAAC,QAAD;GACE,UAAS;GACT,UAAS;GACT,GAAE;GACF,WAAU;GACV,MAAM;GACN,CAAA;EACE,CAAA;;;;AChBV,MAAM,mBAAmB;AACvB,QACE,qBAAC,OAAD;EACE,OAAM;EACN,QAAO;EACP,SAAQ;EACR,OAAM;YAJR;GAME,oBAAC,QAAD;IACE,GAAE;IACF,MAAK;IACL,CAAA;GACF,oBAAC,QAAD;IACE,GAAE;IACF,MAAK;IACL,CAAA;GACF,oBAAC,QAAD;IACE,GAAE;IACF,MAAK;IACL,CAAA;GACF,oBAAC,QAAD;IACE,GAAE;IACF,MAAK;IACL,CAAA;GACF,oBAAC,QAAD;IAAM,GAAE;IAAgB,MAAK;IAAS,CAAA;GAClC"}
|