@alepha/ui 0.16.2 → 0.17.1

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 (175) hide show
  1. package/dist/admin/{AdminApiKeys-CoTOTfgU.js → AdminApiKeys-CF_qOO3u.js} +20 -20
  2. package/dist/admin/AdminApiKeys-CF_qOO3u.js.map +1 -0
  3. package/dist/admin/{AdminAudits-BmsxFbDa.js → AdminAudits-BQno3hZG.js} +7 -8
  4. package/dist/admin/AdminAudits-BQno3hZG.js.map +1 -0
  5. package/dist/admin/{AdminFiles-BBB8knca.js → AdminFiles-kvuUaASF.js} +3 -5
  6. package/dist/admin/{AdminFiles-BBB8knca.js.map → AdminFiles-kvuUaASF.js.map} +1 -1
  7. package/dist/admin/AdminJobDashboard-CrPxp0W1.js +485 -0
  8. package/dist/admin/AdminJobDashboard-CrPxp0W1.js.map +1 -0
  9. package/dist/admin/AdminJobExecutions-D-b4Zt7W.js +678 -0
  10. package/dist/admin/AdminJobExecutions-D-b4Zt7W.js.map +1 -0
  11. package/dist/admin/AdminJobRegistry-CNX5cpDx.js +301 -0
  12. package/dist/admin/AdminJobRegistry-CNX5cpDx.js.map +1 -0
  13. package/dist/admin/{AdminLayout-CsjvpeD1.js → AdminLayout-e-ZP5nWw.js} +1 -1
  14. package/dist/admin/{AdminLayout-CsjvpeD1.js.map → AdminLayout-e-ZP5nWw.js.map} +1 -1
  15. package/dist/admin/{AdminNotifications-LwR6RKrx.js → AdminNotifications-DeHJFf6W.js} +3 -5
  16. package/dist/admin/{AdminNotifications-LwR6RKrx.js.map → AdminNotifications-DeHJFf6W.js.map} +1 -1
  17. package/dist/admin/{AdminParameters-B_83Vie9.js → AdminParameters-iQE8o7a7.js} +43 -36
  18. package/dist/admin/AdminParameters-iQE8o7a7.js.map +1 -0
  19. package/dist/admin/{AdminSessions-CWnPosdd.js → AdminSessions-oKJCbd7w.js} +5 -7
  20. package/dist/admin/AdminSessions-oKJCbd7w.js.map +1 -0
  21. package/dist/admin/{AdminUserAudits-nHv636E_.js → AdminUserAudits-BNCEle_E.js} +6 -8
  22. package/dist/admin/AdminUserAudits-BNCEle_E.js.map +1 -0
  23. package/dist/admin/{AdminUserCreate-CjYD3Kjc.js → AdminUserCreate-CgqeFwCt.js} +6 -7
  24. package/dist/admin/AdminUserCreate-CgqeFwCt.js.map +1 -0
  25. package/dist/admin/{AdminUserDetails-Ccq-LsZ0.js → AdminUserDetails-DDe1A1GP.js} +30 -29
  26. package/dist/admin/AdminUserDetails-DDe1A1GP.js.map +1 -0
  27. package/dist/admin/{AdminUserLayout-7s41DiF_.js → AdminUserLayout-HAlobhWf.js} +18 -16
  28. package/dist/admin/AdminUserLayout-HAlobhWf.js.map +1 -0
  29. package/dist/admin/{AdminUserSessions-Ds3ODq_d.js → AdminUserSessions-Bq1LnVLf.js} +5 -7
  30. package/dist/admin/AdminUserSessions-Bq1LnVLf.js.map +1 -0
  31. package/dist/admin/{AdminUserSettings-CGh4gROo.js → AdminUserSettings-BRsBZoxV.js} +10 -10
  32. package/dist/admin/AdminUserSettings-BRsBZoxV.js.map +1 -0
  33. package/dist/admin/{AdminUsers-CvPiBzQK.js → AdminUsers-D71kIOSn.js} +6 -8
  34. package/dist/admin/AdminUsers-D71kIOSn.js.map +1 -0
  35. package/dist/admin/index.d.ts +7 -83
  36. package/dist/admin/index.d.ts.map +1 -1
  37. package/dist/admin/index.js +49 -70
  38. package/dist/admin/index.js.map +1 -1
  39. package/dist/auth/{Login-DS_OqA0G.js → Login-BS_FYTy0.js} +13 -8
  40. package/dist/auth/Login-BS_FYTy0.js.map +1 -0
  41. package/dist/auth/{Profile-Di7N7HZL.js → Profile-CjDsW378.js} +16 -10
  42. package/dist/auth/Profile-CjDsW378.js.map +1 -0
  43. package/dist/auth/{Register-BRR2_gux.js → Register-C5eqzAaD.js} +21 -12
  44. package/dist/auth/Register-C5eqzAaD.js.map +1 -0
  45. package/dist/auth/{ResetPassword-oQu72lod.js → ResetPassword-XifinVao.js} +14 -8
  46. package/dist/auth/ResetPassword-XifinVao.js.map +1 -0
  47. package/dist/auth/{VerifyEmail-DC6HPZjd.js → VerifyEmail-DTgbeJOO.js} +6 -4
  48. package/dist/auth/VerifyEmail-DTgbeJOO.js.map +1 -0
  49. package/dist/auth/index.d.ts +4 -0
  50. package/dist/auth/index.d.ts.map +1 -1
  51. package/dist/auth/index.js +15 -14
  52. package/dist/auth/index.js.map +1 -1
  53. package/dist/core/index.d.ts +37 -26
  54. package/dist/core/index.d.ts.map +1 -1
  55. package/dist/core/index.js +444 -193
  56. package/dist/core/index.js.map +1 -1
  57. package/dist/demo/DemoDataTable-lnBKWBf8.js +362 -0
  58. package/dist/demo/DemoDataTable-lnBKWBf8.js.map +1 -0
  59. package/dist/demo/{DemoHome-DpRrPlBC.js → DemoHome-CUMZsYaH.js} +6 -7
  60. package/dist/demo/DemoHome-CUMZsYaH.js.map +1 -0
  61. package/dist/demo/{DemoJsonViewer-zeucGKHV.js → DemoJsonViewer-_uokbGaW.js} +17 -19
  62. package/dist/demo/DemoJsonViewer-_uokbGaW.js.map +1 -0
  63. package/dist/demo/{DemoLayout-PhgbAAiQ.js → DemoLayout-DHVoacE6.js} +2 -4
  64. package/dist/demo/{DemoLayout-PhgbAAiQ.js.map → DemoLayout-DHVoacE6.js.map} +1 -1
  65. package/dist/demo/{DemoLogin-DSzP0Lkv.js → DemoLogin-DjJ9314c.js} +22 -17
  66. package/dist/demo/DemoLogin-DjJ9314c.js.map +1 -0
  67. package/dist/demo/{DemoRegister-DavFBsCz.js → DemoRegister-DzkJ5M83.js} +34 -25
  68. package/dist/demo/DemoRegister-DzkJ5M83.js.map +1 -0
  69. package/dist/demo/{DemoResetPassword-BS2rIAQK.js → DemoResetPassword-DWh4_BpQ.js} +27 -21
  70. package/dist/demo/DemoResetPassword-DWh4_BpQ.js.map +1 -0
  71. package/dist/demo/{DemoSidebar-zNkUmHRl.js → DemoSidebar-C1csnGhX.js} +2 -2
  72. package/dist/demo/{DemoSidebar-zNkUmHRl.js.map → DemoSidebar-C1csnGhX.js.map} +1 -1
  73. package/dist/demo/{DemoTypeForm-B9q7oT0b.js → DemoTypeForm-CWz6fJrJ.js} +2 -2
  74. package/dist/demo/{DemoTypeForm-B9q7oT0b.js.map → DemoTypeForm-CWz6fJrJ.js.map} +1 -1
  75. package/dist/demo/{DemoVerifyEmail-Bi4SdWz0.js → DemoVerifyEmail-DbU_tCj8.js} +13 -11
  76. package/dist/demo/DemoVerifyEmail-DbU_tCj8.js.map +1 -0
  77. package/dist/demo/{IconGoogle-CTeZyrek.js → IconGoogle-Ch1m3Uzl.js} +1 -1
  78. package/dist/demo/{IconGoogle-CTeZyrek.js.map → IconGoogle-Ch1m3Uzl.js.map} +1 -1
  79. package/dist/demo/{Showcase-C9btr_SJ.js → Showcase-BzoXNlCn.js} +10 -10
  80. package/dist/demo/Showcase-BzoXNlCn.js.map +1 -0
  81. package/dist/demo/index.d.ts +1 -68
  82. package/dist/demo/index.d.ts.map +1 -1
  83. package/dist/demo/index.js +11 -15
  84. package/dist/demo/index.js.map +1 -1
  85. package/dist/json/index.js +2 -2
  86. package/dist/json/index.js.map +1 -1
  87. package/package.json +9 -5
  88. package/src/admin/AdminRouter.ts +36 -5
  89. package/src/admin/components/audits/AdminAudits.tsx +5 -5
  90. package/src/admin/components/jobs/AdminJobDashboard.tsx +455 -0
  91. package/src/admin/components/jobs/AdminJobExecutions.tsx +693 -0
  92. package/src/admin/components/jobs/AdminJobRegistry.tsx +325 -0
  93. package/src/admin/components/keys/AdminApiKeys.tsx +28 -31
  94. package/src/admin/components/parameters/AdminParameters.tsx +3 -3
  95. package/src/admin/components/parameters/ParameterDetails.tsx +34 -29
  96. package/src/admin/components/parameters/ParameterEmptyState.tsx +5 -5
  97. package/src/admin/components/parameters/ParameterHistory.tsx +11 -19
  98. package/src/admin/components/parameters/ParameterTree.tsx +16 -18
  99. package/src/admin/components/sessions/AdminSessions.tsx +3 -3
  100. package/src/admin/components/shared/AdminResourceHeader.tsx +20 -16
  101. package/src/admin/components/users/AdminUserAudits.tsx +5 -5
  102. package/src/admin/components/users/AdminUserCreate.tsx +3 -3
  103. package/src/admin/components/users/AdminUserDetails.tsx +51 -53
  104. package/src/admin/components/users/AdminUserLayout.tsx +7 -7
  105. package/src/admin/components/users/AdminUserSessions.tsx +3 -3
  106. package/src/admin/components/users/AdminUserSettings.tsx +9 -9
  107. package/src/admin/components/users/AdminUsers.tsx +5 -5
  108. package/src/admin/components/verifications/AdminVerifications.tsx +3 -3
  109. package/src/admin/index.ts +0 -24
  110. package/src/auth/components/Login.tsx +13 -13
  111. package/src/auth/components/Profile.tsx +17 -26
  112. package/src/auth/components/Register.tsx +21 -31
  113. package/src/auth/components/ResetPassword.tsx +13 -22
  114. package/src/auth/components/VerifyEmail.tsx +5 -5
  115. package/src/auth/components/buttons/UserButton.tsx +14 -4
  116. package/src/core/components/buttons/ActionButton.tsx +9 -2
  117. package/src/core/components/data/ErrorViewer.tsx +15 -15
  118. package/src/core/components/dialogs/AlertDialog.tsx +3 -3
  119. package/src/core/components/dialogs/ConfirmDialog.tsx +3 -3
  120. package/src/core/components/dialogs/PromptDialog.tsx +3 -3
  121. package/src/core/components/form/Control.tsx +9 -0
  122. package/src/core/components/form/ControlArray.tsx +6 -7
  123. package/src/core/components/form/ControlObject.tsx +3 -3
  124. package/src/core/components/form/ControlQueryBuilder.tsx +20 -22
  125. package/src/core/components/form/ControlSelect.tsx +4 -0
  126. package/src/core/components/form/TypeForm.tsx +7 -0
  127. package/src/core/components/layout/Breadcrumb.tsx +6 -6
  128. package/src/core/components/layout/Omnibar.tsx +2 -1
  129. package/src/core/components/layout/Sidebar.tsx +5 -1
  130. package/src/core/components/table/ColumnPicker.tsx +47 -31
  131. package/src/core/components/table/DataTable.tsx +277 -201
  132. package/src/core/components/table/DataTableFilters.tsx +8 -0
  133. package/src/core/components/table/DataTableToolbar.tsx +98 -5
  134. package/src/core/components/table/FilterPicker.tsx +28 -26
  135. package/src/core/components/table/types.ts +52 -37
  136. package/src/core/components/table/useTableSelection.ts +83 -0
  137. package/src/core/styles.css +1 -0
  138. package/src/core/utils/parseInput.ts +1 -0
  139. package/src/demo/components/DemoHome.tsx +5 -5
  140. package/src/demo/components/core/DemoDataTable.tsx +209 -5
  141. package/src/demo/components/json/DemoJsonViewer.tsx +1 -1
  142. package/src/demo/components/shared/MacWindow.tsx +7 -7
  143. package/src/demo/components/shared/Showcase.tsx +3 -3
  144. package/src/demo/index.ts +0 -11
  145. package/src/json/components/JsonViewer.tsx +3 -3
  146. package/dist/admin/AdminApiKeys-CoTOTfgU.js.map +0 -1
  147. package/dist/admin/AdminAudits-BmsxFbDa.js.map +0 -1
  148. package/dist/admin/AdminJobs-C604joTz.js +0 -698
  149. package/dist/admin/AdminJobs-C604joTz.js.map +0 -1
  150. package/dist/admin/AdminParameters-B_83Vie9.js.map +0 -1
  151. package/dist/admin/AdminSessions-CWnPosdd.js.map +0 -1
  152. package/dist/admin/AdminUserAudits-nHv636E_.js.map +0 -1
  153. package/dist/admin/AdminUserCreate-CjYD3Kjc.js.map +0 -1
  154. package/dist/admin/AdminUserDetails-Ccq-LsZ0.js.map +0 -1
  155. package/dist/admin/AdminUserLayout-7s41DiF_.js.map +0 -1
  156. package/dist/admin/AdminUserSessions-Ds3ODq_d.js.map +0 -1
  157. package/dist/admin/AdminUserSettings-CGh4gROo.js.map +0 -1
  158. package/dist/admin/AdminUsers-CvPiBzQK.js.map +0 -1
  159. package/dist/admin/rolldown-runtime-CjeV3_4I.js +0 -18
  160. package/dist/auth/Login-DS_OqA0G.js.map +0 -1
  161. package/dist/auth/Profile-Di7N7HZL.js.map +0 -1
  162. package/dist/auth/Register-BRR2_gux.js.map +0 -1
  163. package/dist/auth/ResetPassword-oQu72lod.js.map +0 -1
  164. package/dist/auth/VerifyEmail-DC6HPZjd.js.map +0 -1
  165. package/dist/demo/DemoDataTable-DCsJq8v5.js +0 -149
  166. package/dist/demo/DemoDataTable-DCsJq8v5.js.map +0 -1
  167. package/dist/demo/DemoHome-DpRrPlBC.js.map +0 -1
  168. package/dist/demo/DemoJsonViewer-zeucGKHV.js.map +0 -1
  169. package/dist/demo/DemoLogin-DSzP0Lkv.js.map +0 -1
  170. package/dist/demo/DemoRegister-DavFBsCz.js.map +0 -1
  171. package/dist/demo/DemoResetPassword-BS2rIAQK.js.map +0 -1
  172. package/dist/demo/DemoVerifyEmail-Bi4SdWz0.js.map +0 -1
  173. package/dist/demo/Showcase-C9btr_SJ.js.map +0 -1
  174. package/dist/demo/rolldown-runtime-CjeV3_4I.js +0 -18
  175. package/src/admin/components/jobs/AdminJobs.tsx +0 -772
