@alepha/ui 0.18.2 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. package/dist/admin/{AdminApiKeys-BJhIwfD6.js → AdminApiKeys-Bt1PjO6o.js} +3 -4
  2. package/dist/admin/{AdminApiKeys-BJhIwfD6.js.map → AdminApiKeys-Bt1PjO6o.js.map} +1 -1
  3. package/dist/admin/{AdminAudits-DzD_4cDt.js → AdminAudits-C7c1CN4c.js} +3 -4
  4. package/dist/admin/{AdminAudits-DzD_4cDt.js.map → AdminAudits-C7c1CN4c.js.map} +1 -1
  5. package/dist/admin/{AdminDashboard-C92tIc6x.js → AdminDashboard-C3RXpTp6.js} +3 -4
  6. package/dist/admin/{AdminDashboard-C92tIc6x.js.map → AdminDashboard-C3RXpTp6.js.map} +1 -1
  7. package/dist/admin/{AdminFiles-DLpfhBkf.js → AdminFiles-31ivR6Wq.js} +3 -4
  8. package/dist/admin/{AdminFiles-DLpfhBkf.js.map → AdminFiles-31ivR6Wq.js.map} +1 -1
  9. package/dist/admin/{AdminJobDashboard-KIOkeMgE.js → AdminJobDashboard-BABLe7hL.js} +73 -25
  10. package/dist/admin/AdminJobDashboard-BABLe7hL.js.map +1 -0
  11. package/dist/admin/{AdminJobExecutions-D0Yo_PU0.js → AdminJobExecutions-D-G8RIlr.js} +3 -4
  12. package/dist/admin/{AdminJobExecutions-D0Yo_PU0.js.map → AdminJobExecutions-D-G8RIlr.js.map} +1 -1
  13. package/dist/admin/{AdminJobRegistry-PFajqaGK.js → AdminJobRegistry-oIS3K9NX.js} +3 -4
  14. package/dist/admin/{AdminJobRegistry-PFajqaGK.js.map → AdminJobRegistry-oIS3K9NX.js.map} +1 -1
  15. package/dist/admin/{AdminLayout-B1DXZHDn.js → AdminLayout-BmZ9mtXh.js} +8 -25
  16. package/dist/admin/AdminLayout-BmZ9mtXh.js.map +1 -0
  17. package/dist/admin/AdminNotifications-DHdzksww.js +541 -0
  18. package/dist/admin/AdminNotifications-DHdzksww.js.map +1 -0
  19. package/dist/admin/{AdminParameters-BspPeqp_.js → AdminParameters-CyZQSXnN.js} +118 -112
  20. package/dist/admin/AdminParameters-CyZQSXnN.js.map +1 -0
  21. package/dist/admin/{AdminSessions-BnH5CZQl.js → AdminSessions--xwELDSO.js} +3 -4
  22. package/dist/admin/{AdminSessions-BnH5CZQl.js.map → AdminSessions--xwELDSO.js.map} +1 -1
  23. package/dist/admin/{AdminUserLayout-DUbC6-BI.js → AdminUserLayout-DvBTG5gd.js} +82 -115
  24. package/dist/admin/AdminUserLayout-DvBTG5gd.js.map +1 -0
  25. package/dist/admin/{AdminUserProfile-DuTUnjdG.js → AdminUserProfile-CzsPBl6Z.js} +7 -6
  26. package/dist/admin/AdminUserProfile-CzsPBl6Z.js.map +1 -0
  27. package/dist/admin/{AdminUserSessions-DvZdAGpL.js → AdminUserSessions-C-aUnhVN.js} +3 -4
  28. package/dist/admin/{AdminUserSessions-DvZdAGpL.js.map → AdminUserSessions-C-aUnhVN.js.map} +1 -1
  29. package/dist/admin/{AdminUsers-CR9z0g_5.js → AdminUsers-BYwei5sj.js} +4 -4
  30. package/dist/admin/AdminUsers-BYwei5sj.js.map +1 -0
  31. package/dist/admin/{AuthLayout-DsUfp9RG.js → AuthLayout-CkPGLJku.js} +3 -4
  32. package/dist/admin/{AuthLayout-DsUfp9RG.js.map → AuthLayout-CkPGLJku.js.map} +1 -1
  33. package/dist/{demo/IconGoogle-CSQLPYwX.js → admin/IconGoogle-8Nkx6yax.js} +2 -4
  34. package/dist/admin/{IconGoogle-Ch1m3Uzl.js.map → IconGoogle-8Nkx6yax.js.map} +1 -1
  35. package/dist/admin/Login-DSBqNsZc.js +274 -0
  36. package/dist/admin/Login-DSBqNsZc.js.map +1 -0
  37. package/dist/admin/{Profile-B2EcIDB9.js → Profile-CDRjJo0P.js} +31 -29
  38. package/dist/admin/Profile-CDRjJo0P.js.map +1 -0
  39. package/dist/admin/{Register-Z3fxRbUF.js → Register-4QGFOnfh.js} +201 -146
  40. package/dist/admin/Register-4QGFOnfh.js.map +1 -0
  41. package/dist/admin/{ResetPassword-_Y1qTTKh.js → ResetPassword-Gxc9L_mY.js} +9 -10
  42. package/dist/admin/ResetPassword-Gxc9L_mY.js.map +1 -0
  43. package/dist/admin/{VerifyEmail-Bg22bwcC.js → VerifyEmail-D7G5NnaN.js} +25 -11
  44. package/dist/admin/VerifyEmail-D7G5NnaN.js.map +1 -0
  45. package/dist/admin/adminUserAtom-DCi4wf-v.js +11 -0
  46. package/dist/admin/adminUserAtom-DCi4wf-v.js.map +1 -0
  47. package/dist/admin/{core-BVO_TQxb.js → core-D1AbU50V.js} +662 -570
  48. package/dist/admin/core-D1AbU50V.js.map +1 -0
  49. package/dist/admin/index.d.ts +141 -53
  50. package/dist/admin/index.d.ts.map +1 -1
  51. package/dist/admin/index.js +67 -49
  52. package/dist/admin/index.js.map +1 -1
  53. package/dist/admin/rolldown-runtime-CiIaOW0V.js +13 -0
  54. package/dist/{demo/AuthLayout-DN-ClJQk.js → auth/AuthLayout-CfRKcTqP.js} +3 -4
  55. package/dist/auth/{AuthLayout-C161NeF6.js.map → AuthLayout-CfRKcTqP.js.map} +1 -1
  56. package/dist/{admin/IconGoogle-Ch1m3Uzl.js → auth/IconGoogle-8Nkx6yax.js} +2 -4
  57. package/dist/auth/{IconGoogle-Ch1m3Uzl.js.map → IconGoogle-8Nkx6yax.js.map} +1 -1
  58. package/dist/auth/Login-DJyweoPS.js +274 -0
  59. package/dist/auth/Login-DJyweoPS.js.map +1 -0
  60. package/dist/auth/{Profile-BMpXJ0oi.js → Profile-Cy93pNTw.js} +31 -29
  61. package/dist/auth/Profile-Cy93pNTw.js.map +1 -0
  62. package/dist/auth/{Register-2gx8qll-.js → Register-CSqzzitW.js} +201 -146
  63. package/dist/auth/Register-CSqzzitW.js.map +1 -0
  64. package/dist/{demo/ResetPassword-CAPj8MO3.js → auth/ResetPassword-B61QPlQi.js} +9 -10
  65. package/dist/auth/ResetPassword-B61QPlQi.js.map +1 -0
  66. package/dist/{demo/VerifyEmail-DFmdCdYs.js → auth/VerifyEmail-CqBJ11id.js} +25 -11
  67. package/dist/auth/VerifyEmail-CqBJ11id.js.map +1 -0
  68. package/dist/auth/{core-DyfeVr5c.js → core-C6D3pazL.js} +403 -343
  69. package/dist/auth/core-C6D3pazL.js.map +1 -0
  70. package/dist/auth/index.d.ts +93 -54
  71. package/dist/auth/index.d.ts.map +1 -1
  72. package/dist/auth/index.js +30 -31
  73. package/dist/auth/index.js.map +1 -1
  74. package/dist/auth/rolldown-runtime-CiIaOW0V.js +13 -0
  75. package/dist/core/index.d.ts +123 -62
  76. package/dist/core/index.d.ts.map +1 -1
  77. package/dist/core/index.js +878 -776
  78. package/dist/core/index.js.map +1 -1
  79. package/dist/{auth/AuthLayout-C161NeF6.js → demo/AuthLayout-Dq5tSLSc.js} +3 -4
  80. package/dist/demo/{AuthLayout-DN-ClJQk.js.map → AuthLayout-Dq5tSLSc.js.map} +1 -1
  81. package/dist/demo/DemoButton-_Ws2w-J0.js +181 -0
  82. package/dist/demo/DemoButton-_Ws2w-J0.js.map +1 -0
  83. package/dist/demo/DemoControlSelect-ChP4ZOpQ.js +304 -0
  84. package/dist/demo/DemoControlSelect-ChP4ZOpQ.js.map +1 -0
  85. package/dist/demo/DemoDataTable-Hwf_UUni.js +361 -0
  86. package/dist/demo/DemoDataTable-Hwf_UUni.js.map +1 -0
  87. package/dist/demo/{DemoDialog-DW8QEvD1.js → DemoDialog-B01OMVRd.js} +3 -4
  88. package/dist/demo/{DemoDialog-DW8QEvD1.js.map → DemoDialog-B01OMVRd.js.map} +1 -1
  89. package/dist/demo/{DemoFlex-CAhLUanT.js → DemoFlex-870PEl0V.js} +4 -5
  90. package/dist/demo/{DemoFlex-CAhLUanT.js.map → DemoFlex-870PEl0V.js.map} +1 -1
  91. package/dist/demo/{DemoHeading-yIFmNjHB.js → DemoHeading-C1YR27fz.js} +4 -5
  92. package/dist/demo/{DemoHeading-yIFmNjHB.js.map → DemoHeading-C1YR27fz.js.map} +1 -1
  93. package/dist/demo/{DemoHome-BSGuBHus.js → DemoHome-DRbL2eGf.js} +4 -5
  94. package/dist/demo/{DemoHome-BSGuBHus.js.map → DemoHome-DRbL2eGf.js.map} +1 -1
  95. package/dist/demo/{DemoJsonViewer-DsA2IpgV.js → DemoJsonViewer-DoABiqBW.js} +4 -5
  96. package/dist/demo/{DemoJsonViewer-DsA2IpgV.js.map → DemoJsonViewer-DoABiqBW.js.map} +1 -1
  97. package/dist/demo/{DemoLayout-Cy6xjn6P.js → DemoLayout-CN_PDCX2.js} +16 -8
  98. package/dist/demo/DemoLayout-CN_PDCX2.js.map +1 -0
  99. package/dist/demo/{DemoLogin-vqxgTu4P.js → DemoLogin-B5x-ug3Q.js} +51 -35
  100. package/dist/demo/DemoLogin-B5x-ug3Q.js.map +1 -0
  101. package/dist/demo/{DemoRegister-YHPvPg77.js → DemoRegister-Q6sg2xuV.js} +51 -53
  102. package/dist/demo/DemoRegister-Q6sg2xuV.js.map +1 -0
  103. package/dist/demo/{DemoResetPassword-mOW18Zlm.js → DemoResetPassword-DrqZfmEw.js} +14 -19
  104. package/dist/demo/DemoResetPassword-DrqZfmEw.js.map +1 -0
  105. package/dist/demo/{DemoSidebar-od7aLjP_.js → DemoSidebar-CfKS6w1o.js} +4 -5
  106. package/dist/demo/{DemoSidebar-od7aLjP_.js.map → DemoSidebar-CfKS6w1o.js.map} +1 -1
  107. package/dist/demo/{DemoText-DU3JeRS0.js → DemoText-pT6Gi5b5.js} +4 -5
  108. package/dist/demo/{DemoText-DU3JeRS0.js.map → DemoText-pT6Gi5b5.js.map} +1 -1
  109. package/dist/demo/{DemoToast-CUJEiPRa.js → DemoToast-I13NBzQQ.js} +3 -4
  110. package/dist/demo/{DemoToast-CUJEiPRa.js.map → DemoToast-I13NBzQQ.js.map} +1 -1
  111. package/dist/demo/{DemoTypeForm-C1dNkahD.js → DemoTypeForm-BqzcrtvN.js} +9 -6
  112. package/dist/demo/DemoTypeForm-BqzcrtvN.js.map +1 -0
  113. package/dist/demo/DemoVerifyEmail-HwD8xfQw.js +33 -0
  114. package/dist/demo/DemoVerifyEmail-HwD8xfQw.js.map +1 -0
  115. package/dist/{auth/IconGoogle-Ch1m3Uzl.js → demo/IconGoogle-CwQy4G9y.js} +2 -4
  116. package/dist/demo/{IconGoogle-CSQLPYwX.js.map → IconGoogle-CwQy4G9y.js.map} +1 -1
  117. package/dist/demo/Login-CqG1iJbn.js +274 -0
  118. package/dist/demo/Login-CqG1iJbn.js.map +1 -0
  119. package/dist/demo/{Profile-BE_Y3co2.js → Profile-C0ojJCaG.js} +31 -29
  120. package/dist/demo/Profile-C0ojJCaG.js.map +1 -0
  121. package/dist/demo/{Register-fXHmBpr3.js → Register-KKZwr_lL.js} +201 -146
  122. package/dist/demo/Register-KKZwr_lL.js.map +1 -0
  123. package/dist/{auth/ResetPassword-DBxt9hKk.js → demo/ResetPassword-DMrLFEtr.js} +9 -10
  124. package/dist/demo/ResetPassword-DMrLFEtr.js.map +1 -0
  125. package/dist/demo/{Showcase-BtEU0pY9.js → Showcase-D49Wud2v.js} +65 -68
  126. package/dist/demo/Showcase-D49Wud2v.js.map +1 -0
  127. package/dist/{auth/VerifyEmail-Z80Ubajk.js → demo/VerifyEmail-BFCAFz6T.js} +25 -11
  128. package/dist/demo/VerifyEmail-BFCAFz6T.js.map +1 -0
  129. package/dist/demo/{auth-Djd7SKiw.js → auth-D9qTZzCa.js} +18 -35
  130. package/dist/demo/{auth-Djd7SKiw.js.map → auth-D9qTZzCa.js.map} +1 -1
  131. package/dist/demo/{core-B7LNjM78.js → core-DRtQklr3.js} +752 -647
  132. package/dist/demo/core-DRtQklr3.js.map +1 -0
  133. package/dist/demo/index.d.ts +1 -0
  134. package/dist/demo/index.d.ts.map +1 -1
  135. package/dist/demo/index.js +25 -22
  136. package/dist/demo/index.js.map +1 -1
  137. package/dist/demo/rolldown-runtime-CiIaOW0V.js +13 -0
  138. package/package.json +19 -19
  139. package/src/admin/AdminRouter.tsx +42 -2
  140. package/src/admin/atoms/adminUserAtom.ts +7 -0
  141. package/src/admin/components/AdminLayout.tsx +2 -14
  142. package/src/admin/components/jobs/AdminJobDashboard.tsx +51 -20
  143. package/src/admin/components/notifications/AdminNotifications.tsx +519 -0
  144. package/src/admin/components/parameters/ParameterDetails.tsx +12 -270
  145. package/src/admin/components/parameters/ParameterDetailsConfigForm.tsx +238 -0
  146. package/src/admin/components/parameters/ParameterDetailsLoading.tsx +24 -0
  147. package/src/admin/components/parameters/ParameterHistory.tsx +10 -11
  148. package/src/admin/components/parameters/ParameterTree.tsx +28 -184
  149. package/src/admin/components/parameters/ParameterTreeNode.tsx +151 -0
  150. package/src/admin/components/shared/AdminResourceHeader.tsx +2 -25
  151. package/src/admin/components/shared/AdminResourceHeaderMenuItem.tsx +37 -0
  152. package/src/admin/components/shared/AdminResourceTabs.tsx +2 -26
  153. package/src/admin/components/shared/AdminResourceTabsItem.tsx +36 -0
  154. package/src/admin/components/users/AdminUserLayout.tsx +84 -127
  155. package/src/admin/components/users/AdminUserProfile.tsx +5 -2
  156. package/src/admin/components/users/AdminUsers.tsx +1 -1
  157. package/src/auth/components/Login.tsx +188 -121
  158. package/src/auth/components/Profile.tsx +1 -22
  159. package/src/auth/components/ProfileField.tsx +39 -0
  160. package/src/auth/components/Register.tsx +215 -158
  161. package/src/auth/components/ResetPassword.tsx +7 -11
  162. package/src/auth/components/VerifyEmail.tsx +35 -10
  163. package/src/auth/components/buttons/UserButton.tsx +19 -21
  164. package/src/auth/index.ts +1 -0
  165. package/src/core/components/Flex.tsx +34 -0
  166. package/src/core/components/buttons/ActionButton.tsx +105 -78
  167. package/src/core/components/data/DetailDrawer.tsx +102 -96
  168. package/src/core/components/data/DetailList.tsx +2 -1
  169. package/src/core/components/dialogs/PromptDialog.tsx +1 -1
  170. package/src/core/components/layout/Breadcrumb.tsx +4 -7
  171. package/src/core/components/layout/DashboardShell.tsx +18 -4
  172. package/src/core/components/layout/Sidebar.tsx +16 -241
  173. package/src/core/components/layout/SidebarCollapsedItem.tsx +91 -0
  174. package/src/core/components/layout/SidebarItem.tsx +146 -0
  175. package/src/core/components/layout/index.ts +3 -1
  176. package/src/core/form/components/Control.tsx +31 -29
  177. package/src/core/form/components/ControlArray.tsx +13 -39
  178. package/src/core/form/components/ControlDate.tsx +10 -21
  179. package/src/core/form/components/ControlNumber.tsx +4 -33
  180. package/src/core/form/components/ControlQueryBuilder.tsx +12 -175
  181. package/src/core/form/components/ControlQueryBuilderHelp.tsx +165 -0
  182. package/src/core/form/components/ControlSelect.browser.spec.tsx +343 -0
  183. package/src/core/form/components/ControlSelect.tsx +294 -92
  184. package/src/core/form/components/TypeForm.browser.spec.tsx +3 -3
  185. package/src/core/form/components/TypeForm.tsx +5 -2
  186. package/src/core/form/index.ts +8 -1
  187. package/src/core/form/utils/parseInput.ts +7 -3
  188. package/src/core/index.ts +3 -1
  189. package/src/core/json/components/JsonViewer.tsx +103 -319
  190. package/src/core/json/components/JsonViewerCopyButton.tsx +46 -0
  191. package/src/core/json/components/JsonViewerRowNode.tsx +120 -0
  192. package/src/core/json/components/JsonViewerShared.ts +76 -0
  193. package/src/core/services/DialogService.tsx +2 -2
  194. package/src/core/styles.css +13 -2
  195. package/src/core/table/components/ColumnPicker.tsx +3 -3
  196. package/src/core/table/components/DataTable.tsx +88 -29
  197. package/src/core/table/components/DataTableFilters.tsx +6 -11
  198. package/src/core/table/components/DataTablePagination.tsx +9 -3
  199. package/src/core/table/components/DataTableToolbar.tsx +7 -3
  200. package/src/core/table/components/FilterPicker.tsx +3 -3
  201. package/src/core/table/interfaces/types.ts +29 -0
  202. package/src/core/utils/icons.tsx +2 -2
  203. package/src/demo/DemoRouter.ts +8 -1
  204. package/src/demo/components/DemoLayout.tsx +12 -2
  205. package/src/demo/components/auth/DemoLogin.tsx +35 -28
  206. package/src/demo/components/auth/DemoRegister.tsx +35 -49
  207. package/src/demo/components/auth/DemoResetPassword.tsx +5 -9
  208. package/src/demo/components/auth/DemoVerifyEmail.tsx +7 -6
  209. package/src/demo/components/core/DemoButton.tsx +123 -103
  210. package/src/demo/components/core/DemoControlSelect.tsx +325 -0
  211. package/src/demo/components/core/DemoDataTable.tsx +255 -237
  212. package/src/demo/components/core/DemoTypeForm.tsx +7 -2
  213. package/src/demo/components/shared/MacWindow.tsx +5 -11
  214. package/src/demo/components/shared/Showcase.tsx +28 -42
  215. package/dist/admin/AdminJobDashboard-KIOkeMgE.js.map +0 -1
  216. package/dist/admin/AdminLayout-B1DXZHDn.js.map +0 -1
  217. package/dist/admin/AdminParameters-BspPeqp_.js.map +0 -1
  218. package/dist/admin/AdminUserLayout-DUbC6-BI.js.map +0 -1
  219. package/dist/admin/AdminUserProfile-DuTUnjdG.js.map +0 -1
  220. package/dist/admin/AdminUsers-CR9z0g_5.js.map +0 -1
  221. package/dist/admin/Login-DHbYJKwg.js +0 -219
  222. package/dist/admin/Login-DHbYJKwg.js.map +0 -1
  223. package/dist/admin/Profile-B2EcIDB9.js.map +0 -1
  224. package/dist/admin/Register-Z3fxRbUF.js.map +0 -1
  225. package/dist/admin/ResetPassword-_Y1qTTKh.js.map +0 -1
  226. package/dist/admin/VerifyEmail-Bg22bwcC.js.map +0 -1
  227. package/dist/admin/core-BVO_TQxb.js.map +0 -1
  228. package/dist/admin/rolldown-runtime-CjeV3_4I.js +0 -18
  229. package/dist/auth/Login-C7jIqf00.js +0 -219
  230. package/dist/auth/Login-C7jIqf00.js.map +0 -1
  231. package/dist/auth/Profile-BMpXJ0oi.js.map +0 -1
  232. package/dist/auth/Register-2gx8qll-.js.map +0 -1
  233. package/dist/auth/ResetPassword-DBxt9hKk.js.map +0 -1
  234. package/dist/auth/VerifyEmail-Z80Ubajk.js.map +0 -1
  235. package/dist/auth/core-DyfeVr5c.js.map +0 -1
  236. package/dist/auth/rolldown-runtime-CjeV3_4I.js +0 -18
  237. package/dist/demo/DemoButton-CGUyR9eM.js +0 -178
  238. package/dist/demo/DemoButton-CGUyR9eM.js.map +0 -1
  239. package/dist/demo/DemoDataTable-QFG-xXSx.js +0 -358
  240. package/dist/demo/DemoDataTable-QFG-xXSx.js.map +0 -1
  241. package/dist/demo/DemoLayout-Cy6xjn6P.js.map +0 -1
  242. package/dist/demo/DemoLogin-vqxgTu4P.js.map +0 -1
  243. package/dist/demo/DemoRegister-YHPvPg77.js.map +0 -1
  244. package/dist/demo/DemoResetPassword-mOW18Zlm.js.map +0 -1
  245. package/dist/demo/DemoTypeForm-C1dNkahD.js.map +0 -1
  246. package/dist/demo/DemoVerifyEmail-D9EcXZ38.js +0 -30
  247. package/dist/demo/DemoVerifyEmail-D9EcXZ38.js.map +0 -1
  248. package/dist/demo/Login-CoYf_P_F.js +0 -219
  249. package/dist/demo/Login-CoYf_P_F.js.map +0 -1
  250. package/dist/demo/Profile-BE_Y3co2.js.map +0 -1
  251. package/dist/demo/Register-fXHmBpr3.js.map +0 -1
  252. package/dist/demo/ResetPassword-CAPj8MO3.js.map +0 -1
  253. package/dist/demo/Showcase-BtEU0pY9.js.map +0 -1
  254. package/dist/demo/VerifyEmail-DFmdCdYs.js.map +0 -1
  255. package/dist/demo/core-B7LNjM78.js.map +0 -1
  256. package/dist/demo/rolldown-runtime-CjeV3_4I.js +0 -18
  257. package/src/demo/styles.css +0 -0
