@alepha/ui 0.18.3 → 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 (181) hide show
  1. package/dist/admin/{AdminApiKeys-Dy_k-4Vd.js → AdminApiKeys-C2ze85eD.js} +3 -4
  2. package/dist/admin/{AdminApiKeys-Dy_k-4Vd.js.map → AdminApiKeys-C2ze85eD.js.map} +1 -1
  3. package/dist/admin/{AdminAudits-CKiFMSSU.js → AdminAudits-BIj81e4k.js} +3 -4
  4. package/dist/admin/{AdminAudits-CKiFMSSU.js.map → AdminAudits-BIj81e4k.js.map} +1 -1
  5. package/dist/admin/{AdminDashboard-PhC_dZqo.js → AdminDashboard-PMVzrwSu.js} +3 -4
  6. package/dist/admin/{AdminDashboard-PhC_dZqo.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-D9E-CS-U.js → AdminJobs-D1_QGCDy.js} +401 -358
  10. package/dist/admin/AdminJobs-D1_QGCDy.js.map +1 -0
  11. package/dist/admin/{AdminLayout-I6TlUMPc.js → AdminLayout-BNiwiw2D.js} +8 -25
  12. package/dist/admin/AdminLayout-BNiwiw2D.js.map +1 -0
  13. package/dist/admin/{AdminNotifications-ZPHCYrv7.js → AdminNotifications-DSKQtUfn.js} +85 -124
  14. package/dist/admin/AdminNotifications-DSKQtUfn.js.map +1 -0
  15. package/dist/admin/{AdminParameters-CqgvhRsb.js → AdminParameters-CoB7EhyM.js} +3 -12
  16. package/dist/admin/{AdminParameters-CqgvhRsb.js.map → AdminParameters-CoB7EhyM.js.map} +1 -1
  17. package/dist/admin/{AdminSessions-Bz5NRuoW.js → AdminSessions-DFbFcrJQ.js} +3 -4
  18. package/dist/admin/{AdminSessions-Bz5NRuoW.js.map → AdminSessions-DFbFcrJQ.js.map} +1 -1
  19. package/dist/admin/{AdminUserLayout-lXT6I0Qq.js → AdminUserLayout-fSfi3KMm.js} +72 -111
  20. package/dist/admin/AdminUserLayout-fSfi3KMm.js.map +1 -0
  21. package/dist/admin/{AdminUserProfile-vFBLoJ3h.js → AdminUserProfile-_C-h8vUK.js} +7 -6
  22. package/dist/admin/AdminUserProfile-_C-h8vUK.js.map +1 -0
  23. package/dist/admin/{AdminUserSessions-CT_YDim0.js → AdminUserSessions-KpJHIeQo.js} +3 -4
  24. package/dist/admin/{AdminUserSessions-CT_YDim0.js.map → AdminUserSessions-KpJHIeQo.js.map} +1 -1
  25. package/dist/admin/{AdminUsers-D1UfGya9.js → AdminUsers-DcVrzdQP.js} +4 -4
  26. package/dist/admin/AdminUsers-DcVrzdQP.js.map +1 -0
  27. package/dist/admin/{AuthLayout-_frhdgOO.js → AuthLayout-CazfLzcf.js} +3 -4
  28. package/dist/admin/{AuthLayout-_frhdgOO.js.map → AuthLayout-CazfLzcf.js.map} +1 -1
  29. package/dist/{demo/IconGoogle-CSQLPYwX.js → admin/IconGoogle-8Nkx6yax.js} +2 -4
  30. package/dist/admin/{IconGoogle-Ch1m3Uzl.js.map → IconGoogle-8Nkx6yax.js.map} +1 -1
  31. package/dist/admin/{Login-xtNmQtGh.js → Login-CaMjUrDP.js} +5 -6
  32. package/dist/{auth/Login-BA1E8IZl.js.map → admin/Login-CaMjUrDP.js.map} +1 -1
  33. package/dist/admin/{Profile-_AtPUwAP.js → Profile-Ca4fZX15.js} +3 -5
  34. package/dist/{demo/Profile-DS5q4vOh.js.map → admin/Profile-Ca4fZX15.js.map} +1 -1
  35. package/dist/admin/{Register-JcCjHUUn.js → Register-C5DyKWPO.js} +5 -6
  36. package/dist/{demo/Register-B4hLBeEv.js.map → admin/Register-C5DyKWPO.js.map} +1 -1
  37. package/dist/admin/{ResetPassword-CwGBPLJO.js → ResetPassword-BA5sAgXo.js} +4 -5
  38. package/dist/{auth/ResetPassword-DCtGcneA.js.map → admin/ResetPassword-BA5sAgXo.js.map} +1 -1
  39. package/dist/admin/{VerifyEmail-hNxWejWf.js → VerifyEmail-DKNXROj_.js} +4 -5
  40. package/dist/{auth/VerifyEmail-DkH7NBfn.js.map → admin/VerifyEmail-DKNXROj_.js.map} +1 -1
  41. package/dist/admin/adminUserAtom-BLNc7XbT.js +11 -0
  42. package/dist/admin/adminUserAtom-BLNc7XbT.js.map +1 -0
  43. package/dist/admin/{core-CYaRQ8O-.js → core-CJCEx18C.js} +132 -86
  44. package/dist/admin/core-CJCEx18C.js.map +1 -0
  45. package/dist/admin/index.d.ts +80 -13
  46. package/dist/admin/index.d.ts.map +1 -1
  47. package/dist/admin/index.js +38 -68
  48. package/dist/admin/index.js.map +1 -1
  49. package/dist/admin/rolldown-runtime-CiIaOW0V.js +13 -0
  50. package/dist/{demo/AuthLayout-Brri4A-L.js → auth/AuthLayout-vXPcCVzp.js} +3 -4
  51. package/dist/auth/{AuthLayout-AvLlcLjS.js.map → AuthLayout-vXPcCVzp.js.map} +1 -1
  52. package/dist/{admin/IconGoogle-Ch1m3Uzl.js → auth/IconGoogle-8Nkx6yax.js} +2 -4
  53. package/dist/auth/{IconGoogle-Ch1m3Uzl.js.map → IconGoogle-8Nkx6yax.js.map} +1 -1
  54. package/dist/auth/{Login-BA1E8IZl.js → Login-Dg08QR20.js} +5 -6
  55. package/dist/{demo/Login-C12N4oGs.js.map → auth/Login-Dg08QR20.js.map} +1 -1
  56. package/dist/{demo/Profile-DS5q4vOh.js → auth/Profile-Bb5O1yeh.js} +3 -5
  57. package/dist/auth/{Profile-YcWdeuFz.js.map → Profile-Bb5O1yeh.js.map} +1 -1
  58. package/dist/auth/{Register-CPhEO5MG.js → Register-B2AN71NC.js} +5 -6
  59. package/dist/{admin/Register-JcCjHUUn.js.map → auth/Register-B2AN71NC.js.map} +1 -1
  60. package/dist/{demo/ResetPassword-D8g9ha1N.js → auth/ResetPassword-BLxwzbDj.js} +4 -5
  61. package/dist/{admin/ResetPassword-CwGBPLJO.js.map → auth/ResetPassword-BLxwzbDj.js.map} +1 -1
  62. package/dist/auth/{VerifyEmail-DkH7NBfn.js → VerifyEmail-CSDOk3Zm.js} +4 -5
  63. package/dist/{admin/VerifyEmail-hNxWejWf.js.map → auth/VerifyEmail-CSDOk3Zm.js.map} +1 -1
  64. package/dist/auth/{core-D5jIAVF2.js → core-DuGkjPiU.js} +23 -54
  65. package/dist/auth/core-DuGkjPiU.js.map +1 -0
  66. package/dist/auth/index.d.ts +20 -6
  67. package/dist/auth/index.d.ts.map +1 -1
  68. package/dist/auth/index.js +13 -18
  69. package/dist/auth/index.js.map +1 -1
  70. package/dist/auth/rolldown-runtime-CiIaOW0V.js +13 -0
  71. package/dist/core/index.d.ts +78 -20
  72. package/dist/core/index.d.ts.map +1 -1
  73. package/dist/core/index.js +130 -98
  74. package/dist/core/index.js.map +1 -1
  75. package/dist/{auth/AuthLayout-AvLlcLjS.js → demo/AuthLayout-DPsOOG4u.js} +3 -4
  76. package/dist/demo/{AuthLayout-Brri4A-L.js.map → AuthLayout-DPsOOG4u.js.map} +1 -1
  77. package/dist/demo/{DemoButton-wiCxZZ_L.js → DemoButton-wzcqGk4u.js} +4 -5
  78. package/dist/demo/{DemoButton-wiCxZZ_L.js.map → DemoButton-wzcqGk4u.js.map} +1 -1
  79. package/dist/demo/{DemoControlSelect-D7ILObVg.js → DemoControlSelect-CMWvQ6Gm.js} +4 -5
  80. package/dist/demo/{DemoControlSelect-D7ILObVg.js.map → DemoControlSelect-CMWvQ6Gm.js.map} +1 -1
  81. package/dist/demo/{DemoDataTable-DZ5Y8pFX.js → DemoDataTable-CHsAP3e2.js} +4 -5
  82. package/dist/demo/{DemoDataTable-DZ5Y8pFX.js.map → DemoDataTable-CHsAP3e2.js.map} +1 -1
  83. package/dist/demo/{DemoDialog-CUWdLHim.js → DemoDialog-Co2IePxX.js} +3 -4
  84. package/dist/demo/{DemoDialog-CUWdLHim.js.map → DemoDialog-Co2IePxX.js.map} +1 -1
  85. package/dist/demo/{DemoFlex-a8OhMMvq.js → DemoFlex-OEwQt5do.js} +4 -5
  86. package/dist/demo/{DemoFlex-a8OhMMvq.js.map → DemoFlex-OEwQt5do.js.map} +1 -1
  87. package/dist/demo/DemoHeading-Db-XkQIK.js +69 -0
  88. package/dist/demo/DemoHeading-Db-XkQIK.js.map +1 -0
  89. package/dist/demo/{DemoHome-D_De3UiT.js → DemoHome-Cyp29ygy.js} +4 -5
  90. package/dist/demo/{DemoHome-D_De3UiT.js.map → DemoHome-Cyp29ygy.js.map} +1 -1
  91. package/dist/demo/{DemoJsonViewer-B50s9aGM.js → DemoJsonViewer-DXtCeMzH.js} +4 -5
  92. package/dist/demo/{DemoJsonViewer-B50s9aGM.js.map → DemoJsonViewer-DXtCeMzH.js.map} +1 -1
  93. package/dist/demo/{DemoLayout-CHU8WTwO.js → DemoLayout-hh9VmZQP.js} +4 -5
  94. package/dist/demo/DemoLayout-hh9VmZQP.js.map +1 -0
  95. package/dist/demo/{DemoLogin-BBlrWpml.js → DemoLogin-DX7mnmkh.js} +15 -11
  96. package/dist/demo/{DemoLogin-BBlrWpml.js.map → DemoLogin-DX7mnmkh.js.map} +1 -1
  97. package/dist/demo/{DemoRegister-BuNE3_-f.js → DemoRegister-DVcZl04m.js} +15 -11
  98. package/dist/demo/{DemoRegister-BuNE3_-f.js.map → DemoRegister-DVcZl04m.js.map} +1 -1
  99. package/dist/demo/{DemoResetPassword-D_IjjjOJ.js → DemoResetPassword-CPENlZH5.js} +15 -11
  100. package/dist/demo/{DemoResetPassword-D_IjjjOJ.js.map → DemoResetPassword-CPENlZH5.js.map} +1 -1
  101. package/dist/demo/{DemoSidebar-Giy2HRBD.js → DemoSidebar-CGu7DZeM.js} +4 -5
  102. package/dist/demo/{DemoSidebar-Giy2HRBD.js.map → DemoSidebar-CGu7DZeM.js.map} +1 -1
  103. package/dist/demo/{DemoText-ubcw-vog.js → DemoText-DYUJ7bY_.js} +4 -5
  104. package/dist/demo/{DemoText-ubcw-vog.js.map → DemoText-DYUJ7bY_.js.map} +1 -1
  105. package/dist/demo/{DemoToast-9die_dYT.js → DemoToast-CgdnZNvx.js} +3 -4
  106. package/dist/demo/{DemoToast-9die_dYT.js.map → DemoToast-CgdnZNvx.js.map} +1 -1
  107. package/dist/demo/{DemoTypeForm-D_d6OVKL.js → DemoTypeForm-Pims-cGa.js} +4 -5
  108. package/dist/demo/{DemoTypeForm-D_d6OVKL.js.map → DemoTypeForm-Pims-cGa.js.map} +1 -1
  109. package/dist/demo/{DemoVerifyEmail-B43KlF4F.js → DemoVerifyEmail-C7B3xxch.js} +10 -11
  110. package/dist/demo/{DemoVerifyEmail-B43KlF4F.js.map → DemoVerifyEmail-C7B3xxch.js.map} +1 -1
  111. package/dist/{auth/IconGoogle-Ch1m3Uzl.js → demo/IconGoogle-CwQy4G9y.js} +2 -4
  112. package/dist/demo/{IconGoogle-CSQLPYwX.js.map → IconGoogle-CwQy4G9y.js.map} +1 -1
  113. package/dist/demo/{Login-C12N4oGs.js → Login-pwMF4TUj.js} +5 -6
  114. package/dist/{admin/Login-xtNmQtGh.js.map → demo/Login-pwMF4TUj.js.map} +1 -1
  115. package/dist/{auth/Profile-YcWdeuFz.js → demo/Profile-BliZapZS.js} +3 -5
  116. package/dist/{admin/Profile-_AtPUwAP.js.map → demo/Profile-BliZapZS.js.map} +1 -1
  117. package/dist/demo/{Register-B4hLBeEv.js → Register-CiwAT7Hy.js} +5 -6
  118. package/dist/{auth/Register-CPhEO5MG.js.map → demo/Register-CiwAT7Hy.js.map} +1 -1
  119. package/dist/{auth/ResetPassword-DCtGcneA.js → demo/ResetPassword-l9Vg4JE-.js} +4 -5
  120. package/dist/demo/{ResetPassword-D8g9ha1N.js.map → ResetPassword-l9Vg4JE-.js.map} +1 -1
  121. package/dist/demo/{Showcase-D6Fxt4X4.js → Showcase-CX6bDgwe.js} +3 -5
  122. package/dist/demo/{Showcase-D6Fxt4X4.js.map → Showcase-CX6bDgwe.js.map} +1 -1
  123. package/dist/demo/{VerifyEmail-BjDo0cZA.js → VerifyEmail-CAB-OS7i.js} +4 -5
  124. package/dist/demo/{VerifyEmail-BjDo0cZA.js.map → VerifyEmail-CAB-OS7i.js.map} +1 -1
  125. package/dist/demo/{auth-ByVTreDl.js → auth-uegJAdKu.js} +18 -35
  126. package/dist/demo/{auth-ByVTreDl.js.map → auth-uegJAdKu.js.map} +1 -1
  127. package/dist/demo/{core-DFgB3yU4.js → core-B4LVHzPn.js} +132 -93
  128. package/dist/demo/core-B4LVHzPn.js.map +1 -0
  129. package/dist/demo/index.js +20 -23
  130. package/dist/demo/index.js.map +1 -1
  131. package/dist/demo/rolldown-runtime-CiIaOW0V.js +13 -0
  132. package/package.json +17 -20
  133. package/src/admin/AdminRouter.tsx +23 -38
  134. package/src/admin/atoms/adminUserAtom.ts +7 -0
  135. package/src/admin/components/AdminLayout.tsx +2 -14
  136. package/src/admin/components/files/AdminFiles.tsx +123 -1
  137. package/src/admin/components/jobs/{AdminJobExecutions.tsx → AdminJobs.tsx} +450 -317
  138. package/src/admin/components/notifications/AdminNotifications.tsx +11 -25
  139. package/src/admin/components/users/AdminUserLayout.tsx +84 -127
  140. package/src/admin/components/users/AdminUserProfile.tsx +5 -2
  141. package/src/admin/components/users/AdminUsers.tsx +1 -1
  142. package/src/core/components/Flex.tsx +24 -0
  143. package/src/core/components/Section.tsx +109 -0
  144. package/src/core/components/SectionHeader.tsx +106 -0
  145. package/src/core/components/buttons/ActionButton.tsx +1 -0
  146. package/src/core/components/dialogs/PromptDialog.tsx +1 -1
  147. package/src/core/components/layout/Breadcrumb.tsx +2 -2
  148. package/src/core/components/layout/DashboardShell.tsx +1 -1
  149. package/src/core/index.ts +4 -1
  150. package/src/core/services/DialogService.tsx +2 -2
  151. package/src/core/styles.css +2 -1
  152. package/src/core/table/components/DataTable.tsx +5 -2
  153. package/src/demo/DemoRouter.ts +1 -1
  154. package/src/demo/components/auth/DemoLogin.tsx +5 -0
  155. package/src/demo/components/auth/DemoRegister.tsx +5 -0
  156. package/src/demo/components/auth/DemoResetPassword.tsx +5 -0
  157. package/src/demo/components/core/DemoHeading.tsx +56 -3
  158. package/dist/admin/AdminFiles-DFTjijGp.js +0 -111
  159. package/dist/admin/AdminFiles-DFTjijGp.js.map +0 -1
  160. package/dist/admin/AdminJobDashboard-BL8gGPDp.js +0 -354
  161. package/dist/admin/AdminJobDashboard-BL8gGPDp.js.map +0 -1
  162. package/dist/admin/AdminJobExecutions-D9E-CS-U.js.map +0 -1
  163. package/dist/admin/AdminJobRegistry-Ci9ue1zC.js +0 -270
  164. package/dist/admin/AdminJobRegistry-Ci9ue1zC.js.map +0 -1
  165. package/dist/admin/AdminLayout-I6TlUMPc.js.map +0 -1
  166. package/dist/admin/AdminNotifications-ZPHCYrv7.js.map +0 -1
  167. package/dist/admin/AdminUserLayout-lXT6I0Qq.js.map +0 -1
  168. package/dist/admin/AdminUserProfile-vFBLoJ3h.js.map +0 -1
  169. package/dist/admin/AdminUsers-D1UfGya9.js.map +0 -1
  170. package/dist/admin/core-CYaRQ8O-.js.map +0 -1
  171. package/dist/admin/rolldown-runtime-CjeV3_4I.js +0 -18
  172. package/dist/auth/core-D5jIAVF2.js.map +0 -1
  173. package/dist/auth/rolldown-runtime-CjeV3_4I.js +0 -18
  174. package/dist/demo/DemoHeading-C13OVDfS.js +0 -18
  175. package/dist/demo/DemoHeading-C13OVDfS.js.map +0 -1
  176. package/dist/demo/DemoLayout-CHU8WTwO.js.map +0 -1
  177. package/dist/demo/core-DFgB3yU4.js.map +0 -1
  178. package/dist/demo/rolldown-runtime-CjeV3_4I.js +0 -18
  179. package/src/admin/components/jobs/AdminJobDashboard.tsx +0 -349
  180. package/src/admin/components/jobs/AdminJobRegistry.tsx +0 -301
  181. package/src/core/components/Heading.tsx +0 -19
