@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.
Files changed (90) hide show
  1. package/dist/ExecutionDetailPage-OWNO2BEW.js +11 -0
  2. package/dist/{ExecutionDetailPage-FF2DYKAZ.js.map → ExecutionDetailPage-OWNO2BEW.js.map} +1 -1
  3. package/dist/ExecutionsListPage-6O4AS3CM.js +10 -0
  4. package/dist/{ExecutionsListPage-NKISRFMA.js.map → ExecutionsListPage-6O4AS3CM.js.map} +1 -1
  5. package/dist/{MissingNodesInstallModal-HA5L3FK2.js → MissingNodesInstallModal-PZYTCNCV.js} +4 -4
  6. package/dist/{MissingNodesInstallModal-HA5L3FK2.js.map → MissingNodesInstallModal-PZYTCNCV.js.map} +1 -1
  7. package/dist/{TemplateConfigurationModal-MXNGZQIC.js → TemplateConfigurationModal-TB7DJBTR.js} +11 -8
  8. package/dist/TemplateConfigurationModal-TB7DJBTR.js.map +1 -0
  9. package/dist/{TemplateDetailPanel-CJ3NPVTP.js → TemplateDetailPanel-KS3LQIBD.js} +3 -4
  10. package/dist/TemplateDetailPanel-KS3LQIBD.js.map +1 -0
  11. package/dist/WorkflowBuilder-426LYWCE.js +19 -0
  12. package/dist/{WorkflowBuilder-URMQZLQU.js.map → WorkflowBuilder-426LYWCE.js.map} +1 -1
  13. package/dist/WorkflowsList-XQW7YPZX.js +12 -0
  14. package/dist/{WorkflowsList-TZAN3YBA.js.map → WorkflowsList-XQW7YPZX.js.map} +1 -1
  15. package/dist/{chunk-7VNIEIR6.js → chunk-7YWBH2A5.js} +9 -3
  16. package/dist/chunk-7YWBH2A5.js.map +1 -0
  17. package/dist/chunk-ACRXNUU2.js +504 -0
  18. package/dist/chunk-ACRXNUU2.js.map +1 -0
  19. package/dist/{chunk-6PNRM3KQ.js → chunk-AE7FZRTH.js} +5 -4
  20. package/dist/chunk-AE7FZRTH.js.map +1 -0
  21. package/dist/{chunk-YJKZSUNC.js → chunk-BF4YC7XN.js} +32 -15
  22. package/dist/chunk-BF4YC7XN.js.map +1 -0
  23. package/dist/chunk-CLPFGB5Y.js +453 -0
  24. package/dist/chunk-CLPFGB5Y.js.map +1 -0
  25. package/dist/{chunk-MH4AHYK3.js → chunk-ELB3LXRJ.js} +17 -5
  26. package/dist/chunk-ELB3LXRJ.js.map +1 -0
  27. package/dist/{chunk-IWKLEFC7.js → chunk-GBDXBJPH.js} +7 -6
  28. package/dist/chunk-GBDXBJPH.js.map +1 -0
  29. package/dist/{chunk-Y36DJHU3.js → chunk-KT72XMAB.js} +4 -176
  30. package/dist/chunk-KT72XMAB.js.map +1 -0
  31. package/dist/chunk-LMO5ASOE.js +43 -0
  32. package/dist/chunk-LMO5ASOE.js.map +1 -0
  33. package/dist/{chunk-OHGXRM6Z.js → chunk-NH5YCY37.js} +3 -3
  34. package/dist/{chunk-OHGXRM6Z.js.map → chunk-NH5YCY37.js.map} +1 -1
  35. package/dist/chunk-NHPGJMJX.js +395 -0
  36. package/dist/chunk-NHPGJMJX.js.map +1 -0
  37. package/dist/{chunk-DVPXNC2S.js → chunk-NZ67MDME.js} +7871 -8046
  38. package/dist/chunk-NZ67MDME.js.map +1 -0
  39. package/dist/chunk-PYD2V4U6.js +541 -0
  40. package/dist/chunk-PYD2V4U6.js.map +1 -0
  41. package/dist/chunk-RXMBIJ5Z.js +3 -0
  42. package/dist/chunk-RXMBIJ5Z.js.map +1 -0
  43. package/dist/{chunk-SG7Z2IRQ.js → chunk-UPN73SK4.js} +5 -5
  44. package/dist/{chunk-SG7Z2IRQ.js.map → chunk-UPN73SK4.js.map} +1 -1
  45. package/dist/chunk-VJ2NTNDZ.js +4901 -0
  46. package/dist/chunk-VJ2NTNDZ.js.map +1 -0
  47. package/dist/chunk-VJDLWE5S.js +505 -0
  48. package/dist/chunk-VJDLWE5S.js.map +1 -0
  49. package/dist/{chunk-V5UEEB74.js → chunk-WO3AHQVD.js} +17 -41
  50. package/dist/chunk-WO3AHQVD.js.map +1 -0
  51. package/dist/executions.d.ts +7 -0
  52. package/dist/executions.js +14 -0
  53. package/dist/executions.js.map +1 -0
  54. package/dist/history.d.ts +5 -0
  55. package/dist/history.js +9 -0
  56. package/dist/history.js.map +1 -0
  57. package/dist/index.d.ts +147 -616
  58. package/dist/index.js +61 -6870
  59. package/dist/index.js.map +1 -1
  60. package/dist/nodes.d.ts +5 -0
  61. package/dist/nodes.js +6 -0
  62. package/dist/nodes.js.map +1 -0
  63. package/dist/settings.d.ts +5 -0
  64. package/dist/settings.js +4 -0
  65. package/dist/settings.js.map +1 -0
  66. package/dist/templates.d.ts +17 -0
  67. package/dist/templates.js +19 -0
  68. package/dist/templates.js.map +1 -0
  69. package/dist/workflow-builder-JKkdIJoP.d.ts +473 -0
  70. package/dist/workflow-builder.d.ts +5 -0
  71. package/dist/workflow-builder.js +20 -0
  72. package/dist/workflow-builder.js.map +1 -0
  73. package/dist/workflows-list.d.ts +5 -0
  74. package/dist/workflows-list.js +12 -0
  75. package/dist/workflows-list.js.map +1 -0
  76. package/package.json +29 -1
  77. package/dist/ExecutionDetailPage-FF2DYKAZ.js +0 -10
  78. package/dist/ExecutionsListPage-NKISRFMA.js +0 -9
  79. package/dist/TemplateConfigurationModal-MXNGZQIC.js.map +0 -1
  80. package/dist/TemplateDetailPanel-CJ3NPVTP.js.map +0 -1
  81. package/dist/WorkflowBuilder-URMQZLQU.js +0 -17
  82. package/dist/WorkflowsList-TZAN3YBA.js +0 -11
  83. package/dist/chunk-6PNRM3KQ.js.map +0 -1
  84. package/dist/chunk-7VNIEIR6.js.map +0 -1
  85. package/dist/chunk-DVPXNC2S.js.map +0 -1
  86. package/dist/chunk-IWKLEFC7.js.map +0 -1
  87. package/dist/chunk-MH4AHYK3.js.map +0 -1
  88. package/dist/chunk-V5UEEB74.js.map +0 -1
  89. package/dist/chunk-Y36DJHU3.js.map +0 -1
  90. 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 { WorkflowDefinitionsDocument, WorkflowDefinitionDocument, WorkflowVersionsDocument, throwIfResultError, CreateWorkflowDefinitionDocument, UpdateWorkflowDefinitionDocument, CreateWorkflowVersionDocument, DeleteWorkflowDefinitionDocument, DuplicateWorkflowDocument, RestoreWorkflowVersionDocument, TriggerWorkflowDocument, WorkflowRunsDocument, WorkflowRunDocument, DashboardSummaryDocument, ActivateWorkflowDefinitionDocument, DeactivateWorkflowDefinitionDocument } from './chunk-V5UEEB74.js';
2
- import { getFluidGridsClient } from './chunk-5BDQNSP3.js';
1
+ import { throwIfResultError } from './chunk-LMO5ASOE.js';
3
2
  import { getFluidGridsConfig } from './chunk-WWU2O2SR.js';
4
- import { useState, useCallback, useEffect } from 'react';
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-MH4AHYK3.js.map
609
- //# sourceMappingURL=chunk-MH4AHYK3.js.map
620
+ //# sourceMappingURL=chunk-ELB3LXRJ.js.map
621
+ //# sourceMappingURL=chunk-ELB3LXRJ.js.map