@alepha/ui 0.19.0 → 0.19.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 (151) hide show
  1. package/dist/admin/{AdminApiKeys-Bt1PjO6o.js → AdminApiKeys-C2ze85eD.js} +2 -2
  2. package/dist/admin/{AdminApiKeys-Bt1PjO6o.js.map → AdminApiKeys-C2ze85eD.js.map} +1 -1
  3. package/dist/admin/{AdminAudits-C7c1CN4c.js → AdminAudits-BIj81e4k.js} +2 -2
  4. package/dist/admin/{AdminAudits-C7c1CN4c.js.map → AdminAudits-BIj81e4k.js.map} +1 -1
  5. package/dist/admin/{AdminDashboard-C3RXpTp6.js → AdminDashboard-PMVzrwSu.js} +2 -2
  6. package/dist/admin/{AdminDashboard-C3RXpTp6.js.map → AdminDashboard-PMVzrwSu.js.map} +1 -1
  7. package/dist/admin/AdminFiles-Bq03BLt-.js +189 -0
  8. package/dist/admin/AdminFiles-Bq03BLt-.js.map +1 -0
  9. package/dist/admin/{AdminJobExecutions-D-G8RIlr.js → AdminJobs-D1_QGCDy.js} +400 -356
  10. package/dist/admin/AdminJobs-D1_QGCDy.js.map +1 -0
  11. package/dist/admin/{AdminLayout-BmZ9mtXh.js → AdminLayout-BNiwiw2D.js} +2 -2
  12. package/dist/admin/{AdminLayout-BmZ9mtXh.js.map → AdminLayout-BNiwiw2D.js.map} +1 -1
  13. package/dist/admin/{AdminNotifications-DHdzksww.js → AdminNotifications-DSKQtUfn.js} +84 -122
  14. package/dist/admin/AdminNotifications-DSKQtUfn.js.map +1 -0
  15. package/dist/admin/{AdminParameters-CyZQSXnN.js → AdminParameters-CoB7EhyM.js} +2 -2
  16. package/dist/admin/{AdminParameters-CyZQSXnN.js.map → AdminParameters-CoB7EhyM.js.map} +1 -1
  17. package/dist/admin/{AdminSessions--xwELDSO.js → AdminSessions-DFbFcrJQ.js} +2 -2
  18. package/dist/admin/{AdminSessions--xwELDSO.js.map → AdminSessions-DFbFcrJQ.js.map} +1 -1
  19. package/dist/admin/{AdminUserLayout-DvBTG5gd.js → AdminUserLayout-fSfi3KMm.js} +3 -3
  20. package/dist/admin/{AdminUserLayout-DvBTG5gd.js.map → AdminUserLayout-fSfi3KMm.js.map} +1 -1
  21. package/dist/admin/{AdminUserProfile-CzsPBl6Z.js → AdminUserProfile-_C-h8vUK.js} +3 -3
  22. package/dist/admin/{AdminUserProfile-CzsPBl6Z.js.map → AdminUserProfile-_C-h8vUK.js.map} +1 -1
  23. package/dist/admin/{AdminUserSessions-C-aUnhVN.js → AdminUserSessions-KpJHIeQo.js} +2 -2
  24. package/dist/admin/{AdminUserSessions-C-aUnhVN.js.map → AdminUserSessions-KpJHIeQo.js.map} +1 -1
  25. package/dist/admin/{AdminUsers-BYwei5sj.js → AdminUsers-DcVrzdQP.js} +2 -2
  26. package/dist/admin/{AdminUsers-BYwei5sj.js.map → AdminUsers-DcVrzdQP.js.map} +1 -1
  27. package/dist/admin/{AuthLayout-CkPGLJku.js → AuthLayout-CazfLzcf.js} +2 -2
  28. package/dist/admin/{AuthLayout-CkPGLJku.js.map → AuthLayout-CazfLzcf.js.map} +1 -1
  29. package/dist/admin/{Login-DSBqNsZc.js → Login-CaMjUrDP.js} +2 -2
  30. package/dist/admin/{Login-DSBqNsZc.js.map → Login-CaMjUrDP.js.map} +1 -1
  31. package/dist/admin/{Profile-CDRjJo0P.js → Profile-Ca4fZX15.js} +2 -2
  32. package/dist/{auth/Profile-Cy93pNTw.js.map → admin/Profile-Ca4fZX15.js.map} +1 -1
  33. package/dist/admin/{Register-4QGFOnfh.js → Register-C5DyKWPO.js} +2 -2
  34. package/dist/{demo/Register-KKZwr_lL.js.map → admin/Register-C5DyKWPO.js.map} +1 -1
  35. package/dist/admin/{ResetPassword-Gxc9L_mY.js → ResetPassword-BA5sAgXo.js} +2 -2
  36. package/dist/{auth/ResetPassword-B61QPlQi.js.map → admin/ResetPassword-BA5sAgXo.js.map} +1 -1
  37. package/dist/admin/{VerifyEmail-D7G5NnaN.js → VerifyEmail-DKNXROj_.js} +2 -2
  38. package/dist/{auth/VerifyEmail-CqBJ11id.js.map → admin/VerifyEmail-DKNXROj_.js.map} +1 -1
  39. package/dist/admin/{adminUserAtom-DCi4wf-v.js → adminUserAtom-BLNc7XbT.js} +1 -1
  40. package/dist/admin/{adminUserAtom-DCi4wf-v.js.map → adminUserAtom-BLNc7XbT.js.map} +1 -1
  41. package/dist/admin/{core-D1AbU50V.js → core-CJCEx18C.js} +111 -4
  42. package/dist/admin/core-CJCEx18C.js.map +1 -0
  43. package/dist/admin/index.d.ts +21 -3
  44. package/dist/admin/index.d.ts.map +1 -1
  45. package/dist/admin/index.js +29 -58
  46. package/dist/admin/index.js.map +1 -1
  47. package/dist/auth/{AuthLayout-CfRKcTqP.js → AuthLayout-vXPcCVzp.js} +2 -2
  48. package/dist/auth/{AuthLayout-CfRKcTqP.js.map → AuthLayout-vXPcCVzp.js.map} +1 -1
  49. package/dist/auth/{Login-DJyweoPS.js → Login-Dg08QR20.js} +2 -2
  50. package/dist/{demo/Login-CqG1iJbn.js.map → auth/Login-Dg08QR20.js.map} +1 -1
  51. package/dist/{demo/Profile-C0ojJCaG.js → auth/Profile-Bb5O1yeh.js} +2 -2
  52. package/dist/{admin/Profile-CDRjJo0P.js.map → auth/Profile-Bb5O1yeh.js.map} +1 -1
  53. package/dist/auth/{Register-CSqzzitW.js → Register-B2AN71NC.js} +2 -2
  54. package/dist/auth/{Register-CSqzzitW.js.map → Register-B2AN71NC.js.map} +1 -1
  55. package/dist/{demo/ResetPassword-DMrLFEtr.js → auth/ResetPassword-BLxwzbDj.js} +2 -2
  56. package/dist/{admin/ResetPassword-Gxc9L_mY.js.map → auth/ResetPassword-BLxwzbDj.js.map} +1 -1
  57. package/dist/auth/{VerifyEmail-CqBJ11id.js → VerifyEmail-CSDOk3Zm.js} +2 -2
  58. package/dist/{demo/VerifyEmail-BFCAFz6T.js.map → auth/VerifyEmail-CSDOk3Zm.js.map} +1 -1
  59. package/dist/auth/{core-C6D3pazL.js → core-DuGkjPiU.js} +2 -1
  60. package/dist/auth/core-DuGkjPiU.js.map +1 -0
  61. package/dist/auth/index.d.ts +20 -0
  62. package/dist/auth/index.d.ts.map +1 -1
  63. package/dist/auth/index.js +11 -11
  64. package/dist/core/index.d.ts +69 -17
  65. package/dist/core/index.d.ts.map +1 -1
  66. package/dist/core/index.js +110 -8
  67. package/dist/core/index.js.map +1 -1
  68. package/dist/demo/{AuthLayout-Dq5tSLSc.js → AuthLayout-DPsOOG4u.js} +2 -2
  69. package/dist/demo/{AuthLayout-Dq5tSLSc.js.map → AuthLayout-DPsOOG4u.js.map} +1 -1
  70. package/dist/demo/{DemoButton-_Ws2w-J0.js → DemoButton-wzcqGk4u.js} +3 -3
  71. package/dist/demo/{DemoButton-_Ws2w-J0.js.map → DemoButton-wzcqGk4u.js.map} +1 -1
  72. package/dist/demo/{DemoControlSelect-ChP4ZOpQ.js → DemoControlSelect-CMWvQ6Gm.js} +3 -3
  73. package/dist/demo/{DemoControlSelect-ChP4ZOpQ.js.map → DemoControlSelect-CMWvQ6Gm.js.map} +1 -1
  74. package/dist/demo/{DemoDataTable-Hwf_UUni.js → DemoDataTable-CHsAP3e2.js} +3 -3
  75. package/dist/demo/{DemoDataTable-Hwf_UUni.js.map → DemoDataTable-CHsAP3e2.js.map} +1 -1
  76. package/dist/demo/{DemoDialog-B01OMVRd.js → DemoDialog-Co2IePxX.js} +2 -2
  77. package/dist/demo/{DemoDialog-B01OMVRd.js.map → DemoDialog-Co2IePxX.js.map} +1 -1
  78. package/dist/demo/{DemoFlex-870PEl0V.js → DemoFlex-OEwQt5do.js} +3 -3
  79. package/dist/demo/{DemoFlex-870PEl0V.js.map → DemoFlex-OEwQt5do.js.map} +1 -1
  80. package/dist/demo/DemoHeading-Db-XkQIK.js +69 -0
  81. package/dist/demo/DemoHeading-Db-XkQIK.js.map +1 -0
  82. package/dist/demo/{DemoHome-DRbL2eGf.js → DemoHome-Cyp29ygy.js} +2 -2
  83. package/dist/demo/{DemoHome-DRbL2eGf.js.map → DemoHome-Cyp29ygy.js.map} +1 -1
  84. package/dist/demo/{DemoJsonViewer-DoABiqBW.js → DemoJsonViewer-DXtCeMzH.js} +3 -3
  85. package/dist/demo/{DemoJsonViewer-DoABiqBW.js.map → DemoJsonViewer-DXtCeMzH.js.map} +1 -1
  86. package/dist/demo/{DemoLayout-CN_PDCX2.js → DemoLayout-hh9VmZQP.js} +2 -2
  87. package/dist/demo/{DemoLayout-CN_PDCX2.js.map → DemoLayout-hh9VmZQP.js.map} +1 -1
  88. package/dist/demo/{DemoLogin-B5x-ug3Q.js → DemoLogin-DX7mnmkh.js} +13 -8
  89. package/dist/demo/{DemoLogin-B5x-ug3Q.js.map → DemoLogin-DX7mnmkh.js.map} +1 -1
  90. package/dist/demo/{DemoRegister-Q6sg2xuV.js → DemoRegister-DVcZl04m.js} +13 -8
  91. package/dist/demo/{DemoRegister-Q6sg2xuV.js.map → DemoRegister-DVcZl04m.js.map} +1 -1
  92. package/dist/demo/{DemoResetPassword-DrqZfmEw.js → DemoResetPassword-CPENlZH5.js} +13 -8
  93. package/dist/demo/{DemoResetPassword-DrqZfmEw.js.map → DemoResetPassword-CPENlZH5.js.map} +1 -1
  94. package/dist/demo/{DemoSidebar-CfKS6w1o.js → DemoSidebar-CGu7DZeM.js} +3 -3
  95. package/dist/demo/{DemoSidebar-CfKS6w1o.js.map → DemoSidebar-CGu7DZeM.js.map} +1 -1
  96. package/dist/demo/{DemoText-pT6Gi5b5.js → DemoText-DYUJ7bY_.js} +3 -3
  97. package/dist/demo/{DemoText-pT6Gi5b5.js.map → DemoText-DYUJ7bY_.js.map} +1 -1
  98. package/dist/demo/{DemoToast-I13NBzQQ.js → DemoToast-CgdnZNvx.js} +2 -2
  99. package/dist/demo/{DemoToast-I13NBzQQ.js.map → DemoToast-CgdnZNvx.js.map} +1 -1
  100. package/dist/demo/{DemoTypeForm-BqzcrtvN.js → DemoTypeForm-Pims-cGa.js} +3 -3
  101. package/dist/demo/{DemoTypeForm-BqzcrtvN.js.map → DemoTypeForm-Pims-cGa.js.map} +1 -1
  102. package/dist/demo/{DemoVerifyEmail-HwD8xfQw.js → DemoVerifyEmail-C7B3xxch.js} +8 -8
  103. package/dist/demo/{DemoVerifyEmail-HwD8xfQw.js.map → DemoVerifyEmail-C7B3xxch.js.map} +1 -1
  104. package/dist/demo/{Login-CqG1iJbn.js → Login-pwMF4TUj.js} +2 -2
  105. package/dist/{auth/Login-DJyweoPS.js.map → demo/Login-pwMF4TUj.js.map} +1 -1
  106. package/dist/{auth/Profile-Cy93pNTw.js → demo/Profile-BliZapZS.js} +2 -2
  107. package/dist/demo/{Profile-C0ojJCaG.js.map → Profile-BliZapZS.js.map} +1 -1
  108. package/dist/demo/{Register-KKZwr_lL.js → Register-CiwAT7Hy.js} +2 -2
  109. package/dist/{admin/Register-4QGFOnfh.js.map → demo/Register-CiwAT7Hy.js.map} +1 -1
  110. package/dist/{auth/ResetPassword-B61QPlQi.js → demo/ResetPassword-l9Vg4JE-.js} +2 -2
  111. package/dist/demo/{ResetPassword-DMrLFEtr.js.map → ResetPassword-l9Vg4JE-.js.map} +1 -1
  112. package/dist/demo/{Showcase-D49Wud2v.js → Showcase-CX6bDgwe.js} +2 -2
  113. package/dist/demo/{Showcase-D49Wud2v.js.map → Showcase-CX6bDgwe.js.map} +1 -1
  114. package/dist/demo/{VerifyEmail-BFCAFz6T.js → VerifyEmail-CAB-OS7i.js} +2 -2
  115. package/dist/{admin/VerifyEmail-D7G5NnaN.js.map → demo/VerifyEmail-CAB-OS7i.js.map} +1 -1
  116. package/dist/demo/{auth-D9qTZzCa.js → auth-uegJAdKu.js} +8 -8
  117. package/dist/demo/{auth-D9qTZzCa.js.map → auth-uegJAdKu.js.map} +1 -1
  118. package/dist/demo/{core-DRtQklr3.js → core-B4LVHzPn.js} +111 -9
  119. package/dist/demo/core-B4LVHzPn.js.map +1 -0
  120. package/dist/demo/index.js +19 -19
  121. package/dist/demo/index.js.map +1 -1
  122. package/package.json +6 -9
  123. package/src/admin/AdminRouter.tsx +5 -37
  124. package/src/admin/components/files/AdminFiles.tsx +123 -1
  125. package/src/admin/components/jobs/{AdminJobExecutions.tsx → AdminJobs.tsx} +450 -317
  126. package/src/admin/components/notifications/AdminNotifications.tsx +11 -25
  127. package/src/core/components/Section.tsx +109 -0
  128. package/src/core/components/SectionHeader.tsx +106 -0
  129. package/src/core/index.ts +4 -1
  130. package/src/core/table/components/DataTable.tsx +5 -1
  131. package/src/demo/DemoRouter.ts +1 -1
  132. package/src/demo/components/auth/DemoLogin.tsx +5 -0
  133. package/src/demo/components/auth/DemoRegister.tsx +5 -0
  134. package/src/demo/components/auth/DemoResetPassword.tsx +5 -0
  135. package/src/demo/components/core/DemoHeading.tsx +56 -3
  136. package/dist/admin/AdminFiles-31ivR6Wq.js +0 -110
  137. package/dist/admin/AdminFiles-31ivR6Wq.js.map +0 -1
  138. package/dist/admin/AdminJobDashboard-BABLe7hL.js +0 -402
  139. package/dist/admin/AdminJobDashboard-BABLe7hL.js.map +0 -1
  140. package/dist/admin/AdminJobExecutions-D-G8RIlr.js.map +0 -1
  141. package/dist/admin/AdminJobRegistry-oIS3K9NX.js +0 -269
  142. package/dist/admin/AdminJobRegistry-oIS3K9NX.js.map +0 -1
  143. package/dist/admin/AdminNotifications-DHdzksww.js.map +0 -1
  144. package/dist/admin/core-D1AbU50V.js.map +0 -1
  145. package/dist/auth/core-C6D3pazL.js.map +0 -1
  146. package/dist/demo/DemoHeading-C1YR27fz.js +0 -17
  147. package/dist/demo/DemoHeading-C1YR27fz.js.map +0 -1
  148. package/dist/demo/core-DRtQklr3.js.map +0 -1
  149. package/src/admin/components/jobs/AdminJobDashboard.tsx +0 -380
  150. package/src/admin/components/jobs/AdminJobRegistry.tsx +0 -301
  151. package/src/core/components/Heading.tsx +0 -19