@@ -1,14 +1,13 @@
1
- import { _ as ActionButton, b as useToast, l as Flex$1, m as useDialog, o as Text$1 } from "./core-BVO_TQxb.js";
2
- import { t } from "alepha";
3
- import { ActionIcon, Avatar, Badge, Button, Flex, Loader, Menu, Tabs, Text, Tooltip } from "@mantine/core";
1
+ import { _ as ActionButton, b as useToast, l as Flex$1, m as useDialog } from "./core-D1AbU50V.js";
2
+ import { t as adminUserAtom } from "./adminUserAtom-DCi4wf-v.js";
3
+ import { ActionIcon, Avatar, Badge, Button, Flex, Menu, Tabs, Text, Tooltip } from "@mantine/core";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
- import { createContext, useCallback, useContext, useEffect, useState } from "react";
5
+ import { useCallback, useEffect } from "react";
6
6
  import { IconBan, IconChevronDown, IconChevronLeft, IconExternalLink, IconShieldCheck, IconTrash } from "@tabler/icons-react";
7
- import { NestedView, useActive, useRouter, useRouterState } from "alepha/react/router";
8
- import { useClient } from "alepha/react";
9
-
10
- //#region ../../src/admin/components/shared/AdminResourceHeader.tsx
11
- const ActionMenuItem = (props) => {
7
+ import { NestedView, useActive, useRouter } from "alepha/react/router";
8
+ import { useAlepha, useClient, useStore } from "alepha/react";
9
+ //#region ../../src/admin/components/shared/AdminResourceHeaderMenuItem.tsx
10
+ const AdminResourceHeaderMenuItem = (props) => {
12
11
  const { action } = props;
13
12
  const router = useRouter();
14
13
  const menuItemProps = {};
@@ -22,6 +21,8 @@ const ActionMenuItem = (props) => {
22
21
  children: action.label
23
22
  });
24
23
  };
