@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.
Files changed (280) hide show
  1. package/dist/admin/{AdminApiKeys-C-6_Q-lH.js → AdminApiKeys-Dy_k-4Vd.js} +17 -38
  2. package/dist/admin/AdminApiKeys-Dy_k-4Vd.js.map +1 -0
  3. package/dist/admin/{AdminAudits-Bgbf04hO.js → AdminAudits-CKiFMSSU.js} +23 -19
  4. package/dist/admin/AdminAudits-CKiFMSSU.js.map +1 -0
  5. package/dist/admin/AdminDashboard-PhC_dZqo.js +67 -0
  6. package/dist/admin/AdminDashboard-PhC_dZqo.js.map +1 -0
  7. package/dist/admin/{AdminFiles-B9a7G3cY.js → AdminFiles-DFTjijGp.js} +3 -7
  8. package/dist/admin/AdminFiles-DFTjijGp.js.map +1 -0
  9. package/dist/admin/{AdminJobDashboard-DaTwf5OY.js → AdminJobDashboard-BL8gGPDp.js} +2 -2
  10. package/dist/admin/{AdminJobDashboard-DaTwf5OY.js.map → AdminJobDashboard-BL8gGPDp.js.map} +1 -1
  11. package/dist/admin/{AdminJobExecutions-B9cek5dl.js → AdminJobExecutions-D9E-CS-U.js} +24 -36
  12. package/dist/admin/AdminJobExecutions-D9E-CS-U.js.map +1 -0
  13. package/dist/admin/{AdminJobRegistry-DFgV3oqx.js → AdminJobRegistry-Ci9ue1zC.js} +10 -18
  14. package/dist/admin/AdminJobRegistry-Ci9ue1zC.js.map +1 -0
  15. package/dist/admin/AdminLayout-I6TlUMPc.js +61 -0
  16. package/dist/admin/AdminLayout-I6TlUMPc.js.map +1 -0
  17. package/dist/admin/AdminNotifications-ZPHCYrv7.js +542 -0
  18. package/dist/admin/AdminNotifications-ZPHCYrv7.js.map +1 -0
  19. package/dist/admin/{AdminParameters-DHw9ATgl.js → AdminParameters-CqgvhRsb.js} +120 -105
  20. package/dist/admin/AdminParameters-CqgvhRsb.js.map +1 -0
  21. package/dist/admin/{AdminSessions-BhGJPI3z.js → AdminSessions-Bz5NRuoW.js} +48 -53
  22. package/dist/admin/AdminSessions-Bz5NRuoW.js.map +1 -0
  23. package/dist/admin/{AdminUserLayout-BdC4Te8m.js → AdminUserLayout-lXT6I0Qq.js} +14 -8
  24. package/dist/admin/AdminUserLayout-lXT6I0Qq.js.map +1 -0
  25. package/dist/admin/{AdminUserProfile-DAt23fqY.js → AdminUserProfile-vFBLoJ3h.js} +3 -3
  26. package/dist/admin/{AdminUserProfile-DAt23fqY.js.map → AdminUserProfile-vFBLoJ3h.js.map} +1 -1
  27. package/dist/admin/{AdminUserSessions-1uzcx02z.js → AdminUserSessions-CT_YDim0.js} +33 -35
  28. package/dist/admin/AdminUserSessions-CT_YDim0.js.map +1 -0
  29. package/dist/admin/AdminUsers-D1UfGya9.js +206 -0
  30. package/dist/admin/AdminUsers-D1UfGya9.js.map +1 -0
  31. package/dist/admin/{AuthLayout-DFJvCvzw.js → AuthLayout-_frhdgOO.js} +2 -2
  32. package/dist/admin/{AuthLayout-DFJvCvzw.js.map → AuthLayout-_frhdgOO.js.map} +1 -1
  33. package/dist/admin/{IconGoogle-CSQLPYwX.js → IconGoogle-Ch1m3Uzl.js} +1 -1
  34. package/dist/admin/{IconGoogle-CSQLPYwX.js.map → IconGoogle-Ch1m3Uzl.js.map} +1 -1
  35. package/dist/admin/Login-xtNmQtGh.js +275 -0
  36. package/dist/admin/Login-xtNmQtGh.js.map +1 -0
  37. package/dist/{auth/Profile-BMX_Ar_s.js → admin/Profile-_AtPUwAP.js} +31 -27
  38. package/dist/admin/Profile-_AtPUwAP.js.map +1 -0
  39. package/dist/admin/{Register-Cs10l8vX.js → Register-JcCjHUUn.js} +199 -143
  40. package/dist/admin/Register-JcCjHUUn.js.map +1 -0
  41. package/dist/admin/{ResetPassword-BwDdfkGH.js → ResetPassword-CwGBPLJO.js} +7 -7
  42. package/dist/admin/ResetPassword-CwGBPLJO.js.map +1 -0
  43. package/dist/admin/{VerifyEmail-DfXHAiQl.js → VerifyEmail-hNxWejWf.js} +23 -8
  44. package/dist/admin/VerifyEmail-hNxWejWf.js.map +1 -0
  45. package/dist/admin/{core-2xoLiT0o.js → core-CYaRQ8O-.js} +2082 -688
  46. package/dist/admin/core-CYaRQ8O-.js.map +1 -0
  47. package/dist/admin/index.d.ts +112 -48
  48. package/dist/admin/index.d.ts.map +1 -1
  49. package/dist/admin/index.js +467 -69
  50. package/dist/admin/index.js.map +1 -1
  51. package/dist/auth/{AuthLayout-CAE1pX9s.js → AuthLayout-AvLlcLjS.js} +2 -2
  52. package/dist/auth/{AuthLayout-CAE1pX9s.js.map → AuthLayout-AvLlcLjS.js.map} +1 -1
  53. package/dist/auth/Login-BA1E8IZl.js +275 -0
  54. package/dist/auth/Login-BA1E8IZl.js.map +1 -0
  55. package/dist/{admin/Profile-B-c9pCPf.js → auth/Profile-YcWdeuFz.js} +31 -27
  56. package/dist/auth/Profile-YcWdeuFz.js.map +1 -0
  57. package/dist/auth/{Register-6hi_cpfF.js → Register-CPhEO5MG.js} +198 -142
  58. package/dist/auth/Register-CPhEO5MG.js.map +1 -0
  59. package/dist/{demo/ResetPassword-DWN0lzr5.js → auth/ResetPassword-DCtGcneA.js} +7 -7
  60. package/dist/auth/ResetPassword-DCtGcneA.js.map +1 -0
  61. package/dist/{demo/VerifyEmail-DZWL72K4.js → auth/VerifyEmail-DkH7NBfn.js} +23 -8
  62. package/dist/auth/VerifyEmail-DkH7NBfn.js.map +1 -0
  63. package/dist/auth/{core-niW0sFLv.js → core-D5jIAVF2.js} +1385 -329
  64. package/dist/auth/core-D5jIAVF2.js.map +1 -0
  65. package/dist/auth/index.d.ts +105 -49
  66. package/dist/auth/index.d.ts.map +1 -1
  67. package/dist/auth/index.js +29 -26
  68. package/dist/auth/index.js.map +1 -1
  69. package/dist/core/index.d.ts +210 -74
  70. package/dist/core/index.d.ts.map +1 -1
  71. package/dist/core/index.js +2247 -834
  72. package/dist/core/index.js.map +1 -1
  73. package/dist/demo/{AuthLayout-jLa0aKsI.js → AuthLayout-Brri4A-L.js} +2 -2
  74. package/dist/demo/{AuthLayout-jLa0aKsI.js.map → AuthLayout-Brri4A-L.js.map} +1 -1
  75. package/dist/demo/DemoButton-wiCxZZ_L.js +182 -0
  76. package/dist/demo/DemoButton-wiCxZZ_L.js.map +1 -0
  77. package/dist/demo/DemoControlSelect-D7ILObVg.js +305 -0
  78. package/dist/demo/DemoControlSelect-D7ILObVg.js.map +1 -0
  79. package/dist/demo/DemoDataTable-DZ5Y8pFX.js +362 -0
  80. package/dist/demo/DemoDataTable-DZ5Y8pFX.js.map +1 -0
  81. package/dist/demo/{DemoDialog-4ItHLf9t.js → DemoDialog-CUWdLHim.js} +2 -2
  82. package/dist/demo/{DemoDialog-4ItHLf9t.js.map → DemoDialog-CUWdLHim.js.map} +1 -1
  83. package/dist/demo/{DemoFlex-EtVq8QfX.js → DemoFlex-a8OhMMvq.js} +3 -3
  84. package/dist/demo/{DemoFlex-EtVq8QfX.js.map → DemoFlex-a8OhMMvq.js.map} +1 -1
  85. package/dist/demo/{DemoHeading-BS-vGfkI.js → DemoHeading-C13OVDfS.js} +3 -3
  86. package/dist/demo/{DemoHeading-BS-vGfkI.js.map → DemoHeading-C13OVDfS.js.map} +1 -1
  87. package/dist/demo/{DemoHome-Clbn8AmS.js → DemoHome-D_De3UiT.js} +2 -2
  88. package/dist/demo/{DemoHome-Clbn8AmS.js.map → DemoHome-D_De3UiT.js.map} +1 -1
  89. package/dist/demo/{DemoJsonViewer-DkIX_ky2.js → DemoJsonViewer-B50s9aGM.js} +3 -3
  90. package/dist/demo/{DemoJsonViewer-DkIX_ky2.js.map → DemoJsonViewer-B50s9aGM.js.map} +1 -1
  91. package/dist/demo/{DemoLayout-C56xb5EE.js → DemoLayout-CHU8WTwO.js} +14 -5
  92. package/dist/demo/DemoLayout-CHU8WTwO.js.map +1 -0
  93. package/dist/demo/{DemoLogin-BZwpicOS.js → DemoLogin-BBlrWpml.js} +49 -32
  94. package/dist/demo/DemoLogin-BBlrWpml.js.map +1 -0
  95. package/dist/demo/{DemoRegister-C7_qc4MJ.js → DemoRegister-BuNE3_-f.js} +49 -50
  96. package/dist/demo/DemoRegister-BuNE3_-f.js.map +1 -0
  97. package/dist/demo/{DemoResetPassword-BI1Ct4Dw.js → DemoResetPassword-D_IjjjOJ.js} +12 -16
  98. package/dist/demo/DemoResetPassword-D_IjjjOJ.js.map +1 -0
  99. package/dist/demo/{DemoSidebar-CcBo4ltC.js → DemoSidebar-Giy2HRBD.js} +3 -3
  100. package/dist/demo/{DemoSidebar-CcBo4ltC.js.map → DemoSidebar-Giy2HRBD.js.map} +1 -1
  101. package/dist/demo/{DemoText-CzXuUn3g.js → DemoText-ubcw-vog.js} +3 -3
  102. package/dist/demo/{DemoText-CzXuUn3g.js.map → DemoText-ubcw-vog.js.map} +1 -1
  103. package/dist/demo/{DemoToast-BgHDhWrX.js → DemoToast-9die_dYT.js} +2 -2
  104. package/dist/demo/{DemoToast-BgHDhWrX.js.map → DemoToast-9die_dYT.js.map} +1 -1
  105. package/dist/demo/{DemoTypeForm-DDzWoMSV.js → DemoTypeForm-D_d6OVKL.js} +8 -4
  106. package/dist/demo/DemoTypeForm-D_d6OVKL.js.map +1 -0
  107. package/dist/demo/DemoVerifyEmail-B43KlF4F.js +34 -0
  108. package/dist/demo/DemoVerifyEmail-B43KlF4F.js.map +1 -0
  109. package/dist/demo/Login-C12N4oGs.js +275 -0
  110. package/dist/demo/Login-C12N4oGs.js.map +1 -0
  111. package/dist/demo/{Profile-CWqti7FB.js → Profile-DS5q4vOh.js} +31 -27
  112. package/dist/demo/Profile-DS5q4vOh.js.map +1 -0
  113. package/dist/demo/{Register-a70LPgs2.js → Register-B4hLBeEv.js} +198 -142
  114. package/dist/demo/Register-B4hLBeEv.js.map +1 -0
  115. package/dist/{auth/ResetPassword-CqfTk1FI.js → demo/ResetPassword-D8g9ha1N.js} +7 -7
  116. package/dist/demo/ResetPassword-D8g9ha1N.js.map +1 -0
  117. package/dist/demo/{Showcase-Dq3MISpd.js → Showcase-D6Fxt4X4.js} +64 -65
  118. package/dist/demo/Showcase-D6Fxt4X4.js.map +1 -0
  119. package/dist/{auth/VerifyEmail-nWiSTMjF.js → demo/VerifyEmail-BjDo0cZA.js} +23 -8
  120. package/dist/demo/VerifyEmail-BjDo0cZA.js.map +1 -0
  121. package/dist/demo/{auth-d6n3xbug.js → auth-ByVTreDl.js} +8 -8
  122. package/dist/demo/{auth-d6n3xbug.js.map → auth-ByVTreDl.js.map} +1 -1
  123. package/dist/demo/{core-RCUw1Q-a.js → core-DFgB3yU4.js} +2182 -756
  124. package/dist/demo/core-DFgB3yU4.js.map +1 -0
  125. package/dist/demo/index.d.ts +1 -0
  126. package/dist/demo/index.d.ts.map +1 -1
  127. package/dist/demo/index.js +24 -18
  128. package/dist/demo/index.js.map +1 -1
  129. package/package.json +7 -7
  130. package/src/admin/{AdminRouter.ts → AdminRouter.tsx} +150 -18
  131. package/src/admin/components/AdminDashboard.tsx +52 -0
  132. package/src/admin/components/AdminLayout.tsx +32 -40
  133. package/src/admin/components/audits/AdminAudits.tsx +22 -16
  134. package/src/admin/components/files/AdminFiles.tsx +1 -6
  135. package/src/admin/components/jobs/AdminJobExecutions.tsx +33 -39
  136. package/src/admin/components/jobs/AdminJobRegistry.tsx +9 -18
  137. package/src/admin/components/keys/AdminApiKeys.tsx +23 -41
  138. package/src/admin/components/notifications/AdminNotifications.tsx +519 -0
  139. package/src/admin/components/parameters/ParameterDetails.tsx +12 -270
  140. package/src/admin/components/parameters/ParameterDetailsConfigForm.tsx +238 -0
  141. package/src/admin/components/parameters/ParameterDetailsLoading.tsx +24 -0
  142. package/src/admin/components/parameters/ParameterHistory.tsx +10 -11
  143. package/src/admin/components/parameters/ParameterTree.tsx +28 -184
  144. package/src/admin/components/parameters/ParameterTreeNode.tsx +151 -0
  145. package/src/admin/components/sessions/AdminSessions.tsx +71 -71
  146. package/src/admin/components/shared/AdminResourceHeader.tsx +2 -25
  147. package/src/admin/components/shared/AdminResourceHeaderMenuItem.tsx +37 -0
  148. package/src/admin/components/shared/AdminResourceTabs.tsx +2 -26
  149. package/src/admin/components/shared/AdminResourceTabsItem.tsx +36 -0
  150. package/src/admin/components/users/AdminUserSessions.tsx +33 -31
  151. package/src/admin/components/users/AdminUsers.tsx +184 -72
  152. package/src/admin/index.ts +2 -2
  153. package/src/admin/primitives/$uiAdmin.ts +1 -1
  154. package/src/auth/components/Login.tsx +188 -121
  155. package/src/auth/components/Profile.tsx +1 -22
  156. package/src/auth/components/ProfileField.tsx +39 -0
  157. package/src/auth/components/Register.tsx +215 -158
  158. package/src/auth/components/ResetPassword.tsx +7 -11
  159. package/src/auth/components/VerifyEmail.tsx +35 -10
  160. package/src/auth/components/buttons/UserButton.tsx +20 -24
  161. package/src/auth/index.ts +1 -0
  162. package/src/core/atoms/alephaSidebarAtom.ts +1 -1
  163. package/src/core/atoms/alephaThemeListAtom.ts +14 -1
  164. package/src/core/atoms/alephaThemeOverridesAtom.ts +17 -0
  165. package/src/core/atoms/themes/editorial.ts +184 -0
  166. package/src/core/atoms/themes/monochrome.ts +197 -0
  167. package/src/core/atoms/themes/rosePine.ts +208 -0
  168. package/src/core/atoms/themes/softBrutalism.ts +221 -0
  169. package/src/core/atoms/themes/terminal.ts +186 -0
  170. package/src/core/components/Flex.tsx +101 -1
  171. package/src/core/components/Text.tsx +1 -1
  172. package/src/core/components/buttons/ActionButton.tsx +109 -87
  173. package/src/core/components/buttons/DarkModeButton.tsx +3 -3
  174. package/src/core/components/buttons/LanguageButton.tsx +1 -1
  175. package/src/core/components/buttons/OmnibarButton.tsx +1 -2
  176. package/src/core/components/buttons/ThemeButton.tsx +40 -11
  177. package/src/core/components/buttons/ThemeExpertModal.tsx +184 -0
  178. package/src/core/components/buttons/ToggleSidebarButton.tsx +1 -2
  179. package/src/core/components/data/DetailDrawer.tsx +102 -96
  180. package/src/core/components/data/DetailList.tsx +2 -1
  181. package/src/core/components/layout/AppBar.tsx +10 -0
  182. package/src/core/components/layout/Breadcrumb.tsx +3 -6
  183. package/src/core/components/layout/DashboardShell.tsx +28 -11
  184. package/src/core/components/layout/Sidebar.tsx +18 -235
  185. package/src/core/components/layout/SidebarCollapsedItem.tsx +91 -0
  186. package/src/core/components/layout/SidebarItem.tsx +146 -0
  187. package/src/core/components/layout/index.ts +3 -1
  188. package/src/core/constants/ui.ts +5 -5
  189. package/src/core/form/components/Control.tsx +31 -29
  190. package/src/core/form/components/ControlArray.tsx +13 -39
  191. package/src/core/form/components/ControlDate.tsx +10 -21
  192. package/src/core/form/components/ControlNumber.tsx +4 -33
  193. package/src/core/form/components/ControlQueryBuilder.tsx +12 -175
  194. package/src/core/form/components/ControlQueryBuilderHelp.tsx +165 -0
  195. package/src/core/form/components/ControlSelect.browser.spec.tsx +343 -0
  196. package/src/core/form/components/ControlSelect.tsx +294 -92
  197. package/src/core/form/components/TypeForm.browser.spec.tsx +3 -3
  198. package/src/core/form/components/TypeForm.tsx +5 -2
  199. package/src/core/form/index.ts +8 -1
  200. package/src/core/form/utils/parseInput.ts +7 -3
  201. package/src/core/hooks/useTheme.ts +26 -3
  202. package/src/core/index.ts +9 -2
  203. package/src/core/interfaces/AlephaTheme.ts +2 -0
  204. package/src/core/json/components/JsonViewer.tsx +103 -319
  205. package/src/core/json/components/JsonViewerCopyButton.tsx +46 -0
  206. package/src/core/json/components/JsonViewerRowNode.tsx +120 -0
  207. package/src/core/json/components/JsonViewerShared.ts +76 -0
  208. package/src/core/providers/ThemeProvider.ts +108 -8
  209. package/src/core/services/DialogService.tsx +24 -3
  210. package/src/core/styles.css +33 -20
  211. package/src/core/table/components/ColumnPicker.tsx +3 -3
  212. package/src/core/table/components/DataTable.tsx +233 -143
  213. package/src/core/table/components/DataTableFilters.tsx +6 -16
  214. package/src/core/table/components/DataTablePagination.tsx +58 -29
  215. package/src/core/table/components/DataTableToolbar.tsx +16 -7
  216. package/src/core/table/components/FilterPicker.tsx +3 -3
  217. package/src/core/table/index.ts +1 -0
  218. package/src/core/table/interfaces/types.ts +42 -9
  219. package/src/core/utils/icons.tsx +2 -2
  220. package/src/demo/DemoRouter.ts +8 -1
  221. package/src/demo/components/DemoLayout.tsx +12 -2
  222. package/src/demo/components/auth/DemoLogin.tsx +35 -28
  223. package/src/demo/components/auth/DemoRegister.tsx +35 -49
  224. package/src/demo/components/auth/DemoResetPassword.tsx +5 -9
  225. package/src/demo/components/auth/DemoVerifyEmail.tsx +7 -6
  226. package/src/demo/components/core/DemoButton.tsx +123 -103
  227. package/src/demo/components/core/DemoControlSelect.tsx +325 -0
  228. package/src/demo/components/core/DemoDataTable.tsx +255 -241
  229. package/src/demo/components/core/DemoTypeForm.tsx +7 -2
  230. package/src/demo/components/shared/MacWindow.tsx +5 -11
  231. package/src/demo/components/shared/Showcase.tsx +28 -42
  232. package/dist/admin/AdminApiKeys-C-6_Q-lH.js.map +0 -1
  233. package/dist/admin/AdminAudits-Bgbf04hO.js.map +0 -1
  234. package/dist/admin/AdminFiles-B9a7G3cY.js.map +0 -1
  235. package/dist/admin/AdminJobExecutions-B9cek5dl.js.map +0 -1
  236. package/dist/admin/AdminJobRegistry-DFgV3oqx.js.map +0 -1
  237. package/dist/admin/AdminLayout-DHsvWxVB.js +0 -70
  238. package/dist/admin/AdminLayout-DHsvWxVB.js.map +0 -1
  239. package/dist/admin/AdminParameters-DHw9ATgl.js.map +0 -1
  240. package/dist/admin/AdminSessions-BhGJPI3z.js.map +0 -1
  241. package/dist/admin/AdminUserLayout-BdC4Te8m.js.map +0 -1
  242. package/dist/admin/AdminUserSessions-1uzcx02z.js.map +0 -1
  243. package/dist/admin/AdminUsers-C85c3eiQ.js +0 -121
  244. package/dist/admin/AdminUsers-C85c3eiQ.js.map +0 -1
  245. package/dist/admin/Login-BGheURrg.js +0 -219
  246. package/dist/admin/Login-BGheURrg.js.map +0 -1
  247. package/dist/admin/Profile-B-c9pCPf.js.map +0 -1
  248. package/dist/admin/Register-Cs10l8vX.js.map +0 -1
  249. package/dist/admin/ResetPassword-BwDdfkGH.js.map +0 -1
  250. package/dist/admin/VerifyEmail-DfXHAiQl.js.map +0 -1
  251. package/dist/admin/auth-Dr0Cf8I7.js +0 -319
  252. package/dist/admin/auth-Dr0Cf8I7.js.map +0 -1
  253. package/dist/admin/core-2xoLiT0o.js.map +0 -1
  254. package/dist/auth/Login-Denw_UGy.js +0 -219
  255. package/dist/auth/Login-Denw_UGy.js.map +0 -1
  256. package/dist/auth/Profile-BMX_Ar_s.js.map +0 -1
  257. package/dist/auth/Register-6hi_cpfF.js.map +0 -1
  258. package/dist/auth/ResetPassword-CqfTk1FI.js.map +0 -1
  259. package/dist/auth/VerifyEmail-nWiSTMjF.js.map +0 -1
  260. package/dist/auth/core-niW0sFLv.js.map +0 -1
  261. package/dist/demo/DemoButton-BmaWZVwf.js +0 -178
  262. package/dist/demo/DemoButton-BmaWZVwf.js.map +0 -1
  263. package/dist/demo/DemoDataTable-Z9xyV221.js +0 -362
  264. package/dist/demo/DemoDataTable-Z9xyV221.js.map +0 -1
  265. package/dist/demo/DemoLayout-C56xb5EE.js.map +0 -1
  266. package/dist/demo/DemoLogin-BZwpicOS.js.map +0 -1
  267. package/dist/demo/DemoRegister-C7_qc4MJ.js.map +0 -1
  268. package/dist/demo/DemoResetPassword-BI1Ct4Dw.js.map +0 -1
  269. package/dist/demo/DemoTypeForm-DDzWoMSV.js.map +0 -1
  270. package/dist/demo/DemoVerifyEmail-C_Irdnov.js +0 -30
  271. package/dist/demo/DemoVerifyEmail-C_Irdnov.js.map +0 -1
  272. package/dist/demo/Login-hSOU3jZc.js +0 -219
  273. package/dist/demo/Login-hSOU3jZc.js.map +0 -1
  274. package/dist/demo/Profile-CWqti7FB.js.map +0 -1
  275. package/dist/demo/Register-a70LPgs2.js.map +0 -1
  276. package/dist/demo/ResetPassword-DWN0lzr5.js.map +0 -1
  277. package/dist/demo/Showcase-Dq3MISpd.js.map +0 -1
  278. package/dist/demo/VerifyEmail-DZWL72K4.js.map +0 -1
  279. package/dist/demo/core-RCUw1Q-a.js.map +0 -1
  280. 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 { useCallback, useEffect, useMemo, useRef, useState } from "react";
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 : props.defaultSize || 10;
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: items.content,
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
- [items],
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">{col.label}</Text>
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.sm} />}
358
- {sortDir === "desc" && <IconArrowDown size={ui.sizes.icon.sm} />}
359
- {sortDir === null && <IconArrowsSort size={ui.sizes.icon.sm} />}
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
- if (col.actions) {
428
- const rowActions = col
429
- .actions(item as T, ctx)
430
- .filter((a) => a.visible !== false);
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
- key={key}
436
- style={col.fit ? FIT_STYLE : undefined}
491
+ style={FIT_STYLE}
437
492
  onClick={(e) => e.stopPropagation()}
438
493
  >
439
- <Flex gap={4}>
440
- {rowActions.map(({ visible: _, ...actionProps }, i) => (
441
- <ActionButton
442
- key={i}
443
- variant="subtle"
444
- size="xs"
445
- preventDefault
446
- h={20}
447
- {...actionProps}
448
- />
449
- ))}
450
- </Flex>
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 flex={1} p={0} bdrs="sm" direction="column">
489
- <DataTableToolbar
490
- columns={props.columns}
491
- filters={props.filters}
492
- columnVisibility={columnVisibility}
493
- filterVisibility={filterVisibility}
494
- onColumnVisibilityChange={setColumnVisibility}
495
- onFilterVisibilityChange={setFilterVisibility}
496
- actions={props.actions}
497
- onRefresh={() => form.submit()}
498
- items={items.content as T[]}
499
- withExport={props.withExport}
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
- <Flex className="overflow-auto">
517
- <Table
518
- aria-label="Data table"
519
- withColumnBorders
520
- withRowBorders
521
- {...props.tableProps}
522
- >
523
- <Table.Thead
524
- style={{
525
- position: "sticky",
526
- top: 0,
527
- zIndex: 1,
528
- backgroundColor: "var(--mantine-color-body)",
529
- }}
530
- >
531
- <Table.Tr>
532
- {panelConfig && <Table.Th style={{ width: 36 }} />}
533
- {checkboxHeader}
534
- {head}
535
- </Table.Tr>
536
- </Table.Thead>
537
- <Table.Tbody
538
- style={{
539
- opacity: form.submitting ? 0.5 : 1,
540
- transition: "opacity 150ms ease",
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
- {rows}
544
- {items.content.length === 0 && (
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.Td
547
- colSpan={totalColumns || 1}
548
- py="xl"
549
- style={{ textAlign: "center" }}
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
- </Table.Tbody>
558
- </Table>
559
- </Flex>
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
- {props.infinityScroll && <div ref={sentinelRef} />}
562
-
563
- {!props.infinityScroll && (
564
- <DataTablePagination
565
- page={page}
566
- size={size}
567
- totalPages={items.page?.totalPages ?? 1}
568
- onPageChange={(value) => {
569
- form.input.page.set(value - 1);
570
- }}
571
- onSizeChange={(value) => {
572
- form.input.size.set(value);
573
- }}
574
- />
575
- )}
576
-
577
- {drawerConfig && (
578
- <Drawer
579
- opened={drawerItem !== null}
580
- onClose={() => setDrawerItem(null)}
581
- position="right"
582
- size="xl"
583
- {...drawerConfig.props}
584
- >
585
- {drawerItem && drawerConfig.render(drawerItem)}
586
- </Drawer>
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 { ui } from "@alepha/ui";
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
- form,
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: 6,
58
+ xl: 5,
69
59
  }}
70
60
  />
71
61
  </Flex>
@@ -1,9 +1,15 @@
1
- import { Flex, Pagination, Select } from "@mantine/core";
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: number;
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="end"
36
+ justify="space-between"
22
37
  gap="md"
23
- p="xs"
38
+ px="xs"
39
+ py={4}
24
40
  style={{
25
41
  borderTop: "1px solid var(--alepha-border)",
26
42
  }}
27
43
  >
28
- <Flex>
29
- <Select
30
- w={96}
31
- variant="default"
32
- value={size}
33
- onChange={(value) => {
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
- <Pagination
49
- withEdges
50
- total={totalPages}
51
- value={page}
52
- onChange={onPageChange}
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
  );