@alepha/ui 0.17.1 → 0.18.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 (273) hide show
  1. package/dist/admin/{AdminApiKeys-CF_qOO3u.js → AdminApiKeys-C-6_Q-lH.js} +56 -192
  2. package/dist/admin/AdminApiKeys-C-6_Q-lH.js.map +1 -0
  3. package/dist/admin/{AdminAudits-BQno3hZG.js → AdminAudits-Bgbf04hO.js} +25 -61
  4. package/dist/admin/AdminAudits-Bgbf04hO.js.map +1 -0
  5. package/dist/admin/{AdminFiles-kvuUaASF.js → AdminFiles-B9a7G3cY.js} +6 -8
  6. package/dist/admin/AdminFiles-B9a7G3cY.js.map +1 -0
  7. package/dist/admin/{AdminJobDashboard-CrPxp0W1.js → AdminJobDashboard-DaTwf5OY.js} +55 -186
  8. package/dist/admin/AdminJobDashboard-DaTwf5OY.js.map +1 -0
  9. package/dist/admin/{AdminJobExecutions-D-b4Zt7W.js → AdminJobExecutions-B9cek5dl.js} +132 -168
  10. package/dist/admin/AdminJobExecutions-B9cek5dl.js.map +1 -0
  11. package/dist/admin/{AdminJobRegistry-CNX5cpDx.js → AdminJobRegistry-DFgV3oqx.js} +60 -83
  12. package/dist/admin/AdminJobRegistry-DFgV3oqx.js.map +1 -0
  13. package/dist/admin/AdminLayout-DHsvWxVB.js +70 -0
  14. package/dist/admin/AdminLayout-DHsvWxVB.js.map +1 -0
  15. package/dist/admin/{AdminParameters-iQE8o7a7.js → AdminParameters-DHw9ATgl.js} +53 -53
  16. package/dist/admin/AdminParameters-DHw9ATgl.js.map +1 -0
  17. package/dist/admin/{AdminSessions-oKJCbd7w.js → AdminSessions-BhGJPI3z.js} +11 -18
  18. package/dist/admin/AdminSessions-BhGJPI3z.js.map +1 -0
  19. package/dist/admin/{AdminUserLayout-HAlobhWf.js → AdminUserLayout-BdC4Te8m.js} +112 -151
  20. package/dist/admin/AdminUserLayout-BdC4Te8m.js.map +1 -0
  21. package/dist/admin/AdminUserProfile-DAt23fqY.js +69 -0
  22. package/dist/admin/AdminUserProfile-DAt23fqY.js.map +1 -0
  23. package/dist/admin/AdminUserSessions-1uzcx02z.js +109 -0
  24. package/dist/admin/AdminUserSessions-1uzcx02z.js.map +1 -0
  25. package/dist/admin/AdminUsers-C85c3eiQ.js +121 -0
  26. package/dist/admin/AdminUsers-C85c3eiQ.js.map +1 -0
  27. package/dist/{auth/AuthLayout-CdJcrPs4.js → admin/AuthLayout-DFJvCvzw.js} +3 -3
  28. package/dist/{auth/AuthLayout-CdJcrPs4.js.map → admin/AuthLayout-DFJvCvzw.js.map} +1 -1
  29. package/dist/{auth/IconGoogle-Bm18QD2q.js → admin/IconGoogle-CSQLPYwX.js} +1 -1
  30. package/dist/{auth/IconGoogle-Bm18QD2q.js.map → admin/IconGoogle-CSQLPYwX.js.map} +1 -1
  31. package/dist/{demo/DemoLogin-DjJ9314c.js → admin/Login-BGheURrg.js} +15 -129
  32. package/dist/{auth/Login-BS_FYTy0.js.map → admin/Login-BGheURrg.js.map} +1 -1
  33. package/dist/{auth/Profile-CjDsW378.js → admin/Profile-B-c9pCPf.js} +5 -5
  34. package/dist/{auth/Profile-CjDsW378.js.map → admin/Profile-B-c9pCPf.js.map} +1 -1
  35. package/dist/{demo/DemoRegister-DzkJ5M83.js → admin/Register-Cs10l8vX.js} +20 -146
  36. package/dist/{auth/Register-C5eqzAaD.js.map → admin/Register-Cs10l8vX.js.map} +1 -1
  37. package/dist/{demo/DemoResetPassword-DWh4_BpQ.js → admin/ResetPassword-BwDdfkGH.js} +20 -82
  38. package/dist/{auth/ResetPassword-XifinVao.js.map → admin/ResetPassword-BwDdfkGH.js.map} +1 -1
  39. package/dist/{demo/DemoVerifyEmail-DbU_tCj8.js → admin/VerifyEmail-DfXHAiQl.js} +15 -32
  40. package/dist/{auth/VerifyEmail-DTgbeJOO.js.map → admin/VerifyEmail-DfXHAiQl.js.map} +1 -1
  41. package/dist/admin/auth-Dr0Cf8I7.js +319 -0
  42. package/dist/admin/auth-Dr0Cf8I7.js.map +1 -0
  43. package/dist/admin/core-2xoLiT0o.js +4031 -0
  44. package/dist/admin/core-2xoLiT0o.js.map +1 -0
  45. package/dist/admin/index.d.ts +740 -17
  46. package/dist/admin/index.d.ts.map +1 -1
  47. package/dist/admin/index.js +80 -127
  48. package/dist/admin/index.js.map +1 -1
  49. package/dist/admin/rolldown-runtime-CjeV3_4I.js +18 -0
  50. package/dist/auth/AuthLayout-CAE1pX9s.js +22 -0
  51. package/dist/auth/AuthLayout-CAE1pX9s.js.map +1 -0
  52. package/dist/auth/{Login-BS_FYTy0.js → Login-Denw_UGy.js} +8 -8
  53. package/dist/auth/Login-Denw_UGy.js.map +1 -0
  54. package/dist/auth/Profile-BMX_Ar_s.js +155 -0
  55. package/dist/auth/Profile-BMX_Ar_s.js.map +1 -0
  56. package/dist/auth/{Register-C5eqzAaD.js → Register-6hi_cpfF.js} +8 -8
  57. package/dist/auth/Register-6hi_cpfF.js.map +1 -0
  58. package/dist/auth/{ResetPassword-XifinVao.js → ResetPassword-CqfTk1FI.js} +6 -6
  59. package/dist/auth/ResetPassword-CqfTk1FI.js.map +1 -0
  60. package/dist/auth/{VerifyEmail-DTgbeJOO.js → VerifyEmail-nWiSTMjF.js} +5 -5
  61. package/dist/auth/VerifyEmail-nWiSTMjF.js.map +1 -0
  62. package/dist/auth/core-niW0sFLv.js +2264 -0
  63. package/dist/auth/core-niW0sFLv.js.map +1 -0
  64. package/dist/auth/index.d.ts +336 -8
  65. package/dist/auth/index.d.ts.map +1 -1
  66. package/dist/auth/index.js +18 -22
  67. package/dist/auth/index.js.map +1 -1
  68. package/dist/core/index.d.ts +1033 -843
  69. package/dist/core/index.d.ts.map +1 -1
  70. package/dist/core/index.js +1626 -1354
  71. package/dist/core/index.js.map +1 -1
  72. package/dist/demo/AuthLayout-jLa0aKsI.js +22 -0
  73. package/dist/demo/AuthLayout-jLa0aKsI.js.map +1 -0
  74. package/dist/demo/DemoButton-BmaWZVwf.js +178 -0
  75. package/dist/demo/DemoButton-BmaWZVwf.js.map +1 -0
  76. package/dist/demo/{DemoDataTable-lnBKWBf8.js → DemoDataTable-Z9xyV221.js} +18 -18
  77. package/dist/demo/DemoDataTable-Z9xyV221.js.map +1 -0
  78. package/dist/demo/DemoDialog-4ItHLf9t.js +101 -0
  79. package/dist/demo/DemoDialog-4ItHLf9t.js.map +1 -0
  80. package/dist/demo/DemoFlex-EtVq8QfX.js +105 -0
  81. package/dist/demo/DemoFlex-EtVq8QfX.js.map +1 -0
  82. package/dist/demo/DemoHeading-BS-vGfkI.js +18 -0
  83. package/dist/demo/DemoHeading-BS-vGfkI.js.map +1 -0
  84. package/dist/demo/{DemoHome-CUMZsYaH.js → DemoHome-Clbn8AmS.js} +9 -12
  85. package/dist/demo/DemoHome-Clbn8AmS.js.map +1 -0
  86. package/dist/demo/DemoJsonViewer-DkIX_ky2.js +109 -0
  87. package/dist/demo/DemoJsonViewer-DkIX_ky2.js.map +1 -0
  88. package/dist/demo/DemoLayout-C56xb5EE.js +73 -0
  89. package/dist/demo/DemoLayout-C56xb5EE.js.map +1 -0
  90. package/dist/demo/DemoLogin-BZwpicOS.js +128 -0
  91. package/dist/demo/DemoLogin-BZwpicOS.js.map +1 -0
  92. package/dist/demo/DemoRegister-C7_qc4MJ.js +140 -0
  93. package/dist/demo/DemoRegister-C7_qc4MJ.js.map +1 -0
  94. package/dist/demo/DemoResetPassword-BI1Ct4Dw.js +76 -0
  95. package/dist/demo/DemoResetPassword-BI1Ct4Dw.js.map +1 -0
  96. package/dist/demo/{DemoSidebar-C1csnGhX.js → DemoSidebar-CcBo4ltC.js} +6 -9
  97. package/dist/demo/DemoSidebar-CcBo4ltC.js.map +1 -0
  98. package/dist/demo/DemoText-CzXuUn3g.js +124 -0
  99. package/dist/demo/DemoText-CzXuUn3g.js.map +1 -0
  100. package/dist/demo/DemoToast-BgHDhWrX.js +95 -0
  101. package/dist/demo/DemoToast-BgHDhWrX.js.map +1 -0
  102. package/dist/demo/{DemoTypeForm-CWz6fJrJ.js → DemoTypeForm-DDzWoMSV.js} +4 -4
  103. package/dist/demo/{DemoTypeForm-CWz6fJrJ.js.map → DemoTypeForm-DDzWoMSV.js.map} +1 -1
  104. package/dist/demo/DemoVerifyEmail-C_Irdnov.js +30 -0
  105. package/dist/demo/DemoVerifyEmail-C_Irdnov.js.map +1 -0
  106. package/dist/demo/IconGoogle-CSQLPYwX.js +56 -0
  107. package/dist/demo/IconGoogle-CSQLPYwX.js.map +1 -0
  108. package/dist/demo/Login-hSOU3jZc.js +219 -0
  109. package/dist/demo/Login-hSOU3jZc.js.map +1 -0
  110. package/dist/demo/Profile-CWqti7FB.js +155 -0
  111. package/dist/demo/Profile-CWqti7FB.js.map +1 -0
  112. package/dist/demo/Register-a70LPgs2.js +375 -0
  113. package/dist/demo/Register-a70LPgs2.js.map +1 -0
  114. package/dist/demo/ResetPassword-DWN0lzr5.js +286 -0
  115. package/dist/demo/ResetPassword-DWN0lzr5.js.map +1 -0
  116. package/dist/demo/Showcase-Dq3MISpd.js +232 -0
  117. package/dist/demo/Showcase-Dq3MISpd.js.map +1 -0
  118. package/dist/demo/VerifyEmail-DZWL72K4.js +135 -0
  119. package/dist/demo/VerifyEmail-DZWL72K4.js.map +1 -0
  120. package/dist/demo/auth-d6n3xbug.js +257 -0
  121. package/dist/demo/auth-d6n3xbug.js.map +1 -0
  122. package/dist/demo/core-RCUw1Q-a.js +4217 -0
  123. package/dist/demo/core-RCUw1Q-a.js.map +1 -0
  124. package/dist/demo/index.d.ts +17 -6
  125. package/dist/demo/index.d.ts.map +1 -1
  126. package/dist/demo/index.js +92 -24
  127. package/dist/demo/index.js.map +1 -1
  128. package/dist/demo/rolldown-runtime-CjeV3_4I.js +18 -0
  129. package/package.json +16 -20
  130. package/src/admin/AdminRouter.ts +12 -61
  131. package/src/admin/components/AdminLayout.tsx +42 -10
  132. package/src/admin/components/audits/AdminAudits.tsx +10 -64
  133. package/src/admin/components/files/AdminFiles.tsx +2 -3
  134. package/src/admin/components/jobs/AdminJobDashboard.tsx +36 -142
  135. package/src/admin/components/jobs/AdminJobExecutions.tsx +117 -175
  136. package/src/admin/components/jobs/AdminJobRegistry.tsx +58 -73
  137. package/src/admin/components/keys/AdminApiKeys.tsx +21 -169
  138. package/src/admin/components/parameters/AdminParameters.tsx +4 -4
  139. package/src/admin/components/parameters/ParameterEmptyState.tsx +1 -2
  140. package/src/admin/components/parameters/ParameterHistory.tsx +3 -3
  141. package/src/admin/components/parameters/ParameterTree.tsx +2 -8
  142. package/src/admin/components/parameters/types.ts +3 -3
  143. package/src/admin/components/sessions/AdminSessions.tsx +8 -16
  144. package/src/admin/components/users/AdminUserLayout.tsx +113 -150
  145. package/src/admin/components/users/AdminUserProfile.tsx +50 -0
  146. package/src/admin/components/users/AdminUserSessions.tsx +106 -126
  147. package/src/admin/components/users/AdminUsers.tsx +46 -62
  148. package/src/admin/index.ts +1 -5
  149. package/src/auth/components/buttons/UserButton.tsx +1 -1
  150. package/src/auth/index.ts +0 -4
  151. package/src/core/UiRouter.ts +1 -1
  152. package/src/core/atoms/alephaSidebarAtom.ts +7 -31
  153. package/src/core/components/{layout/AlephaMantineProvider.tsx → AlephaMantineProvider.tsx} +3 -4
  154. package/src/core/components/Flex.tsx +63 -0
  155. package/src/core/components/Heading.tsx +19 -0
  156. package/src/core/components/Text.tsx +140 -0
  157. package/src/core/components/buttons/ActionButton.tsx +12 -1
  158. package/src/core/components/buttons/BurgerButton.tsx +3 -3
  159. package/src/core/components/buttons/LanguageButton.tsx +1 -1
  160. package/src/core/components/buttons/ToggleSidebarButton.tsx +1 -4
  161. package/src/core/components/data/DetailDrawer.tsx +144 -0
  162. package/src/core/components/data/DetailList.tsx +64 -0
  163. package/src/core/components/data/StatCards.tsx +50 -0
  164. package/src/core/components/layout/AppBar.tsx +11 -10
  165. package/src/core/components/layout/Breadcrumb.tsx +8 -8
  166. package/src/core/components/layout/Container.tsx +15 -0
  167. package/src/core/components/layout/DashboardShell.tsx +23 -238
  168. package/src/core/components/layout/Omnibar.tsx +1 -2
  169. package/src/core/components/layout/Sidebar.tsx +103 -71
  170. package/src/core/components/layout/index.ts +65 -0
  171. package/src/core/{components/form → form/components}/Control.tsx +32 -14
  172. package/src/core/{components/form → form/components}/ControlArray.tsx +2 -5
  173. package/src/core/{components/form → form/components}/ControlDate.tsx +1 -4
  174. package/src/core/{components/form → form/components}/ControlNumber.tsx +1 -4
  175. package/src/core/{components/form → form/components}/ControlObject.tsx +1 -4
  176. package/src/core/{components/form → form/components}/ControlQueryBuilder.tsx +7 -7
  177. package/src/core/{components/form → form/components}/ControlSelect.tsx +2 -4
  178. package/src/core/{components/form → form/components}/TypeForm.browser.spec.tsx +22 -64
  179. package/src/core/{components/form → form/components}/TypeForm.tsx +1 -3
  180. package/src/core/form/factories/dialogForm.tsx +31 -0
  181. package/src/core/form/index.ts +23 -0
  182. package/src/core/{utils → form/utils}/parseInput.ts +2 -4
  183. package/src/core/index.ts +43 -51
  184. package/src/core/interfaces/AlephaIntent.ts +6 -0
  185. package/src/core/interfaces/AlephaTheme.ts +0 -1
  186. package/src/core/json/factories/dialogJson.tsx +24 -0
  187. package/src/core/json/index.ts +2 -0
  188. package/src/core/primitives/$ui.ts +17 -0
  189. package/src/core/services/DialogService.tsx +1 -48
  190. package/src/core/styles.css +1 -8
  191. package/src/core/{components/table → table/components}/ColumnPicker.tsx +2 -3
  192. package/src/core/{components/table → table/components}/DataTable.tsx +8 -9
  193. package/src/core/{components/table → table/components}/DataTableFilters.tsx +6 -3
  194. package/src/core/{components/table → table/components}/DataTableToolbar.tsx +4 -5
  195. package/src/core/{components/table → table/components}/FilterPicker.tsx +2 -3
  196. package/src/core/table/index.ts +12 -0
  197. package/src/core/{components/table → table/interfaces}/types.ts +2 -2
  198. package/src/demo/DemoRouter.ts +87 -6
  199. package/src/demo/components/DemoHome.tsx +6 -10
  200. package/src/demo/components/DemoLayout.tsx +38 -8
  201. package/src/demo/components/auth/DemoLogin.tsx +1 -1
  202. package/src/demo/components/auth/DemoRegister.tsx +1 -1
  203. package/src/demo/components/auth/DemoResetPassword.tsx +1 -1
  204. package/src/demo/components/auth/DemoVerifyEmail.tsx +1 -1
  205. package/src/demo/components/core/DemoButton.tsx +160 -0
  206. package/src/demo/components/core/DemoFlex.tsx +101 -0
  207. package/src/demo/components/core/DemoHeading.tsx +13 -0
  208. package/src/demo/components/core/DemoText.tsx +110 -0
  209. package/src/demo/components/json/DemoJsonViewer.tsx +1 -1
  210. package/src/demo/components/layout/DemoDialog.tsx +103 -0
  211. package/src/demo/components/{core → layout}/DemoSidebar.tsx +0 -1
  212. package/src/demo/components/layout/DemoToast.tsx +96 -0
  213. package/src/demo/components/shared/MacWindow.tsx +149 -74
  214. package/src/demo/components/shared/Showcase.tsx +4 -8
  215. package/src/demo/index.ts +1 -4
  216. package/src/demo/primitives/$uiDemo.ts +10 -0
  217. package/dist/admin/AdminApiKeys-CF_qOO3u.js.map +0 -1
  218. package/dist/admin/AdminAudits-BQno3hZG.js.map +0 -1
  219. package/dist/admin/AdminFiles-kvuUaASF.js.map +0 -1
  220. package/dist/admin/AdminJobDashboard-CrPxp0W1.js.map +0 -1
  221. package/dist/admin/AdminJobExecutions-D-b4Zt7W.js.map +0 -1
  222. package/dist/admin/AdminJobRegistry-CNX5cpDx.js.map +0 -1
  223. package/dist/admin/AdminLayout-e-ZP5nWw.js +0 -37
  224. package/dist/admin/AdminLayout-e-ZP5nWw.js.map +0 -1
  225. package/dist/admin/AdminNotifications-DeHJFf6W.js +0 -153
  226. package/dist/admin/AdminNotifications-DeHJFf6W.js.map +0 -1
  227. package/dist/admin/AdminParameters-iQE8o7a7.js.map +0 -1
  228. package/dist/admin/AdminSessions-oKJCbd7w.js.map +0 -1
  229. package/dist/admin/AdminUserAudits-BNCEle_E.js +0 -177
  230. package/dist/admin/AdminUserAudits-BNCEle_E.js.map +0 -1
  231. package/dist/admin/AdminUserCreate-CgqeFwCt.js +0 -104
  232. package/dist/admin/AdminUserCreate-CgqeFwCt.js.map +0 -1
  233. package/dist/admin/AdminUserDetails-DDe1A1GP.js +0 -477
  234. package/dist/admin/AdminUserDetails-DDe1A1GP.js.map +0 -1
  235. package/dist/admin/AdminUserLayout-HAlobhWf.js.map +0 -1
  236. package/dist/admin/AdminUserSessions-Bq1LnVLf.js +0 -129
  237. package/dist/admin/AdminUserSessions-Bq1LnVLf.js.map +0 -1
  238. package/dist/admin/AdminUserSettings-BRsBZoxV.js +0 -167
  239. package/dist/admin/AdminUserSettings-BRsBZoxV.js.map +0 -1
  240. package/dist/admin/AdminUsers-D71kIOSn.js +0 -118
  241. package/dist/admin/AdminUsers-D71kIOSn.js.map +0 -1
  242. package/dist/demo/DemoDataTable-lnBKWBf8.js.map +0 -1
  243. package/dist/demo/DemoHome-CUMZsYaH.js.map +0 -1
  244. package/dist/demo/DemoJsonViewer-_uokbGaW.js +0 -429
  245. package/dist/demo/DemoJsonViewer-_uokbGaW.js.map +0 -1
  246. package/dist/demo/DemoLayout-DHVoacE6.js +0 -46
  247. package/dist/demo/DemoLayout-DHVoacE6.js.map +0 -1
  248. package/dist/demo/DemoLogin-DjJ9314c.js.map +0 -1
  249. package/dist/demo/DemoRegister-DzkJ5M83.js.map +0 -1
  250. package/dist/demo/DemoResetPassword-DWh4_BpQ.js.map +0 -1
  251. package/dist/demo/DemoSidebar-C1csnGhX.js.map +0 -1
  252. package/dist/demo/DemoVerifyEmail-DbU_tCj8.js.map +0 -1
  253. package/dist/demo/Showcase-BzoXNlCn.js +0 -185
  254. package/dist/demo/Showcase-BzoXNlCn.js.map +0 -1
  255. package/dist/json/index.d.ts +0 -57
  256. package/dist/json/index.d.ts.map +0 -1
  257. package/dist/json/index.js +0 -325
  258. package/dist/json/index.js.map +0 -1
  259. package/src/admin/components/notifications/AdminNotifications.tsx +0 -204
  260. package/src/admin/components/users/AdminUserAudits.tsx +0 -184
  261. package/src/admin/components/users/AdminUserCreate.tsx +0 -85
  262. package/src/admin/components/users/AdminUserDetails.tsx +0 -431
  263. package/src/admin/components/users/AdminUserSettings.tsx +0 -171
  264. package/src/core/components/data/ErrorViewer.tsx +0 -171
  265. package/src/json/extensions/DialogService.tsx +0 -31
  266. package/src/json/index.ts +0 -18
  267. package/src/json/styles.css +0 -1
  268. /package/dist/{demo → auth}/IconGoogle-Ch1m3Uzl.js +0 -0
  269. /package/dist/{demo → auth}/IconGoogle-Ch1m3Uzl.js.map +0 -0
  270. /package/src/{json → core/json}/components/JsonViewer.css +0 -0
  271. /package/src/{json → core/json}/components/JsonViewer.tsx +0 -0
  272. /package/src/core/{components/table → table/components}/DataTablePagination.tsx +0 -0
  273. /package/src/core/{components/table → table/components}/useTableSelection.ts +0 -0