24
+ //#endregion
25
+ //#region ../../src/admin/components/shared/AdminResourceHeader.tsx
25
26
  const AdminResourceHeader = (props) => {
26
27
  const { backHref, backLabel = "Back", avatar, avatarColor = "blue", title, subtitle, identifier, identifierLabel = "ID", status, badges = [], primaryAction, menuActions = [], externalUrl } = props;
27
28
  const renderAvatar = () => {
@@ -123,17 +124,16 @@ const AdminResourceHeader = (props) => {
123
124
  variant: "default",
124
125
  rightSection: /* @__PURE__ */ jsx(IconChevronDown, { size: 16 }),
125
126
  children: "Actions"
126
- }) }), /* @__PURE__ */ jsx(Menu.Dropdown, { children: menuActions.map((action, index) => /* @__PURE__ */ jsx(ActionMenuItem, { action }, index)) })]
127
+ }) }), /* @__PURE__ */ jsx(Menu.Dropdown, { children: menuActions.map((action, index) => /* @__PURE__ */ jsx(AdminResourceHeaderMenuItem, { action }, index)) })]
127
128
  })
128
129
  ]
129
130
  })]
130
131
  })]
131
132
  });
132
133
  };
133
-
134
134
  //#endregion
135
- //#region ../../src/admin/components/shared/AdminResourceTabs.tsx
136
- const TabItem = (props) => {
135
+ //#region ../../src/admin/components/shared/AdminResourceTabsItem.tsx
136
+ const AdminResourceTabsItem = (props) => {
137
137
  const { tab } = props;
138
138
  const router = useRouter();
139
139
  const { isActive, isPending } = useActive({ href: tab.href });
@@ -149,148 +149,115 @@ const TabItem = (props) => {
149
149
  children: [tab.label, tab.count !== void 0 && tab.count > 0 && ` (${tab.count})`]
150
150
  });
151
151
  };
152
+ //#endregion
153
+ //#region ../../src/admin/components/shared/AdminResourceTabs.tsx
152
154
  const AdminResourceTabs = (props) => {
153
155
  const { tabs, activeTab, children } = props;
154
156
  return /* @__PURE__ */ jsxs(Tabs, {
155
157
  value: activeTab,
156
158
  variant: "default",
157
- children: [/* @__PURE__ */ jsx(Tabs.List, { children: tabs.map((tab) => /* @__PURE__ */ jsx(TabItem, { tab }, tab.value)) }), children]
159
+ children: [/* @__PURE__ */ jsx(Tabs.List, { children: tabs.map((tab) => /* @__PURE__ */ jsx(AdminResourceTabsItem, { tab }, tab.value)) }), children]
158
160
  });
159
161
  };
160
-
161
162
  //#endregion
162
163
  //#region ../../src/admin/components/users/AdminUserLayout.tsx
163
- const UserContext = createContext(null);
164
- const useUser = () => {
165
- const ctx = useContext(UserContext);
166
- if (!ctx) throw new Error("useUser must be used within AdminUserLayout");
167
- return ctx;
168
- };
169
- t.object({
170
- email: t.optional(t.email()),
171
- phoneNumber: t.optional(t.e164()),
172
- firstName: t.optional(t.string()),
173
- lastName: t.optional(t.string()),
174
- roles: t.optional(t.array(t.string())),
175
- enabled: t.optional(t.boolean())
176
- });
177
164
  const displayName = (u) => u.firstName || u.lastName ? `${u.firstName ?? ""} ${u.lastName ?? ""}`.trim() : u.username || u.email || "User";
