@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
@@ -0,0 +1,37 @@
1
+ import { Menu } from "@mantine/core";
2
+ import { useRouter } from "alepha/react/router";
3
+ import type { AdminResourceAction } from "./AdminResourceHeader.tsx";
4
+
5
+ export interface AdminResourceHeaderMenuItemProps {
6
+ /**
7
+ * Action configuration
8
+ */
9
+ action: AdminResourceAction;
10
+ }
11
+
12
+ const AdminResourceHeaderMenuItem = (
13
+ props: AdminResourceHeaderMenuItemProps,
14
+ ) => {
15
+ const { action } = props;
16
+ const router = useRouter();
17
+
18
+ const menuItemProps: Record<string, unknown> = {};
19
+ if (action.href) {
20
+ Object.assign(menuItemProps, router.anchor(action.href));
21
+ } else if (action.onClick) {
22
+ menuItemProps.onClick = action.onClick;
23
+ }
24
+
25
+ return (
26
+ <Menu.Item
27
+ leftSection={action.icon ? <action.icon size={16} /> : undefined}
28
+ color={action.color}
29
+ disabled={action.disabled}
30
+ {...menuItemProps}
31
+ >
32
+ {action.label}
33
+ </Menu.Item>
34
+ );
35
+ };
36
+
37
+ export default AdminResourceHeaderMenuItem;
@@ -1,6 +1,6 @@
1
1
  import { Tabs } from "@mantine/core";
2
- import { useActive, useRouter } from "alepha/react/router";
3
2
  import type { ComponentType, ReactNode } from "react";
3
+ import AdminResourceTabsItem from "./AdminResourceTabsItem.tsx";
4
4
 