@@ -0,0 +1,485 @@
1
+ import { ActionButton, Flex, Text, useToast } from "@alepha/ui";
2
+ import { IconAlertTriangle, IconCircleCheck, IconCircleX, IconClock, IconPlayerPlay, IconRefresh, IconTerminal2 } from "@tabler/icons-react";
3
+ import { Badge, Paper, SimpleGrid, Table, ThemeIcon } from "@mantine/core";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { useClient } from "alepha/react";
6
+ import { useI18n } from "alepha/react/i18n";
7
+ import { AreaChart, BarChart, DonutChart } from "@mantine/charts";
8
+ import { useCallback, useEffect, useState } from "react";
9
+
10
+ //#region ../../src/admin/components/jobs/AdminJobDashboard.tsx
11
+ const formatDuration = (start, end) => {
12
+ const startTime = new Date(start).getTime();
13
+ const duration = (end ? new Date(end).getTime() : Date.now()) - startTime;
14
+ if (duration < 1e3) return `${duration}ms`;
15
+ if (duration < 6e4) return `${(duration / 1e3).toFixed(1)}s`;
16
+ if (duration < 36e5) return `${Math.floor(duration / 6e4)}m ${Math.floor(duration % 6e4 / 1e3)}s`;
17
+ return `${Math.floor(duration / 36e5)}h ${Math.floor(duration % 36e5 / 6e4)}m`;
18
+ };
19
+ const getStatusColor = (status) => {
20
+ switch (status) {
21
+ case "completed": return "teal";
22
+ case "running": return "blue";
23
+ case "failed":
24
+ case "dead": return "red";
25
+ case "cancelled": return "orange";
26
+ case "scheduled": return "violet";
27
+ case "retrying": return "yellow";
28
+ case "pending": return "gray";
29
+ default: return "gray";
30
+ }
31
+ };
32
+ const getStatusIcon = (status, size = 14) => {
33
+ switch (status) {
34
+ case "completed": return /* @__PURE__ */ jsx(IconCircleCheck, { size });
35
+ case "failed":
36
+ case "dead": return /* @__PURE__ */ jsx(IconCircleX, { size });
37
+ case "running": return /* @__PURE__ */ jsx(IconPlayerPlay, { size });
38
+ case "cancelled": return /* @__PURE__ */ jsx(IconAlertTriangle, { size });
39
+ default: return /* @__PURE__ */ jsx(IconClock, { size });
40
+ }
41
+ };
42
+ const AdminJobDashboard = () => {
43
+ const client = useClient();
44
+ const { l } = useI18n();
45
+ const toast = useToast();
46
+ const [stats, setStats] = useState(null);
47
+ const [recent, setRecent] = useState([]);
48
+ const [failures, setFailures] = useState([]);
49
+ const [activity, setActivity] = useState([]);
50
+ const [queueDepth, setQueueDepth] = useState([]);
51
+ const loadData = useCallback(async () => {
52
+ try {
53
+ const [statsData, recentData, failureData, activityData, queueData] = await Promise.all([
54
+ client.getJobStats(),
55
+ client.findExecutions({ query: {
56
+ sort: "-createdAt",
57
+ size: 10
58
+ } }),
59
+ client.getTopFailures(),
60
+ client.getActivity({ query: { days: 14 } }),
61
+ client.getQueueDepth()
62
+ ]);
63
+ setStats(statsData);
64
+ setRecent(recentData.content);
65
+ setFailures(failureData);
66
+ setActivity(activityData);
67
+ setQueueDepth(queueData);
68
+ } catch {
69
+ toast.danger("Failed to load dashboard data");
70
+ }
71
+ }, [client, toast]);
72
+ useEffect(() => {
73
+ loadData();
74
+ }, [loadData]);
75
+ const activityChartData = activity.map((point) => ({
76
+ date: new Date(point.date).toLocaleDateString("en-US", {
77
+ month: "short",
78
+ day: "numeric"
79
+ }),
80
+ completed: point.completed,
81
+ failed: point.failed
82
+ }));
83
+ const queueChartData = queueDepth.filter((q) => q.pending + q.running + q.scheduled + q.retrying + q.dead > 0).map((q) => ({
84
+ job: q.jobName.length > 20 ? `...${q.jobName.slice(q.jobName.length - 18)}` : q.jobName,
85
+ pending: q.pending,
86
+ running: q.running,
87
+ scheduled: q.scheduled,
88
+ retrying: q.retrying,
89
+ dead: q.dead
90
+ }));
91
+ const statusDonutData = stats ? [
92
+ {
93
+ name: "Running",
94
+ value: stats.running,
95
+ color: "blue"
96
+ },
97
+ {
98
+ name: "Pending",
99
+ value: stats.pending,
100
+ color: "gray"
101
+ },
102
+ {
103
+ name: "Scheduled",
104
+ value: stats.scheduled,
105
+ color: "violet"
106
+ },
107
+ {
108
+ name: "Retrying",
109
+ value: stats.retrying,
110
+ color: "yellow"
111
+ },
112
+ {
113
+ name: "Dead",
114
+ value: stats.dead,
115
+ color: "red"
116
+ }
117
+ ].filter((d) => d.value > 0) : [];
118
+ return /* @__PURE__ */ jsxs(Flex, {
119
+ flex: 1,
120
+ direction: "column",
121
+ gap: "md",
122
+ p: "md",
123
+ children: [
124
+ /* @__PURE__ */ jsxs(Flex, {
125
+ justify: "space-between",
126
+ align: "center",
127
+ children: [/* @__PURE__ */ jsx(Text, {
128
+ size: "lg",
129
+ fw: 600,
130
+ children: "Jobs Dashboard"
131
+ }), /* @__PURE__ */ jsx(ActionButton, {
132
+ tooltip: "Refresh",
133
+ variant: "light",
134
+ size: "sm",
135
+ icon: IconRefresh,
136
+ onClick: loadData
137
+ })]
138
+ }),
139
+ stats && /* @__PURE__ */ jsxs(SimpleGrid, {
140
+ cols: {
141
+ base: 2,
142
+ sm: 4
143
+ },
144
+ spacing: "md",
145
+ children: [
146
+ /* @__PURE__ */ jsx(Paper, {
147
+ p: "md",
148
+ radius: "md",
149
+ withBorder: true,
150
+ children: /* @__PURE__ */ jsxs(Flex, {
151
+ justify: "space-between",
152
+ children: [/* @__PURE__ */ jsxs(Flex, {
153
+ direction: "column",
154
+ children: [/* @__PURE__ */ jsx(Text, {
155
+ size: "xs",
156
+ c: "dimmed",
157
+ tt: "uppercase",
158
+ fw: 600,
159
+ children: "Registered"
160
+ }), /* @__PURE__ */ jsx(Text, {
161
+ size: "xl",
162
+ fw: 700,
163
+ ff: "monospace",
164
+ children: stats.registered
165
+ })]
166
+ }), /* @__PURE__ */ jsx(ThemeIcon, {
167
+ size: "lg",
168
+ radius: "md",
169
+ variant: "light",
170
+ color: "blue",
171
+ children: /* @__PURE__ */ jsx(IconTerminal2, { size: 20 })
172
+ })]
173
+ })
174
+ }),
175
+ /* @__PURE__ */ jsx(Paper, {
176
+ p: "md",
177
+ radius: "md",
178
+ withBorder: true,
179
+ children: /* @__PURE__ */ jsxs(Flex, {
180
+ justify: "space-between",
181
+ children: [/* @__PURE__ */ jsxs(Flex, {
182
+ direction: "column",
183
+ children: [/* @__PURE__ */ jsx(Text, {
184
+ size: "xs",
185
+ c: "dimmed",
186
+ tt: "uppercase",
187
+ fw: 600,
188
+ children: "Running"
189
+ }), /* @__PURE__ */ jsx(Text, {
190
+ size: "xl",
191
+ fw: 700,
192
+ ff: "monospace",
193
+ c: stats.running > 0 ? "blue" : void 0,
194
+ children: stats.running
195
+ })]
196
+ }), /* @__PURE__ */ jsx(ThemeIcon, {
197
+ size: "lg",
198
+ radius: "md",
199
+ variant: "light",
200
+ color: stats.running > 0 ? "blue" : "gray",
201
+ children: /* @__PURE__ */ jsx(IconPlayerPlay, { size: 20 })
202
+ })]
203
+ })
204
+ }),
205
+ /* @__PURE__ */ jsx(Paper, {
206
+ p: "md",
207
+ radius: "md",
208
+ withBorder: true,
209
+ children: /* @__PURE__ */ jsxs(Flex, {
210
+ justify: "space-between",
211
+ children: [/* @__PURE__ */ jsxs(Flex, {
212
+ direction: "column",
213
+ children: [/* @__PURE__ */ jsx(Text, {
214
+ size: "xs",
215
+ c: "dimmed",
216
+ tt: "uppercase",
217
+ fw: 600,
218
+ children: "Completed 24h"
219
+ }), /* @__PURE__ */ jsx(Text, {
220
+ size: "xl",
221
+ fw: 700,
222
+ ff: "monospace",
223
+ c: "teal",
224
+ children: stats.completed24h
225
+ })]
226
+ }), /* @__PURE__ */ jsx(ThemeIcon, {
227
+ size: "lg",
228
+ radius: "md",
229
+ variant: "light",
230
+ color: "teal",
231
+ children: /* @__PURE__ */ jsx(IconCircleCheck, { size: 20 })
232
+ })]
233
+ })
234
+ }),
235
+ /* @__PURE__ */ jsx(Paper, {
236
+ p: "md",
237
+ radius: "md",
238
+ withBorder: true,
239
+ children: /* @__PURE__ */ jsxs(Flex, {
240
+ justify: "space-between",
241
+ children: [/* @__PURE__ */ jsxs(Flex, {
242
+ direction: "column",
243
+ children: [/* @__PURE__ */ jsx(Text, {
244
+ size: "xs",
245
+ c: "dimmed",
246
+ tt: "uppercase",
247
+ fw: 600,
248
+ children: "Failed 24h"
249
+ }), /* @__PURE__ */ jsx(Text, {
250
+ size: "xl",
251
+ fw: 700,
252
+ ff: "monospace",
253
+ c: stats.failed24h > 0 ? "red" : void 0,
254
+ children: stats.failed24h
255
+ })]
256
+ }), /* @__PURE__ */ jsx(ThemeIcon, {
257
+ size: "lg",
258
+ radius: "md",
259
+ variant: "light",
260
+ color: stats.failed24h > 0 ? "red" : "gray",
261
+ children: /* @__PURE__ */ jsx(IconAlertTriangle, { size: 20 })
262
+ })]
263
+ })
264
+ })
265
+ ]
266
+ }),
267
+ /* @__PURE__ */ jsxs(SimpleGrid, {
268
+ cols: {
269
+ base: 1,
270
+ md: 2
271
+ },
272
+ spacing: "md",
273
+ children: [/* @__PURE__ */ jsxs(Paper, {
274
+ p: "md",
275
+ radius: "md",
276
+ withBorder: true,
277
+ children: [/* @__PURE__ */ jsx(Text, {
278
+ size: "sm",
279
+ fw: 600,
280
+ mb: "sm",
281
+ children: "Activity (14d)"
282
+ }), activityChartData.length > 0 ? /* @__PURE__ */ jsx(AreaChart, {
283
+ h: 220,
284
+ data: activityChartData,
285
+ dataKey: "date",
286
+ series: [{
287
+ name: "completed",
288
+ label: "Completed",
289
+ color: "teal.6"
290
+ }, {
291
+ name: "failed",
292
+ label: "Failed",
293
+ color: "red.6"
294
+ }],
295
+ curveType: "monotone",
296
+ withGradient: true,
297
+ withTooltip: true,
298
+ withDots: false
299
+ }) : /* @__PURE__ */ jsx(Flex, {
300
+ h: 220,
301
+ align: "center",
302
+ justify: "center",
303
+ children: /* @__PURE__ */ jsx(Text, {
304
+ size: "sm",
305
+ c: "dimmed",
306
+ children: "No activity data"
307
+ })
308
+ })]
309
+ }), /* @__PURE__ */ jsxs(Paper, {
310
+ p: "md",
311
+ radius: "md",
312
+ withBorder: true,
313
+ children: [/* @__PURE__ */ jsx(Text, {
314
+ size: "sm",
315
+ fw: 600,
316
+ mb: "sm",
317
+ children: "Active Executions"
318
+ }), statusDonutData.length > 0 ? /* @__PURE__ */ jsx(DonutChart, {
319
+ h: 220,
320
+ data: statusDonutData,
321
+ withTooltip: true,
322
+ tooltipDataSource: "segment",
323
+ chartLabel: String(statusDonutData.reduce((sum, d) => sum + d.value, 0))
324
+ }) : /* @__PURE__ */ jsx(Flex, {
325
+ h: 220,
326
+ align: "center",
327
+ justify: "center",
328
+ children: /* @__PURE__ */ jsx(Text, {
329
+ size: "sm",
330
+ c: "dimmed",
331
+ children: "No active executions"
332
+ })
333
+ })]
334
+ })]
335
+ }),
336
+ queueChartData.length > 0 && /* @__PURE__ */ jsxs(Paper, {
337
+ p: "md",
338
+ radius: "md",
339
+ withBorder: true,
340
+ children: [/* @__PURE__ */ jsx(Text, {
341
+ size: "sm",
342
+ fw: 600,
343
+ mb: "sm",
344
+ children: "Queue Depth by Job"
345
+ }), /* @__PURE__ */ jsx(BarChart, {
346
+ h: 200,
347
+ data: queueChartData,
348
+ dataKey: "job",
349
+ type: "stacked",
350
+ series: [
351
+ {
352
+ name: "running",
353
+ label: "Running",
354
+ color: "blue.6"
355
+ },
356
+ {
357
+ name: "pending",
358
+ label: "Pending",
359
+ color: "gray.5"
360
+ },
361
+ {
362
+ name: "scheduled",
363
+ label: "Scheduled",
364
+ color: "violet.5"
365
+ },
366
+ {
367
+ name: "retrying",
368
+ label: "Retrying",
369
+ color: "yellow.5"
370
+ },
371
+ {
372
+ name: "dead",
373
+ label: "Dead",
374
+ color: "red.6"
375
+ }
376
+ ],
377
+ withTooltip: true,
378
+ withLegend: true
379
+ })]
380
+ }),
381
+ /* @__PURE__ */ jsxs(SimpleGrid, {
382
+ cols: {
383
+ base: 1,
384
+ md: 2
385
+ },
386
+ spacing: "md",
387
+ children: [/* @__PURE__ */ jsxs(Paper, {
388
+ p: "md",
389
+ radius: "md",
390
+ withBorder: true,
391
+ children: [/* @__PURE__ */ jsx(Text, {
392
+ size: "sm",
393
+ fw: 600,
394
+ mb: "sm",
395
+ children: "Recent Executions"
396
+ }), /* @__PURE__ */ jsxs(Table, {
397
+ highlightOnHover: true,
398
+ children: [/* @__PURE__ */ jsx(Table.Thead, { children: /* @__PURE__ */ jsxs(Table.Tr, { children: [
399
+ /* @__PURE__ */ jsx(Table.Th, { children: "Job" }),
400
+ /* @__PURE__ */ jsx(Table.Th, { children: "Status" }),
401
+ /* @__PURE__ */ jsx(Table.Th, { children: "Duration" })
402
+ ] }) }), /* @__PURE__ */ jsxs(Table.Tbody, { children: [recent.map((exec) => /* @__PURE__ */ jsxs(Table.Tr, { children: [
403
+ /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsx(Text, {
404
+ size: "xs",
405
+ fw: 500,
406
+ ff: "monospace",
407
+ lineClamp: 1,
408
+ children: exec.jobName
409
+ }) }),
410
+ /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsx(Badge, {
411
+ size: "xs",
412
+ variant: "light",
413
+ color: getStatusColor(exec.status),
414
+ leftSection: getStatusIcon(exec.status, 10),
415
+ children: exec.status
416
+ }) }),
417
+ /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsx(Text, {
418
+ size: "xs",
419
+ c: "dimmed",
420
+ ff: "monospace",
421
+ children: exec.startedAt && (exec.completedAt || exec.status === "running") ? formatDuration(exec.startedAt, exec.completedAt) : "—"
422
+ }) })
423
+ ] }, exec.id)), recent.length === 0 && /* @__PURE__ */ jsx(Table.Tr, { children: /* @__PURE__ */ jsx(Table.Td, {
424
+ colSpan: 3,
425
+ children: /* @__PURE__ */ jsx(Text, {
426
+ size: "sm",
427
+ c: "dimmed",
428
+ ta: "center",
429
+ children: "No recent executions"
430
+ })
431
+ }) })] })]
432
+ })]
433
+ }), /* @__PURE__ */ jsxs(Paper, {
434
+ p: "md",
435
+ radius: "md",
436
+ withBorder: true,
437
+ children: [/* @__PURE__ */ jsx(Text, {
438
+ size: "sm",
439
+ fw: 600,
440
+ mb: "sm",
441
+ children: "Top Failures (7d)"
442
+ }), failures.length > 0 ? /* @__PURE__ */ jsxs(Table, { children: [/* @__PURE__ */ jsx(Table.Thead, { children: /* @__PURE__ */ jsxs(Table.Tr, { children: [
443
+ /* @__PURE__ */ jsx(Table.Th, { children: "Job" }),
444
+ /* @__PURE__ */ jsx(Table.Th, { children: "Count" }),
445
+ /* @__PURE__ */ jsx(Table.Th, { children: "Last Error" })
446
+ ] }) }), /* @__PURE__ */ jsx(Table.Tbody, { children: failures.map((f) => /* @__PURE__ */ jsxs(Table.Tr, { children: [
447
+ /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsx(Text, {
448
+ size: "xs",
449
+ fw: 500,
450
+ ff: "monospace",
451
+ lineClamp: 1,
452
+ children: f.jobName
453
+ }) }),
454
+ /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsx(Badge, {
455
+ size: "xs",
456
+ variant: "light",
457
+ color: "red",
458
+ children: f.failures
459
+ }) }),
460
+ /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsx(Text, {
461
+ size: "xs",
462
+ c: "dimmed",
463
+ lineClamp: 1,
464
+ style: { maxWidth: 200 },
465
+ children: f.lastError ?? "—"
466
+ }) })
467
+ ] }, f.jobName)) })] }) : /* @__PURE__ */ jsx(Flex, {
468
+ h: 100,
469
+ align: "center",
470
+ justify: "center",
471
+ children: /* @__PURE__ */ jsx(Text, {
472
+ size: "sm",
473
+ c: "dimmed",
474
+ children: "No failures in the last 7 days"
475
+ })
476
+ })]
477
+ })]
478
+ })
479
+ ]
480
+ });
481
+ };
482
+
483
+ //#endregion
484
+ export { AdminJobDashboard as default };
485
+ //# sourceMappingURL=AdminJobDashboard-CrPxp0W1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminJobDashboard-CrPxp0W1.js","names":[],"sources":["../../src/admin/components/jobs/AdminJobDashboard.tsx"],"sourcesContent":["import { ActionButton, Flex, Text, useToast } from \"@alepha/ui\";\nimport { AreaChart, BarChart, DonutChart } from \"@mantine/charts\";\nimport { Badge, Paper, SimpleGrid, Table, ThemeIcon } from \"@mantine/core\";\nimport {\n IconAlertTriangle,\n IconCircleCheck,\n IconCircleX,\n IconClock,\n IconPlayerPlay,\n IconRefresh,\n IconTerminal2,\n} from \"@tabler/icons-react\";\nimport type {\n AdminJobController,\n JobActivityPoint,\n JobFailure,\n JobQueueDepth,\n JobStats,\n} from \"alepha/api/jobs\";\nimport { useClient } from \"alepha/react\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { useCallback, useEffect, useState } from \"react\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst formatDuration = (\n start: Date | string,\n end?: Date | string | null,\n): string => {\n const startTime = new Date(start).getTime();\n const endTime = end ? new Date(end).getTime() : Date.now();\n const duration = endTime - startTime;\n\n if (duration < 1000) return `${duration}ms`;\n if (duration < 60000) return `${(duration / 1000).toFixed(1)}s`;\n if (duration < 3600000)\n return `${Math.floor(duration / 60000)}m ${Math.floor((duration % 60000) / 1000)}s`;\n return `${Math.floor(duration / 3600000)}h ${Math.floor((duration % 3600000) / 60000)}m`;\n};\n\nconst getStatusColor = (status: string) => {\n switch (status) {\n case \"completed\":\n return \"teal\";\n case \"running\":\n return \"blue\";\n case \"failed\":\n case \"dead\":\n return \"red\";\n case \"cancelled\":\n return \"orange\";\n case \"scheduled\":\n return \"violet\";\n case \"retrying\":\n return \"yellow\";\n case \"pending\":\n return \"gray\";\n default:\n return \"gray\";\n }\n};\n\nconst getStatusIcon = (status: string, size = 14) => {\n switch (status) {\n case \"completed\":\n return <IconCircleCheck size={size} />;\n case \"failed\":\n case \"dead\":\n return <IconCircleX size={size} />;\n case \"running\":\n return <IconPlayerPlay size={size} />;\n case \"cancelled\":\n return <IconAlertTriangle size={size} />;\n default:\n return <IconClock size={size} />;\n }\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface RecentExecution {\n id: string;\n jobName: string;\n status: string;\n startedAt?: string;\n completedAt?: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst AdminJobDashboard = () => {\n const client = useClient<AdminJobController>();\n const { l } = useI18n();\n const toast = useToast();\n\n const [stats, setStats] = useState<JobStats | null>(null);\n const [recent, setRecent] = useState<RecentExecution[]>([]);\n const [failures, setFailures] = useState<JobFailure[]>([]);\n const [activity, setActivity] = useState<JobActivityPoint[]>([]);\n const [queueDepth, setQueueDepth] = useState<JobQueueDepth[]>([]);\n\n const loadData = useCallback(async () => {\n try {\n const [statsData, recentData, failureData, activityData, queueData] =\n await Promise.all([\n client.getJobStats(),\n client.findExecutions({ query: { sort: \"-createdAt\", size: 10 } }),\n client.getTopFailures(),\n client.getActivity({ query: { days: 14 } }),\n client.getQueueDepth(),\n ]);\n setStats(statsData);\n setRecent(recentData.content as RecentExecution[]);\n setFailures(failureData);\n setActivity(activityData);\n setQueueDepth(queueData);\n } catch {\n toast.danger(\"Failed to load dashboard data\");\n }\n }, [client, toast]);\n\n useEffect(() => {\n loadData();\n }, [loadData]);\n\n // Prepare chart data\n const activityChartData = activity.map((point) => ({\n date: new Date(point.date).toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n }),\n completed: point.completed,\n failed: point.failed,\n }));\n\n const queueChartData = queueDepth\n .filter(\n (q) => q.pending + q.running + q.scheduled + q.retrying + q.dead > 0,\n )\n .map((q) => ({\n job:\n q.jobName.length > 20\n ? `...${q.jobName.slice(q.jobName.length - 18)}`\n : q.jobName,\n pending: q.pending,\n running: q.running,\n scheduled: q.scheduled,\n retrying: q.retrying,\n dead: q.dead,\n }));\n\n const statusDonutData = stats\n ? [\n { name: \"Running\", value: stats.running, color: \"blue\" },\n { name: \"Pending\", value: stats.pending, color: \"gray\" },\n { name: \"Scheduled\", value: stats.scheduled, color: \"violet\" },\n { name: \"Retrying\", value: stats.retrying, color: \"yellow\" },\n { name: \"Dead\", value: stats.dead, color: \"red\" },\n ].filter((d) => d.value > 0)\n : [];\n\n return (\n <Flex flex={1} direction=\"column\" gap=\"md\" p=\"md\">\n <Flex justify=\"space-between\" align=\"center\">\n <Text size=\"lg\" fw={600}>\n Jobs Dashboard\n </Text>\n <ActionButton\n tooltip=\"Refresh\"\n variant=\"light\"\n size=\"sm\"\n icon={IconRefresh}\n onClick={loadData}\n />\n </Flex>\n\n {/* Stats Cards */}\n {stats && (\n <SimpleGrid cols={{ base: 2, sm: 4 }} spacing=\"md\">\n <Paper p=\"md\" radius=\"md\" withBorder>\n <Flex justify=\"space-between\">\n <Flex direction=\"column\">\n <Text size=\"xs\" c=\"dimmed\" tt=\"uppercase\" fw={600}>\n Registered\n </Text>\n <Text size=\"xl\" fw={700} ff=\"monospace\">\n {stats.registered}\n </Text>\n </Flex>\n <ThemeIcon size=\"lg\" radius=\"md\" variant=\"light\" color=\"blue\">\n <IconTerminal2 size={20} />\n </ThemeIcon>\n </Flex>\n </Paper>\n\n <Paper p=\"md\" radius=\"md\" withBorder>\n <Flex justify=\"space-between\">\n <Flex direction=\"column\">\n <Text size=\"xs\" c=\"dimmed\" tt=\"uppercase\" fw={600}>\n Running\n </Text>\n <Text\n size=\"xl\"\n fw={700}\n ff=\"monospace\"\n c={stats.running > 0 ? \"blue\" : undefined}\n >\n {stats.running}\n </Text>\n </Flex>\n <ThemeIcon\n size=\"lg\"\n radius=\"md\"\n variant=\"light\"\n color={stats.running > 0 ? \"blue\" : \"gray\"}\n >\n <IconPlayerPlay size={20} />\n </ThemeIcon>\n </Flex>\n </Paper>\n\n <Paper p=\"md\" radius=\"md\" withBorder>\n <Flex justify=\"space-between\">\n <Flex direction=\"column\">\n <Text size=\"xs\" c=\"dimmed\" tt=\"uppercase\" fw={600}>\n Completed 24h\n </Text>\n <Text size=\"xl\" fw={700} ff=\"monospace\" c=\"teal\">\n {stats.completed24h}\n </Text>\n </Flex>\n <ThemeIcon size=\"lg\" radius=\"md\" variant=\"light\" color=\"teal\">\n <IconCircleCheck size={20} />\n </ThemeIcon>\n </Flex>\n </Paper>\n\n <Paper p=\"md\" radius=\"md\" withBorder>\n <Flex justify=\"space-between\">\n <Flex direction=\"column\">\n <Text size=\"xs\" c=\"dimmed\" tt=\"uppercase\" fw={600}>\n Failed 24h\n </Text>\n <Text\n size=\"xl\"\n fw={700}\n ff=\"monospace\"\n c={stats.failed24h > 0 ? \"red\" : undefined}\n >\n {stats.failed24h}\n </Text>\n </Flex>\n <ThemeIcon\n size=\"lg\"\n radius=\"md\"\n variant=\"light\"\n color={stats.failed24h > 0 ? \"red\" : \"gray\"}\n >\n <IconAlertTriangle size={20} />\n </ThemeIcon>\n </Flex>\n </Paper>\n </SimpleGrid>\n )}\n\n {/* Charts Row */}\n <SimpleGrid cols={{ base: 1, md: 2 }} spacing=\"md\">\n {/* Activity Timeline */}\n <Paper p=\"md\" radius=\"md\" withBorder>\n <Text size=\"sm\" fw={600} mb=\"sm\">\n Activity (14d)\n </Text>\n {activityChartData.length > 0 ? (\n <AreaChart\n h={220}\n data={activityChartData}\n dataKey=\"date\"\n series={[\n { name: \"completed\", label: \"Completed\", color: \"teal.6\" },\n { name: \"failed\", label: \"Failed\", color: \"red.6\" },\n ]}\n curveType=\"monotone\"\n withGradient\n withTooltip\n withDots={false}\n />\n ) : (\n <Flex h={220} align=\"center\" justify=\"center\">\n <Text size=\"sm\" c=\"dimmed\">\n No activity data\n </Text>\n </Flex>\n )}\n </Paper>\n\n {/* Current Status Donut */}\n <Paper p=\"md\" radius=\"md\" withBorder>\n <Text size=\"sm\" fw={600} mb=\"sm\">\n Active Executions\n </Text>\n {statusDonutData.length > 0 ? (\n <DonutChart\n h={220}\n data={statusDonutData}\n withTooltip\n tooltipDataSource=\"segment\"\n chartLabel={String(\n statusDonutData.reduce((sum, d) => sum + d.value, 0),\n )}\n />\n ) : (\n <Flex h={220} align=\"center\" justify=\"center\">\n <Text size=\"sm\" c=\"dimmed\">\n No active executions\n </Text>\n </Flex>\n )}\n </Paper>\n </SimpleGrid>\n\n {/* Queue Depth Chart */}\n {queueChartData.length > 0 && (\n <Paper p=\"md\" radius=\"md\" withBorder>\n <Text size=\"sm\" fw={600} mb=\"sm\">\n Queue Depth by Job\n </Text>\n <BarChart\n h={200}\n data={queueChartData}\n dataKey=\"job\"\n type=\"stacked\"\n series={[\n { name: \"running\", label: \"Running\", color: \"blue.6\" },\n { name: \"pending\", label: \"Pending\", color: \"gray.5\" },\n { name: \"scheduled\", label: \"Scheduled\", color: \"violet.5\" },\n { name: \"retrying\", label: \"Retrying\", color: \"yellow.5\" },\n { name: \"dead\", label: \"Dead\", color: \"red.6\" },\n ]}\n withTooltip\n withLegend\n />\n </Paper>\n )}\n\n {/* Recent Activity + Top Failures side by side */}\n <SimpleGrid cols={{ base: 1, md: 2 }} spacing=\"md\">\n {/* Recent Activity */}\n <Paper p=\"md\" radius=\"md\" withBorder>\n <Text size=\"sm\" fw={600} mb=\"sm\">\n Recent Executions\n </Text>\n <Table highlightOnHover>\n <Table.Thead>\n <Table.Tr>\n <Table.Th>Job</Table.Th>\n <Table.Th>Status</Table.Th>\n <Table.Th>Duration</Table.Th>\n </Table.Tr>\n </Table.Thead>\n <Table.Tbody>\n {recent.map((exec) => (\n <Table.Tr key={exec.id}>\n <Table.Td>\n <Text size=\"xs\" fw={500} ff=\"monospace\" lineClamp={1}>\n {exec.jobName}\n </Text>\n </Table.Td>\n <Table.Td>\n <Badge\n size=\"xs\"\n variant=\"light\"\n color={getStatusColor(exec.status)}\n leftSection={getStatusIcon(exec.status, 10)}\n >\n {exec.status}\n </Badge>\n </Table.Td>\n <Table.Td>\n <Text size=\"xs\" c=\"dimmed\" ff=\"monospace\">\n {exec.startedAt &&\n (exec.completedAt || exec.status === \"running\")\n ? formatDuration(exec.startedAt, exec.completedAt)\n : \"—\"}\n </Text>\n </Table.Td>\n </Table.Tr>\n ))}\n {recent.length === 0 && (\n <Table.Tr>\n <Table.Td colSpan={3}>\n <Text size=\"sm\" c=\"dimmed\" ta=\"center\">\n No recent executions\n </Text>\n </Table.Td>\n </Table.Tr>\n )}\n </Table.Tbody>\n </Table>\n </Paper>\n\n {/* Top Failures (7d) */}\n <Paper p=\"md\" radius=\"md\" withBorder>\n <Text size=\"sm\" fw={600} mb=\"sm\">\n Top Failures (7d)\n </Text>\n {failures.length > 0 ? (\n <Table>\n <Table.Thead>\n <Table.Tr>\n <Table.Th>Job</Table.Th>\n <Table.Th>Count</Table.Th>\n <Table.Th>Last Error</Table.Th>\n </Table.Tr>\n </Table.Thead>\n <Table.Tbody>\n {failures.map((f) => (\n <Table.Tr key={f.jobName}>\n <Table.Td>\n <Text size=\"xs\" fw={500} ff=\"monospace\" lineClamp={1}>\n {f.jobName}\n </Text>\n </Table.Td>\n <Table.Td>\n <Badge size=\"xs\" variant=\"light\" color=\"red\">\n {f.failures}\n </Badge>\n </Table.Td>\n <Table.Td>\n <Text\n size=\"xs\"\n c=\"dimmed\"\n lineClamp={1}\n style={{ maxWidth: 200 }}\n >\n {f.lastError ?? \"—\"}\n </Text>\n </Table.Td>\n </Table.Tr>\n ))}\n </Table.Tbody>\n </Table>\n ) : (\n <Flex h={100} align=\"center\" justify=\"center\">\n <Text size=\"sm\" c=\"dimmed\">\n No failures in the last 7 days\n </Text>\n </Flex>\n )}\n </Paper>\n </SimpleGrid>\n </Flex>\n );\n};\n\nexport default AdminJobDashboard;\n"],"mappings":"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"}