@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
|
@@ -42,14 +42,14 @@ export interface UserButtonProps
|
|
|
42
42
|
menuConfig?: Partial<Omit<ActionMenuConfig, "items">>;
|
|
43
43
|
|
|
44
44
|
/**
|
|
45
|
-
*
|
|
45
|
+
* Custom icon to use instead of user avatar (default: IconUser)
|
|
46
46
|
*/
|
|
47
|
-
|
|
47
|
+
icon?: ReactNode;
|
|
48
48
|
|
|
49
49
|
/**
|
|
50
|
-
*
|
|
50
|
+
* If true, the profile link will not be shown in the menu even if a userProfile page exists and the user is authenticated.
|
|
51
51
|
*/
|
|
52
|
-
|
|
52
|
+
skipProfile?: boolean;
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
const UserButton = (props: UserButtonProps) => {
|
|
@@ -58,8 +58,8 @@ const UserButton = (props: UserButtonProps) => {
|
|
|
58
58
|
logoutLabel = "Sign out",
|
|
59
59
|
loginLabel,
|
|
60
60
|
menuConfig,
|
|
61
|
-
showLogoutDivider = menuItems.length > 0,
|
|
62
61
|
icon,
|
|
62
|
+
skipProfile = false,
|
|
63
63
|
children,
|
|
64
64
|
...buttonProps
|
|
65
65
|
} = props;
|
|
@@ -104,10 +104,10 @@ const UserButton = (props: UserButtonProps) => {
|
|
|
104
104
|
}
|
|
105
105
|
|
|
106
106
|
// Add profile page link if available
|
|
107
|
-
if (userPage && isConnected) {
|
|
107
|
+
if (userPage && isConnected && !skipProfile) {
|
|
108
108
|
items.push({
|
|
109
109
|
label: "Profile",
|
|
110
|
-
icon: <IconUser size={ui.sizes.icon.
|
|
110
|
+
icon: <IconUser size={ui.sizes.icon.sm} />,
|
|
111
111
|
href: authRouter.path("userProfile"),
|
|
112
112
|
});
|
|
113
113
|
}
|
|
@@ -116,7 +116,7 @@ const UserButton = (props: UserButtonProps) => {
|
|
|
116
116
|
if (adminPage && isAdmin) {
|
|
117
117
|
items.push({
|
|
118
118
|
label: "Admin",
|
|
119
|
-
icon: <IconSettings size={ui.sizes.icon.
|
|
119
|
+
icon: <IconSettings size={ui.sizes.icon.sm} />,
|
|
120
120
|
href: authRouter.path("adminLayout"),
|
|
121
121
|
});
|
|
122
122
|
}
|
|
@@ -125,14 +125,14 @@ const UserButton = (props: UserButtonProps) => {
|
|
|
125
125
|
items.push(...menuItems);
|
|
126
126
|
|
|
127
127
|
// Add divider before logout if needed
|
|
128
|
-
if (
|
|
128
|
+
if (items.length > 0) {
|
|
129
129
|
items.push({ type: "divider" });
|
|
130
130
|
}
|
|
131
131
|
|
|
132
132
|
// Add logout item
|
|
133
133
|
items.push({
|
|
134
134
|
label: logoutLabel,
|
|
135
|
-
icon: <IconLogout size={ui.sizes.icon.
|
|
135
|
+
icon: <IconLogout size={ui.sizes.icon.sm} />,
|
|
136
136
|
color: "red",
|
|
137
137
|
onClick: () => auth.logout(),
|
|
138
138
|
});
|
|
@@ -146,23 +146,21 @@ const UserButton = (props: UserButtonProps) => {
|
|
|
146
146
|
icon={
|
|
147
147
|
hasAvatar ? undefined : icon === null ? undefined : (icon ?? IconUser)
|
|
148
148
|
}
|
|
149
|
-
|
|
150
|
-
hasAvatar ? (
|
|
151
|
-
<Avatar
|
|
152
|
-
src={`/api/files/${auth.user.picture}`}
|
|
153
|
-
size={24}
|
|
154
|
-
radius="xl"
|
|
155
|
-
/>
|
|
156
|
-
) : undefined
|
|
157
|
-
}
|
|
149
|
+
px={8}
|
|
158
150
|
menu={{
|
|
159
|
-
|
|
151
|
+
menuProps: {
|
|
152
|
+
withArrow: true,
|
|
153
|
+
arrowSize: 12,
|
|
154
|
+
},
|
|
155
|
+
position: "bottom",
|
|
160
156
|
width: 200,
|
|
161
157
|
...menuConfig,
|
|
162
158
|
items,
|
|
163
159
|
}}
|
|
164
160
|
>
|
|
165
|
-
{
|
|
161
|
+
{hasAvatar ? (
|
|
162
|
+
<Avatar src={`/api/files/${auth.user.picture}`} size={24} radius="xl" />
|
|
163
|
+
) : undefined}
|
|
166
164
|
</ActionButton>
|
|
167
165
|
);
|
|
168
166
|
};
|
package/src/auth/index.ts
CHANGED
|
@@ -13,6 +13,7 @@ export { default as UserButton } from "./components/buttons/UserButton.tsx";
|
|
|
13
13
|
export { default as Login } from "./components/Login.tsx";
|
|
14
14
|
export { default as Register } from "./components/Register.tsx";
|
|
15
15
|
export { default as ResetPassword } from "./components/ResetPassword.tsx";
|
|
16
|
+
export type { VerifyEmailStep } from "./components/VerifyEmail.tsx";
|
|
16
17
|
export { default as VerifyEmail } from "./components/VerifyEmail.tsx";
|
|
17
18
|
export * from "./primitives/$uiAuth.ts";
|
|
18
19
|
|
|
@@ -2,9 +2,17 @@ import {
|
|
|
2
2
|
Flex as MantineFlex,
|
|
3
3
|
type FlexProps as MantineFlexProps,
|
|
4
4
|
} from "@mantine/core";
|
|
5
|
+
import { FormModel } from "alepha/react/form";
|
|
6
|
+
import type { FormHTMLAttributes } from "react";
|
|
5
7
|
import { forwardRef } from "react";
|
|
6
8
|
|
|
7
9
|
export interface FlexProps extends MantineFlexProps {
|
|
10
|
+
/**
|
|
11
|
+
* Render as a `<form>` element.
|
|
12
|
+
* If `true`, renders as a plain form.
|
|
13
|
+
* If an object, spreads the form attributes (onSubmit, id, noValidate, etc.).
|
|
14
|
+
*/
|
|
15
|
+
form?: boolean | FormHTMLAttributes<HTMLFormElement> | FormModel<any>;
|
|
8
16
|
/**
|
|
9
17
|
* flex: 1 — fill available space.
|
|
10
18
|
*/
|
|
@@ -69,6 +77,11 @@ export interface FlexProps extends MantineFlexProps {
|
|
|
69
77
|
* Add a shadow to the container. The intensity will be determined by the current theme.
|
|
70
78
|
*/
|
|
71
79
|
shadowed?: boolean | number | string;
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Set overflow to "auto" to enable scrolling when content overflows the container.
|
|
83
|
+
*/
|
|
84
|
+
overflow?: boolean;
|
|
72
85
|
}
|
|
73
86
|
|
|
74
87
|
const Flex = forwardRef<HTMLDivElement, FlexProps>((props, ref) => {
|
|
@@ -86,6 +99,8 @@ const Flex = forwardRef<HTMLDivElement, FlexProps>((props, ref) => {
|
|
|
86
99
|
borderedTop,
|
|
87
100
|
borderedBottom,
|
|
88
101
|
shadowed,
|
|
102
|
+
overflow,
|
|
103
|
+
form,
|
|
89
104
|
...rest
|
|
90
105
|
} = props;
|
|
91
106
|
|
|
@@ -145,6 +160,25 @@ const Flex = forwardRef<HTMLDivElement, FlexProps>((props, ref) => {
|
|
|
145
160
|
`${rest.className ?? ""} shadow-${shadowed === true ? "md" : shadowed}`.trim();
|
|
146
161
|
}
|
|
147
162
|
|
|
163
|
+
if (overflow) {
|
|
164
|
+
rest.className = `${rest.className ?? ""} overflow-auto`.trim();
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (form) {
|
|
168
|
+
let formProps: any = typeof form === "object" ? form : {};
|
|
169
|
+
if (formProps instanceof FormModel) {
|
|
170
|
+
formProps = formProps.props;
|
|
171
|
+
}
|
|
172
|
+
return (
|
|
173
|
+
<MantineFlex
|
|
174
|
+
ref={ref}
|
|
175
|
+
component={"form"}
|
|
176
|
+
{...(formProps as any)}
|
|
177
|
+
{...rest}
|
|
178
|
+
/>
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
|
|
148
182
|
return <MantineFlex ref={ref} {...rest} />;
|
|
149
183
|
});
|
|
150
184
|
|
|
@@ -112,6 +112,9 @@ export interface ActionMenuConfig {
|
|
|
112
112
|
export interface ActionCommonProps extends ButtonProps {
|
|
113
113
|
children?: ReactNode;
|
|
114
114
|
|
|
115
|
+
/**
|
|
116
|
+
* If set, the button will show only the icon on smaller screens and reveal the text from the specified breakpoint and up.
|
|
117
|
+
*/
|
|
115
118
|
textVisibleFrom?: "xs" | "sm" | "md" | "lg" | "xl";
|
|
116
119
|
|
|
117
120
|
/**
|
|
@@ -139,6 +142,9 @@ export interface ActionCommonProps extends ButtonProps {
|
|
|
139
142
|
*/
|
|
140
143
|
icon?: ReactNode | ComponentType;
|
|
141
144
|
|
|
145
|
+
/**
|
|
146
|
+
* Size of the icon. Can be a number (pixels) or a string (e.g., "1em", "20px").
|
|
147
|
+
*/
|
|
142
148
|
iconSize?: number | string;
|
|
143
149
|
|
|
144
150
|
/**
|
|
@@ -150,6 +156,11 @@ export interface ActionCommonProps extends ButtonProps {
|
|
|
150
156
|
* Visual intent of the action button.
|
|
151
157
|
*/
|
|
152
158
|
intent?: "primary" | "success" | "danger" | "warning" | "info" | "none";
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Active state styling for navigation actions. When set, the button will apply active styles based on the current route.
|
|
162
|
+
*/
|
|
163
|
+
variant?: ButtonProps["variant"] | "minimal";
|
|
153
164
|
}
|
|
154
165
|
|
|
155
166
|
export type ActionProps = ActionCommonProps &
|
|
@@ -163,85 +174,17 @@ export type ActionProps = ActionCommonProps &
|
|
|
163
174
|
|
|
164
175
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
165
176
|
|
|
166
|
-
//
|
|
167
|
-
const ActionMenuItem = (props: {
|
|
168
|
-
item: ActionMenuItem;
|
|
169
|
-
index: number;
|
|
170
|
-
}): ReactNode => {
|
|
171
|
-
const { item, index } = props;
|
|
172
|
-
|
|
173
|
-
const router = useRouter();
|
|
174
|
-
const action = useAction(
|
|
175
|
-
{
|
|
176
|
-
handler: async (e: any) => {
|
|
177
|
-
await item.onClick?.();
|
|
178
|
-
},
|
|
179
|
-
},
|
|
180
|
-
[item.onClick],
|
|
181
|
-
);
|
|
182
|
-
|
|
183
|
-
// Render divider
|
|
184
|
-
if (item.type === "divider") {
|
|
185
|
-
return <Menu.Divider key={index} />;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// Render label
|
|
189
|
-
if (item.type === "label") {
|
|
190
|
-
return <Menu.Label key={index}>{item.label}</Menu.Label>;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
// Render submenu if it has children
|
|
194
|
-
if (item.children && item.children.length > 0) {
|
|
195
|
-
return (
|
|
196
|
-
<Menu key={index} trigger="hover" position="right-start" offset={2}>
|
|
197
|
-
<Menu.Target>
|
|
198
|
-
<Menu.Item
|
|
199
|
-
leftSection={item.icon}
|
|
200
|
-
rightSection={<IconChevronRight size={14} />}
|
|
201
|
-
>
|
|
202
|
-
{item.label}
|
|
203
|
-
</Menu.Item>
|
|
204
|
-
</Menu.Target>
|
|
205
|
-
<Menu.Dropdown>
|
|
206
|
-
{item.children.map((child, childIndex) => (
|
|
207
|
-
<ActionMenuItem item={child} index={childIndex} key={childIndex} />
|
|
208
|
-
))}
|
|
209
|
-
</Menu.Dropdown>
|
|
210
|
-
</Menu>
|
|
211
|
-
);
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
const menuItemProps: MenuItemProps & ButtonHTMLAttributes<unknown> = {};
|
|
215
|
-
if (props.item.onClick) {
|
|
216
|
-
menuItemProps.onClick = action.run;
|
|
217
|
-
} else if (props.item.href) {
|
|
218
|
-
Object.assign(menuItemProps, router.anchor(props.item.href));
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
// render regular menu item
|
|
222
|
-
return (
|
|
223
|
-
<Menu.Item
|
|
224
|
-
key={index}
|
|
225
|
-
leftSection={
|
|
226
|
-
item.icon ??
|
|
227
|
-
(item.active ? (
|
|
228
|
-
<IconCheck size={ui.sizes.icon.sm} />
|
|
229
|
-
) : (
|
|
230
|
-
<Flex w={ui.sizes.icon.sm} />
|
|
231
|
-
))
|
|
232
|
-
}
|
|
233
|
-
onClick={item.onClick}
|
|
234
|
-
color={item.color}
|
|
235
|
-
{...menuItemProps}
|
|
236
|
-
>
|
|
237
|
-
{item.label}
|
|
238
|
-
</Menu.Item>
|
|
239
|
-
);
|
|
240
|
-
};
|
|
177
|
+
// ---------------------------------------------------------------------------------------------------------------------
|
|
241
178
|
|
|
242
179
|
const ActionButton = (_props: ActionProps) => {
|
|
243
180
|
const theme = useMantineTheme();
|
|
244
181
|
const props = { ..._props };
|
|
182
|
+
|
|
183
|
+
if (props.variant === "minimal") {
|
|
184
|
+
//props.variant = "default";
|
|
185
|
+
//props.bd = 0;
|
|
186
|
+
}
|
|
187
|
+
|
|
245
188
|
const { tooltip, menu, icon, iconSize, ...restProps } = props;
|
|
246
189
|
|
|
247
190
|
if (props.intent) {
|
|
@@ -298,7 +241,13 @@ const ActionButton = (_props: ActionProps) => {
|
|
|
298
241
|
</ActionButton>
|
|
299
242
|
</Flex>
|
|
300
243
|
<Flex w={"100%"} hiddenFrom={textVisibleFrom}>
|
|
301
|
-
<ActionButton
|
|
244
|
+
<ActionButton
|
|
245
|
+
px={"xs"}
|
|
246
|
+
{...rest}
|
|
247
|
+
aria-label={typeof children === "string" ? children : undefined}
|
|
248
|
+
tooltip={tooltip}
|
|
249
|
+
menu={menu}
|
|
250
|
+
>
|
|
302
251
|
{leftSection}
|
|
303
252
|
</ActionButton>
|
|
304
253
|
</Flex>
|
|
@@ -315,6 +264,7 @@ const ActionButton = (_props: ActionProps) => {
|
|
|
315
264
|
</ActionHrefButton>
|
|
316
265
|
);
|
|
317
266
|
}
|
|
267
|
+
|
|
318
268
|
return (
|
|
319
269
|
<ActionNavigationButton {...restProps} href={restProps.href}>
|
|
320
270
|
{restProps.children}
|
|
@@ -564,6 +514,7 @@ const ActionNavigationButton = (props: ActionNavigationButtonProps) => {
|
|
|
564
514
|
propsActive,
|
|
565
515
|
routerGoOptions,
|
|
566
516
|
onClick: propsOnClick,
|
|
517
|
+
anchorProps: buttonAnchorProps,
|
|
567
518
|
anchor,
|
|
568
519
|
...buttonProps
|
|
569
520
|
} = props as ActionNavigationButtonProps & { onClick?: (e: any) => void };
|
|
@@ -588,13 +539,13 @@ const ActionNavigationButton = (props: ActionNavigationButtonProps) => {
|
|
|
588
539
|
buttonProps.className = `${className} ${classNameActive}`.trim();
|
|
589
540
|
}
|
|
590
541
|
|
|
591
|
-
if (
|
|
542
|
+
if (buttonAnchorProps || anchor) {
|
|
592
543
|
return (
|
|
593
544
|
<Anchor
|
|
594
545
|
component={"a"}
|
|
595
546
|
{...anchorProps}
|
|
596
547
|
{...(buttonProps as AnchorProps)}
|
|
597
|
-
{...
|
|
548
|
+
{...buttonAnchorProps}
|
|
598
549
|
onClick={combinedOnClick}
|
|
599
550
|
>
|
|
600
551
|
{props.children}
|
|
@@ -639,3 +590,79 @@ const ActionHrefButton = (props: ActionNavigationButtonProps) => {
|
|
|
639
590
|
};
|
|
640
591
|
|
|
641
592
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
593
|
+
|
|
594
|
+
// Helper function to render menu items recursively
|
|
595
|
+
const ActionMenuItem = (props: {
|
|
596
|
+
item: ActionMenuItem;
|
|
597
|
+
index: number;
|
|
598
|
+
}): ReactNode => {
|
|
599
|
+
const { item, index } = props;
|
|
600
|
+
|
|
601
|
+
const router = useRouter();
|
|
602
|
+
const action = useAction(
|
|
603
|
+
{
|
|
604
|
+
handler: async (e: any) => {
|
|
605
|
+
await item.onClick?.();
|
|
606
|
+
},
|
|
607
|
+
},
|
|
608
|
+
[item.onClick],
|
|
609
|
+
);
|
|
610
|
+
|
|
611
|
+
// Render divider
|
|
612
|
+
if (item.type === "divider") {
|
|
613
|
+
return <Menu.Divider key={index} />;
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
// Render label
|
|
617
|
+
if (item.type === "label") {
|
|
618
|
+
return <Menu.Label key={index}>{item.label}</Menu.Label>;
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
// Render submenu if it has children
|
|
622
|
+
if (item.children && item.children.length > 0) {
|
|
623
|
+
return (
|
|
624
|
+
<Menu key={index} trigger="hover" position="right-start" offset={2}>
|
|
625
|
+
<Menu.Target>
|
|
626
|
+
<Menu.Item
|
|
627
|
+
leftSection={item.icon}
|
|
628
|
+
rightSection={<IconChevronRight size={14} />}
|
|
629
|
+
>
|
|
630
|
+
{item.label}
|
|
631
|
+
</Menu.Item>
|
|
632
|
+
</Menu.Target>
|
|
633
|
+
<Menu.Dropdown>
|
|
634
|
+
{item.children.map((child, childIndex) => (
|
|
635
|
+
<ActionMenuItem item={child} index={childIndex} key={childIndex} />
|
|
636
|
+
))}
|
|
637
|
+
</Menu.Dropdown>
|
|
638
|
+
</Menu>
|
|
639
|
+
);
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
const menuItemProps: MenuItemProps & ButtonHTMLAttributes<unknown> = {};
|
|
643
|
+
if (props.item.onClick) {
|
|
644
|
+
menuItemProps.onClick = action.run;
|
|
645
|
+
} else if (props.item.href) {
|
|
646
|
+
Object.assign(menuItemProps, router.anchor(props.item.href));
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
// render regular menu item
|
|
650
|
+
return (
|
|
651
|
+
<Menu.Item
|
|
652
|
+
key={index}
|
|
653
|
+
leftSection={
|
|
654
|
+
item.icon ??
|
|
655
|
+
(item.active ? (
|
|
656
|
+
<IconCheck size={ui.sizes.icon.sm} />
|
|
657
|
+
) : (
|
|
658
|
+
<Flex w={ui.sizes.icon.sm} />
|
|
659
|
+
))
|
|
660
|
+
}
|
|
661
|
+
onClick={item.onClick}
|
|
662
|
+
color={item.color}
|
|
663
|
+
{...menuItemProps}
|
|
664
|
+
>
|
|
665
|
+
{item.label}
|
|
666
|
+
</Menu.Item>
|
|
667
|
+
);
|
|
668
|
+
};
|
|
@@ -36,109 +36,115 @@ export interface DetailDrawerProps {
|
|
|
36
36
|
defaultTab?: string;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
const DetailDrawer = ({
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
p="md"
|
|
63
|
-
justify="space-between"
|
|
64
|
-
align="flex-start"
|
|
65
|
-
style={{ borderBottom: "1px solid var(--mantine-color-default-border)" }}
|
|
39
|
+
const DetailDrawer = (props: DetailDrawerProps) => {
|
|
40
|
+
const {
|
|
41
|
+
opened,
|
|
42
|
+
onClose,
|
|
43
|
+
title,
|
|
44
|
+
subtitle,
|
|
45
|
+
status,
|
|
46
|
+
actions,
|
|
47
|
+
tabs,
|
|
48
|
+
children,
|
|
49
|
+
loading,
|
|
50
|
+
size = "xl",
|
|
51
|
+
defaultTab,
|
|
52
|
+
} = props;
|
|
53
|
+
|
|
54
|
+
return (
|
|
55
|
+
<Drawer
|
|
56
|
+
opened={opened}
|
|
57
|
+
onClose={onClose}
|
|
58
|
+
position="right"
|
|
59
|
+
size={size}
|
|
60
|
+
withCloseButton={false}
|
|
61
|
+
padding={0}
|
|
66
62
|
>
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
63
|
+
{/* Header */}
|
|
64
|
+
<Flex
|
|
65
|
+
p="md"
|
|
66
|
+
justify="space-between"
|
|
67
|
+
align="flex-start"
|
|
68
|
+
style={{
|
|
69
|
+
borderBottom: "1px solid var(--mantine-color-default-border)",
|
|
70
|
+
}}
|
|
71
|
+
>
|
|
72
|
+
<Flex direction="column" gap={2} style={{ minWidth: 0, flex: 1 }}>
|
|
73
|
+
<Flex gap="xs" align="center">
|
|
74
|
+
{status && (
|
|
75
|
+
<Flex
|
|
76
|
+
w={8}
|
|
77
|
+
h={8}
|
|
78
|
+
style={{
|
|
79
|
+
borderRadius: "50%",
|
|
80
|
+
backgroundColor: status.active
|
|
81
|
+
? "var(--mantine-color-green-6)"
|
|
82
|
+
: "var(--mantine-color-red-6)",
|
|
83
|
+
flexShrink: 0,
|
|
84
|
+
}}
|
|
85
|
+
/>
|
|
86
|
+
)}
|
|
87
|
+
<Text size="lg" fw={600} truncate>
|
|
88
|
+
{title}
|
|
89
|
+
</Text>
|
|
90
|
+
</Flex>
|
|
91
|
+
{subtitle && (
|
|
92
|
+
<Text size="sm" c="dimmed" truncate>
|
|
93
|
+
{subtitle}
|
|
94
|
+
</Text>
|
|
81
95
|
)}
|
|
82
|
-
<Text size="lg" fw={600} truncate>
|
|
83
|
-
{title}
|
|
84
|
-
</Text>
|
|
85
96
|
</Flex>
|
|
86
|
-
{
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
>
|
|
103
|
-
Actions
|
|
97
|
+
<Flex gap="xs" align="center" style={{ flexShrink: 0 }}>
|
|
98
|
+
{actions && actions.length > 0 && (
|
|
99
|
+
<ActionButton
|
|
100
|
+
variant="default"
|
|
101
|
+
size="xs"
|
|
102
|
+
menu={{
|
|
103
|
+
items: actions,
|
|
104
|
+
position: "bottom-end",
|
|
105
|
+
width: 200,
|
|
106
|
+
}}
|
|
107
|
+
>
|
|
108
|
+
Actions
|
|
109
|
+
</ActionButton>
|
|
110
|
+
)}
|
|
111
|
+
<ActionButton variant="subtle" size="xs" c="dimmed" onClick={onClose}>
|
|
112
|
+
Close
|
|
104
113
|
</ActionButton>
|
|
105
|
-
|
|
106
|
-
<ActionButton variant="subtle" size="xs" c="dimmed" onClick={onClose}>
|
|
107
|
-
Close
|
|
108
|
-
</ActionButton>
|
|
114
|
+
</Flex>
|
|
109
115
|
</Flex>
|
|
110
|
-
</Flex>
|
|
111
116
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
117
|
+
{/* Content */}
|
|
118
|
+
{loading ? (
|
|
119
|
+
<Flex flex={1} justify="center" align="center" py="xl">
|
|
120
|
+
<Loader />
|
|
121
|
+
</Flex>
|
|
122
|
+
) : tabs && tabs.length > 0 ? (
|
|
123
|
+
<Tabs defaultValue={defaultTab || tabs[0].value}>
|
|
124
|
+
<Tabs.List px="md">
|
|
125
|
+
{tabs.map((tab) => (
|
|
126
|
+
<Tabs.Tab
|
|
127
|
+
key={tab.value}
|
|
128
|
+
value={tab.value}
|
|
129
|
+
leftSection={tab.icon ? <tab.icon size={14} /> : undefined}
|
|
130
|
+
>
|
|
131
|
+
{tab.label}
|
|
132
|
+
</Tabs.Tab>
|
|
133
|
+
))}
|
|
134
|
+
</Tabs.List>
|
|
120
135
|
{tabs.map((tab) => (
|
|
121
|
-
<Tabs.
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
leftSection={tab.icon ? <tab.icon size={14} /> : undefined}
|
|
125
|
-
>
|
|
126
|
-
{tab.label}
|
|
127
|
-
</Tabs.Tab>
|
|
136
|
+
<Tabs.Panel key={tab.value} value={tab.value} p="md">
|
|
137
|
+
{tab.content}
|
|
138
|
+
</Tabs.Panel>
|
|
128
139
|
))}
|
|
129
|
-
</Tabs
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
{children}
|
|
139
|
-
</Flex>
|
|
140
|
-
)}
|
|
141
|
-
</Drawer>
|
|
142
|
-
);
|
|
140
|
+
</Tabs>
|
|
141
|
+
) : (
|
|
142
|
+
<Flex direction="column" p="md">
|
|
143
|
+
{children}
|
|
144
|
+
</Flex>
|
|
145
|
+
)}
|
|
146
|
+
</Drawer>
|
|
147
|
+
);
|
|
148
|
+
};
|
|
143
149
|
|
|
144
150
|
export default DetailDrawer;
|
|
@@ -14,7 +14,8 @@ export interface DetailListProps {
|
|
|
14
14
|
columns?: number;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
const DetailList = (
|
|
17
|
+
const DetailList = (props: DetailListProps) => {
|
|
18
|
+
const { items, columns = 1 } = props;
|
|
18
19
|
const visibleItems = items.filter((item) => !item.hidden);
|
|
19
20
|
|
|
20
21
|
return (
|
|
@@ -36,7 +36,7 @@ const PromptDialog = ({ options, onSubmit }: PromptDialogProps) => {
|
|
|
36
36
|
required={options?.required}
|
|
37
37
|
mb="md"
|
|
38
38
|
/>
|
|
39
|
-
<Flex justify="flex-end">
|
|
39
|
+
<Flex justify="flex-end" gap={"xs"}>
|
|
40
40
|
<Button variant="subtle" onClick={() => onSubmit(null)}>
|
|
41
41
|
{options?.cancelLabel || "Cancel"}
|
|
42
42
|
</Button>
|
|
@@ -34,12 +34,9 @@ export interface BreadcrumbProps extends FlexProps {
|
|
|
34
34
|
* Pages should define a `label` in their `$page()` options for best results.
|
|
35
35
|
* Falls back to the page name converted to Title Case.
|
|
36
36
|
*/
|
|
37
|
-
const
|
|
38
|
-
home = "Home",
|
|
39
|
-
|
|
40
|
-
size = "sm",
|
|
41
|
-
...groupProps
|
|
42
|
-
}: BreadcrumbProps) => {
|
|
37
|
+
const Breadcrumbs = (props: BreadcrumbProps) => {
|
|
38
|
+
const { home = "Home", separator, size = "sm", ...groupProps } = props;
|
|
39
|
+
|
|
43
40
|
const state = useRouterState();
|
|
44
41
|
const router = useRouter();
|
|
45
42
|
|
|
@@ -88,4 +85,4 @@ const Breadcrumb = ({
|
|
|
88
85
|
);
|
|
89
86
|
};
|
|
90
87
|
|
|
91
|
-
export default
|
|
88
|
+
export default Breadcrumbs;
|