@burdenoff/fluidgrids-fe-sdk 2026.825.2 → 2026.829.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/dist/ExecutionDetailPage-OWNO2BEW.js +11 -0
- package/dist/{ExecutionDetailPage-FF2DYKAZ.js.map → ExecutionDetailPage-OWNO2BEW.js.map} +1 -1
- package/dist/ExecutionsListPage-6O4AS3CM.js +10 -0
- package/dist/{ExecutionsListPage-NKISRFMA.js.map → ExecutionsListPage-6O4AS3CM.js.map} +1 -1
- package/dist/{MissingNodesInstallModal-HA5L3FK2.js → MissingNodesInstallModal-PZYTCNCV.js} +4 -4
- package/dist/{MissingNodesInstallModal-HA5L3FK2.js.map → MissingNodesInstallModal-PZYTCNCV.js.map} +1 -1
- package/dist/{TemplateConfigurationModal-MXNGZQIC.js → TemplateConfigurationModal-TB7DJBTR.js} +11 -8
- package/dist/TemplateConfigurationModal-TB7DJBTR.js.map +1 -0
- package/dist/{TemplateDetailPanel-CJ3NPVTP.js → TemplateDetailPanel-KS3LQIBD.js} +3 -4
- package/dist/TemplateDetailPanel-KS3LQIBD.js.map +1 -0
- package/dist/WorkflowBuilder-426LYWCE.js +19 -0
- package/dist/{WorkflowBuilder-URMQZLQU.js.map → WorkflowBuilder-426LYWCE.js.map} +1 -1
- package/dist/WorkflowsList-XQW7YPZX.js +12 -0
- package/dist/{WorkflowsList-TZAN3YBA.js.map → WorkflowsList-XQW7YPZX.js.map} +1 -1
- package/dist/{chunk-7VNIEIR6.js → chunk-7YWBH2A5.js} +9 -3
- package/dist/chunk-7YWBH2A5.js.map +1 -0
- package/dist/chunk-ACRXNUU2.js +504 -0
- package/dist/chunk-ACRXNUU2.js.map +1 -0
- package/dist/{chunk-6PNRM3KQ.js → chunk-AE7FZRTH.js} +5 -4
- package/dist/chunk-AE7FZRTH.js.map +1 -0
- package/dist/{chunk-YJKZSUNC.js → chunk-BF4YC7XN.js} +32 -15
- package/dist/chunk-BF4YC7XN.js.map +1 -0
- package/dist/chunk-CLPFGB5Y.js +453 -0
- package/dist/chunk-CLPFGB5Y.js.map +1 -0
- package/dist/{chunk-MH4AHYK3.js → chunk-ELB3LXRJ.js} +17 -5
- package/dist/chunk-ELB3LXRJ.js.map +1 -0
- package/dist/{chunk-IWKLEFC7.js → chunk-GBDXBJPH.js} +7 -6
- package/dist/chunk-GBDXBJPH.js.map +1 -0
- package/dist/{chunk-Y36DJHU3.js → chunk-KT72XMAB.js} +4 -176
- package/dist/chunk-KT72XMAB.js.map +1 -0
- package/dist/chunk-LMO5ASOE.js +43 -0
- package/dist/chunk-LMO5ASOE.js.map +1 -0
- package/dist/{chunk-OHGXRM6Z.js → chunk-NH5YCY37.js} +3 -3
- package/dist/{chunk-OHGXRM6Z.js.map → chunk-NH5YCY37.js.map} +1 -1
- package/dist/chunk-NHPGJMJX.js +395 -0
- package/dist/chunk-NHPGJMJX.js.map +1 -0
- package/dist/{chunk-DVPXNC2S.js → chunk-NZ67MDME.js} +7871 -8046
- package/dist/chunk-NZ67MDME.js.map +1 -0
- package/dist/chunk-PYD2V4U6.js +541 -0
- package/dist/chunk-PYD2V4U6.js.map +1 -0
- package/dist/chunk-RXMBIJ5Z.js +3 -0
- package/dist/chunk-RXMBIJ5Z.js.map +1 -0
- package/dist/{chunk-SG7Z2IRQ.js → chunk-UPN73SK4.js} +5 -5
- package/dist/{chunk-SG7Z2IRQ.js.map → chunk-UPN73SK4.js.map} +1 -1
- package/dist/chunk-VJ2NTNDZ.js +4901 -0
- package/dist/chunk-VJ2NTNDZ.js.map +1 -0
- package/dist/chunk-VJDLWE5S.js +505 -0
- package/dist/chunk-VJDLWE5S.js.map +1 -0
- package/dist/{chunk-V5UEEB74.js → chunk-WO3AHQVD.js} +17 -41
- package/dist/chunk-WO3AHQVD.js.map +1 -0
- package/dist/executions.d.ts +7 -0
- package/dist/executions.js +14 -0
- package/dist/executions.js.map +1 -0
- package/dist/history.d.ts +5 -0
- package/dist/history.js +9 -0
- package/dist/history.js.map +1 -0
- package/dist/index.d.ts +147 -616
- package/dist/index.js +61 -6870
- package/dist/index.js.map +1 -1
- package/dist/nodes.d.ts +5 -0
- package/dist/nodes.js +6 -0
- package/dist/nodes.js.map +1 -0
- package/dist/settings.d.ts +5 -0
- package/dist/settings.js +4 -0
- package/dist/settings.js.map +1 -0
- package/dist/templates.d.ts +17 -0
- package/dist/templates.js +19 -0
- package/dist/templates.js.map +1 -0
- package/dist/workflow-builder-JKkdIJoP.d.ts +473 -0
- package/dist/workflow-builder.d.ts +5 -0
- package/dist/workflow-builder.js +20 -0
- package/dist/workflow-builder.js.map +1 -0
- package/dist/workflows-list.d.ts +5 -0
- package/dist/workflows-list.js +12 -0
- package/dist/workflows-list.js.map +1 -0
- package/package.json +29 -1
- package/dist/ExecutionDetailPage-FF2DYKAZ.js +0 -10
- package/dist/ExecutionsListPage-NKISRFMA.js +0 -9
- package/dist/TemplateConfigurationModal-MXNGZQIC.js.map +0 -1
- package/dist/TemplateDetailPanel-CJ3NPVTP.js.map +0 -1
- package/dist/WorkflowBuilder-URMQZLQU.js +0 -17
- package/dist/WorkflowsList-TZAN3YBA.js +0 -11
- package/dist/chunk-6PNRM3KQ.js.map +0 -1
- package/dist/chunk-7VNIEIR6.js.map +0 -1
- package/dist/chunk-DVPXNC2S.js.map +0 -1
- package/dist/chunk-IWKLEFC7.js.map +0 -1
- package/dist/chunk-MH4AHYK3.js.map +0 -1
- package/dist/chunk-V5UEEB74.js.map +0 -1
- package/dist/chunk-Y36DJHU3.js.map +0 -1
- package/dist/chunk-YJKZSUNC.js.map +0 -1
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
import { useWorkflowDefinitions } from './chunk-ELB3LXRJ.js';
|
|
2
|
+
import { getFluidGridsConfig } from './chunk-WWU2O2SR.js';
|
|
3
|
+
import { useTr } from './chunk-7YWBH2A5.js';
|
|
4
|
+
import { useState, useMemo, useCallback } from 'react';
|
|
5
|
+
import { useNavigate } from 'react-router';
|
|
6
|
+
import { Icon } from '@iconify/react';
|
|
7
|
+
import { Button } from '@burdenoff/fe-libs/button';
|
|
8
|
+
import { Input, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, Badge, TooltipProvider, Tooltip, TooltipTrigger, TooltipContent, Skeleton } from '@burdenoff/fe-libs/ui';
|
|
9
|
+
import { useActorProfiles, buildActorFallback } from '@burdenoff/fe-libs/shared';
|
|
10
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
11
|
+
|
|
12
|
+
var PAGE_SIZE = 20;
|
|
13
|
+
var FETCH_LIMIT = 500;
|
|
14
|
+
function useStatusStyles() {
|
|
15
|
+
const tr = useTr();
|
|
16
|
+
return useMemo(
|
|
17
|
+
() => ({
|
|
18
|
+
ACTIVE: {
|
|
19
|
+
label: tr("fluidgrids.history.historyPage.statusActive", "Active"),
|
|
20
|
+
variant: "default"
|
|
21
|
+
},
|
|
22
|
+
DRAFT: {
|
|
23
|
+
label: tr("fluidgrids.history.historyPage.statusDraft", "Draft"),
|
|
24
|
+
variant: "secondary"
|
|
25
|
+
},
|
|
26
|
+
ARCHIVED: {
|
|
27
|
+
label: tr("fluidgrids.history.historyPage.statusArchived", "Archived"),
|
|
28
|
+
variant: "outline"
|
|
29
|
+
},
|
|
30
|
+
DEPRECATED: {
|
|
31
|
+
label: tr(
|
|
32
|
+
"fluidgrids.history.historyPage.statusDeprecated",
|
|
33
|
+
"Deprecated"
|
|
34
|
+
),
|
|
35
|
+
variant: "destructive"
|
|
36
|
+
}
|
|
37
|
+
}),
|
|
38
|
+
[tr]
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
function HistoryTableSkeleton() {
|
|
42
|
+
return /* @__PURE__ */ jsx("div", { className: "space-y-3", children: Array.from({ length: 6 }).map((_, i) => /* @__PURE__ */ jsx(
|
|
43
|
+
Skeleton,
|
|
44
|
+
{
|
|
45
|
+
className: "h-14 w-full rounded-lg bg-card-foreground/10"
|
|
46
|
+
},
|
|
47
|
+
i
|
|
48
|
+
)) });
|
|
49
|
+
}
|
|
50
|
+
function EmptyState() {
|
|
51
|
+
const tr = useTr();
|
|
52
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center py-20 text-center", children: [
|
|
53
|
+
/* @__PURE__ */ jsx("div", { className: "rounded-full bg-background-secondary p-4 mb-4", children: /* @__PURE__ */ jsx(Icon, { icon: "mdi:history", width: 40, className: "text-text-secondary" }) }),
|
|
54
|
+
/* @__PURE__ */ jsx("h3", { className: "text-lg font-semibold text-text-primary mb-2", children: tr("fluidgrids.history.historyPage.emptyTitle", "No version history") }),
|
|
55
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-text-secondary max-w-md", children: tr(
|
|
56
|
+
"fluidgrids.history.historyPage.emptyHint",
|
|
57
|
+
"Version history will appear here once you create and update workflows."
|
|
58
|
+
) })
|
|
59
|
+
] });
|
|
60
|
+
}
|
|
61
|
+
function ErrorState({
|
|
62
|
+
message,
|
|
63
|
+
onRetry
|
|
64
|
+
}) {
|
|
65
|
+
const tr = useTr();
|
|
66
|
+
return /* @__PURE__ */ jsxs("div", { className: "p-4 bg-[var(--color-status-error-bg-subtle)] border border-[var(--color-status-error-border)] rounded-lg", children: [
|
|
67
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-[var(--color-status-error-text)]", children: [
|
|
68
|
+
/* @__PURE__ */ jsx(Icon, { icon: "mdi:alert-circle", width: 20 }),
|
|
69
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: tr(
|
|
70
|
+
"fluidgrids.history.historyPage.errorHeading",
|
|
71
|
+
"Error loading history"
|
|
72
|
+
) })
|
|
73
|
+
] }),
|
|
74
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-[var(--color-status-error-text)]", children: message }),
|
|
75
|
+
/* @__PURE__ */ jsx(
|
|
76
|
+
Button,
|
|
77
|
+
{
|
|
78
|
+
variant: "outline",
|
|
79
|
+
size: "sm",
|
|
80
|
+
onClick: onRetry,
|
|
81
|
+
className: "mt-3 border-[var(--color-status-error-border)] text-[var(--color-status-error-text)] hover:bg-[var(--color-status-error-bg-subtle)]",
|
|
82
|
+
children: tr("fluidgrids.history.historyPage.errorRetry", "Retry")
|
|
83
|
+
}
|
|
84
|
+
)
|
|
85
|
+
] });
|
|
86
|
+
}
|
|
87
|
+
function StatCard({
|
|
88
|
+
label,
|
|
89
|
+
value,
|
|
90
|
+
valueClassName
|
|
91
|
+
}) {
|
|
92
|
+
return /* @__PURE__ */ jsxs("div", { className: "p-3 rounded-lg bg-background-secondary border border-border-secondary", children: [
|
|
93
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-text-secondary", children: label }),
|
|
94
|
+
/* @__PURE__ */ jsx(
|
|
95
|
+
"p",
|
|
96
|
+
{
|
|
97
|
+
className: `text-xl font-bold ${valueClassName ?? "text-text-primary"}`,
|
|
98
|
+
children: value
|
|
99
|
+
}
|
|
100
|
+
)
|
|
101
|
+
] });
|
|
102
|
+
}
|
|
103
|
+
function HistoryPage() {
|
|
104
|
+
const tr = useTr();
|
|
105
|
+
const navigate = useNavigate();
|
|
106
|
+
const STATUS_STYLES = useStatusStyles();
|
|
107
|
+
const [search, setSearch] = useState("");
|
|
108
|
+
const [workflowFilter, setWorkflowFilter] = useState("all");
|
|
109
|
+
const [page, setPage] = useState(0);
|
|
110
|
+
const {
|
|
111
|
+
workflows: versionRows,
|
|
112
|
+
total,
|
|
113
|
+
hasMore,
|
|
114
|
+
loading,
|
|
115
|
+
error,
|
|
116
|
+
refetch
|
|
117
|
+
} = useWorkflowDefinitions({ limit: FETCH_LIMIT });
|
|
118
|
+
const allRows = useMemo(
|
|
119
|
+
() => [...versionRows].sort(
|
|
120
|
+
(a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime()
|
|
121
|
+
),
|
|
122
|
+
[versionRows]
|
|
123
|
+
);
|
|
124
|
+
const distinctWorkflows = useMemo(() => {
|
|
125
|
+
const byKey = /* @__PURE__ */ new Map();
|
|
126
|
+
for (const row of allRows) {
|
|
127
|
+
if (!byKey.has(row.workflowKey)) {
|
|
128
|
+
byKey.set(row.workflowKey, {
|
|
129
|
+
workflowKey: row.workflowKey,
|
|
130
|
+
name: row.name
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return [...byKey.values()];
|
|
135
|
+
}, [allRows]);
|
|
136
|
+
const config = getFluidGridsConfig();
|
|
137
|
+
const actorInputs = useMemo(() => {
|
|
138
|
+
const ids = /* @__PURE__ */ new Set();
|
|
139
|
+
for (const row of allRows) {
|
|
140
|
+
if (row.createdById) ids.add(row.createdById);
|
|
141
|
+
}
|
|
142
|
+
return [...ids].map((actorId) => ({ actorId, actorType: "user" }));
|
|
143
|
+
}, [allRows]);
|
|
144
|
+
const actorProfiles = useActorProfiles(actorInputs, {
|
|
145
|
+
workspaceId: config.workspaceId || void 0,
|
|
146
|
+
orgId: config.organizationId,
|
|
147
|
+
authToken: config.authToken
|
|
148
|
+
});
|
|
149
|
+
const changedByLabel = useCallback(
|
|
150
|
+
(createdById) => {
|
|
151
|
+
if (!createdById) return "\u2014";
|
|
152
|
+
return actorProfiles[createdById]?.displayName ?? buildActorFallback({ actorId: createdById, actorType: "user" }).displayName;
|
|
153
|
+
},
|
|
154
|
+
[actorProfiles]
|
|
155
|
+
);
|
|
156
|
+
const filteredRows = useMemo(() => {
|
|
157
|
+
let rows = allRows;
|
|
158
|
+
if (workflowFilter !== "all") {
|
|
159
|
+
rows = rows.filter((r) => r.workflowKey === workflowFilter);
|
|
160
|
+
}
|
|
161
|
+
if (search.trim()) {
|
|
162
|
+
const q = search.toLowerCase();
|
|
163
|
+
rows = rows.filter(
|
|
164
|
+
(r) => r.name.toLowerCase().includes(q) || r.version.toLowerCase().includes(q) || r.workflowKey.toLowerCase().includes(q) || changedByLabel(r.createdById).toLowerCase().includes(q)
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
return rows;
|
|
168
|
+
}, [allRows, workflowFilter, search, changedByLabel]);
|
|
169
|
+
const totalPages = Math.max(1, Math.ceil(filteredRows.length / PAGE_SIZE));
|
|
170
|
+
const paginatedRows = filteredRows.slice(
|
|
171
|
+
page * PAGE_SIZE,
|
|
172
|
+
(page + 1) * PAGE_SIZE
|
|
173
|
+
);
|
|
174
|
+
const handleNavigateToVersion = (workflowKey, version) => {
|
|
175
|
+
navigate(`../workflow/${workflowKey}/${version}`);
|
|
176
|
+
};
|
|
177
|
+
const formatDate = (dateStr) => {
|
|
178
|
+
try {
|
|
179
|
+
return new Intl.DateTimeFormat("en-US", {
|
|
180
|
+
month: "short",
|
|
181
|
+
day: "numeric",
|
|
182
|
+
year: "numeric",
|
|
183
|
+
hour: "2-digit",
|
|
184
|
+
minute: "2-digit"
|
|
185
|
+
}).format(new Date(dateStr));
|
|
186
|
+
} catch {
|
|
187
|
+
return dateStr;
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
const countByStatus = (status) => allRows.filter((r) => r.status === status).length;
|
|
191
|
+
return /* @__PURE__ */ jsxs("div", { className: "p-4 sm:p-6 bg-background-primary min-h-screen", children: [
|
|
192
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 mb-6", children: [
|
|
193
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
194
|
+
/* @__PURE__ */ jsx("h1", { className: "text-2xl sm:text-3xl font-bold text-text-primary", children: tr("fluidgrids.history.historyPage.title", "Version History") }),
|
|
195
|
+
/* @__PURE__ */ jsx("p", { className: "text-text-secondary mt-1", children: tr(
|
|
196
|
+
"fluidgrids.history.historyPage.subtitle",
|
|
197
|
+
"Track changes and versions across all workflows"
|
|
198
|
+
) })
|
|
199
|
+
] }),
|
|
200
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
201
|
+
/* @__PURE__ */ jsxs(Button, { variant: "outline", onClick: () => refetch(), children: [
|
|
202
|
+
/* @__PURE__ */ jsx(Icon, { icon: "mdi:refresh", className: "mr-2", width: 16 }),
|
|
203
|
+
tr("fluidgrids.history.historyPage.refreshButton", "Refresh")
|
|
204
|
+
] }),
|
|
205
|
+
/* @__PURE__ */ jsxs(Button, { variant: "outline", onClick: () => navigate("../list"), children: [
|
|
206
|
+
/* @__PURE__ */ jsx(Icon, { icon: "mdi:arrow-left", className: "mr-2", width: 16 }),
|
|
207
|
+
tr(
|
|
208
|
+
"fluidgrids.history.historyPage.backToWorkflowsButton",
|
|
209
|
+
"Back to Workflows"
|
|
210
|
+
)
|
|
211
|
+
] })
|
|
212
|
+
] })
|
|
213
|
+
] }),
|
|
214
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col sm:flex-row gap-3 mb-6", children: [
|
|
215
|
+
/* @__PURE__ */ jsxs("div", { className: "relative flex-1 max-w-sm", children: [
|
|
216
|
+
/* @__PURE__ */ jsx(
|
|
217
|
+
Icon,
|
|
218
|
+
{
|
|
219
|
+
icon: "mdi:magnify",
|
|
220
|
+
width: 18,
|
|
221
|
+
className: "absolute left-3 top-1/2 -translate-y-1/2 text-text-secondary"
|
|
222
|
+
}
|
|
223
|
+
),
|
|
224
|
+
/* @__PURE__ */ jsx(
|
|
225
|
+
Input,
|
|
226
|
+
{
|
|
227
|
+
placeholder: tr(
|
|
228
|
+
"fluidgrids.history.historyPage.searchPlaceholder",
|
|
229
|
+
"Search by name, version, key, or author..."
|
|
230
|
+
),
|
|
231
|
+
value: search,
|
|
232
|
+
onChange: (e) => {
|
|
233
|
+
setSearch(e.target.value);
|
|
234
|
+
setPage(0);
|
|
235
|
+
},
|
|
236
|
+
className: "pl-10 bg-background-secondary border-border-secondary"
|
|
237
|
+
}
|
|
238
|
+
)
|
|
239
|
+
] }),
|
|
240
|
+
/* @__PURE__ */ jsxs(
|
|
241
|
+
Select,
|
|
242
|
+
{
|
|
243
|
+
value: workflowFilter,
|
|
244
|
+
onValueChange: (val) => {
|
|
245
|
+
setWorkflowFilter(val);
|
|
246
|
+
setPage(0);
|
|
247
|
+
},
|
|
248
|
+
children: [
|
|
249
|
+
/* @__PURE__ */ jsx(SelectTrigger, { className: "w-[220px] bg-background-secondary border-border-secondary", children: /* @__PURE__ */ jsx(
|
|
250
|
+
SelectValue,
|
|
251
|
+
{
|
|
252
|
+
placeholder: tr(
|
|
253
|
+
"fluidgrids.history.historyPage.workflowFilterPlaceholder",
|
|
254
|
+
"All Workflows"
|
|
255
|
+
)
|
|
256
|
+
}
|
|
257
|
+
) }),
|
|
258
|
+
/* @__PURE__ */ jsxs(SelectContent, { children: [
|
|
259
|
+
/* @__PURE__ */ jsx(SelectItem, { value: "all", children: tr(
|
|
260
|
+
"fluidgrids.history.historyPage.workflowFilterAllOption",
|
|
261
|
+
"All Workflows"
|
|
262
|
+
) }),
|
|
263
|
+
distinctWorkflows.map((w) => /* @__PURE__ */ jsx(SelectItem, { value: w.workflowKey, children: w.name }, w.workflowKey))
|
|
264
|
+
] })
|
|
265
|
+
]
|
|
266
|
+
}
|
|
267
|
+
)
|
|
268
|
+
] }),
|
|
269
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 sm:grid-cols-5 gap-3 mb-6", children: [
|
|
270
|
+
/* @__PURE__ */ jsx(
|
|
271
|
+
StatCard,
|
|
272
|
+
{
|
|
273
|
+
label: tr(
|
|
274
|
+
"fluidgrids.history.historyPage.statTotalVersions",
|
|
275
|
+
"Total Versions"
|
|
276
|
+
),
|
|
277
|
+
value: total || allRows.length
|
|
278
|
+
}
|
|
279
|
+
),
|
|
280
|
+
/* @__PURE__ */ jsx(
|
|
281
|
+
StatCard,
|
|
282
|
+
{
|
|
283
|
+
label: tr(
|
|
284
|
+
"fluidgrids.history.historyPage.statWorkflows",
|
|
285
|
+
"Workflows"
|
|
286
|
+
),
|
|
287
|
+
value: distinctWorkflows.length
|
|
288
|
+
}
|
|
289
|
+
),
|
|
290
|
+
/* @__PURE__ */ jsx(
|
|
291
|
+
StatCard,
|
|
292
|
+
{
|
|
293
|
+
label: tr("fluidgrids.history.historyPage.statActive", "Active"),
|
|
294
|
+
value: countByStatus("ACTIVE"),
|
|
295
|
+
valueClassName: "text-[var(--color-status-success-text)]"
|
|
296
|
+
}
|
|
297
|
+
),
|
|
298
|
+
/* @__PURE__ */ jsx(
|
|
299
|
+
StatCard,
|
|
300
|
+
{
|
|
301
|
+
label: tr("fluidgrids.history.historyPage.statDraft", "Draft"),
|
|
302
|
+
value: countByStatus("DRAFT"),
|
|
303
|
+
valueClassName: "text-[var(--color-status-warning-text)]"
|
|
304
|
+
}
|
|
305
|
+
),
|
|
306
|
+
/* @__PURE__ */ jsx(
|
|
307
|
+
StatCard,
|
|
308
|
+
{
|
|
309
|
+
label: tr("fluidgrids.history.historyPage.statArchived", "Archived"),
|
|
310
|
+
value: countByStatus("ARCHIVED")
|
|
311
|
+
}
|
|
312
|
+
)
|
|
313
|
+
] }),
|
|
314
|
+
hasMore && /* @__PURE__ */ jsx("p", { className: "text-xs text-text-secondary mb-4", children: tr(
|
|
315
|
+
"fluidgrids.history.historyPage.partialResultsHint",
|
|
316
|
+
"Showing the {{shown}} most recent versions of {{total}}.",
|
|
317
|
+
{ shown: allRows.length, total: total ?? allRows.length }
|
|
318
|
+
) }),
|
|
319
|
+
error && /* @__PURE__ */ jsx("div", { className: "mb-6", children: /* @__PURE__ */ jsx(ErrorState, { message: error.message, onRetry: refetch }) }),
|
|
320
|
+
loading ? /* @__PURE__ */ jsx(HistoryTableSkeleton, {}) : filteredRows.length === 0 ? /* @__PURE__ */ jsx(EmptyState, {}) : /* @__PURE__ */ jsx("div", { className: "overflow-x-auto rounded-lg border border-border-secondary", children: /* @__PURE__ */ jsxs("table", { className: "w-full text-sm", children: [
|
|
321
|
+
/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { className: "border-b border-border-secondary bg-background-secondary", children: [
|
|
322
|
+
/* @__PURE__ */ jsx("th", { className: "text-left px-4 py-3 font-medium text-text-secondary", children: tr(
|
|
323
|
+
"fluidgrids.history.historyPage.columnWorkflowName",
|
|
324
|
+
"Workflow Name"
|
|
325
|
+
) }),
|
|
326
|
+
/* @__PURE__ */ jsx("th", { className: "text-left px-4 py-3 font-medium text-text-secondary", children: tr(
|
|
327
|
+
"fluidgrids.history.historyPage.columnVersion",
|
|
328
|
+
"Version"
|
|
329
|
+
) }),
|
|
330
|
+
/* @__PURE__ */ jsx("th", { className: "text-left px-4 py-3 font-medium text-text-secondary", children: tr("fluidgrids.history.historyPage.columnStatus", "Status") }),
|
|
331
|
+
/* @__PURE__ */ jsx("th", { className: "text-left px-4 py-3 font-medium text-text-secondary", children: tr(
|
|
332
|
+
"fluidgrids.history.historyPage.columnChangedBy",
|
|
333
|
+
"Changed By"
|
|
334
|
+
) }),
|
|
335
|
+
/* @__PURE__ */ jsx("th", { className: "text-left px-4 py-3 font-medium text-text-secondary", children: tr(
|
|
336
|
+
"fluidgrids.history.historyPage.columnChangedAt",
|
|
337
|
+
"Changed At"
|
|
338
|
+
) }),
|
|
339
|
+
/* @__PURE__ */ jsx("th", { className: "text-right px-4 py-3 font-medium text-text-secondary", children: tr(
|
|
340
|
+
"fluidgrids.history.historyPage.columnActions",
|
|
341
|
+
"Actions"
|
|
342
|
+
) })
|
|
343
|
+
] }) }),
|
|
344
|
+
/* @__PURE__ */ jsx("tbody", { children: paginatedRows.map((row) => {
|
|
345
|
+
const statusStyle = STATUS_STYLES[row.status] ?? STATUS_STYLES.DRAFT;
|
|
346
|
+
return /* @__PURE__ */ jsxs(
|
|
347
|
+
"tr",
|
|
348
|
+
{
|
|
349
|
+
className: "border-b border-border-secondary last:border-0 hover:bg-background-secondary/50 cursor-pointer transition-colors",
|
|
350
|
+
onClick: () => handleNavigateToVersion(row.workflowKey, row.version),
|
|
351
|
+
children: [
|
|
352
|
+
/* @__PURE__ */ jsx("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
353
|
+
/* @__PURE__ */ jsx(
|
|
354
|
+
Icon,
|
|
355
|
+
{
|
|
356
|
+
icon: "mdi:workflow",
|
|
357
|
+
width: 18,
|
|
358
|
+
className: "text-text-secondary"
|
|
359
|
+
}
|
|
360
|
+
),
|
|
361
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
362
|
+
/* @__PURE__ */ jsx("p", { className: "font-medium text-text-primary", children: row.name }),
|
|
363
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-text-secondary", children: row.workflowKey })
|
|
364
|
+
] })
|
|
365
|
+
] }) }),
|
|
366
|
+
/* @__PURE__ */ jsx("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsx("code", { className: "text-xs bg-background-secondary px-2 py-0.5 rounded text-text-primary", children: row.version }) }),
|
|
367
|
+
/* @__PURE__ */ jsx("td", { className: "px-4 py-3", children: /* @__PURE__ */ jsx(Badge, { variant: statusStyle.variant, children: statusStyle.label }) }),
|
|
368
|
+
/* @__PURE__ */ jsx("td", { className: "px-4 py-3 text-text-secondary", children: /* @__PURE__ */ jsxs(
|
|
369
|
+
"div",
|
|
370
|
+
{
|
|
371
|
+
className: "flex items-center gap-1.5",
|
|
372
|
+
title: row.createdById ?? void 0,
|
|
373
|
+
children: [
|
|
374
|
+
/* @__PURE__ */ jsx(Icon, { icon: "mdi:account", width: 16 }),
|
|
375
|
+
/* @__PURE__ */ jsx("span", { className: "truncate max-w-[160px]", children: changedByLabel(row.createdById) })
|
|
376
|
+
]
|
|
377
|
+
}
|
|
378
|
+
) }),
|
|
379
|
+
/* @__PURE__ */ jsx("td", { className: "px-4 py-3 text-text-secondary", children: formatDate(row.updatedAt) }),
|
|
380
|
+
/* @__PURE__ */ jsx("td", { className: "px-4 py-3 text-right", children: /* @__PURE__ */ jsx(TooltipProvider, { children: /* @__PURE__ */ jsxs(Tooltip, { children: [
|
|
381
|
+
/* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
|
|
382
|
+
"button",
|
|
383
|
+
{
|
|
384
|
+
onClick: (e) => {
|
|
385
|
+
e.stopPropagation();
|
|
386
|
+
handleNavigateToVersion(
|
|
387
|
+
row.workflowKey,
|
|
388
|
+
row.version
|
|
389
|
+
);
|
|
390
|
+
},
|
|
391
|
+
className: "p-1.5 rounded hover:bg-background-secondary text-text-secondary hover:text-text-primary transition-colors",
|
|
392
|
+
children: /* @__PURE__ */ jsx(Icon, { icon: "mdi:open-in-new", width: 16 })
|
|
393
|
+
}
|
|
394
|
+
) }),
|
|
395
|
+
/* @__PURE__ */ jsx(TooltipContent, { children: tr(
|
|
396
|
+
"fluidgrids.history.historyPage.openInBuilderTooltip",
|
|
397
|
+
"Open in builder"
|
|
398
|
+
) })
|
|
399
|
+
] }) }) })
|
|
400
|
+
]
|
|
401
|
+
},
|
|
402
|
+
row.id
|
|
403
|
+
);
|
|
404
|
+
}) })
|
|
405
|
+
] }) }),
|
|
406
|
+
filteredRows.length > PAGE_SIZE && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between mt-4 px-1", children: [
|
|
407
|
+
/* @__PURE__ */ jsxs("p", { className: "text-sm text-text-secondary", children: [
|
|
408
|
+
"Showing ",
|
|
409
|
+
page * PAGE_SIZE + 1,
|
|
410
|
+
"\u2013",
|
|
411
|
+
Math.min((page + 1) * PAGE_SIZE, filteredRows.length),
|
|
412
|
+
" of",
|
|
413
|
+
" ",
|
|
414
|
+
filteredRows.length
|
|
415
|
+
] }),
|
|
416
|
+
/* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
|
|
417
|
+
/* @__PURE__ */ jsxs(
|
|
418
|
+
Button,
|
|
419
|
+
{
|
|
420
|
+
variant: "outline",
|
|
421
|
+
size: "sm",
|
|
422
|
+
disabled: page === 0,
|
|
423
|
+
onClick: () => setPage((p) => p - 1),
|
|
424
|
+
children: [
|
|
425
|
+
/* @__PURE__ */ jsx(Icon, { icon: "mdi:chevron-left", width: 16 }),
|
|
426
|
+
tr(
|
|
427
|
+
"fluidgrids.history.historyPage.previousPageButton",
|
|
428
|
+
"Previous"
|
|
429
|
+
)
|
|
430
|
+
]
|
|
431
|
+
}
|
|
432
|
+
),
|
|
433
|
+
/* @__PURE__ */ jsxs(
|
|
434
|
+
Button,
|
|
435
|
+
{
|
|
436
|
+
variant: "outline",
|
|
437
|
+
size: "sm",
|
|
438
|
+
disabled: page >= totalPages - 1,
|
|
439
|
+
onClick: () => setPage((p) => p + 1),
|
|
440
|
+
children: [
|
|
441
|
+
tr("fluidgrids.history.historyPage.nextPageButton", "Next"),
|
|
442
|
+
/* @__PURE__ */ jsx(Icon, { icon: "mdi:chevron-right", width: 16 })
|
|
443
|
+
]
|
|
444
|
+
}
|
|
445
|
+
)
|
|
446
|
+
] })
|
|
447
|
+
] })
|
|
448
|
+
] });
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
export { HistoryPage };
|
|
452
|
+
//# sourceMappingURL=chunk-CLPFGB5Y.js.map
|
|
453
|
+
//# sourceMappingURL=chunk-CLPFGB5Y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/modules/history/pages/HistoryPage.tsx"],"names":[],"mappings":"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","file":"chunk-CLPFGB5Y.js","sourcesContent":["/**\n * HistoryPage — cross-workflow version history.\n *\n * Fetches every version row in one paginated `workflowDefinitions` query\n * (latestOnly defaults to false, so the list API already returns one row per\n * version) and resolves \"Changed By\" ids to human names via the shared\n * actor-profile lookup.\n */\nimport { useState, useMemo, useCallback } from \"react\";\nimport { useNavigate } from \"react-router\";\nimport { Icon } from \"@iconify/react\";\nimport { Button } from \"@burdenoff/fe-libs/button\";\nimport {\n Skeleton,\n Input,\n Badge,\n Select,\n SelectTrigger,\n SelectValue,\n SelectContent,\n SelectItem,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n TooltipProvider,\n} from \"@burdenoff/fe-libs/ui\";\nimport {\n useActorProfiles,\n buildActorFallback,\n type ActorInput,\n} from \"@burdenoff/fe-libs/shared\";\nimport { useWorkflowDefinitions } from \"../../../hooks/useWorkflows\";\nimport { useTr } from \"../../../hooks/useTr\";\nimport { getFluidGridsConfig } from \"../../../config\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst PAGE_SIZE = 20;\n\n/** Upper bound on version rows fetched for the screen (newest first). */\nconst FETCH_LIMIT = 500;\n\nfunction useStatusStyles() {\n const tr = useTr();\n return useMemo<\n Record<\n string,\n {\n label: string;\n variant: \"default\" | \"secondary\" | \"outline\" | \"destructive\";\n }\n >\n >(\n () => ({\n ACTIVE: {\n label: tr(\"fluidgrids.history.historyPage.statusActive\", \"Active\"),\n variant: \"default\",\n },\n DRAFT: {\n label: tr(\"fluidgrids.history.historyPage.statusDraft\", \"Draft\"),\n variant: \"secondary\",\n },\n ARCHIVED: {\n label: tr(\"fluidgrids.history.historyPage.statusArchived\", \"Archived\"),\n variant: \"outline\",\n },\n DEPRECATED: {\n label: tr(\n \"fluidgrids.history.historyPage.statusDeprecated\",\n \"Deprecated\",\n ),\n variant: \"destructive\",\n },\n }),\n [tr],\n );\n}\n\n// ============================================================================\n// Sub-Components\n// ============================================================================\n\nfunction HistoryTableSkeleton() {\n return (\n <div className=\"space-y-3\">\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton\n key={i}\n className=\"h-14 w-full rounded-lg bg-card-foreground/10\"\n />\n ))}\n </div>\n );\n}\n\nfunction EmptyState() {\n const tr = useTr();\n return (\n <div className=\"flex flex-col items-center justify-center py-20 text-center\">\n <div className=\"rounded-full bg-background-secondary p-4 mb-4\">\n <Icon icon=\"mdi:history\" width={40} className=\"text-text-secondary\" />\n </div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-2\">\n {tr(\"fluidgrids.history.historyPage.emptyTitle\", \"No version history\")}\n </h3>\n <p className=\"text-sm text-text-secondary max-w-md\">\n {tr(\n \"fluidgrids.history.historyPage.emptyHint\",\n \"Version history will appear here once you create and update workflows.\",\n )}\n </p>\n </div>\n );\n}\n\nfunction ErrorState({\n message,\n onRetry,\n}: {\n message: string;\n onRetry: () => void;\n}) {\n const tr = useTr();\n return (\n <div className=\"p-4 bg-[var(--color-status-error-bg-subtle)] border border-[var(--color-status-error-border)] rounded-lg\">\n <div className=\"flex items-center gap-2 text-[var(--color-status-error-text)]\">\n <Icon icon=\"mdi:alert-circle\" width={20} />\n <span className=\"font-medium\">\n {tr(\n \"fluidgrids.history.historyPage.errorHeading\",\n \"Error loading history\",\n )}\n </span>\n </div>\n <p className=\"mt-1 text-sm text-[var(--color-status-error-text)]\">\n {message}\n </p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onRetry}\n className=\"mt-3 border-[var(--color-status-error-border)] text-[var(--color-status-error-text)] hover:bg-[var(--color-status-error-bg-subtle)]\"\n >\n {tr(\"fluidgrids.history.historyPage.errorRetry\", \"Retry\")}\n </Button>\n </div>\n );\n}\n\nfunction StatCard({\n label,\n value,\n valueClassName,\n}: {\n label: string;\n value: number;\n valueClassName?: string;\n}) {\n return (\n <div className=\"p-3 rounded-lg bg-background-secondary border border-border-secondary\">\n <p className=\"text-xs text-text-secondary\">{label}</p>\n <p\n className={`text-xl font-bold ${valueClassName ?? \"text-text-primary\"}`}\n >\n {value}\n </p>\n </div>\n );\n}\n\n// ============================================================================\n// Main Component\n// ============================================================================\n\nexport function HistoryPage() {\n const tr = useTr();\n const navigate = useNavigate();\n const STATUS_STYLES = useStatusStyles();\n const [search, setSearch] = useState(\"\");\n const [workflowFilter, setWorkflowFilter] = useState<string>(\"all\");\n const [page, setPage] = useState(0);\n\n // One query returns every version row (latestOnly is false by default),\n // newest first — no per-workflow fan-out needed.\n const {\n workflows: versionRows,\n total,\n hasMore,\n loading,\n error,\n refetch,\n } = useWorkflowDefinitions({ limit: FETCH_LIMIT });\n\n const allRows = useMemo(\n () =>\n [...versionRows].sort(\n (a, b) =>\n new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime(),\n ),\n [versionRows],\n );\n\n // Distinct workflows (latest row per key) for the stat + filter dropdown.\n const distinctWorkflows = useMemo(() => {\n const byKey = new Map<string, { workflowKey: string; name: string }>();\n for (const row of allRows) {\n if (!byKey.has(row.workflowKey)) {\n byKey.set(row.workflowKey, {\n workflowKey: row.workflowKey,\n name: row.name,\n });\n }\n }\n return [...byKey.values()];\n }, [allRows]);\n\n // Resolve createdById → display names (workspace-scoped, cached, batched).\n const config = getFluidGridsConfig();\n const actorInputs = useMemo<ActorInput[]>(() => {\n const ids = new Set<string>();\n for (const row of allRows) {\n if (row.createdById) ids.add(row.createdById);\n }\n return [...ids].map((actorId) => ({ actorId, actorType: \"user\" }));\n }, [allRows]);\n const actorProfiles = useActorProfiles(actorInputs, {\n workspaceId: config.workspaceId || undefined,\n orgId: config.organizationId,\n authToken: config.authToken,\n });\n\n const changedByLabel = useCallback(\n (createdById?: string | null): string => {\n if (!createdById) return \"—\";\n return (\n actorProfiles[createdById]?.displayName ??\n buildActorFallback({ actorId: createdById, actorType: \"user\" })\n .displayName\n );\n },\n [actorProfiles],\n );\n\n // Filter rows\n const filteredRows = useMemo(() => {\n let rows = allRows;\n\n if (workflowFilter !== \"all\") {\n rows = rows.filter((r) => r.workflowKey === workflowFilter);\n }\n\n if (search.trim()) {\n const q = search.toLowerCase();\n rows = rows.filter(\n (r) =>\n r.name.toLowerCase().includes(q) ||\n r.version.toLowerCase().includes(q) ||\n r.workflowKey.toLowerCase().includes(q) ||\n changedByLabel(r.createdById).toLowerCase().includes(q),\n );\n }\n\n return rows;\n }, [allRows, workflowFilter, search, changedByLabel]);\n\n // Pagination\n const totalPages = Math.max(1, Math.ceil(filteredRows.length / PAGE_SIZE));\n const paginatedRows = filteredRows.slice(\n page * PAGE_SIZE,\n (page + 1) * PAGE_SIZE,\n );\n\n const handleNavigateToVersion = (workflowKey: string, version: string) => {\n navigate(`../workflow/${workflowKey}/${version}`);\n };\n\n const formatDate = (dateStr: string) => {\n try {\n return new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n }).format(new Date(dateStr));\n } catch {\n return dateStr;\n }\n };\n\n const countByStatus = (status: string) =>\n allRows.filter((r) => r.status === status).length;\n\n return (\n <div className=\"p-4 sm:p-6 bg-background-primary min-h-screen\">\n {/* Header */}\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 mb-6\">\n <div>\n <h1 className=\"text-2xl sm:text-3xl font-bold text-text-primary\">\n {tr(\"fluidgrids.history.historyPage.title\", \"Version History\")}\n </h1>\n <p className=\"text-text-secondary mt-1\">\n {tr(\n \"fluidgrids.history.historyPage.subtitle\",\n \"Track changes and versions across all workflows\",\n )}\n </p>\n </div>\n <div className=\"flex items-center gap-3\">\n <Button variant=\"outline\" onClick={() => refetch()}>\n <Icon icon=\"mdi:refresh\" className=\"mr-2\" width={16} />\n {tr(\"fluidgrids.history.historyPage.refreshButton\", \"Refresh\")}\n </Button>\n <Button variant=\"outline\" onClick={() => navigate(\"../list\")}>\n <Icon icon=\"mdi:arrow-left\" className=\"mr-2\" width={16} />\n {tr(\n \"fluidgrids.history.historyPage.backToWorkflowsButton\",\n \"Back to Workflows\",\n )}\n </Button>\n </div>\n </div>\n\n {/* Filters */}\n <div className=\"flex flex-col sm:flex-row gap-3 mb-6\">\n <div className=\"relative flex-1 max-w-sm\">\n <Icon\n icon=\"mdi:magnify\"\n width={18}\n className=\"absolute left-3 top-1/2 -translate-y-1/2 text-text-secondary\"\n />\n <Input\n placeholder={tr(\n \"fluidgrids.history.historyPage.searchPlaceholder\",\n \"Search by name, version, key, or author...\",\n )}\n value={search}\n onChange={(e) => {\n setSearch(e.target.value);\n setPage(0);\n }}\n className=\"pl-10 bg-background-secondary border-border-secondary\"\n />\n </div>\n <Select\n value={workflowFilter}\n onValueChange={(val) => {\n setWorkflowFilter(val);\n setPage(0);\n }}\n >\n <SelectTrigger className=\"w-[220px] bg-background-secondary border-border-secondary\">\n <SelectValue\n placeholder={tr(\n \"fluidgrids.history.historyPage.workflowFilterPlaceholder\",\n \"All Workflows\",\n )}\n />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">\n {tr(\n \"fluidgrids.history.historyPage.workflowFilterAllOption\",\n \"All Workflows\",\n )}\n </SelectItem>\n {distinctWorkflows.map((w) => (\n <SelectItem key={w.workflowKey} value={w.workflowKey}>\n {w.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Stats */}\n <div className=\"grid grid-cols-2 sm:grid-cols-5 gap-3 mb-6\">\n <StatCard\n label={tr(\n \"fluidgrids.history.historyPage.statTotalVersions\",\n \"Total Versions\",\n )}\n value={total || allRows.length}\n />\n <StatCard\n label={tr(\n \"fluidgrids.history.historyPage.statWorkflows\",\n \"Workflows\",\n )}\n value={distinctWorkflows.length}\n />\n <StatCard\n label={tr(\"fluidgrids.history.historyPage.statActive\", \"Active\")}\n value={countByStatus(\"ACTIVE\")}\n valueClassName=\"text-[var(--color-status-success-text)]\"\n />\n <StatCard\n label={tr(\"fluidgrids.history.historyPage.statDraft\", \"Draft\")}\n value={countByStatus(\"DRAFT\")}\n valueClassName=\"text-[var(--color-status-warning-text)]\"\n />\n <StatCard\n label={tr(\"fluidgrids.history.historyPage.statArchived\", \"Archived\")}\n value={countByStatus(\"ARCHIVED\")}\n />\n </div>\n\n {hasMore && (\n <p className=\"text-xs text-text-secondary mb-4\">\n {tr(\n \"fluidgrids.history.historyPage.partialResultsHint\",\n \"Showing the {{shown}} most recent versions of {{total}}.\",\n { shown: allRows.length, total: total ?? allRows.length },\n )}\n </p>\n )}\n\n {/* Error State */}\n {error && (\n <div className=\"mb-6\">\n <ErrorState message={error.message} onRetry={refetch} />\n </div>\n )}\n\n {/* Table */}\n {loading ? (\n <HistoryTableSkeleton />\n ) : filteredRows.length === 0 ? (\n <EmptyState />\n ) : (\n <div className=\"overflow-x-auto rounded-lg border border-border-secondary\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-border-secondary bg-background-secondary\">\n <th className=\"text-left px-4 py-3 font-medium text-text-secondary\">\n {tr(\n \"fluidgrids.history.historyPage.columnWorkflowName\",\n \"Workflow Name\",\n )}\n </th>\n <th className=\"text-left px-4 py-3 font-medium text-text-secondary\">\n {tr(\n \"fluidgrids.history.historyPage.columnVersion\",\n \"Version\",\n )}\n </th>\n <th className=\"text-left px-4 py-3 font-medium text-text-secondary\">\n {tr(\"fluidgrids.history.historyPage.columnStatus\", \"Status\")}\n </th>\n <th className=\"text-left px-4 py-3 font-medium text-text-secondary\">\n {tr(\n \"fluidgrids.history.historyPage.columnChangedBy\",\n \"Changed By\",\n )}\n </th>\n <th className=\"text-left px-4 py-3 font-medium text-text-secondary\">\n {tr(\n \"fluidgrids.history.historyPage.columnChangedAt\",\n \"Changed At\",\n )}\n </th>\n <th className=\"text-right px-4 py-3 font-medium text-text-secondary\">\n {tr(\n \"fluidgrids.history.historyPage.columnActions\",\n \"Actions\",\n )}\n </th>\n </tr>\n </thead>\n <tbody>\n {paginatedRows.map((row) => {\n const statusStyle =\n STATUS_STYLES[row.status] ?? STATUS_STYLES.DRAFT;\n return (\n <tr\n key={row.id}\n className=\"border-b border-border-secondary last:border-0 hover:bg-background-secondary/50 cursor-pointer transition-colors\"\n onClick={() =>\n handleNavigateToVersion(row.workflowKey, row.version)\n }\n >\n <td className=\"px-4 py-3\">\n <div className=\"flex items-center gap-2\">\n <Icon\n icon=\"mdi:workflow\"\n width={18}\n className=\"text-text-secondary\"\n />\n <div>\n <p className=\"font-medium text-text-primary\">\n {row.name}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {row.workflowKey}\n </p>\n </div>\n </div>\n </td>\n <td className=\"px-4 py-3\">\n <code className=\"text-xs bg-background-secondary px-2 py-0.5 rounded text-text-primary\">\n {row.version}\n </code>\n </td>\n <td className=\"px-4 py-3\">\n <Badge variant={statusStyle.variant}>\n {statusStyle.label}\n </Badge>\n </td>\n <td className=\"px-4 py-3 text-text-secondary\">\n <div\n className=\"flex items-center gap-1.5\"\n title={row.createdById ?? undefined}\n >\n <Icon icon=\"mdi:account\" width={16} />\n <span className=\"truncate max-w-[160px]\">\n {changedByLabel(row.createdById)}\n </span>\n </div>\n </td>\n <td className=\"px-4 py-3 text-text-secondary\">\n {formatDate(row.updatedAt)}\n </td>\n <td className=\"px-4 py-3 text-right\">\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n onClick={(e) => {\n e.stopPropagation();\n handleNavigateToVersion(\n row.workflowKey,\n row.version,\n );\n }}\n className=\"p-1.5 rounded hover:bg-background-secondary text-text-secondary hover:text-text-primary transition-colors\"\n >\n <Icon icon=\"mdi:open-in-new\" width={16} />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n {tr(\n \"fluidgrids.history.historyPage.openInBuilderTooltip\",\n \"Open in builder\",\n )}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n )}\n\n {/* Pagination */}\n {filteredRows.length > PAGE_SIZE && (\n <div className=\"flex items-center justify-between mt-4 px-1\">\n <p className=\"text-sm text-text-secondary\">\n Showing {page * PAGE_SIZE + 1}–\n {Math.min((page + 1) * PAGE_SIZE, filteredRows.length)} of{\" \"}\n {filteredRows.length}\n </p>\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={page === 0}\n onClick={() => setPage((p) => p - 1)}\n >\n <Icon icon=\"mdi:chevron-left\" width={16} />\n {tr(\n \"fluidgrids.history.historyPage.previousPageButton\",\n \"Previous\",\n )}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled={page >= totalPages - 1}\n onClick={() => setPage((p) => p + 1)}\n >\n {tr(\"fluidgrids.history.historyPage.nextPageButton\", \"Next\")}\n <Icon icon=\"mdi:chevron-right\" width={16} />\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n}\n"]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { getFluidGridsClient } from './chunk-5BDQNSP3.js';
|
|
1
|
+
import { throwIfResultError } from './chunk-LMO5ASOE.js';
|
|
3
2
|
import { getFluidGridsConfig } from './chunk-WWU2O2SR.js';
|
|
4
|
-
import {
|
|
3
|
+
import { WorkflowDefinitionsDocument, WorkflowDefinitionDocument, WorkflowVersionsDocument, CreateWorkflowDefinitionDocument, UpdateWorkflowDefinitionDocument, CreateWorkflowVersionDocument, DeleteWorkflowDefinitionDocument, DuplicateWorkflowDocument, RestoreWorkflowVersionDocument, TriggerWorkflowDocument, WorkflowRunsDocument, WorkflowRunDocument, DashboardSummaryDocument, ActivateWorkflowDefinitionDocument, DeactivateWorkflowDefinitionDocument } from './chunk-WO3AHQVD.js';
|
|
4
|
+
import { getFluidGridsClient } from './chunk-5BDQNSP3.js';
|
|
5
|
+
import { useState, useCallback, useEffect, useMemo } from 'react';
|
|
5
6
|
|
|
6
7
|
var WORKFLOW_DEFINITIONS = WorkflowDefinitionsDocument;
|
|
7
8
|
var WORKFLOW_DEFINITION = WorkflowDefinitionDocument;
|
|
@@ -83,12 +84,23 @@ function useWorkflowDefinitions(input = {}) {
|
|
|
83
84
|
return () => clearTimeout(timer);
|
|
84
85
|
}
|
|
85
86
|
}, [retryCount, fetchData]);
|
|
87
|
+
const tagsByKey = useMemo(() => {
|
|
88
|
+
const map = {};
|
|
89
|
+
for (const workflow of workflows) {
|
|
90
|
+
const assignments = workflow.tagAssignments;
|
|
91
|
+
if (assignments && assignments.length > 0 && !map[workflow.workflowKey]) {
|
|
92
|
+
map[workflow.workflowKey] = assignments;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return map;
|
|
96
|
+
}, [workflows]);
|
|
86
97
|
return {
|
|
87
98
|
workflows,
|
|
88
99
|
total,
|
|
89
100
|
hasMore,
|
|
90
101
|
loading,
|
|
91
102
|
error,
|
|
103
|
+
tagsByKey,
|
|
92
104
|
refetch: () => fetchData(false)
|
|
93
105
|
};
|
|
94
106
|
}
|
|
@@ -605,5 +617,5 @@ function useDeactivateWorkflow() {
|
|
|
605
617
|
}
|
|
606
618
|
|
|
607
619
|
export { useActivateWorkflow, useCreateWorkflow, useCreateWorkflowVersion, useDashboardSummary, useDeactivateWorkflow, useDeleteWorkflow, useDuplicateWorkflow, useLazyWorkflowDefinition, useRestoreWorkflowVersion, useTriggerWorkflow, useUpdateWorkflow, useWorkflowDefinition, useWorkflowDefinitions, useWorkflowRun, useWorkflowRuns, useWorkflowVersions };
|
|
608
|
-
//# sourceMappingURL=chunk-
|
|
609
|
-
//# sourceMappingURL=chunk-
|
|
620
|
+
//# sourceMappingURL=chunk-ELB3LXRJ.js.map
|
|
621
|
+
//# sourceMappingURL=chunk-ELB3LXRJ.js.map
|