@alepha/ui 0.18.1 → 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-C-6_Q-lH.js → AdminApiKeys-Dy_k-4Vd.js} +17 -38
- package/dist/admin/AdminApiKeys-Dy_k-4Vd.js.map +1 -0
- package/dist/admin/{AdminAudits-Bgbf04hO.js → AdminAudits-CKiFMSSU.js} +23 -19
- package/dist/admin/AdminAudits-CKiFMSSU.js.map +1 -0
- package/dist/admin/AdminDashboard-PhC_dZqo.js +67 -0
- package/dist/admin/AdminDashboard-PhC_dZqo.js.map +1 -0
- package/dist/admin/{AdminFiles-B9a7G3cY.js → AdminFiles-DFTjijGp.js} +3 -7
- package/dist/admin/AdminFiles-DFTjijGp.js.map +1 -0
- package/dist/admin/{AdminJobDashboard-DaTwf5OY.js → AdminJobDashboard-BL8gGPDp.js} +2 -2
- package/dist/admin/{AdminJobDashboard-DaTwf5OY.js.map → AdminJobDashboard-BL8gGPDp.js.map} +1 -1
- package/dist/admin/{AdminJobExecutions-B9cek5dl.js → AdminJobExecutions-D9E-CS-U.js} +24 -36
- package/dist/admin/AdminJobExecutions-D9E-CS-U.js.map +1 -0
- package/dist/admin/{AdminJobRegistry-DFgV3oqx.js → AdminJobRegistry-Ci9ue1zC.js} +10 -18
- package/dist/admin/AdminJobRegistry-Ci9ue1zC.js.map +1 -0
- package/dist/admin/AdminLayout-I6TlUMPc.js +61 -0
- package/dist/admin/AdminLayout-I6TlUMPc.js.map +1 -0
- package/dist/admin/AdminNotifications-ZPHCYrv7.js +542 -0
- package/dist/admin/AdminNotifications-ZPHCYrv7.js.map +1 -0
- package/dist/admin/{AdminParameters-DHw9ATgl.js → AdminParameters-CqgvhRsb.js} +120 -105
- package/dist/admin/AdminParameters-CqgvhRsb.js.map +1 -0
- package/dist/admin/{AdminSessions-BhGJPI3z.js → AdminSessions-Bz5NRuoW.js} +48 -53
- package/dist/admin/AdminSessions-Bz5NRuoW.js.map +1 -0
- package/dist/admin/{AdminUserLayout-BdC4Te8m.js → AdminUserLayout-lXT6I0Qq.js} +14 -8
- package/dist/admin/AdminUserLayout-lXT6I0Qq.js.map +1 -0
- package/dist/admin/{AdminUserProfile-DAt23fqY.js → AdminUserProfile-vFBLoJ3h.js} +3 -3
- package/dist/admin/{AdminUserProfile-DAt23fqY.js.map → AdminUserProfile-vFBLoJ3h.js.map} +1 -1
- package/dist/admin/{AdminUserSessions-1uzcx02z.js → AdminUserSessions-CT_YDim0.js} +33 -35
- package/dist/admin/AdminUserSessions-CT_YDim0.js.map +1 -0
- package/dist/admin/AdminUsers-D1UfGya9.js +206 -0
- package/dist/admin/AdminUsers-D1UfGya9.js.map +1 -0
- package/dist/admin/{AuthLayout-DFJvCvzw.js → AuthLayout-_frhdgOO.js} +2 -2
- package/dist/admin/{AuthLayout-DFJvCvzw.js.map → AuthLayout-_frhdgOO.js.map} +1 -1
- package/dist/admin/{IconGoogle-CSQLPYwX.js → IconGoogle-Ch1m3Uzl.js} +1 -1
- package/dist/admin/{IconGoogle-CSQLPYwX.js.map → IconGoogle-Ch1m3Uzl.js.map} +1 -1
- package/dist/admin/Login-xtNmQtGh.js +275 -0
- package/dist/admin/Login-xtNmQtGh.js.map +1 -0
- package/dist/{auth/Profile-BMX_Ar_s.js → admin/Profile-_AtPUwAP.js} +31 -27
- package/dist/admin/Profile-_AtPUwAP.js.map +1 -0
- package/dist/admin/{Register-Cs10l8vX.js → Register-JcCjHUUn.js} +199 -143
- package/dist/admin/Register-JcCjHUUn.js.map +1 -0
- package/dist/admin/{ResetPassword-BwDdfkGH.js → ResetPassword-CwGBPLJO.js} +7 -7
- package/dist/admin/ResetPassword-CwGBPLJO.js.map +1 -0
- package/dist/admin/{VerifyEmail-DfXHAiQl.js → VerifyEmail-hNxWejWf.js} +23 -8
- package/dist/admin/VerifyEmail-hNxWejWf.js.map +1 -0
- package/dist/admin/{core-2xoLiT0o.js → core-CYaRQ8O-.js} +2082 -688
- package/dist/admin/core-CYaRQ8O-.js.map +1 -0
- package/dist/admin/index.d.ts +112 -48
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +467 -69
- package/dist/admin/index.js.map +1 -1
- package/dist/auth/{AuthLayout-CAE1pX9s.js → AuthLayout-AvLlcLjS.js} +2 -2
- package/dist/auth/{AuthLayout-CAE1pX9s.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/{admin/Profile-B-c9pCPf.js → auth/Profile-YcWdeuFz.js} +31 -27
- package/dist/auth/Profile-YcWdeuFz.js.map +1 -0
- package/dist/auth/{Register-6hi_cpfF.js → Register-CPhEO5MG.js} +198 -142
- package/dist/auth/Register-CPhEO5MG.js.map +1 -0
- package/dist/{demo/ResetPassword-DWN0lzr5.js → auth/ResetPassword-DCtGcneA.js} +7 -7
- package/dist/auth/ResetPassword-DCtGcneA.js.map +1 -0
- package/dist/{demo/VerifyEmail-DZWL72K4.js → auth/VerifyEmail-DkH7NBfn.js} +23 -8
- package/dist/auth/VerifyEmail-DkH7NBfn.js.map +1 -0
- package/dist/auth/{core-niW0sFLv.js → core-D5jIAVF2.js} +1385 -329
- package/dist/auth/core-D5jIAVF2.js.map +1 -0
- package/dist/auth/index.d.ts +105 -49
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +29 -26
- package/dist/auth/index.js.map +1 -1
- package/dist/core/index.d.ts +210 -74
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2247 -834
- package/dist/core/index.js.map +1 -1
- package/dist/demo/{AuthLayout-jLa0aKsI.js → AuthLayout-Brri4A-L.js} +2 -2
- package/dist/demo/{AuthLayout-jLa0aKsI.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-4ItHLf9t.js → DemoDialog-CUWdLHim.js} +2 -2
- package/dist/demo/{DemoDialog-4ItHLf9t.js.map → DemoDialog-CUWdLHim.js.map} +1 -1
- package/dist/demo/{DemoFlex-EtVq8QfX.js → DemoFlex-a8OhMMvq.js} +3 -3
- package/dist/demo/{DemoFlex-EtVq8QfX.js.map → DemoFlex-a8OhMMvq.js.map} +1 -1
- package/dist/demo/{DemoHeading-BS-vGfkI.js → DemoHeading-C13OVDfS.js} +3 -3
- package/dist/demo/{DemoHeading-BS-vGfkI.js.map → DemoHeading-C13OVDfS.js.map} +1 -1
- package/dist/demo/{DemoHome-Clbn8AmS.js → DemoHome-D_De3UiT.js} +2 -2
- package/dist/demo/{DemoHome-Clbn8AmS.js.map → DemoHome-D_De3UiT.js.map} +1 -1
- package/dist/demo/{DemoJsonViewer-DkIX_ky2.js → DemoJsonViewer-B50s9aGM.js} +3 -3
- package/dist/demo/{DemoJsonViewer-DkIX_ky2.js.map → DemoJsonViewer-B50s9aGM.js.map} +1 -1
- package/dist/demo/{DemoLayout-C56xb5EE.js → DemoLayout-CHU8WTwO.js} +14 -5
- package/dist/demo/DemoLayout-CHU8WTwO.js.map +1 -0
- package/dist/demo/{DemoLogin-BZwpicOS.js → DemoLogin-BBlrWpml.js} +49 -32
- package/dist/demo/DemoLogin-BBlrWpml.js.map +1 -0
- package/dist/demo/{DemoRegister-C7_qc4MJ.js → DemoRegister-BuNE3_-f.js} +49 -50
- package/dist/demo/DemoRegister-BuNE3_-f.js.map +1 -0
- package/dist/demo/{DemoResetPassword-BI1Ct4Dw.js → DemoResetPassword-D_IjjjOJ.js} +12 -16
- package/dist/demo/DemoResetPassword-D_IjjjOJ.js.map +1 -0
- package/dist/demo/{DemoSidebar-CcBo4ltC.js → DemoSidebar-Giy2HRBD.js} +3 -3
- package/dist/demo/{DemoSidebar-CcBo4ltC.js.map → DemoSidebar-Giy2HRBD.js.map} +1 -1
- package/dist/demo/{DemoText-CzXuUn3g.js → DemoText-ubcw-vog.js} +3 -3
- package/dist/demo/{DemoText-CzXuUn3g.js.map → DemoText-ubcw-vog.js.map} +1 -1
- package/dist/demo/{DemoToast-BgHDhWrX.js → DemoToast-9die_dYT.js} +2 -2
- package/dist/demo/{DemoToast-BgHDhWrX.js.map → DemoToast-9die_dYT.js.map} +1 -1
- package/dist/demo/{DemoTypeForm-DDzWoMSV.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-CWqti7FB.js → Profile-DS5q4vOh.js} +31 -27
- package/dist/demo/Profile-DS5q4vOh.js.map +1 -0
- package/dist/demo/{Register-a70LPgs2.js → Register-B4hLBeEv.js} +198 -142
- package/dist/demo/Register-B4hLBeEv.js.map +1 -0
- package/dist/{auth/ResetPassword-CqfTk1FI.js → demo/ResetPassword-D8g9ha1N.js} +7 -7
- package/dist/demo/ResetPassword-D8g9ha1N.js.map +1 -0
- package/dist/demo/{Showcase-Dq3MISpd.js → Showcase-D6Fxt4X4.js} +64 -65
- package/dist/demo/Showcase-D6Fxt4X4.js.map +1 -0
- package/dist/{auth/VerifyEmail-nWiSTMjF.js → demo/VerifyEmail-BjDo0cZA.js} +23 -8
- package/dist/demo/VerifyEmail-BjDo0cZA.js.map +1 -0
- package/dist/demo/{auth-d6n3xbug.js → auth-ByVTreDl.js} +8 -8
- package/dist/demo/{auth-d6n3xbug.js.map → auth-ByVTreDl.js.map} +1 -1
- package/dist/demo/{core-RCUw1Q-a.js → core-DFgB3yU4.js} +2182 -756
- 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.ts → AdminRouter.tsx} +150 -18
- package/src/admin/components/AdminDashboard.tsx +52 -0
- package/src/admin/components/AdminLayout.tsx +32 -40
- package/src/admin/components/audits/AdminAudits.tsx +22 -16
- package/src/admin/components/files/AdminFiles.tsx +1 -6
- package/src/admin/components/jobs/AdminJobExecutions.tsx +33 -39
- package/src/admin/components/jobs/AdminJobRegistry.tsx +9 -18
- package/src/admin/components/keys/AdminApiKeys.tsx +23 -41
- 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/sessions/AdminSessions.tsx +71 -71
- package/src/admin/components/shared/AdminResourceHeader.tsx +2 -25
- package/src/admin/components/shared/AdminResourceHeaderMenuItem.tsx +37 -0
- package/src/admin/components/shared/AdminResourceTabs.tsx +2 -26
- package/src/admin/components/shared/AdminResourceTabsItem.tsx +36 -0
- package/src/admin/components/users/AdminUserSessions.tsx +33 -31
- package/src/admin/components/users/AdminUsers.tsx +184 -72
- package/src/admin/index.ts +2 -2
- package/src/admin/primitives/$uiAdmin.ts +1 -1
- package/src/auth/components/Login.tsx +188 -121
- package/src/auth/components/Profile.tsx +1 -22
- package/src/auth/components/ProfileField.tsx +39 -0
- package/src/auth/components/Register.tsx +215 -158
- package/src/auth/components/ResetPassword.tsx +7 -11
- package/src/auth/components/VerifyEmail.tsx +35 -10
- package/src/auth/components/buttons/UserButton.tsx +20 -24
- package/src/auth/index.ts +1 -0
- package/src/core/atoms/alephaSidebarAtom.ts +1 -1
- package/src/core/atoms/alephaThemeListAtom.ts +14 -1
- package/src/core/atoms/alephaThemeOverridesAtom.ts +17 -0
- package/src/core/atoms/themes/editorial.ts +184 -0
- package/src/core/atoms/themes/monochrome.ts +197 -0
- package/src/core/atoms/themes/rosePine.ts +208 -0
- package/src/core/atoms/themes/softBrutalism.ts +221 -0
- package/src/core/atoms/themes/terminal.ts +186 -0
- package/src/core/components/Flex.tsx +101 -1
- package/src/core/components/Text.tsx +1 -1
- package/src/core/components/buttons/ActionButton.tsx +109 -87
- package/src/core/components/buttons/DarkModeButton.tsx +3 -3
- package/src/core/components/buttons/LanguageButton.tsx +1 -1
- package/src/core/components/buttons/OmnibarButton.tsx +1 -2
- package/src/core/components/buttons/ThemeButton.tsx +40 -11
- package/src/core/components/buttons/ThemeExpertModal.tsx +184 -0
- package/src/core/components/buttons/ToggleSidebarButton.tsx +1 -2
- package/src/core/components/data/DetailDrawer.tsx +102 -96
- package/src/core/components/data/DetailList.tsx +2 -1
- package/src/core/components/layout/AppBar.tsx +10 -0
- package/src/core/components/layout/Breadcrumb.tsx +3 -6
- package/src/core/components/layout/DashboardShell.tsx +28 -11
- package/src/core/components/layout/Sidebar.tsx +18 -235
- 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/constants/ui.ts +5 -5
- 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/hooks/useTheme.ts +26 -3
- package/src/core/index.ts +9 -2
- package/src/core/interfaces/AlephaTheme.ts +2 -0
- 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/providers/ThemeProvider.ts +108 -8
- package/src/core/services/DialogService.tsx +24 -3
- package/src/core/styles.css +33 -20
- package/src/core/table/components/ColumnPicker.tsx +3 -3
- package/src/core/table/components/DataTable.tsx +233 -143
- package/src/core/table/components/DataTableFilters.tsx +6 -16
- package/src/core/table/components/DataTablePagination.tsx +58 -29
- package/src/core/table/components/DataTableToolbar.tsx +16 -7
- package/src/core/table/components/FilterPicker.tsx +3 -3
- package/src/core/table/index.ts +1 -0
- package/src/core/table/interfaces/types.ts +42 -9
- 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 -241
- 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/AdminApiKeys-C-6_Q-lH.js.map +0 -1
- package/dist/admin/AdminAudits-Bgbf04hO.js.map +0 -1
- package/dist/admin/AdminFiles-B9a7G3cY.js.map +0 -1
- package/dist/admin/AdminJobExecutions-B9cek5dl.js.map +0 -1
- package/dist/admin/AdminJobRegistry-DFgV3oqx.js.map +0 -1
- package/dist/admin/AdminLayout-DHsvWxVB.js +0 -70
- package/dist/admin/AdminLayout-DHsvWxVB.js.map +0 -1
- package/dist/admin/AdminParameters-DHw9ATgl.js.map +0 -1
- package/dist/admin/AdminSessions-BhGJPI3z.js.map +0 -1
- package/dist/admin/AdminUserLayout-BdC4Te8m.js.map +0 -1
- package/dist/admin/AdminUserSessions-1uzcx02z.js.map +0 -1
- package/dist/admin/AdminUsers-C85c3eiQ.js +0 -121
- package/dist/admin/AdminUsers-C85c3eiQ.js.map +0 -1
- package/dist/admin/Login-BGheURrg.js +0 -219
- package/dist/admin/Login-BGheURrg.js.map +0 -1
- package/dist/admin/Profile-B-c9pCPf.js.map +0 -1
- package/dist/admin/Register-Cs10l8vX.js.map +0 -1
- package/dist/admin/ResetPassword-BwDdfkGH.js.map +0 -1
- package/dist/admin/VerifyEmail-DfXHAiQl.js.map +0 -1
- package/dist/admin/auth-Dr0Cf8I7.js +0 -319
- package/dist/admin/auth-Dr0Cf8I7.js.map +0 -1
- package/dist/admin/core-2xoLiT0o.js.map +0 -1
- package/dist/auth/Login-Denw_UGy.js +0 -219
- package/dist/auth/Login-Denw_UGy.js.map +0 -1
- package/dist/auth/Profile-BMX_Ar_s.js.map +0 -1
- package/dist/auth/Register-6hi_cpfF.js.map +0 -1
- package/dist/auth/ResetPassword-CqfTk1FI.js.map +0 -1
- package/dist/auth/VerifyEmail-nWiSTMjF.js.map +0 -1
- package/dist/auth/core-niW0sFLv.js.map +0 -1
- package/dist/demo/DemoButton-BmaWZVwf.js +0 -178
- package/dist/demo/DemoButton-BmaWZVwf.js.map +0 -1
- package/dist/demo/DemoDataTable-Z9xyV221.js +0 -362
- package/dist/demo/DemoDataTable-Z9xyV221.js.map +0 -1
- package/dist/demo/DemoLayout-C56xb5EE.js.map +0 -1
- package/dist/demo/DemoLogin-BZwpicOS.js.map +0 -1
- package/dist/demo/DemoRegister-C7_qc4MJ.js.map +0 -1
- package/dist/demo/DemoResetPassword-BI1Ct4Dw.js.map +0 -1
- package/dist/demo/DemoTypeForm-DDzWoMSV.js.map +0 -1
- package/dist/demo/DemoVerifyEmail-C_Irdnov.js +0 -30
- package/dist/demo/DemoVerifyEmail-C_Irdnov.js.map +0 -1
- package/dist/demo/Login-hSOU3jZc.js +0 -219
- package/dist/demo/Login-hSOU3jZc.js.map +0 -1
- package/dist/demo/Profile-CWqti7FB.js.map +0 -1
- package/dist/demo/Register-a70LPgs2.js.map +0 -1
- package/dist/demo/ResetPassword-DWN0lzr5.js.map +0 -1
- package/dist/demo/Showcase-Dq3MISpd.js.map +0 -1
- package/dist/demo/VerifyEmail-DZWL72K4.js.map +0 -1
- package/dist/demo/core-RCUw1Q-a.js.map +0 -1
- package/src/demo/styles.css +0 -0
|
@@ -1,24 +1,25 @@
|
|
|
1
|
-
import { ActionButton, ui } from "@alepha/ui";
|
|
2
|
-
import {
|
|
3
|
-
Checkbox,
|
|
4
|
-
Drawer,
|
|
5
|
-
Flex,
|
|
6
|
-
Table,
|
|
7
|
-
Text,
|
|
8
|
-
UnstyledButton,
|
|
9
|
-
} from "@mantine/core";
|
|
1
|
+
import { ActionButton, Flex, isComponentType, Text, ui } from "@alepha/ui";
|
|
2
|
+
import { Checkbox, Drawer, Loader, Table, UnstyledButton } from "@mantine/core";
|
|
10
3
|
import {
|
|
11
4
|
IconArrowDown,
|
|
12
5
|
IconArrowsSort,
|
|
13
6
|
IconArrowUp,
|
|
14
7
|
IconChevronDown,
|
|
15
8
|
IconChevronRight,
|
|
9
|
+
IconDotsVertical,
|
|
16
10
|
} from "@tabler/icons-react";
|
|
17
11
|
import { Alepha, type Static, type TObject, t } from "alepha";
|
|
18
12
|
import { DateTimeProvider } from "alepha/datetime";
|
|
19
13
|
import { useInject } from "alepha/react";
|
|
20
14
|
import { type FormModel, useForm } from "alepha/react/form";
|
|
21
|
-
import {
|
|
15
|
+
import {
|
|
16
|
+
type ReactNode,
|
|
17
|
+
useCallback,
|
|
18
|
+
useEffect,
|
|
19
|
+
useMemo,
|
|
20
|
+
useRef,
|
|
21
|
+
useState,
|
|
22
|
+
} from "react";
|
|
22
23
|
import type {
|
|
23
24
|
ColumnVisibility,
|
|
24
25
|
DataTableColumnContext,
|
|
@@ -97,13 +98,19 @@ const DataTable = <T extends object, Filters extends TObject>(
|
|
|
97
98
|
const [items, setItems] = useState<MaybePage<T>>(
|
|
98
99
|
typeof props.items === "function" ? { content: [] } : props.items,
|
|
99
100
|
);
|
|
101
|
+
const itemsRef = useRef(items);
|
|
102
|
+
const [loaded, setLoaded] = useState(
|
|
103
|
+
typeof props.items !== "function" || !props.submitOnInit,
|
|
104
|
+
);
|
|
100
105
|
|
|
101
|
-
const defaultSize = props.infinityScroll ? 100 :
|
|
106
|
+
const defaultSize = props.defaultSize || (props.infinityScroll ? 100 : 10);
|
|
102
107
|
const [page, setPage] = useState(1);
|
|
103
108
|
const [size, setSize] = useState(String(defaultSize));
|
|
104
109
|
const [currentPage, setCurrentPage] = useState(0);
|
|
105
110
|
const alepha = useInject(Alepha);
|
|
111
|
+
itemsRef.current = items;
|
|
106
112
|
const sentinelRef = useRef<HTMLDivElement>(null);
|
|
113
|
+
const debounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
107
114
|
|
|
108
115
|
// Column visibility state
|
|
109
116
|
const [columnVisibility, setColumnVisibility] = useState<ColumnVisibility>(
|
|
@@ -220,7 +227,7 @@ const DataTable = <T extends object, Filters extends TObject>(
|
|
|
220
227
|
sort?: string;
|
|
221
228
|
},
|
|
222
229
|
{
|
|
223
|
-
items:
|
|
230
|
+
items: itemsRef.current.content,
|
|
224
231
|
},
|
|
225
232
|
);
|
|
226
233
|
|
|
@@ -235,6 +242,7 @@ const DataTable = <T extends object, Filters extends TObject>(
|
|
|
235
242
|
}
|
|
236
243
|
|
|
237
244
|
setCurrentPage(values.page);
|
|
245
|
+
if (!loaded) setLoaded(true);
|
|
238
246
|
}
|
|
239
247
|
},
|
|
240
248
|
onReset: async () => {
|
|
@@ -260,13 +268,33 @@ const DataTable = <T extends object, Filters extends TObject>(
|
|
|
260
268
|
value,
|
|
261
269
|
form as unknown as FormModel<Filters>,
|
|
262
270
|
);
|
|
271
|
+
|
|
272
|
+
if (props.skipSubmitOnChange) return;
|
|
273
|
+
|
|
274
|
+
form.input.page.set(0);
|
|
275
|
+
|
|
276
|
+
const delay = props.debounce ?? 300;
|
|
277
|
+
if (delay > 0) {
|
|
278
|
+
if (debounceRef.current) clearTimeout(debounceRef.current);
|
|
279
|
+
debounceRef.current = setTimeout(() => {
|
|
280
|
+
form.submit();
|
|
281
|
+
}, delay);
|
|
282
|
+
} else {
|
|
283
|
+
await form.submit();
|
|
284
|
+
}
|
|
263
285
|
},
|
|
264
286
|
},
|
|
265
|
-
[
|
|
287
|
+
[],
|
|
266
288
|
);
|
|
267
289
|
|
|
268
290
|
const dt = useInject(DateTimeProvider);
|
|
269
291
|
|
|
292
|
+
useEffect(() => {
|
|
293
|
+
return () => {
|
|
294
|
+
if (debounceRef.current) clearTimeout(debounceRef.current);
|
|
295
|
+
};
|
|
296
|
+
}, []);
|
|
297
|
+
|
|
270
298
|
useEffect(() => {
|
|
271
299
|
if (props.submitOnInit) {
|
|
272
300
|
form.submit();
|
|
@@ -318,7 +346,8 @@ const DataTable = <T extends object, Filters extends TObject>(
|
|
|
318
346
|
const totalColumns =
|
|
319
347
|
visibleColumns.length +
|
|
320
348
|
(panelConfig ? 1 : 0) +
|
|
321
|
-
(props.withCheckbox ? 1 : 0)
|
|
349
|
+
(props.withCheckbox ? 1 : 0) +
|
|
350
|
+
(props.rowActions ? 1 : 0);
|
|
322
351
|
|
|
323
352
|
// Checkbox header column
|
|
324
353
|
const checkboxHeader = props.withCheckbox ? (
|
|
@@ -351,12 +380,14 @@ const DataTable = <T extends object, Filters extends TObject>(
|
|
|
351
380
|
}}
|
|
352
381
|
>
|
|
353
382
|
<Flex align="center" gap={4}>
|
|
354
|
-
<Text size="xs">
|
|
383
|
+
<Text bold muted size="xs">
|
|
384
|
+
{col.label}
|
|
385
|
+
</Text>
|
|
355
386
|
{col.sortable && (
|
|
356
387
|
<Flex c="dimmed">
|
|
357
|
-
{sortDir === "asc" && <IconArrowUp size={ui.sizes.icon.
|
|
358
|
-
{sortDir === "desc" && <IconArrowDown size={ui.sizes.icon.
|
|
359
|
-
{sortDir === null && <IconArrowsSort size={ui.sizes.icon.
|
|
388
|
+
{sortDir === "asc" && <IconArrowUp size={ui.sizes.icon.xs} />}
|
|
389
|
+
{sortDir === "desc" && <IconArrowDown size={ui.sizes.icon.xs} />}
|
|
390
|
+
{sortDir === null && <IconArrowsSort size={ui.sizes.icon.xs} />}
|
|
360
391
|
</Flex>
|
|
361
392
|
)}
|
|
362
393
|
</Flex>
|
|
@@ -424,45 +455,77 @@ const DataTable = <T extends object, Filters extends TObject>(
|
|
|
424
455
|
alepha,
|
|
425
456
|
} as DataTableColumnContext<Filters>;
|
|
426
457
|
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
458
|
+
const content = col.value?.(item as T, ctx);
|
|
459
|
+
|
|
460
|
+
return (
|
|
461
|
+
<Table.Td key={key} style={col.fit ? FIT_STYLE : undefined}>
|
|
462
|
+
{col.action ? (
|
|
463
|
+
<ActionButton
|
|
464
|
+
td={"inherit"}
|
|
465
|
+
unstyled
|
|
466
|
+
{...col.action(item as T)}
|
|
467
|
+
>
|
|
468
|
+
{content}
|
|
469
|
+
</ActionButton>
|
|
470
|
+
) : (
|
|
471
|
+
content
|
|
472
|
+
)}
|
|
473
|
+
</Table.Td>
|
|
474
|
+
);
|
|
475
|
+
})}
|
|
476
|
+
{props.rowActions &&
|
|
477
|
+
(() => {
|
|
478
|
+
const ctx = {
|
|
479
|
+
index,
|
|
480
|
+
form: form as unknown as FormModel<Filters>,
|
|
481
|
+
alepha,
|
|
482
|
+
} as DataTableColumnContext<Filters>;
|
|
483
|
+
const actions = props.rowActions!(item as T, ctx).filter(
|
|
484
|
+
(a) => a.visible !== false,
|
|
485
|
+
);
|
|
486
|
+
if (actions.length === 0) return <Table.Td style={FIT_STYLE} />;
|
|
431
487
|
return (
|
|
432
488
|
<Table.Td
|
|
433
489
|
py={2}
|
|
434
490
|
px={4}
|
|
435
|
-
|
|
436
|
-
style={col.fit ? FIT_STYLE : undefined}
|
|
491
|
+
style={FIT_STYLE}
|
|
437
492
|
onClick={(e) => e.stopPropagation()}
|
|
438
493
|
>
|
|
439
|
-
<
|
|
440
|
-
{
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
494
|
+
<ActionButton
|
|
495
|
+
variant={"minimal"}
|
|
496
|
+
size="xs"
|
|
497
|
+
icon={IconDotsVertical}
|
|
498
|
+
menu={{
|
|
499
|
+
items: actions.map((action) => {
|
|
500
|
+
const Icon = action.icon;
|
|
501
|
+
return {
|
|
502
|
+
label:
|
|
503
|
+
action.label ??
|
|
504
|
+
(typeof action.tooltip === "string"
|
|
505
|
+
? action.tooltip
|
|
506
|
+
: undefined),
|
|
507
|
+
icon:
|
|
508
|
+
Icon && isComponentType(Icon) ? (
|
|
509
|
+
<Icon size={14} />
|
|
510
|
+
) : (
|
|
511
|
+
(Icon as ReactNode)
|
|
512
|
+
),
|
|
513
|
+
onClick: (action as any).onClick
|
|
514
|
+
? async () => {
|
|
515
|
+
await (action as any).onClick();
|
|
516
|
+
if (!action.skipRefresh) {
|
|
517
|
+
await form.submit();
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
: undefined,
|
|
521
|
+
color: action.color,
|
|
522
|
+
};
|
|
523
|
+
}),
|
|
524
|
+
}}
|
|
525
|
+
/>
|
|
451
526
|
</Table.Td>
|
|
452
527
|
);
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
return (
|
|
456
|
-
<Table.Td
|
|
457
|
-
py={2}
|
|
458
|
-
px={4}
|
|
459
|
-
key={key}
|
|
460
|
-
style={col.fit ? FIT_STYLE : undefined}
|
|
461
|
-
>
|
|
462
|
-
{col.value?.(item as T, ctx)}
|
|
463
|
-
</Table.Td>
|
|
464
|
-
);
|
|
465
|
-
})}
|
|
528
|
+
})()}
|
|
466
529
|
</Table.Tr>,
|
|
467
530
|
];
|
|
468
531
|
|
|
@@ -485,106 +548,133 @@ const DataTable = <T extends object, Filters extends TObject>(
|
|
|
485
548
|
}, [props.filters, form.options.schema]);
|
|
486
549
|
|
|
487
550
|
return (
|
|
488
|
-
<Flex
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
selectedItems={selection.selectedItems}
|
|
501
|
-
checkboxActions={props.checkboxActions}
|
|
502
|
-
onClearSelection={selection.clear}
|
|
503
|
-
/>
|
|
504
|
-
|
|
505
|
-
{filterSchema && props.filters && (
|
|
506
|
-
<DataTableFilters
|
|
507
|
-
schema={filterSchema}
|
|
508
|
-
form={form as unknown as FormModel<TObject>}
|
|
509
|
-
typeFormProps={
|
|
510
|
-
props.typeFormProps as DataTableFiltersProps["typeFormProps"]
|
|
511
|
-
}
|
|
551
|
+
<Flex
|
|
552
|
+
gap={"xs"}
|
|
553
|
+
flex={1}
|
|
554
|
+
p={0}
|
|
555
|
+
direction="column"
|
|
556
|
+
style={{ overflow: "hidden" }}
|
|
557
|
+
>
|
|
558
|
+
<Flex rounded bordered elevated shadowed={"xs"} col>
|
|
559
|
+
<DataTableToolbar
|
|
560
|
+
columns={props.columns}
|
|
561
|
+
filters={props.filters}
|
|
562
|
+
columnVisibility={columnVisibility}
|
|
512
563
|
filterVisibility={filterVisibility}
|
|
564
|
+
onColumnVisibilityChange={setColumnVisibility}
|
|
565
|
+
onFilterVisibilityChange={setFilterVisibility}
|
|
566
|
+
actions={props.actions}
|
|
567
|
+
onRefresh={() => form.submit()}
|
|
568
|
+
items={items.content as T[]}
|
|
569
|
+
withExport={props.withExport}
|
|
570
|
+
selectedItems={selection.selectedItems}
|
|
571
|
+
checkboxActions={props.checkboxActions}
|
|
572
|
+
onClearSelection={selection.clear}
|
|
513
573
|
/>
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
<Table
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
}
|
|
574
|
+
|
|
575
|
+
{filterSchema && props.filters && (
|
|
576
|
+
<DataTableFilters
|
|
577
|
+
schema={filterSchema}
|
|
578
|
+
form={form as unknown as FormModel<TObject>}
|
|
579
|
+
typeFormProps={
|
|
580
|
+
props.typeFormProps as DataTableFiltersProps["typeFormProps"]
|
|
581
|
+
}
|
|
582
|
+
filterVisibility={filterVisibility}
|
|
583
|
+
/>
|
|
584
|
+
)}
|
|
585
|
+
</Flex>
|
|
586
|
+
|
|
587
|
+
<Flex
|
|
588
|
+
col
|
|
589
|
+
rounded
|
|
590
|
+
bordered
|
|
591
|
+
elevated
|
|
592
|
+
shadowed={"xs"}
|
|
593
|
+
flex={1}
|
|
594
|
+
style={{ minHeight: 0 }}
|
|
595
|
+
>
|
|
596
|
+
<Flex className="overflow-auto" flex={1} style={{ minHeight: 0 }} col>
|
|
597
|
+
<Table
|
|
598
|
+
aria-label="Data table"
|
|
599
|
+
withRowBorders
|
|
600
|
+
highlightOnHover
|
|
601
|
+
{...props.tableProps}
|
|
542
602
|
>
|
|
543
|
-
|
|
544
|
-
|
|
603
|
+
<Table.Thead
|
|
604
|
+
bdrs={"md"}
|
|
605
|
+
style={{
|
|
606
|
+
position: "sticky",
|
|
607
|
+
top: 0,
|
|
608
|
+
zIndex: 1,
|
|
609
|
+
backgroundColor: "var(--alepha-elevated)",
|
|
610
|
+
}}
|
|
611
|
+
>
|
|
545
612
|
<Table.Tr>
|
|
546
|
-
<Table.
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
>
|
|
551
|
-
<Text c="dimmed" size="sm">
|
|
552
|
-
{form.submitting ? "Loading…" : "No results"}
|
|
553
|
-
</Text>
|
|
554
|
-
</Table.Td>
|
|
613
|
+
{panelConfig && <Table.Th style={{ width: 36 }} />}
|
|
614
|
+
{checkboxHeader}
|
|
615
|
+
{head}
|
|
616
|
+
{props.rowActions && <Table.Th style={FIT_STYLE} />}
|
|
555
617
|
</Table.Tr>
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
618
|
+
</Table.Thead>
|
|
619
|
+
<Table.Tbody>
|
|
620
|
+
{!loaded || form.submitting ? (
|
|
621
|
+
<Table.Tr>
|
|
622
|
+
<Table.Td colSpan={totalColumns || 1} py="sm">
|
|
623
|
+
<Flex justify="center" p={"md"}>
|
|
624
|
+
<Loader size="sm" type="dots" />
|
|
625
|
+
</Flex>
|
|
626
|
+
</Table.Td>
|
|
627
|
+
</Table.Tr>
|
|
628
|
+
) : rows.length === 0 ? (
|
|
629
|
+
<Table.Tr>
|
|
630
|
+
<Table.Td colSpan={totalColumns || 1} py="xl">
|
|
631
|
+
<Flex justify="center">
|
|
632
|
+
<Text c="dimmed" size="sm">
|
|
633
|
+
{props.emptyLabel ?? "No results"}
|
|
634
|
+
</Text>
|
|
635
|
+
</Flex>
|
|
636
|
+
</Table.Td>
|
|
637
|
+
</Table.Tr>
|
|
638
|
+
) : (
|
|
639
|
+
rows
|
|
640
|
+
)}
|
|
641
|
+
</Table.Tbody>
|
|
642
|
+
</Table>
|
|
643
|
+
</Flex>
|
|
560
644
|
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
645
|
+
{props.infinityScroll && <div ref={sentinelRef} />}
|
|
646
|
+
|
|
647
|
+
{!props.infinityScroll && (
|
|
648
|
+
<DataTablePagination
|
|
649
|
+
page={page}
|
|
650
|
+
size={size}
|
|
651
|
+
totalPages={items.page?.totalPages}
|
|
652
|
+
totalElements={items.page?.totalElements}
|
|
653
|
+
isFirst={items.page?.isFirst}
|
|
654
|
+
isLast={items.page?.isLast}
|
|
655
|
+
offset={items.page?.offset ?? 0}
|
|
656
|
+
numberOfElements={items.content.length}
|
|
657
|
+
onPageChange={(value) => {
|
|
658
|
+
form.input.page.set(value - 1);
|
|
659
|
+
}}
|
|
660
|
+
onSizeChange={(value) => {
|
|
661
|
+
form.input.size.set(value);
|
|
662
|
+
}}
|
|
663
|
+
/>
|
|
664
|
+
)}
|
|
665
|
+
|
|
666
|
+
{drawerConfig && (
|
|
667
|
+
<Drawer
|
|
668
|
+
opened={drawerItem !== null}
|
|
669
|
+
onClose={() => setDrawerItem(null)}
|
|
670
|
+
position="right"
|
|
671
|
+
size="xl"
|
|
672
|
+
{...drawerConfig.props}
|
|
673
|
+
>
|
|
674
|
+
{drawerItem && drawerConfig.render(drawerItem)}
|
|
675
|
+
</Drawer>
|
|
676
|
+
)}
|
|
677
|
+
</Flex>
|
|
588
678
|
</Flex>
|
|
589
679
|
);
|
|
590
680
|
};
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Flex } from "@mantine/core";
|
|
1
|
+
import { Flex } from "@alepha/ui";
|
|
3
2
|
import { type TObject, t } from "alepha";
|
|
4
3
|
import type { FormModel } from "alepha/react/form";
|
|
5
4
|
import { useMemo } from "react";
|
|
@@ -16,12 +15,9 @@ export interface DataTableFiltersProps {
|
|
|
16
15
|
filterVisibility: FilterVisibility;
|
|
17
16
|
}
|
|
18
17
|
|
|
19
|
-
const DataTableFilters = ({
|
|
20
|
-
schema,
|
|
21
|
-
|
|
22
|
-
typeFormProps,
|
|
23
|
-
filterVisibility,
|
|
24
|
-
}: DataTableFiltersProps) => {
|
|
18
|
+
const DataTableFilters = (props: DataTableFiltersProps) => {
|
|
19
|
+
const { schema, form, typeFormProps, filterVisibility } = props;
|
|
20
|
+
|
|
25
21
|
const visibleSchema = useMemo(() => {
|
|
26
22
|
const visibleKeys = Object.keys(schema.properties).filter(
|
|
27
23
|
(key) => filterVisibility[key] !== false,
|
|
@@ -47,14 +43,8 @@ const DataTableFilters = ({
|
|
|
47
43
|
}
|
|
48
44
|
|
|
49
45
|
return (
|
|
50
|
-
<Flex
|
|
51
|
-
w="100%"
|
|
52
|
-
p="xs"
|
|
53
|
-
bg={ui.colors.surface}
|
|
54
|
-
style={{ borderBottom: "1px solid var(--alepha-border)" }}
|
|
55
|
-
>
|
|
46
|
+
<Flex surface flex={1} mt={-4} p="xs" m="xs" bdrs="md">
|
|
56
47
|
<TypeForm
|
|
57
|
-
size={"xs"}
|
|
58
48
|
{...typeFormProps}
|
|
59
49
|
skipSubmitButton
|
|
60
50
|
fill
|
|
@@ -65,7 +55,7 @@ const DataTableFilters = ({
|
|
|
65
55
|
sm: 2,
|
|
66
56
|
md: 3,
|
|
67
57
|
lg: 4,
|
|
68
|
-
xl:
|
|
58
|
+
xl: 5,
|
|
69
59
|
}}
|
|
70
60
|
/>
|
|
71
61
|
</Flex>
|
|
@@ -1,9 +1,15 @@
|
|
|
1
|
-
import { Flex,
|
|
1
|
+
import { Flex, Text } from "@alepha/ui";
|
|
2
|
+
import { Pagination, Select } from "@mantine/core";
|
|
2
3
|
|
|
3
4
|
export interface DataTablePaginationProps {
|
|
4
5
|
page: number;
|
|
5
6
|
size: string;
|
|
6
|
-
totalPages
|
|
7
|
+
totalPages?: number;
|
|
8
|
+
totalElements?: number;
|
|
9
|
+
isFirst?: boolean;
|
|
10
|
+
isLast?: boolean;
|
|
11
|
+
offset: number;
|
|
12
|
+
numberOfElements: number;
|
|
7
13
|
onPageChange: (page: number) => void;
|
|
8
14
|
onSizeChange: (size: number) => void;
|
|
9
15
|
}
|
|
@@ -12,45 +18,68 @@ const DataTablePagination = ({
|
|
|
12
18
|
page,
|
|
13
19
|
size,
|
|
14
20
|
totalPages,
|
|
21
|
+
totalElements,
|
|
22
|
+
isFirst,
|
|
23
|
+
isLast,
|
|
24
|
+
offset,
|
|
25
|
+
numberOfElements,
|
|
15
26
|
onPageChange,
|
|
16
27
|
onSizeChange,
|
|
17
28
|
}: DataTablePaginationProps) => {
|
|
29
|
+
const from = numberOfElements > 0 ? offset + 1 : 0;
|
|
30
|
+
const to = offset + numberOfElements;
|
|
31
|
+
const hasTotal = totalPages != null;
|
|
32
|
+
|
|
18
33
|
return (
|
|
19
34
|
<Flex
|
|
20
35
|
align="center"
|
|
21
|
-
justify="
|
|
36
|
+
justify="space-between"
|
|
22
37
|
gap="md"
|
|
23
|
-
|
|
38
|
+
px="xs"
|
|
39
|
+
py={4}
|
|
24
40
|
style={{
|
|
25
41
|
borderTop: "1px solid var(--alepha-border)",
|
|
26
42
|
}}
|
|
27
43
|
>
|
|
28
|
-
<Flex>
|
|
29
|
-
<
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
if (value) {
|
|
35
|
-
onSizeChange(Number(value));
|
|
36
|
-
}
|
|
37
|
-
}}
|
|
38
|
-
data={[
|
|
39
|
-
{ value: "5", label: "5" },
|
|
40
|
-
{ value: "10", label: "10" },
|
|
41
|
-
{ value: "25", label: "25" },
|
|
42
|
-
{ value: "50", label: "50" },
|
|
43
|
-
{ value: "100", label: "100" },
|
|
44
|
-
]}
|
|
45
|
-
/>
|
|
44
|
+
<Flex align="center">
|
|
45
|
+
<Text size="xs" c="dimmed">
|
|
46
|
+
{totalElements != null
|
|
47
|
+
? `Showing ${from} - ${to} of ${totalElements}`
|
|
48
|
+
: `Showing ${from} - ${to}`}
|
|
49
|
+
</Text>
|
|
46
50
|
</Flex>
|
|
47
|
-
<Flex>
|
|
48
|
-
<
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
51
|
+
<Flex align="center" gap="md">
|
|
52
|
+
<Flex>
|
|
53
|
+
<Select
|
|
54
|
+
color={"gray"}
|
|
55
|
+
c={"gray"}
|
|
56
|
+
size={"xs"}
|
|
57
|
+
w={96}
|
|
58
|
+
variant="default"
|
|
59
|
+
value={size}
|
|
60
|
+
onChange={(value) => {
|
|
61
|
+
if (value) {
|
|
62
|
+
onSizeChange(Number(value));
|
|
63
|
+
}
|
|
64
|
+
}}
|
|
65
|
+
data={[
|
|
66
|
+
{ value: "10", label: "10" },
|
|
67
|
+
{ value: "25", label: "25" },
|
|
68
|
+
{ value: "50", label: "50" },
|
|
69
|
+
{ value: "100", label: "100" },
|
|
70
|
+
]}
|
|
71
|
+
/>
|
|
72
|
+
</Flex>
|
|
73
|
+
<Flex>
|
|
74
|
+
<Pagination
|
|
75
|
+
size={"sm"}
|
|
76
|
+
withEdges={hasTotal}
|
|
77
|
+
withPages={hasTotal}
|
|
78
|
+
total={hasTotal ? totalPages : isLast !== false ? page : page + 1}
|
|
79
|
+
value={page}
|
|
80
|
+
onChange={onPageChange}
|
|
81
|
+
/>
|
|
82
|
+
</Flex>
|
|
54
83
|
</Flex>
|
|
55
84
|
</Flex>
|
|
56
85
|
);
|