5
5
  export interface AdminResourceTab {
6
6
  /**
@@ -51,30 +51,6 @@ export interface AdminResourceTabsProps {
51
51
  children?: ReactNode;
52
52
  }
53
53
 
54
- const TabItem = (props: { tab: AdminResourceTab }) => {
55
- const { tab } = props;
56
- const router = useRouter();
57
- const { isActive, isPending } = useActive({ href: tab.href });
58
- const anchorProps = router.anchor(tab.href);
59
-
60
- return (
61
- <Tabs.Tab
62
- value={tab.value}
63
- component="a"
64
- leftSection={tab.icon ? <tab.icon size={16} /> : undefined}
65
- disabled={tab.disabled}
66
- data-active={isActive || undefined}
67
- style={{
68
- opacity: isPending ? 0.6 : 1,
69
- }}
70
- {...anchorProps}
71
- >
72
- {tab.label}
73
- {tab.count !== undefined && tab.count > 0 && ` (${tab.count})`}
74
- </Tabs.Tab>
75
- );
76
- };
77
-
78
54
  const AdminResourceTabs = (props: AdminResourceTabsProps) => {
79
55
  const { tabs, activeTab, children } = props;
80
56
 
@@ -82,7 +58,7 @@ const AdminResourceTabs = (props: AdminResourceTabsProps) => {
82
58
  <Tabs value={activeTab} variant="default">
83
59
  <Tabs.List>
84
60
  {tabs.map((tab) => (
85
- <TabItem key={tab.value} tab={tab} />
61
+ <AdminResourceTabsItem key={tab.value} tab={tab} />
86
62
  ))}
87
63
  </Tabs.List>
88
64
 
@@ -0,0 +1,36 @@
1
+ import { Tabs } from "@mantine/core";
2
+ import { useActive, useRouter } from "alepha/react/router";
3
+ import type { AdminResourceTab } from "./AdminResourceTabs.tsx";
4
+
5
+ export interface AdminResourceTabsItemProps {
6
+ /**
7
+ * Tab configuration
8
+ */
9
+ tab: AdminResourceTab;
10
+ }
11
+
12
+ const AdminResourceTabsItem = (props: AdminResourceTabsItemProps) => {
13
+ const { tab } = props;
14
+ const router = useRouter();
15
+ const { isActive, isPending } = useActive({ href: tab.href });
16
+ const anchorProps = router.anchor(tab.href);
17
+
18
+ return (
19
+ <Tabs.Tab
20
+ value={tab.value}
21
+ component="a"
22
+ leftSection={tab.icon ? <tab.icon size={16} /> : undefined}
23
+ disabled={tab.disabled}
24
+ data-active={isActive || undefined}
25
+ style={{
26
+ opacity: isPending ? 0.6 : 1,
27
+ }}
28
+ {...anchorProps}
29
+ >
30
+ {tab.label}
31
+ {tab.count !== undefined && tab.count > 0 && ` (${tab.count})`}
32
+ </Tabs.Tab>
33
+ );
34
+ };
35
+
36
+ export default AdminResourceTabsItem;
@@ -1,4 +1,5 @@
1
- import { DataTable, Flex, Text, useDialog } from "@alepha/ui";
1
+ import { DataTable, Flex, Text, useDialog, useToast } from "@alepha/ui";
2
+ import { Badge } from "@mantine/core";
2
3
  import {
3
4
  IconDeviceDesktop,
4
5
  IconDeviceMobile,
@@ -38,20 +39,22 @@ const AdminUserSessions = (props: AdminUserSessionsProps) => {
38
39
  const client = useClient<AdminSessionController>();
39
40
  const { l } = useI18n();
40
41
  const dialog = useDialog();
42
+ const toast = useToast();
41
43
  const [refreshKey, setRefreshKey] = useState(0);
42
44
 
43
- const handleDeleteSession = async (sessionId: string) => {
45
+ const handleDeleteSession = async (session: SessionEntity) => {
44
46
  const confirmed = await dialog.confirm({
45
- title: "Revoke Session",
46
- message: "Are you sure you want to revoke this session?",
47
+ title: "Revoke session",
48
+ message:
49
+ "Are you sure you want to revoke this session? The user will be signed out on this device.",
47
50
  });
48
- if (confirmed) {
49
- await client.deleteSession({
50
- params: { id: sessionId },
51
- query: { userRealmName: props.userRealmName },
52
- });
53
- setRefreshKey((k) => k + 1);
54
- }
51
+ if (!confirmed) return;
52
+ await client.deleteSession({
53
+ params: { id: session.id },
54
+ query: { userRealmName: props.userRealmName },
55
+ });
56
+ toast.success("Session revoked");
57
+ setRefreshKey((k) => k + 1);
55
58
  };
56
59
 
57
60
  return (
@@ -88,50 +91,49 @@ const AdminUserSessions = (props: AdminUserSessionsProps) => {
88
91
  <Text size="xs">
89
92
  {item.userAgent
90
93
  ? `${item.userAgent.browser} / ${item.userAgent.os}`
91
- : "\u2014"}
94
+ : ""}
92
95
  </Text>
93
96
  </Flex>
94
97
  ),
95
98
  },
96
99
  ip: {
97
100
  label: "IP",
98
- fit: true,
99
101
  value: (item) => (
100
- <Text size="xs" ff="monospace" c="dimmed">
101
- {item.ip || "\u2014"}
102
+ <Text size="xs" ff="monospace" muted>
103
+ {item.ip || ""}
102
104
  </Text>
103
105
  ),
104
106
  },
105
107
  status: {
106
108
  label: "Status",
107
- fit: true,
108
109
  value: (item) => (
109
- <Text size="xs" c="dimmed">
110
+ <Badge
111
+ size="sm"
112
+ variant="light"
113
+ color={isExpired(item.expiresAt) ? "gray" : "green"}
114
+ >
110
115
  {isExpired(item.expiresAt) ? "Expired" : "Active"}
111
- </Text>
116
+ </Badge>
112
117
  ),
113
118
  },
114
119
  createdAt: {
115
120
  label: "Created",
116
- fit: true,
117
121
  value: (item) => (
118
- <Text size="xs" c="dimmed">
122
+ <Text size="xs" muted>
119
123
  {l(item.createdAt, { date: "fromNow" })}
120
124
  </Text>
121
125
  ),
122
126
  },
123
- actions: {
124
- label: "",
125
- fit: true,
126
- actions: (item) => [
127
- {
128
- icon: <IconTrash size={14} />,
129
- onClick: () => handleDeleteSession(item.id),
130
- tooltip: "Revoke session",
131
- },
132
- ],
133
- },
134
127
  }}