@@ -1,12 +1,12 @@
1
- import { _ as ActionButton, b as useToast, d as DetailList, l as Flex$1, m as useDialog, r as DataTable, s as Text$1 } from "./core-D1AbU50V.js";
1
+ import { c as Text$1, f as DetailList, h as useDialog, o as Section, r as DataTable, u as Flex$1, v as ActionButton, x as useToast } from "./core-CJCEx18C.js";
2
2
  import { t } from "alepha";
3
3
  import { useI18n } from "alepha/react/i18n";
4
- import { Badge, Code, Paper, Table } from "@mantine/core";
4
+ import { Badge, Code, Table } from "@mantine/core";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  import { useCallback, useEffect, useState } from "react";
7
- import { IconCircleX, IconRefresh } from "@tabler/icons-react";
7
+ import { IconCircleCheck, IconCircleX, IconPlayerPlay, IconRefresh } from "@tabler/icons-react";
8
8
  import { useClient } from "alepha/react";
9
- //#region ../../src/admin/components/jobs/AdminJobExecutions.tsx
9
+ //#region ../../src/admin/components/jobs/AdminJobs.tsx
10
10
  const PRIORITY_LABELS = {
11
11
  0: "Critical",
12
12
  1: "High",
@@ -21,302 +21,12 @@ const formatDuration = (start, end) => {
21
21
  if (duration < 36e5) return `${Math.floor(duration / 6e4)}m ${Math.floor(duration % 6e4 / 1e3)}s`;
22
22
  return `${Math.floor(duration / 36e5)}h ${Math.floor(duration % 36e5 / 6e4)}m`;
23
23
  };
24
- const executionFilters = t.object({
25
- job: t.optional(t.string()),
26
- status: t.optional(t.enum([
27
- "pending",
28
- "scheduled",
29
- "retrying",
30
- "running",
31
- "completed",
32
- "failed",
33
- "dead",
34
- "cancelled"
35
- ])),
36
- priority: t.optional(t.enum([
37
- "critical",
38
- "high",
39
- "normal",
40
- "low"
41
- ]))
42
- });
43
- const AdminJobExecutions = () => {
44
- const client = useClient();
45
- const { l } = useI18n();
46
- const toast = useToast();
47
- const dialog = useDialog();
48
- const [refreshKey, setRefreshKey] = useState(0);
49
- const handleRetry = useCallback(async (id) => {
50
- try {
51
- await client.retryJobExecution({ params: { id } });
52
- toast.success("Execution retried");
53
- setRefreshKey((k) => k + 1);
54
- } catch {
55
- toast.danger("Failed to retry execution");
56
- }
57
- }, [client, toast]);
58
- const handleCancel = useCallback(async (id) => {
59
- if (!await dialog.confirm({
60
- title: "Cancel Execution",
61
- message: "Are you sure you want to cancel this execution?",
62
- confirmLabel: "Cancel",
63
- confirmColor: "red"
64
- })) return;
65
- try {
66
- await client.cancelJobExecution({ params: { id } });
67
- toast.success("Execution cancelled");
68
- setRefreshKey((k) => k + 1);
69
- } catch {
70
- toast.danger("Failed to cancel execution");
71
- }
72
- }, [
73
- client,
74
- dialog,
75
- toast
76
- ]);
77
- return /* @__PURE__ */ jsx(Flex$1, {
78
- p: "md",
79
- flex: 1,
80
- direction: "column",
81
- gap: "md",
82
- children: /* @__PURE__ */ jsx(DataTable, {
83
- submitOnInit: true,
84
- defaultSize: 20,
85
- typeFormProps: {
86
- skipSubmitButton: true,
87
- columns: 3
88
- },
89
- tableProps: {
90
- horizontalSpacing: "sm",
91
- verticalSpacing: "sm"
92
- },
93
- onFilterChange: (_key, _value, form) => form.submit(),
94
- filters: executionFilters,
95
- defaultFilters: ["job", "status"],
96
- items: async (filters) => {
97
- return await client.findJobExecutions({ query: { ...filters } });
98
- },
99
- columns: {
100
- status: {
101
- label: "Status",
102
- value: (item) => {
103
- return /* @__PURE__ */ jsx(Badge, {
104
- size: "sm",
105
- variant: "light",
106
- color: item.status === "completed" ? "green" : item.status === "running" ? "blue" : item.status === "failed" || item.status === "dead" ? "red" : item.status === "cancelled" ? "yellow" : "gray",
107
- children: item.status
108
- });
109
- }
110
- },
111
- jobName: {
112
- label: "Job",
113
- value: (item) => /* @__PURE__ */ jsx(Text$1, {
114
- size: "sm",
115
- fw: 500,
116
- ff: "monospace",
117
- children: item.jobName
118
- })
119
- },
120
- priority: {
121
- label: "Priority",
122
- value: (item) => /* @__PURE__ */ jsx(Text$1, {
123
- size: "xs",
124
- c: "dimmed",
125
- children: PRIORITY_LABELS[item.priority] ?? item.priority
126
- })
127
- },
128
- attempt: {
129
- label: "Attempt",
130
- value: (item) => /* @__PURE__ */ jsxs(Text$1, {
131
- size: "sm",
132
- ff: "monospace",
133
- children: [
134
- item.attempt,
135
- "/",
136
- item.maxAttempts
137
- ]
138
- })
139
- },
140
- triggeredByName: {
141
- label: "Trigger",
142
- defaultHidden: true,
143
- value: (item) => /* @__PURE__ */ jsx(Text$1, {
144
- size: "xs",
145
- c: "dimmed",
146
- children: item.triggeredByName ?? "—"
147
- })
148
- },
149
- createdAt: {
150
- label: "Created",
151
- defaultHidden: true,
152
- value: (item) => /* @__PURE__ */ jsx(Text$1, {
153
- size: "xs",
154
- c: "dimmed",
155
- children: l(item.createdAt, { date: "fromNow" })
156
- })
157
- },
158
- startedAt: {
159
- label: "Started",
160
- value: (item) => /* @__PURE__ */ jsx(Text$1, {
161
- size: "xs",
162
- c: "dimmed",
163
- children: item.startedAt ? l(item.startedAt, { date: "fromNow" }) : "—"
164
- })
165
- },
166
- duration: {
167
- label: "Duration",
168
- value: (item) => /* @__PURE__ */ jsx(Text$1, {
169
- size: "xs",
170
- c: "dimmed",
171
- ff: "monospace",
172
- children: item.startedAt && (item.completedAt || item.status === "running") ? formatDuration(item.startedAt, item.completedAt) : "—"
173
- })
174
- },
175
- error: {
176
- label: "Error",
177
- defaultHidden: true,
178
- value: (item) => /* @__PURE__ */ jsx(Text$1, {
179
- size: "xs",
180
- c: "dimmed",
181
- lineClamp: 1,
182
- children: item.error ?? "—"
183
- })
184
- },
185
- key: {
186
- label: "Key",
187
- defaultHidden: true,
188
- value: (item) => /* @__PURE__ */ jsx(Text$1, {
189
- size: "xs",
190
- c: "dimmed",
191
- ff: "monospace",
192
- children: item.key ?? "—"
193
- })
194
- },
195
- workerId: {
196
- label: "Worker",
197
- defaultHidden: true,
198
- value: (item) => /* @__PURE__ */ jsx(Text$1, {
199
- size: "xs",
200
- c: "dimmed",
201
- ff: "monospace",
202
- children: item.workerId ?? "—"
203
- })
204
- }
205
- },
206
- rowActions: (item) => [{
207
- label: "Retry",
208
- icon: IconRefresh,
209
- onClick: () => handleRetry(item.id),
210
- visible: item.can?.retry
211
- }, {
212
- label: "Cancel",
213
- icon: IconCircleX,
214
- onClick: () => handleCancel(item.id),
215
- visible: item.can?.cancel
216
- }],
217
- panel: {
218
- can: (item) => Boolean(item.error || item.key || item.workerId),
219
- render: (item) => /* @__PURE__ */ jsxs(Flex$1, {
220
- direction: "column",
221
- gap: "sm",
222
- p: "sm",
223
- children: [item.error && /* @__PURE__ */ jsxs(Flex$1, {
224
- direction: "column",
225
- gap: 2,
226
- children: [/* @__PURE__ */ jsx(Text$1, {
227
- size: "xs",
228
- c: "dimmed",
229
- tt: "uppercase",
230
- fw: 600,
231
- children: "Error"
232
- }), /* @__PURE__ */ jsx(Paper, {
233
- p: "xs",
234
- radius: "sm",
235
- withBorder: true,
236
- children: /* @__PURE__ */ jsx(Text$1, {
237
- size: "xs",
238
- style: {
239
- whiteSpace: "pre-wrap",
240
- wordBreak: "break-word"
241
- },
242
- children: item.error
243
- })
244
- })]
245
- }), /* @__PURE__ */ jsxs(Flex$1, {
246
- gap: "lg",
247
- wrap: "wrap",
248
- children: [
249
- /* @__PURE__ */ jsxs(Flex$1, {
250
- direction: "column",
251
- gap: 2,
252
- children: [/* @__PURE__ */ jsx(Text$1, {
253
- size: "xs",
254
- c: "dimmed",
255
- tt: "uppercase",
256
- fw: 600,
257
- children: "ID"
258
- }), /* @__PURE__ */ jsx(Text$1, {
259
- size: "xs",
260
- ff: "monospace",
261
- children: item.id
262
- })]
263
- }),
264
- item.key && /* @__PURE__ */ jsxs(Flex$1, {
265
- direction: "column",
266
- gap: 2,
267
- children: [/* @__PURE__ */ jsx(Text$1, {
268
- size: "xs",
269
- c: "dimmed",
270
- tt: "uppercase",
271
- fw: 600,
272
- children: "Key"
273
- }), /* @__PURE__ */ jsx(Text$1, {
274
- size: "xs",
275
- ff: "monospace",
276
- children: item.key
277
- })]
278
- }),
279
- item.workerId && /* @__PURE__ */ jsxs(Flex$1, {
280
- direction: "column",
281
- gap: 2,
282
- children: [/* @__PURE__ */ jsx(Text$1, {
283
- size: "xs",
284
- c: "dimmed",
285
- tt: "uppercase",
286
- fw: 600,
287
- children: "Worker"
288
- }), /* @__PURE__ */ jsx(Text$1, {
289
- size: "xs",
290
- ff: "monospace",
291
- children: item.workerId
292
- })]
293
- }),
294
- item.triggeredByName && /* @__PURE__ */ jsxs(Flex$1, {
295
- direction: "column",
296
- gap: 2,
297
- children: [/* @__PURE__ */ jsx(Text$1, {
298
- size: "xs",
299
- c: "dimmed",
300
- tt: "uppercase",
301
- fw: 600,
302
- children: "Triggered By"
303
- }), /* @__PURE__ */ jsx(Text$1, {
304
- size: "xs",
305
- children: item.triggeredByName
306
- })]
307
- })
308
- ]
309
- })]
310
- })
311
- },
312
- drawer: (item) => /* @__PURE__ */ jsx(ExecutionDetailContent, {
313
- item,
314
- onRetry: handleRetry,
315
- onCancel: handleCancel
316
- })
317
- }, `executions-${refreshKey}`)
318
- });
319
- };
24
+ const registryFilters = t.object({ type: t.optional(t.enum([
25
+ "cron",
26
+ "push",
27
+ "both"
28
+ ])) });
29
+ t.object({});
320
30
  const ExecutionDetailContent = ({ item, onRetry, onCancel }) => {
321
31
  const client = useClient();
322
32
  const { l } = useI18n();
@@ -510,71 +220,38 @@ const ExecutionDetailContent = ({ item, onRetry, onCancel }) => {
510
220
  })
511
221
  ]
