@alepha/ui 0.17.1 → 0.18.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-CF_qOO3u.js → AdminApiKeys-C-6_Q-lH.js} +56 -192
- package/dist/admin/AdminApiKeys-C-6_Q-lH.js.map +1 -0
- package/dist/admin/{AdminAudits-BQno3hZG.js → AdminAudits-Bgbf04hO.js} +25 -61
- package/dist/admin/AdminAudits-Bgbf04hO.js.map +1 -0
- package/dist/admin/{AdminFiles-kvuUaASF.js → AdminFiles-B9a7G3cY.js} +6 -8
- package/dist/admin/AdminFiles-B9a7G3cY.js.map +1 -0
- package/dist/admin/{AdminJobDashboard-CrPxp0W1.js → AdminJobDashboard-DaTwf5OY.js} +55 -186
- package/dist/admin/AdminJobDashboard-DaTwf5OY.js.map +1 -0
- package/dist/admin/{AdminJobExecutions-D-b4Zt7W.js → AdminJobExecutions-B9cek5dl.js} +132 -168
- package/dist/admin/AdminJobExecutions-B9cek5dl.js.map +1 -0
- package/dist/admin/{AdminJobRegistry-CNX5cpDx.js → AdminJobRegistry-DFgV3oqx.js} +60 -83
- package/dist/admin/AdminJobRegistry-DFgV3oqx.js.map +1 -0
- package/dist/admin/AdminLayout-DHsvWxVB.js +70 -0
- package/dist/admin/AdminLayout-DHsvWxVB.js.map +1 -0
- package/dist/admin/{AdminParameters-iQE8o7a7.js → AdminParameters-DHw9ATgl.js} +53 -53
- package/dist/admin/AdminParameters-DHw9ATgl.js.map +1 -0
- package/dist/admin/{AdminSessions-oKJCbd7w.js → AdminSessions-BhGJPI3z.js} +11 -18
- package/dist/admin/AdminSessions-BhGJPI3z.js.map +1 -0
- package/dist/admin/{AdminUserLayout-HAlobhWf.js → AdminUserLayout-BdC4Te8m.js} +112 -151
- package/dist/admin/AdminUserLayout-BdC4Te8m.js.map +1 -0
- package/dist/admin/AdminUserProfile-DAt23fqY.js +69 -0
- package/dist/admin/AdminUserProfile-DAt23fqY.js.map +1 -0
- package/dist/admin/AdminUserSessions-1uzcx02z.js +109 -0
- package/dist/admin/AdminUserSessions-1uzcx02z.js.map +1 -0
- package/dist/admin/AdminUsers-C85c3eiQ.js +121 -0
- package/dist/admin/AdminUsers-C85c3eiQ.js.map +1 -0
- package/dist/{auth/AuthLayout-CdJcrPs4.js → admin/AuthLayout-DFJvCvzw.js} +3 -3
- package/dist/{auth/AuthLayout-CdJcrPs4.js.map → admin/AuthLayout-DFJvCvzw.js.map} +1 -1
- package/dist/{auth/IconGoogle-Bm18QD2q.js → admin/IconGoogle-CSQLPYwX.js} +1 -1
- package/dist/{auth/IconGoogle-Bm18QD2q.js.map → admin/IconGoogle-CSQLPYwX.js.map} +1 -1
- package/dist/{demo/DemoLogin-DjJ9314c.js → admin/Login-BGheURrg.js} +15 -129
- package/dist/{auth/Login-BS_FYTy0.js.map → admin/Login-BGheURrg.js.map} +1 -1
- package/dist/{auth/Profile-CjDsW378.js → admin/Profile-B-c9pCPf.js} +5 -5
- package/dist/{auth/Profile-CjDsW378.js.map → admin/Profile-B-c9pCPf.js.map} +1 -1
- package/dist/{demo/DemoRegister-DzkJ5M83.js → admin/Register-Cs10l8vX.js} +20 -146
- package/dist/{auth/Register-C5eqzAaD.js.map → admin/Register-Cs10l8vX.js.map} +1 -1
- package/dist/{demo/DemoResetPassword-DWh4_BpQ.js → admin/ResetPassword-BwDdfkGH.js} +20 -82
- package/dist/{auth/ResetPassword-XifinVao.js.map → admin/ResetPassword-BwDdfkGH.js.map} +1 -1
- package/dist/{demo/DemoVerifyEmail-DbU_tCj8.js → admin/VerifyEmail-DfXHAiQl.js} +15 -32
- package/dist/{auth/VerifyEmail-DTgbeJOO.js.map → admin/VerifyEmail-DfXHAiQl.js.map} +1 -1
- package/dist/admin/auth-Dr0Cf8I7.js +319 -0
- package/dist/admin/auth-Dr0Cf8I7.js.map +1 -0
- package/dist/admin/core-2xoLiT0o.js +4031 -0
- package/dist/admin/core-2xoLiT0o.js.map +1 -0
- package/dist/admin/index.d.ts +740 -17
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +80 -127
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/rolldown-runtime-CjeV3_4I.js +18 -0
- package/dist/auth/AuthLayout-CAE1pX9s.js +22 -0
- package/dist/auth/AuthLayout-CAE1pX9s.js.map +1 -0
- package/dist/auth/{Login-BS_FYTy0.js → Login-Denw_UGy.js} +8 -8
- package/dist/auth/Login-Denw_UGy.js.map +1 -0
- package/dist/auth/Profile-BMX_Ar_s.js +155 -0
- package/dist/auth/Profile-BMX_Ar_s.js.map +1 -0
- package/dist/auth/{Register-C5eqzAaD.js → Register-6hi_cpfF.js} +8 -8
- package/dist/auth/Register-6hi_cpfF.js.map +1 -0
- package/dist/auth/{ResetPassword-XifinVao.js → ResetPassword-CqfTk1FI.js} +6 -6
- package/dist/auth/ResetPassword-CqfTk1FI.js.map +1 -0
- package/dist/auth/{VerifyEmail-DTgbeJOO.js → VerifyEmail-nWiSTMjF.js} +5 -5
- package/dist/auth/VerifyEmail-nWiSTMjF.js.map +1 -0
- package/dist/auth/core-niW0sFLv.js +2264 -0
- package/dist/auth/core-niW0sFLv.js.map +1 -0
- package/dist/auth/index.d.ts +336 -8
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +18 -22
- package/dist/auth/index.js.map +1 -1
- package/dist/core/index.d.ts +1033 -843
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1626 -1354
- package/dist/core/index.js.map +1 -1
- package/dist/demo/AuthLayout-jLa0aKsI.js +22 -0
- package/dist/demo/AuthLayout-jLa0aKsI.js.map +1 -0
- package/dist/demo/DemoButton-BmaWZVwf.js +178 -0
- package/dist/demo/DemoButton-BmaWZVwf.js.map +1 -0
- package/dist/demo/{DemoDataTable-lnBKWBf8.js → DemoDataTable-Z9xyV221.js} +18 -18
- package/dist/demo/DemoDataTable-Z9xyV221.js.map +1 -0
- package/dist/demo/DemoDialog-4ItHLf9t.js +101 -0
- package/dist/demo/DemoDialog-4ItHLf9t.js.map +1 -0
- package/dist/demo/DemoFlex-EtVq8QfX.js +105 -0
- package/dist/demo/DemoFlex-EtVq8QfX.js.map +1 -0
- package/dist/demo/DemoHeading-BS-vGfkI.js +18 -0
- package/dist/demo/DemoHeading-BS-vGfkI.js.map +1 -0
- package/dist/demo/{DemoHome-CUMZsYaH.js → DemoHome-Clbn8AmS.js} +9 -12
- package/dist/demo/DemoHome-Clbn8AmS.js.map +1 -0
- package/dist/demo/DemoJsonViewer-DkIX_ky2.js +109 -0
- package/dist/demo/DemoJsonViewer-DkIX_ky2.js.map +1 -0
- package/dist/demo/DemoLayout-C56xb5EE.js +73 -0
- package/dist/demo/DemoLayout-C56xb5EE.js.map +1 -0
- package/dist/demo/DemoLogin-BZwpicOS.js +128 -0
- package/dist/demo/DemoLogin-BZwpicOS.js.map +1 -0
- package/dist/demo/DemoRegister-C7_qc4MJ.js +140 -0
- package/dist/demo/DemoRegister-C7_qc4MJ.js.map +1 -0
- package/dist/demo/DemoResetPassword-BI1Ct4Dw.js +76 -0
- package/dist/demo/DemoResetPassword-BI1Ct4Dw.js.map +1 -0
- package/dist/demo/{DemoSidebar-C1csnGhX.js → DemoSidebar-CcBo4ltC.js} +6 -9
- package/dist/demo/DemoSidebar-CcBo4ltC.js.map +1 -0
- package/dist/demo/DemoText-CzXuUn3g.js +124 -0
- package/dist/demo/DemoText-CzXuUn3g.js.map +1 -0
- package/dist/demo/DemoToast-BgHDhWrX.js +95 -0
- package/dist/demo/DemoToast-BgHDhWrX.js.map +1 -0
- package/dist/demo/{DemoTypeForm-CWz6fJrJ.js → DemoTypeForm-DDzWoMSV.js} +4 -4
- package/dist/demo/{DemoTypeForm-CWz6fJrJ.js.map → DemoTypeForm-DDzWoMSV.js.map} +1 -1
- package/dist/demo/DemoVerifyEmail-C_Irdnov.js +30 -0
- package/dist/demo/DemoVerifyEmail-C_Irdnov.js.map +1 -0
- package/dist/demo/IconGoogle-CSQLPYwX.js +56 -0
- package/dist/demo/IconGoogle-CSQLPYwX.js.map +1 -0
- package/dist/demo/Login-hSOU3jZc.js +219 -0
- package/dist/demo/Login-hSOU3jZc.js.map +1 -0
- package/dist/demo/Profile-CWqti7FB.js +155 -0
- package/dist/demo/Profile-CWqti7FB.js.map +1 -0
- package/dist/demo/Register-a70LPgs2.js +375 -0
- package/dist/demo/Register-a70LPgs2.js.map +1 -0
- package/dist/demo/ResetPassword-DWN0lzr5.js +286 -0
- package/dist/demo/ResetPassword-DWN0lzr5.js.map +1 -0
- package/dist/demo/Showcase-Dq3MISpd.js +232 -0
- package/dist/demo/Showcase-Dq3MISpd.js.map +1 -0
- package/dist/demo/VerifyEmail-DZWL72K4.js +135 -0
- package/dist/demo/VerifyEmail-DZWL72K4.js.map +1 -0
- package/dist/demo/auth-d6n3xbug.js +257 -0
- package/dist/demo/auth-d6n3xbug.js.map +1 -0
- package/dist/demo/core-RCUw1Q-a.js +4217 -0
- package/dist/demo/core-RCUw1Q-a.js.map +1 -0
- package/dist/demo/index.d.ts +17 -6
- package/dist/demo/index.d.ts.map +1 -1
- package/dist/demo/index.js +92 -24
- package/dist/demo/index.js.map +1 -1
- package/dist/demo/rolldown-runtime-CjeV3_4I.js +18 -0
- package/package.json +16 -20
- package/src/admin/AdminRouter.ts +12 -61
- package/src/admin/components/AdminLayout.tsx +42 -10
- package/src/admin/components/audits/AdminAudits.tsx +10 -64
- package/src/admin/components/files/AdminFiles.tsx +2 -3
- package/src/admin/components/jobs/AdminJobDashboard.tsx +36 -142
- package/src/admin/components/jobs/AdminJobExecutions.tsx +117 -175
- package/src/admin/components/jobs/AdminJobRegistry.tsx +58 -73
- package/src/admin/components/keys/AdminApiKeys.tsx +21 -169
- package/src/admin/components/parameters/AdminParameters.tsx +4 -4
- package/src/admin/components/parameters/ParameterEmptyState.tsx +1 -2
- package/src/admin/components/parameters/ParameterHistory.tsx +3 -3
- package/src/admin/components/parameters/ParameterTree.tsx +2 -8
- package/src/admin/components/parameters/types.ts +3 -3
- package/src/admin/components/sessions/AdminSessions.tsx +8 -16
- package/src/admin/components/users/AdminUserLayout.tsx +113 -150
- package/src/admin/components/users/AdminUserProfile.tsx +50 -0
- package/src/admin/components/users/AdminUserSessions.tsx +106 -126
- package/src/admin/components/users/AdminUsers.tsx +46 -62
- package/src/admin/index.ts +1 -5
- package/src/auth/components/buttons/UserButton.tsx +1 -1
- package/src/auth/index.ts +0 -4
- package/src/core/UiRouter.ts +1 -1
- package/src/core/atoms/alephaSidebarAtom.ts +7 -31
- package/src/core/components/{layout/AlephaMantineProvider.tsx → AlephaMantineProvider.tsx} +3 -4
- package/src/core/components/Flex.tsx +63 -0
- package/src/core/components/Heading.tsx +19 -0
- package/src/core/components/Text.tsx +140 -0
- package/src/core/components/buttons/ActionButton.tsx +12 -1
- package/src/core/components/buttons/BurgerButton.tsx +3 -3
- package/src/core/components/buttons/LanguageButton.tsx +1 -1
- package/src/core/components/buttons/ToggleSidebarButton.tsx +1 -4
- package/src/core/components/data/DetailDrawer.tsx +144 -0
- package/src/core/components/data/DetailList.tsx +64 -0
- package/src/core/components/data/StatCards.tsx +50 -0
- package/src/core/components/layout/AppBar.tsx +11 -10
- package/src/core/components/layout/Breadcrumb.tsx +8 -8
- package/src/core/components/layout/Container.tsx +15 -0
- package/src/core/components/layout/DashboardShell.tsx +23 -238
- package/src/core/components/layout/Omnibar.tsx +1 -2
- package/src/core/components/layout/Sidebar.tsx +103 -71
- package/src/core/components/layout/index.ts +65 -0
- package/src/core/{components/form → form/components}/Control.tsx +32 -14
- package/src/core/{components/form → form/components}/ControlArray.tsx +2 -5
- package/src/core/{components/form → form/components}/ControlDate.tsx +1 -4
- package/src/core/{components/form → form/components}/ControlNumber.tsx +1 -4
- package/src/core/{components/form → form/components}/ControlObject.tsx +1 -4
- package/src/core/{components/form → form/components}/ControlQueryBuilder.tsx +7 -7
- package/src/core/{components/form → form/components}/ControlSelect.tsx +2 -4
- package/src/core/{components/form → form/components}/TypeForm.browser.spec.tsx +22 -64
- package/src/core/{components/form → form/components}/TypeForm.tsx +1 -3
- package/src/core/form/factories/dialogForm.tsx +31 -0
- package/src/core/form/index.ts +23 -0
- package/src/core/{utils → form/utils}/parseInput.ts +2 -4
- package/src/core/index.ts +43 -51
- package/src/core/interfaces/AlephaIntent.ts +6 -0
- package/src/core/interfaces/AlephaTheme.ts +0 -1
- package/src/core/json/factories/dialogJson.tsx +24 -0
- package/src/core/json/index.ts +2 -0
- package/src/core/primitives/$ui.ts +17 -0
- package/src/core/services/DialogService.tsx +1 -48
- package/src/core/styles.css +1 -8
- package/src/core/{components/table → table/components}/ColumnPicker.tsx +2 -3
- package/src/core/{components/table → table/components}/DataTable.tsx +8 -9
- package/src/core/{components/table → table/components}/DataTableFilters.tsx +6 -3
- package/src/core/{components/table → table/components}/DataTableToolbar.tsx +4 -5
- package/src/core/{components/table → table/components}/FilterPicker.tsx +2 -3
- package/src/core/table/index.ts +12 -0
- package/src/core/{components/table → table/interfaces}/types.ts +2 -2
- package/src/demo/DemoRouter.ts +87 -6
- package/src/demo/components/DemoHome.tsx +6 -10
- package/src/demo/components/DemoLayout.tsx +38 -8
- package/src/demo/components/auth/DemoLogin.tsx +1 -1
- package/src/demo/components/auth/DemoRegister.tsx +1 -1
- package/src/demo/components/auth/DemoResetPassword.tsx +1 -1
- package/src/demo/components/auth/DemoVerifyEmail.tsx +1 -1
- package/src/demo/components/core/DemoButton.tsx +160 -0
- package/src/demo/components/core/DemoFlex.tsx +101 -0
- package/src/demo/components/core/DemoHeading.tsx +13 -0
- package/src/demo/components/core/DemoText.tsx +110 -0
- package/src/demo/components/json/DemoJsonViewer.tsx +1 -1
- package/src/demo/components/layout/DemoDialog.tsx +103 -0
- package/src/demo/components/{core → layout}/DemoSidebar.tsx +0 -1
- package/src/demo/components/layout/DemoToast.tsx +96 -0
- package/src/demo/components/shared/MacWindow.tsx +149 -74
- package/src/demo/components/shared/Showcase.tsx +4 -8
- package/src/demo/index.ts +1 -4
- package/src/demo/primitives/$uiDemo.ts +10 -0
- package/dist/admin/AdminApiKeys-CF_qOO3u.js.map +0 -1
- package/dist/admin/AdminAudits-BQno3hZG.js.map +0 -1
- package/dist/admin/AdminFiles-kvuUaASF.js.map +0 -1
- package/dist/admin/AdminJobDashboard-CrPxp0W1.js.map +0 -1
- package/dist/admin/AdminJobExecutions-D-b4Zt7W.js.map +0 -1
- package/dist/admin/AdminJobRegistry-CNX5cpDx.js.map +0 -1
- package/dist/admin/AdminLayout-e-ZP5nWw.js +0 -37
- package/dist/admin/AdminLayout-e-ZP5nWw.js.map +0 -1
- package/dist/admin/AdminNotifications-DeHJFf6W.js +0 -153
- package/dist/admin/AdminNotifications-DeHJFf6W.js.map +0 -1
- package/dist/admin/AdminParameters-iQE8o7a7.js.map +0 -1
- package/dist/admin/AdminSessions-oKJCbd7w.js.map +0 -1
- package/dist/admin/AdminUserAudits-BNCEle_E.js +0 -177
- package/dist/admin/AdminUserAudits-BNCEle_E.js.map +0 -1
- package/dist/admin/AdminUserCreate-CgqeFwCt.js +0 -104
- package/dist/admin/AdminUserCreate-CgqeFwCt.js.map +0 -1
- package/dist/admin/AdminUserDetails-DDe1A1GP.js +0 -477
- package/dist/admin/AdminUserDetails-DDe1A1GP.js.map +0 -1
- package/dist/admin/AdminUserLayout-HAlobhWf.js.map +0 -1
- package/dist/admin/AdminUserSessions-Bq1LnVLf.js +0 -129
- package/dist/admin/AdminUserSessions-Bq1LnVLf.js.map +0 -1
- package/dist/admin/AdminUserSettings-BRsBZoxV.js +0 -167
- package/dist/admin/AdminUserSettings-BRsBZoxV.js.map +0 -1
- package/dist/admin/AdminUsers-D71kIOSn.js +0 -118
- package/dist/admin/AdminUsers-D71kIOSn.js.map +0 -1
- package/dist/demo/DemoDataTable-lnBKWBf8.js.map +0 -1
- package/dist/demo/DemoHome-CUMZsYaH.js.map +0 -1
- package/dist/demo/DemoJsonViewer-_uokbGaW.js +0 -429
- package/dist/demo/DemoJsonViewer-_uokbGaW.js.map +0 -1
- package/dist/demo/DemoLayout-DHVoacE6.js +0 -46
- package/dist/demo/DemoLayout-DHVoacE6.js.map +0 -1
- package/dist/demo/DemoLogin-DjJ9314c.js.map +0 -1
- package/dist/demo/DemoRegister-DzkJ5M83.js.map +0 -1
- package/dist/demo/DemoResetPassword-DWh4_BpQ.js.map +0 -1
- package/dist/demo/DemoSidebar-C1csnGhX.js.map +0 -1
- package/dist/demo/DemoVerifyEmail-DbU_tCj8.js.map +0 -1
- package/dist/demo/Showcase-BzoXNlCn.js +0 -185
- package/dist/demo/Showcase-BzoXNlCn.js.map +0 -1
- package/dist/json/index.d.ts +0 -57
- package/dist/json/index.d.ts.map +0 -1
- package/dist/json/index.js +0 -325
- package/dist/json/index.js.map +0 -1
- package/src/admin/components/notifications/AdminNotifications.tsx +0 -204
- package/src/admin/components/users/AdminUserAudits.tsx +0 -184
- package/src/admin/components/users/AdminUserCreate.tsx +0 -85
- package/src/admin/components/users/AdminUserDetails.tsx +0 -431
- package/src/admin/components/users/AdminUserSettings.tsx +0 -171
- package/src/core/components/data/ErrorViewer.tsx +0 -171
- package/src/json/extensions/DialogService.tsx +0 -31
- package/src/json/index.ts +0 -18
- package/src/json/styles.css +0 -1
- /package/dist/{demo → auth}/IconGoogle-Ch1m3Uzl.js +0 -0
- /package/dist/{demo → auth}/IconGoogle-Ch1m3Uzl.js.map +0 -0
- /package/src/{json → core/json}/components/JsonViewer.css +0 -0
- /package/src/{json → core/json}/components/JsonViewer.tsx +0 -0
- /package/src/core/{components/table → table/components}/DataTablePagination.tsx +0 -0
- /package/src/core/{components/table → table/components}/useTableSelection.ts +0 -0
|
@@ -1,31 +1,51 @@
|
|
|
1
|
-
import { DataTable, Text } from "@alepha/ui";
|
|
2
|
-
import { Badge
|
|
3
|
-
import { IconCheck, IconUsersPlus, IconX } from "@tabler/icons-react";
|
|
1
|
+
import { DataTable, Flex, Text, useDialog, useToast } from "@alepha/ui";
|
|
2
|
+
import { Badge } from "@mantine/core";
|
|
4
3
|
import { type Page, t } from "alepha";
|
|
5
|
-
import {
|
|
6
|
-
type AdminUserController,
|
|
7
|
-
type UserEntity,
|
|
8
|
-
users,
|
|
9
|
-
} from "alepha/api/users";
|
|
4
|
+
import type { AdminUserController, UserEntity } from "alepha/api/users";
|
|
10
5
|
import { useClient } from "alepha/react";
|
|
11
6
|
import { useI18n } from "alepha/react/i18n";
|
|
12
7
|
import { useRouter } from "alepha/react/router";
|
|
8
|
+
import { useState } from "react";
|
|
13
9
|
import type { AdminRouter } from "../../AdminRouter.ts";
|
|
14
10
|
|
|
15
11
|
export interface AdminUsersProps {
|
|
16
12
|
userRealmName?: string;
|
|
17
13
|
}
|
|
18
14
|
|
|
15
|
+
const createUserSchema = t.object({
|
|
16
|
+
username: t.optional(
|
|
17
|
+
t.shortText({
|
|
18
|
+
minLength: 3,
|
|
19
|
+
maxLength: 50,
|
|
20
|
+
pattern: "^[a-zA-Z0-9._-]+$",
|
|
21
|
+
}),
|
|
22
|
+
),
|
|
23
|
+
email: t.optional(t.email()),
|
|
24
|
+
phoneNumber: t.optional(t.e164()),
|
|
25
|
+
firstName: t.optional(t.string()),
|
|
26
|
+
lastName: t.optional(t.string()),
|
|
27
|
+
roles: t.optional(t.array(t.string())),
|
|
28
|
+
enabled: t.optional(t.boolean()),
|
|
29
|
+
password: t.optional(t.string({ minLength: 8 })),
|
|
30
|
+
});
|
|
31
|
+
|
|
19
32
|
const AdminUsers = (props: AdminUsersProps) => {
|
|
20
33
|
const client = useClient<AdminUserController>();
|
|
21
34
|
const router = useRouter<AdminRouter>();
|
|
22
35
|
const { l } = useI18n();
|
|
36
|
+
const dialog = useDialog();
|
|
37
|
+
const toast = useToast();
|
|
38
|
+
const [refreshKey, setRefreshKey] = useState(0);
|
|
23
39
|
|
|
24
40
|
const filters = t.object({
|
|
25
41
|
query: t.optional(
|
|
26
42
|
t.string({
|
|
27
43
|
$control: {
|
|
28
|
-
query: t.
|
|
44
|
+
query: t.object({
|
|
45
|
+
email: t.optional(t.email()),
|
|
46
|
+
enabled: t.optional(t.boolean()),
|
|
47
|
+
emailVerified: t.optional(t.boolean()),
|
|
48
|
+
}),
|
|
29
49
|
},
|
|
30
50
|
}),
|
|
31
51
|
),
|
|
@@ -34,14 +54,8 @@ const AdminUsers = (props: AdminUsersProps) => {
|
|
|
34
54
|
return (
|
|
35
55
|
<Flex flex={1} direction="column">
|
|
36
56
|
<DataTable<UserEntity, typeof filters>
|
|
57
|
+
key={refreshKey}
|
|
37
58
|
submitOnInit
|
|
38
|
-
actions={[
|
|
39
|
-
{
|
|
40
|
-
icon: IconUsersPlus,
|
|
41
|
-
href: router.path("adminUserCreate"),
|
|
42
|
-
label: "Create User",
|
|
43
|
-
},
|
|
44
|
-
]}
|
|
45
59
|
defaultSize={10}
|
|
46
60
|
typeFormProps={{
|
|
47
61
|
skipSubmitButton: true,
|
|
@@ -53,27 +67,22 @@ const AdminUsers = (props: AdminUsersProps) => {
|
|
|
53
67
|
striped: false,
|
|
54
68
|
highlightOnHover: true,
|
|
55
69
|
}}
|
|
56
|
-
onFilterChange={(key,
|
|
70
|
+
onFilterChange={(key, _value, form) => {
|
|
57
71
|
if (key === "query") {
|
|
58
72
|
return form.submit();
|
|
59
73
|
}
|
|
60
74
|
}}
|
|
61
75
|
filters={filters}
|
|
62
|
-
tableTrProps={(item) => {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
baseProps.opacity = 0.5;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
return baseProps;
|
|
76
|
-
}}
|
|
76
|
+
tableTrProps={(item) => ({
|
|
77
|
+
style: {
|
|
78
|
+
cursor: "pointer",
|
|
79
|
+
opacity: item.enabled ? 1 : 0.5,
|
|
80
|
+
},
|
|
81
|
+
onClick: () =>
|
|
82
|
+
router.push("adminUserProfile", {
|
|
83
|
+
params: { userId: item.id },
|
|
84
|
+
}),
|
|
85
|
+
})}
|
|
77
86
|
items={async (filters) => {
|
|
78
87
|
const response = await client.findUsers({
|
|
79
88
|
query: {
|
|
@@ -81,7 +90,6 @@ const AdminUsers = (props: AdminUsersProps) => {
|
|
|
81
90
|
userRealmName: props.userRealmName,
|
|
82
91
|
},
|
|
83
92
|
});
|
|
84
|
-
|
|
85
93
|
return response as Page<UserEntity>;
|
|
86
94
|
}}
|
|
87
95
|
columns={{
|
|
@@ -89,40 +97,20 @@ const AdminUsers = (props: AdminUsersProps) => {
|
|
|
89
97
|
label: "Username",
|
|
90
98
|
value: (item) => (
|
|
91
99
|
<Text size="sm" fw={500}>
|
|
92
|
-
{item.username || "
|
|
100
|
+
{item.username || "\u2014"}
|
|
93
101
|
</Text>
|
|
94
102
|
),
|
|
95
103
|
},
|
|
96
104
|
email: {
|
|
97
105
|
label: "Email",
|
|
98
|
-
value: (item) =>
|
|
99
|
-
<Flex gap="xs">
|
|
100
|
-
<Text size="sm">{item.email || "-"}</Text>
|
|
101
|
-
{item.email && (
|
|
102
|
-
<Badge
|
|
103
|
-
size="xs"
|
|
104
|
-
variant="light"
|
|
105
|
-
color={item.emailVerified ? "green" : "gray"}
|
|
106
|
-
leftSection={
|
|
107
|
-
item.emailVerified ? (
|
|
108
|
-
<IconCheck size={10} />
|
|
109
|
-
) : (
|
|
110
|
-
<IconX size={10} />
|
|
111
|
-
)
|
|
112
|
-
}
|
|
113
|
-
>
|
|
114
|
-
{item.emailVerified ? "Verified" : "Unverified"}
|
|
115
|
-
</Badge>
|
|
116
|
-
)}
|
|
117
|
-
</Flex>
|
|
118
|
-
),
|
|
106
|
+
value: (item) => <Text size="sm">{item.email || "\u2014"}</Text>,
|
|
119
107
|
},
|
|
120
108
|
roles: {
|
|
121
109
|
label: "Roles",
|
|
122
110
|
value: (item) => (
|
|
123
111
|
<Flex gap={4}>
|
|
124
112
|
{item.roles.map((role: string) => (
|
|
125
|
-
<Badge key={role} size="xs" variant="
|
|
113
|
+
<Badge key={role} size="xs" variant="default">
|
|
126
114
|
{role}
|
|
127
115
|
</Badge>
|
|
128
116
|
))}
|
|
@@ -133,13 +121,9 @@ const AdminUsers = (props: AdminUsersProps) => {
|
|
|
133
121
|
label: "Status",
|
|
134
122
|
fit: true,
|
|
135
123
|
value: (item) => (
|
|
136
|
-
<
|
|
137
|
-
size="sm"
|
|
138
|
-
variant="light"
|
|
139
|
-
color={item.enabled ? "green" : "red"}
|
|
140
|
-
>
|
|
124
|
+
<Text size="sm" c="dimmed">
|
|
141
125
|
{item.enabled ? "Active" : "Disabled"}
|
|
142
|
-
</
|
|
126
|
+
</Text>
|
|
143
127
|
),
|
|
144
128
|
},
|
|
145
129
|
createdAt: {
|
package/src/admin/index.ts
CHANGED
|
@@ -11,10 +11,6 @@ export * from "./primitives/$uiAdmin.ts";
|
|
|
11
11
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
|
-
* | Stability | Since | Runtime |
|
|
15
|
-
* |-----------|-------|---------|
|
|
16
|
-
* | 2 - beta | 0.12.0 | node, bun, workerd, browser|
|
|
17
|
-
*
|
|
18
14
|
* Admin panel UI components.
|
|
19
15
|
*
|
|
20
16
|
* **Features:**
|
|
@@ -22,7 +18,7 @@ export * from "./primitives/$uiAdmin.ts";
|
|
|
22
18
|
* - AdminUsers with user list, create, details, settings, sessions, audits
|
|
23
19
|
* - AdminFiles for file management
|
|
24
20
|
* - AdminJobs for job monitoring
|
|
25
|
-
|
|
21
|
+
|
|
26
22
|
* - AdminParameters for configuration management
|
|
27
23
|
* - AdminSessions for session management
|
|
28
24
|
* - AdminAudits for audit log viewing
|
package/src/auth/index.ts
CHANGED
|
@@ -19,10 +19,6 @@ export * from "./primitives/$uiAuth.ts";
|
|
|
19
19
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
20
20
|
|
|
21
21
|
/**
|
|
22
|
-
* | Stability | Since | Runtime |
|
|
23
|
-
* |-----------|-------|---------|
|
|
24
|
-
* | 2 - beta | 0.12.0 | node, bun, workerd, browser|
|
|
25
|
-
*
|
|
26
22
|
* Authentication UI components.
|
|
27
23
|
*
|
|
28
24
|
* **Features:**
|
package/src/core/UiRouter.ts
CHANGED
|
@@ -4,53 +4,29 @@ export const alephaSidebarAtom = $atom({
|
|
|
4
4
|
name: "alepha.ui.sidebar",
|
|
5
5
|
schema: t.object({
|
|
6
6
|
/**
|
|
7
|
-
* Whether the sidebar is
|
|
7
|
+
* Whether the sidebar drawer is closed (mobile).
|
|
8
8
|
*/
|
|
9
|
-
|
|
9
|
+
closed: t.boolean(),
|
|
10
10
|
/**
|
|
11
|
-
* Whether the sidebar is collapsed (
|
|
11
|
+
* Whether the sidebar is collapsed (desktop icon-only mode).
|
|
12
12
|
*/
|
|
13
13
|
collapsed: t.boolean(),
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
15
|
+
* Width of the sidebar when expanded.
|
|
16
16
|
* @default 300
|
|
17
17
|
*/
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Default width used when expanding from collapsed state or on hover.
|
|
21
|
-
* @default 300
|
|
22
|
-
*/
|
|
23
|
-
defaultWidth: t.number(),
|
|
18
|
+
expandedWidth: t.number(),
|
|
24
19
|
/**
|
|
25
20
|
* Width of the sidebar when collapsed.
|
|
26
21
|
* @default 78
|
|
27
22
|
*/
|
|
28
23
|
collapsedWidth: t.number(),
|
|
29
|
-
/**
|
|
30
|
-
* Maximum width when resizing.
|
|
31
|
-
* @default 500
|
|
32
|
-
*/
|
|
33
|
-
maxWidth: t.number(),
|
|
34
|
-
/**
|
|
35
|
-
* Minimum width before auto-collapse triggers.
|
|
36
|
-
* @default 150
|
|
37
|
-
*/
|
|
38
|
-
collapseThreshold: t.number(),
|
|
39
|
-
/**
|
|
40
|
-
* Delay in ms before sidebar expands on hover when collapsed.
|
|
41
|
-
* @default 300
|
|
42
|
-
*/
|
|
43
|
-
hoverDelay: t.number(),
|
|
44
24
|
}),
|
|
45
25
|
default: {
|
|
46
|
-
|
|
26
|
+
closed: true,
|
|
47
27
|
collapsed: false,
|
|
48
|
-
|
|
49
|
-
defaultWidth: 300,
|
|
28
|
+
expandedWidth: 300,
|
|
50
29
|
collapsedWidth: 78,
|
|
51
|
-
maxWidth: 500,
|
|
52
|
-
collapseThreshold: 240,
|
|
53
|
-
hoverDelay: 300,
|
|
54
30
|
},
|
|
55
31
|
});
|
|
56
32
|
|
|
@@ -13,9 +13,9 @@ import { useEvents } from "alepha/react";
|
|
|
13
13
|
import { FormValidationError } from "alepha/react/form";
|
|
14
14
|
import { NestedView } from "alepha/react/router";
|
|
15
15
|
import type { ReactNode } from "react";
|
|
16
|
-
import { useTheme } from "
|
|
17
|
-
import { useToast } from "
|
|
18
|
-
import Omnibar, { type OmnibarProps } from "./Omnibar.tsx";
|
|
16
|
+
import { useTheme } from "../hooks/useTheme.ts";
|
|
17
|
+
import { useToast } from "../hooks/useToast.ts";
|
|
18
|
+
import Omnibar, { type OmnibarProps } from "./layout/Omnibar.tsx";
|
|
19
19
|
|
|
20
20
|
export interface AlephaMantineProviderProps {
|
|
21
21
|
children?: ReactNode;
|
|
@@ -72,7 +72,6 @@ const AlephaMantineProvider = (props: AlephaMantineProviderProps) => {
|
|
|
72
72
|
{...props.mantine}
|
|
73
73
|
defaultColorScheme={defaultColorScheme}
|
|
74
74
|
theme={{
|
|
75
|
-
cursorType: "pointer",
|
|
76
75
|
// Spread all theme properties from the selected theme
|
|
77
76
|
...theme,
|
|
78
77
|
// User overrides take precedence
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Flex as MantineFlex,
|
|
3
|
+
type FlexProps as MantineFlexProps,
|
|
4
|
+
} from "@mantine/core";
|
|
5
|
+
import { forwardRef } from "react";
|
|
6
|
+
|
|
7
|
+
export interface FlexProps extends MantineFlexProps {
|
|
8
|
+
/**
|
|
9
|
+
* flex: 1 — fill available space.
|
|
10
|
+
*/
|
|
11
|
+
fill?: boolean;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Shorthand for align="center" + justify="center".
|
|
15
|
+
*/
|
|
16
|
+
center?: boolean;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Shorthand for justify="center".
|
|
20
|
+
*/
|
|
21
|
+
centerX?: boolean;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Shorthand for align="center".
|
|
25
|
+
*/
|
|
26
|
+
centerY?: boolean;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Shorthand for direction="column".
|
|
30
|
+
*/
|
|
31
|
+
col?: boolean;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const Flex = forwardRef<HTMLDivElement, FlexProps>((props, ref) => {
|
|
35
|
+
const { fill, center, centerX, centerY, col, ...rest } = props;
|
|
36
|
+
|
|
37
|
+
if (fill) {
|
|
38
|
+
rest.flex ??= 1;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (col) {
|
|
42
|
+
rest.direction ??= "column";
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (center) {
|
|
46
|
+
rest.align ??= "center";
|
|
47
|
+
rest.justify ??= "center";
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (centerX) {
|
|
51
|
+
rest.justify ??= "center";
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (centerY) {
|
|
55
|
+
rest.align ??= "center";
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return <MantineFlex ref={ref} {...rest} />;
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
Flex.displayName = "Flex";
|
|
62
|
+
|
|
63
|
+
export default Flex;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { AlephaIntent } from "../interfaces/AlephaIntent.ts";
|
|
3
|
+
|
|
4
|
+
export type HeadingProps = {
|
|
5
|
+
title: string | ReactNode;
|
|
6
|
+
description?: string | ReactNode;
|
|
7
|
+
icon?: ReactNode;
|
|
8
|
+
intent?: AlephaIntent;
|
|
9
|
+
loading?: boolean;
|
|
10
|
+
ellipsis?: boolean;
|
|
11
|
+
fill?: boolean;
|
|
12
|
+
tag?: string | ReactNode;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const Heading = (props: HeadingProps) => {
|
|
16
|
+
return <h1>Heading</h1>;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export default Heading;
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Text as MantineText,
|
|
3
|
+
type TextProps as MantineTextProps,
|
|
4
|
+
} from "@mantine/core";
|
|
5
|
+
import { forwardRef, type ReactNode } from "react";
|
|
6
|
+
import type { AlephaIntent } from "../interfaces/AlephaIntent.ts";
|
|
7
|
+
|
|
8
|
+
export interface TextProps extends MantineTextProps {
|
|
9
|
+
children?: ReactNode;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Semantic color intent for the text.
|
|
13
|
+
*/
|
|
14
|
+
intent?: AlephaIntent;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Shorthand for fw={700}.
|
|
18
|
+
*/
|
|
19
|
+
bold?: boolean;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Shorthand for fs="italic".
|
|
23
|
+
*/
|
|
24
|
+
italic?: boolean;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Shorthand for fw={300}.
|
|
28
|
+
*/
|
|
29
|
+
light?: boolean;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Shorthand for c="dimmed".
|
|
33
|
+
*/
|
|
34
|
+
muted?: boolean;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Shorthand for size="sm".
|
|
38
|
+
*/
|
|
39
|
+
small?: boolean;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Shorthand for tt="uppercase".
|
|
43
|
+
*/
|
|
44
|
+
uppercase?: boolean;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Shorthand for tt="capitalize".
|
|
48
|
+
*/
|
|
49
|
+
capitalize?: boolean;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Shorthand for ta="center".
|
|
53
|
+
*/
|
|
54
|
+
center?: boolean;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Shorthand for ff="monospace".
|
|
58
|
+
*/
|
|
59
|
+
monospace?: boolean;
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Text with title styles (larger font size, bolder weight).
|
|
63
|
+
*/
|
|
64
|
+
title?: boolean;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const INTENT_COLORS: Record<AlephaIntent, string> = {
|
|
68
|
+
primary: "blue",
|
|
69
|
+
info: "cyan",
|
|
70
|
+
success: "green",
|
|
71
|
+
warning: "yellow",
|
|
72
|
+
danger: "red",
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const Text = forwardRef<HTMLParagraphElement, TextProps>((props, ref) => {
|
|
76
|
+
const {
|
|
77
|
+
intent,
|
|
78
|
+
bold,
|
|
79
|
+
italic,
|
|
80
|
+
light,
|
|
81
|
+
muted,
|
|
82
|
+
small,
|
|
83
|
+
uppercase,
|
|
84
|
+
capitalize,
|
|
85
|
+
center,
|
|
86
|
+
monospace,
|
|
87
|
+
title,
|
|
88
|
+
...rest
|
|
89
|
+
} = props;
|
|
90
|
+
|
|
91
|
+
if (intent) {
|
|
92
|
+
rest.c ??= INTENT_COLORS[intent];
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (bold) {
|
|
96
|
+
rest.fw ??= 700;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (light) {
|
|
100
|
+
rest.fw ??= 300;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (italic) {
|
|
104
|
+
rest.fs ??= "italic";
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (muted) {
|
|
108
|
+
rest.c ??= "dimmed";
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (small) {
|
|
112
|
+
rest.size ??= "sm";
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (uppercase) {
|
|
116
|
+
rest.tt ??= "uppercase";
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (capitalize) {
|
|
120
|
+
rest.tt ??= "capitalize";
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (center) {
|
|
124
|
+
rest.ta ??= "center";
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (monospace) {
|
|
128
|
+
rest.ff ??= "monospace";
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (title) {
|
|
132
|
+
rest.size ??= "xl";
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return <MantineText ref={ref} {...rest} />;
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
Text.displayName = "Text";
|
|
139
|
+
|
|
140
|
+
export default Text;
|
|
@@ -328,6 +328,7 @@ const ActionButton = (_props: ActionProps) => {
|
|
|
328
328
|
|
|
329
329
|
delete (restProps as any).classNameActive;
|
|
330
330
|
delete (restProps as any).variantActive;
|
|
331
|
+
delete (restProps as any).propsActive;
|
|
331
332
|
|
|
332
333
|
if ("action" in restProps && restProps.action) {
|
|
333
334
|
return (
|
|
@@ -550,8 +551,10 @@ export interface ActionNavigationButtonProps extends ButtonProps {
|
|
|
550
551
|
routerGoOptions?: RouterPushOptions;
|
|
551
552
|
classNameActive?: string;
|
|
552
553
|
variantActive?: ButtonProps["variant"];
|
|
554
|
+
propsActive?: ButtonProps;
|
|
553
555
|
target?: string;
|
|
554
556
|
anchorProps?: AnchorProps;
|
|
557
|
+
anchor?: boolean;
|
|
555
558
|
}
|
|
556
559
|
|
|
557
560
|
/**
|
|
@@ -562,8 +565,10 @@ const ActionNavigationButton = (props: ActionNavigationButtonProps) => {
|
|
|
562
565
|
active: options,
|
|
563
566
|
classNameActive,
|
|
564
567
|
variantActive,
|
|
568
|
+
propsActive,
|
|
565
569
|
routerGoOptions,
|
|
566
570
|
onClick: propsOnClick,
|
|
571
|
+
anchor,
|
|
567
572
|
...buttonProps
|
|
568
573
|
} = props as ActionNavigationButtonProps & { onClick?: (e: any) => void };
|
|
569
574
|
const router = useRouter();
|
|
@@ -572,6 +577,10 @@ const ActionNavigationButton = (props: ActionNavigationButtonProps) => {
|
|
|
572
577
|
);
|
|
573
578
|
const anchorProps = router.anchor(props.href, routerGoOptions);
|
|
574
579
|
|
|
580
|
+
if (propsActive && isActive) {
|
|
581
|
+
Object.assign(buttonProps, propsActive);
|
|
582
|
+
}
|
|
583
|
+
|
|
575
584
|
// Combine passed onClick with router's onClick
|
|
576
585
|
const combinedOnClick = (e: React.MouseEvent<HTMLAnchorElement>) => {
|
|
577
586
|
propsOnClick?.(e as any);
|
|
@@ -583,11 +592,12 @@ const ActionNavigationButton = (props: ActionNavigationButtonProps) => {
|
|
|
583
592
|
buttonProps.className = `${className} ${classNameActive}`.trim();
|
|
584
593
|
}
|
|
585
594
|
|
|
586
|
-
if (props.anchorProps) {
|
|
595
|
+
if (props.anchorProps || anchor) {
|
|
587
596
|
return (
|
|
588
597
|
<Anchor
|
|
589
598
|
component={"a"}
|
|
590
599
|
{...anchorProps}
|
|
600
|
+
{...(buttonProps as AnchorProps)}
|
|
591
601
|
{...props.anchorProps}
|
|
592
602
|
onClick={combinedOnClick}
|
|
593
603
|
>
|
|
@@ -619,6 +629,7 @@ const ActionHrefButton = (props: ActionNavigationButtonProps) => {
|
|
|
619
629
|
active: options,
|
|
620
630
|
classNameActive,
|
|
621
631
|
variantActive,
|
|
632
|
+
propsActive,
|
|
622
633
|
routerGoOptions,
|
|
623
634
|
target,
|
|
624
635
|
...buttonProps
|
|
@@ -9,9 +9,9 @@ const BurgerButton = (props: BurgerButtonProps) => {
|
|
|
9
9
|
|
|
10
10
|
return (
|
|
11
11
|
<Burger
|
|
12
|
-
opened={sidebar.
|
|
13
|
-
onClick={() => setSidebar({ ...sidebar,
|
|
14
|
-
hiddenFrom="
|
|
12
|
+
opened={!sidebar.closed}
|
|
13
|
+
onClick={() => setSidebar({ ...sidebar, closed: !sidebar.closed })}
|
|
14
|
+
hiddenFrom="md"
|
|
15
15
|
size="sm"
|
|
16
16
|
{...props}
|
|
17
17
|
/>
|
|
@@ -18,16 +18,13 @@ const ToggleSidebarButton = (props: Props) => {
|
|
|
18
18
|
? IconLayoutSidebarRightCollapse
|
|
19
19
|
: IconLayoutSidebarLeftCollapse
|
|
20
20
|
}
|
|
21
|
-
visibleFrom={"
|
|
21
|
+
visibleFrom={"md"}
|
|
22
22
|
variant={"subtle"}
|
|
23
23
|
size={"md"}
|
|
24
24
|
onClick={() => {
|
|
25
|
-
const expanding = sidebar.collapsed;
|
|
26
25
|
setSidebar({
|
|
27
26
|
...sidebar,
|
|
28
27
|
collapsed: !sidebar.collapsed,
|
|
29
|
-
// Reset width to defaultWidth when expanding
|
|
30
|
-
width: expanding ? sidebar.defaultWidth : sidebar.width,
|
|
31
28
|
});
|
|
32
29
|
}}
|
|
33
30
|
tooltip={{
|