@alepha/ui 0.17.2 → 0.18.1
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-DCGbpt2c.js → AdminParameters-DHw9ATgl.js} +53 -53
- package/dist/admin/AdminParameters-DHw9ATgl.js.map +1 -0
- package/dist/admin/{AdminSessions-DyhW6RZv.js → AdminSessions-BhGJPI3z.js} +11 -18
- package/dist/admin/AdminSessions-BhGJPI3z.js.map +1 -0
- package/dist/admin/{AdminUserLayout-CrBj4UuI.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 +739 -13
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +79 -111
- 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 +10 -39
- 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 +0 -4
- 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/AdminParameters-DCGbpt2c.js.map +0 -1
- package/dist/admin/AdminSessions-DyhW6RZv.js.map +0 -1
- package/dist/admin/AdminUserAudits-D1GcREEE.js +0 -177
- package/dist/admin/AdminUserAudits-D1GcREEE.js.map +0 -1
- package/dist/admin/AdminUserCreate-DR8LA0tv.js +0 -104
- package/dist/admin/AdminUserCreate-DR8LA0tv.js.map +0 -1
- package/dist/admin/AdminUserDetails-CDkZNHQD.js +0 -477
- package/dist/admin/AdminUserDetails-CDkZNHQD.js.map +0 -1
- package/dist/admin/AdminUserLayout-CrBj4UuI.js.map +0 -1
- package/dist/admin/AdminUserSessions-srgFHrqy.js +0 -129
- package/dist/admin/AdminUserSessions-srgFHrqy.js.map +0 -1
- package/dist/admin/AdminUserSettings-BFuxl-xT.js +0 -167
- package/dist/admin/AdminUserSettings-BFuxl-xT.js.map +0 -1
- package/dist/admin/AdminUsers-D1pDpiwK.js +0 -118
- package/dist/admin/AdminUsers-D1pDpiwK.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/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,11 +1,10 @@
|
|
|
1
|
+
import { renderIcon, ui } from "@alepha/ui";
|
|
1
2
|
import { Spotlight, type SpotlightActionData } from "@mantine/spotlight";
|
|
2
3
|
import { IconSearch } from "@tabler/icons-react";
|
|
3
4
|
import { useStore } from "alepha/react";
|
|
4
5
|
import { useRouter } from "alepha/react/router";
|
|
5
6
|
import { currentUserAtom } from "alepha/security";
|
|
6
7
|
import { type ReactNode, useMemo } from "react";
|
|
7
|
-
import { ui } from "../../constants/ui.ts";
|
|
8
|
-
import { renderIcon } from "../../helpers/renderIcon.tsx";
|
|
9
8
|
|
|
10
9
|
export interface OmnibarProps {
|
|
11
10
|
shortcut?: string | string[];
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
|
+
ActionButton,
|
|
3
|
+
type ActionMenuConfig,
|
|
4
|
+
type ActionMenuItem,
|
|
5
|
+
type ActionProps,
|
|
2
6
|
Flex,
|
|
3
|
-
|
|
4
|
-
|
|
7
|
+
OmnibarButton,
|
|
8
|
+
renderIcon,
|
|
9
|
+
SidebarCollapseButton,
|
|
5
10
|
Text,
|
|
6
|
-
|
|
11
|
+
ui,
|
|
12
|
+
} from "@alepha/ui";
|
|
13
|
+
import type { FlexProps, MantineBreakpoint } from "@mantine/core";
|
|
7
14
|
import {
|
|
8
15
|
IconChevronDown,
|
|
9
16
|
IconChevronRight,
|
|
@@ -19,11 +26,6 @@ import {
|
|
|
19
26
|
useMemo,
|
|
20
27
|
useState,
|
|
21
28
|
} from "react";
|
|
22
|
-
import { ui } from "../../constants/ui.ts";
|
|
23
|
-
import { renderIcon } from "../../helpers/renderIcon.tsx";
|
|
24
|
-
import ActionButton, { type ActionProps } from "../buttons/ActionButton.tsx";
|
|
25
|
-
import OmnibarButton from "../buttons/OmnibarButton.tsx";
|
|
26
|
-
import ToggleSidebarButton from "../buttons/ToggleSidebarButton.tsx";
|
|
27
29
|
|
|
28
30
|
export interface SidebarProps {
|
|
29
31
|
items?: SidebarNode[];
|
|
@@ -37,12 +39,6 @@ export interface SidebarProps {
|
|
|
37
39
|
paths?: string[];
|
|
38
40
|
};
|
|
39
41
|
|
|
40
|
-
/**
|
|
41
|
-
* Whether the sidebar expands on hover when collapsed.
|
|
42
|
-
* @default true
|
|
43
|
-
*/
|
|
44
|
-
expandOnHover?: boolean;
|
|
45
|
-
|
|
46
42
|
/**
|
|
47
43
|
* Automatically populate the menu from the router's pages.
|
|
48
44
|
*/
|
|
@@ -57,7 +53,11 @@ export const Sidebar = (props: SidebarProps) => {
|
|
|
57
53
|
const router = useRouter();
|
|
58
54
|
const { onItemClick } = props;
|
|
59
55
|
|
|
60
|
-
const divider = (
|
|
56
|
+
const divider = (
|
|
57
|
+
key: string | number,
|
|
58
|
+
fill?: boolean,
|
|
59
|
+
collapsed?: boolean,
|
|
60
|
+
) => {
|
|
61
61
|
return (
|
|
62
62
|
<Flex
|
|
63
63
|
key={key}
|
|
@@ -65,41 +65,40 @@ export const Sidebar = (props: SidebarProps) => {
|
|
|
65
65
|
bg={"var(--mantine-color-default-border)"}
|
|
66
66
|
my={"xs"}
|
|
67
67
|
mx={
|
|
68
|
-
fill
|
|
69
|
-
? "calc(-1 * var(--mantine-spacing-md))"
|
|
70
|
-
: props.collapsed
|
|
71
|
-
? 0
|
|
72
|
-
: "sm"
|
|
68
|
+
fill ? "calc(-1 * var(--mantine-spacing-md))" : collapsed ? 0 : "sm"
|
|
73
69
|
}
|
|
74
70
|
/>
|
|
75
71
|
);
|
|
76
72
|
};
|
|
77
73
|
|
|
78
|
-
const renderNode = (
|
|
74
|
+
const renderNode = (
|
|
75
|
+
item: SidebarNode,
|
|
76
|
+
key: number | string,
|
|
77
|
+
collapsed: boolean,
|
|
78
|
+
) => {
|
|
79
79
|
if ("type" in item) {
|
|
80
80
|
// Hide spacers when collapsed
|
|
81
81
|
if (item.type === "spacer") {
|
|
82
|
-
if (
|
|
82
|
+
if (collapsed) return null;
|
|
83
83
|
return <Flex key={key} h={16} />;
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
if (item.type === "divider") {
|
|
87
|
-
return divider(key, item.fill);
|
|
87
|
+
return divider(key, item.fill, collapsed);
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
if (item.type === "search") {
|
|
91
91
|
return (
|
|
92
92
|
<Flex key={key} mb="xs">
|
|
93
|
-
<OmnibarButton collapsed={
|
|
93
|
+
<OmnibarButton collapsed={collapsed} />
|
|
94
94
|
</Flex>
|
|
95
95
|
);
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
if (item.type === "toggle") {
|
|
99
|
-
return <
|
|
99
|
+
return <SidebarCollapseButton key={key} />;
|
|
100
100
|
}
|
|
101
101
|
|
|
102
|
-
// Replace sections with dividers when collapsed
|
|
103
102
|
// Replace sections with dividers when collapsed
|
|
104
103
|
if (item.type === "section") {
|
|
105
104
|
// Hide section if all children are hidden
|
|
@@ -110,16 +109,17 @@ export const Sidebar = (props: SidebarProps) => {
|
|
|
110
109
|
if (!hasVisibleChild) return null;
|
|
111
110
|
}
|
|
112
111
|
|
|
113
|
-
if (
|
|
112
|
+
if (collapsed) {
|
|
114
113
|
return (
|
|
115
114
|
<Fragment key={key}>
|
|
116
|
-
{divider(`${key}-d
|
|
115
|
+
{divider(`${key}-d`, undefined, collapsed)}
|
|
117
116
|
{item.children?.map((child, index) =>
|
|
118
|
-
renderNode(child, `s${key}-${index}
|
|
117
|
+
renderNode(child, `s${key}-${index}`, collapsed),
|
|
119
118
|
)}
|
|
120
119
|
</Fragment>
|
|
121
120
|
);
|
|
122
121
|
}
|
|
122
|
+
|
|
123
123
|
return (
|
|
124
124
|
<Fragment key={key}>
|
|
125
125
|
<Flex mt={"md"} align={"center"} gap={"xs"}>
|
|
@@ -129,7 +129,7 @@ export const Sidebar = (props: SidebarProps) => {
|
|
|
129
129
|
</Text>
|
|
130
130
|
</Flex>
|
|
131
131
|
{item.children?.map((child, index) =>
|
|
132
|
-
renderNode(child, `s${key}-${index}
|
|
132
|
+
renderNode(child, `s${key}-${index}`, collapsed),
|
|
133
133
|
)}
|
|
134
134
|
</Fragment>
|
|
135
135
|
);
|
|
@@ -155,7 +155,7 @@ export const Sidebar = (props: SidebarProps) => {
|
|
|
155
155
|
}
|
|
156
156
|
}
|
|
157
157
|
|
|
158
|
-
if (
|
|
158
|
+
if (collapsed) {
|
|
159
159
|
return (
|
|
160
160
|
<SidebarCollapsedItem
|
|
161
161
|
key={key}
|
|
@@ -208,37 +208,43 @@ export const Sidebar = (props: SidebarProps) => {
|
|
|
208
208
|
[props.items, props.autoPopulateMenu],
|
|
209
209
|
);
|
|
210
210
|
|
|
211
|
-
|
|
212
|
-
<Flex
|
|
213
|
-
flex={1}
|
|
214
|
-
py={padding}
|
|
215
|
-
direction={"column"}
|
|
216
|
-
className="alepha-sidebar-scroll"
|
|
217
|
-
{...props.flexProps}
|
|
218
|
-
>
|
|
211
|
+
const renderSidebar = (collapsed: boolean) => (
|
|
212
|
+
<Flex flex={1} py={padding} direction={"column"} {...props.flexProps}>
|
|
219
213
|
<Flex gap={gap} px={padding} direction={"column"}>
|
|
220
214
|
{menu
|
|
221
215
|
.filter((it) => it.position === "top")
|
|
222
|
-
.map((item, index) => renderNode(item, index))}
|
|
216
|
+
.map((item, index) => renderNode(item, index, collapsed))}
|
|
223
217
|
</Flex>
|
|
224
|
-
<Flex
|
|
225
|
-
gap={gap}
|
|
226
|
-
px={padding}
|
|
227
|
-
direction={"column"}
|
|
228
|
-
flex={1}
|
|
229
|
-
className="alepha-sidebar-scroll"
|
|
230
|
-
>
|
|
218
|
+
<Flex gap={gap} px={padding} direction={"column"} flex={1}>
|
|
231
219
|
{menu
|
|
232
220
|
.filter((it) => !it.position)
|
|
233
|
-
.map((item, index) => renderNode(item, index))}
|
|
221
|
+
.map((item, index) => renderNode(item, index, collapsed))}
|
|
234
222
|
</Flex>
|
|
235
223
|
<Flex gap={gap} px={padding} direction={"column"}>
|
|
236
224
|
{menu
|
|
237
225
|
.filter((it) => it.position === "bottom")
|
|
238
|
-
.map((item, index) => renderNode(item, index))}
|
|
226
|
+
.map((item, index) => renderNode(item, index, collapsed))}
|
|
239
227
|
</Flex>
|
|
240
228
|
</Flex>
|
|
241
229
|
);
|
|
230
|
+
|
|
231
|
+
// When collapsed, render both versions and use CSS breakpoints:
|
|
232
|
+
// - Desktop (>=md): show collapsed (icon-only) sidebar
|
|
233
|
+
// - Mobile (<md): show expanded sidebar (drawer with labels)
|
|
234
|
+
if (props.collapsed) {
|
|
235
|
+
return (
|
|
236
|
+
<>
|
|
237
|
+
<Flex flex={1} direction={"column"} visibleFrom="md">
|
|
238
|
+
{renderSidebar(true)}
|
|
239
|
+
</Flex>
|
|
240
|
+
<Flex flex={1} direction={"column"} hiddenFrom="md">
|
|
241
|
+
{renderSidebar(false)}
|
|
242
|
+
</Flex>
|
|
243
|
+
</>
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
return renderSidebar(false);
|
|
242
248
|
};
|
|
243
249
|
|
|
244
250
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
@@ -310,14 +316,18 @@ export const SidebarItem = (props: SidebarItemProps) => {
|
|
|
310
316
|
props.theme.button?.size ??
|
|
311
317
|
(level === 0 ? "sm" : "xs")
|
|
312
318
|
}
|
|
313
|
-
tooltip={
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
319
|
+
// tooltip={
|
|
320
|
+
// item.description
|
|
321
|
+
// ? { label: item.description, position: "right" }
|
|
322
|
+
// : undefined
|
|
323
|
+
// }
|
|
324
|
+
bd={0}
|
|
325
|
+
fw={"normal"}
|
|
326
|
+
variant={"default"}
|
|
327
|
+
propsActive={{
|
|
328
|
+
variant: "outline",
|
|
329
|
+
fw: "bold",
|
|
330
|
+
}}
|
|
321
331
|
radius={props.item.theme?.radius ?? props.theme.button?.radius ?? "md"}
|
|
322
332
|
onClick={handleItemClick}
|
|
323
333
|
leftSection={
|
|
@@ -376,21 +386,38 @@ export const SidebarItem = (props: SidebarItemProps) => {
|
|
|
376
386
|
|
|
377
387
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
378
388
|
|
|
379
|
-
export interface SidebarItemProps {
|
|
380
|
-
item: SidebarMenuItem;
|
|
381
|
-
level: number;
|
|
382
|
-
onItemClick?: (item: SidebarMenuItem) => void;
|
|
383
|
-
theme: SidebarTheme;
|
|
384
|
-
}
|
|
385
|
-
|
|
386
389
|
const SidebarCollapsedItem = (props: SidebarItemProps) => {
|
|
387
390
|
const { item, level } = props;
|
|
391
|
+
const router = useRouter();
|
|
388
392
|
|
|
389
393
|
const handleItemClick = () => {
|
|
390
394
|
props.onItemClick?.(item);
|
|
391
395
|
item.onClick?.();
|
|
392
396
|
};
|
|
393
397
|
|
|
398
|
+
const hasChildren = item.children && item.children.length > 0;
|
|
399
|
+
|
|
400
|
+
const menu: ActionMenuConfig | undefined = hasChildren
|
|
401
|
+
? {
|
|
402
|
+
on: "hover",
|
|
403
|
+
position: "right",
|
|
404
|
+
items: item
|
|
405
|
+
.children!.filter((child) => !child.can || child.can())
|
|
406
|
+
.map(
|
|
407
|
+
(child): ActionMenuItem => ({
|
|
408
|
+
label: child.label as string,
|
|
409
|
+
icon: renderIcon(child.icon, ui.sizes.icon.sm),
|
|
410
|
+
href: child.href,
|
|
411
|
+
active: child.href
|
|
412
|
+
? router.isActive(child.href, {
|
|
413
|
+
startWith: child.activeStartsWith,
|
|
414
|
+
})
|
|
415
|
+
: undefined,
|
|
416
|
+
}),
|
|
417
|
+
),
|
|
418
|
+
}
|
|
419
|
+
: undefined;
|
|
420
|
+
|
|
394
421
|
return (
|
|
395
422
|
<ActionButton
|
|
396
423
|
size={
|
|
@@ -400,19 +427,24 @@ const SidebarCollapsedItem = (props: SidebarItemProps) => {
|
|
|
400
427
|
}
|
|
401
428
|
variant={"subtle"}
|
|
402
429
|
variantActive={"default"}
|
|
403
|
-
tooltip={
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
430
|
+
tooltip={
|
|
431
|
+
hasChildren
|
|
432
|
+
? undefined
|
|
433
|
+
: {
|
|
434
|
+
label: item.label,
|
|
435
|
+
position: "right",
|
|
436
|
+
}
|
|
437
|
+
}
|
|
407
438
|
radius={props.item.theme?.radius ?? props.theme.button?.radius ?? "md"}
|
|
408
|
-
onClick={handleItemClick}
|
|
439
|
+
onClick={hasChildren ? undefined : handleItemClick}
|
|
409
440
|
icon={
|
|
410
441
|
renderIcon(item.icon, ui.sizes.icon.sm) ?? (
|
|
411
442
|
<IconSquareRounded size={ui.sizes.icon.sm} />
|
|
412
443
|
)
|
|
413
444
|
}
|
|
414
|
-
href={props.item.href as any}
|
|
415
|
-
target={props.item.target}
|
|
445
|
+
href={hasChildren ? undefined : (props.item.href as any)}
|
|
446
|
+
target={hasChildren ? undefined : props.item.target}
|
|
447
|
+
menu={menu}
|
|
416
448
|
{...props.item.actionProps}
|
|
417
449
|
/>
|
|
418
450
|
);
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { $module } from "alepha";
|
|
2
|
+
|
|
3
|
+
// ---------------------------------------------------------------------------------------------------------------------
|
|
4
|
+
|
|
5
|
+
export type { AlephaMantineProviderProps } from "../AlephaMantineProvider.tsx";
|
|
6
|
+
export { default as AlephaMantineProvider } from "../AlephaMantineProvider.tsx";
|
|
7
|
+
export type {
|
|
8
|
+
AppBarBack,
|
|
9
|
+
AppBarBurger,
|
|
10
|
+
AppBarDark,
|
|
11
|
+
AppBarDivider,
|
|
12
|
+
AppBarElement,
|
|
13
|
+
AppBarItem,
|
|
14
|
+
AppBarLang,
|
|
15
|
+
AppBarLogo,
|
|
16
|
+
AppBarProps,
|
|
17
|
+
AppBarSearch,
|
|
18
|
+
AppBarSpacer,
|
|
19
|
+
} from "./AppBar.tsx";
|
|
20
|
+
export { default as AppBar } from "./AppBar.tsx";
|
|
21
|
+
export type { BreadcrumbProps } from "./Breadcrumb.tsx";
|
|
22
|
+
export { default as Breadcrumbs } from "./Breadcrumb.tsx";
|
|
23
|
+
export type { ContainerProps } from "./Container.tsx";
|
|
24
|
+
export { default as Container } from "./Container.tsx";
|
|
25
|
+
export {
|
|
26
|
+
type DashboardShellProps,
|
|
27
|
+
type DashboardShellProps as AdminShellProps,
|
|
28
|
+
default as DashboardShell,
|
|
29
|
+
default as AdminShell,
|
|
30
|
+
} from "./DashboardShell.tsx";
|
|
31
|
+
export type { OmnibarProps } from "./Omnibar.tsx";
|
|
32
|
+
export { default as Omnibar } from "./Omnibar.tsx";
|
|
33
|
+
export type {
|
|
34
|
+
SidebarAbstractItem,
|
|
35
|
+
SidebarButtonTheme,
|
|
36
|
+
SidebarDivider,
|
|
37
|
+
SidebarElement,
|
|
38
|
+
SidebarItemProps,
|
|
39
|
+
SidebarMenuItem,
|
|
40
|
+
SidebarNode,
|
|
41
|
+
SidebarProps,
|
|
42
|
+
SidebarSearch,
|
|
43
|
+
SidebarSection,
|
|
44
|
+
SidebarSpacer,
|
|
45
|
+
SidebarTheme,
|
|
46
|
+
} from "./Sidebar.tsx";
|
|
47
|
+
export { Sidebar } from "./Sidebar.tsx";
|
|
48
|
+
|
|
49
|
+
// ---------------------------------------------------------------------------------------------------------------------
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Layout components for building application shells.
|
|
53
|
+
*
|
|
54
|
+
* **Features:**
|
|
55
|
+
* - DashboardShell with resizable sidebar
|
|
56
|
+
* - AppBar with configurable elements
|
|
57
|
+
* - Sidebar navigation with sections and menu items
|
|
58
|
+
* - Breadcrumb navigation
|
|
59
|
+
* - Omnibar (command palette)
|
|
60
|
+
*
|
|
61
|
+
* @module alepha.ui.layout
|
|
62
|
+
*/
|
|
63
|
+
export const AlephaUILayout = $module({
|
|
64
|
+
name: "alepha.ui.layout",
|
|
65
|
+
});
|
|
@@ -21,10 +21,7 @@ import type {
|
|
|
21
21
|
} from "@mantine/dates";
|
|
22
22
|
import { useFormState } from "alepha/react/form";
|
|
23
23
|
import type { ComponentType } from "react";
|
|
24
|
-
import {
|
|
25
|
-
type GenericControlProps,
|
|
26
|
-
parseInput,
|
|
27
|
-
} from "../../utils/parseInput.ts";
|
|
24
|
+
import { type GenericControlProps, parseInput } from "../utils/parseInput.ts";
|
|
28
25
|
import ControlArray, { type ControlArrayProps } from "./ControlArray.tsx";
|
|
29
26
|
import ControlDate from "./ControlDate.tsx";
|
|
30
27
|
import ControlNumber, { type ControlNumberProps } from "./ControlNumber.tsx";
|
|
@@ -268,19 +265,40 @@ const Control = (_props: ControlProps) => {
|
|
|
268
265
|
"type" in props.input.schema &&
|
|
269
266
|
props.input.schema.type === "boolean"
|
|
270
267
|
) {
|
|
271
|
-
|
|
268
|
+
if (props.switch) {
|
|
269
|
+
const switchProps = typeof props.switch === "object" ? props.switch : {};
|
|
270
|
+
return (
|
|
271
|
+
<Switch
|
|
272
|
+
{...inputProps}
|
|
273
|
+
size={props.size}
|
|
274
|
+
id={id}
|
|
275
|
+
color={"blue"}
|
|
276
|
+
defaultChecked={props.input.props.defaultValue}
|
|
277
|
+
onChange={(event) => {
|
|
278
|
+
props.input.set(event.currentTarget.checked);
|
|
279
|
+
}}
|
|
280
|
+
{...switchProps}
|
|
281
|
+
/>
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
const opts: ControlSelectProps = {
|
|
286
|
+
input: props.input,
|
|
287
|
+
select: {
|
|
288
|
+
data: [
|
|
289
|
+
{ value: "true", label: "Yes" },
|
|
290
|
+
{ value: "false", label: "No" },
|
|
291
|
+
],
|
|
292
|
+
},
|
|
293
|
+
};
|
|
272
294
|
|
|
273
295
|
return (
|
|
274
|
-
<
|
|
275
|
-
{...inputProps}
|
|
296
|
+
<ControlSelect
|
|
276
297
|
size={props.size}
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
props.input.set(event.currentTarget.checked);
|
|
282
|
-
}}
|
|
283
|
-
{...switchProps}
|
|
298
|
+
title={props.title}
|
|
299
|
+
description={props.description}
|
|
300
|
+
icon={icon}
|
|
301
|
+
{...opts}
|
|
284
302
|
/>
|
|
285
303
|
);
|
|
286
304
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ui } from "@alepha/ui";
|
|
1
2
|
import {
|
|
2
3
|
ActionIcon,
|
|
3
4
|
Fieldset,
|
|
@@ -11,11 +12,7 @@ import type { TObject, TSchema } from "alepha";
|
|
|
11
12
|
import { useAlepha } from "alepha/react";
|
|
12
13
|
import type { BaseInputField } from "alepha/react/form";
|
|
13
14
|
import { useCallback, useEffect, useRef, useState } from "react";
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
type GenericControlProps,
|
|
17
|
-
parseInput,
|
|
18
|
-
} from "../../utils/parseInput.ts";
|
|
15
|
+
import { type GenericControlProps, parseInput } from "../utils/parseInput.ts";
|
|
19
16
|
import Control, { type ControlProps } from "./Control.tsx";
|
|
20
17
|
|
|
21
18
|
/**
|
|
@@ -7,10 +7,7 @@ import {
|
|
|
7
7
|
type TimeInputProps,
|
|
8
8
|
} from "@mantine/dates";
|
|
9
9
|
import { useFormState } from "alepha/react/form";
|
|
10
|
-
import {
|
|
11
|
-
type GenericControlProps,
|
|
12
|
-
parseInput,
|
|
13
|
-
} from "../../utils/parseInput.ts";
|
|
10
|
+
import { type GenericControlProps, parseInput } from "../utils/parseInput.ts";
|
|
14
11
|
|
|
15
12
|
export interface ControlDateProps extends GenericControlProps {
|
|
16
13
|
date?: boolean | DateInputProps;
|
|
@@ -8,10 +8,7 @@ import {
|
|
|
8
8
|
import { useEvents } from "alepha/react";
|
|
9
9
|
import { useFormState } from "alepha/react/form";
|
|
10
10
|
import { useRef, useState } from "react";
|
|
11
|
-
import {
|
|
12
|
-
type GenericControlProps,
|
|
13
|
-
parseInput,
|
|
14
|
-
} from "../../utils/parseInput.ts";
|
|
11
|
+
import { type GenericControlProps, parseInput } from "../utils/parseInput.ts";
|
|
15
12
|
|
|
16
13
|
export interface ControlNumberProps extends GenericControlProps {
|
|
17
14
|
numberInputProps?: Partial<NumberInputProps>;
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import { Fieldset, Flex, Grid, Text } from "@mantine/core";
|
|
2
2
|
import type { TObject } from "alepha";
|
|
3
3
|
import type { BaseInputField, ObjectInputField } from "alepha/react/form";
|
|
4
|
-
import {
|
|
5
|
-
type GenericControlProps,
|
|
6
|
-
parseInput,
|
|
7
|
-
} from "../../utils/parseInput.ts";
|
|
4
|
+
import { type GenericControlProps, parseInput } from "../utils/parseInput.ts";
|
|
8
5
|
import Control, { type ControlProps } from "./Control.tsx";
|
|
9
6
|
|
|
10
7
|
export interface ControlObjectProps extends GenericControlProps {
|
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ActionButton,
|
|
3
|
+
extractSchemaFields,
|
|
4
|
+
OPERATOR_INFO,
|
|
5
|
+
type SchemaField,
|
|
6
|
+
ui,
|
|
7
|
+
} from "@alepha/ui";
|
|
1
8
|
import {
|
|
2
9
|
ActionIcon,
|
|
3
10
|
Badge,
|
|
@@ -13,13 +20,6 @@ import type { TObject } from "alepha";
|
|
|
13
20
|
import { parseQueryString } from "alepha/orm";
|
|
14
21
|
import { useEvents } from "alepha/react";
|
|
15
22
|
import { useRef, useState } from "react";
|
|
16
|
-
import { ui } from "../../constants/ui.ts";
|
|
17
|
-
import {
|
|
18
|
-
extractSchemaFields,
|
|
19
|
-
OPERATOR_INFO,
|
|
20
|
-
type SchemaField,
|
|
21
|
-
} from "../../utils/extractSchemaFields.ts";
|
|
22
|
-
import ActionButton from "../buttons/ActionButton.tsx";
|
|
23
23
|
|
|
24
24
|
export interface ControlQueryBuilderProps
|
|
25
25
|
extends Omit<TextInputProps, "value" | "onChange"> {
|
|
@@ -14,10 +14,7 @@ import {
|
|
|
14
14
|
} from "@mantine/core";
|
|
15
15
|
import { useFormState } from "alepha/react/form";
|
|
16
16
|
import { useEffect, useState } from "react";
|
|
17
|
-
import {
|
|
18
|
-
type GenericControlProps,
|
|
19
|
-
parseInput,
|
|
20
|
-
} from "../../utils/parseInput.ts";
|
|
17
|
+
import { type GenericControlProps, parseInput } from "../utils/parseInput.ts";
|
|
21
18
|
|
|
22
19
|
export type SelectValueLabel =
|
|
23
20
|
| string
|
|
@@ -192,6 +189,7 @@ const ControlSelect = (props: ControlSelectProps) => {
|
|
|
192
189
|
size={props.size}
|
|
193
190
|
id={id}
|
|
194
191
|
leftSection={icon}
|
|
192
|
+
rightSection={null}
|
|
195
193
|
data={data}
|
|
196
194
|
{...props.input.props}
|
|
197
195
|
{...selectProps}
|