512
222
  }),
513
- /* @__PURE__ */ jsxs(Paper, {
223
+ /* @__PURE__ */ jsx(Section, {
224
+ title: "Details",
514
225
  p: "sm",
515
- radius: "md",
516
- withBorder: true,
517
- children: [/* @__PURE__ */ jsx(Text$1, {
518
- size: "sm",
519
- fw: 600,
520
- mb: "xs",
521
- children: "Details"
522
- }), /* @__PURE__ */ jsx(DetailList, {
226
+ children: /* @__PURE__ */ jsx(DetailList, {
523
227
  items: detailItems,
524
228
  columns: 2
525
- })]
229
+ })
526
230
  }),
527
- detail.payload && /* @__PURE__ */ jsxs(Paper, {
231
+ detail.payload && /* @__PURE__ */ jsx(Section, {
232
+ title: "Payload",
528
233
  p: "sm",
529
- radius: "md",
530
- withBorder: true,
531
- children: [/* @__PURE__ */ jsx(Text$1, {
532
- size: "sm",
533
- fw: 600,
534
- mb: "xs",
535
- children: "Payload"
536
- }), /* @__PURE__ */ jsx(Code, {
234
+ children: /* @__PURE__ */ jsx(Code, {
537
235
  block: true,
538
236
  children: JSON.stringify(detail.payload, null, 2)
539
- })]
237
+ })
540
238
  }),
541
- detail.error && /* @__PURE__ */ jsxs(Paper, {
239
+ detail.error && /* @__PURE__ */ jsx(Section, {
240
+ title: "Error",
542
241
  p: "sm",
543
- radius: "md",
544
- withBorder: true,
545
- children: [/* @__PURE__ */ jsx(Text$1, {
242
+ children: /* @__PURE__ */ jsx(Text$1, {
546
243
  size: "sm",
547
- fw: 600,
548
- mb: "xs",
549
- children: "Error"
550
- }), /* @__PURE__ */ jsx(Paper, {
551
- p: "xs",
552
- radius: "sm",
553
- withBorder: true,
554
- children: /* @__PURE__ */ jsx(Text$1, {
555
- size: "sm",
556
- style: {
557
- whiteSpace: "pre-wrap",
558
- wordBreak: "break-word"
559
- },
560
- children: detail.error
561
- })
562
- })]
244
+ style: {
245
+ whiteSpace: "pre-wrap",
246
+ wordBreak: "break-word"
247
+ },
248
+ children: detail.error
249
+ })
563
250
  }),
564
- detail.logs && detail.logs.length > 0 && /* @__PURE__ */ jsxs(Paper, {
251
+ detail.logs && detail.logs.length > 0 && /* @__PURE__ */ jsx(Section, {
252
+ title: `Logs (${detail.logs.length})`,
565
253
  p: "sm",
566
- radius: "md",
567
- withBorder: true,
568
- children: [/* @__PURE__ */ jsxs(Text$1, {
569
- size: "sm",
570
- fw: 600,
571
- mb: "xs",
572
- children: [
573
- "Logs (",
574
- detail.logs.length,
575
- ")"
576
- ]
577
- }), /* @__PURE__ */ jsx(Flex$1, {
254
+ children: /* @__PURE__ */ jsx(Flex$1, {
578
255
  direction: "column",
579
256
  style: {
580
257
  maxHeight: 400,
@@ -618,12 +295,379 @@ const ExecutionDetailContent = ({ item, onRetry, onCancel }) => {
618
295
  ]
619
296
  }, i)) })]
620
297
  })
621
- })]
298
+ })
622
299
  })
623
300
  ]