@@ -1,431 +0,0 @@
1
- import { ActionButton, ClipboardButton, Control } from "@alepha/ui";
2
- import {
3
- Badge,
4
- Card,
5
- Center,
6
- Divider,
7
- Flex,
8
- Grid,
9
- Loader,
10
- Paper,
11
- SimpleGrid,
12
- Text,
13
- ThemeIcon,
14
- } from "@mantine/core";
15
- import {
16
- IconActivity,
17
- IconCalendar,
18
- IconCheck,
19
- IconDevices,
20
- IconKey,
21
- IconShieldCheck,
22
- IconUser,
23
- IconX,
24
- } from "@tabler/icons-react";
25
- import { t } from "alepha";
26
- import type { AdminUserController, UserEntity } from "alepha/api/users";
27
- import { useClient } from "alepha/react";
28
- import { useForm } from "alepha/react/form";
29
- import { useI18n } from "alepha/react/i18n";
30
- import { useRouterState } from "alepha/react/router";
31
- import { type ReactNode, useEffect, useState } from "react";
32
-
33
- export interface AdminUserDetailsProps {
34
- userRealmName?: string;
35
- }
36
-
37
- interface DataRowProps {
38
- label: string;
39
- value: ReactNode;
40
- copyValue?: string;
41
- }
42
-
43
- const DataRow = ({ label, value, copyValue }: DataRowProps) => (
44
- <Flex
45
- justify="space-between"
46
- py={8}
47
- wrap="nowrap"
48
- style={{ borderBottom: "1px solid var(--mantine-color-default-border)" }}
49
- >
50
- <Text size="sm" c="dimmed" style={{ flexShrink: 0 }}>
51
- {label}
52
- </Text>
53
- <Flex gap={6} wrap="nowrap" style={{ minWidth: 0 }}>
54
- {typeof value === "string" ? (
55
- <Text size="sm" fw={500} truncate style={{ maxWidth: 220 }}>
56
- {value || "—"}
57
- </Text>
58
- ) : (
59
- value
60
- )}
61
- {copyValue && (
62
- <ClipboardButton
63
- value={copyValue}
64
- size="xs"
65
- variant="subtle"
66
- c="dimmed"
67
- />
68
- )}
69
- </Flex>
70
- </Flex>
71
- );
72
-
73
- interface StatCardProps {
74
- icon: ReactNode;
75
- label: string;
76
- value: string | number;
77
- color: string;
78
- }
79
-
80
- const StatCard = ({ icon, label, value, color }: StatCardProps) => (
81
- <Paper p="md" radius="md" withBorder>
82
- <Flex gap="sm">
83
- <ThemeIcon size="lg" radius="md" variant="light" color={color}>
84
- {icon}
85
- </ThemeIcon>
86
- <Flex>
87
- <Text size="xl" fw={700} lh={1}>
88
- {value}
89
- </Text>
90
- <Text size="xs" c="dimmed">
91
- {label}
92
- </Text>
93
- </Flex>
94
- </Flex>
95
- </Paper>
96
- );
97
-
98
- const AdminUserDetails = (props: AdminUserDetailsProps) => {
99
- const state = useRouterState();
100
- const client = useClient<AdminUserController>();
101
- const { l } = useI18n();
102
- const userId = state.params.userId as string;
103
-
104
- const [user, setUser] = useState<UserEntity | null>(null);
105
- const [loading, setLoading] = useState(true);
106
- const [editing, setEditing] = useState(false);
107
-
108
- useEffect(() => {
109
- const loadUser = async () => {
110
- try {
111
- const data = await client.getUser({
112
- params: { id: userId },
113
- query: { userRealmName: props.userRealmName },
114
- });
115
- setUser(data);
116
- } finally {
117
- setLoading(false);
118
- }
119
- };
120
-
121
- loadUser();
122
- }, [userId]);
123
-
124
- const form = useForm({
125
- schema: t.object({
126
- email: t.optional(t.email()),
127
- phoneNumber: t.optional(t.e164()),
128
- firstName: t.optional(t.string()),
129
- lastName: t.optional(t.string()),
130
- roles: t.optional(t.array(t.string())),
131
- enabled: t.optional(t.boolean()),
132
- }),
133
- handler: async (data) => {
134
- const updated = await client.updateUser({
135
- params: { id: userId },
136
- query: { userRealmName: props.userRealmName },
137
- body: data,
138
- });
139
- setUser(updated);
140
- setEditing(false);
141
- },
142
- });
143
-
144
- useEffect(() => {
145
- if (user) {
146
- form.input.email?.set(user.email ?? "");
147
- form.input.phoneNumber?.set(user.phoneNumber ?? "");
148
- form.input.firstName?.set(user.firstName ?? "");
149
- form.input.lastName?.set(user.lastName ?? "");
150
- form.input.roles?.set(user.roles ?? []);
151
- form.input.enabled?.set(user.enabled);
152
- }
153
- }, [user]);
154
-
155
- if (loading) {
156
- return (
157
- <Center flex={1} py="xl">
158
- <Loader />
159
- </Center>
160
- );
161
- }
162
-
163
- if (!user) {
164
- return (
165
- <Center flex={1} py="xl">
166
- <Flex direction="column" align="center" gap="xs">
167
- <IconUser size={48} opacity={0.3} />
168
- <Text c="dimmed">User not found</Text>
169
- </Flex>
170
- </Center>
171
- );
172
- }
173
-
174
- const displayName =
175
- user.firstName && user.lastName
176
- ? `${user.firstName} ${user.lastName}`
177
- : user.firstName || user.lastName || null;
178
-
179
- return (
180
- <Flex direction="column" gap="md">
181
- {/* Stats Overview */}
182
- <SimpleGrid cols={{ base: 2, sm: 4 }}>
183
- <StatCard
184
- icon={<IconDevices size={18} />}
185
- label="Sessions"
186
- value={0}
187
- color="blue"
188
- />
189
- <StatCard
190
- icon={<IconActivity size={18} />}
191
- label="API Calls"
192
- value={0}
193
- color="green"
194
- />
195
- <StatCard
196
- icon={<IconKey size={18} />}
197
- label="Failed Logins"
198
- value={0}
199
- color="orange"
200
- />
201
- <StatCard
202
- icon={<IconShieldCheck size={18} />}
203
- label="Roles"
204
- value={user.roles.length}
205
- color="violet"
206
- />
207
- </SimpleGrid>
208
-
209
- <Grid>
210
- {/* Left Column - Account Details */}
211
- <Grid.Col span={{ base: 12, md: 6 }}>
212
- <Card padding={0} radius="md" withBorder h="100%">
213
- <Flex justify="space-between" p="md" pb={0}>
214
- <Text fw={600} size="sm">
215
- Account Details
216
- </Text>
217
- </Flex>
218
- <Flex px="md" pb="md">
219
- <DataRow label="User ID" value={user.id} copyValue={user.id} />
220
- <DataRow
221
- label="Username"
222
- value={user.username || "—"}
223
- copyValue={user.username}
224
- />
225
- <DataRow
226
- label="Email"
227
- value={
228
- <Flex gap={6}>
229
- <Text size="sm" fw={500}>
230
- {user.email || "—"}
231
- </Text>
232
- {user.email && (
233
- <Badge
234
- size="xs"
235
- variant="light"
236
- color={user.emailVerified ? "green" : "orange"}
237
- >
238
- {user.emailVerified ? "verified" : "unverified"}
239
- </Badge>
240
- )}
241
- </Flex>
242
- }
243
- copyValue={user.email}
244
- />
245
- <DataRow
246
- label="Phone"
247
- value={user.phoneNumber || "—"}
248
- copyValue={user.phoneNumber}
249
- />
250
- <DataRow label="Realm" value={user.realm} />
251
- <DataRow
252
- label="Status"
253
- value={
254
- <Flex gap={4}>
255
- <ThemeIcon
256
- size={16}
257
- radius="xl"
258
- color={user.enabled ? "green" : "red"}
259
- variant="filled"
260
- >
261
- {user.enabled ? (
262
- <IconCheck size={10} />
263
- ) : (
264
- <IconX size={10} />
265
- )}
266
- </ThemeIcon>
267
- <Text size="sm" fw={500}>
268
- {user.enabled ? "Active" : "Disabled"}
269
- </Text>
270
- </Flex>
271
- }
272
- />
273
- </Flex>
274
- </Card>
275
- </Grid.Col>
276
-
277
- {/* Right Column - Personal Info */}
278
- <Grid.Col span={{ base: 12, md: 6 }}>
279
- <Card padding={0} radius="md" withBorder h="100%">
280
- <Flex justify="space-between" p="md" pb={0}>
281
- <Text fw={600} size="sm">
282
- Personal Information
283
- </Text>
284
- {!editing && (
285
- <ActionButton
286
- variant="subtle"
287
- size="xs"
288
- onClick={() => setEditing(true)}
289
- >
290
- Edit
291
- </ActionButton>
292
- )}
293
- </Flex>
294
-
295
- {editing ? (
296
- <Flex p="md">
297
- <form {...form.props}>
298
- <Flex direction="column" gap="sm">
299
- <SimpleGrid cols={2}>
300
- <Control
301
- title="First Name"
302
- input={form.input.firstName}
303
- />
304
- <Control title="Last Name" input={form.input.lastName} />
305
- </SimpleGrid>
306
- <SimpleGrid cols={2}>
307
- <Control title="Email" input={form.input.email} />
308
- <Control title="Phone" input={form.input.phoneNumber} />
309
- </SimpleGrid>
310
- <Control title="Roles" input={form.input.roles} />
311
- <Divider />
312
- <Flex justify="flex-end" gap="xs">
313
- <ActionButton
314
- variant="subtle"
315
- size="xs"
316
- onClick={() => setEditing(false)}
317
- >
318
- Cancel
319
- </ActionButton>
320
- <ActionButton size="xs" form={form}>
321
- Save
322
- </ActionButton>
323
- </Flex>
324
- </Flex>
325
- </form>
326
- </Flex>
327
- ) : (
328
- <Flex px="md" pb="md">
329
- <DataRow label="First Name" value={user.firstName || "—"} />
330
- <DataRow label="Last Name" value={user.lastName || "—"} />
331
- <DataRow label="Display Name" value={displayName || "—"} />
332
- <DataRow
333
- label="Roles"
334
- value={
335
- user.roles.length > 0 ? (
336
- <Flex gap={4}>
337
- {user.roles.map((role) => (
338
- <Badge key={role} size="xs" variant="light">
339
- {role}
340
- </Badge>
341
- ))}
342
- </Flex>
343
- ) : (
344
- <Text size="sm" c="dimmed">
345
- No roles
346
- </Text>
347
- )
348
- }
349
- />
350
- </Flex>
351
- )}
352
- </Card>
353
- </Grid.Col>
354
- </Grid>
355
-
356
- {/* Timeline */}
357
- <Card padding={0} radius="md" withBorder>
358
- <Flex justify="space-between" p="md" pb={0}>
359
- <Text fw={600} size="sm">
360
- Activity Timeline
361
- </Text>
362
- </Flex>
363
- <SimpleGrid cols={{ base: 2, sm: 4 }} p="md">
364
- <Flex>
365
- <Flex gap={6} mb={4}>
366
- <IconCalendar size={14} style={{ opacity: 0.5 }} />
367
- <Text size="xs" c="dimmed">
368
- Created
369
- </Text>
370
- </Flex>
371
- <Text size="sm" fw={500}>
372
- {l(user.createdAt, { date: "ll" })}
373
- </Text>
374
- <Text size="xs" c="dimmed">
375
- {l(user.createdAt, { date: "fromNow" })}
376
- </Text>
377
- </Flex>
378
- <Flex>
379
- <Flex gap={6} mb={4}>
380
- <IconCalendar size={14} style={{ opacity: 0.5 }} />
381
- <Text size="xs" c="dimmed">
382
- Updated
383
- </Text>
384
- </Flex>
385
- <Text size="sm" fw={500}>
386
- {l(user.updatedAt, { date: "ll" })}
387
- </Text>
388
- <Text size="xs" c="dimmed">
389
- {l(user.updatedAt, { date: "fromNow" })}
390
- </Text>
391
- </Flex>
392
- <Flex>
393
- <Flex gap={6} mb={4}>
394
- <IconDevices size={14} style={{ opacity: 0.5 }} />
395
- <Text size="xs" c="dimmed">
396
- Last Login
397
- </Text>
398
- </Flex>
399
- <Text size="sm" c="dimmed">
400
-
401
- </Text>
402
- </Flex>
403
- <Flex>
404
- <Flex gap={6} mb={4}>
405
- <IconCheck size={14} style={{ opacity: 0.5 }} />
406
- <Text size="xs" c="dimmed">
407
- Email Verified
408
- </Text>
409
- </Flex>
410
- {user.emailVerified ? (
411
- <>
412
- <Text size="sm" fw={500}>
413
- {l(user.updatedAt, { date: "ll" })}
414
- </Text>
415
- <Text size="xs" c="dimmed">
416
- {l(user.updatedAt, { date: "fromNow" })}
417
- </Text>
418
- </>
419
- ) : (
420
- <Text size="sm" c="dimmed">
421
- Not verified
422
- </Text>
423
- )}
424
- </Flex>
425
- </SimpleGrid>
426
- </Card>
427
- </Flex>
428
- );
429
- };
430
-
431
- export default AdminUserDetails;
@@ -1,171 +0,0 @@
1
- import { ActionButton, Flex, Text } from "@alepha/ui";
2
- import { Alert, Card, Loader } from "@mantine/core";
3
- import {
4
- IconAlertCircle,
5
- IconCheck,
6
- IconMail,
7
- IconTrash,
8
- } from "@tabler/icons-react";
9
- import type {
10
- AdminUserController,
11
- UserController,
12
- UserEntity,
13
- } from "alepha/api/users";
14
- import { useClient } from "alepha/react";
15
- import { useRouter, useRouterState } from "alepha/react/router";
16
- import { useEffect, useState } from "react";
17
- import type { AdminRouter } from "../../AdminRouter.ts";
18
-
19
- export interface AdminUserSettingsProps {
20
- userRealmName?: string;
21
- }
22
-
23
- const AdminUserSettings = (props: AdminUserSettingsProps) => {
24
- const router = useRouter<AdminRouter>();
25
- const state = useRouterState();
26
- const adminClient = useClient<AdminUserController>();
27
- const userClient = useClient<UserController>();
28
- const userId = state.params.userId as string;
29
-
30
- const [user, setUser] = useState<UserEntity | null>(null);
31
- const [loading, setLoading] = useState(true);
32
- const [deleteLoading, setDeleteLoading] = useState(false);
33
- const [verifyLoading, setVerifyLoading] = useState(false);
34
- const [verifySuccess, setVerifySuccess] = useState(false);
35
-
36
- useEffect(() => {
37
- const loadUser = async () => {
38
- try {
39
- const data = await adminClient.getUser({
40
- params: { id: userId },
41
- query: { userRealmName: props.userRealmName },
42
- });
43
- setUser(data);
44
- } finally {
45
- setLoading(false);
46
- }
47
- };
48
-
49
- loadUser();
50
- }, [userId]);
51
-
52
- const handleDelete = async () => {
53
- if (!confirm("Are you sure you want to delete this user?")) {
54
- return;
55
- }
56
-
57
- setDeleteLoading(true);
58
- try {
59
- await adminClient.deleteUser({
60
- params: { id: userId },
61
- query: { userRealmName: props.userRealmName },
62
- });
63
- await router.push("adminUsers");
64
- } finally {
65
- setDeleteLoading(false);
66
- }
67
- };
68
-
69
- const handleTriggerEmailVerification = async () => {
70
- if (!user?.email) return;
71
-
72
- setVerifyLoading(true);
73
- setVerifySuccess(false);
74
- try {
75
- await userClient.requestEmailVerification({
76
- query: {
77
- userRealmName: props.userRealmName,
78
- method: "link",
79
- verifyUrl: `${window.location.origin}/auth/verify-email`,
80
- },
81
- body: { email: user.email },
82
- });
83
- setVerifySuccess(true);
84
- } finally {
85
- setVerifyLoading(false);
86
- }
87
- };
88
-
89
- if (loading) {
90
- return (
91
- <Flex flex={1} justify="center" align="center">
92
- <Loader />
93
- </Flex>
94
- );
95
- }
96
-
97
- if (!user) {
98
- return (
99
- <Flex flex={1} justify="center" align="center">
100
- <Text c="dimmed">User not found</Text>
101
- </Flex>
102
- );
103
- }
104
-
105
- return (
106
- <Flex flex={1} direction="column" gap="md">
107
- {user.email && !user.emailVerified && (
108
- <Card withBorder p="lg">
109
- <Flex direction="column" gap="md">
110
- <Text size="lg" fw={500}>
111
- Email Verification
112
- </Text>
113
-
114
- <Alert variant="light" color="yellow" icon={<IconMail />}>
115
- <Text size="sm">
116
- This user's email ({user.email}) is not verified. You can send a
117
- verification link to the user.
118
- </Text>
119
- </Alert>
120
-
121
- {verifySuccess && (
122
- <Alert variant="light" color="green" icon={<IconCheck />}>
123
- <Text size="sm">
124
- Verification link sent successfully to {user.email}.
125
- </Text>
126
- </Alert>
127
- )}
128
-
129
- <Flex>
130
- <ActionButton
131
- leftSection={<IconMail size={16} />}
132
- loading={verifyLoading}
133
- onClick={handleTriggerEmailVerification}
134
- >
135
- Send Verification Link
136
- </ActionButton>
137
- </Flex>
138
- </Flex>
139
- </Card>
140
- )}
141
-
142
- <Card withBorder p="lg">
143
- <Flex direction="column" gap="md">
144
- <Text size="lg" fw={500} c="red">
145
- Danger Zone
146
- </Text>
147
-
148
- <Alert variant="light" color="red" icon={<IconAlertCircle />}>
149
- <Text size="sm">
150
- Deleting this user will permanently remove their account and all
151
- associated data. This action cannot be undone.
152
- </Text>
153
- </Alert>
154
-
155
- <Flex>
156
- <ActionButton
157
- color="red"
158
- leftSection={<IconTrash size={16} />}
159
- loading={deleteLoading}
160
- onClick={handleDelete}
161
- >
162
- Delete User
163
- </ActionButton>
164
- </Flex>
165
- </Flex>
166
- </Card>
167
- </Flex>
168
- );
169
- };
170
-
171
- export default AdminUserSettings;