@alepha/ui 0.17.1 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/{AdminApiKeys-CF_qOO3u.js → AdminApiKeys-C-6_Q-lH.js} +56 -192
- package/dist/admin/AdminApiKeys-C-6_Q-lH.js.map +1 -0
- package/dist/admin/{AdminAudits-BQno3hZG.js → AdminAudits-Bgbf04hO.js} +25 -61
- package/dist/admin/AdminAudits-Bgbf04hO.js.map +1 -0
- package/dist/admin/{AdminFiles-kvuUaASF.js → AdminFiles-B9a7G3cY.js} +6 -8
- package/dist/admin/AdminFiles-B9a7G3cY.js.map +1 -0
- package/dist/admin/{AdminJobDashboard-CrPxp0W1.js → AdminJobDashboard-DaTwf5OY.js} +55 -186
- package/dist/admin/AdminJobDashboard-DaTwf5OY.js.map +1 -0
- package/dist/admin/{AdminJobExecutions-D-b4Zt7W.js → AdminJobExecutions-B9cek5dl.js} +132 -168
- package/dist/admin/AdminJobExecutions-B9cek5dl.js.map +1 -0
- package/dist/admin/{AdminJobRegistry-CNX5cpDx.js → AdminJobRegistry-DFgV3oqx.js} +60 -83
- package/dist/admin/AdminJobRegistry-DFgV3oqx.js.map +1 -0
- package/dist/admin/AdminLayout-DHsvWxVB.js +70 -0
- package/dist/admin/AdminLayout-DHsvWxVB.js.map +1 -0
- package/dist/admin/{AdminParameters-iQE8o7a7.js → AdminParameters-DHw9ATgl.js} +53 -53
- package/dist/admin/AdminParameters-DHw9ATgl.js.map +1 -0
- package/dist/admin/{AdminSessions-oKJCbd7w.js → AdminSessions-BhGJPI3z.js} +11 -18
- package/dist/admin/AdminSessions-BhGJPI3z.js.map +1 -0
- package/dist/admin/{AdminUserLayout-HAlobhWf.js → AdminUserLayout-BdC4Te8m.js} +112 -151
- package/dist/admin/AdminUserLayout-BdC4Te8m.js.map +1 -0
- package/dist/admin/AdminUserProfile-DAt23fqY.js +69 -0
- package/dist/admin/AdminUserProfile-DAt23fqY.js.map +1 -0
- package/dist/admin/AdminUserSessions-1uzcx02z.js +109 -0
- package/dist/admin/AdminUserSessions-1uzcx02z.js.map +1 -0
- package/dist/admin/AdminUsers-C85c3eiQ.js +121 -0
- package/dist/admin/AdminUsers-C85c3eiQ.js.map +1 -0
- package/dist/{auth/AuthLayout-CdJcrPs4.js → admin/AuthLayout-DFJvCvzw.js} +3 -3
- package/dist/{auth/AuthLayout-CdJcrPs4.js.map → admin/AuthLayout-DFJvCvzw.js.map} +1 -1
- package/dist/{auth/IconGoogle-Bm18QD2q.js → admin/IconGoogle-CSQLPYwX.js} +1 -1
- package/dist/{auth/IconGoogle-Bm18QD2q.js.map → admin/IconGoogle-CSQLPYwX.js.map} +1 -1
- package/dist/{demo/DemoLogin-DjJ9314c.js → admin/Login-BGheURrg.js} +15 -129
- package/dist/{auth/Login-BS_FYTy0.js.map → admin/Login-BGheURrg.js.map} +1 -1
- package/dist/{auth/Profile-CjDsW378.js → admin/Profile-B-c9pCPf.js} +5 -5
- package/dist/{auth/Profile-CjDsW378.js.map → admin/Profile-B-c9pCPf.js.map} +1 -1
- package/dist/{demo/DemoRegister-DzkJ5M83.js → admin/Register-Cs10l8vX.js} +20 -146
- package/dist/{auth/Register-C5eqzAaD.js.map → admin/Register-Cs10l8vX.js.map} +1 -1
- package/dist/{demo/DemoResetPassword-DWh4_BpQ.js → admin/ResetPassword-BwDdfkGH.js} +20 -82
- package/dist/{auth/ResetPassword-XifinVao.js.map → admin/ResetPassword-BwDdfkGH.js.map} +1 -1
- package/dist/{demo/DemoVerifyEmail-DbU_tCj8.js → admin/VerifyEmail-DfXHAiQl.js} +15 -32
- package/dist/{auth/VerifyEmail-DTgbeJOO.js.map → admin/VerifyEmail-DfXHAiQl.js.map} +1 -1
- package/dist/admin/auth-Dr0Cf8I7.js +319 -0
- package/dist/admin/auth-Dr0Cf8I7.js.map +1 -0
- package/dist/admin/core-2xoLiT0o.js +4031 -0
- package/dist/admin/core-2xoLiT0o.js.map +1 -0
- package/dist/admin/index.d.ts +740 -17
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +80 -127
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/rolldown-runtime-CjeV3_4I.js +18 -0
- package/dist/auth/AuthLayout-CAE1pX9s.js +22 -0
- package/dist/auth/AuthLayout-CAE1pX9s.js.map +1 -0
- package/dist/auth/{Login-BS_FYTy0.js → Login-Denw_UGy.js} +8 -8
- package/dist/auth/Login-Denw_UGy.js.map +1 -0
- package/dist/auth/Profile-BMX_Ar_s.js +155 -0
- package/dist/auth/Profile-BMX_Ar_s.js.map +1 -0
- package/dist/auth/{Register-C5eqzAaD.js → Register-6hi_cpfF.js} +8 -8
- package/dist/auth/Register-6hi_cpfF.js.map +1 -0
- package/dist/auth/{ResetPassword-XifinVao.js → ResetPassword-CqfTk1FI.js} +6 -6
- package/dist/auth/ResetPassword-CqfTk1FI.js.map +1 -0
- package/dist/auth/{VerifyEmail-DTgbeJOO.js → VerifyEmail-nWiSTMjF.js} +5 -5
- package/dist/auth/VerifyEmail-nWiSTMjF.js.map +1 -0
- package/dist/auth/core-niW0sFLv.js +2264 -0
- package/dist/auth/core-niW0sFLv.js.map +1 -0
- package/dist/auth/index.d.ts +336 -8
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +18 -22
- package/dist/auth/index.js.map +1 -1
- package/dist/core/index.d.ts +1033 -843
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1626 -1354
- package/dist/core/index.js.map +1 -1
- package/dist/demo/AuthLayout-jLa0aKsI.js +22 -0
- package/dist/demo/AuthLayout-jLa0aKsI.js.map +1 -0
- package/dist/demo/DemoButton-BmaWZVwf.js +178 -0
- package/dist/demo/DemoButton-BmaWZVwf.js.map +1 -0
- package/dist/demo/{DemoDataTable-lnBKWBf8.js → DemoDataTable-Z9xyV221.js} +18 -18
- package/dist/demo/DemoDataTable-Z9xyV221.js.map +1 -0
- package/dist/demo/DemoDialog-4ItHLf9t.js +101 -0
- package/dist/demo/DemoDialog-4ItHLf9t.js.map +1 -0
- package/dist/demo/DemoFlex-EtVq8QfX.js +105 -0
- package/dist/demo/DemoFlex-EtVq8QfX.js.map +1 -0
- package/dist/demo/DemoHeading-BS-vGfkI.js +18 -0
- package/dist/demo/DemoHeading-BS-vGfkI.js.map +1 -0
- package/dist/demo/{DemoHome-CUMZsYaH.js → DemoHome-Clbn8AmS.js} +9 -12
- package/dist/demo/DemoHome-Clbn8AmS.js.map +1 -0
- package/dist/demo/DemoJsonViewer-DkIX_ky2.js +109 -0
- package/dist/demo/DemoJsonViewer-DkIX_ky2.js.map +1 -0
- package/dist/demo/DemoLayout-C56xb5EE.js +73 -0
- package/dist/demo/DemoLayout-C56xb5EE.js.map +1 -0
- package/dist/demo/DemoLogin-BZwpicOS.js +128 -0
- package/dist/demo/DemoLogin-BZwpicOS.js.map +1 -0
- package/dist/demo/DemoRegister-C7_qc4MJ.js +140 -0
- package/dist/demo/DemoRegister-C7_qc4MJ.js.map +1 -0
- package/dist/demo/DemoResetPassword-BI1Ct4Dw.js +76 -0
- package/dist/demo/DemoResetPassword-BI1Ct4Dw.js.map +1 -0
- package/dist/demo/{DemoSidebar-C1csnGhX.js → DemoSidebar-CcBo4ltC.js} +6 -9
- package/dist/demo/DemoSidebar-CcBo4ltC.js.map +1 -0
- package/dist/demo/DemoText-CzXuUn3g.js +124 -0
- package/dist/demo/DemoText-CzXuUn3g.js.map +1 -0
- package/dist/demo/DemoToast-BgHDhWrX.js +95 -0
- package/dist/demo/DemoToast-BgHDhWrX.js.map +1 -0
- package/dist/demo/{DemoTypeForm-CWz6fJrJ.js → DemoTypeForm-DDzWoMSV.js} +4 -4
- package/dist/demo/{DemoTypeForm-CWz6fJrJ.js.map → DemoTypeForm-DDzWoMSV.js.map} +1 -1
- package/dist/demo/DemoVerifyEmail-C_Irdnov.js +30 -0
- package/dist/demo/DemoVerifyEmail-C_Irdnov.js.map +1 -0
- package/dist/demo/IconGoogle-CSQLPYwX.js +56 -0
- package/dist/demo/IconGoogle-CSQLPYwX.js.map +1 -0
- package/dist/demo/Login-hSOU3jZc.js +219 -0
- package/dist/demo/Login-hSOU3jZc.js.map +1 -0
- package/dist/demo/Profile-CWqti7FB.js +155 -0
- package/dist/demo/Profile-CWqti7FB.js.map +1 -0
- package/dist/demo/Register-a70LPgs2.js +375 -0
- package/dist/demo/Register-a70LPgs2.js.map +1 -0
- package/dist/demo/ResetPassword-DWN0lzr5.js +286 -0
- package/dist/demo/ResetPassword-DWN0lzr5.js.map +1 -0
- package/dist/demo/Showcase-Dq3MISpd.js +232 -0
- package/dist/demo/Showcase-Dq3MISpd.js.map +1 -0
- package/dist/demo/VerifyEmail-DZWL72K4.js +135 -0
- package/dist/demo/VerifyEmail-DZWL72K4.js.map +1 -0
- package/dist/demo/auth-d6n3xbug.js +257 -0
- package/dist/demo/auth-d6n3xbug.js.map +1 -0
- package/dist/demo/core-RCUw1Q-a.js +4217 -0
- package/dist/demo/core-RCUw1Q-a.js.map +1 -0
- package/dist/demo/index.d.ts +17 -6
- package/dist/demo/index.d.ts.map +1 -1
- package/dist/demo/index.js +92 -24
- package/dist/demo/index.js.map +1 -1
- package/dist/demo/rolldown-runtime-CjeV3_4I.js +18 -0
- package/package.json +16 -20
- package/src/admin/AdminRouter.ts +12 -61
- package/src/admin/components/AdminLayout.tsx +42 -10
- package/src/admin/components/audits/AdminAudits.tsx +10 -64
- package/src/admin/components/files/AdminFiles.tsx +2 -3
- package/src/admin/components/jobs/AdminJobDashboard.tsx +36 -142
- package/src/admin/components/jobs/AdminJobExecutions.tsx +117 -175
- package/src/admin/components/jobs/AdminJobRegistry.tsx +58 -73
- package/src/admin/components/keys/AdminApiKeys.tsx +21 -169
- package/src/admin/components/parameters/AdminParameters.tsx +4 -4
- package/src/admin/components/parameters/ParameterEmptyState.tsx +1 -2
- package/src/admin/components/parameters/ParameterHistory.tsx +3 -3
- package/src/admin/components/parameters/ParameterTree.tsx +2 -8
- package/src/admin/components/parameters/types.ts +3 -3
- package/src/admin/components/sessions/AdminSessions.tsx +8 -16
- package/src/admin/components/users/AdminUserLayout.tsx +113 -150
- package/src/admin/components/users/AdminUserProfile.tsx +50 -0
- package/src/admin/components/users/AdminUserSessions.tsx +106 -126
- package/src/admin/components/users/AdminUsers.tsx +46 -62
- package/src/admin/index.ts +1 -5
- package/src/auth/components/buttons/UserButton.tsx +1 -1
- package/src/auth/index.ts +0 -4
- package/src/core/UiRouter.ts +1 -1
- package/src/core/atoms/alephaSidebarAtom.ts +7 -31
- package/src/core/components/{layout/AlephaMantineProvider.tsx → AlephaMantineProvider.tsx} +3 -4
- package/src/core/components/Flex.tsx +63 -0
- package/src/core/components/Heading.tsx +19 -0
- package/src/core/components/Text.tsx +140 -0
- package/src/core/components/buttons/ActionButton.tsx +12 -1
- package/src/core/components/buttons/BurgerButton.tsx +3 -3
- package/src/core/components/buttons/LanguageButton.tsx +1 -1
- package/src/core/components/buttons/ToggleSidebarButton.tsx +1 -4
- package/src/core/components/data/DetailDrawer.tsx +144 -0
- package/src/core/components/data/DetailList.tsx +64 -0
- package/src/core/components/data/StatCards.tsx +50 -0
- package/src/core/components/layout/AppBar.tsx +11 -10
- package/src/core/components/layout/Breadcrumb.tsx +8 -8
- package/src/core/components/layout/Container.tsx +15 -0
- package/src/core/components/layout/DashboardShell.tsx +23 -238
- package/src/core/components/layout/Omnibar.tsx +1 -2
- package/src/core/components/layout/Sidebar.tsx +103 -71
- package/src/core/components/layout/index.ts +65 -0
- package/src/core/{components/form → form/components}/Control.tsx +32 -14
- package/src/core/{components/form → form/components}/ControlArray.tsx +2 -5
- package/src/core/{components/form → form/components}/ControlDate.tsx +1 -4
- package/src/core/{components/form → form/components}/ControlNumber.tsx +1 -4
- package/src/core/{components/form → form/components}/ControlObject.tsx +1 -4
- package/src/core/{components/form → form/components}/ControlQueryBuilder.tsx +7 -7
- package/src/core/{components/form → form/components}/ControlSelect.tsx +2 -4
- package/src/core/{components/form → form/components}/TypeForm.browser.spec.tsx +22 -64
- package/src/core/{components/form → form/components}/TypeForm.tsx +1 -3
- package/src/core/form/factories/dialogForm.tsx +31 -0
- package/src/core/form/index.ts +23 -0
- package/src/core/{utils → form/utils}/parseInput.ts +2 -4
- package/src/core/index.ts +43 -51
- package/src/core/interfaces/AlephaIntent.ts +6 -0
- package/src/core/interfaces/AlephaTheme.ts +0 -1
- package/src/core/json/factories/dialogJson.tsx +24 -0
- package/src/core/json/index.ts +2 -0
- package/src/core/primitives/$ui.ts +17 -0
- package/src/core/services/DialogService.tsx +1 -48
- package/src/core/styles.css +1 -8
- package/src/core/{components/table → table/components}/ColumnPicker.tsx +2 -3
- package/src/core/{components/table → table/components}/DataTable.tsx +8 -9
- package/src/core/{components/table → table/components}/DataTableFilters.tsx +6 -3
- package/src/core/{components/table → table/components}/DataTableToolbar.tsx +4 -5
- package/src/core/{components/table → table/components}/FilterPicker.tsx +2 -3
- package/src/core/table/index.ts +12 -0
- package/src/core/{components/table → table/interfaces}/types.ts +2 -2
- package/src/demo/DemoRouter.ts +87 -6
- package/src/demo/components/DemoHome.tsx +6 -10
- package/src/demo/components/DemoLayout.tsx +38 -8
- package/src/demo/components/auth/DemoLogin.tsx +1 -1
- package/src/demo/components/auth/DemoRegister.tsx +1 -1
- package/src/demo/components/auth/DemoResetPassword.tsx +1 -1
- package/src/demo/components/auth/DemoVerifyEmail.tsx +1 -1
- package/src/demo/components/core/DemoButton.tsx +160 -0
- package/src/demo/components/core/DemoFlex.tsx +101 -0
- package/src/demo/components/core/DemoHeading.tsx +13 -0
- package/src/demo/components/core/DemoText.tsx +110 -0
- package/src/demo/components/json/DemoJsonViewer.tsx +1 -1
- package/src/demo/components/layout/DemoDialog.tsx +103 -0
- package/src/demo/components/{core → layout}/DemoSidebar.tsx +0 -1
- package/src/demo/components/layout/DemoToast.tsx +96 -0
- package/src/demo/components/shared/MacWindow.tsx +149 -74
- package/src/demo/components/shared/Showcase.tsx +4 -8
- package/src/demo/index.ts +1 -4
- package/src/demo/primitives/$uiDemo.ts +10 -0
- package/dist/admin/AdminApiKeys-CF_qOO3u.js.map +0 -1
- package/dist/admin/AdminAudits-BQno3hZG.js.map +0 -1
- package/dist/admin/AdminFiles-kvuUaASF.js.map +0 -1
- package/dist/admin/AdminJobDashboard-CrPxp0W1.js.map +0 -1
- package/dist/admin/AdminJobExecutions-D-b4Zt7W.js.map +0 -1
- package/dist/admin/AdminJobRegistry-CNX5cpDx.js.map +0 -1
- package/dist/admin/AdminLayout-e-ZP5nWw.js +0 -37
- package/dist/admin/AdminLayout-e-ZP5nWw.js.map +0 -1
- package/dist/admin/AdminNotifications-DeHJFf6W.js +0 -153
- package/dist/admin/AdminNotifications-DeHJFf6W.js.map +0 -1
- package/dist/admin/AdminParameters-iQE8o7a7.js.map +0 -1
- package/dist/admin/AdminSessions-oKJCbd7w.js.map +0 -1
- package/dist/admin/AdminUserAudits-BNCEle_E.js +0 -177
- package/dist/admin/AdminUserAudits-BNCEle_E.js.map +0 -1
- package/dist/admin/AdminUserCreate-CgqeFwCt.js +0 -104
- package/dist/admin/AdminUserCreate-CgqeFwCt.js.map +0 -1
- package/dist/admin/AdminUserDetails-DDe1A1GP.js +0 -477
- package/dist/admin/AdminUserDetails-DDe1A1GP.js.map +0 -1
- package/dist/admin/AdminUserLayout-HAlobhWf.js.map +0 -1
- package/dist/admin/AdminUserSessions-Bq1LnVLf.js +0 -129
- package/dist/admin/AdminUserSessions-Bq1LnVLf.js.map +0 -1
- package/dist/admin/AdminUserSettings-BRsBZoxV.js +0 -167
- package/dist/admin/AdminUserSettings-BRsBZoxV.js.map +0 -1
- package/dist/admin/AdminUsers-D71kIOSn.js +0 -118
- package/dist/admin/AdminUsers-D71kIOSn.js.map +0 -1
- package/dist/demo/DemoDataTable-lnBKWBf8.js.map +0 -1
- package/dist/demo/DemoHome-CUMZsYaH.js.map +0 -1
- package/dist/demo/DemoJsonViewer-_uokbGaW.js +0 -429
- package/dist/demo/DemoJsonViewer-_uokbGaW.js.map +0 -1
- package/dist/demo/DemoLayout-DHVoacE6.js +0 -46
- package/dist/demo/DemoLayout-DHVoacE6.js.map +0 -1
- package/dist/demo/DemoLogin-DjJ9314c.js.map +0 -1
- package/dist/demo/DemoRegister-DzkJ5M83.js.map +0 -1
- package/dist/demo/DemoResetPassword-DWh4_BpQ.js.map +0 -1
- package/dist/demo/DemoSidebar-C1csnGhX.js.map +0 -1
- package/dist/demo/DemoVerifyEmail-DbU_tCj8.js.map +0 -1
- package/dist/demo/Showcase-BzoXNlCn.js +0 -185
- package/dist/demo/Showcase-BzoXNlCn.js.map +0 -1
- package/dist/json/index.d.ts +0 -57
- package/dist/json/index.d.ts.map +0 -1
- package/dist/json/index.js +0 -325
- package/dist/json/index.js.map +0 -1
- package/src/admin/components/notifications/AdminNotifications.tsx +0 -204
- package/src/admin/components/users/AdminUserAudits.tsx +0 -184
- package/src/admin/components/users/AdminUserCreate.tsx +0 -85
- package/src/admin/components/users/AdminUserDetails.tsx +0 -431
- package/src/admin/components/users/AdminUserSettings.tsx +0 -171
- package/src/core/components/data/ErrorViewer.tsx +0 -171
- package/src/json/extensions/DialogService.tsx +0 -31
- package/src/json/index.ts +0 -18
- package/src/json/styles.css +0 -1
- /package/dist/{demo → auth}/IconGoogle-Ch1m3Uzl.js +0 -0
- /package/dist/{demo → auth}/IconGoogle-Ch1m3Uzl.js.map +0 -0
- /package/src/{json → core/json}/components/JsonViewer.css +0 -0
- /package/src/{json → core/json}/components/JsonViewer.tsx +0 -0
- /package/src/core/{components/table → table/components}/DataTablePagination.tsx +0 -0
- /package/src/core/{components/table → table/components}/useTableSelection.ts +0 -0
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Badge, Code, Flex, Paper, Table } from "@mantine/core";
|
|
1
|
+
import type { DetailListItem } from "@alepha/ui";
|
|
3
2
|
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
3
|
+
ActionButton,
|
|
4
|
+
DataTable,
|
|
5
|
+
DetailList,
|
|
6
|
+
Flex,
|
|
7
|
+
Text,
|
|
8
|
+
useDialog,
|
|
9
|
+
useToast,
|
|
10
|
+
} from "@alepha/ui";
|
|
11
|
+
import { Badge, Code, Paper, Table } from "@mantine/core";
|
|
12
|
+
import { IconCircleX, IconRefresh } from "@tabler/icons-react";
|
|
11
13
|
import { type Page, t } from "alepha";
|
|
12
14
|
import type {
|
|
13
15
|
AdminJobController,
|
|
@@ -43,61 +45,6 @@ const formatDuration = (
|
|
|
43
45
|
return `${Math.floor(duration / 3600000)}h ${Math.floor((duration % 3600000) / 60000)}m`;
|
|
44
46
|
};
|
|
45
47
|
|
|
46
|
-
const getStatusColor = (status: string) => {
|
|
47
|
-
switch (status) {
|
|
48
|
-
case "completed":
|
|
49
|
-
return "teal";
|
|
50
|
-
case "running":
|
|
51
|
-
return "blue";
|
|
52
|
-
case "failed":
|
|
53
|
-
case "dead":
|
|
54
|
-
return "red";
|
|
55
|
-
case "cancelled":
|
|
56
|
-
return "orange";
|
|
57
|
-
case "scheduled":
|
|
58
|
-
return "violet";
|
|
59
|
-
case "retrying":
|
|
60
|
-
return "yellow";
|
|
61
|
-
case "pending":
|
|
62
|
-
return "gray";
|
|
63
|
-
default:
|
|
64
|
-
return "gray";
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
const getStatusIcon = (status: string, size = 14) => {
|
|
69
|
-
switch (status) {
|
|
70
|
-
case "completed":
|
|
71
|
-
return <IconCircleCheck size={size} />;
|
|
72
|
-
case "failed":
|
|
73
|
-
case "dead":
|
|
74
|
-
return <IconCircleX size={size} />;
|
|
75
|
-
case "running":
|
|
76
|
-
return <IconPlayerPlay size={size} />;
|
|
77
|
-
case "cancelled":
|
|
78
|
-
return <IconAlertTriangle size={size} />;
|
|
79
|
-
default:
|
|
80
|
-
return <IconClock size={size} />;
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
const getLogLevelColor = (level: string) => {
|
|
85
|
-
switch (level) {
|
|
86
|
-
case "ERROR":
|
|
87
|
-
return "red";
|
|
88
|
-
case "WARN":
|
|
89
|
-
return "orange";
|
|
90
|
-
case "INFO":
|
|
91
|
-
return "blue";
|
|
92
|
-
case "DEBUG":
|
|
93
|
-
return "gray";
|
|
94
|
-
case "TRACE":
|
|
95
|
-
return "dimmed";
|
|
96
|
-
default:
|
|
97
|
-
return "gray";
|
|
98
|
-
}
|
|
99
|
-
};
|
|
100
|
-
|
|
101
48
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
102
49
|
|
|
103
50
|
const executionFilters = t.object({
|
|
@@ -129,7 +76,7 @@ const AdminJobExecutions = () => {
|
|
|
129
76
|
const handleRetry = useCallback(
|
|
130
77
|
async (id: string) => {
|
|
131
78
|
try {
|
|
132
|
-
await client.
|
|
79
|
+
await client.retryJobExecution({ params: { id } });
|
|
133
80
|
toast.success("Execution retried");
|
|
134
81
|
setRefreshKey((k) => k + 1);
|
|
135
82
|
} catch {
|
|
@@ -151,7 +98,7 @@ const AdminJobExecutions = () => {
|
|
|
151
98
|
if (!confirmed) return;
|
|
152
99
|
|
|
153
100
|
try {
|
|
154
|
-
await client.
|
|
101
|
+
await client.cancelJobExecution({ params: { id } });
|
|
155
102
|
toast.success("Execution cancelled");
|
|
156
103
|
setRefreshKey((k) => k + 1);
|
|
157
104
|
} catch {
|
|
@@ -184,7 +131,7 @@ const AdminJobExecutions = () => {
|
|
|
184
131
|
filters={executionFilters}
|
|
185
132
|
defaultFilters={["job", "status"]}
|
|
186
133
|
items={async (filters) => {
|
|
187
|
-
const response = await client.
|
|
134
|
+
const response = await client.findJobExecutions({
|
|
188
135
|
query: {
|
|
189
136
|
...filters,
|
|
190
137
|
},
|
|
@@ -196,12 +143,7 @@ const AdminJobExecutions = () => {
|
|
|
196
143
|
label: "Status",
|
|
197
144
|
fit: true,
|
|
198
145
|
value: (item) => (
|
|
199
|
-
<Badge
|
|
200
|
-
size="sm"
|
|
201
|
-
variant="light"
|
|
202
|
-
color={getStatusColor(item.status)}
|
|
203
|
-
leftSection={getStatusIcon(item.status, 12)}
|
|
204
|
-
>
|
|
146
|
+
<Badge size="sm" variant="default">
|
|
205
147
|
{item.status}
|
|
206
148
|
</Badge>
|
|
207
149
|
),
|
|
@@ -238,7 +180,7 @@ const AdminJobExecutions = () => {
|
|
|
238
180
|
defaultHidden: true,
|
|
239
181
|
value: (item) => (
|
|
240
182
|
<Text size="xs" c="dimmed">
|
|
241
|
-
{item.triggeredByName ?? "
|
|
183
|
+
{item.triggeredByName ?? "\u2014"}
|
|
242
184
|
</Text>
|
|
243
185
|
),
|
|
244
186
|
},
|
|
@@ -257,7 +199,9 @@ const AdminJobExecutions = () => {
|
|
|
257
199
|
fit: true,
|
|
258
200
|
value: (item) => (
|
|
259
201
|
<Text size="xs" c="dimmed">
|
|
260
|
-
{item.startedAt
|
|
202
|
+
{item.startedAt
|
|
203
|
+
? l(item.startedAt, { date: "fromNow" })
|
|
204
|
+
: "\u2014"}
|
|
261
205
|
</Text>
|
|
262
206
|
),
|
|
263
207
|
},
|
|
@@ -269,7 +213,7 @@ const AdminJobExecutions = () => {
|
|
|
269
213
|
{item.startedAt &&
|
|
270
214
|
(item.completedAt || item.status === "running")
|
|
271
215
|
? formatDuration(item.startedAt, item.completedAt)
|
|
272
|
-
: "
|
|
216
|
+
: "\u2014"}
|
|
273
217
|
</Text>
|
|
274
218
|
),
|
|
275
219
|
},
|
|
@@ -277,8 +221,8 @@ const AdminJobExecutions = () => {
|
|
|
277
221
|
label: "Error",
|
|
278
222
|
defaultHidden: true,
|
|
279
223
|
value: (item) => (
|
|
280
|
-
<Text size="xs" c="
|
|
281
|
-
{item.error ?? "
|
|
224
|
+
<Text size="xs" c="dimmed" lineClamp={1}>
|
|
225
|
+
{item.error ?? "\u2014"}
|
|
282
226
|
</Text>
|
|
283
227
|
),
|
|
284
228
|
},
|
|
@@ -288,7 +232,7 @@ const AdminJobExecutions = () => {
|
|
|
288
232
|
defaultHidden: true,
|
|
289
233
|
value: (item) => (
|
|
290
234
|
<Text size="xs" c="dimmed" ff="monospace">
|
|
291
|
-
{item.key ?? "
|
|
235
|
+
{item.key ?? "\u2014"}
|
|
292
236
|
</Text>
|
|
293
237
|
),
|
|
294
238
|
},
|
|
@@ -298,7 +242,7 @@ const AdminJobExecutions = () => {
|
|
|
298
242
|
defaultHidden: true,
|
|
299
243
|
value: (item) => (
|
|
300
244
|
<Text size="xs" c="dimmed" ff="monospace">
|
|
301
|
-
{item.workerId ?? "
|
|
245
|
+
{item.workerId ?? "\u2014"}
|
|
302
246
|
</Text>
|
|
303
247
|
),
|
|
304
248
|
},
|
|
@@ -308,14 +252,12 @@ const AdminJobExecutions = () => {
|
|
|
308
252
|
actions: (item) => [
|
|
309
253
|
{
|
|
310
254
|
tooltip: "Retry",
|
|
311
|
-
color: "blue",
|
|
312
255
|
icon: IconRefresh,
|
|
313
256
|
onClick: () => handleRetry(item.id),
|
|
314
257
|
visible: item.can?.retry,
|
|
315
258
|
},
|
|
316
259
|
{
|
|
317
260
|
tooltip: "Cancel",
|
|
318
|
-
color: "red",
|
|
319
261
|
icon: IconCircleX,
|
|
320
262
|
onClick: () => handleCancel(item.id),
|
|
321
263
|
visible: item.can?.cancel,
|
|
@@ -332,10 +274,9 @@ const AdminJobExecutions = () => {
|
|
|
332
274
|
<Text size="xs" c="dimmed" tt="uppercase" fw={600}>
|
|
333
275
|
Error
|
|
334
276
|
</Text>
|
|
335
|
-
<Paper p="xs"
|
|
277
|
+
<Paper p="xs" radius="sm" withBorder>
|
|
336
278
|
<Text
|
|
337
279
|
size="xs"
|
|
338
|
-
c="red"
|
|
339
280
|
style={{
|
|
340
281
|
whiteSpace: "pre-wrap",
|
|
341
282
|
wordBreak: "break-word",
|
|
@@ -423,7 +364,7 @@ const ExecutionDetailContent = ({
|
|
|
423
364
|
setExpandedLogs(new Set());
|
|
424
365
|
setLoading(true);
|
|
425
366
|
try {
|
|
426
|
-
const data = await client.
|
|
367
|
+
const data = await client.getJobExecution({ params: { id: execId } });
|
|
427
368
|
setDetail(data);
|
|
428
369
|
} catch {
|
|
429
370
|
toast.danger("Failed to load execution details");
|
|
@@ -470,6 +411,91 @@ const ExecutionDetailContent = ({
|
|
|
470
411
|
|
|
471
412
|
if (!detail) return null;
|
|
472
413
|
|
|
414
|
+
const detailItems: DetailListItem[] = [
|
|
415
|
+
{
|
|
416
|
+
label: "ID",
|
|
417
|
+
value: (
|
|
418
|
+
<Text size="sm" ff="monospace">
|
|
419
|
+
{detail.id}
|
|
420
|
+
</Text>
|
|
421
|
+
),
|
|
422
|
+
copyable: detail.id,
|
|
423
|
+
},
|
|
424
|
+
{
|
|
425
|
+
label: "Status",
|
|
426
|
+
value: (
|
|
427
|
+
<Text size="sm" tt="capitalize">
|
|
428
|
+
{detail.status}
|
|
429
|
+
</Text>
|
|
430
|
+
),
|
|
431
|
+
},
|
|
432
|
+
{
|
|
433
|
+
label: "Priority",
|
|
434
|
+
value: PRIORITY_LABELS[detail.priority] ?? "Normal",
|
|
435
|
+
},
|
|
436
|
+
{
|
|
437
|
+
label: "Attempt",
|
|
438
|
+
value: (
|
|
439
|
+
<Text size="sm" ff="monospace">
|
|
440
|
+
{detail.attempt}/{detail.maxAttempts}
|
|
441
|
+
</Text>
|
|
442
|
+
),
|
|
443
|
+
},
|
|
444
|
+
{
|
|
445
|
+
label: "Worker",
|
|
446
|
+
value: (
|
|
447
|
+
<Text size="sm" ff="monospace">
|
|
448
|
+
{detail.workerId}
|
|
449
|
+
</Text>
|
|
450
|
+
),
|
|
451
|
+
hidden: !detail.workerId,
|
|
452
|
+
},
|
|
453
|
+
{
|
|
454
|
+
label: "Key",
|
|
455
|
+
value: (
|
|
456
|
+
<Text size="sm" ff="monospace">
|
|
457
|
+
{detail.key}
|
|
458
|
+
</Text>
|
|
459
|
+
),
|
|
460
|
+
hidden: !detail.key,
|
|
461
|
+
},
|
|
462
|
+
{
|
|
463
|
+
label: "Created",
|
|
464
|
+
value: String(l(detail.createdAt, { date: "lll" })),
|
|
465
|
+
},
|
|
466
|
+
{
|
|
467
|
+
label: "Started",
|
|
468
|
+
value: detail.startedAt
|
|
469
|
+
? String(l(detail.startedAt, { date: "lll" }))
|
|
470
|
+
: undefined,
|
|
471
|
+
hidden: !detail.startedAt,
|
|
472
|
+
},
|
|
473
|
+
{
|
|
474
|
+
label: "Duration",
|
|
475
|
+
value:
|
|
476
|
+
detail.startedAt &&
|
|
477
|
+
(detail.completedAt || detail.status === "running") ? (
|
|
478
|
+
<Text size="sm" ff="monospace">
|
|
479
|
+
{formatDuration(detail.startedAt, detail.completedAt)}
|
|
480
|
+
</Text>
|
|
481
|
+
) : undefined,
|
|
482
|
+
hidden: !(
|
|
483
|
+
detail.startedAt &&
|
|
484
|
+
(detail.completedAt || detail.status === "running")
|
|
485
|
+
),
|
|
486
|
+
},
|
|
487
|
+
{
|
|
488
|
+
label: "Triggered By",
|
|
489
|
+
value: detail.triggeredByName,
|
|
490
|
+
hidden: !detail.triggeredByName,
|
|
491
|
+
},
|
|
492
|
+
{
|
|
493
|
+
label: "Cancelled By",
|
|
494
|
+
value: detail.cancelledByName,
|
|
495
|
+
hidden: !detail.cancelledByName,
|
|
496
|
+
},
|
|
497
|
+
];
|
|
498
|
+
|
|
473
499
|
return (
|
|
474
500
|
<Flex direction="column" gap="md">
|
|
475
501
|
{/* Header */}
|
|
@@ -477,14 +503,9 @@ const ExecutionDetailContent = ({
|
|
|
477
503
|
<Text fw={600} ff="monospace">
|
|
478
504
|
{detail.jobName}
|
|
479
505
|
</Text>
|
|
480
|
-
<
|
|
481
|
-
size="sm"
|
|
482
|
-
variant="light"
|
|
483
|
-
color={getStatusColor(detail.status)}
|
|
484
|
-
leftSection={getStatusIcon(detail.status, 12)}
|
|
485
|
-
>
|
|
506
|
+
<Text size="sm" tt="capitalize" c="dimmed">
|
|
486
507
|
{detail.status}
|
|
487
|
-
</
|
|
508
|
+
</Text>
|
|
488
509
|
<Text size="xs" c="dimmed">
|
|
489
510
|
{detail.attempt}/{detail.maxAttempts}
|
|
490
511
|
</Text>
|
|
@@ -504,7 +525,6 @@ const ExecutionDetailContent = ({
|
|
|
504
525
|
tooltip="Retry"
|
|
505
526
|
variant="light"
|
|
506
527
|
size="xs"
|
|
507
|
-
color="blue"
|
|
508
528
|
icon={IconRefresh}
|
|
509
529
|
onClick={handleRetry}
|
|
510
530
|
/>
|
|
@@ -514,7 +534,6 @@ const ExecutionDetailContent = ({
|
|
|
514
534
|
tooltip="Cancel"
|
|
515
535
|
variant="light"
|
|
516
536
|
size="xs"
|
|
517
|
-
color="red"
|
|
518
537
|
icon={IconCircleX}
|
|
519
538
|
onClick={handleCancel}
|
|
520
539
|
/>
|
|
@@ -526,49 +545,7 @@ const ExecutionDetailContent = ({
|
|
|
526
545
|
<Text size="sm" fw={600} mb="xs">
|
|
527
546
|
Details
|
|
528
547
|
</Text>
|
|
529
|
-
<
|
|
530
|
-
<DetailField label="ID" value={detail.id} monospace copyable />
|
|
531
|
-
<DetailField label="Status" value={detail.status} capitalize />
|
|
532
|
-
<DetailField
|
|
533
|
-
label="Priority"
|
|
534
|
-
value={PRIORITY_LABELS[detail.priority] ?? "Normal"}
|
|
535
|
-
/>
|
|
536
|
-
<DetailField
|
|
537
|
-
label="Attempt"
|
|
538
|
-
value={`${detail.attempt}/${detail.maxAttempts}`}
|
|
539
|
-
monospace
|
|
540
|
-
/>
|
|
541
|
-
{detail.workerId && (
|
|
542
|
-
<DetailField label="Worker" value={detail.workerId} monospace />
|
|
543
|
-
)}
|
|
544
|
-
{detail.key && (
|
|
545
|
-
<DetailField label="Key" value={detail.key} monospace />
|
|
546
|
-
)}
|
|
547
|
-
<DetailField
|
|
548
|
-
label="Created"
|
|
549
|
-
value={String(l(detail.createdAt, { date: "lll" }))}
|
|
550
|
-
/>
|
|
551
|
-
{detail.startedAt && (
|
|
552
|
-
<DetailField
|
|
553
|
-
label="Started"
|
|
554
|
-
value={String(l(detail.startedAt, { date: "lll" }))}
|
|
555
|
-
/>
|
|
556
|
-
)}
|
|
557
|
-
{detail.startedAt &&
|
|
558
|
-
(detail.completedAt || detail.status === "running") && (
|
|
559
|
-
<DetailField
|
|
560
|
-
label="Duration"
|
|
561
|
-
value={formatDuration(detail.startedAt, detail.completedAt)}
|
|
562
|
-
monospace
|
|
563
|
-
/>
|
|
564
|
-
)}
|
|
565
|
-
{detail.triggeredByName && (
|
|
566
|
-
<DetailField label="Triggered By" value={detail.triggeredByName} />
|
|
567
|
-
)}
|
|
568
|
-
{detail.cancelledByName && (
|
|
569
|
-
<DetailField label="Cancelled By" value={detail.cancelledByName} />
|
|
570
|
-
)}
|
|
571
|
-
</Flex>
|
|
548
|
+
<DetailList items={detailItems} columns={2} />
|
|
572
549
|
</Paper>
|
|
573
550
|
|
|
574
551
|
{/* Payload */}
|
|
@@ -584,13 +561,12 @@ const ExecutionDetailContent = ({
|
|
|
584
561
|
{/* Error */}
|
|
585
562
|
{detail.error && (
|
|
586
563
|
<Paper p="sm" radius="md" withBorder>
|
|
587
|
-
<Text size="sm" fw={600} mb="xs"
|
|
564
|
+
<Text size="sm" fw={600} mb="xs">
|
|
588
565
|
Error
|
|
589
566
|
</Text>
|
|
590
|
-
<Paper p="xs"
|
|
567
|
+
<Paper p="xs" radius="sm" withBorder>
|
|
591
568
|
<Text
|
|
592
569
|
size="sm"
|
|
593
|
-
c="red"
|
|
594
570
|
style={{
|
|
595
571
|
whiteSpace: "pre-wrap",
|
|
596
572
|
wordBreak: "break-word",
|
|
@@ -628,11 +604,7 @@ const ExecutionDetailContent = ({
|
|
|
628
604
|
onClick={log.data ? () => toggleLogExpand(i) : undefined}
|
|
629
605
|
>
|
|
630
606
|
<Table.Td>
|
|
631
|
-
<Badge
|
|
632
|
-
size="xs"
|
|
633
|
-
variant="light"
|
|
634
|
-
color={getLogLevelColor(log.level)}
|
|
635
|
-
>
|
|
607
|
+
<Badge size="xs" variant="default">
|
|
636
608
|
{log.level}
|
|
637
609
|
</Badge>
|
|
638
610
|
</Table.Td>
|
|
@@ -660,34 +632,4 @@ const ExecutionDetailContent = ({
|
|
|
660
632
|
);
|
|
661
633
|
};
|
|
662
634
|
|
|
663
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
664
|
-
|
|
665
|
-
const DetailField = ({
|
|
666
|
-
label,
|
|
667
|
-
value,
|
|
668
|
-
monospace,
|
|
669
|
-
capitalize,
|
|
670
|
-
copyable,
|
|
671
|
-
}: {
|
|
672
|
-
label: string;
|
|
673
|
-
value: string;
|
|
674
|
-
monospace?: boolean;
|
|
675
|
-
capitalize?: boolean;
|
|
676
|
-
copyable?: boolean;
|
|
677
|
-
}) => (
|
|
678
|
-
<Flex direction="column" gap={2}>
|
|
679
|
-
<Text size="xs" c="dimmed" tt="uppercase" fw={600}>
|
|
680
|
-
{label}
|
|
681
|
-
</Text>
|
|
682
|
-
<Text
|
|
683
|
-
size="sm"
|
|
684
|
-
ff={monospace ? "monospace" : undefined}
|
|
685
|
-
tt={capitalize ? "capitalize" : undefined}
|
|
686
|
-
style={copyable ? { cursor: "pointer", userSelect: "all" } : undefined}
|
|
687
|
-
>
|
|
688
|
-
{value}
|
|
689
|
-
</Text>
|
|
690
|
-
</Flex>
|
|
691
|
-
);
|
|
692
|
-
|
|
693
635
|
export default AdminJobExecutions;
|
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { DetailListItem } from "@alepha/ui";
|
|
2
|
+
import {
|
|
3
|
+
DataTable,
|
|
4
|
+
DetailList,
|
|
5
|
+
Flex,
|
|
6
|
+
Text,
|
|
7
|
+
useDialog,
|
|
8
|
+
useToast,
|
|
9
|
+
} from "@alepha/ui";
|
|
2
10
|
import { Badge } from "@mantine/core";
|
|
3
11
|
import {
|
|
4
12
|
IconCircleCheck,
|
|
@@ -19,19 +27,6 @@ import { useCallback, useEffect, useState } from "react";
|
|
|
19
27
|
|
|
20
28
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
21
29
|
|
|
22
|
-
const getTypeColor = (type: string) => {
|
|
23
|
-
switch (type) {
|
|
24
|
-
case "cron":
|
|
25
|
-
return "violet";
|
|
26
|
-
case "push":
|
|
27
|
-
return "blue";
|
|
28
|
-
case "both":
|
|
29
|
-
return "teal";
|
|
30
|
-
default:
|
|
31
|
-
return "gray";
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
|
|
35
30
|
const registryFilters = t.object({
|
|
36
31
|
type: t.optional(t.enum(["cron", "push", "both"])),
|
|
37
32
|
});
|
|
@@ -58,8 +53,8 @@ const AdminJobRegistry = () => {
|
|
|
58
53
|
try {
|
|
59
54
|
const [cronData, queueData, failureData] = await Promise.all([
|
|
60
55
|
client.getCronJobs(),
|
|
61
|
-
client.
|
|
62
|
-
client.
|
|
56
|
+
client.getJobQueueDepth(),
|
|
57
|
+
client.getJobTopFailures(),
|
|
63
58
|
]);
|
|
64
59
|
setCronMap(new Map(cronData.map((c) => [c.name, c])));
|
|
65
60
|
setQueueMap(new Map(queueData.map((q) => [q.jobName, q])));
|
|
@@ -109,7 +104,7 @@ const AdminJobRegistry = () => {
|
|
|
109
104
|
onFilterChange={(_key, _value, form) => form.submit()}
|
|
110
105
|
filters={registryFilters}
|
|
111
106
|
items={async (filters) => {
|
|
112
|
-
const items = await client.
|
|
107
|
+
const items = await client.getJobRegistry();
|
|
113
108
|
const filtered = filters.type
|
|
114
109
|
? items.filter((i) => i.type === filters.type)
|
|
115
110
|
: items;
|
|
@@ -128,7 +123,7 @@ const AdminJobRegistry = () => {
|
|
|
128
123
|
label: "Type",
|
|
129
124
|
fit: true,
|
|
130
125
|
value: (item) => (
|
|
131
|
-
<Badge size="sm" variant="
|
|
126
|
+
<Badge size="sm" variant="default">
|
|
132
127
|
{item.type}
|
|
133
128
|
</Badge>
|
|
134
129
|
),
|
|
@@ -169,22 +164,22 @@ const AdminJobRegistry = () => {
|
|
|
169
164
|
return (
|
|
170
165
|
<Flex gap={4}>
|
|
171
166
|
{q.running > 0 && (
|
|
172
|
-
<Badge size="xs" variant="
|
|
167
|
+
<Badge size="xs" variant="default">
|
|
173
168
|
{q.running} run
|
|
174
169
|
</Badge>
|
|
175
170
|
)}
|
|
176
171
|
{q.pending > 0 && (
|
|
177
|
-
<Badge size="xs" variant="
|
|
172
|
+
<Badge size="xs" variant="default">
|
|
178
173
|
{q.pending} pen
|
|
179
174
|
</Badge>
|
|
180
175
|
)}
|
|
181
176
|
{q.retrying > 0 && (
|
|
182
|
-
<Badge size="xs" variant="
|
|
177
|
+
<Badge size="xs" variant="default">
|
|
183
178
|
{q.retrying} retry
|
|
184
179
|
</Badge>
|
|
185
180
|
)}
|
|
186
181
|
{q.dead > 0 && (
|
|
187
|
-
<Badge size="xs" variant="
|
|
182
|
+
<Badge size="xs" variant="default">
|
|
188
183
|
{q.dead} dead
|
|
189
184
|
</Badge>
|
|
190
185
|
)}
|
|
@@ -209,33 +204,44 @@ const AdminJobRegistry = () => {
|
|
|
209
204
|
const cron = cronMap.get(item.name);
|
|
210
205
|
const failure = failureMap.get(item.name);
|
|
211
206
|
|
|
207
|
+
const detailItems: DetailListItem[] = [
|
|
208
|
+
{
|
|
209
|
+
label: "Cron",
|
|
210
|
+
value: item.cron ? (
|
|
211
|
+
<Text size="sm" ff="monospace">
|
|
212
|
+
{item.cron}
|
|
213
|
+
</Text>
|
|
214
|
+
) : undefined,
|
|
215
|
+
hidden: !item.cron,
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
label: "Timeout",
|
|
219
|
+
value: item.timeout,
|
|
220
|
+
hidden: !item.timeout,
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
label: "Retry",
|
|
224
|
+
value: item.retry
|
|
225
|
+
? `${item.retry.retries}x${item.retry.hasBackoff ? " (backoff)" : ""}`
|
|
226
|
+
: undefined,
|
|
227
|
+
hidden: !item.retry,
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
label: "Batch",
|
|
231
|
+
value: item.batch
|
|
232
|
+
? `${item.batch.size} / ${item.batch.window}`
|
|
233
|
+
: undefined,
|
|
234
|
+
hidden: !item.batch,
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
label: "Schema",
|
|
238
|
+
value: item.hasSchema ? "Yes" : "No",
|
|
239
|
+
},
|
|
240
|
+
];
|
|
241
|
+
|
|
212
242
|
return (
|
|
213
243
|
<Flex direction="column" gap="sm" p="sm">
|
|
214
|
-
{
|
|
215
|
-
<Flex gap="lg" wrap="wrap">
|
|
216
|
-
{item.cron && (
|
|
217
|
-
<PanelField label="Cron" value={item.cron} monospace />
|
|
218
|
-
)}
|
|
219
|
-
{item.timeout && (
|
|
220
|
-
<PanelField label="Timeout" value={item.timeout} />
|
|
221
|
-
)}
|
|
222
|
-
{item.retry && (
|
|
223
|
-
<PanelField
|
|
224
|
-
label="Retry"
|
|
225
|
-
value={`${item.retry.retries}x${item.retry.hasBackoff ? " (backoff)" : ""}`}
|
|
226
|
-
/>
|
|
227
|
-
)}
|
|
228
|
-
{item.batch && (
|
|
229
|
-
<PanelField
|
|
230
|
-
label="Batch"
|
|
231
|
-
value={`${item.batch.size} / ${item.batch.window}`}
|
|
232
|
-
/>
|
|
233
|
-
)}
|
|
234
|
-
<PanelField
|
|
235
|
-
label="Schema"
|
|
236
|
-
value={item.hasSchema ? "Yes" : "No"}
|
|
237
|
-
/>
|
|
238
|
-
</Flex>
|
|
244
|
+
<DetailList items={detailItems} columns={3} />
|
|
239
245
|
|
|
240
246
|
{/* Last cron execution */}
|
|
241
247
|
{cron?.lastExecution && (
|
|
@@ -247,12 +253,12 @@ const AdminJobRegistry = () => {
|
|
|
247
253
|
{cron.lastExecution.status === "completed" ? (
|
|
248
254
|
<IconCircleCheck
|
|
249
255
|
size={14}
|
|
250
|
-
color="var(--mantine-color-
|
|
256
|
+
color="var(--mantine-color-dimmed)"
|
|
251
257
|
/>
|
|
252
258
|
) : (
|
|
253
259
|
<IconCircleX
|
|
254
260
|
size={14}
|
|
255
|
-
color="var(--mantine-color-
|
|
261
|
+
color="var(--mantine-color-dimmed)"
|
|
256
262
|
/>
|
|
257
263
|
)}
|
|
258
264
|
<Text size="xs" tt="capitalize">
|
|
@@ -265,7 +271,7 @@ const AdminJobRegistry = () => {
|
|
|
265
271
|
</Text>
|
|
266
272
|
)}
|
|
267
273
|
{cron.lastExecution.error && (
|
|
268
|
-
<Text size="xs" c="
|
|
274
|
+
<Text size="xs" c="dimmed" lineClamp={1}>
|
|
269
275
|
{cron.lastExecution.error}
|
|
270
276
|
</Text>
|
|
271
277
|
)}
|
|
@@ -278,9 +284,9 @@ const AdminJobRegistry = () => {
|
|
|
278
284
|
<Text size="xs" c="dimmed" tt="uppercase" fw={600}>
|
|
279
285
|
Failures (7d)
|
|
280
286
|
</Text>
|
|
281
|
-
<
|
|
287
|
+
<Text size="xs" fw={500}>
|
|
282
288
|
{failure.failures}
|
|
283
|
-
</
|
|
289
|
+
</Text>
|
|
284
290
|
{failure.lastError && (
|
|
285
291
|
<Text
|
|
286
292
|
size="xs"
|
|
@@ -301,25 +307,4 @@ const AdminJobRegistry = () => {
|
|
|
301
307
|
);
|
|
302
308
|
};
|
|
303
309
|
|
|
304
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
305
|
-
|
|
306
|
-
const PanelField = ({
|
|
307
|
-
label,
|
|
308
|
-
value,
|
|
309
|
-
monospace,
|
|
310
|
-
}: {
|
|
311
|
-
label: string;
|
|
312
|
-
value: string;
|
|
313
|
-
monospace?: boolean;
|
|
314
|
-
}) => (
|
|
315
|
-
<Flex direction="column" gap={2}>
|
|
316
|
-
<Text size="xs" c="dimmed" tt="uppercase" fw={600}>
|
|
317
|
-
{label}
|
|
318
|
-
</Text>
|
|
319
|
-
<Text size="sm" ff={monospace ? "monospace" : undefined}>
|
|
320
|
-
{value}
|
|
321
|
-
</Text>
|
|
322
|
-
</Flex>
|
|
323
|
-
);
|
|
324
|
-
|
|
325
310
|
export default AdminJobRegistry;
|