624
301
  });
625
302
  };
303
+ const JobExecutionsPanel = ({ item, cronMap, failureMap }) => {
304
+ const client = useClient();
305
+ const { l } = useI18n();
306
+ const toast = useToast();
307
+ const dialog = useDialog();
308
+ const [refreshKey, setRefreshKey] = useState(0);
309
+ const cron = cronMap.get(item.name);
310
+ const failure = failureMap.get(item.name);
311
+ const handleRetry = useCallback(async (id) => {
312
+ try {
313
+ await client.retryJobExecution({ params: { id } });
314
+ toast.success("Execution retried");
315
+ setRefreshKey((k) => k + 1);
316
+ } catch {
317
+ toast.danger("Failed to retry execution");
318
+ }
319
+ }, [client, toast]);
320
+ const handleCancel = useCallback(async (id) => {
321
+ if (!await dialog.confirm({
322
+ title: "Cancel Execution",
323
+ message: "Are you sure you want to cancel this execution?",
324
+ confirmLabel: "Cancel",
325
+ confirmColor: "red"
326
+ })) return;
327
+ try {
328
+ await client.cancelJobExecution({ params: { id } });
329
+ toast.success("Execution cancelled");
330
+ setRefreshKey((k) => k + 1);
331
+ } catch {
332
+ toast.danger("Failed to cancel execution");
333
+ }
334
+ }, [
335
+ client,
336
+ dialog,
337
+ toast
338
+ ]);
339
+ const detailItems = [
340
+ {
341
+ label: "Cron",
342
+ value: item.cron ? /* @__PURE__ */ jsx(Text$1, {
343
+ size: "sm",
344
+ ff: "monospace",
345
+ children: item.cron
346
+ }) : void 0,
347
+ hidden: !item.cron
348
+ },
349
+ {
350
+ label: "Timeout",
351
+ value: item.timeout,
352
+ hidden: !item.timeout
353
+ },
354
+ {
355
+ label: "Retry",
356
+ value: item.retry ? `${item.retry.retries}x${item.retry.hasBackoff ? " (backoff)" : ""}` : void 0,
357
+ hidden: !item.retry
358
+ },
359
+ {
360
+ label: "Batch",
361
+ value: item.batch ? `${item.batch.size} / ${item.batch.window}` : void 0,
362
+ hidden: !item.batch
363
+ },
364
+ {
365
+ label: "Schema",
366
+ value: item.hasSchema ? "Yes" : "No"
367
+ }
368
+ ];
369
+ return /* @__PURE__ */ jsxs(Flex$1, {
370
+ direction: "column",
371
+ gap: "sm",
372
+ p: "sm",
373
+ children: [
374
+ cron?.lastExecution && /* @__PURE__ */ jsxs(Flex$1, {
375
+ gap: "lg",
376
+ wrap: "wrap",
377
+ align: "center",
378
+ children: [
379
+ /* @__PURE__ */ jsx(Text$1, {
380
+ size: "xs",
381
+ c: "dimmed",
382
+ tt: "uppercase",
383
+ fw: 600,
384
+ children: "Last Run"
385
+ }),
386
+ /* @__PURE__ */ jsxs(Flex$1, {
387
+ align: "center",
388
+ gap: 4,
389
+ children: [cron.lastExecution.status === "completed" ? /* @__PURE__ */ jsx(IconCircleCheck, {
390
+ size: 14,
391
+ color: "var(--mantine-color-dimmed)"
392
+ }) : /* @__PURE__ */ jsx(IconCircleX, {
393
+ size: 14,
394
+ color: "var(--mantine-color-dimmed)"
395
+ }), /* @__PURE__ */ jsx(Text$1, {
396
+ size: "xs",
397
+ tt: "capitalize",
398
+ children: cron.lastExecution.status
399
+ })]
400
+ }),
401
+ cron.lastExecution.startedAt && /* @__PURE__ */ jsx(Text$1, {
402
+ size: "xs",
403
+ c: "dimmed",
404
+ children: l(cron.lastExecution.startedAt, { date: "fromNow" })
405
+ }),
406
+ cron.lastExecution.error && /* @__PURE__ */ jsx(Text$1, {
407
+ size: "xs",
408
+ c: "dimmed",
409
+ lineClamp: 1,
410
+ children: cron.lastExecution.error
411
+ })
412
+ ]
413
+ }),
414
+ failure && /* @__PURE__ */ jsxs(Flex$1, {
415
+ gap: "lg",
416
+ wrap: "wrap",
417
+ align: "center",
418
+ children: [
419
+ /* @__PURE__ */ jsx(Text$1, {
420
+ size: "xs",
421
+ c: "dimmed",
422
+ tt: "uppercase",
423
+ fw: 600,
424
+ children: "Failures (7d)"
425
+ }),
426
+ /* @__PURE__ */ jsx(Text$1, {
427
+ size: "xs",
428
+ fw: 500,
429
+ children: failure.failures
430
+ }),
431
+ failure.lastError && /* @__PURE__ */ jsx(Text$1, {
432
+ size: "xs",
433
+ c: "dimmed",
434
+ lineClamp: 1,
435
+ style: { maxWidth: 400 },
436
+ children: failure.lastError
437
+ })
438
+ ]
439
+ }),
440
+ /* @__PURE__ */ jsx(DetailList, {
441
+ items: detailItems,
442
+ columns: 3
443
+ }),
444
+ /* @__PURE__ */ jsx(DataTable, {
445
+ submitOnInit: true,
446
+ defaultSize: 10,
447
+ tableProps: {
448
+ horizontalSpacing: "sm",
449
+ verticalSpacing: "sm"
450
+ },
451
+ items: async () => {
452
+ return await client.findJobExecutions({ query: { job: item.name } });
453
+ },
454
+ columns: {
455
+ status: {
456
+ label: "Status",
457
+ value: (exec) => {
458
+ return /* @__PURE__ */ jsx(Badge, {
459
+ size: "sm",
460
+ variant: "light",
461
+ color: exec.status === "completed" ? "green" : exec.status === "running" ? "blue" : exec.status === "failed" || exec.status === "dead" ? "red" : exec.status === "cancelled" ? "yellow" : "gray",
462
+ children: exec.status
463
+ });
464
+ }
465
+ },
466
+ jobName: {
467
+ label: "Job",
468
+ value: (exec) => /* @__PURE__ */ jsx(Text$1, {
469
+ size: "sm",
470
+ fw: 500,
471
+ ff: "monospace",
472
+ children: exec.jobName
473
+ })
474
+ },
475
+ attempt: {
476
+ label: "Attempt",
477
+ value: (exec) => /* @__PURE__ */ jsxs(Text$1, {
478
+ size: "sm",
479
+ ff: "monospace",
480
+ children: [
481
+ exec.attempt,
482
+ "/",
483
+ exec.maxAttempts
484
+ ]
485
+ })
486
+ },
487
+ startedAt: {
488
+ label: "Started",
489
+ value: (exec) => /* @__PURE__ */ jsx(Text$1, {
490
+ size: "xs",
491
+ c: "dimmed",
492
+ children: exec.startedAt ? l(exec.startedAt, { date: "fromNow" }) : "—"
493
+ })
494
+ },
495
+ duration: {
496
+ label: "Duration",
497
+ value: (exec) => /* @__PURE__ */ jsx(Text$1, {
498
+ size: "xs",
499
+ c: "dimmed",
500
+ ff: "monospace",
501
+ children: exec.startedAt && (exec.completedAt || exec.status === "running") ? formatDuration(exec.startedAt, exec.completedAt) : "—"
502
+ })
503
+ }
504
+ },
505
+ rowActions: (exec) => [{
506
+ label: "Retry",
507
+ icon: IconRefresh,
508
+ onClick: () => handleRetry(exec.id),
509
+ visible: exec.can?.retry
510
+ }, {
511
+ label: "Cancel",
512
+ icon: IconCircleX,
513
+ onClick: () => handleCancel(exec.id),
514
+ visible: exec.can?.cancel
515
+ }],
516
+ drawer: (exec) => /* @__PURE__ */ jsx(ExecutionDetailContent, {
517
+ item: exec,
518
+ onRetry: handleRetry,
519
+ onCancel: handleCancel
520
+ })
521
+ }, `executions-${item.name}-${refreshKey}`)
522
+ ]
523
+ });
524
+ };
525
+ const AdminJobs = () => {
526
+ const client = useClient();
527
+ const toast = useToast();
528
+ const dialog = useDialog();
529
+ const [refreshKey, setRefreshKey] = useState(0);
530
+ const [cronMap, setCronMap] = useState(/* @__PURE__ */ new Map());
531
+ const [queueMap, setQueueMap] = useState(/* @__PURE__ */ new Map());
532
+ const [failureMap, setFailureMap] = useState(/* @__PURE__ */ new Map());
533
+ const loadExtraData = useCallback(async () => {
534
+ try {
535
+ const [cronData, queueData, failureData] = await Promise.all([
536
+ client.getCronJobs(),
537
+ client.getJobQueueDepth(),
538
+ client.getJobTopFailures()
539
+ ]);
540
+ setCronMap(new Map(cronData.map((c) => [c.name, c])));
541
+ setQueueMap(new Map(queueData.map((q) => [q.jobName, q])));
542
+ setFailureMap(new Map(failureData.map((f) => [f.jobName, f])));
543
+ } catch {}
544
+ }, [client]);
545
+ useEffect(() => {
546
+ loadExtraData();
547
+ }, [loadExtraData, refreshKey]);
548
+ const handleTriggerJob = useCallback(async (name) => {
549
+ if (!await dialog.confirm({
550
+ title: "Trigger Job",
551
+ message: `Are you sure you want to trigger "${name}" manually?`,
552
+ confirmLabel: "Trigger",
553
+ confirmColor: "blue"
554
+ })) return;
555
+ return client.triggerJob({ body: { name } }).then(() => {
556
+ toast.success(`Job "${name}" triggered`);
557
+ setRefreshKey((k) => k + 1);
558
+ });
559
+ }, [
560
+ client,
561
+ dialog,
562
+ toast
563
+ ]);
564
+ return /* @__PURE__ */ jsx(Flex$1, {
565
+ p: "md",
566
+ flex: 1,
567
+ direction: "column",
568
+ gap: "md",
569
+ children: /* @__PURE__ */ jsx(DataTable, {
570
+ submitOnInit: true,
571
+ typeFormProps: {
572
+ skipSubmitButton: true,
573
+ columns: 1
574
+ },
575
+ tableProps: {
576
+ horizontalSpacing: "sm",
577
+ verticalSpacing: "sm"
578
+ },
579
+ onFilterChange: (_key, _value, form) => form.submit(),
580
+ filters: registryFilters,
581
+ items: async (filters) => {
582
+ const items = await client.getJobRegistry();
583
+ return { content: filters.type ? items.filter((i) => i.type === filters.type) : items };
584
+ },
585
+ columns: {
586
+ name: {
587
+ label: "Name",
588
+ value: (item) => /* @__PURE__ */ jsx(Text$1, {
589
+ size: "sm",
590
+ fw: 500,
591
+ ff: "monospace",
592
+ children: item.name
593
+ })
594
+ },
595
+ type: {
596
+ label: "Type",
597
+ value: (item) => /* @__PURE__ */ jsx(Badge, {
598
+ size: "sm",
599
+ variant: "default",
600
+ children: item.type
601
+ })
602
+ },
603
+ priority: {
604
+ label: "Priority",
605
+ value: (item) => /* @__PURE__ */ jsx(Text$1, {
606
+ size: "sm",
607
+ tt: "capitalize",
608
+ children: item.priority
609
+ })
610
+ },
611
+ concurrency: {
612
+ label: "Concurrency",
613
+ value: (item) => /* @__PURE__ */ jsx(Text$1, {
614
+ size: "sm",
615
+ ff: "monospace",
616
+ children: item.concurrency
617
+ })
618
+ },
619
+ queue: {
620
+ label: "Queue",
621
+ value: (item) => {
622
+ const q = queueMap.get(item.name);
623
+ if (!q || q.pending + q.running + q.scheduled + q.retrying + q.dead === 0) return /* @__PURE__ */ jsx(Text$1, {
624
+ size: "xs",
625
+ c: "dimmed",
626
+ children: "—"
627
+ });
628
+ return /* @__PURE__ */ jsxs(Flex$1, {
629
+ gap: 4,
630
+ children: [
631
+ q.running > 0 && /* @__PURE__ */ jsxs(Badge, {
632
+ size: "xs",
633
+ variant: "default",
634
+ children: [q.running, " run"]
635
+ }),
636
+ q.pending > 0 && /* @__PURE__ */ jsxs(Badge, {
637
+ size: "xs",
638
+ variant: "default",
639
+ children: [q.pending, " pen"]
640
+ }),
641
+ q.retrying > 0 && /* @__PURE__ */ jsxs(Badge, {
642
+ size: "xs",
643
+ variant: "default",
644
+ children: [q.retrying, " retry"]
645
+ }),
646
+ q.dead > 0 && /* @__PURE__ */ jsxs(Badge, {
647
+ size: "xs",
648
+ variant: "default",
649
+ children: [q.dead, " dead"]
650
+ })
651
+ ]
652
+ });
653
+ }
654
+ }
655
+ },
656
+ rowActions: (item) => [{
657
+ label: "Trigger",
658
+ color: "blue",
659
+ icon: IconPlayerPlay,
660
+ onClick: () => handleTriggerJob(item.name)
661
+ }],
662
+ panel: (item) => /* @__PURE__ */ jsx(JobExecutionsPanel, {
663
+ item,
664
+ cronMap,
665
+ failureMap
666
+ })
667
+ }, `registry-${refreshKey}`)
668
+ });
669
+ };
626
670
  //#endregion
627
- export { AdminJobExecutions as default };
671
+ export { AdminJobs as default };
628
672
 
629
- //# sourceMappingURL=AdminJobExecutions-D-G8RIlr.js.map
673
+ //# sourceMappingURL=AdminJobs-D1_QGCDy.js.map