128
+ rowActions={(item) => [
129
+ {
130
+ label: "Revoke session",
131
+ icon: IconTrash,
132
+ color: "red",
133
+ onClick: () => handleDeleteSession(item),
134
+ visible: !isExpired(item.expiresAt),
135
+ },
136
+ ]}
135
137
  />
136
138
  );
137
139
  };
@@ -1,32 +1,34 @@
1
- import { DataTable, Flex, Text, useDialog, useToast } from "@alepha/ui";
2
- import { Badge } from "@mantine/core";
1
+ import {
2
+ ActionButton,
3
+ DataTable,
4
+ Flex,
5
+ Text,
6
+ useDialog,
7
+ useToast,
8
+ } from "@alepha/ui";
9
+ import { Avatar, Badge } from "@mantine/core";
10
+ import {
11
+ IconEye,
12
+ IconTrash,
13
+ IconUserOff,
14
+ IconUserPlus,
15
+ } from "@tabler/icons-react";
3
16
  import { type Page, t } from "alepha";
4
17
  import type { AdminUserController, UserEntity } from "alepha/api/users";
5
18
  import { useClient } from "alepha/react";
6
19
  import { useI18n } from "alepha/react/i18n";
7
20
  import { useRouter } from "alepha/react/router";
8
21
  import { useState } from "react";
9
- import type { AdminRouter } from "../../AdminRouter.ts";
22
+ import type { AdminRouter } from "../../AdminRouter.tsx";
10
23
 
11
24
  export interface AdminUsersProps {
12
25
  userRealmName?: string;
13
26
  }
14
27
 
