@voyantjs/workflows-react 0.106.0 → 0.107.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.
- package/README.md +43 -0
- package/dist/client.d.ts +2 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +1 -0
- package/dist/components/common.d.ts +30 -0
- package/dist/components/common.d.ts.map +1 -0
- package/dist/components/common.js +108 -0
- package/dist/components/workflow-run-actions.d.ts +7 -0
- package/dist/components/workflow-run-actions.d.ts.map +1 -0
- package/dist/components/workflow-run-actions.js +72 -0
- package/dist/components/workflow-run-detail-page.d.ts +10 -0
- package/dist/components/workflow-run-detail-page.d.ts.map +1 -0
- package/dist/components/workflow-run-detail-page.js +96 -0
- package/dist/components/workflow-runs-filters.d.ts +32 -0
- package/dist/components/workflow-runs-filters.d.ts.map +1 -0
- package/dist/components/workflow-runs-filters.js +97 -0
- package/dist/components/workflow-runs-page.d.ts +12 -0
- package/dist/components/workflow-runs-page.d.ts.map +1 -0
- package/dist/components/workflow-runs-page.js +132 -0
- package/dist/components/workflow-schedules-page.d.ts +21 -0
- package/dist/components/workflow-schedules-page.d.ts.map +1 -0
- package/dist/components/workflow-schedules-page.js +144 -0
- package/dist/i18n/en.d.ts +4 -0
- package/dist/i18n/en.d.ts.map +1 -0
- package/dist/i18n/en.js +135 -0
- package/dist/i18n/index.d.ts +5 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +3 -0
- package/dist/i18n/messages.d.ts +125 -0
- package/dist/i18n/messages.d.ts.map +1 -0
- package/dist/i18n/messages.js +1 -0
- package/dist/i18n/provider.d.ts +26 -0
- package/dist/i18n/provider.d.ts.map +1 -0
- package/dist/i18n/provider.js +44 -0
- package/dist/i18n/ro.d.ts +4 -0
- package/dist/i18n/ro.d.ts.map +1 -0
- package/dist/i18n/ro.js +137 -0
- package/dist/schedules-client.d.ts +2 -0
- package/dist/schedules-client.d.ts.map +1 -0
- package/dist/schedules-client.js +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -0
- package/dist/ui.d.ts +9 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +6 -0
- package/package.json +69 -21
- package/src/client.ts +4 -0
- package/src/components/common.tsx +182 -0
- package/src/components/workflow-run-actions.tsx +160 -0
- package/src/components/workflow-run-detail-page.tsx +393 -0
- package/src/components/workflow-runs-filters.tsx +349 -0
- package/src/components/workflow-runs-page.tsx +357 -0
- package/src/components/workflow-schedules-page.tsx +398 -0
- package/src/i18n/en.ts +142 -0
- package/src/i18n/index.ts +26 -0
- package/src/i18n/messages.ts +125 -0
- package/src/i18n/provider.tsx +96 -0
- package/src/i18n/ro.ts +144 -0
- package/src/schedules-client.ts +8 -0
- package/src/styles.css +11 -0
- package/src/types.ts +14 -0
- package/src/ui.ts +63 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { createLocaleFormatters, createPackageMessagesContext, resolvePackageMessages, } from "@voyantjs/i18n";
|
|
4
|
+
import { workflowRunsUiEn } from "./en.js";
|
|
5
|
+
import { workflowRunsUiRo } from "./ro.js";
|
|
6
|
+
const fallbackLocale = "en";
|
|
7
|
+
export const workflowRunsUiMessageDefinitions = {
|
|
8
|
+
en: workflowRunsUiEn,
|
|
9
|
+
ro: workflowRunsUiRo,
|
|
10
|
+
};
|
|
11
|
+
const workflowRunsUiContext = createPackageMessagesContext("WorkflowRunsUiMessages");
|
|
12
|
+
const defaultWorkflowRunsUiI18n = {
|
|
13
|
+
messages: workflowRunsUiEn,
|
|
14
|
+
...createLocaleFormatters(fallbackLocale),
|
|
15
|
+
};
|
|
16
|
+
export function resolveWorkflowRunsUiMessages({ locale, overrides, }) {
|
|
17
|
+
return resolvePackageMessages({
|
|
18
|
+
definitions: workflowRunsUiMessageDefinitions,
|
|
19
|
+
fallbackLocale,
|
|
20
|
+
locale,
|
|
21
|
+
overrides,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
export function getWorkflowRunsUiI18n({ locale, overrides, }) {
|
|
25
|
+
const resolvedLocale = locale ?? fallbackLocale;
|
|
26
|
+
return {
|
|
27
|
+
messages: resolveWorkflowRunsUiMessages({
|
|
28
|
+
locale: resolvedLocale,
|
|
29
|
+
overrides,
|
|
30
|
+
}),
|
|
31
|
+
...createLocaleFormatters(resolvedLocale),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export function WorkflowRunsUiMessagesProvider({ children, locale, overrides, }) {
|
|
35
|
+
return (_jsx(workflowRunsUiContext.ResolvedMessagesProvider, { definitions: workflowRunsUiMessageDefinitions, fallbackLocale: fallbackLocale, locale: locale, overrides: overrides, children: children }));
|
|
36
|
+
}
|
|
37
|
+
export const useWorkflowRunsUiI18n = workflowRunsUiContext.useI18n;
|
|
38
|
+
export const useWorkflowRunsUiMessages = workflowRunsUiContext.useMessages;
|
|
39
|
+
export function useWorkflowRunsUiI18nOrDefault() {
|
|
40
|
+
return workflowRunsUiContext.useOptionalI18n() ?? defaultWorkflowRunsUiI18n;
|
|
41
|
+
}
|
|
42
|
+
export function useWorkflowRunsUiMessagesOrDefault() {
|
|
43
|
+
return useWorkflowRunsUiI18nOrDefault().messages;
|
|
44
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ro.d.ts","sourceRoot":"","sources":["../../src/i18n/ro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA;AAE3D,eAAO,MAAM,gBAAgB,EAAE,sBA2I9B,CAAA;AAED,eAAO,MAAM,aAAa,wBAAmB,CAAA"}
|
package/dist/i18n/ro.js
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
export const workflowRunsUiRo = {
|
|
2
|
+
page: {
|
|
3
|
+
title: "Rulari workflow",
|
|
4
|
+
subtitle: "Executii recente si pasi inregistrati.",
|
|
5
|
+
filterTitle: "Filtru",
|
|
6
|
+
workflowLabel: "Workflow",
|
|
7
|
+
workflowPlaceholder: "checkout-finalize",
|
|
8
|
+
workflowEmpty: "Nu exista workflow-uri in rularile vizibile.",
|
|
9
|
+
searchLabel: "Cautare",
|
|
10
|
+
searchPlaceholder: "Corelatie, eticheta, eroare, input...",
|
|
11
|
+
statusLabel: "Status",
|
|
12
|
+
tagLabel: "Eticheta",
|
|
13
|
+
tagPlaceholder: "bookingId:bk_...",
|
|
14
|
+
tagEmpty: "Nu exista etichete in rularile vizibile.",
|
|
15
|
+
addTag: "Adauga",
|
|
16
|
+
removeTag: "Sterge eticheta",
|
|
17
|
+
timeRangeLabel: "Pornit",
|
|
18
|
+
live: "Live",
|
|
19
|
+
clearFilters: "Curata",
|
|
20
|
+
anyStatus: "Oricare",
|
|
21
|
+
empty: "Nu exista rulari.",
|
|
22
|
+
selectPrompt: "Alege o rulare din lista pentru a vedea pasii si payload-urile.",
|
|
23
|
+
loading: "Se incarca...",
|
|
24
|
+
loadError: "Rularile workflow nu au putut fi incarcate.",
|
|
25
|
+
runCount: (count) => `${count} ${count === 1 ? "rulare" : "rulari"}`,
|
|
26
|
+
filteredRunCount: (filtered, total) => filtered === total
|
|
27
|
+
? `${total} ${total === 1 ? "rulare" : "rulari"}`
|
|
28
|
+
: `${filtered}/${total} rulari`,
|
|
29
|
+
timeRanges: {
|
|
30
|
+
"15m": "15m",
|
|
31
|
+
"1h": "1h",
|
|
32
|
+
"24h": "24h",
|
|
33
|
+
"7d": "7z",
|
|
34
|
+
all: "Toate",
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
status: {
|
|
38
|
+
running: "In rulare",
|
|
39
|
+
succeeded: "Reusita",
|
|
40
|
+
failed: "Esuata",
|
|
41
|
+
cancelled: "Anulata",
|
|
42
|
+
},
|
|
43
|
+
stepStatus: {
|
|
44
|
+
running: "In rulare",
|
|
45
|
+
succeeded: "Reusit",
|
|
46
|
+
failed: "Esuat",
|
|
47
|
+
skipped: "Sarit",
|
|
48
|
+
compensated: "Compensat",
|
|
49
|
+
},
|
|
50
|
+
detail: {
|
|
51
|
+
trigger: "Declansator",
|
|
52
|
+
correlation: "Corelatie",
|
|
53
|
+
parent: "Parinte",
|
|
54
|
+
triggeredBy: "Declansat de",
|
|
55
|
+
tags: "Etichete",
|
|
56
|
+
started: "Pornit",
|
|
57
|
+
finished: "Finalizat",
|
|
58
|
+
steps: "Pasi",
|
|
59
|
+
noSteps: "Nu exista pasi inregistrati.",
|
|
60
|
+
input: "Input",
|
|
61
|
+
output: "Output",
|
|
62
|
+
result: "Rezultat",
|
|
63
|
+
runError: "Eroare rulare",
|
|
64
|
+
stackTrace: "Stack trace",
|
|
65
|
+
copy: "Copiaza",
|
|
66
|
+
copied: "Copiat",
|
|
67
|
+
code: "cod",
|
|
68
|
+
step: "pas",
|
|
69
|
+
reruns: "Reluari ale acestei rulari",
|
|
70
|
+
resumedAt: (step) => `reluat @ ${step}`,
|
|
71
|
+
durationUnavailable: "-",
|
|
72
|
+
},
|
|
73
|
+
actions: {
|
|
74
|
+
rerun: "Ruleaza din nou",
|
|
75
|
+
rerunBusy: "Se reia",
|
|
76
|
+
resume: "Reia de la pasul esuat",
|
|
77
|
+
resumeBusy: "Se reia",
|
|
78
|
+
waitForCompletion: "Asteapta finalizarea acestei rulari inainte de reluare.",
|
|
79
|
+
rerunDescription: "Porneste o rulare noua cu acelasi input inregistrat.",
|
|
80
|
+
resumeDescription: "Sare pasii deja finalizati si reincearca de la pasul esuat.",
|
|
81
|
+
resumeUnavailable: "Reluarea este disponibila doar pentru rulari esuate.",
|
|
82
|
+
actionFailed: "Actiunea a esuat.",
|
|
83
|
+
rerunStarted: "Reluarea a pornit; se deschide rularea noua.",
|
|
84
|
+
resumeStarted: (step) => `Reluat de la pasul "${step}"; se deschide rularea noua.`,
|
|
85
|
+
runnerMissing: "Nu exista runner inregistrat pentru acest workflow. Inregistreaza un WorkflowRunner pentru reluare.",
|
|
86
|
+
rerunBlocked: "Reluarea a fost blocata de regula de siguranta a runnerului.",
|
|
87
|
+
incompletePriorStep: "Nu se poate relua deoarece un pas anterior este incomplet.",
|
|
88
|
+
confirmTitle: "Confirma reluarea",
|
|
89
|
+
confirmBody: "Acest workflow are efecte secundare care se executa din nou la reluare. Rularea noua porneste de la primul pas cu acelasi input.",
|
|
90
|
+
confirmTip: "Daca rularea initiala a esuat la mijloc, foloseste reluarea de la pasul esuat pentru a sari lucrul finalizat.",
|
|
91
|
+
cancel: "Anuleaza",
|
|
92
|
+
rerunAnyway: "Ruleaza oricum",
|
|
93
|
+
},
|
|
94
|
+
format: {
|
|
95
|
+
relativeNow: "acum",
|
|
96
|
+
},
|
|
97
|
+
schedules: {
|
|
98
|
+
title: "Programari workflow",
|
|
99
|
+
subtitle: "Programari cron, interval si one-shot inregistrate.",
|
|
100
|
+
environmentLabel: "Mediu",
|
|
101
|
+
versionLabel: "Manifest",
|
|
102
|
+
workflowColumn: "Workflow",
|
|
103
|
+
scheduleColumn: "Programare",
|
|
104
|
+
nextRunColumn: "Urmatoarea rulare",
|
|
105
|
+
lastRunColumn: "Ultima rulare",
|
|
106
|
+
statusColumn: "Status",
|
|
107
|
+
actionsColumn: "Actiuni",
|
|
108
|
+
enabled: "Activ",
|
|
109
|
+
disabledByRegistration: "Dezactivat",
|
|
110
|
+
disabledByEnvironment: "Dezactivat (filtrat dupa mediu)",
|
|
111
|
+
disabledByEnvFlag: "Dezactivat (flag de mediu)",
|
|
112
|
+
envFlagOff: "Programarile sunt dezactivate de flag-ul de mediu — nimic nu va rula.",
|
|
113
|
+
envFlagOn: "Programarile sunt active.",
|
|
114
|
+
eventDriven: "declansat de eveniment",
|
|
115
|
+
cron: (expr, timezone) => `${expr} (${timezone})`,
|
|
116
|
+
every: (interval) => `la fiecare ${interval}`,
|
|
117
|
+
at: (timestamp) => `la ${timestamp}`,
|
|
118
|
+
triggerNow: "Declanseaza acum",
|
|
119
|
+
triggering: "Se declanseaza...",
|
|
120
|
+
triggerSuccess: "Rulare pornita.",
|
|
121
|
+
triggerFailed: "Declansarea a esuat.",
|
|
122
|
+
refresh: "Reincarca",
|
|
123
|
+
loading: "Se incarca programarile...",
|
|
124
|
+
loadError: "Programarile nu au putut fi incarcate.",
|
|
125
|
+
empty: "Nu exista programari inregistrate pentru acest mediu.",
|
|
126
|
+
inFuture: (relative) => `in ${relative}`,
|
|
127
|
+
inPast: (relative) => `acum ${relative}`,
|
|
128
|
+
notScheduled: "—",
|
|
129
|
+
lastRunSucceeded: (relative) => `reusita acum ${relative}`,
|
|
130
|
+
lastRunFailed: (relative) => `esuata acum ${relative}`,
|
|
131
|
+
lastRunRunning: "in rulare",
|
|
132
|
+
lastRunCancelled: (relative) => `anulata acum ${relative}`,
|
|
133
|
+
lastFireRecorded: (relative) => `declansata acum ${relative}`,
|
|
134
|
+
lastRunNone: "nu a rulat niciodata",
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
export const workflowsUiRo = workflowRunsUiRo;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { createWorkflowSchedulesApiClient, type ListWorkflowSchedulesResponse, type WorkflowScheduleDecl, type WorkflowScheduleSummary, type WorkflowSchedulesApi, type WorkflowSchedulesApiClientOptions, } from "./workflow-schedules-client.js";
|
|
2
|
+
//# sourceMappingURL=schedules-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedules-client.d.ts","sourceRoot":"","sources":["../src/schedules-client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gCAAgC,EAChC,KAAK,6BAA6B,EAClC,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,iCAAiC,GACvC,MAAM,gCAAgC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createWorkflowSchedulesApiClient, } from "./workflow-schedules-client.js";
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export type { ListWorkflowRunsQuery, ListWorkflowRunsResponse, WorkflowRun, WorkflowRunActionError, WorkflowRunActionResponse, WorkflowRunActionResult, WorkflowRunDetailResponse, WorkflowRunErrorPayload, WorkflowRunStatus, WorkflowRunStep, WorkflowRunStepStatus, WorkflowRunsApi, } from "./workflow-runs-client.js";
|
|
2
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,qBAAqB,EACrB,wBAAwB,EACxB,WAAW,EACX,sBAAsB,EACtB,yBAAyB,EACzB,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,eAAe,GAChB,MAAM,2BAA2B,CAAA"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/ui.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type { WorkflowRunsApiClientOptions } from "./client.js";
|
|
2
|
+
export { createWorkflowRunsApiClient } from "./client.js";
|
|
3
|
+
export { WorkflowRunDetailPage, type WorkflowRunDetailPageProps, } from "./components/workflow-run-detail-page.js";
|
|
4
|
+
export { WorkflowRunsPage, type WorkflowRunsPageProps, WorkflowRunsPageSkeleton, } from "./components/workflow-runs-page.js";
|
|
5
|
+
export { WorkflowSchedulesPage, type WorkflowSchedulesPageProps, } from "./components/workflow-schedules-page.js";
|
|
6
|
+
export { getWorkflowRunsUiI18n, getWorkflowRunsUiI18n as getWorkflowsUiI18n, resolveWorkflowRunsUiMessages, resolveWorkflowRunsUiMessages as resolveWorkflowsUiMessages, useWorkflowRunsUiI18n, useWorkflowRunsUiI18n as useWorkflowsUiI18n, useWorkflowRunsUiI18nOrDefault, useWorkflowRunsUiI18nOrDefault as useWorkflowsUiI18nOrDefault, useWorkflowRunsUiMessages, useWorkflowRunsUiMessages as useWorkflowsUiMessages, useWorkflowRunsUiMessagesOrDefault, useWorkflowRunsUiMessagesOrDefault as useWorkflowsUiMessagesOrDefault, type WorkflowRunsUiMessageOverrides, type WorkflowRunsUiMessageOverrides as WorkflowsUiMessageOverrides, type WorkflowRunsUiMessages, type WorkflowRunsUiMessages as WorkflowsUiMessages, WorkflowRunsUiMessagesProvider, WorkflowRunsUiMessagesProvider as WorkflowsUiMessagesProvider, workflowRunsUiEn, workflowRunsUiEn as workflowsUiEn, workflowRunsUiMessageDefinitions, workflowRunsUiMessageDefinitions as workflowsUiMessageDefinitions, workflowRunsUiRo, workflowRunsUiRo as workflowsUiRo, } from "./i18n/index.js";
|
|
7
|
+
export { createWorkflowSchedulesApiClient, type ListWorkflowSchedulesResponse, type WorkflowScheduleDecl, type WorkflowScheduleSummary, type WorkflowSchedulesApi, type WorkflowSchedulesApiClientOptions, } from "./schedules-client.js";
|
|
8
|
+
export type { ListWorkflowRunsQuery, ListWorkflowRunsResponse, WorkflowRun, WorkflowRunActionError, WorkflowRunActionResponse, WorkflowRunActionResult, WorkflowRunDetailResponse, WorkflowRunErrorPayload, WorkflowRunStatus, WorkflowRunStep, WorkflowRunStepStatus, WorkflowRunsApi, } from "./types.js";
|
|
9
|
+
//# sourceMappingURL=ui.d.ts.map
|
package/dist/ui.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,EACL,qBAAqB,EACrB,KAAK,0BAA0B,GAChC,MAAM,0CAA0C,CAAA;AACjD,OAAO,EACL,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,wBAAwB,GACzB,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EACL,qBAAqB,EACrB,KAAK,0BAA0B,GAChC,MAAM,yCAAyC,CAAA;AAChD,OAAO,EACL,qBAAqB,EACrB,qBAAqB,IAAI,kBAAkB,EAC3C,6BAA6B,EAC7B,6BAA6B,IAAI,0BAA0B,EAC3D,qBAAqB,EACrB,qBAAqB,IAAI,kBAAkB,EAC3C,8BAA8B,EAC9B,8BAA8B,IAAI,2BAA2B,EAC7D,yBAAyB,EACzB,yBAAyB,IAAI,sBAAsB,EACnD,kCAAkC,EAClC,kCAAkC,IAAI,+BAA+B,EACrE,KAAK,8BAA8B,EACnC,KAAK,8BAA8B,IAAI,2BAA2B,EAClE,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,IAAI,mBAAmB,EAClD,8BAA8B,EAC9B,8BAA8B,IAAI,2BAA2B,EAC7D,gBAAgB,EAChB,gBAAgB,IAAI,aAAa,EACjC,gCAAgC,EAChC,gCAAgC,IAAI,6BAA6B,EACjE,gBAAgB,EAChB,gBAAgB,IAAI,aAAa,GAClC,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,gCAAgC,EAChC,KAAK,6BAA6B,EAClC,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,iCAAiC,GACvC,MAAM,uBAAuB,CAAA;AAC9B,YAAY,EACV,qBAAqB,EACrB,wBAAwB,EACxB,WAAW,EACX,sBAAsB,EACtB,yBAAyB,EACzB,uBAAuB,EACvB,yBAAyB,EACzB,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,eAAe,GAChB,MAAM,YAAY,CAAA"}
|
package/dist/ui.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { createWorkflowRunsApiClient } from "./client.js";
|
|
2
|
+
export { WorkflowRunDetailPage, } from "./components/workflow-run-detail-page.js";
|
|
3
|
+
export { WorkflowRunsPage, WorkflowRunsPageSkeleton, } from "./components/workflow-runs-page.js";
|
|
4
|
+
export { WorkflowSchedulesPage, } from "./components/workflow-schedules-page.js";
|
|
5
|
+
export { getWorkflowRunsUiI18n, getWorkflowRunsUiI18n as getWorkflowsUiI18n, resolveWorkflowRunsUiMessages, resolveWorkflowRunsUiMessages as resolveWorkflowsUiMessages, useWorkflowRunsUiI18n, useWorkflowRunsUiI18n as useWorkflowsUiI18n, useWorkflowRunsUiI18nOrDefault, useWorkflowRunsUiI18nOrDefault as useWorkflowsUiI18nOrDefault, useWorkflowRunsUiMessages, useWorkflowRunsUiMessages as useWorkflowsUiMessages, useWorkflowRunsUiMessagesOrDefault, useWorkflowRunsUiMessagesOrDefault as useWorkflowsUiMessagesOrDefault, WorkflowRunsUiMessagesProvider, WorkflowRunsUiMessagesProvider as WorkflowsUiMessagesProvider, workflowRunsUiEn, workflowRunsUiEn as workflowsUiEn, workflowRunsUiMessageDefinitions, workflowRunsUiMessageDefinitions as workflowsUiMessageDefinitions, workflowRunsUiRo, workflowRunsUiRo as workflowsUiRo, } from "./i18n/index.js";
|
|
6
|
+
export { createWorkflowSchedulesApiClient, } from "./schedules-client.js";
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voyantjs/workflows-react",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "React hooks for Voyant Workflows — trigger, subscribe, and stream runs.",
|
|
3
|
+
"version": "0.107.1",
|
|
4
|
+
"description": "React hooks for Voyant Workflows — trigger, subscribe, and stream runs — plus the styled workflow-run admin UI (formerly @voyantjs/workflows-ui).",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -30,46 +30,94 @@
|
|
|
30
30
|
"types": "./dist/workflow-schedules-client.d.ts",
|
|
31
31
|
"import": "./dist/workflow-schedules-client.js",
|
|
32
32
|
"default": "./dist/workflow-schedules-client.js"
|
|
33
|
+
},
|
|
34
|
+
"./ui": {
|
|
35
|
+
"types": "./dist/ui.d.ts",
|
|
36
|
+
"import": "./dist/ui.js",
|
|
37
|
+
"default": "./dist/ui.js"
|
|
38
|
+
},
|
|
39
|
+
"./client": {
|
|
40
|
+
"types": "./dist/client.d.ts",
|
|
41
|
+
"import": "./dist/client.js",
|
|
42
|
+
"default": "./dist/client.js"
|
|
43
|
+
},
|
|
44
|
+
"./styles.css": {
|
|
45
|
+
"default": "./src/styles.css"
|
|
46
|
+
},
|
|
47
|
+
"./i18n": {
|
|
48
|
+
"types": "./dist/i18n/index.d.ts",
|
|
49
|
+
"import": "./dist/i18n/index.js",
|
|
50
|
+
"default": "./dist/i18n/index.js"
|
|
51
|
+
},
|
|
52
|
+
"./i18n/en": {
|
|
53
|
+
"types": "./dist/i18n/en.d.ts",
|
|
54
|
+
"import": "./dist/i18n/en.js",
|
|
55
|
+
"default": "./dist/i18n/en.js"
|
|
56
|
+
},
|
|
57
|
+
"./i18n/ro": {
|
|
58
|
+
"types": "./dist/i18n/ro.d.ts",
|
|
59
|
+
"import": "./dist/i18n/ro.js",
|
|
60
|
+
"default": "./dist/i18n/ro.js"
|
|
61
|
+
},
|
|
62
|
+
"./components/*": {
|
|
63
|
+
"types": "./dist/components/*.d.ts",
|
|
64
|
+
"import": "./dist/components/*.js",
|
|
65
|
+
"default": "./dist/components/*.js"
|
|
33
66
|
}
|
|
34
67
|
},
|
|
35
|
-
"main": "./dist/index.js",
|
|
36
|
-
"types": "./dist/index.d.ts",
|
|
37
|
-
"files": [
|
|
38
|
-
"dist",
|
|
39
|
-
"src",
|
|
40
|
-
"!**/*.test.*",
|
|
41
|
-
"!**/*.spec.*",
|
|
42
|
-
"NOTICE"
|
|
43
|
-
],
|
|
44
68
|
"dependencies": {
|
|
69
|
+
"@voyantjs/i18n": "^0.106.0",
|
|
45
70
|
"@voyantjs/react": "^0.104.1",
|
|
46
|
-
"@voyantjs/workflows": "^0.
|
|
71
|
+
"@voyantjs/workflows": "^0.107.1"
|
|
47
72
|
},
|
|
48
73
|
"peerDependencies": {
|
|
49
74
|
"@tanstack/react-query": "^5.0.0",
|
|
75
|
+
"lucide-react": "^0.475.0 || ^1.0.0",
|
|
50
76
|
"react": "^19.0.0",
|
|
51
|
-
"react-dom": "^19.0.0"
|
|
77
|
+
"react-dom": "^19.0.0",
|
|
78
|
+
"@voyantjs/ui": "^0.106.0"
|
|
79
|
+
},
|
|
80
|
+
"peerDependenciesMeta": {
|
|
81
|
+
"@voyantjs/ui": {
|
|
82
|
+
"optional": true
|
|
83
|
+
},
|
|
84
|
+
"lucide-react": {
|
|
85
|
+
"optional": true
|
|
86
|
+
}
|
|
52
87
|
},
|
|
53
88
|
"devDependencies": {
|
|
54
89
|
"@tanstack/react-query": "^5.100.11",
|
|
55
|
-
"@types/react": "^19.
|
|
90
|
+
"@types/react": "^19.2.14",
|
|
56
91
|
"@types/react-dom": "^19.2.3",
|
|
57
|
-
"react": "^
|
|
92
|
+
"lucide-react": "^1.7.0",
|
|
93
|
+
"react": "^19.2.4",
|
|
58
94
|
"react-dom": "^19.2.4",
|
|
59
|
-
"typescript": "^
|
|
95
|
+
"typescript": "^6.0.2",
|
|
60
96
|
"vitest": "^4.1.2",
|
|
97
|
+
"@voyantjs/i18n": "^0.106.0",
|
|
61
98
|
"@voyantjs/react": "^0.104.1",
|
|
99
|
+
"@voyantjs/ui": "^0.106.0",
|
|
62
100
|
"@voyantjs/voyant-typescript-config": "^0.1.0"
|
|
63
101
|
},
|
|
102
|
+
"files": [
|
|
103
|
+
"dist",
|
|
104
|
+
"src",
|
|
105
|
+
"!**/*.test.*",
|
|
106
|
+
"!**/*.spec.*",
|
|
107
|
+
"NOTICE",
|
|
108
|
+
"src/components",
|
|
109
|
+
"src/styles.css"
|
|
110
|
+
],
|
|
64
111
|
"publishConfig": {
|
|
65
112
|
"access": "public"
|
|
66
113
|
},
|
|
67
114
|
"scripts": {
|
|
68
|
-
"build": "tsc -p tsconfig.json",
|
|
69
|
-
"
|
|
115
|
+
"build": "tsc -p tsconfig.build.json",
|
|
116
|
+
"clean": "rm -rf dist tsconfig.tsbuildinfo tsconfig.build.tsbuildinfo",
|
|
70
117
|
"typecheck": "tsc --noEmit",
|
|
71
118
|
"lint": "biome check src/",
|
|
72
|
-
"test": "vitest run --passWithNoTests"
|
|
73
|
-
|
|
74
|
-
|
|
119
|
+
"test": "vitest run --passWithNoTests"
|
|
120
|
+
},
|
|
121
|
+
"main": "./dist/index.js",
|
|
122
|
+
"types": "./dist/index.d.ts"
|
|
75
123
|
}
|
package/src/client.ts
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import { Badge } from "@voyantjs/ui/components/badge"
|
|
4
|
+
import { AlertCircle, CheckCircle2, Clock, Copy, RefreshCw, XCircle } from "lucide-react"
|
|
5
|
+
import { useMemo, useState } from "react"
|
|
6
|
+
|
|
7
|
+
import { useWorkflowRunsUiMessagesOrDefault, type WorkflowRunsUiMessages } from "../i18n/index.js"
|
|
8
|
+
import type { WorkflowRun, WorkflowRunStep, WorkflowRunStepStatus } from "../types.js"
|
|
9
|
+
|
|
10
|
+
export function StatusIcon({ status }: { status: WorkflowRun["status"] }) {
|
|
11
|
+
switch (status) {
|
|
12
|
+
case "succeeded":
|
|
13
|
+
return <CheckCircle2 className="h-4 w-4 text-emerald-500" />
|
|
14
|
+
case "failed":
|
|
15
|
+
return <XCircle className="h-4 w-4 text-destructive" />
|
|
16
|
+
case "cancelled":
|
|
17
|
+
return <AlertCircle className="h-4 w-4 text-amber-500" />
|
|
18
|
+
case "running":
|
|
19
|
+
return <Clock className="h-4 w-4 animate-pulse text-blue-500" />
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function StepStatusIcon({ status }: { status: WorkflowRunStepStatus }) {
|
|
24
|
+
switch (status) {
|
|
25
|
+
case "succeeded":
|
|
26
|
+
return <CheckCircle2 className="h-4 w-4 text-emerald-500" />
|
|
27
|
+
case "failed":
|
|
28
|
+
return <XCircle className="h-4 w-4 text-destructive" />
|
|
29
|
+
case "running":
|
|
30
|
+
return <Clock className="h-4 w-4 animate-pulse text-blue-500" />
|
|
31
|
+
case "skipped":
|
|
32
|
+
return <AlertCircle className="h-4 w-4 text-muted-foreground" />
|
|
33
|
+
case "compensated":
|
|
34
|
+
return <RefreshCw className="h-4 w-4 text-amber-500" />
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function StatusBadge({
|
|
39
|
+
status,
|
|
40
|
+
messages,
|
|
41
|
+
}: {
|
|
42
|
+
status: WorkflowRun["status"]
|
|
43
|
+
messages: WorkflowRunsUiMessages
|
|
44
|
+
}) {
|
|
45
|
+
useWorkflowRunsUiMessagesOrDefault()
|
|
46
|
+
const className = {
|
|
47
|
+
succeeded: "border-emerald-500/40 bg-emerald-500/10 text-emerald-600 dark:text-emerald-300", // i18n-literal-ok: CSS classes
|
|
48
|
+
failed: "border-destructive/40 bg-destructive/10 text-destructive", // i18n-literal-ok: CSS classes
|
|
49
|
+
cancelled: "border-amber-500/40 bg-amber-500/10 text-amber-600 dark:text-amber-300", // i18n-literal-ok: CSS classes
|
|
50
|
+
running: "border-blue-500/40 bg-blue-500/10 text-blue-600 dark:text-blue-300", // i18n-literal-ok: CSS classes
|
|
51
|
+
}[status]
|
|
52
|
+
return (
|
|
53
|
+
<Badge variant="outline" className={`text-[11px] ${className}`}>
|
|
54
|
+
{messages.status[status]}
|
|
55
|
+
</Badge>
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function TagChip({ tag }: { tag: string }) {
|
|
60
|
+
const colonIdx = tag.indexOf(":")
|
|
61
|
+
if (colonIdx < 0) {
|
|
62
|
+
return (
|
|
63
|
+
<Badge variant="outline" className="font-mono text-[10px]">
|
|
64
|
+
{tag}
|
|
65
|
+
</Badge>
|
|
66
|
+
)
|
|
67
|
+
}
|
|
68
|
+
const key = tag.slice(0, colonIdx)
|
|
69
|
+
const value = tag.slice(colonIdx + 1)
|
|
70
|
+
return (
|
|
71
|
+
<Badge variant="outline" className="gap-1 font-mono text-[10px]" title={tag}>
|
|
72
|
+
<span className="text-muted-foreground">{key}</span>
|
|
73
|
+
<span className="max-w-[18ch] truncate">{value}</span>
|
|
74
|
+
</Badge>
|
|
75
|
+
)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function CopyableId({
|
|
79
|
+
id,
|
|
80
|
+
copiedLabel,
|
|
81
|
+
className,
|
|
82
|
+
}: {
|
|
83
|
+
id: string
|
|
84
|
+
copiedLabel: string
|
|
85
|
+
className?: string
|
|
86
|
+
}) {
|
|
87
|
+
const [copied, setCopied] = useState(false)
|
|
88
|
+
const onCopy = async () => {
|
|
89
|
+
try {
|
|
90
|
+
await navigator.clipboard.writeText(id)
|
|
91
|
+
setCopied(true)
|
|
92
|
+
setTimeout(() => setCopied(false), 1500)
|
|
93
|
+
} catch {
|
|
94
|
+
/* clipboard blocked */
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return (
|
|
98
|
+
<button
|
|
99
|
+
type="button"
|
|
100
|
+
onClick={onCopy}
|
|
101
|
+
className={`group inline-flex items-center gap-1.5 rounded border bg-muted/40 px-2 py-1 font-mono text-[11px] hover:bg-muted ${
|
|
102
|
+
className ?? ""
|
|
103
|
+
}`}
|
|
104
|
+
title={id}
|
|
105
|
+
>
|
|
106
|
+
<span className="max-w-[16ch] truncate">{id}</span>
|
|
107
|
+
<Copy className="h-3 w-3 opacity-60 group-hover:opacity-100" />
|
|
108
|
+
{copied ? <span className="text-emerald-500 text-[10px]">{copiedLabel}</span> : null}
|
|
109
|
+
</button>
|
|
110
|
+
)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export function PayloadBlock({
|
|
114
|
+
title,
|
|
115
|
+
value,
|
|
116
|
+
messages,
|
|
117
|
+
hideTitle = false,
|
|
118
|
+
}: {
|
|
119
|
+
title: string
|
|
120
|
+
value: Record<string, unknown>
|
|
121
|
+
messages: WorkflowRunsUiMessages
|
|
122
|
+
hideTitle?: boolean
|
|
123
|
+
}) {
|
|
124
|
+
const [copied, setCopied] = useState(false)
|
|
125
|
+
const json = useMemo(() => JSON.stringify(value, null, 2), [value])
|
|
126
|
+
|
|
127
|
+
const onCopy = async () => {
|
|
128
|
+
try {
|
|
129
|
+
await navigator.clipboard.writeText(json)
|
|
130
|
+
setCopied(true)
|
|
131
|
+
setTimeout(() => setCopied(false), 1500)
|
|
132
|
+
} catch {
|
|
133
|
+
/* clipboard blocked */
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return (
|
|
138
|
+
<div className="space-y-1">
|
|
139
|
+
{hideTitle ? null : (
|
|
140
|
+
<div className="flex items-center justify-between gap-2">
|
|
141
|
+
<span className="text-muted-foreground text-xs">{title}</span>
|
|
142
|
+
<button
|
|
143
|
+
type="button"
|
|
144
|
+
onClick={onCopy}
|
|
145
|
+
className="flex items-center gap-1 text-muted-foreground text-xs hover:text-foreground"
|
|
146
|
+
>
|
|
147
|
+
<Copy className="h-3 w-3" />
|
|
148
|
+
{copied ? messages.detail.copied : messages.detail.copy}
|
|
149
|
+
</button>
|
|
150
|
+
</div>
|
|
151
|
+
)}
|
|
152
|
+
<pre className="max-h-[24rem] overflow-auto rounded bg-muted/40 p-3 font-mono text-[11px] leading-relaxed">
|
|
153
|
+
{json}
|
|
154
|
+
</pre>
|
|
155
|
+
</div>
|
|
156
|
+
)
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export function formatRelative(iso: string, messages: WorkflowRunsUiMessages): string {
|
|
160
|
+
const seconds = Math.round((Date.now() - new Date(iso).getTime()) / 1000)
|
|
161
|
+
if (Math.abs(seconds) < 5) return messages.format.relativeNow
|
|
162
|
+
const formatter = new Intl.RelativeTimeFormat(undefined, { numeric: "auto" })
|
|
163
|
+
if (Math.abs(seconds) < 60) return formatter.format(-seconds, "second")
|
|
164
|
+
const minutes = Math.round(seconds / 60)
|
|
165
|
+
if (Math.abs(minutes) < 60) return formatter.format(-minutes, "minute")
|
|
166
|
+
const hours = Math.round(minutes / 60)
|
|
167
|
+
if (Math.abs(hours) < 24) return formatter.format(-hours, "hour")
|
|
168
|
+
const days = Math.round(hours / 24)
|
|
169
|
+
return formatter.format(-days, "day")
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export function formatDuration(ms: number): string {
|
|
173
|
+
if (ms < 1000) return `${ms}ms`
|
|
174
|
+
if (ms < 60_000) return `${(ms / 1000).toFixed(2)}s`
|
|
175
|
+
const minutes = Math.floor(ms / 60_000)
|
|
176
|
+
const seconds = Math.round((ms % 60_000) / 1000)
|
|
177
|
+
return `${minutes}m ${seconds}s`
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export function runHasLiveStatus(run: WorkflowRun | WorkflowRunStep): boolean {
|
|
181
|
+
return run.status === "running"
|
|
182
|
+
}
|