178
165
  const AdminUserLayout = (props) => {
179
166
  const router = useRouter();
180
- const state = useRouterState();
181
167
  const client = useClient();
168
+ const alepha = useAlepha();
182
169
  const dialog = useDialog();
183
170
  const toast = useToast();
184
- const userId = state.params.userId;
185
- const [user, setUser] = useState(null);
186
- const [loading, setLoading] = useState(true);
171
+ const [user] = useStore(adminUserAtom);
172
+ useEffect(() => {
173
+ alepha.store.set(adminUserAtom, props.user);
174
+ }, [props.user]);
175
+ const currentUser = user ?? props.user;
176
+ const userId = currentUser.id;
187
177
  const realmQuery = { userRealmName: props.userRealmName };
188
- const loadUser = useCallback(async () => {
189
- setLoading(true);
190
- try {
191
- setUser(await client.getUser({
192
- params: { id: userId },
193
- query: realmQuery
194
- }));
195
- } finally {
196
- setLoading(false);
197
- }
178
+ useCallback(async () => {
179
+ const data = await client.getUser({
180
+ params: { id: userId },
181
+ query: realmQuery
182
+ });
183
+ alepha.store.set(adminUserAtom, data);
198
184
  }, [userId, client]);
199
- useEffect(() => {
200
- loadUser();
201
- }, [loadUser]);
202
185
  const handleToggleEnabled = async () => {
203
- if (!user) return;
204
- const action = user.enabled ? "disable" : "enable";
186
+ const action = currentUser.enabled ? "disable" : "enable";
205
187
  if (await dialog.confirm({
206
- title: `${user.enabled ? "Disable" : "Enable"} User`,
207
- message: `Are you sure you want to ${action} ${displayName(user)}?`
188
+ title: `${currentUser.enabled ? "Disable" : "Enable"} User`,
189
+ message: `Are you sure you want to ${action} ${displayName(currentUser)}?`
208
190
  })) {
209
- setUser(await client.updateUser({
210
- params: { id: user.id },
191
+ const updated = await client.updateUser({
192
+ params: { id: currentUser.id },
211
193
  query: realmQuery,
212
- body: { enabled: !user.enabled }
213
- }));
194
+ body: { enabled: !currentUser.enabled }
195
+ });
196
+ alepha.store.set(adminUserAtom, updated);
214
197
  toast.success({ title: `User ${action}d` });
215
198
  }
216
199
  };
217
200
  const handleDelete = async () => {
218
- if (!user) return;
219
201
  if (await dialog.confirm({
220
202
  title: "Delete User",
221
- message: `Are you sure you want to delete ${displayName(user)}? This cannot be undone.`,
203
+ message: `Are you sure you want to delete ${displayName(currentUser)}? This cannot be undone.`,
222
204
  confirmColor: "red",
223
205
  confirmLabel: "Delete"
224
206
  })) {
225
207
  await client.deleteUser({
226
- params: { id: user.id },
208
+ params: { id: currentUser.id },
227
209
  query: realmQuery
228
210
  });
229
211
  toast.success({ title: "User deleted" });
230
212
  router.push("adminUsers");
231
213
  }
232
214
  };
233
- if (loading) return /* @__PURE__ */ jsx(Flex$1, {
234
- flex: 1,
235
- justify: "center",
236
- align: "center",
237
- children: /* @__PURE__ */ jsx(Loader, {})
238
- });
239
- if (!user) return /* @__PURE__ */ jsx(Flex$1, {
215
+ return /* @__PURE__ */ jsxs(Flex$1, {
240
216
  flex: 1,
241
- justify: "center",
242
- align: "center",
243
- children: /* @__PURE__ */ jsx(Text$1, {
244
- c: "dimmed",
245
- children: "User not found"
246
- })
247
- });
248
- return /* @__PURE__ */ jsx(UserContext.Provider, {
249
- value: {
250
- user,
251
- reload: loadUser
217
+ direction: "column",
218
+ gap: "lg",
219
+ p: "md",
220
+ m: "md",
221
+ style: {
222
+ backgroundColor: "var(--mantine-color-body)",
223
+ borderRadius: "var(--mantine-radius-md)",
224
+ border: "1px solid var(--mantine-color-default-border)"
252
225
  },
253
- children: /* @__PURE__ */ jsxs(Flex$1, {
254
- flex: 1,
255
- direction: "column",
256
- gap: "lg",
257
- p: "md",
258
- children: [
259
- /* @__PURE__ */ jsx(AdminResourceHeader, {
260
- backHref: router.path("adminUsers"),
261
- backLabel: "Users",
262
- title: displayName(user),
263
- subtitle: user.email || user.username,
264
- status: {
265
- label: user.enabled ? "Active" : "Disabled",
266
- color: user.enabled ? "green" : "gray"
267
- },
268
- menuActions: [{
269
- label: user.enabled ? "Disable" : "Enable",
270
- icon: user.enabled ? IconBan : IconShieldCheck,
271
- onClick: handleToggleEnabled
272
- }, {
273
- label: "Delete",
274
- icon: IconTrash,
275
- color: "red",
276
- onClick: handleDelete
277
- }]
278
- }),
279
- /* @__PURE__ */ jsx(AdminResourceTabs, { tabs: [{
280
- value: "profile",
281
- label: "Profile",
282
- href: router.path("adminUserProfile", { params: { userId } })
226
+ children: [
227
+ /* @__PURE__ */ jsx(AdminResourceHeader, {
228
+ backHref: router.path("adminUsers"),
229
+ backLabel: "Users",
230
+ title: displayName(currentUser),
231
+ subtitle: currentUser.email || currentUser.username,
232
+ status: {
233
+ label: currentUser.enabled ? "Active" : "Disabled",
234
+ color: currentUser.enabled ? "green" : "gray"
235
+ },
236
+ menuActions: [{
237
+ label: currentUser.enabled ? "Disable" : "Enable",
238
+ icon: currentUser.enabled ? IconBan : IconShieldCheck,
239
+ onClick: handleToggleEnabled
283
240
  }, {
284
- value: "sessions",
285
- label: "Sessions",
286
- href: router.path("adminUserSessions", { params: { userId } })
287
- }] }),
288
- /* @__PURE__ */ jsx(NestedView, {})
289
- ]
290
- })
241
+ label: "Delete",
242
+ icon: IconTrash,
243
+ color: "red",
244
+ onClick: handleDelete
245
+ }]
246
+ }),
247
+ /* @__PURE__ */ jsx(AdminResourceTabs, { tabs: [{
248
+ value: "profile",
249
+ label: "Profile",
250
+ href: router.path("adminUserProfile", { params: { userId } })
251
+ }, {
252
+ value: "sessions",
253
+ label: "Sessions",
254
+ href: router.path("adminUserSessions", { params: { userId } })
255
+ }] }),
256
+ /* @__PURE__ */ jsx(NestedView, {})
257
+ ]
291
258
  });
292
259
  };
293
-
294
260
  //#endregion
295
- export { AdminUserLayout as default, useUser };
296
- //# sourceMappingURL=AdminUserLayout-DUbC6-BI.js.map
261
+ export { AdminUserLayout as default };
262
+
263
+ //# sourceMappingURL=AdminUserLayout-DvBTG5gd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminUserLayout-DvBTG5gd.js","names":["Flex"],"sources":["../../src/admin/components/shared/AdminResourceHeaderMenuItem.tsx","../../src/admin/components/shared/AdminResourceHeader.tsx","../../src/admin/components/shared/AdminResourceTabsItem.tsx","../../src/admin/components/shared/AdminResourceTabs.tsx","../../src/admin/components/users/AdminUserLayout.tsx"],"sourcesContent":["import { Menu } from \"@mantine/core\";\nimport { useRouter } from \"alepha/react/router\";\nimport type { AdminResourceAction } from \"./AdminResourceHeader.tsx\";\n\nexport interface AdminResourceHeaderMenuItemProps {\n /**\n * Action configuration\n */\n action: AdminResourceAction;\n}\n\nconst AdminResourceHeaderMenuItem = (\n props: AdminResourceHeaderMenuItemProps,\n) => {\n const { action } = props;\n const router = useRouter();\n\n const menuItemProps: Record<string, unknown> = {};\n if (action.href) {\n Object.assign(menuItemProps, router.anchor(action.href));\n } else if (action.onClick) {\n menuItemProps.onClick = action.onClick;\n }\n\n return (\n <Menu.Item\n leftSection={action.icon ? <action.icon size={16} /> : undefined}\n color={action.color}\n disabled={action.disabled}\n {...menuItemProps}\n >\n {action.label}\n </Menu.Item>\n );\n};\n\nexport default AdminResourceHeaderMenuItem;\n","import { ActionButton } from \"@alepha/ui\";\nimport {\n ActionIcon,\n Avatar,\n Badge,\n Button,\n Flex,\n Menu,\n Text,\n Tooltip,\n} from \"@mantine/core\";\nimport {\n IconChevronDown,\n IconChevronLeft,\n IconExternalLink,\n} from \"@tabler/icons-react\";\nimport type { ComponentType, ReactNode } from \"react\";\nimport AdminResourceHeaderMenuItem from \"./AdminResourceHeaderMenuItem.tsx\";\n\nexport interface AdminResourceAction {\n label: string;\n icon?: ComponentType<{ size?: number }>;\n onClick?: () => void;\n href?: string;\n color?: string;\n disabled?: boolean;\n loading?: boolean;\n variant?: \"filled\" | \"light\" | \"outline\" | \"subtle\";\n}\n\nexport interface AdminResourceHeaderProps {\n /**\n * Back navigation URL\n */\n backHref?: string;\n\n /**\n * Back navigation label\n */\n backLabel?: string;\n\n /**\n * Avatar content (letter, image URL, or custom node)\n */\n avatar?: string | ReactNode;\n\n /**\n * Avatar color\n */\n avatarColor?: string;\n\n /**\n * Resource title (e.g., user name)\n */\n title: string;\n\n /**\n * Secondary text (e.g., email)\n */\n subtitle?: string;\n\n /**\n * Tertiary identifier to copy (e.g., user ID)\n */\n identifier?: string;\n\n /**\n * Label for the identifier tooltip\n */\n identifierLabel?: string;\n\n /**\n * Status badge\n */\n status?: {\n label: string;\n color: \"green\" | \"red\" | \"yellow\" | \"blue\" | \"gray\";\n };\n\n /**\n * Additional badges (e.g., roles)\n */\n badges?: Array<{\n label: string;\n color?: string;\n variant?: \"filled\" | \"light\" | \"outline\" | \"dot\";\n }>;\n\n /**\n * Primary action button\n */\n primaryAction?: AdminResourceAction;\n\n /**\n * Menu actions (shown in dropdown)\n */\n menuActions?: AdminResourceAction[];\n\n /**\n * External link URL\n */\n externalUrl?: string;\n\n /**\n * Loading state\n */\n loading?: boolean;\n}\n\nconst AdminResourceHeader = (props: AdminResourceHeaderProps) => {\n const {\n backHref,\n backLabel = \"Back\",\n avatar,\n avatarColor = \"blue\",\n title,\n subtitle,\n identifier,\n identifierLabel = \"ID\",\n status,\n badges = [],\n primaryAction,\n menuActions = [],\n externalUrl,\n } = props;\n\n const renderAvatar = () => {\n if (typeof avatar === \"string\") {\n if (avatar.startsWith(\"http\") || avatar.startsWith(\"/\")) {\n return (\n <Avatar src={avatar} size={56} radius=\"md\" color={avatarColor} />\n );\n }\n return (\n <Avatar size={56} radius=\"md\" color={avatarColor}>\n {avatar}\n </Avatar>\n );\n }\n if (avatar) {\n return avatar;\n }\n return (\n <Avatar size={56} radius=\"md\" color={avatarColor}>\n {title.charAt(0).toUpperCase()}\n </Avatar>\n );\n };\n\n return (\n <Flex direction=\"column\" gap=\"xs\">\n {/* Breadcrumb / Back navigation */}\n {backHref && (\n <Flex>\n <ActionButton\n variant=\"subtle\"\n size=\"xs\"\n href={backHref}\n leftSection={<IconChevronLeft size={14} />}\n c=\"dimmed\"\n >\n {backLabel}\n </ActionButton>\n </Flex>\n )}\n\n {/* Main header */}\n <Flex justify=\"space-between\" align=\"flex-start\" wrap=\"nowrap\">\n {/* Left: Avatar + Info */}\n <Flex gap=\"md\" wrap=\"nowrap\">\n {renderAvatar()}\n\n <Flex\n direction=\"column\"\n gap={2}\n justify=\"center\"\n style={{ minHeight: 56 }}\n >\n {/* Title row */}\n <Flex gap=\"xs\" align=\"center\">\n <Text size=\"md\" fw={600} lh={1.2}>\n {title}\n </Text>\n {status && (\n <Badge\n size=\"xs\"\n variant=\"light\"\n color={status.color}\n tt=\"lowercase\"\n >\n {status.label}\n </Badge>\n )}\n </Flex>\n\n {/* Subtitle */}\n {subtitle && (\n <Text size=\"xs\" c=\"dimmed\">\n {subtitle}\n </Text>\n )}\n </Flex>\n </Flex>\n\n {/* Right: Actions */}\n <Flex gap=\"xs\">\n {externalUrl && (\n <Tooltip label=\"Open in new tab\" openDelay={500}>\n <ActionIcon\n variant=\"subtle\"\n color=\"gray\"\n component=\"a\"\n href={externalUrl}\n target=\"_blank\"\n >\n <IconExternalLink size={18} />\n </ActionIcon>\n </Tooltip>\n )}\n\n {primaryAction && (\n <ActionButton\n variant={primaryAction.variant ?? \"light\"}\n color={primaryAction.color}\n onClick={primaryAction.onClick}\n href={primaryAction.href}\n loading={primaryAction.loading}\n disabled={primaryAction.disabled}\n leftSection={\n primaryAction.icon ? (\n <primaryAction.icon size={16} />\n ) : undefined\n }\n >\n {primaryAction.label}\n </ActionButton>\n )}\n\n {menuActions.length > 0 && (\n <Menu position=\"bottom-end\" shadow=\"md\" width={220}>\n <Menu.Target>\n <Button\n variant=\"default\"\n rightSection={<IconChevronDown size={16} />}\n >\n Actions\n </Button>\n </Menu.Target>\n <Menu.Dropdown>\n {menuActions.map((action, index) => (\n <AdminResourceHeaderMenuItem key={index} action={action} />\n ))}\n </Menu.Dropdown>\n </Menu>\n )}\n </Flex>\n </Flex>\n </Flex>\n );\n};\n\nexport default AdminResourceHeader;\n","import { Tabs } from \"@mantine/core\";\nimport { useActive, useRouter } from \"alepha/react/router\";\nimport type { AdminResourceTab } from \"./AdminResourceTabs.tsx\";\n\nexport interface AdminResourceTabsItemProps {\n /**\n * Tab configuration\n */\n tab: AdminResourceTab;\n}\n\nconst AdminResourceTabsItem = (props: AdminResourceTabsItemProps) => {\n const { tab } = props;\n const router = useRouter();\n const { isActive, isPending } = useActive({ href: tab.href });\n const anchorProps = router.anchor(tab.href);\n\n return (\n <Tabs.Tab\n value={tab.value}\n component=\"a\"\n leftSection={tab.icon ? <tab.icon size={16} /> : undefined}\n disabled={tab.disabled}\n data-active={isActive || undefined}\n style={{\n opacity: isPending ? 0.6 : 1,\n }}\n {...anchorProps}\n >\n {tab.label}\n {tab.count !== undefined && tab.count > 0 && ` (${tab.count})`}\n </Tabs.Tab>\n );\n};\n\nexport default AdminResourceTabsItem;\n","import { Tabs } from \"@mantine/core\";\nimport type { ComponentType, ReactNode } from \"react\";\nimport AdminResourceTabsItem from \"./AdminResourceTabsItem.tsx\";\n\nexport interface AdminResourceTab {\n /**\n * Tab key/value\n */\n value: string;\n\n /**\n * Tab label\n */\n label: string;\n\n /**\n * Tab icon\n */\n icon?: ComponentType<{ size?: number }>;\n\n /**\n * Navigation href\n */\n href: string;\n\n /**\n * Whether tab is disabled\n */\n disabled?: boolean;\n\n /**\n * Badge count to show\n */\n count?: number;\n}\n\nexport interface AdminResourceTabsProps {\n /**\n * Array of tab configurations\n */\n tabs: AdminResourceTab[];\n\n /**\n * Currently active tab value\n */\n activeTab?: string;\n\n /**\n * Content to render below tabs\n */\n children?: ReactNode;\n}\n\nconst AdminResourceTabs = (props: AdminResourceTabsProps) => {\n const { tabs, activeTab, children } = props;\n\n return (\n <Tabs value={activeTab} variant=\"default\">\n <Tabs.List>\n {tabs.map((tab) => (\n <AdminResourceTabsItem key={tab.value} tab={tab} />\n ))}\n </Tabs.List>\n\n {children}\n </Tabs>\n );\n};\n\nexport default AdminResourceTabs;\n","import { Flex, useDialog, useToast } from \"@alepha/ui\";\nimport { IconBan, IconShieldCheck, IconTrash } from \"@tabler/icons-react\";\nimport type { AdminUserController, UserEntity } from \"alepha/api/users\";\nimport { useAlepha, useClient, useStore } from \"alepha/react\";\nimport { NestedView, useRouter } from \"alepha/react/router\";\nimport { useCallback, useEffect } from \"react\";\nimport type { AdminRouter } from \"../../AdminRouter.ts\";\nimport { adminUserAtom } from \"../../atoms/adminUserAtom.ts\";\nimport AdminResourceHeader from \"../shared/AdminResourceHeader.tsx\";\nimport AdminResourceTabs from \"../shared/AdminResourceTabs.tsx\";\n\nexport interface AdminUserLayoutProps {\n user: UserEntity;\n userRealmName?: string;\n}\n\nconst displayName = (u: UserEntity) =>\n u.firstName || u.lastName\n ? `${u.firstName ?? \"\"} ${u.lastName ?? \"\"}`.trim()\n : u.username || u.email || \"User\";\n\nconst AdminUserLayout = (props: AdminUserLayoutProps) => {\n const router = useRouter<AdminRouter>();\n const client = useClient<AdminUserController>();\n const alepha = useAlepha();\n const dialog = useDialog();\n const toast = useToast();\n const [user] = useStore(adminUserAtom);\n\n useEffect(() => {\n alepha.store.set(adminUserAtom, props.user);\n }, [props.user]);\n\n const currentUser = user ?? props.user;\n const userId = currentUser.id;\n const realmQuery = { userRealmName: props.userRealmName };\n\n const reload = useCallback(async () => {\n const data = await client.getUser({\n params: { id: userId },\n query: realmQuery,\n });\n alepha.store.set(adminUserAtom, data);\n }, [userId, client]);\n\n const handleToggleEnabled = async () => {\n const action = currentUser.enabled ? \"disable\" : \"enable\";\n const confirmed = await dialog.confirm({\n title: `${currentUser.enabled ? \"Disable\" : \"Enable\"} User`,\n message: `Are you sure you want to ${action} ${displayName(currentUser)}?`,\n });\n if (confirmed) {\n const updated = await client.updateUser({\n params: { id: currentUser.id },\n query: realmQuery,\n body: { enabled: !currentUser.enabled },\n });\n alepha.store.set(adminUserAtom, updated);\n toast.success({ title: `User ${action}d` });\n }\n };\n\n const handleDelete = async () => {\n const confirmed = await dialog.confirm({\n title: \"Delete User\",\n message: `Are you sure you want to delete ${displayName(currentUser)}? This cannot be undone.`,\n confirmColor: \"red\",\n confirmLabel: \"Delete\",\n });\n if (confirmed) {\n await client.deleteUser({\n params: { id: currentUser.id },\n query: realmQuery,\n });\n toast.success({ title: \"User deleted\" });\n router.push(\"adminUsers\");\n }\n };\n\n return (\n <Flex\n flex={1}\n direction=\"column\"\n gap=\"lg\"\n p=\"md\"\n m=\"md\"\n style={{\n backgroundColor: \"var(--mantine-color-body)\",\n borderRadius: \"var(--mantine-radius-md)\",\n border: \"1px solid var(--mantine-color-default-border)\",\n }}\n >\n <AdminResourceHeader\n backHref={router.path(\"adminUsers\")}\n backLabel=\"Users\"\n title={displayName(currentUser)}\n subtitle={currentUser.email || currentUser.username}\n status={{\n label: currentUser.enabled ? \"Active\" : \"Disabled\",\n color: currentUser.enabled ? \"green\" : \"gray\",\n }}\n menuActions={[\n {\n label: currentUser.enabled ? \"Disable\" : \"Enable\",\n icon: currentUser.enabled ? IconBan : IconShieldCheck,\n onClick: handleToggleEnabled,\n },\n {\n label: \"Delete\",\n icon: IconTrash,\n color: \"red\",\n onClick: handleDelete,\n },\n ]}\n />\n\n <AdminResourceTabs\n tabs={[\n {\n value: \"profile\",\n label: \"Profile\",\n href: router.path(\"adminUserProfile\", {\n params: { userId },\n }),\n },\n {\n value: \"sessions\",\n label: \"Sessions\",\n href: router.path(\"adminUserSessions\", {\n params: { userId },\n }),\n },\n ]}\n />\n\n <NestedView />\n </Flex>\n );\n};\n\nexport default AdminUserLayout;\n"],"mappings":"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"}
@@ -1,13 +1,14 @@
1
- import { d as DetailList, l as Flex$1 } from "./core-BVO_TQxb.js";
2
- import { useUser } from "./AdminUserLayout-DUbC6-BI.js";
1
+ import { d as DetailList, l as Flex$1 } from "./core-D1AbU50V.js";
2
+ import { t as adminUserAtom } from "./adminUserAtom-DCi4wf-v.js";
3
3
  import { useI18n } from "alepha/react/i18n";
4
4
  import { Badge } from "@mantine/core";
5
5
  import { jsx } from "react/jsx-runtime";
6
-
6
+ import { useStore } from "alepha/react";
7
7
  //#region ../../src/admin/components/users/AdminUserProfile.tsx
8
8
  const AdminUserProfile = () => {
9
- const { user } = useUser();
9
+ const [user] = useStore(adminUserAtom);
10
10
  const { l } = useI18n();
11
+ if (!user) return null;
11
12
  return /* @__PURE__ */ jsx(DetailList, { items: [
12
13
  {
13
14
  label: "ID",
@@ -63,7 +64,7 @@ const AdminUserProfile = () => {
63
64
  }
64
65
  ] });
65
66
  };
66
-
67
67
  //#endregion
68
68
  export { AdminUserProfile as default };
69
- //# sourceMappingURL=AdminUserProfile-DuTUnjdG.js.map
69
+
70
+ //# sourceMappingURL=AdminUserProfile-CzsPBl6Z.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminUserProfile-CzsPBl6Z.js","names":["Flex"],"sources":["../../src/admin/components/users/AdminUserProfile.tsx"],"sourcesContent":["import { DetailList, Flex } from \"@alepha/ui\";\nimport { Badge } from \"@mantine/core\";\nimport { useStore } from \"alepha/react\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { adminUserAtom } from \"../../atoms/adminUserAtom.ts\";\n\nconst AdminUserProfile = () => {\n const [user] = useStore(adminUserAtom);\n const { l } = useI18n();\n\n if (!user) return null;\n\n return (\n <DetailList\n items={[\n { label: \"ID\", value: user.id, copyable: user.id },\n { label: \"Username\", value: user.username },\n { label: \"Email\", value: user.email },\n {\n label: \"Email Verified\",\n value: user.emailVerified ? \"Yes\" : \"No\",\n },\n { label: \"Phone\", value: user.phoneNumber },\n { label: \"First Name\", value: user.firstName },\n { label: \"Last Name\", value: user.lastName },\n { label: \"Realm\", value: user.realm },\n {\n label: \"Roles\",\n value:\n user.roles.length > 0 ? (\n <Flex gap={4}>\n {user.roles.map((role) => (\n <Badge key={role} size=\"xs\" variant=\"default\">\n {role}\n </Badge>\n ))}\n </Flex>\n ) : null,\n },\n {\n label: \"Created\",\n value: String(l(user.createdAt, { date: \"lll\" })),\n },\n {\n label: \"Updated\",\n value: String(l(user.updatedAt, { date: \"lll\" })),\n },\n ]}\n />\n );\n};\n\nexport default AdminUserProfile;\n"],"mappings":";;;;;;;AAMA,MAAM,yBAAyB;CAC7B,MAAM,CAAC,QAAQ,SAAS,cAAc;CACtC,MAAM,EAAE,MAAM,SAAS;AAEvB,KAAI,CAAC,KAAM,QAAO;AAElB,QACE,oBAAC,YAAD,EACE,OAAO;EACL;GAAE,OAAO;GAAM,OAAO,KAAK;GAAI,UAAU,KAAK;GAAI;EAClD;GAAE,OAAO;GAAY,OAAO,KAAK;GAAU;EAC3C;GAAE,OAAO;GAAS,OAAO,KAAK;GAAO;EACrC;GACE,OAAO;GACP,OAAO,KAAK,gBAAgB,QAAQ;GACrC;EACD;GAAE,OAAO;GAAS,OAAO,KAAK;GAAa;EAC3C;GAAE,OAAO;GAAc,OAAO,KAAK;GAAW;EAC9C;GAAE,OAAO;GAAa,OAAO,KAAK;GAAU;EAC5C;GAAE,OAAO;GAAS,OAAO,KAAK;GAAO;EACrC;GACE,OAAO;GACP,OACE,KAAK,MAAM,SAAS,IAClB,oBAACA,QAAD;IAAM,KAAK;cACR,KAAK,MAAM,KAAK,SACf,oBAAC,OAAD;KAAkB,MAAK;KAAK,SAAQ;eACjC;KACK,EAFI,KAEJ,CACR;IACG,CAAA,GACL;GACP;EACD;GACE,OAAO;GACP,OAAO,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,OAAO,CAAC,CAAC;GAClD;EACD;GACE,OAAO;GACP,OAAO,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,OAAO,CAAC,CAAC;GAClD;EACF,EACD,CAAA"}
@@ -1,4 +1,4 @@
1
- import { b as useToast, l as Flex$1, m as useDialog, o as Text$1, r as DataTable } from "./core-BVO_TQxb.js";
1
+ import { b as useToast, l as Flex$1, m as useDialog, r as DataTable, s as Text$1 } from "./core-D1AbU50V.js";
2
2
  import { t } from "alepha";
3
3
  import { useI18n } from "alepha/react/i18n";
4
4
  import { Badge } from "@mantine/core";
@@ -7,7 +7,6 @@ import { useState } from "react";
7
7
  import { IconDeviceDesktop, IconDeviceMobile, IconDeviceTablet, IconTrash } from "@tabler/icons-react";
8
8
  import { useRouterState } from "alepha/react/router";
9
9
  import { useClient } from "alepha/react";
10
-
11
10
  //#region ../../src/admin/components/users/AdminUserSessions.tsx
12
11
  const emptyFilters = t.object({});
13
12
  const getDeviceIcon = (device) => {
@@ -101,7 +100,7 @@ const AdminUserSessions = (props) => {
101
100
  }]
102
101
  }, refreshKey);
103
102
  };
104
-
105
103
  //#endregion
106
104
  export { AdminUserSessions as default };
107
- //# sourceMappingURL=AdminUserSessions-DvZdAGpL.js.map
105
+
106
+ //# sourceMappingURL=AdminUserSessions-C-aUnhVN.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AdminUserSessions-DvZdAGpL.js","names":["Flex","Text"],"sources":["../../src/admin/components/users/AdminUserSessions.tsx"],"sourcesContent":["import { DataTable, Flex, Text, useDialog, useToast } from \"@alepha/ui\";\nimport { Badge } from \"@mantine/core\";\nimport {\n IconDeviceDesktop,\n IconDeviceMobile,\n IconDeviceTablet,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { type Page, t } from \"alepha\";\nimport type { AdminSessionController, SessionEntity } from \"alepha/api/users\";\nimport { useClient } from \"alepha/react\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { useRouterState } from \"alepha/react/router\";\nimport { useState } from \"react\";\n\nexport interface AdminUserSessionsProps {\n userRealmName?: string;\n}\n\nconst emptyFilters = t.object({});\n\nconst getDeviceIcon = (device?: string) => {\n switch (device) {\n case \"MOBILE\":\n return <IconDeviceMobile size={14} />;\n case \"TABLET\":\n return <IconDeviceTablet size={14} />;\n default:\n return <IconDeviceDesktop size={14} />;\n }\n};\n\nconst isExpired = (expiresAt: Date | string) =>\n new Date(expiresAt) < new Date();\n\nconst AdminUserSessions = (props: AdminUserSessionsProps) => {\n const state = useRouterState();\n const userId = state.params.userId as string;\n const client = useClient<AdminSessionController>();\n const { l } = useI18n();\n const dialog = useDialog();\n const toast = useToast();\n const [refreshKey, setRefreshKey] = useState(0);\n\n const handleDeleteSession = async (session: SessionEntity) => {\n const confirmed = await dialog.confirm({\n title: \"Revoke session\",\n message:\n \"Are you sure you want to revoke this session? The user will be signed out on this device.\",\n });\n if (!confirmed) return;\n await client.deleteSession({\n params: { id: session.id },\n query: { userRealmName: props.userRealmName },\n });\n toast.success(\"Session revoked\");\n setRefreshKey((k) => k + 1);\n };\n\n return (\n <DataTable<SessionEntity, typeof emptyFilters>\n key={refreshKey}\n submitOnInit\n defaultSize={10}\n filters={emptyFilters}\n tableProps={{\n horizontalSpacing: \"xs\",\n verticalSpacing: \"xs\",\n }}\n tableTrProps={(item) => ({\n style: {\n opacity: isExpired(item.expiresAt) ? 0.5 : 1,\n },\n })}\n items={async (filters) => {\n const response = await client.findSessions({\n query: {\n ...filters,\n userId,\n userRealmName: props.userRealmName,\n },\n });\n return response as Page<SessionEntity>;\n }}\n columns={{\n device: {\n label: \"Device\",\n value: (item) => (\n <Flex gap={4} align=\"center\">\n {getDeviceIcon(item.userAgent?.device)}\n <Text size=\"xs\">\n {item.userAgent\n ? `${item.userAgent.browser} / ${item.userAgent.os}`\n : \"—\"}\n </Text>\n </Flex>\n ),\n },\n ip: {\n label: \"IP\",\n value: (item) => (\n <Text size=\"xs\" ff=\"monospace\" muted>\n {item.ip || \"—\"}\n </Text>\n ),\n },\n status: {\n label: \"Status\",\n value: (item) => (\n <Badge\n size=\"sm\"\n variant=\"light\"\n color={isExpired(item.expiresAt) ? \"gray\" : \"green\"}\n >\n {isExpired(item.expiresAt) ? \"Expired\" : \"Active\"}\n </Badge>\n ),\n },\n createdAt: {\n label: \"Created\",\n value: (item) => (\n <Text size=\"xs\" muted>\n {l(item.createdAt, { date: \"fromNow\" })}\n </Text>\n ),\n },\n }}\n rowActions={(item) => [\n {\n label: \"Revoke session\",\n icon: IconTrash,\n color: \"red\",\n onClick: () => handleDeleteSession(item),\n visible: !isExpired(item.expiresAt),\n },\n ]}\n />\n );\n};\n\nexport default AdminUserSessions;\n"],"mappings":";;;;;;;;;;;AAmBA,MAAM,eAAe,EAAE,OAAO,EAAE,CAAC;AAEjC,MAAM,iBAAiB,WAAoB;AACzC,SAAQ,QAAR;EACE,KAAK,SACH,QAAO,oBAAC,oBAAiB,MAAM,KAAM;EACvC,KAAK,SACH,QAAO,oBAAC,oBAAiB,MAAM,KAAM;EACvC,QACE,QAAO,oBAAC,qBAAkB,MAAM,KAAM;;;AAI5C,MAAM,aAAa,cACjB,IAAI,KAAK,UAAU,mBAAG,IAAI,MAAM;AAElC,MAAM,qBAAqB,UAAkC;CAE3D,MAAM,SADQ,gBAAgB,CACT,OAAO;CAC5B,MAAM,SAAS,WAAmC;CAClD,MAAM,EAAE,MAAM,SAAS;CACvB,MAAM,SAAS,WAAW;CAC1B,MAAM,QAAQ,UAAU;CACxB,MAAM,CAAC,YAAY,iBAAiB,SAAS,EAAE;CAE/C,MAAM,sBAAsB,OAAO,YAA2B;AAM5D,MAAI,CALc,MAAM,OAAO,QAAQ;GACrC,OAAO;GACP,SACE;GACH,CAAC,CACc;AAChB,QAAM,OAAO,cAAc;GACzB,QAAQ,EAAE,IAAI,QAAQ,IAAI;GAC1B,OAAO,EAAE,eAAe,MAAM,eAAe;GAC9C,CAAC;AACF,QAAM,QAAQ,kBAAkB;AAChC,iBAAe,MAAM,IAAI,EAAE;;AAG7B,QACE,oBAAC;EAEC;EACA,aAAa;EACb,SAAS;EACT,YAAY;GACV,mBAAmB;GACnB,iBAAiB;GAClB;EACD,eAAe,UAAU,EACvB,OAAO,EACL,SAAS,UAAU,KAAK,UAAU,GAAG,KAAM,GAC5C,EACF;EACD,OAAO,OAAO,YAAY;AAQxB,UAPiB,MAAM,OAAO,aAAa,EACzC,OAAO;IACL,GAAG;IACH;IACA,eAAe,MAAM;IACtB,EACF,CAAC;;EAGJ,SAAS;GACP,QAAQ;IACN,OAAO;IACP,QAAQ,SACN,qBAACA;KAAK,KAAK;KAAG,OAAM;gBACjB,cAAc,KAAK,WAAW,OAAO,EACtC,oBAACC;MAAK,MAAK;gBACR,KAAK,YACF,GAAG,KAAK,UAAU,QAAQ,KAAK,KAAK,UAAU,OAC9C;OACC;MACF;IAEV;GACD,IAAI;IACF,OAAO;IACP,QAAQ,SACN,oBAACA;KAAK,MAAK;KAAK,IAAG;KAAY;eAC5B,KAAK,MAAM;MACP;IAEV;GACD,QAAQ;IACN,OAAO;IACP,QAAQ,SACN,oBAAC;KACC,MAAK;KACL,SAAQ;KACR,OAAO,UAAU,KAAK,UAAU,GAAG,SAAS;eAE3C,UAAU,KAAK,UAAU,GAAG,YAAY;MACnC;IAEX;GACD,WAAW;IACT,OAAO;IACP,QAAQ,SACN,oBAACA;KAAK,MAAK;KAAK;eACb,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;MAClC;IAEV;GACF;EACD,aAAa,SAAS,CACpB;GACE,OAAO;GACP,MAAM;GACN,OAAO;GACP,eAAe,oBAAoB,KAAK;GACxC,SAAS,CAAC,UAAU,KAAK,UAAU;GACpC,CACF;IA1EI,WA2EL"}
1
+ {"version":3,"file":"AdminUserSessions-C-aUnhVN.js","names":["Flex","Text"],"sources":["../../src/admin/components/users/AdminUserSessions.tsx"],"sourcesContent":["import { DataTable, Flex, Text, useDialog, useToast } from \"@alepha/ui\";\nimport { Badge } from \"@mantine/core\";\nimport {\n IconDeviceDesktop,\n IconDeviceMobile,\n IconDeviceTablet,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { type Page, t } from \"alepha\";\nimport type { AdminSessionController, SessionEntity } from \"alepha/api/users\";\nimport { useClient } from \"alepha/react\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { useRouterState } from \"alepha/react/router\";\nimport { useState } from \"react\";\n\nexport interface AdminUserSessionsProps {\n userRealmName?: string;\n}\n\nconst emptyFilters = t.object({});\n\nconst getDeviceIcon = (device?: string) => {\n switch (device) {\n case \"MOBILE\":\n return <IconDeviceMobile size={14} />;\n case \"TABLET\":\n return <IconDeviceTablet size={14} />;\n default:\n return <IconDeviceDesktop size={14} />;\n }\n};\n\nconst isExpired = (expiresAt: Date | string) =>\n new Date(expiresAt) < new Date();\n\nconst AdminUserSessions = (props: AdminUserSessionsProps) => {\n const state = useRouterState();\n const userId = state.params.userId as string;\n const client = useClient<AdminSessionController>();\n const { l } = useI18n();\n const dialog = useDialog();\n const toast = useToast();\n const [refreshKey, setRefreshKey] = useState(0);\n\n const handleDeleteSession = async (session: SessionEntity) => {\n const confirmed = await dialog.confirm({\n title: \"Revoke session\",\n message:\n \"Are you sure you want to revoke this session? The user will be signed out on this device.\",\n });\n if (!confirmed) return;\n await client.deleteSession({\n params: { id: session.id },\n query: { userRealmName: props.userRealmName },\n });\n toast.success(\"Session revoked\");\n setRefreshKey((k) => k + 1);\n };\n\n return (\n <DataTable<SessionEntity, typeof emptyFilters>\n key={refreshKey}\n submitOnInit\n defaultSize={10}\n filters={emptyFilters}\n tableProps={{\n horizontalSpacing: \"xs\",\n verticalSpacing: \"xs\",\n }}\n tableTrProps={(item) => ({\n style: {\n opacity: isExpired(item.expiresAt) ? 0.5 : 1,\n },\n })}\n items={async (filters) => {\n const response = await client.findSessions({\n query: {\n ...filters,\n userId,\n userRealmName: props.userRealmName,\n },\n });\n return response as Page<SessionEntity>;\n }}\n columns={{\n device: {\n label: \"Device\",\n value: (item) => (\n <Flex gap={4} align=\"center\">\n {getDeviceIcon(item.userAgent?.device)}\n <Text size=\"xs\">\n {item.userAgent\n ? `${item.userAgent.browser} / ${item.userAgent.os}`\n : \"—\"}\n </Text>\n </Flex>\n ),\n },\n ip: {\n label: \"IP\",\n value: (item) => (\n <Text size=\"xs\" ff=\"monospace\" muted>\n {item.ip || \"—\"}\n </Text>\n ),\n },\n status: {\n label: \"Status\",\n value: (item) => (\n <Badge\n size=\"sm\"\n variant=\"light\"\n color={isExpired(item.expiresAt) ? \"gray\" : \"green\"}\n >\n {isExpired(item.expiresAt) ? \"Expired\" : \"Active\"}\n </Badge>\n ),\n },\n createdAt: {\n label: \"Created\",\n value: (item) => (\n <Text size=\"xs\" muted>\n {l(item.createdAt, { date: \"fromNow\" })}\n </Text>\n ),\n },\n }}\n rowActions={(item) => [\n {\n label: \"Revoke session\",\n icon: IconTrash,\n color: \"red\",\n onClick: () => handleDeleteSession(item),\n visible: !isExpired(item.expiresAt),\n },\n ]}\n />\n );\n};\n\nexport default AdminUserSessions;\n"],"mappings":";;;;;;;;;;AAmBA,MAAM,eAAe,EAAE,OAAO,EAAE,CAAC;AAEjC,MAAM,iBAAiB,WAAoB;AACzC,SAAQ,QAAR;EACE,KAAK,SACH,QAAO,oBAAC,kBAAD,EAAkB,MAAM,IAAM,CAAA;EACvC,KAAK,SACH,QAAO,oBAAC,kBAAD,EAAkB,MAAM,IAAM,CAAA;EACvC,QACE,QAAO,oBAAC,mBAAD,EAAmB,MAAM,IAAM,CAAA;;;AAI5C,MAAM,aAAa,cACjB,IAAI,KAAK,UAAU,mBAAG,IAAI,MAAM;AAElC,MAAM,qBAAqB,UAAkC;CAE3D,MAAM,SADQ,gBAAgB,CACT,OAAO;CAC5B,MAAM,SAAS,WAAmC;CAClD,MAAM,EAAE,MAAM,SAAS;CACvB,MAAM,SAAS,WAAW;CAC1B,MAAM,QAAQ,UAAU;CACxB,MAAM,CAAC,YAAY,iBAAiB,SAAS,EAAE;CAE/C,MAAM,sBAAsB,OAAO,YAA2B;AAM5D,MAAI,CALc,MAAM,OAAO,QAAQ;GACrC,OAAO;GACP,SACE;GACH,CAAC,CACc;AAChB,QAAM,OAAO,cAAc;GACzB,QAAQ,EAAE,IAAI,QAAQ,IAAI;GAC1B,OAAO,EAAE,eAAe,MAAM,eAAe;GAC9C,CAAC;AACF,QAAM,QAAQ,kBAAkB;AAChC,iBAAe,MAAM,IAAI,EAAE;;AAG7B,QACE,oBAAC,WAAD;EAEE,cAAA;EACA,aAAa;EACb,SAAS;EACT,YAAY;GACV,mBAAmB;GACnB,iBAAiB;GAClB;EACD,eAAe,UAAU,EACvB,OAAO,EACL,SAAS,UAAU,KAAK,UAAU,GAAG,KAAM,GAC5C,EACF;EACD,OAAO,OAAO,YAAY;AAQxB,UAPiB,MAAM,OAAO,aAAa,EACzC,OAAO;IACL,GAAG;IACH;IACA,eAAe,MAAM;IACtB,EACF,CAAC;;EAGJ,SAAS;GACP,QAAQ;IACN,OAAO;IACP,QAAQ,SACN,qBAACA,QAAD;KAAM,KAAK;KAAG,OAAM;eAApB,CACG,cAAc,KAAK,WAAW,OAAO,EACtC,oBAACC,QAAD;MAAM,MAAK;gBACR,KAAK,YACF,GAAG,KAAK,UAAU,QAAQ,KAAK,KAAK,UAAU,OAC9C;MACC,CAAA,CACF;;IAEV;GACD,IAAI;IACF,OAAO;IACP,QAAQ,SACN,oBAACA,QAAD;KAAM,MAAK;KAAK,IAAG;KAAY,OAAA;eAC5B,KAAK,MAAM;KACP,CAAA;IAEV;GACD,QAAQ;IACN,OAAO;IACP,QAAQ,SACN,oBAAC,OAAD;KACE,MAAK;KACL,SAAQ;KACR,OAAO,UAAU,KAAK,UAAU,GAAG,SAAS;eAE3C,UAAU,KAAK,UAAU,GAAG,YAAY;KACnC,CAAA;IAEX;GACD,WAAW;IACT,OAAO;IACP,QAAQ,SACN,oBAACA,QAAD;KAAM,MAAK;KAAK,OAAA;eACb,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;KAClC,CAAA;IAEV;GACF;EACD,aAAa,SAAS,CACpB;GACE,OAAO;GACP,MAAM;GACN,OAAO;GACP,eAAe,oBAAoB,KAAK;GACxC,SAAS,CAAC,UAAU,KAAK,UAAU;GACpC,CACF;EACD,EA3EK,WA2EL"}
@@ -1,4 +1,4 @@
1
- import { _ as ActionButton, b as useToast, l as Flex$1, m as useDialog, o as Text$1, r as DataTable } from "./core-BVO_TQxb.js";
1
+ import { _ as ActionButton, b as useToast, l as Flex$1, m as useDialog, r as DataTable, s as Text$1 } from "./core-D1AbU50V.js";
2
2
  import { t } from "alepha";
3
3
  import { useI18n } from "alepha/react/i18n";
4
4
  import { Avatar, Badge } from "@mantine/core";
@@ -7,7 +7,6 @@ import { useState } from "react";
7
7
  import { IconEye, IconTrash, IconUserOff, IconUserPlus } from "@tabler/icons-react";
8
8
  import { useRouter } from "alepha/react/router";
9
9
  import { useClient } from "alepha/react";
10
-
11
10
  //#region ../../src/admin/components/users/AdminUsers.tsx
12
11
  const filters = t.object({
13
12
  query: t.optional(t.text()),
@@ -111,6 +110,7 @@ const AdminUsers = (props) => {
111
110
  name
112
111
  }), /* @__PURE__ */ jsxs(Flex$1, {
113
112
  col: true,
113
+ align: "start",
114
114
  children: [/* @__PURE__ */ jsx(Text$1, {
115
115
  size: "sm",
116
116
  bold: true,
@@ -200,7 +200,7 @@ const AdminUsers = (props) => {
200
200
  }, refreshKey)
201
201
  });
202
202
  };
203
-
204
203
  //#endregion
205
204
  export { AdminUsers as default };
206
- //# sourceMappingURL=AdminUsers-CR9z0g_5.js.map
205
+
206
+ //# sourceMappingURL=AdminUsers-BYwei5sj.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminUsers-BYwei5sj.js","names":["Flex","Text"],"sources":["../../src/admin/components/users/AdminUsers.tsx"],"sourcesContent":["import {\n ActionButton,\n DataTable,\n Flex,\n Text,\n useDialog,\n useToast,\n} from \"@alepha/ui\";\nimport { Avatar, Badge } from \"@mantine/core\";\nimport {\n IconEye,\n IconTrash,\n IconUserOff,\n IconUserPlus,\n} from \"@tabler/icons-react\";\nimport { type Page, t } from \"alepha\";\nimport type { AdminUserController, UserEntity } from \"alepha/api/users\";\nimport { useClient } from \"alepha/react\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { useRouter } from \"alepha/react/router\";\nimport { useState } from \"react\";\nimport type { AdminRouter } from \"../../AdminRouter.tsx\";\n\nexport interface AdminUsersProps {\n userRealmName?: string;\n}\n\nconst filters = t.object({\n query: t.optional(t.text()),\n enabled: t.optional(t.boolean()),\n emailVerified: t.optional(t.boolean()),\n});\n\nconst AdminUsers = (props: AdminUsersProps) => {\n const client = useClient<AdminUserController>();\n const router = useRouter<AdminRouter>();\n const { l } = useI18n();\n const dialog = useDialog();\n const toast = useToast();\n const [refreshKey, setRefreshKey] = useState(0);\n\n const refresh = () => setRefreshKey((k) => k + 1);\n\n const handleToggleEnabled = async (user: UserEntity) => {\n const enabled = !user.enabled;\n const confirmed = await dialog.confirm({\n title: enabled ? \"Enable user\" : \"Disable user\",\n message: enabled\n ? `Enable ${user.email || user.username || \"this user\"}?`\n : `Disable ${user.email || user.username || \"this user\"}? They will no longer be able to sign in.`,\n });\n if (!confirmed) return;\n await client.updateUser({\n params: { id: user.id },\n query: { userRealmName: props.userRealmName },\n body: { enabled },\n });\n toast.success({\n message: enabled ? \"User enabled\" : \"User disabled\",\n });\n refresh();\n };\n\n const handleDelete = async (user: UserEntity) => {\n const confirmed = await dialog.confirm({\n title: \"Delete user\",\n message: `Permanently delete ${user.email || user.username || \"this user\"}? This action cannot be undone.`,\n });\n if (!confirmed) return;\n await client.deleteUser({\n params: { id: user.id },\n query: { userRealmName: props.userRealmName },\n });\n toast.success({ message: \"User deleted\" });\n refresh();\n };\n\n const handleBulkDisable = async (\n items: UserEntity[],\n clearSelection: () => void,\n ) => {\n const enabledUsers = items.filter((u) => u.enabled);\n if (enabledUsers.length === 0) {\n toast.danger({ message: \"No active users in selection\" });\n return;\n }\n const confirmed = await dialog.confirm({\n title: \"Disable users\",\n message: `Disable ${enabledUsers.length} user(s)? They will no longer be able to sign in.`,\n });\n if (!confirmed) return;\n for (const user of enabledUsers) {\n await client.updateUser({\n params: { id: user.id },\n query: { userRealmName: props.userRealmName },\n body: { enabled: false },\n });\n }\n toast.success({\n message: `${enabledUsers.length} user(s) disabled`,\n });\n clearSelection();\n refresh();\n };\n\n return (\n <Flex p={\"md\"} flex={1} direction=\"column\">\n <DataTable<UserEntity, typeof filters>\n withCheckbox\n withExport\n checkboxActions={[\n {\n intent: \"danger\",\n label: \"Disable selected\",\n icon: <IconUserOff />,\n onClick: (ctx) =>\n handleBulkDisable(ctx.selectedItems, ctx.clearSelection),\n },\n ]}\n key={refreshKey}\n submitOnInit\n defaultSize={10}\n defaultFilters={[\"query\"]}\n tableProps={{\n horizontalSpacing: \"xs\",\n verticalSpacing: \"xs\",\n }}\n onFilterChange={(_key, _value, form) => form.submit()}\n filters={filters}\n items={async (filters) => {\n const response = await client.findUsers({\n query: {\n ...filters,\n userRealmName: props.userRealmName,\n },\n });\n return response as Page<UserEntity>;\n }}\n columns={{\n user: {\n label: \"User\",\n value: (item) => {\n const name =\n `${item.firstName || \"\"} ${item.lastName || \"\"}`.trim() ||\n item.username ||\n \"Anonymous\";\n\n return (\n <ActionButton\n variant={\"transparent\"}\n href={`/admin/users/${item.id}`}\n >\n <Flex gap={\"xs\"} centerY>\n <Avatar size={\"sm\"} name={name} />\n <Flex col align={\"start\"}>\n <Text size={\"sm\"} bold>\n {name}\n </Text>\n <Text size=\"xs\" muted>\n {item.email || \"\\u2014\"}\n </Text>\n </Flex>\n </Flex>\n </ActionButton>\n );\n },\n },\n username: {\n label: \"Username\",\n defaultHidden: true,\n value: (item) => (\n <Text size=\"sm\" ff=\"monospace\">\n {item.username || \"\\u2014\"}\n </Text>\n ),\n },\n roles: {\n label: \"Roles\",\n value: (item) =>\n item.roles.length > 0 ? (\n <Flex gap={4}>\n {item.roles.map((role: string) => (\n <Badge key={role} size=\"xs\" variant=\"default\">\n {role}\n </Badge>\n ))}\n </Flex>\n ) : (\n <Text size=\"xs\" muted>\n No roles\n </Text>\n ),\n },\n enabled: {\n label: \"Status\",\n value: (item) => (\n <Badge\n size=\"sm\"\n variant=\"light\"\n color={item.enabled ? \"green\" : \"red\"}\n >\n {item.enabled ? \"Active\" : \"Disabled\"}\n </Badge>\n ),\n },\n emailVerified: {\n label: \"Email\",\n value: (item) => (\n <Badge\n size=\"sm\"\n variant=\"light\"\n color={item.emailVerified ? \"green\" : \"gray\"}\n >\n {item.emailVerified ? \"Verified\" : \"Unverified\"}\n </Badge>\n ),\n },\n createdAt: {\n label: \"Joined\",\n sortable: true,\n sortKey: \"createdAt\",\n value: (item) => (\n <Text size=\"xs\" muted>\n {l(item.createdAt, { date: \"fromNow\" })}\n </Text>\n ),\n },\n }}\n rowActions={(item) => [\n {\n label: \"View profile\",\n icon: IconEye,\n onClick: () =>\n router.push(\"adminUserProfile\", {\n params: { userId: item.id },\n }),\n },\n {\n label: item.enabled ? \"Disable user\" : \"Enable user\",\n icon: item.enabled ? IconUserOff : IconUserPlus,\n color: item.enabled ? \"red\" : \"green\",\n onClick: () => handleToggleEnabled(item),\n },\n {\n label: \"Delete user\",\n icon: IconTrash,\n color: \"red\",\n onClick: () => handleDelete(item),\n },\n ]}\n />\n </Flex>\n );\n};\n\nexport default AdminUsers;\n"],"mappings":"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"}
@@ -1,8 +1,7 @@
1
- import { y as AlephaMantineProvider } from "./core-BVO_TQxb.js";
1
+ import { y as AlephaMantineProvider } from "./core-D1AbU50V.js";
2
2
  import { Flex } from "@mantine/core";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
  import { NestedView } from "alepha/react/router";
5
-
6
5
  //#region ../../src/auth/components/AuthLayout.tsx
7
6
  const AuthLayout = () => {
8
7
  return /* @__PURE__ */ jsx(AlephaMantineProvider, {
@@ -16,7 +15,7 @@ const AuthLayout = () => {
16
15
  })
17
16
  });
18
17
  };
19
-
20
18
  //#endregion
21
19
  export { AuthLayout as default };
22
- //# sourceMappingURL=AuthLayout-DsUfp9RG.js.map
20
+
21
+ //# sourceMappingURL=AuthLayout-CkPGLJku.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AuthLayout-DsUfp9RG.js","names":[],"sources":["../../src/auth/components/AuthLayout.tsx"],"sourcesContent":["import { AlephaMantineProvider } from \"@alepha/ui\";\nimport { Flex } from \"@mantine/core\";\nimport { NestedView } from \"alepha/react/router\";\n\nconst AuthLayout = () => {\n return (\n <AlephaMantineProvider omnibar={false}>\n <Flex flex={1} align={\"center\"} h={\"100vh\"} justify={\"center\"}>\n <NestedView />\n </Flex>\n </AlephaMantineProvider>\n );\n};\n\nexport default AuthLayout;\n"],"mappings":";;;;;;AAIA,MAAM,mBAAmB;AACvB,QACE,oBAAC;EAAsB,SAAS;YAC9B,oBAAC;GAAK,MAAM;GAAG,OAAO;GAAU,GAAG;GAAS,SAAS;aACnD,oBAAC,eAAa;IACT;GACe"}
1
+ {"version":3,"file":"AuthLayout-CkPGLJku.js","names":[],"sources":["../../src/auth/components/AuthLayout.tsx"],"sourcesContent":["import { AlephaMantineProvider } from \"@alepha/ui\";\nimport { Flex } from \"@mantine/core\";\nimport { NestedView } from \"alepha/react/router\";\n\nconst AuthLayout = () => {\n return (\n <AlephaMantineProvider omnibar={false}>\n <Flex flex={1} align={\"center\"} h={\"100vh\"} justify={\"center\"}>\n <NestedView />\n </Flex>\n </AlephaMantineProvider>\n );\n};\n\nexport default AuthLayout;\n"],"mappings":";;;;;AAIA,MAAM,mBAAmB;AACvB,QACE,oBAAC,uBAAD;EAAuB,SAAS;YAC9B,oBAAC,MAAD;GAAM,MAAM;GAAG,OAAO;GAAU,GAAG;GAAS,SAAS;aACnD,oBAAC,YAAD,EAAc,CAAA;GACT,CAAA;EACe,CAAA"}
@@ -1,5 +1,4 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
-
3
2
  //#region ../../src/auth/components/icons/IconGithub.tsx
4
3
  const IconGithub = () => {
5
4
  return /* @__PURE__ */ jsx("svg", {
@@ -17,7 +16,6 @@ const IconGithub = () => {
17
16
  })
18
17
  });
19
18
  };
20
-
21
19
  //#endregion
22
20
  //#region ../../src/auth/components/icons/IconGoogle.tsx
23
21
  const IconGoogle = () => {
@@ -50,7 +48,7 @@ const IconGoogle = () => {
50
48
  ]
51
49
  });
52
50
  };
53
-
54
51
  //#endregion
55
52
  export { IconGithub as n, IconGoogle as t };
56
- //# sourceMappingURL=IconGoogle-CSQLPYwX.js.map
53
+
54
+ //# sourceMappingURL=IconGoogle-8Nkx6yax.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"IconGoogle-Ch1m3Uzl.js","names":[],"sources":["../../src/auth/components/icons/IconGithub.tsx","../../src/auth/components/icons/IconGoogle.tsx"],"sourcesContent":["const IconGithub = () => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 1024 1024\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z\"\n transform=\"scale(64)\"\n fill={\"var(--alepha-text)\"}\n />\n </svg>\n );\n};\n\nexport default IconGithub;\n","const IconGoogle = () => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n >\n <path\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\n fill=\"#4285F4\"\n />\n <path\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n fill=\"#34A853\"\n />\n <path\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n fill=\"#FBBC05\"\n />\n <path\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n fill=\"#EA4335\"\n />\n <path d=\"M1 1h22v22H1z\" fill=\"none\" />\n </svg>\n );\n};\n\nexport default IconGoogle;\n"],"mappings":";;;AAAA,MAAM,mBAAmB;AACvB,QACE,oBAAC;EACC,OAAM;EACN,QAAO;EACP,SAAQ;EACR,MAAK;EACL,OAAM;YAEN,oBAAC;GACC,UAAS;GACT,UAAS;GACT,GAAE;GACF,WAAU;GACV,MAAM;IACN;GACE;;;;;AChBV,MAAM,mBAAmB;AACvB,QACE,qBAAC;EACC,OAAM;EACN,QAAO;EACP,SAAQ;EACR,OAAM;;GAEN,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IAAK,GAAE;IAAgB,MAAK;KAAS;;GAClC"}
1
+ {"version":3,"file":"IconGoogle-8Nkx6yax.js","names":[],"sources":["../../src/auth/components/icons/IconGithub.tsx","../../src/auth/components/icons/IconGoogle.tsx"],"sourcesContent":["const IconGithub = () => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 1024 1024\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z\"\n transform=\"scale(64)\"\n fill={\"var(--alepha-text)\"}\n />\n </svg>\n );\n};\n\nexport default IconGithub;\n","const IconGoogle = () => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n >\n <path\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\n fill=\"#4285F4\"\n />\n <path\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n fill=\"#34A853\"\n />\n <path\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n fill=\"#FBBC05\"\n />\n <path\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n fill=\"#EA4335\"\n />\n <path d=\"M1 1h22v22H1z\" fill=\"none\" />\n </svg>\n );\n};\n\nexport default IconGoogle;\n"],"mappings":";;AAAA,MAAM,mBAAmB;AACvB,QACE,oBAAC,OAAD;EACE,OAAM;EACN,QAAO;EACP,SAAQ;EACR,MAAK;EACL,OAAM;YAEN,oBAAC,QAAD;GACE,UAAS;GACT,UAAS;GACT,GAAE;GACF,WAAU;GACV,MAAM;GACN,CAAA;EACE,CAAA;;;;AChBV,MAAM,mBAAmB;AACvB,QACE,qBAAC,OAAD;EACE,OAAM;EACN,QAAO;EACP,SAAQ;EACR,OAAM;YAJR;GAME,oBAAC,QAAD;IACE,GAAE;IACF,MAAK;IACL,CAAA;GACF,oBAAC,QAAD;IACE,GAAE;IACF,MAAK;IACL,CAAA;GACF,oBAAC,QAAD;IACE,GAAE;IACF,MAAK;IACL,CAAA;GACF,oBAAC,QAAD;IACE,GAAE;IACF,MAAK;IACL,CAAA;GACF,oBAAC,QAAD;IAAM,GAAE;IAAgB,MAAK;IAAS,CAAA;GAClC"}