@alepha/ui 0.18.2 → 0.18.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/{AdminApiKeys-BJhIwfD6.js → AdminApiKeys-Dy_k-4Vd.js} +2 -2
- package/dist/admin/{AdminApiKeys-BJhIwfD6.js.map → AdminApiKeys-Dy_k-4Vd.js.map} +1 -1
- package/dist/admin/{AdminAudits-DzD_4cDt.js → AdminAudits-CKiFMSSU.js} +2 -2
- package/dist/admin/{AdminAudits-DzD_4cDt.js.map → AdminAudits-CKiFMSSU.js.map} +1 -1
- package/dist/admin/{AdminDashboard-C92tIc6x.js → AdminDashboard-PhC_dZqo.js} +2 -2
- package/dist/admin/{AdminDashboard-C92tIc6x.js.map → AdminDashboard-PhC_dZqo.js.map} +1 -1
- package/dist/admin/{AdminFiles-DLpfhBkf.js → AdminFiles-DFTjijGp.js} +2 -2
- package/dist/admin/{AdminFiles-DLpfhBkf.js.map → AdminFiles-DFTjijGp.js.map} +1 -1
- package/dist/admin/{AdminJobDashboard-KIOkeMgE.js → AdminJobDashboard-BL8gGPDp.js} +2 -2
- package/dist/admin/{AdminJobDashboard-KIOkeMgE.js.map → AdminJobDashboard-BL8gGPDp.js.map} +1 -1
- package/dist/admin/{AdminJobExecutions-D0Yo_PU0.js → AdminJobExecutions-D9E-CS-U.js} +2 -2
- package/dist/admin/{AdminJobExecutions-D0Yo_PU0.js.map → AdminJobExecutions-D9E-CS-U.js.map} +1 -1
- package/dist/admin/{AdminJobRegistry-PFajqaGK.js → AdminJobRegistry-Ci9ue1zC.js} +2 -2
- package/dist/admin/{AdminJobRegistry-PFajqaGK.js.map → AdminJobRegistry-Ci9ue1zC.js.map} +1 -1
- package/dist/admin/{AdminLayout-B1DXZHDn.js → AdminLayout-I6TlUMPc.js} +2 -2
- package/dist/admin/{AdminLayout-B1DXZHDn.js.map → AdminLayout-I6TlUMPc.js.map} +1 -1
- package/dist/admin/AdminNotifications-ZPHCYrv7.js +542 -0
- package/dist/admin/AdminNotifications-ZPHCYrv7.js.map +1 -0
- package/dist/admin/{AdminParameters-BspPeqp_.js → AdminParameters-CqgvhRsb.js} +120 -105
- package/dist/admin/AdminParameters-CqgvhRsb.js.map +1 -0
- package/dist/admin/{AdminSessions-BnH5CZQl.js → AdminSessions-Bz5NRuoW.js} +2 -2
- package/dist/admin/{AdminSessions-BnH5CZQl.js.map → AdminSessions-Bz5NRuoW.js.map} +1 -1
- package/dist/admin/{AdminUserLayout-DUbC6-BI.js → AdminUserLayout-lXT6I0Qq.js} +14 -8
- package/dist/admin/AdminUserLayout-lXT6I0Qq.js.map +1 -0
- package/dist/admin/{AdminUserProfile-DuTUnjdG.js → AdminUserProfile-vFBLoJ3h.js} +3 -3
- package/dist/admin/{AdminUserProfile-DuTUnjdG.js.map → AdminUserProfile-vFBLoJ3h.js.map} +1 -1
- package/dist/admin/{AdminUserSessions-DvZdAGpL.js → AdminUserSessions-CT_YDim0.js} +2 -2
- package/dist/admin/{AdminUserSessions-DvZdAGpL.js.map → AdminUserSessions-CT_YDim0.js.map} +1 -1
- package/dist/admin/{AdminUsers-CR9z0g_5.js → AdminUsers-D1UfGya9.js} +2 -2
- package/dist/admin/{AdminUsers-CR9z0g_5.js.map → AdminUsers-D1UfGya9.js.map} +1 -1
- package/dist/admin/{AuthLayout-DsUfp9RG.js → AuthLayout-_frhdgOO.js} +2 -2
- package/dist/admin/{AuthLayout-DsUfp9RG.js.map → AuthLayout-_frhdgOO.js.map} +1 -1
- package/dist/admin/Login-xtNmQtGh.js +275 -0
- package/dist/admin/Login-xtNmQtGh.js.map +1 -0
- package/dist/admin/{Profile-B2EcIDB9.js → Profile-_AtPUwAP.js} +31 -27
- package/dist/admin/Profile-_AtPUwAP.js.map +1 -0
- package/dist/admin/{Register-Z3fxRbUF.js → Register-JcCjHUUn.js} +198 -142
- package/dist/admin/Register-JcCjHUUn.js.map +1 -0
- package/dist/admin/{ResetPassword-_Y1qTTKh.js → ResetPassword-CwGBPLJO.js} +7 -7
- package/dist/admin/ResetPassword-CwGBPLJO.js.map +1 -0
- package/dist/admin/{VerifyEmail-Bg22bwcC.js → VerifyEmail-hNxWejWf.js} +23 -8
- package/dist/admin/VerifyEmail-hNxWejWf.js.map +1 -0
- package/dist/admin/{core-BVO_TQxb.js → core-CYaRQ8O-.js} +709 -556
- package/dist/admin/core-CYaRQ8O-.js.map +1 -0
- package/dist/admin/index.d.ts +83 -44
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +58 -39
- package/dist/admin/index.js.map +1 -1
- package/dist/auth/{AuthLayout-C161NeF6.js → AuthLayout-AvLlcLjS.js} +2 -2
- package/dist/auth/{AuthLayout-C161NeF6.js.map → AuthLayout-AvLlcLjS.js.map} +1 -1
- package/dist/auth/Login-BA1E8IZl.js +275 -0
- package/dist/auth/Login-BA1E8IZl.js.map +1 -0
- package/dist/auth/{Profile-BMpXJ0oi.js → Profile-YcWdeuFz.js} +31 -27
- package/dist/auth/Profile-YcWdeuFz.js.map +1 -0
- package/dist/auth/{Register-2gx8qll-.js → Register-CPhEO5MG.js} +198 -142
- package/dist/auth/Register-CPhEO5MG.js.map +1 -0
- package/dist/{demo/ResetPassword-CAPj8MO3.js → auth/ResetPassword-DCtGcneA.js} +7 -7
- package/dist/auth/ResetPassword-DCtGcneA.js.map +1 -0
- package/dist/{demo/VerifyEmail-DFmdCdYs.js → auth/VerifyEmail-DkH7NBfn.js} +23 -8
- package/dist/auth/VerifyEmail-DkH7NBfn.js.map +1 -0
- package/dist/auth/{core-DyfeVr5c.js → core-D5jIAVF2.js} +386 -294
- package/dist/auth/core-D5jIAVF2.js.map +1 -0
- package/dist/auth/index.d.ts +93 -48
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +28 -24
- package/dist/auth/index.js.map +1 -1
- package/dist/core/index.d.ts +116 -61
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +873 -701
- package/dist/core/index.js.map +1 -1
- package/dist/demo/{AuthLayout-DN-ClJQk.js → AuthLayout-Brri4A-L.js} +2 -2
- package/dist/demo/{AuthLayout-DN-ClJQk.js.map → AuthLayout-Brri4A-L.js.map} +1 -1
- package/dist/demo/DemoButton-wiCxZZ_L.js +182 -0
- package/dist/demo/DemoButton-wiCxZZ_L.js.map +1 -0
- package/dist/demo/DemoControlSelect-D7ILObVg.js +305 -0
- package/dist/demo/DemoControlSelect-D7ILObVg.js.map +1 -0
- package/dist/demo/DemoDataTable-DZ5Y8pFX.js +362 -0
- package/dist/demo/DemoDataTable-DZ5Y8pFX.js.map +1 -0
- package/dist/demo/{DemoDialog-DW8QEvD1.js → DemoDialog-CUWdLHim.js} +2 -2
- package/dist/demo/{DemoDialog-DW8QEvD1.js.map → DemoDialog-CUWdLHim.js.map} +1 -1
- package/dist/demo/{DemoFlex-CAhLUanT.js → DemoFlex-a8OhMMvq.js} +3 -3
- package/dist/demo/{DemoFlex-CAhLUanT.js.map → DemoFlex-a8OhMMvq.js.map} +1 -1
- package/dist/demo/{DemoHeading-yIFmNjHB.js → DemoHeading-C13OVDfS.js} +3 -3
- package/dist/demo/{DemoHeading-yIFmNjHB.js.map → DemoHeading-C13OVDfS.js.map} +1 -1
- package/dist/demo/{DemoHome-BSGuBHus.js → DemoHome-D_De3UiT.js} +2 -2
- package/dist/demo/{DemoHome-BSGuBHus.js.map → DemoHome-D_De3UiT.js.map} +1 -1
- package/dist/demo/{DemoJsonViewer-DsA2IpgV.js → DemoJsonViewer-B50s9aGM.js} +3 -3
- package/dist/demo/{DemoJsonViewer-DsA2IpgV.js.map → DemoJsonViewer-B50s9aGM.js.map} +1 -1
- package/dist/demo/{DemoLayout-Cy6xjn6P.js → DemoLayout-CHU8WTwO.js} +14 -5
- package/dist/demo/DemoLayout-CHU8WTwO.js.map +1 -0
- package/dist/demo/{DemoLogin-vqxgTu4P.js → DemoLogin-BBlrWpml.js} +49 -32
- package/dist/demo/DemoLogin-BBlrWpml.js.map +1 -0
- package/dist/demo/{DemoRegister-YHPvPg77.js → DemoRegister-BuNE3_-f.js} +49 -50
- package/dist/demo/DemoRegister-BuNE3_-f.js.map +1 -0
- package/dist/demo/{DemoResetPassword-mOW18Zlm.js → DemoResetPassword-D_IjjjOJ.js} +12 -16
- package/dist/demo/DemoResetPassword-D_IjjjOJ.js.map +1 -0
- package/dist/demo/{DemoSidebar-od7aLjP_.js → DemoSidebar-Giy2HRBD.js} +3 -3
- package/dist/demo/{DemoSidebar-od7aLjP_.js.map → DemoSidebar-Giy2HRBD.js.map} +1 -1
- package/dist/demo/{DemoText-DU3JeRS0.js → DemoText-ubcw-vog.js} +3 -3
- package/dist/demo/{DemoText-DU3JeRS0.js.map → DemoText-ubcw-vog.js.map} +1 -1
- package/dist/demo/{DemoToast-CUJEiPRa.js → DemoToast-9die_dYT.js} +2 -2
- package/dist/demo/{DemoToast-CUJEiPRa.js.map → DemoToast-9die_dYT.js.map} +1 -1
- package/dist/demo/{DemoTypeForm-C1dNkahD.js → DemoTypeForm-D_d6OVKL.js} +8 -4
- package/dist/demo/DemoTypeForm-D_d6OVKL.js.map +1 -0
- package/dist/demo/DemoVerifyEmail-B43KlF4F.js +34 -0
- package/dist/demo/DemoVerifyEmail-B43KlF4F.js.map +1 -0
- package/dist/demo/Login-C12N4oGs.js +275 -0
- package/dist/demo/Login-C12N4oGs.js.map +1 -0
- package/dist/demo/{Profile-BE_Y3co2.js → Profile-DS5q4vOh.js} +31 -27
- package/dist/demo/Profile-DS5q4vOh.js.map +1 -0
- package/dist/demo/{Register-fXHmBpr3.js → Register-B4hLBeEv.js} +198 -142
- package/dist/demo/Register-B4hLBeEv.js.map +1 -0
- package/dist/{auth/ResetPassword-DBxt9hKk.js → demo/ResetPassword-D8g9ha1N.js} +7 -7
- package/dist/demo/ResetPassword-D8g9ha1N.js.map +1 -0
- package/dist/demo/{Showcase-BtEU0pY9.js → Showcase-D6Fxt4X4.js} +64 -65
- package/dist/demo/Showcase-D6Fxt4X4.js.map +1 -0
- package/dist/{auth/VerifyEmail-Z80Ubajk.js → demo/VerifyEmail-BjDo0cZA.js} +23 -8
- package/dist/demo/VerifyEmail-BjDo0cZA.js.map +1 -0
- package/dist/demo/{auth-Djd7SKiw.js → auth-ByVTreDl.js} +8 -8
- package/dist/demo/{auth-Djd7SKiw.js.map → auth-ByVTreDl.js.map} +1 -1
- package/dist/demo/{core-B7LNjM78.js → core-DFgB3yU4.js} +741 -573
- package/dist/demo/core-DFgB3yU4.js.map +1 -0
- package/dist/demo/index.d.ts +1 -0
- package/dist/demo/index.d.ts.map +1 -1
- package/dist/demo/index.js +24 -18
- package/dist/demo/index.js.map +1 -1
- package/package.json +7 -7
- package/src/admin/AdminRouter.tsx +24 -1
- 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/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 +10 -0
- package/src/core/components/buttons/ActionButton.tsx +104 -78
- package/src/core/components/data/DetailDrawer.tsx +102 -96
- package/src/core/components/data/DetailList.tsx +2 -1
- package/src/core/components/layout/Breadcrumb.tsx +3 -6
- 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/styles.css +12 -2
- package/src/core/table/components/ColumnPicker.tsx +3 -3
- package/src/core/table/components/DataTable.tsx +89 -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/AdminParameters-BspPeqp_.js.map +0 -1
- package/dist/admin/AdminUserLayout-DUbC6-BI.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/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/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/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
|
|
|
@@ -69,6 +69,11 @@ export interface FlexProps extends MantineFlexProps {
|
|
|
69
69
|
* Add a shadow to the container. The intensity will be determined by the current theme.
|
|
70
70
|
*/
|
|
71
71
|
shadowed?: boolean | number | string;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Set overflow to "auto" to enable scrolling when content overflows the container.
|
|
75
|
+
*/
|
|
76
|
+
overflow?: boolean;
|
|
72
77
|
}
|
|
73
78
|
|
|
74
79
|
const Flex = forwardRef<HTMLDivElement, FlexProps>((props, ref) => {
|
|
@@ -86,6 +91,7 @@ const Flex = forwardRef<HTMLDivElement, FlexProps>((props, ref) => {
|
|
|
86
91
|
borderedTop,
|
|
87
92
|
borderedBottom,
|
|
88
93
|
shadowed,
|
|
94
|
+
overflow,
|
|
89
95
|
...rest
|
|
90
96
|
} = props;
|
|
91
97
|
|
|
@@ -145,6 +151,10 @@ const Flex = forwardRef<HTMLDivElement, FlexProps>((props, ref) => {
|
|
|
145
151
|
`${rest.className ?? ""} shadow-${shadowed === true ? "md" : shadowed}`.trim();
|
|
146
152
|
}
|
|
147
153
|
|
|
154
|
+
if (overflow) {
|
|
155
|
+
rest.className = `${rest.className ?? ""} overflow-auto`.trim();
|
|
156
|
+
}
|
|
157
|
+
|
|
148
158
|
return <MantineFlex ref={ref} {...rest} />;
|
|
149
159
|
});
|
|
150
160
|
|
|
@@ -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>
|
|
@@ -564,6 +513,7 @@ const ActionNavigationButton = (props: ActionNavigationButtonProps) => {
|
|
|
564
513
|
propsActive,
|
|
565
514
|
routerGoOptions,
|
|
566
515
|
onClick: propsOnClick,
|
|
516
|
+
anchorProps: buttonAnchorProps,
|
|
567
517
|
anchor,
|
|
568
518
|
...buttonProps
|
|
569
519
|
} = props as ActionNavigationButtonProps & { onClick?: (e: any) => void };
|
|
@@ -588,13 +538,13 @@ const ActionNavigationButton = (props: ActionNavigationButtonProps) => {
|
|
|
588
538
|
buttonProps.className = `${className} ${classNameActive}`.trim();
|
|
589
539
|
}
|
|
590
540
|
|
|
591
|
-
if (
|
|
541
|
+
if (buttonAnchorProps || anchor) {
|
|
592
542
|
return (
|
|
593
543
|
<Anchor
|
|
594
544
|
component={"a"}
|
|
595
545
|
{...anchorProps}
|
|
596
546
|
{...(buttonProps as AnchorProps)}
|
|
597
|
-
{...
|
|
547
|
+
{...buttonAnchorProps}
|
|
598
548
|
onClick={combinedOnClick}
|
|
599
549
|
>
|
|
600
550
|
{props.children}
|
|
@@ -639,3 +589,79 @@ const ActionHrefButton = (props: ActionNavigationButtonProps) => {
|
|
|
639
589
|
};
|
|
640
590
|
|
|
641
591
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
592
|
+
|
|
593
|
+
// Helper function to render menu items recursively
|
|
594
|
+
const ActionMenuItem = (props: {
|
|
595
|
+
item: ActionMenuItem;
|
|
596
|
+
index: number;
|
|
597
|
+
}): ReactNode => {
|
|
598
|
+
const { item, index } = props;
|
|
599
|
+
|
|
600
|
+
const router = useRouter();
|
|
601
|
+
const action = useAction(
|
|
602
|
+
{
|
|
603
|
+
handler: async (e: any) => {
|
|
604
|
+
await item.onClick?.();
|
|
605
|
+
},
|
|
606
|
+
},
|
|
607
|
+
[item.onClick],
|
|
608
|
+
);
|
|
609
|
+
|
|
610
|
+
// Render divider
|
|
611
|
+
if (item.type === "divider") {
|
|
612
|
+
return <Menu.Divider key={index} />;
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
// Render label
|
|
616
|
+
if (item.type === "label") {
|
|
617
|
+
return <Menu.Label key={index}>{item.label}</Menu.Label>;
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
// Render submenu if it has children
|
|
621
|
+
if (item.children && item.children.length > 0) {
|
|
622
|
+
return (
|
|
623
|
+
<Menu key={index} trigger="hover" position="right-start" offset={2}>
|
|
624
|
+
<Menu.Target>
|
|
625
|
+
<Menu.Item
|
|
626
|
+
leftSection={item.icon}
|
|
627
|
+
rightSection={<IconChevronRight size={14} />}
|
|
628
|
+
>
|
|
629
|
+
{item.label}
|
|
630
|
+
</Menu.Item>
|
|
631
|
+
</Menu.Target>
|
|
632
|
+
<Menu.Dropdown>
|
|
633
|
+
{item.children.map((child, childIndex) => (
|
|
634
|
+
<ActionMenuItem item={child} index={childIndex} key={childIndex} />
|
|
635
|
+
))}
|
|
636
|
+
</Menu.Dropdown>
|
|
637
|
+
</Menu>
|
|
638
|
+
);
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
const menuItemProps: MenuItemProps & ButtonHTMLAttributes<unknown> = {};
|
|
642
|
+
if (props.item.onClick) {
|
|
643
|
+
menuItemProps.onClick = action.run;
|
|
644
|
+
} else if (props.item.href) {
|
|
645
|
+
Object.assign(menuItemProps, router.anchor(props.item.href));
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
// render regular menu item
|
|
649
|
+
return (
|
|
650
|
+
<Menu.Item
|
|
651
|
+
key={index}
|
|
652
|
+
leftSection={
|
|
653
|
+
item.icon ??
|
|
654
|
+
(item.active ? (
|
|
655
|
+
<IconCheck size={ui.sizes.icon.sm} />
|
|
656
|
+
) : (
|
|
657
|
+
<Flex w={ui.sizes.icon.sm} />
|
|
658
|
+
))
|
|
659
|
+
}
|
|
660
|
+
onClick={item.onClick}
|
|
661
|
+
color={item.color}
|
|
662
|
+
{...menuItemProps}
|
|
663
|
+
>
|
|
664
|
+
{item.label}
|
|
665
|
+
</Menu.Item>
|
|
666
|
+
);
|
|
667
|
+
};
|
|
@@ -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 (
|
|
@@ -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 Breadcrumb = ({
|
|
38
|
-
home = "Home",
|
|
39
|
-
|
|
40
|
-
size = "sm",
|
|
41
|
-
...groupProps
|
|
42
|
-
}: BreadcrumbProps) => {
|
|
37
|
+
const Breadcrumb = (props: BreadcrumbProps) => {
|
|
38
|
+
const { home = "Home", separator, size = "sm", ...groupProps } = props;
|
|
39
|
+
|
|
43
40
|
const state = useRouterState();
|
|
44
41
|
const router = useRouter();
|
|
45
42
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { alephaSidebarAtom, Flex } from "@alepha/ui";
|
|
1
|
+
import { alephaSidebarAtom, Container, Flex } from "@alepha/ui";
|
|
2
2
|
import {
|
|
3
3
|
AppShell,
|
|
4
4
|
type AppShellFooterProps,
|
|
@@ -64,10 +64,14 @@ export interface DashboardShellProps {
|
|
|
64
64
|
};
|
|
65
65
|
|
|
66
66
|
/**
|
|
67
|
-
* Wrap
|
|
68
|
-
* Pass `true` for default Container, or ContainerProps to customize.
|
|
67
|
+
* Wrap the Dashboard main content in a Mantine Container.
|
|
69
68
|
*/
|
|
70
69
|
container?: boolean | ContainerProps;
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* If true, the DashboardShell will fill the height of its container.
|
|
73
|
+
*/
|
|
74
|
+
fill?: boolean;
|
|
71
75
|
}
|
|
72
76
|
|
|
73
77
|
const DashboardShell = (props: DashboardShellProps) => {
|
|
@@ -131,6 +135,7 @@ const DashboardShell = (props: DashboardShellProps) => {
|
|
|
131
135
|
const headerHeight = hasAppBar ? hHeight : 0;
|
|
132
136
|
const footerHeight = footerElement ? fHeight : 0;
|
|
133
137
|
const navbarWidth = collapsed ? collapsedWidth : expandedWidth;
|
|
138
|
+
const mainContent = props.children ?? <NestedView />;
|
|
134
139
|
|
|
135
140
|
return (
|
|
136
141
|
<AppShell
|
|
@@ -189,9 +194,18 @@ const DashboardShell = (props: DashboardShellProps) => {
|
|
|
189
194
|
display={"flex"}
|
|
190
195
|
bg={"var(--alepha-ground)"}
|
|
191
196
|
pos={"relative"}
|
|
197
|
+
h={props.fill ? "100%" : "inherit"}
|
|
192
198
|
{...props.appShellMainProps}
|
|
193
199
|
>
|
|
194
|
-
{props.
|
|
200
|
+
{props.container ? (
|
|
201
|
+
<Container
|
|
202
|
+
{...(typeof props.container === "boolean" ? {} : props.container)}
|
|
203
|
+
>
|
|
204
|
+
{mainContent}
|
|
205
|
+
</Container>
|
|
206
|
+
) : (
|
|
207
|
+
mainContent
|
|
208
|
+
)}
|
|
195
209
|
</AppShell.Main>
|
|
196
210
|
|
|
197
211
|
{footerElement && (
|