@@ -1,13 +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-CYaRQ8O-.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
-
10
- //#region ../../src/admin/components/jobs/AdminJobExecutions.tsx
9
+ //#region ../../src/admin/components/jobs/AdminJobs.tsx
11
10
  const PRIORITY_LABELS = {
12
11
  0: "Critical",
13
12
  1: "High",
@@ -22,302 +21,12 @@ const formatDuration = (start, end) => {
22
21
  if (duration < 36e5) return `${Math.floor(duration / 6e4)}m ${Math.floor(duration % 6e4 / 1e3)}s`;
23
22
  return `${Math.floor(duration / 36e5)}h ${Math.floor(duration % 36e5 / 6e4)}m`;
24
23
  };
25
- const executionFilters = t.object({
26
- job: t.optional(t.string()),
27
- status: t.optional(t.enum([
28
- "pending",
29
- "scheduled",
30
- "retrying",
31
- "running",
32
- "completed",
33
- "failed",
34
- "dead",
35
- "cancelled"
36
- ])),
37
- priority: t.optional(t.enum([
38
- "critical",
39
- "high",
40
- "normal",
41
- "low"
42
- ]))
43
- });
44
- const AdminJobExecutions = () => {
45
- const client = useClient();
46
- const { l } = useI18n();
47
- const toast = useToast();
48
- const dialog = useDialog();
49
- const [refreshKey, setRefreshKey] = useState(0);
50
- const handleRetry = useCallback(async (id) => {
51
- try {
52
- await client.retryJobExecution({ params: { id } });
53
- toast.success("Execution retried");
54
- setRefreshKey((k) => k + 1);
55
- } catch {
56
- toast.danger("Failed to retry execution");
57
- }
58
- }, [client, toast]);
59
- const handleCancel = useCallback(async (id) => {
60
- if (!await dialog.confirm({
61
- title: "Cancel Execution",
62
- message: "Are you sure you want to cancel this execution?",
63
- confirmLabel: "Cancel",
64
- confirmColor: "red"
65
- })) return;
66
- try {
67
- await client.cancelJobExecution({ params: { id } });
68
- toast.success("Execution cancelled");
69
- setRefreshKey((k) => k + 1);
70
- } catch {
71
- toast.danger("Failed to cancel execution");
72
- }
73
- }, [
74
- client,
75
- dialog,
76
- toast
77
- ]);
78
- return /* @__PURE__ */ jsx(Flex$1, {
79
- p: "md",
80
- flex: 1,
81
- direction: "column",
82
- gap: "md",
83
- children: /* @__PURE__ */ jsx(DataTable, {
84
- submitOnInit: true,
85
- defaultSize: 20,
86
- typeFormProps: {
87
- skipSubmitButton: true,
88
- columns: 3
89
- },
90
- tableProps: {
91
- horizontalSpacing: "sm",
92
- verticalSpacing: "sm"
93
- },
94
- onFilterChange: (_key, _value, form) => form.submit(),
95
- filters: executionFilters,
96
- defaultFilters: ["job", "status"],
97
- items: async (filters) => {
98
- return await client.findJobExecutions({ query: { ...filters } });
99
- },
100
- columns: {
101
- status: {
102
- label: "Status",
103
- value: (item) => {
104
- return /* @__PURE__ */ jsx(Badge, {
105
- size: "sm",
106
- variant: "light",
107
- color: item.status === "completed" ? "green" : item.status === "running" ? "blue" : item.status === "failed" || item.status === "dead" ? "red" : item.status === "cancelled" ? "yellow" : "gray",
108
- children: item.status
109
- });
110
- }
111
- },
112
- jobName: {
113
- label: "Job",
114
- value: (item) => /* @__PURE__ */ jsx(Text$1, {
115
- size: "sm",
116
- fw: 500,
117
- ff: "monospace",
118
- children: item.jobName
119
- })
120
- },
121
- priority: {
122
- label: "Priority",
123
- value: (item) => /* @__PURE__ */ jsx(Text$1, {
124
- size: "xs",
125
- c: "dimmed",
126
- children: PRIORITY_LABELS[item.priority] ?? item.priority
127
- })
128
- },
129
- attempt: {
130
- label: "Attempt",
131
- value: (item) => /* @__PURE__ */ jsxs(Text$1, {
132
- size: "sm",
133
- ff: "monospace",
134
- children: [
135
- item.attempt,
136
- "/",
137
- item.maxAttempts
138
- ]
139
- })
140
- },
141
- triggeredByName: {
142
- label: "Trigger",
143
- defaultHidden: true,
144
- value: (item) => /* @__PURE__ */ jsx(Text$1, {
145
- size: "xs",
146
- c: "dimmed",
147
- children: item.triggeredByName ?? "—"
148
- })
149
- },
150
- createdAt: {
151
- label: "Created",
152
- defaultHidden: true,
153
- value: (item) => /* @__PURE__ */ jsx(Text$1, {
154
- size: "xs",
155
- c: "dimmed",
156
- children: l(item.createdAt, { date: "fromNow" })
157
- })
158
- },
159
- startedAt: {
160
- label: "Started",
161
- value: (item) => /* @__PURE__ */ jsx(Text$1, {
162
- size: "xs",
163
- c: "dimmed",
164
- children: item.startedAt ? l(item.startedAt, { date: "fromNow" }) : "—"
165
- })
166
- },
167
- duration: {
168
- label: "Duration",
169
- value: (item) => /* @__PURE__ */ jsx(Text$1, {
170
- size: "xs",
171
- c: "dimmed",
172
- ff: "monospace",
173
- children: item.startedAt && (item.completedAt || item.status === "running") ? formatDuration(item.startedAt, item.completedAt) : "—"
174
- })
175
- },
176
- error: {
177
- label: "Error",
178
- defaultHidden: true,
179
- value: (item) => /* @__PURE__ */ jsx(Text$1, {
180
- size: "xs",
181
- c: "dimmed",
182
- lineClamp: 1,
183
- children: item.error ?? "—"
184
- })
185
- },
186
- key: {
187
- label: "Key",
188
- defaultHidden: true,
189
- value: (item) => /* @__PURE__ */ jsx(Text$1, {
190
- size: "xs",
191
- c: "dimmed",
192
- ff: "monospace",
193
- children: item.key ?? "—"
194
- })
195
- },
196
- workerId: {
197
- label: "Worker",
198
- defaultHidden: true,
199
- value: (item) => /* @__PURE__ */ jsx(Text$1, {
200
- size: "xs",
201
- c: "dimmed",
202
- ff: "monospace",
203
- children: item.workerId ?? "—"
204
- })
205
- }
206
- },
207
- rowActions: (item) => [{
208
- label: "Retry",
209
- icon: IconRefresh,
210
- onClick: () => handleRetry(item.id),
211
- visible: item.can?.retry
212
- }, {
213
- label: "Cancel",
214
- icon: IconCircleX,
215
- onClick: () => handleCancel(item.id),
216
- visible: item.can?.cancel
217
- }],
218
- panel: {
219
- can: (item) => Boolean(item.error || item.key || item.workerId),
220
- render: (item) => /* @__PURE__ */ jsxs(Flex$1, {
221
- direction: "column",
222
- gap: "sm",
223
- p: "sm",
224
- children: [item.error && /* @__PURE__ */ jsxs(Flex$1, {
225
- direction: "column",
226
- gap: 2,
227
- children: [/* @__PURE__ */ jsx(Text$1, {
228
- size: "xs",
229
- c: "dimmed",
230
- tt: "uppercase",
231
- fw: 600,
232
- children: "Error"
233
- }), /* @__PURE__ */ jsx(Paper, {
234
- p: "xs",
235
- radius: "sm",
236
- withBorder: true,
237
- children: /* @__PURE__ */ jsx(Text$1, {
238
- size: "xs",
239
- style: {
240
- whiteSpace: "pre-wrap",
241
- wordBreak: "break-word"
242
- },
243
- children: item.error
244
- })
245
- })]
246
- }), /* @__PURE__ */ jsxs(Flex$1, {
247
- gap: "lg",
248
- wrap: "wrap",
249
- children: [
250
- /* @__PURE__ */ jsxs(Flex$1, {
251
- direction: "column",
252
- gap: 2,
253
- children: [/* @__PURE__ */ jsx(Text$1, {
254
- size: "xs",
255
- c: "dimmed",
256
- tt: "uppercase",
257
- fw: 600,
258
- children: "ID"
259
- }), /* @__PURE__ */ jsx(Text$1, {
260
- size: "xs",
261
- ff: "monospace",
262
- children: item.id
263
- })]
264
- }),
265
- item.key && /* @__PURE__ */ jsxs(Flex$1, {
266
- direction: "column",
267
- gap: 2,
268
- children: [/* @__PURE__ */ jsx(Text$1, {
269
- size: "xs",
270
- c: "dimmed",
271
- tt: "uppercase",
272
- fw: 600,
273
- children: "Key"
274
- }), /* @__PURE__ */ jsx(Text$1, {
275
- size: "xs",
276
- ff: "monospace",
277
- children: item.key
278
- })]
279
- }),
280
- item.workerId && /* @__PURE__ */ jsxs(Flex$1, {
281
- direction: "column",
282
- gap: 2,
283
- children: [/* @__PURE__ */ jsx(Text$1, {
284
- size: "xs",
285
- c: "dimmed",
286
- tt: "uppercase",
287
- fw: 600,
288
- children: "Worker"
289
- }), /* @__PURE__ */ jsx(Text$1, {
290
- size: "xs",
291
- ff: "monospace",
292
- children: item.workerId
293
- })]
294
- }),
295
- item.triggeredByName && /* @__PURE__ */ jsxs(Flex$1, {
296
- direction: "column",
297
- gap: 2,
298
- children: [/* @__PURE__ */ jsx(Text$1, {
299
- size: "xs",
300
- c: "dimmed",
301
- tt: "uppercase",
302
- fw: 600,
303
- children: "Triggered By"
304
- }), /* @__PURE__ */ jsx(Text$1, {
305
- size: "xs",
306
- children: item.triggeredByName
307
- })]
308
- })
309
- ]
310
- })]
311
- })
312
- },
313
- drawer: (item) => /* @__PURE__ */ jsx(ExecutionDetailContent, {
314
- item,
315
- onRetry: handleRetry,
316
- onCancel: handleCancel
317
- })
318
- }, `executions-${refreshKey}`)
319
- });
320
- };
24
+ const registryFilters = t.object({ type: t.optional(t.enum([
25
+ "cron",
26
+ "push",
27
+ "both"
28
+ ])) });
29
+ t.object({});
321
30
  const ExecutionDetailContent = ({ item, onRetry, onCancel }) => {
322
31
  const client = useClient();
323
32
  const { l } = useI18n();
@@ -511,71 +220,38 @@ const ExecutionDetailContent = ({ item, onRetry, onCancel }) => {
511
220
  })
512
221
  ]
