@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,13 +1,15 @@
1
- import { ActionButton, DataTable, Text, useDialog, useToast } from "@alepha/ui";
2
- import { Badge, Code, Flex, Paper, Table } from "@mantine/core";
1
+ import type { DetailListItem } from "@alepha/ui";
3
2
  import {
4
- IconAlertTriangle,
5
- IconCircleCheck,
6
- IconCircleX,
7
- IconClock,
8
- IconPlayerPlay,
9
- IconRefresh,
10
- } from "@tabler/icons-react";
3
+ ActionButton,
4
+ DataTable,
5
+ DetailList,
6
+ Flex,
7
+ Text,
8
+ useDialog,
9
+ useToast,
10
+ } from "@alepha/ui";
11
+ import { Badge, Code, Paper, Table } from "@mantine/core";
12
+ import { IconCircleX, IconRefresh } from "@tabler/icons-react";
11
13
  import { type Page, t } from "alepha";
12
14
  import type {
13
15
  AdminJobController,
@@ -43,61 +45,6 @@ const formatDuration = (
43
45
  return `${Math.floor(duration / 3600000)}h ${Math.floor((duration % 3600000) / 60000)}m`;
44
46
  };
45
47
 
46
- const getStatusColor = (status: string) => {
47
- switch (status) {
48
- case "completed":
49
- return "teal";
50
- case "running":
51
- return "blue";
52
- case "failed":
53
- case "dead":
54
- return "red";
55
- case "cancelled":
56
- return "orange";
57
- case "scheduled":
58
- return "violet";
59
- case "retrying":
60
- return "yellow";
61
- case "pending":
62
- return "gray";
63
- default:
64
- return "gray";
65
- }
66
- };
67
-
68
- const getStatusIcon = (status: string, size = 14) => {
69
- switch (status) {
70
- case "completed":
71
- return <IconCircleCheck size={size} />;
72
- case "failed":
73
- case "dead":
74
- return <IconCircleX size={size} />;
75
- case "running":
76
- return <IconPlayerPlay size={size} />;
77
- case "cancelled":
78
- return <IconAlertTriangle size={size} />;
79
- default:
80
- return <IconClock size={size} />;
81
- }
82
- };
83
-
84
- const getLogLevelColor = (level: string) => {
85
- switch (level) {
86
- case "ERROR":
87
- return "red";
88
- case "WARN":
89
- return "orange";
90
- case "INFO":
91
- return "blue";
92
- case "DEBUG":
93
- return "gray";
94
- case "TRACE":
95
- return "dimmed";
96
- default:
97
- return "gray";
98
- }
99
- };
100
-
101
48
  // ─────────────────────────────────────────────────────────────────────────────
102
49
 
103
50
  const executionFilters = t.object({
@@ -129,7 +76,7 @@ const AdminJobExecutions = () => {
129
76
  const handleRetry = useCallback(
130
77
  async (id: string) => {
131
78
  try {
132
- await client.retryExecution({ params: { id } });
79
+ await client.retryJobExecution({ params: { id } });
133
80
  toast.success("Execution retried");
134
81
  setRefreshKey((k) => k + 1);
135
82
  } catch {
@@ -151,7 +98,7 @@ const AdminJobExecutions = () => {
151
98
  if (!confirmed) return;
152
99
 
153
100
  try {
154
- await client.cancelExecution({ params: { id } });
101
+ await client.cancelJobExecution({ params: { id } });
155
102
  toast.success("Execution cancelled");
156
103
  setRefreshKey((k) => k + 1);
157
104
  } catch {
@@ -184,7 +131,7 @@ const AdminJobExecutions = () => {
184
131
  filters={executionFilters}
185
132
  defaultFilters={["job", "status"]}
186
133
  items={async (filters) => {
187
- const response = await client.findExecutions({
134
+ const response = await client.findJobExecutions({
188
135
  query: {
189
136
  ...filters,
190
137
  },
@@ -196,12 +143,7 @@ const AdminJobExecutions = () => {
196
143
  label: "Status",
197
144
  fit: true,
198
145
  value: (item) => (
199
- <Badge
200
- size="sm"
201
- variant="light"
202
- color={getStatusColor(item.status)}
203
- leftSection={getStatusIcon(item.status, 12)}
204
- >
146
+ <Badge size="sm" variant="default">
205
147
  {item.status}
206
148
  </Badge>
207
149
  ),
@@ -238,7 +180,7 @@ const AdminJobExecutions = () => {
238
180
  defaultHidden: true,
239
181
  value: (item) => (
240
182
  <Text size="xs" c="dimmed">
241
- {item.triggeredByName ?? ""}
183
+ {item.triggeredByName ?? "\u2014"}
242
184
  </Text>
243
185
  ),
244
186
  },
@@ -257,7 +199,9 @@ const AdminJobExecutions = () => {
257
199
  fit: true,
258
200
  value: (item) => (
259
201
  <Text size="xs" c="dimmed">
260
- {item.startedAt ? l(item.startedAt, { date: "fromNow" }) : "—"}
202
+ {item.startedAt
203
+ ? l(item.startedAt, { date: "fromNow" })
204
+ : "\u2014"}
261
205
  </Text>
262
206
  ),
263
207
  },
@@ -269,7 +213,7 @@ const AdminJobExecutions = () => {
269
213
  {item.startedAt &&
270
214
  (item.completedAt || item.status === "running")
271
215
  ? formatDuration(item.startedAt, item.completedAt)
272
- : ""}
216
+ : "\u2014"}
273
217
  </Text>
274
218
  ),
275
219
  },
@@ -277,8 +221,8 @@ const AdminJobExecutions = () => {
277
221
  label: "Error",
278
222
  defaultHidden: true,
279
223
  value: (item) => (
280
- <Text size="xs" c="red" lineClamp={1}>
281
- {item.error ?? ""}
224
+ <Text size="xs" c="dimmed" lineClamp={1}>
225
+ {item.error ?? "\u2014"}
282
226
  </Text>
283
227
  ),
284
228
  },
@@ -288,7 +232,7 @@ const AdminJobExecutions = () => {
288
232
  defaultHidden: true,
289
233
  value: (item) => (
290
234
  <Text size="xs" c="dimmed" ff="monospace">
291
- {item.key ?? ""}
235
+ {item.key ?? "\u2014"}
292
236
  </Text>
293
237
  ),
294
238
  },
@@ -298,7 +242,7 @@ const AdminJobExecutions = () => {
298
242
  defaultHidden: true,
299
243
  value: (item) => (
300
244
  <Text size="xs" c="dimmed" ff="monospace">
301
- {item.workerId ?? ""}
245
+ {item.workerId ?? "\u2014"}
302
246
  </Text>
303
247
  ),
304
248
  },
@@ -308,14 +252,12 @@ const AdminJobExecutions = () => {
308
252
  actions: (item) => [
309
253
  {
310
254
  tooltip: "Retry",
311
- color: "blue",
312
255
  icon: IconRefresh,
313
256
  onClick: () => handleRetry(item.id),
314
257
  visible: item.can?.retry,
315
258
  },
316
259
  {
317
260
  tooltip: "Cancel",
318
- color: "red",
319
261
  icon: IconCircleX,
320
262
  onClick: () => handleCancel(item.id),
321
263
  visible: item.can?.cancel,
@@ -332,10 +274,9 @@ const AdminJobExecutions = () => {
332
274
  <Text size="xs" c="dimmed" tt="uppercase" fw={600}>
333
275
  Error
334
276
  </Text>
335
- <Paper p="xs" bg="var(--mantine-color-red-light)" radius="sm">
277
+ <Paper p="xs" radius="sm" withBorder>
336
278
  <Text
337
279
  size="xs"
338
- c="red"
339
280
  style={{
340
281
  whiteSpace: "pre-wrap",
341
282
  wordBreak: "break-word",
@@ -423,7 +364,7 @@ const ExecutionDetailContent = ({
423
364
  setExpandedLogs(new Set());
424
365
  setLoading(true);
425
366
  try {
426
- const data = await client.getExecution({ params: { id: execId } });
367
+ const data = await client.getJobExecution({ params: { id: execId } });
427
368
  setDetail(data);
428
369
  } catch {
429
370
  toast.danger("Failed to load execution details");
@@ -470,6 +411,91 @@ const ExecutionDetailContent = ({
470
411
 
471
412
  if (!detail) return null;
472
413
 
414
+ const detailItems: DetailListItem[] = [
415
+ {
416
+ label: "ID",
417
+ value: (
418
+ <Text size="sm" ff="monospace">
419
+ {detail.id}
420
+ </Text>
421
+ ),
422
+ copyable: detail.id,
423
+ },
424
+ {
425
+ label: "Status",
426
+ value: (
427
+ <Text size="sm" tt="capitalize">
428
+ {detail.status}
429
+ </Text>
430
+ ),
431
+ },
432
+ {
433
+ label: "Priority",
434
+ value: PRIORITY_LABELS[detail.priority] ?? "Normal",
435
+ },
436
+ {
437
+ label: "Attempt",
438
+ value: (
439
+ <Text size="sm" ff="monospace">
440
+ {detail.attempt}/{detail.maxAttempts}
441
+ </Text>
442
+ ),
443
+ },
444
+ {
445
+ label: "Worker",
446
+ value: (
447
+ <Text size="sm" ff="monospace">
448
+ {detail.workerId}
449
+ </Text>
450
+ ),
451
+ hidden: !detail.workerId,
452
+ },
453
+ {
454
+ label: "Key",
455
+ value: (
456
+ <Text size="sm" ff="monospace">
457
+ {detail.key}
458
+ </Text>
459
+ ),
460
+ hidden: !detail.key,
461
+ },
462
+ {
463
+ label: "Created",
464
+ value: String(l(detail.createdAt, { date: "lll" })),
465
+ },
466
+ {
467
+ label: "Started",
468
+ value: detail.startedAt
469
+ ? String(l(detail.startedAt, { date: "lll" }))
470
+ : undefined,
471
+ hidden: !detail.startedAt,
472
+ },
473
+ {
474
+ label: "Duration",
475
+ value:
476
+ detail.startedAt &&
477
+ (detail.completedAt || detail.status === "running") ? (
478
+ <Text size="sm" ff="monospace">
479
+ {formatDuration(detail.startedAt, detail.completedAt)}
480
+ </Text>
481
+ ) : undefined,
482
+ hidden: !(
483
+ detail.startedAt &&
484
+ (detail.completedAt || detail.status === "running")
485
+ ),
486
+ },
487
+ {
488
+ label: "Triggered By",
489
+ value: detail.triggeredByName,
490
+ hidden: !detail.triggeredByName,
491
+ },
492
+ {
493
+ label: "Cancelled By",
494
+ value: detail.cancelledByName,
495
+ hidden: !detail.cancelledByName,
496
+ },
497
+ ];
498
+
473
499
  return (
474
500
  <Flex direction="column" gap="md">
475
501
  {/* Header */}
@@ -477,14 +503,9 @@ const ExecutionDetailContent = ({
477
503
  <Text fw={600} ff="monospace">
478
504
  {detail.jobName}
479
505
  </Text>
480
- <Badge
481
- size="sm"
482
- variant="light"
483
- color={getStatusColor(detail.status)}
484
- leftSection={getStatusIcon(detail.status, 12)}
485
- >
506
+ <Text size="sm" tt="capitalize" c="dimmed">
486
507
  {detail.status}
487
- </Badge>
508
+ </Text>
488
509
  <Text size="xs" c="dimmed">
489
510
  {detail.attempt}/{detail.maxAttempts}
490
511
  </Text>
@@ -504,7 +525,6 @@ const ExecutionDetailContent = ({
504
525
  tooltip="Retry"
505
526
  variant="light"
506
527
  size="xs"
507
- color="blue"
508
528
  icon={IconRefresh}
509
529
  onClick={handleRetry}
510
530
  />
@@ -514,7 +534,6 @@ const ExecutionDetailContent = ({
514
534
  tooltip="Cancel"
515
535
  variant="light"
516
536
  size="xs"
517
- color="red"
518
537
  icon={IconCircleX}
519
538
  onClick={handleCancel}
520
539
  />
@@ -526,49 +545,7 @@ const ExecutionDetailContent = ({
526
545
  <Text size="sm" fw={600} mb="xs">
527
546
  Details
528
547
  </Text>
529
- <Flex gap="lg" wrap="wrap">
530
- <DetailField label="ID" value={detail.id} monospace copyable />
531
- <DetailField label="Status" value={detail.status} capitalize />
532
- <DetailField
533
- label="Priority"
534
- value={PRIORITY_LABELS[detail.priority] ?? "Normal"}
535
- />
536
- <DetailField
537
- label="Attempt"
538
- value={`${detail.attempt}/${detail.maxAttempts}`}
539
- monospace
540
- />
541
- {detail.workerId && (
542
- <DetailField label="Worker" value={detail.workerId} monospace />
543
- )}
544
- {detail.key && (
545
- <DetailField label="Key" value={detail.key} monospace />
546
- )}
547
- <DetailField
548
- label="Created"
549
- value={String(l(detail.createdAt, { date: "lll" }))}
550
- />
551
- {detail.startedAt && (
552
- <DetailField
553
- label="Started"
554
- value={String(l(detail.startedAt, { date: "lll" }))}
555
- />
556
- )}
557
- {detail.startedAt &&
558
- (detail.completedAt || detail.status === "running") && (
559
- <DetailField
560
- label="Duration"
561
- value={formatDuration(detail.startedAt, detail.completedAt)}
562
- monospace
563
- />
564
- )}
565
- {detail.triggeredByName && (
566
- <DetailField label="Triggered By" value={detail.triggeredByName} />
567
- )}
568
- {detail.cancelledByName && (
569
- <DetailField label="Cancelled By" value={detail.cancelledByName} />
570
- )}
571
- </Flex>
548
+ <DetailList items={detailItems} columns={2} />
572
549
  </Paper>
573
550
 
574
551
  {/* Payload */}
@@ -584,13 +561,12 @@ const ExecutionDetailContent = ({
584
561
  {/* Error */}
585
562
  {detail.error && (
586
563
  <Paper p="sm" radius="md" withBorder>
587
- <Text size="sm" fw={600} mb="xs" c="red">
564
+ <Text size="sm" fw={600} mb="xs">
588
565
  Error
589
566
  </Text>
590
- <Paper p="xs" bg="var(--mantine-color-red-light)" radius="sm">
567
+ <Paper p="xs" radius="sm" withBorder>
591
568
  <Text
592
569
  size="sm"
593
- c="red"
594
570
  style={{
595
571
  whiteSpace: "pre-wrap",
596
572
  wordBreak: "break-word",
@@ -628,11 +604,7 @@ const ExecutionDetailContent = ({
628
604
  onClick={log.data ? () => toggleLogExpand(i) : undefined}
629
605
  >
630
606
  <Table.Td>
631
- <Badge
632
- size="xs"
633
- variant="light"
634
- color={getLogLevelColor(log.level)}
635
- >
607
+ <Badge size="xs" variant="default">
636
608
  {log.level}
637
609
  </Badge>
638
610
  </Table.Td>
@@ -660,34 +632,4 @@ const ExecutionDetailContent = ({
660
632
  );
661
633
  };
662
634
 
663
- // ─────────────────────────────────────────────────────────────────────────────
664
-
665
- const DetailField = ({
666
- label,
667
- value,
668
- monospace,
669
- capitalize,
670
- copyable,
671
- }: {
672
- label: string;
673
- value: string;
674
- monospace?: boolean;
675
- capitalize?: boolean;
676
- copyable?: boolean;
677
- }) => (
678
- <Flex direction="column" gap={2}>
679
- <Text size="xs" c="dimmed" tt="uppercase" fw={600}>
680
- {label}
681
- </Text>
682
- <Text
683
- size="sm"
684
- ff={monospace ? "monospace" : undefined}
685
- tt={capitalize ? "capitalize" : undefined}
686
- style={copyable ? { cursor: "pointer", userSelect: "all" } : undefined}
687
- >
688
- {value}
689
- </Text>
690
- </Flex>
691
- );
692
-
693
635
  export default AdminJobExecutions;
@@ -1,4 +1,12 @@
1
- import { DataTable, Flex, Text, useDialog, useToast } from "@alepha/ui";
1
+ import type { DetailListItem } from "@alepha/ui";
2
+ import {
3
+ DataTable,
4
+ DetailList,
5
+ Flex,
6
+ Text,
7
+ useDialog,
8
+ useToast,
9
+ } from "@alepha/ui";
2
10
  import { Badge } from "@mantine/core";
3
11
  import {
4
12
  IconCircleCheck,
@@ -19,19 +27,6 @@ import { useCallback, useEffect, useState } from "react";
19
27
 
20
28
  // ─────────────────────────────────────────────────────────────────────────────
21
29
 
22
- const getTypeColor = (type: string) => {
23
- switch (type) {
24
- case "cron":
25
- return "violet";
26
- case "push":
27
- return "blue";
28
- case "both":
29
- return "teal";
30
- default:
31
- return "gray";
32
- }
33
- };
34
-
35
30
  const registryFilters = t.object({
36
31
  type: t.optional(t.enum(["cron", "push", "both"])),
37
32
  });
@@ -58,8 +53,8 @@ const AdminJobRegistry = () => {
58
53
  try {
59
54
  const [cronData, queueData, failureData] = await Promise.all([
60
55
  client.getCronJobs(),
61
- client.getQueueDepth(),
62
- client.getTopFailures(),
56
+ client.getJobQueueDepth(),
57
+ client.getJobTopFailures(),
63
58
  ]);
64
59
  setCronMap(new Map(cronData.map((c) => [c.name, c])));
65
60
  setQueueMap(new Map(queueData.map((q) => [q.jobName, q])));
@@ -109,7 +104,7 @@ const AdminJobRegistry = () => {
109
104
  onFilterChange={(_key, _value, form) => form.submit()}
110
105
  filters={registryFilters}
111
106
  items={async (filters) => {
112
- const items = await client.getRegistry();
107
+ const items = await client.getJobRegistry();
113
108
  const filtered = filters.type
114
109
  ? items.filter((i) => i.type === filters.type)
115
110
  : items;
@@ -128,7 +123,7 @@ const AdminJobRegistry = () => {
128
123
  label: "Type",
129
124
  fit: true,
130
125
  value: (item) => (
131
- <Badge size="sm" variant="light" color={getTypeColor(item.type)}>
126
+ <Badge size="sm" variant="default">
132
127
  {item.type}
133
128
  </Badge>
134
129
  ),
@@ -169,22 +164,22 @@ const AdminJobRegistry = () => {
169
164
  return (
170
165
  <Flex gap={4}>
171
166
  {q.running > 0 && (
172
- <Badge size="xs" variant="light" color="blue">
167
+ <Badge size="xs" variant="default">
173
168
  {q.running} run
174
169
  </Badge>
175
170
  )}
176
171
  {q.pending > 0 && (
177
- <Badge size="xs" variant="light" color="gray">
172
+ <Badge size="xs" variant="default">
178
173
  {q.pending} pen
179
174
  </Badge>
180
175
  )}
181
176
  {q.retrying > 0 && (
182
- <Badge size="xs" variant="light" color="yellow">
177
+ <Badge size="xs" variant="default">
183
178
  {q.retrying} retry
184
179
  </Badge>
185
180
  )}
186
181
  {q.dead > 0 && (
187
- <Badge size="xs" variant="light" color="red">
182
+ <Badge size="xs" variant="default">
188
183
  {q.dead} dead
189
184
  </Badge>
190
185
  )}
@@ -209,33 +204,44 @@ const AdminJobRegistry = () => {
209
204
  const cron = cronMap.get(item.name);
210
205
  const failure = failureMap.get(item.name);
211
206
 
207
+ const detailItems: DetailListItem[] = [
208
+ {
209
+ label: "Cron",
210
+ value: item.cron ? (
211
+ <Text size="sm" ff="monospace">
212
+ {item.cron}
213
+ </Text>
214
+ ) : undefined,
215
+ hidden: !item.cron,
216
+ },
217
+ {
218
+ label: "Timeout",
219
+ value: item.timeout,
220
+ hidden: !item.timeout,
221
+ },
222
+ {
223
+ label: "Retry",
224
+ value: item.retry
225
+ ? `${item.retry.retries}x${item.retry.hasBackoff ? " (backoff)" : ""}`
226
+ : undefined,
227
+ hidden: !item.retry,
228
+ },
229
+ {
230
+ label: "Batch",
231
+ value: item.batch
232
+ ? `${item.batch.size} / ${item.batch.window}`
233
+ : undefined,
234
+ hidden: !item.batch,
235
+ },
236
+ {
237
+ label: "Schema",
238
+ value: item.hasSchema ? "Yes" : "No",
239
+ },
240
+ ];
241
+
212
242
  return (
213
243
  <Flex direction="column" gap="sm" p="sm">
214
- {/* Config */}
215
- <Flex gap="lg" wrap="wrap">
216
- {item.cron && (
217
- <PanelField label="Cron" value={item.cron} monospace />
218
- )}
219
- {item.timeout && (
220
- <PanelField label="Timeout" value={item.timeout} />
221
- )}
222
- {item.retry && (
223
- <PanelField
224
- label="Retry"
225
- value={`${item.retry.retries}x${item.retry.hasBackoff ? " (backoff)" : ""}`}
226
- />
227
- )}
228
- {item.batch && (
229
- <PanelField
230
- label="Batch"
231
- value={`${item.batch.size} / ${item.batch.window}`}
232
- />
233
- )}
234
- <PanelField
235
- label="Schema"
236
- value={item.hasSchema ? "Yes" : "No"}
237
- />
238
- </Flex>
244
+ <DetailList items={detailItems} columns={3} />
239
245
 
240
246
  {/* Last cron execution */}
241
247
  {cron?.lastExecution && (
@@ -247,12 +253,12 @@ const AdminJobRegistry = () => {
247
253
  {cron.lastExecution.status === "completed" ? (
248
254
  <IconCircleCheck
249
255
  size={14}
250
- color="var(--mantine-color-teal-6)"
256
+ color="var(--mantine-color-dimmed)"
251
257
  />
252
258
  ) : (
253
259
  <IconCircleX
254
260
  size={14}
255
- color="var(--mantine-color-red-6)"
261
+ color="var(--mantine-color-dimmed)"
256
262
  />
257
263
  )}
258
264
  <Text size="xs" tt="capitalize">
@@ -265,7 +271,7 @@ const AdminJobRegistry = () => {
265
271
  </Text>
266
272
  )}
267
273
  {cron.lastExecution.error && (
268
- <Text size="xs" c="red" lineClamp={1}>
274
+ <Text size="xs" c="dimmed" lineClamp={1}>
269
275
  {cron.lastExecution.error}
270
276
  </Text>
271
277
  )}
@@ -278,9 +284,9 @@ const AdminJobRegistry = () => {
278
284
  <Text size="xs" c="dimmed" tt="uppercase" fw={600}>
279
285
  Failures (7d)
280
286
  </Text>
281
- <Badge size="xs" variant="light" color="red">
287
+ <Text size="xs" fw={500}>
282
288
  {failure.failures}
283
- </Badge>
289
+ </Text>
284
290
  {failure.lastError && (
285
291
  <Text
286
292
  size="xs"
@@ -301,25 +307,4 @@ const AdminJobRegistry = () => {
301
307
  );
302
308
  };
303
309
 
304
- // ─────────────────────────────────────────────────────────────────────────────
305
-
306
- const PanelField = ({
307
- label,
308
- value,
309
- monospace,
310
- }: {
311
- label: string;
312
- value: string;
313
- monospace?: boolean;
314
- }) => (
315
- <Flex direction="column" gap={2}>
316
- <Text size="xs" c="dimmed" tt="uppercase" fw={600}>
317
- {label}
318
- </Text>
319
- <Text size="sm" ff={monospace ? "monospace" : undefined}>
320
- {value}
321
- </Text>
322
- </Flex>
323
- );
324
-
325
310
  export default AdminJobRegistry;