15
- const createUserSchema = t.object({
16
- username: t.optional(
17
- t.shortText({
18
- minLength: 3,
19
- maxLength: 50,
20
- pattern: "^[a-zA-Z0-9._-]+$",
21
- }),
22
- ),
23
- email: t.optional(t.email()),
24
- phoneNumber: t.optional(t.e164()),
25
- firstName: t.optional(t.string()),
26
- lastName: t.optional(t.string()),
27
- roles: t.optional(t.array(t.string())),
28
+ const filters = t.object({
29
+ query: t.optional(t.text()),
28
30
  enabled: t.optional(t.boolean()),
29
- password: t.optional(t.string({ minLength: 8 })),
31
+ emailVerified: t.optional(t.boolean()),
30
32
  });
31
33
 
32
34
  const AdminUsers = (props: AdminUsersProps) => {
@@ -37,52 +39,94 @@ const AdminUsers = (props: AdminUsersProps) => {
37
39
  const toast = useToast();
38
40
  const [refreshKey, setRefreshKey] = useState(0);
39
41
 
40
- const filters = t.object({
41
- query: t.optional(
42
- t.string({
43
- $control: {
44
- query: t.object({
45
- email: t.optional(t.email()),
46
- enabled: t.optional(t.boolean()),
47
- emailVerified: t.optional(t.boolean()),
48
- }),
49
- },
50
- }),
51
- ),
52
- });
42
+ const refresh = () => setRefreshKey((k) => k + 1);
43
+
44
+ const handleToggleEnabled = async (user: UserEntity) => {
45
+ const enabled = !user.enabled;
46
+ const confirmed = await dialog.confirm({
47
+ title: enabled ? "Enable user" : "Disable user",
48
+ message: enabled
49
+ ? `Enable ${user.email || user.username || "this user"}?`
50
+ : `Disable ${user.email || user.username || "this user"}? They will no longer be able to sign in.`,
51
+ });
52
+ if (!confirmed) return;
53
+ await client.updateUser({
54
+ params: { id: user.id },
55
+ query: { userRealmName: props.userRealmName },
56
+ body: { enabled },
57
+ });
58
+ toast.success({
59
+ message: enabled ? "User enabled" : "User disabled",
60
+ });
61
+ refresh();
62
+ };
63
+
64
+ const handleDelete = async (user: UserEntity) => {
65
+ const confirmed = await dialog.confirm({
66
+ title: "Delete user",
67
+ message: `Permanently delete ${user.email || user.username || "this user"}? This action cannot be undone.`,
68
+ });
69
+ if (!confirmed) return;
70
+ await client.deleteUser({
71
+ params: { id: user.id },
72
+ query: { userRealmName: props.userRealmName },
73
+ });
74
+ toast.success({ message: "User deleted" });
75
+ refresh();
76
+ };
77
+
78
+ const handleBulkDisable = async (
79
+ items: UserEntity[],
80
+ clearSelection: () => void,
81
+ ) => {
82
+ const enabledUsers = items.filter((u) => u.enabled);
83
+ if (enabledUsers.length === 0) {
84
+ toast.danger({ message: "No active users in selection" });
85
+ return;
86
+ }
87
+ const confirmed = await dialog.confirm({
88
+ title: "Disable users",
89
+ message: `Disable ${enabledUsers.length} user(s)? They will no longer be able to sign in.`,
90
+ });
91
+ if (!confirmed) return;
92
+ for (const user of enabledUsers) {
93
+ await client.updateUser({
94
+ params: { id: user.id },
95
+ query: { userRealmName: props.userRealmName },
96
+ body: { enabled: false },
97
+ });
98
+ }
99
+ toast.success({
100
+ message: `${enabledUsers.length} user(s) disabled`,
101
+ });
102
+ clearSelection();
103
+ refresh();
104
+ };
53
105
 
54
106
  return (
55
- <Flex flex={1} direction="column">
107
+ <Flex p={"md"} flex={1} direction="column">
56
108
  <DataTable<UserEntity, typeof filters>
109
+ withCheckbox
110
+ withExport
111
+ checkboxActions={[
112
+ {
113
+ intent: "danger",
114
+ label: "Disable selected",
115
+ icon: <IconUserOff />,
116
+ onClick: (ctx) =>
117
+ handleBulkDisable(ctx.selectedItems, ctx.clearSelection),
118
+ },
119
+ ]}
57
120
  key={refreshKey}
58
121
  submitOnInit
59
122
  defaultSize={10}
60
- typeFormProps={{
61
- skipSubmitButton: true,
62
- columns: 3,
63
- }}
123
+ defaultFilters={["query"]}
64
124
  tableProps={{
65
125
  horizontalSpacing: "xs",
66
126
  verticalSpacing: "xs",
67
- striped: false,
68
- highlightOnHover: true,
69
- }}
70
- onFilterChange={(key, _value, form) => {
71
- if (key === "query") {
72
- return form.submit();
73
- }
74
127
  }}
128
+ onFilterChange={(_key, _value, form) => form.submit()}
75
129
  filters={filters}
76
- tableTrProps={(item) => ({
77
- style: {
78
- cursor: "pointer",
79
- opacity: item.enabled ? 1 : 0.5,
80
- },
81
- onClick: () =>
82
- router.push("adminUserProfile", {
83
- params: { userId: item.id },
84
- }),
85
- })}
86
130
  items={async (filters) => {
87
131
  const response = await client.findUsers({
88
132
  query: {
@@ -93,49 +137,117 @@ const AdminUsers = (props: AdminUsersProps) => {
93
137
  return response as Page<UserEntity>;
94
138
  }}
95
139
  columns={{
140
+ user: {
141
+ label: "User",
142
+ value: (item) => {
143
+ const name =
144
+ `${item.firstName || ""} ${item.lastName || ""}`.trim() ||
145
+ item.username ||
146
+ "Anonymous";
147
+
148
+ return (
149
+ <ActionButton
150
+ variant={"transparent"}
151
+ href={`/admin/users/${item.id}`}
152
+ >
153
+ <Flex gap={"xs"} centerY>
154
+ <Avatar size={"sm"} name={name} />
155
+ <Flex col>
156
+ <Text size={"sm"} bold>
157
+ {name}
158
+ </Text>
159
+ <Text size="xs" muted>
160
+ {item.email || "\u2014"}
161
+ </Text>
162
+ </Flex>
163
+ </Flex>
164
+ </ActionButton>
165
+ );
166
+ },
167
+ },
96
168
  username: {
97
169
  label: "Username",
170
+ defaultHidden: true,
98
171
  value: (item) => (
99
- <Text size="sm" fw={500}>
172
+ <Text size="sm" ff="monospace">
100
173
  {item.username || "\u2014"}
101
174
  </Text>
102
175
  ),
103
176
  },
104
- email: {
105
- label: "Email",
106
- value: (item) => <Text size="sm">{item.email || "\u2014"}</Text>,
107
- },
108
177
  roles: {
109
178
  label: "Roles",
110
- value: (item) => (
111
- <Flex gap={4}>
112
- {item.roles.map((role: string) => (
113
- <Badge key={role} size="xs" variant="default">
114
- {role}
115
- </Badge>
116
- ))}
117
- </Flex>
118
- ),
179
+ value: (item) =>
180
+ item.roles.length > 0 ? (
181
+ <Flex gap={4}>
182
+ {item.roles.map((role: string) => (
183
+ <Badge key={role} size="xs" variant="default">
184
+ {role}
185
+ </Badge>
186
+ ))}
187
+ </Flex>
188
+ ) : (
189
+ <Text size="xs" muted>
190
+ No roles
191
+ </Text>
192
+ ),
119
193
  },
120
194
  enabled: {
121
195
  label: "Status",
122
- fit: true,
123
196
  value: (item) => (
124
- <Text size="sm" c="dimmed">
197
+ <Badge
198
+ size="sm"
199
+ variant="light"
200
+ color={item.enabled ? "green" : "red"}
201
+ >
125
202
  {item.enabled ? "Active" : "Disabled"}
126
- </Text>
203
+ </Badge>
204
+ ),
205
+ },
206
+ emailVerified: {
207
+ label: "Email",
208
+ value: (item) => (
209
+ <Badge
210
+ size="sm"
211
+ variant="light"
212
+ color={item.emailVerified ? "green" : "gray"}
213
+ >
214
+ {item.emailVerified ? "Verified" : "Unverified"}
215
+ </Badge>
127
216
  ),
128
217
  },
129
218
  createdAt: {
130
- label: "Created",
131
- fit: true,
219
+ label: "Joined",
220
+ sortable: true,
221
+ sortKey: "createdAt",
132
222
  value: (item) => (
133
- <Text size="xs" c="dimmed">
223
+ <Text size="xs" muted>
134
224
  {l(item.createdAt, { date: "fromNow" })}
135
225
  </Text>
136
226
  ),
137
227
  },
138
228
  }}
229
+ rowActions={(item) => [
230
+ {
231
+ label: "View profile",
232
+ icon: IconEye,
233
+ onClick: () =>
234
+ router.push("adminUserProfile", {
235
+ params: { userId: item.id },
236
+ }),
237
+ },
238
+ {
239
+ label: item.enabled ? "Disable user" : "Enable user",
240
+ icon: item.enabled ? IconUserOff : IconUserPlus,
241
+ color: item.enabled ? "red" : "green",
242
+ onClick: () => handleToggleEnabled(item),
243
+ },
244
+ {
245
+ label: "Delete user",
246
+ icon: IconTrash,
247
+ color: "red",
248
+ onClick: () => handleDelete(item),
249
+ },
250
+ ]}
139
251
  />
140
252
  </Flex>
141
253
  );
@@ -1,11 +1,11 @@
1
1
  import { AlephaUI } from "@alepha/ui";
2
2
  import { AlephaUIAuth } from "@alepha/ui/auth";
3
3
  import { $module } from "alepha";
4
- import { AdminRouter } from "./AdminRouter.ts";
4
+ import { AdminRouter } from "./AdminRouter.tsx";
5
5
 
6
6
  // ---------------------------------------------------------------------------------------------------------------------
7
7
 
8
- export { AdminRouter } from "./AdminRouter.ts";
8
+ export { AdminRouter } from "./AdminRouter.tsx";
9
9
  export * from "./primitives/$uiAdmin.ts";
10
10
 
11
11
  // ---------------------------------------------------------------------------------------------------------------------
@@ -1,6 +1,6 @@
1
1
  import type { DashboardShellProps } from "@alepha/ui";
2
2
  import { $context } from "alepha";
3
- import { AdminRouter } from "../AdminRouter.ts";
3
+ import { AdminRouter } from "../AdminRouter.tsx";
4
4
 
5
5
  /**
6
6
  * Register Admin UI components and get the AdminRouter instance.