513
222
  }),
514
- /* @__PURE__ */ jsxs(Paper, {
223
+ /* @__PURE__ */ jsx(Section, {
224
+ title: "Details",
515
225
  p: "sm",
516
- radius: "md",
517
- withBorder: true,
518
- children: [/* @__PURE__ */ jsx(Text$1, {
519
- size: "sm",
520
- fw: 600,
521
- mb: "xs",
522
- children: "Details"
523
- }), /* @__PURE__ */ jsx(DetailList, {
226
+ children: /* @__PURE__ */ jsx(DetailList, {
524
227
  items: detailItems,
525
228
  columns: 2
526
- })]
229
+ })
527
230
  }),
528
- detail.payload && /* @__PURE__ */ jsxs(Paper, {
231
+ detail.payload && /* @__PURE__ */ jsx(Section, {
232
+ title: "Payload",
529
233
  p: "sm",
530
- radius: "md",
531
- withBorder: true,
532
- children: [/* @__PURE__ */ jsx(Text$1, {
533
- size: "sm",
534
- fw: 600,
535
- mb: "xs",
536
- children: "Payload"
537
- }), /* @__PURE__ */ jsx(Code, {
234
+ children: /* @__PURE__ */ jsx(Code, {
538
235
  block: true,
539
236
  children: JSON.stringify(detail.payload, null, 2)
540
- })]
237
+ })
541
238
  }),
542
- detail.error && /* @__PURE__ */ jsxs(Paper, {
239
+ detail.error && /* @__PURE__ */ jsx(Section, {
240
+ title: "Error",
543
241
  p: "sm",
544
- radius: "md",
545
- withBorder: true,
546
- children: [/* @__PURE__ */ jsx(Text$1, {
242
+ children: /* @__PURE__ */ jsx(Text$1, {
547
243
  size: "sm",
548
- fw: 600,
549
- mb: "xs",
550
- children: "Error"
551
- }), /* @__PURE__ */ jsx(Paper, {
552
- p: "xs",
553
- radius: "sm",
554
- withBorder: true,
555
- children: /* @__PURE__ */ jsx(Text$1, {
556
- size: "sm",
557
- style: {
558
- whiteSpace: "pre-wrap",
559
- wordBreak: "break-word"
560
- },
561
- children: detail.error
562
- })
563
- })]
244
+ style: {
245
+ whiteSpace: "pre-wrap",
246
+ wordBreak: "break-word"
247
+ },
248
+ children: detail.error
249
+ })
564
250
  }),
565
- 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})`,
566
253
  p: "sm",
567
- radius: "md",
568
- withBorder: true,
569
- children: [/* @__PURE__ */ jsxs(Text$1, {
570
- size: "sm",
571
- fw: 600,
572
- mb: "xs",
573
- children: [
574
- "Logs (",
575
- detail.logs.length,
576
- ")"
577
- ]
578
- }), /* @__PURE__ */ jsx(Flex$1, {
254
+ children: /* @__PURE__ */ jsx(Flex$1, {
579
255
  direction: "column",
580
256
  style: {
581
257
  maxHeight: 400,
@@ -619,12 +295,379 @@ const ExecutionDetailContent = ({ item, onRetry, onCancel }) => {
619
295
  ]
620
296
  }, i)) })]
621
297
  })
622
- })]
298
+ })
623
299
  })
624
300
  ]
625
301
  });
626
302
  };
627
-
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
+ };
628
670
  //#endregion
629
- export { AdminJobExecutions as default };
630
- //# sourceMappingURL=AdminJobExecutions-D9E-CS-U.js.map
671
+ export { AdminJobs as default };
672
+
673
+ //# sourceMappingURL=AdminJobs-D1_QGCDy.js.map