@burdenoff/fluidgrids-fe-sdk 2026.803.4 → 2026.804.2
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-FF2DYKAZ.js +10 -0
- package/dist/{ExecutionDetailPage-FCY3S336.js.map → ExecutionDetailPage-FF2DYKAZ.js.map} +1 -1
- package/dist/ExecutionsListPage-NKISRFMA.js +9 -0
- package/dist/{ExecutionsListPage-IZJPACQV.js.map → ExecutionsListPage-NKISRFMA.js.map} +1 -1
- package/dist/MissingNodesInstallModal-HA5L3FK2.js +185 -0
- package/dist/MissingNodesInstallModal-HA5L3FK2.js.map +1 -0
- package/dist/{TemplateConfigurationModal-MTR7VP6G.js → TemplateConfigurationModal-MXNGZQIC.js} +91 -21
- package/dist/TemplateConfigurationModal-MXNGZQIC.js.map +1 -0
- package/dist/{TemplateDetailPanel-T3ZHXOHX.js → TemplateDetailPanel-CJ3NPVTP.js} +50 -14
- package/dist/TemplateDetailPanel-CJ3NPVTP.js.map +1 -0
- package/dist/{WorkflowBuilder-WMAHTZEI.js → WorkflowBuilder-ETVB66U6.js} +9 -9
- package/dist/{WorkflowBuilder-WMAHTZEI.js.map → WorkflowBuilder-ETVB66U6.js.map} +1 -1
- package/dist/WorkflowsList-TZAN3YBA.js +11 -0
- package/dist/{WorkflowsList-BXESQVAH.js.map → WorkflowsList-TZAN3YBA.js.map} +1 -1
- package/dist/{chunk-WAVGHDYH.js → chunk-6PNRM3KQ.js} +469 -114
- package/dist/chunk-6PNRM3KQ.js.map +1 -0
- package/dist/chunk-7VNIEIR6.js +21 -0
- package/dist/chunk-7VNIEIR6.js.map +1 -0
- package/dist/{chunk-F5ACDIYR.js → chunk-IWKLEFC7.js} +205 -51
- package/dist/chunk-IWKLEFC7.js.map +1 -0
- package/dist/{chunk-MRVS73S2.js → chunk-OHGXRM6Z.js} +7 -23
- package/dist/chunk-OHGXRM6Z.js.map +1 -0
- package/dist/chunk-P5PKRQAO.js +25 -0
- package/dist/chunk-P5PKRQAO.js.map +1 -0
- package/dist/{chunk-CQAHXNT2.js → chunk-SG7Z2IRQ.js} +55 -18
- package/dist/chunk-SG7Z2IRQ.js.map +1 -0
- package/dist/chunk-WQ4QNHDN.js +29639 -0
- package/dist/chunk-WQ4QNHDN.js.map +1 -0
- package/dist/{chunk-ZM4SSEVI.js → chunk-Y36DJHU3.js} +211 -3
- package/dist/chunk-Y36DJHU3.js.map +1 -0
- package/dist/{chunk-CBUOMHGH.js → chunk-YJKZSUNC.js} +140 -47
- package/dist/chunk-YJKZSUNC.js.map +1 -0
- package/dist/index.d.ts +33 -2
- package/dist/index.js +643 -182
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/ExecutionDetailPage-FCY3S336.js +0 -9
- package/dist/ExecutionsListPage-IZJPACQV.js +0 -8
- package/dist/TemplateConfigurationModal-MTR7VP6G.js.map +0 -1
- package/dist/TemplateDetailPanel-T3ZHXOHX.js.map +0 -1
- package/dist/WorkflowsList-BXESQVAH.js +0 -11
- package/dist/blocks-7KN7ZRE6.js +0 -11
- package/dist/blocks-7KN7ZRE6.js.map +0 -1
- package/dist/chunk-7LLCYNKY.js +0 -10910
- package/dist/chunk-7LLCYNKY.js.map +0 -1
- package/dist/chunk-CBUOMHGH.js.map +0 -1
- package/dist/chunk-CQAHXNT2.js.map +0 -1
- package/dist/chunk-F5ACDIYR.js.map +0 -1
- package/dist/chunk-MRVS73S2.js.map +0 -1
- package/dist/chunk-OAPYQFQU.js +0 -197
- package/dist/chunk-OAPYQFQU.js.map +0 -1
- package/dist/chunk-WAVGHDYH.js.map +0 -1
- package/dist/chunk-Z3NRSPTV.js +0 -15355
- package/dist/chunk-Z3NRSPTV.js.map +0 -1
- package/dist/chunk-ZM4SSEVI.js.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { useWorkflowTagOverlay, QuotaExhaustedDialog } from './chunk-
|
|
1
|
+
import { useWorkflowTagOverlay, useFlowStore, QuotaExhaustedDialog } from './chunk-Y36DJHU3.js';
|
|
2
2
|
import { useWorkflowDefinitions, useDuplicateWorkflow, useDeleteWorkflow } from './chunk-MH4AHYK3.js';
|
|
3
|
-
import { useFlowStore } from './chunk-ZM4SSEVI.js';
|
|
4
3
|
import { SdkPermissionButton, FLUIDGRIDS_PERMISSIONS, SdkPermissionGate } from './chunk-UIY2HBWA.js';
|
|
5
4
|
import { config } from './chunk-WWU2O2SR.js';
|
|
5
|
+
import { useTr } from './chunk-7VNIEIR6.js';
|
|
6
6
|
import { useState, useMemo } from 'react';
|
|
7
7
|
import { useNavigate } from 'react-router';
|
|
8
8
|
import { v4 } from 'uuid';
|
|
@@ -19,6 +19,7 @@ function SharePopup({
|
|
|
19
19
|
url = window.location.href,
|
|
20
20
|
embedSrc = `${config.fluidgridFrontendUrl}/workflow-view/565201ec-e803-4281-ad39-a135c46daa89/1.0`
|
|
21
21
|
}) {
|
|
22
|
+
const tr = useTr();
|
|
22
23
|
const [isOpen, setIsOpen] = useState(false);
|
|
23
24
|
const [width, setWidth] = useState(600);
|
|
24
25
|
const [height, setHeight] = useState(400);
|
|
@@ -31,7 +32,7 @@ function SharePopup({
|
|
|
31
32
|
if (!isOpen) {
|
|
32
33
|
return /* @__PURE__ */ jsxs(Button, { variant: "ghost", size: "icon", onClick: () => setIsOpen(true), children: [
|
|
33
34
|
/* @__PURE__ */ jsx(Share2, { className: "h-4 w-4" }),
|
|
34
|
-
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Share" })
|
|
35
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: tr("fluidgrids.components.sharePopup.openLabel", "Share") })
|
|
35
36
|
] });
|
|
36
37
|
}
|
|
37
38
|
return /* @__PURE__ */ jsx(
|
|
@@ -46,7 +47,7 @@ function SharePopup({
|
|
|
46
47
|
onClick: (e) => e.stopPropagation(),
|
|
47
48
|
children: [
|
|
48
49
|
/* @__PURE__ */ jsxs("div", { className: "flex justify-between items-center mb-4", children: [
|
|
49
|
-
/* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold", children: "Share" }),
|
|
50
|
+
/* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold", children: tr("fluidgrids.components.sharePopup.title", "Share") }),
|
|
50
51
|
/* @__PURE__ */ jsx(Button, { variant: "ghost", size: "icon", onClick: () => setIsOpen(false), children: "\xD7" })
|
|
51
52
|
] }),
|
|
52
53
|
/* @__PURE__ */ jsxs("div", { className: "flex gap-2 mb-4", children: [
|
|
@@ -56,7 +57,7 @@ function SharePopup({
|
|
|
56
57
|
variant: activeTab === "link" ? "default" : "outline",
|
|
57
58
|
size: "sm",
|
|
58
59
|
onClick: () => setActiveTab("link"),
|
|
59
|
-
children: "Share Link"
|
|
60
|
+
children: tr("fluidgrids.components.sharePopup.tabShareLink", "Share Link")
|
|
60
61
|
}
|
|
61
62
|
),
|
|
62
63
|
/* @__PURE__ */ jsx(
|
|
@@ -65,7 +66,7 @@ function SharePopup({
|
|
|
65
66
|
variant: activeTab === "embed" ? "default" : "outline",
|
|
66
67
|
size: "sm",
|
|
67
68
|
onClick: () => setActiveTab("embed"),
|
|
68
|
-
children: "Embed"
|
|
69
|
+
children: tr("fluidgrids.components.sharePopup.tabEmbed", "Embed")
|
|
69
70
|
}
|
|
70
71
|
)
|
|
71
72
|
] }),
|
|
@@ -82,7 +83,13 @@ function SharePopup({
|
|
|
82
83
|
Button,
|
|
83
84
|
{
|
|
84
85
|
size: "sm",
|
|
85
|
-
onClick: () => copyToClipboard(
|
|
86
|
+
onClick: () => copyToClipboard(
|
|
87
|
+
url,
|
|
88
|
+
tr(
|
|
89
|
+
"fluidgrids.components.sharePopup.linkCopiedToast",
|
|
90
|
+
"Link copied to clipboard"
|
|
91
|
+
)
|
|
92
|
+
),
|
|
86
93
|
children: /* @__PURE__ */ jsx(Copy, { className: "h-4 w-4" })
|
|
87
94
|
}
|
|
88
95
|
)
|
|
@@ -90,7 +97,7 @@ function SharePopup({
|
|
|
90
97
|
activeTab === "embed" && /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
91
98
|
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
92
99
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
93
|
-
/* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: "Width" }),
|
|
100
|
+
/* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: tr("fluidgrids.components.sharePopup.widthLabel", "Width") }),
|
|
94
101
|
/* @__PURE__ */ jsx(
|
|
95
102
|
"input",
|
|
96
103
|
{
|
|
@@ -102,7 +109,7 @@ function SharePopup({
|
|
|
102
109
|
)
|
|
103
110
|
] }),
|
|
104
111
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
105
|
-
/* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: "Height" }),
|
|
112
|
+
/* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: tr("fluidgrids.components.sharePopup.heightLabel", "Height") }),
|
|
106
113
|
/* @__PURE__ */ jsx(
|
|
107
114
|
"input",
|
|
108
115
|
{
|
|
@@ -115,7 +122,10 @@ function SharePopup({
|
|
|
115
122
|
] })
|
|
116
123
|
] }),
|
|
117
124
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
118
|
-
/* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children:
|
|
125
|
+
/* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: tr(
|
|
126
|
+
"fluidgrids.components.sharePopup.embedCodeLabel",
|
|
127
|
+
"Embed Code"
|
|
128
|
+
) }),
|
|
119
129
|
/* @__PURE__ */ jsxs("div", { className: "relative mt-1", children: [
|
|
120
130
|
/* @__PURE__ */ jsx(
|
|
121
131
|
"input",
|
|
@@ -130,7 +140,13 @@ function SharePopup({
|
|
|
130
140
|
{
|
|
131
141
|
size: "sm",
|
|
132
142
|
className: "absolute right-1 top-1/2 -translate-y-1/2 h-7",
|
|
133
|
-
onClick: () => copyToClipboard(
|
|
143
|
+
onClick: () => copyToClipboard(
|
|
144
|
+
embedCode,
|
|
145
|
+
tr(
|
|
146
|
+
"fluidgrids.components.sharePopup.embedCopiedToast",
|
|
147
|
+
"Embed code copied to clipboard"
|
|
148
|
+
)
|
|
149
|
+
),
|
|
134
150
|
children: /* @__PURE__ */ jsx(Copy, { className: "h-4 w-4" })
|
|
135
151
|
}
|
|
136
152
|
)
|
|
@@ -176,6 +192,7 @@ var CardWorkflow = ({
|
|
|
176
192
|
workflow,
|
|
177
193
|
onUpdateSuccess
|
|
178
194
|
}) => {
|
|
195
|
+
const tr = useTr();
|
|
179
196
|
const navigate = useNavigate();
|
|
180
197
|
const resetWorkflow = useFlowStore((s) => s.actions.resetWorkflow);
|
|
181
198
|
const { duplicateWorkflow: duplicateWorkflowMutation } = useDuplicateWorkflow();
|
|
@@ -208,7 +225,7 @@ var CardWorkflow = ({
|
|
|
208
225
|
}
|
|
209
226
|
console.error("Error duplicating workflow:", error);
|
|
210
227
|
toast.error(
|
|
211
|
-
|
|
228
|
+
`${tr("fluidgrids.builder.cardWorkflow.duplicateErrorToast", "Error duplicating workflow:")} ${error instanceof Error ? error.message : String(error)}`
|
|
212
229
|
);
|
|
213
230
|
}
|
|
214
231
|
}
|
|
@@ -226,7 +243,7 @@ var CardWorkflow = ({
|
|
|
226
243
|
} catch (error) {
|
|
227
244
|
console.error("Error deleting workflow:", error);
|
|
228
245
|
toast.error(
|
|
229
|
-
|
|
246
|
+
`${tr("fluidgrids.builder.cardWorkflow.deleteErrorToast", "Error deleting workflow:")} ${error instanceof Error ? error.message : String(error)}`
|
|
230
247
|
);
|
|
231
248
|
} finally {
|
|
232
249
|
setIsDeleting(false);
|
|
@@ -250,7 +267,7 @@ var CardWorkflow = ({
|
|
|
250
267
|
{
|
|
251
268
|
role: "button",
|
|
252
269
|
tabIndex: 0,
|
|
253
|
-
"aria-label":
|
|
270
|
+
"aria-label": `${tr("fluidgrids.builder.cardWorkflow.openWorkflowAriaLabel", "Open workflow")} ${workflow.name}`,
|
|
254
271
|
onClick: handleCardClick,
|
|
255
272
|
onKeyDown: (e) => {
|
|
256
273
|
if (e.target === e.currentTarget && (e.key === "Enter" || e.key === " ")) {
|
|
@@ -279,7 +296,10 @@ var CardWorkflow = ({
|
|
|
279
296
|
statusInfo.label
|
|
280
297
|
] })
|
|
281
298
|
] }),
|
|
282
|
-
/* @__PURE__ */ jsx("p", { className: "mt-1 line-clamp-2 text-xs leading-snug text-muted-foreground", children: workflow.description ||
|
|
299
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 line-clamp-2 text-xs leading-snug text-muted-foreground", children: workflow.description || tr(
|
|
300
|
+
"fluidgrids.builder.cardWorkflow.noDescription",
|
|
301
|
+
"No description"
|
|
302
|
+
) }),
|
|
283
303
|
workflow.tags && workflow.tags.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mt-2 flex flex-wrap items-center gap-1", children: [
|
|
284
304
|
workflow.tags.slice(0, 3).map((tag) => /* @__PURE__ */ jsx(
|
|
285
305
|
TagBadge,
|
|
@@ -307,7 +327,8 @@ var CardWorkflow = ({
|
|
|
307
327
|
children: [
|
|
308
328
|
/* @__PURE__ */ jsx(Icon, { icon: "mdi:clock-outline", className: "size-3.5 shrink-0" }),
|
|
309
329
|
/* @__PURE__ */ jsxs("span", { className: "truncate", children: [
|
|
310
|
-
"
|
|
330
|
+
tr("fluidgrids.builder.cardWorkflow.updatedPrefix", "Updated"),
|
|
331
|
+
" ",
|
|
311
332
|
relativeTime(workflow.updated_at)
|
|
312
333
|
] }),
|
|
313
334
|
/* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: "\xB7" }),
|
|
@@ -318,7 +339,11 @@ var CardWorkflow = ({
|
|
|
318
339
|
workflow.total_versions && workflow.total_versions > 1 ? /* @__PURE__ */ jsxs("span", { className: "shrink-0", children: [
|
|
319
340
|
"\xB7 ",
|
|
320
341
|
workflow.total_versions,
|
|
321
|
-
"
|
|
342
|
+
" ",
|
|
343
|
+
tr(
|
|
344
|
+
"fluidgrids.builder.cardWorkflow.versionsSuffix",
|
|
345
|
+
"versions"
|
|
346
|
+
)
|
|
322
347
|
] }) : null
|
|
323
348
|
]
|
|
324
349
|
}
|
|
@@ -332,11 +357,17 @@ var CardWorkflow = ({
|
|
|
332
357
|
size: "icon",
|
|
333
358
|
className: "size-8",
|
|
334
359
|
onClick: handleOnEdit,
|
|
335
|
-
"aria-label":
|
|
360
|
+
"aria-label": tr(
|
|
361
|
+
"fluidgrids.builder.cardWorkflow.editWorkflow",
|
|
362
|
+
"Edit workflow"
|
|
363
|
+
),
|
|
336
364
|
children: /* @__PURE__ */ jsx(Icon, { icon: "mynaui:edit", className: "size-4" })
|
|
337
365
|
}
|
|
338
366
|
) }),
|
|
339
|
-
/* @__PURE__ */ jsx(TooltipContent, { side: "top", children: /* @__PURE__ */ jsx("p", { children:
|
|
367
|
+
/* @__PURE__ */ jsx(TooltipContent, { side: "top", children: /* @__PURE__ */ jsx("p", { children: tr(
|
|
368
|
+
"fluidgrids.builder.cardWorkflow.editWorkflow",
|
|
369
|
+
"Edit workflow"
|
|
370
|
+
) }) })
|
|
340
371
|
] }),
|
|
341
372
|
/* @__PURE__ */ jsxs(Tooltip, { children: [
|
|
342
373
|
/* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(
|
|
@@ -346,7 +377,10 @@ var CardWorkflow = ({
|
|
|
346
377
|
embedSrc: `${config.fluidgridFrontendUrl}/workflow-view/${workflow.workflow_key}/${workflow.version}`
|
|
347
378
|
}
|
|
348
379
|
) }) }),
|
|
349
|
-
/* @__PURE__ */ jsx(TooltipContent, { side: "top", children: /* @__PURE__ */ jsx("p", { children:
|
|
380
|
+
/* @__PURE__ */ jsx(TooltipContent, { side: "top", children: /* @__PURE__ */ jsx("p", { children: tr(
|
|
381
|
+
"fluidgrids.builder.cardWorkflow.shareWorkflow",
|
|
382
|
+
"Share workflow"
|
|
383
|
+
) }) })
|
|
350
384
|
] }),
|
|
351
385
|
/* @__PURE__ */ jsx(
|
|
352
386
|
SdkPermissionGate,
|
|
@@ -360,11 +394,17 @@ var CardWorkflow = ({
|
|
|
360
394
|
size: "icon",
|
|
361
395
|
className: "size-8",
|
|
362
396
|
onClick: () => handleDuplicateWorkflow(),
|
|
363
|
-
"aria-label":
|
|
397
|
+
"aria-label": tr(
|
|
398
|
+
"fluidgrids.builder.cardWorkflow.duplicateWorkflow",
|
|
399
|
+
"Duplicate workflow"
|
|
400
|
+
),
|
|
364
401
|
children: /* @__PURE__ */ jsx(Icon, { icon: "mynaui:copy", className: "size-4" })
|
|
365
402
|
}
|
|
366
403
|
) }),
|
|
367
|
-
/* @__PURE__ */ jsx(TooltipContent, { side: "top", children: /* @__PURE__ */ jsx("p", { children:
|
|
404
|
+
/* @__PURE__ */ jsx(TooltipContent, { side: "top", children: /* @__PURE__ */ jsx("p", { children: tr(
|
|
405
|
+
"fluidgrids.builder.cardWorkflow.duplicateWorkflow",
|
|
406
|
+
"Duplicate workflow"
|
|
407
|
+
) }) })
|
|
368
408
|
] })
|
|
369
409
|
}
|
|
370
410
|
),
|
|
@@ -380,11 +420,17 @@ var CardWorkflow = ({
|
|
|
380
420
|
size: "icon",
|
|
381
421
|
className: "size-8 text-[var(--color-status-error-text)] hover:text-[var(--color-status-error-text)]",
|
|
382
422
|
onClick: () => setShowDeleteDialog(true),
|
|
383
|
-
"aria-label":
|
|
423
|
+
"aria-label": tr(
|
|
424
|
+
"fluidgrids.builder.cardWorkflow.deleteWorkflow",
|
|
425
|
+
"Delete workflow"
|
|
426
|
+
),
|
|
384
427
|
children: /* @__PURE__ */ jsx(Icon, { icon: "mynaui:trash", className: "size-4" })
|
|
385
428
|
}
|
|
386
429
|
) }),
|
|
387
|
-
/* @__PURE__ */ jsx(TooltipContent, { side: "top", children: /* @__PURE__ */ jsx("p", { children:
|
|
430
|
+
/* @__PURE__ */ jsx(TooltipContent, { side: "top", children: /* @__PURE__ */ jsx("p", { children: tr(
|
|
431
|
+
"fluidgrids.builder.cardWorkflow.deleteWorkflow",
|
|
432
|
+
"Delete workflow"
|
|
433
|
+
) }) })
|
|
388
434
|
] })
|
|
389
435
|
}
|
|
390
436
|
)
|
|
@@ -395,22 +441,38 @@ var CardWorkflow = ({
|
|
|
395
441
|
),
|
|
396
442
|
/* @__PURE__ */ jsx(AlertDialog, { open: showDeleteDialog, onOpenChange: setShowDeleteDialog, children: /* @__PURE__ */ jsxs(AlertDialogContent, { children: [
|
|
397
443
|
/* @__PURE__ */ jsxs(AlertDialogHeader, { children: [
|
|
398
|
-
/* @__PURE__ */ jsx(AlertDialogTitle, { children:
|
|
444
|
+
/* @__PURE__ */ jsx(AlertDialogTitle, { children: tr(
|
|
445
|
+
"fluidgrids.builder.cardWorkflow.deleteDialogTitle",
|
|
446
|
+
"Delete Workflow"
|
|
447
|
+
) }),
|
|
399
448
|
/* @__PURE__ */ jsxs(AlertDialogDescription, { children: [
|
|
400
|
-
|
|
449
|
+
tr(
|
|
450
|
+
"fluidgrids.builder.cardWorkflow.deleteDialogDescriptionPrefix",
|
|
451
|
+
"Are you sure you want to delete workflow"
|
|
452
|
+
),
|
|
453
|
+
" ",
|
|
454
|
+
'"',
|
|
401
455
|
workflow.name,
|
|
402
|
-
'"
|
|
456
|
+
'"',
|
|
457
|
+
" ",
|
|
458
|
+
tr(
|
|
459
|
+
"fluidgrids.builder.cardWorkflow.deleteDialogDescriptionSuffix",
|
|
460
|
+
"and all its versions? This action cannot be undone."
|
|
461
|
+
)
|
|
403
462
|
] })
|
|
404
463
|
] }),
|
|
405
464
|
/* @__PURE__ */ jsxs(AlertDialogFooter, { children: [
|
|
406
|
-
/* @__PURE__ */ jsx(AlertDialogCancel, { disabled: isDeleting, children: "Cancel" }),
|
|
465
|
+
/* @__PURE__ */ jsx(AlertDialogCancel, { disabled: isDeleting, children: tr("fluidgrids.builder.cardWorkflow.cancelButton", "Cancel") }),
|
|
407
466
|
/* @__PURE__ */ jsx(
|
|
408
467
|
AlertDialogAction,
|
|
409
468
|
{
|
|
410
469
|
onClick: handleDeleteWorkflow,
|
|
411
470
|
disabled: isDeleting,
|
|
412
471
|
className: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
|
|
413
|
-
children: isDeleting ?
|
|
472
|
+
children: isDeleting ? tr(
|
|
473
|
+
"fluidgrids.builder.cardWorkflow.deletingButton",
|
|
474
|
+
"Deleting..."
|
|
475
|
+
) : tr("fluidgrids.builder.cardWorkflow.deleteButton", "Delete")
|
|
414
476
|
}
|
|
415
477
|
)
|
|
416
478
|
] })
|
|
@@ -448,6 +510,7 @@ function SkeletonCard() {
|
|
|
448
510
|
] });
|
|
449
511
|
}
|
|
450
512
|
function WorkflowsList() {
|
|
513
|
+
const tr = useTr();
|
|
451
514
|
const navigate = useNavigate();
|
|
452
515
|
const { workflows, loading, error, refetch } = useWorkflowDefinitions({
|
|
453
516
|
limit: 100,
|
|
@@ -468,13 +531,13 @@ function WorkflowsList() {
|
|
|
468
531
|
if (!byId.has(a.tagId)) {
|
|
469
532
|
byId.set(a.tagId, {
|
|
470
533
|
id: a.tagId,
|
|
471
|
-
label: a.tagInfo?.label ?? a.tagInfo?.key ?? "Tag"
|
|
534
|
+
label: a.tagInfo?.label ?? a.tagInfo?.key ?? tr("fluidgrids.workflowsList.tagFallbackLabel", "Tag")
|
|
472
535
|
});
|
|
473
536
|
}
|
|
474
537
|
}
|
|
475
538
|
}
|
|
476
539
|
return [...byId.values()].sort((a, b) => a.label.localeCompare(b.label));
|
|
477
|
-
}, [workflows, tagsByKey]);
|
|
540
|
+
}, [workflows, tagsByKey, tr]);
|
|
478
541
|
const filtered = useMemo(() => {
|
|
479
542
|
const q = search.trim().toLowerCase();
|
|
480
543
|
return workflows.filter((w) => {
|
|
@@ -490,7 +553,10 @@ function WorkflowsList() {
|
|
|
490
553
|
SdkPermissionButton,
|
|
491
554
|
{
|
|
492
555
|
permission: FLUIDGRIDS_PERMISSIONS.WORKFLOW_CREATE,
|
|
493
|
-
deniedTooltip:
|
|
556
|
+
deniedTooltip: tr(
|
|
557
|
+
"fluidgrids.workflowsList.createDeniedTooltip",
|
|
558
|
+
"You don't have permission to create workflows"
|
|
559
|
+
),
|
|
494
560
|
children: /* @__PURE__ */ jsxs(
|
|
495
561
|
Button,
|
|
496
562
|
{
|
|
@@ -500,7 +566,7 @@ function WorkflowsList() {
|
|
|
500
566
|
onClick: () => navigate(`../workflow/${v4()}/v1`),
|
|
501
567
|
children: [
|
|
502
568
|
/* @__PURE__ */ jsx(Icon, { icon: "mynaui:plus", className: "size-5 text-primary-foreground" }),
|
|
503
|
-
"Create Workflow"
|
|
569
|
+
tr("fluidgrids.workflowsList.createButton", "Create Workflow")
|
|
504
570
|
]
|
|
505
571
|
}
|
|
506
572
|
)
|
|
@@ -513,10 +579,13 @@ function WorkflowsList() {
|
|
|
513
579
|
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3", children: [
|
|
514
580
|
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
515
581
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2.5", children: [
|
|
516
|
-
/* @__PURE__ */ jsx("h1", { className: "text-2xl font-bold tracking-tight", children: "Workflows" }),
|
|
582
|
+
/* @__PURE__ */ jsx("h1", { className: "text-2xl font-bold tracking-tight", children: tr("fluidgrids.workflowsList.title", "Workflows") }),
|
|
517
583
|
!loading && !error && /* @__PURE__ */ jsx(Badge, { variant: "secondary", className: "font-mono", children: workflows.length })
|
|
518
584
|
] }),
|
|
519
|
-
/* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-muted-foreground", children:
|
|
585
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: tr(
|
|
586
|
+
"fluidgrids.workflowsList.subtitle",
|
|
587
|
+
"Build, run, and manage your automations. Open a workflow to edit it in the visual builder."
|
|
588
|
+
) })
|
|
520
589
|
] }),
|
|
521
590
|
createButton
|
|
522
591
|
] }),
|
|
@@ -534,8 +603,14 @@ function WorkflowsList() {
|
|
|
534
603
|
{
|
|
535
604
|
value: search,
|
|
536
605
|
onChange: (e) => setSearch(e.target.value),
|
|
537
|
-
placeholder:
|
|
538
|
-
|
|
606
|
+
placeholder: tr(
|
|
607
|
+
"fluidgrids.workflowsList.searchPlaceholder",
|
|
608
|
+
"Search workflows\u2026"
|
|
609
|
+
),
|
|
610
|
+
"aria-label": tr(
|
|
611
|
+
"fluidgrids.workflowsList.searchAriaLabel",
|
|
612
|
+
"Search workflows"
|
|
613
|
+
),
|
|
539
614
|
className: "pl-8"
|
|
540
615
|
}
|
|
541
616
|
)
|
|
@@ -550,7 +625,7 @@ function WorkflowsList() {
|
|
|
550
625
|
"rounded-full border px-3 py-1 text-xs font-medium transition-colors",
|
|
551
626
|
statusFilter === null ? "border-transparent bg-primary text-primary-foreground" : "border-border bg-card text-muted-foreground hover:text-foreground"
|
|
552
627
|
),
|
|
553
|
-
children: "All"
|
|
628
|
+
children: tr("fluidgrids.workflowsList.statusFilterAll", "All")
|
|
554
629
|
}
|
|
555
630
|
),
|
|
556
631
|
presentStatuses.map((s) => /* @__PURE__ */ jsx(
|
|
@@ -602,19 +677,28 @@ function WorkflowsList() {
|
|
|
602
677
|
}
|
|
603
678
|
),
|
|
604
679
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
605
|
-
/* @__PURE__ */ jsx("p", { className: "font-semibold", children:
|
|
680
|
+
/* @__PURE__ */ jsx("p", { className: "font-semibold", children: tr(
|
|
681
|
+
"fluidgrids.workflowsList.loadErrorTitle",
|
|
682
|
+
"Couldn't load workflows"
|
|
683
|
+
) }),
|
|
606
684
|
/* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: error.message })
|
|
607
685
|
] }),
|
|
608
686
|
/* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", onClick: () => refetch(), children: [
|
|
609
687
|
/* @__PURE__ */ jsx(Icon, { icon: "mynaui:refresh", className: "size-4" }),
|
|
610
|
-
"Try again"
|
|
688
|
+
tr("fluidgrids.workflowsList.tryAgainButton", "Try again")
|
|
611
689
|
] })
|
|
612
690
|
] }) }) : workflows.length === 0 ? /* @__PURE__ */ jsx("div", { className: "grid flex-1 place-items-center", children: /* @__PURE__ */ jsx(
|
|
613
691
|
IllustratedEmptyState,
|
|
614
692
|
{
|
|
615
693
|
illustration: "onboarding",
|
|
616
|
-
title:
|
|
617
|
-
|
|
694
|
+
title: tr(
|
|
695
|
+
"fluidgrids.workflowsList.emptyStateTitle",
|
|
696
|
+
"Create your first workflow"
|
|
697
|
+
),
|
|
698
|
+
description: tr(
|
|
699
|
+
"fluidgrids.workflowsList.emptyStateDescription",
|
|
700
|
+
"Workflows automate multi-step processes \u2014 sync signups into your CRM, post alerts to Slack, or transform data between apps. Start from a blank canvas or a template."
|
|
701
|
+
),
|
|
618
702
|
action: createButton
|
|
619
703
|
}
|
|
620
704
|
) }) : filtered.length === 0 ? /* @__PURE__ */ jsx("div", { className: "grid flex-1 place-items-center", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-3 text-center", children: [
|
|
@@ -625,7 +709,10 @@ function WorkflowsList() {
|
|
|
625
709
|
className: "size-8 text-muted-foreground"
|
|
626
710
|
}
|
|
627
711
|
),
|
|
628
|
-
/* @__PURE__ */ jsx("p", { className: "font-medium", children:
|
|
712
|
+
/* @__PURE__ */ jsx("p", { className: "font-medium", children: tr(
|
|
713
|
+
"fluidgrids.workflowsList.noFilterMatchTitle",
|
|
714
|
+
"No workflows match your filters"
|
|
715
|
+
) }),
|
|
629
716
|
/* @__PURE__ */ jsx(
|
|
630
717
|
Button,
|
|
631
718
|
{
|
|
@@ -636,7 +723,10 @@ function WorkflowsList() {
|
|
|
636
723
|
setStatusFilter(null);
|
|
637
724
|
setTagFilter(null);
|
|
638
725
|
},
|
|
639
|
-
children:
|
|
726
|
+
children: tr(
|
|
727
|
+
"fluidgrids.workflowsList.clearFiltersButton",
|
|
728
|
+
"Clear filters"
|
|
729
|
+
)
|
|
640
730
|
}
|
|
641
731
|
)
|
|
642
732
|
] }) }) : /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 2xl:grid-cols-4", children: filtered.map((workflow) => /* @__PURE__ */ jsx(
|
|
@@ -655,7 +745,10 @@ function WorkflowsList() {
|
|
|
655
745
|
total_versions: workflow.totalVersions ?? void 0,
|
|
656
746
|
tags: (tagsByKey[workflow.workflowKey] ?? []).map((a) => ({
|
|
657
747
|
id: a.tagId,
|
|
658
|
-
label: a.tagInfo?.label ?? a.tagInfo?.key ??
|
|
748
|
+
label: a.tagInfo?.label ?? a.tagInfo?.key ?? tr(
|
|
749
|
+
"fluidgrids.workflowsList.cardTagFallbackLabel",
|
|
750
|
+
"Tag"
|
|
751
|
+
),
|
|
659
752
|
color: a.tagInfo?.color ?? void 0
|
|
660
753
|
}))
|
|
661
754
|
},
|
|
@@ -668,5 +761,5 @@ function WorkflowsList() {
|
|
|
668
761
|
}
|
|
669
762
|
|
|
670
763
|
export { WorkflowsList };
|
|
671
|
-
//# sourceMappingURL=chunk-
|
|
672
|
-
//# sourceMappingURL=chunk-
|
|
764
|
+
//# sourceMappingURL=chunk-YJKZSUNC.js.map
|
|
765
|
+
//# sourceMappingURL=chunk-YJKZSUNC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/SharePopup.tsx","../src/builder/components/ui/card-workflow.tsx","../src/pages/WorkflowsList.tsx"],"names":["useState","toast","jsxs","jsx","Button","useNavigate","uuidv4","Icon","cn"],"mappings":"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","file":"chunk-YJKZSUNC.js","sourcesContent":["import { useState } from \"react\";\nimport { Copy, Share2 } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport { Button } from \"@burdenoff/fe-libs/ui\";\nimport { config } from \"../config\";\nimport { useTr } from \"../hooks/useTr\";\n\ninterface SharePopupProps {\n url: string;\n embedSrc: string;\n}\n\nexport default function SharePopup({\n url = window.location.href,\n embedSrc = `${config.fluidgridFrontendUrl}/workflow-view/565201ec-e803-4281-ad39-a135c46daa89/1.0`,\n}: SharePopupProps) {\n const tr = useTr();\n const [isOpen, setIsOpen] = useState(false);\n const [width, setWidth] = useState(600);\n const [height, setHeight] = useState(400);\n const [activeTab, setActiveTab] = useState<\"link\" | \"embed\">(\"link\");\n\n const embedCode = `<iframe src=\"${embedSrc}\" width=\"${width}\" height=\"${height}\"></iframe>`;\n\n const copyToClipboard = (text: string, message: string) => {\n navigator.clipboard.writeText(text);\n toast.success(message);\n };\n\n if (!isOpen) {\n return (\n <Button variant=\"ghost\" size=\"icon\" onClick={() => setIsOpen(true)}>\n <Share2 className=\"h-4 w-4\" />\n <span className=\"sr-only\">\n {tr(\"fluidgrids.components.sharePopup.openLabel\", \"Share\")}\n </span>\n </Button>\n );\n }\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\"\n onClick={() => setIsOpen(false)}\n >\n <div\n className=\"bg-card rounded-lg p-6 max-w-md w-full mx-4\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"flex justify-between items-center mb-4\">\n <h2 className=\"text-lg font-semibold\">\n {tr(\"fluidgrids.components.sharePopup.title\", \"Share\")}\n </h2>\n <Button variant=\"ghost\" size=\"icon\" onClick={() => setIsOpen(false)}>\n ×\n </Button>\n </div>\n\n <div className=\"flex gap-2 mb-4\">\n <Button\n variant={activeTab === \"link\" ? \"default\" : \"outline\"}\n size=\"sm\"\n onClick={() => setActiveTab(\"link\")}\n >\n {tr(\"fluidgrids.components.sharePopup.tabShareLink\", \"Share Link\")}\n </Button>\n <Button\n variant={activeTab === \"embed\" ? \"default\" : \"outline\"}\n size=\"sm\"\n onClick={() => setActiveTab(\"embed\")}\n >\n {tr(\"fluidgrids.components.sharePopup.tabEmbed\", \"Embed\")}\n </Button>\n </div>\n\n {activeTab === \"link\" && (\n <div className=\"flex items-center space-x-2\">\n <input\n readOnly\n value={url}\n className=\"flex-1 h-9 px-3 rounded-md border bg-background text-sm\"\n />\n <Button\n size=\"sm\"\n onClick={() =>\n copyToClipboard(\n url,\n tr(\n \"fluidgrids.components.sharePopup.linkCopiedToast\",\n \"Link copied to clipboard\",\n ),\n )\n }\n >\n <Copy className=\"h-4 w-4\" />\n </Button>\n </div>\n )}\n\n {activeTab === \"embed\" && (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"text-sm font-medium\">\n {tr(\"fluidgrids.components.sharePopup.widthLabel\", \"Width\")}\n </label>\n <input\n type=\"number\"\n value={width}\n onChange={(e) => setWidth(Number(e.target.value))}\n className=\"w-full h-9 px-3 rounded-md border bg-background text-sm mt-1\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">\n {tr(\"fluidgrids.components.sharePopup.heightLabel\", \"Height\")}\n </label>\n <input\n type=\"number\"\n value={height}\n onChange={(e) => setHeight(Number(e.target.value))}\n className=\"w-full h-9 px-3 rounded-md border bg-background text-sm mt-1\"\n />\n </div>\n </div>\n <div>\n <label className=\"text-sm font-medium\">\n {tr(\n \"fluidgrids.components.sharePopup.embedCodeLabel\",\n \"Embed Code\",\n )}\n </label>\n <div className=\"relative mt-1\">\n <input\n readOnly\n value={embedCode}\n className=\"w-full h-9 px-3 pr-12 rounded-md border bg-background text-sm font-mono\"\n />\n <Button\n size=\"sm\"\n className=\"absolute right-1 top-1/2 -translate-y-1/2 h-7\"\n onClick={() =>\n copyToClipboard(\n embedCode,\n tr(\n \"fluidgrids.components.sharePopup.embedCopiedToast\",\n \"Embed code copied to clipboard\",\n ),\n )\n }\n >\n <Copy className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Button,\n Card,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n TooltipProvider,\n} from \"@burdenoff/fe-libs/ui\";\nimport { TagBadge } from \"@burdenoff/fe-libs/tag\";\nimport { cn } from \"@burdenoff/fe-libs/utils\";\nimport { isQuotaExhaustedError } from \"@burdenoff/fe-libs/shared/utils\";\nimport { Icon } from \"@iconify/react\";\nimport { toast } from \"sonner\";\nimport { useFlowStore } from \"../../stores/flow-store\";\nimport { useNavigate } from \"react-router\";\nimport { config } from \"../../../config\";\nimport SharePopup from \"../../../components/SharePopup\";\nimport {\n useDuplicateWorkflow,\n useDeleteWorkflow,\n} from \"../../../hooks/useWorkflows\";\nimport { SdkPermissionGate } from \"../../../permissions/PermissionsBridge\";\nimport { FLUIDGRIDS_PERMISSIONS } from \"../../../permissions/constants\";\nimport { QuotaExhaustedDialog } from \"../../../components/shared/QuotaExhaustedDialog\";\nimport { useTr } from \"../../../hooks/useTr\";\n\ninterface WorkflowTagChip {\n id: string;\n label: string;\n color?: string;\n}\n\ninterface WorkflowData {\n id?: string;\n workflow_key: string;\n version: string;\n name: string;\n description?: string;\n status?: string;\n alias?: string;\n updated_at?: string;\n created_at?: string;\n total_versions?: number;\n /** Resolved tag assignments, rendered as read-only chips. */\n tags?: WorkflowTagChip[];\n}\n\n/** Status pill: colored dot + label, calmer than a filled badge. */\nconst STATUS_STYLES: Record<string, { label: string; dotClass: string }> = {\n DRAFT: { label: \"Draft\", dotClass: \"bg-muted-foreground/60\" },\n ACTIVE: {\n label: \"Active\",\n dotClass: \"bg-[var(--color-status-success-text)]\",\n },\n ARCHIVED: { label: \"Archived\", dotClass: \"bg-muted-foreground/30\" },\n DEPRECATED: {\n label: \"Deprecated\",\n dotClass: \"bg-[var(--color-status-error-text)]\",\n },\n};\n\n/** Compact relative timestamp (\"2h ago\"); absolute date beyond a week. */\nfunction relativeTime(iso?: string): string {\n if (!iso) return \"—\";\n const then = new Date(iso).getTime();\n if (Number.isNaN(then)) return \"—\";\n const mins = Math.floor((Date.now() - then) / 60_000);\n if (mins < 1) return \"just now\";\n if (mins < 60) return `${mins}m ago`;\n const hrs = Math.floor(mins / 60);\n if (hrs < 24) return `${hrs}h ago`;\n const days = Math.floor(hrs / 24);\n if (days < 7) return `${days}d ago`;\n return new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n }).format(new Date(then));\n}\n\nexport const CardWorkflow = ({\n workflow,\n onUpdateSuccess,\n}: {\n workflow: WorkflowData;\n onUpdateSuccess: () => void;\n}) => {\n const tr = useTr();\n const navigate = useNavigate();\n const resetWorkflow = useFlowStore((s) => s.actions.resetWorkflow);\n const { duplicateWorkflow: duplicateWorkflowMutation } =\n useDuplicateWorkflow();\n const { deleteWorkflow: deleteWorkflowMutation } = useDeleteWorkflow();\n const [showDeleteDialog, setShowDeleteDialog] = useState(false);\n const [isDeleting, setIsDeleting] = useState(false);\n const [showQuotaExhausted, setShowQuotaExhausted] = useState(false);\n\n async function handleDuplicateWorkflow() {\n try {\n // Reset the store first to clear any existing state\n resetWorkflow();\n\n const result = await duplicateWorkflowMutation(\n workflow.workflow_key,\n workflow.version,\n {\n newWorkflowKey: `${workflow.workflow_key}_copy_${Date.now()}`,\n },\n );\n\n if (result?.success && result.workflow) {\n navigate(\n `../workflow/${result.workflow.workflowKey}/${result.workflow.version}`,\n );\n } else {\n throw new Error(result?.message || \"Failed to duplicate workflow\");\n }\n } catch (error) {\n // duplicateWorkflowMutation re-throws on failure, preserving the\n // original GraphQL error as `.cause` — check that (not the wrapped\n // message) to detect QUOTA_EXHAUSTED.\n const cause = error instanceof Error ? error.cause : undefined;\n if (isQuotaExhaustedError(cause) || isQuotaExhaustedError(error)) {\n setShowQuotaExhausted(true);\n return;\n }\n console.error(\"Error duplicating workflow:\", error);\n toast.error(\n `${tr(\"fluidgrids.builder.cardWorkflow.duplicateErrorToast\", \"Error duplicating workflow:\")} ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n const handleDeleteWorkflow = async (): Promise<void> => {\n if (!workflow.workflow_key) {\n console.error(\"Workflow ID is required to delete.\");\n return;\n }\n setIsDeleting(true);\n try {\n // Omit version to delete ALL versions of this workflow\n const success = await deleteWorkflowMutation(workflow.workflow_key);\n if (success) {\n setShowDeleteDialog(false);\n }\n } catch (error) {\n console.error(\"Error deleting workflow:\", error);\n toast.error(\n `${tr(\"fluidgrids.builder.cardWorkflow.deleteErrorToast\", \"Error deleting workflow:\")} ${error instanceof Error ? error.message : String(error)}`,\n );\n } finally {\n setIsDeleting(false);\n setShowDeleteDialog(false);\n onUpdateSuccess();\n }\n };\n\n const handleOnEdit = () => {\n navigate(\"../workflow/\" + workflow.workflow_key + \"/\" + workflow.version);\n };\n\n /**\n * The whole card opens the builder (n8n-style). Inner controls — action\n * buttons, the share overlay (a non-portaled `fixed` div whose clicks bubble\n * through the card), and the dialog — must not trigger navigation.\n */\n const handleCardClick = (e: React.MouseEvent<HTMLDivElement>) => {\n const el = e.target as HTMLElement;\n if (el.closest(\"button, a, input, [role='dialog'], .fixed\")) return;\n handleOnEdit();\n };\n\n const statusInfo =\n STATUS_STYLES[workflow.status ?? \"DRAFT\"] ?? STATUS_STYLES.DRAFT;\n const updatedExact = workflow.updated_at\n ? new Date(workflow.updated_at).toLocaleString()\n : undefined;\n\n return (\n <TooltipProvider>\n <Card\n role=\"button\"\n tabIndex={0}\n aria-label={`${tr(\"fluidgrids.builder.cardWorkflow.openWorkflowAriaLabel\", \"Open workflow\")} ${workflow.name}`}\n onClick={handleCardClick}\n onKeyDown={(e) => {\n if (\n e.target === e.currentTarget &&\n (e.key === \"Enter\" || e.key === \" \")\n ) {\n e.preventDefault();\n handleOnEdit();\n }\n }}\n className={cn(\n \"group relative flex min-h-44 cursor-pointer flex-col gap-0 rounded-xl border-border bg-card p-0\",\n \"transition-all duration-150 hover:-translate-y-0.5 hover:border-primary/40 hover:shadow-lg\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/50\",\n )}\n >\n {/* Header: icon square + name/description + status pill */}\n <div className=\"flex flex-1 items-start gap-3 p-4\">\n <div className=\"flex size-9 shrink-0 items-center justify-center rounded-lg border border-primary/20 bg-primary/10 text-primary\">\n <Icon icon=\"mdi:transit-connection-variant\" className=\"size-5\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-start justify-between gap-2\">\n <h3 className=\"truncate font-semibold leading-6 text-card-foreground\">\n {workflow?.name}\n </h3>\n <span className=\"mt-0.5 inline-flex shrink-0 items-center gap-1.5 rounded-full border border-border px-2 py-0.5 text-[11px] font-medium text-muted-foreground\">\n <span\n className={cn(\"size-1.5 rounded-full\", statusInfo.dotClass)}\n />\n {statusInfo.label}\n </span>\n </div>\n <p className=\"mt-1 line-clamp-2 text-xs leading-snug text-muted-foreground\">\n {workflow.description ||\n tr(\n \"fluidgrids.builder.cardWorkflow.noDescription\",\n \"No description\",\n )}\n </p>\n {workflow.tags && workflow.tags.length > 0 && (\n <div className=\"mt-2 flex flex-wrap items-center gap-1\">\n {workflow.tags.slice(0, 3).map((tag) => (\n <TagBadge\n key={tag.id}\n id={tag.id}\n label={tag.label}\n color={tag.color}\n size=\"sm\"\n />\n ))}\n {workflow.tags.length > 3 && (\n <span className=\"text-[11px] text-muted-foreground\">\n +{workflow.tags.length - 3}\n </span>\n )}\n </div>\n )}\n </div>\n </div>\n\n {/* Footer: metadata + actions (actions brighten on hover/focus) */}\n <div className=\"flex items-center justify-between gap-2 border-t border-border px-4 py-1.5\">\n <div\n className=\"flex min-w-0 items-center gap-1.5 text-[11px] text-muted-foreground\"\n title={updatedExact}\n >\n <Icon icon=\"mdi:clock-outline\" className=\"size-3.5 shrink-0\" />\n <span className=\"truncate\">\n {tr(\"fluidgrids.builder.cardWorkflow.updatedPrefix\", \"Updated\")}{\" \"}\n {relativeTime(workflow.updated_at)}\n </span>\n <span aria-hidden=\"true\">·</span>\n <span className=\"shrink-0 font-mono\">\n {workflow.version}\n {workflow.alias ? ` (${workflow.alias})` : \"\"}\n </span>\n {workflow.total_versions && workflow.total_versions > 1 ? (\n <span className=\"shrink-0\">\n · {workflow.total_versions}{\" \"}\n {tr(\n \"fluidgrids.builder.cardWorkflow.versionsSuffix\",\n \"versions\",\n )}\n </span>\n ) : null}\n </div>\n\n <div className=\"flex shrink-0 items-center gap-0.5 opacity-60 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8\"\n onClick={handleOnEdit}\n aria-label={tr(\n \"fluidgrids.builder.cardWorkflow.editWorkflow\",\n \"Edit workflow\",\n )}\n >\n <Icon icon=\"mynaui:edit\" className=\"size-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n <p>\n {tr(\n \"fluidgrids.builder.cardWorkflow.editWorkflow\",\n \"Edit workflow\",\n )}\n </p>\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <span>\n <SharePopup\n url={`${config.fluidgridFrontendUrl}/workflow-view/${workflow.workflow_key}/${workflow.version}`}\n embedSrc={`${config.fluidgridFrontendUrl}/workflow-view/${workflow.workflow_key}/${workflow.version}`}\n />\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n <p>\n {tr(\n \"fluidgrids.builder.cardWorkflow.shareWorkflow\",\n \"Share workflow\",\n )}\n </p>\n </TooltipContent>\n </Tooltip>\n <SdkPermissionGate\n permission={FLUIDGRIDS_PERMISSIONS.WORKFLOW_CREATE}\n >\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8\"\n onClick={() => handleDuplicateWorkflow()}\n aria-label={tr(\n \"fluidgrids.builder.cardWorkflow.duplicateWorkflow\",\n \"Duplicate workflow\",\n )}\n >\n <Icon icon=\"mynaui:copy\" className=\"size-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n <p>\n {tr(\n \"fluidgrids.builder.cardWorkflow.duplicateWorkflow\",\n \"Duplicate workflow\",\n )}\n </p>\n </TooltipContent>\n </Tooltip>\n </SdkPermissionGate>\n <SdkPermissionGate\n permission={FLUIDGRIDS_PERMISSIONS.WORKFLOW_DELETE}\n >\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8 text-[var(--color-status-error-text)] hover:text-[var(--color-status-error-text)]\"\n onClick={() => setShowDeleteDialog(true)}\n aria-label={tr(\n \"fluidgrids.builder.cardWorkflow.deleteWorkflow\",\n \"Delete workflow\",\n )}\n >\n <Icon icon=\"mynaui:trash\" className=\"size-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n <p>\n {tr(\n \"fluidgrids.builder.cardWorkflow.deleteWorkflow\",\n \"Delete workflow\",\n )}\n </p>\n </TooltipContent>\n </Tooltip>\n </SdkPermissionGate>\n </div>\n </div>\n </Card>\n\n <AlertDialog open={showDeleteDialog} onOpenChange={setShowDeleteDialog}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>\n {tr(\n \"fluidgrids.builder.cardWorkflow.deleteDialogTitle\",\n \"Delete Workflow\",\n )}\n </AlertDialogTitle>\n <AlertDialogDescription>\n {tr(\n \"fluidgrids.builder.cardWorkflow.deleteDialogDescriptionPrefix\",\n \"Are you sure you want to delete workflow\",\n )}{\" \"}\n "{workflow.name}"{\" \"}\n {tr(\n \"fluidgrids.builder.cardWorkflow.deleteDialogDescriptionSuffix\",\n \"and all its versions? This action cannot be undone.\",\n )}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel disabled={isDeleting}>\n {tr(\"fluidgrids.builder.cardWorkflow.cancelButton\", \"Cancel\")}\n </AlertDialogCancel>\n <AlertDialogAction\n onClick={handleDeleteWorkflow}\n disabled={isDeleting}\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n >\n {isDeleting\n ? tr(\n \"fluidgrids.builder.cardWorkflow.deletingButton\",\n \"Deleting...\",\n )\n : tr(\"fluidgrids.builder.cardWorkflow.deleteButton\", \"Delete\")}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n\n <QuotaExhaustedDialog\n open={showQuotaExhausted}\n onOpenChange={setShowQuotaExhausted}\n onUpgrade={() => {\n setShowQuotaExhausted(false);\n navigate(\"/billing\");\n }}\n />\n </TooltipProvider>\n );\n};\n","import { useMemo, useState } from \"react\";\nimport { useNavigate } from \"react-router\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { Icon } from \"@iconify/react\";\n\nimport {\n Badge,\n Button,\n IllustratedEmptyState,\n Input,\n Skeleton,\n} from \"@burdenoff/fe-libs/ui\";\nimport { cn } from \"@burdenoff/fe-libs/utils\";\nimport { CardWorkflow } from \"../builder/components/ui/card-workflow\";\nimport { useWorkflowDefinitions } from \"../hooks/useWorkflows\";\nimport { useTr } from \"../hooks/useTr\";\nimport { useWorkflowTagOverlay } from \"../hooks/useEntityTags\";\nimport { SdkPermissionButton } from \"../permissions/PermissionsBridge\";\nimport { FLUIDGRIDS_PERMISSIONS } from \"../permissions/constants\";\n\n/** Display order + labels for the status filter chips. */\nconst STATUS_FILTERS: Array<{ value: string; label: string }> = [\n { value: \"ACTIVE\", label: \"Active\" },\n { value: \"DRAFT\", label: \"Draft\" },\n { value: \"ARCHIVED\", label: \"Archived\" },\n { value: \"DEPRECATED\", label: \"Deprecated\" },\n];\n\nfunction SkeletonCard() {\n return (\n <div className=\"flex min-h-40 flex-col justify-between rounded-xl border border-border bg-card p-6\">\n <div className=\"space-y-2.5\">\n <Skeleton className=\"h-6 w-2/3 bg-card-foreground/15\" />\n <Skeleton className=\"h-4 w-full bg-card-foreground/10\" />\n </div>\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"mr-4 h-6 w-full bg-card-foreground/10\" />\n <Skeleton className=\"h-6 w-8 bg-card-foreground/10\" />\n <Skeleton className=\"h-6 w-8 bg-card-foreground/10\" />\n </div>\n </div>\n );\n}\n\nexport function WorkflowsList() {\n const tr = useTr();\n const navigate = useNavigate();\n const { workflows, loading, error, refetch } = useWorkflowDefinitions({\n limit: 100,\n latestOnly: true,\n });\n\n const [search, setSearch] = useState(\"\");\n const [statusFilter, setStatusFilter] = useState<string | null>(null);\n const [tagFilter, setTagFilter] = useState<string | null>(null);\n // Fetched separately from the workflow list so a missing/lagging\n // tagAssignments field can never blank the list itself.\n const { tagsByKey } = useWorkflowTagOverlay();\n\n // Only offer chips for statuses that actually occur in this workspace.\n const presentStatuses = useMemo(() => {\n const seen = new Set<string>(workflows.map((w) => w.status ?? \"DRAFT\"));\n return STATUS_FILTERS.filter((s) => seen.has(s.value));\n }, [workflows]);\n\n // Tags present across the listed workflows, for the filter chips. Tag ids\n // come from the assignments so the filter works on ids, not labels\n // (two vocabularies can share a label).\n const presentTags = useMemo(() => {\n const byId = new Map<string, { id: string; label: string }>();\n for (const w of workflows) {\n for (const a of tagsByKey[w.workflowKey] ?? []) {\n if (!byId.has(a.tagId)) {\n byId.set(a.tagId, {\n id: a.tagId,\n label:\n a.tagInfo?.label ??\n a.tagInfo?.key ??\n tr(\"fluidgrids.workflowsList.tagFallbackLabel\", \"Tag\"),\n });\n }\n }\n }\n return [...byId.values()].sort((a, b) => a.label.localeCompare(b.label));\n }, [workflows, tagsByKey, tr]);\n\n const filtered = useMemo(() => {\n const q = search.trim().toLowerCase();\n return workflows.filter((w) => {\n if (statusFilter && (w.status ?? \"DRAFT\") !== statusFilter) return false;\n // Tags come from the separate overlay query, not from the workflow row:\n // tagAssignments was removed from the list query so a missing field can\n // never blank the list. Reading it here left the filter always empty.\n if (\n tagFilter &&\n !(tagsByKey[w.workflowKey] ?? []).some((a) => a.tagId === tagFilter)\n )\n return false;\n if (!q) return true;\n return [w.name, w.description, w.alias]\n .filter((v): v is string => typeof v === \"string\")\n .some((v) => v.toLowerCase().includes(q));\n });\n }, [workflows, search, statusFilter, tagFilter, tagsByKey]);\n\n const hasFilters =\n search.trim() !== \"\" || statusFilter !== null || tagFilter !== null;\n\n const createButton = (\n <SdkPermissionButton\n permission={FLUIDGRIDS_PERMISSIONS.WORKFLOW_CREATE}\n deniedTooltip={tr(\n \"fluidgrids.workflowsList.createDeniedTooltip\",\n \"You don't have permission to create workflows\",\n )}\n >\n <Button\n variant=\"default\"\n size=\"default\"\n className=\"font-bold text-primary-foreground\"\n onClick={() => navigate(`../workflow/${uuidv4()}/v1`)}\n >\n <Icon icon=\"mynaui:plus\" className=\"size-5 text-primary-foreground\" />\n {tr(\"fluidgrids.workflowsList.createButton\", \"Create Workflow\")}\n </Button>\n </SdkPermissionButton>\n );\n\n return (\n // min-h-screen (matching the sibling pages) makes short content still fill\n // the viewport, keeping the shell footer below the fold.\n <main className=\"flex min-h-screen w-full flex-col bg-background-primary\">\n <div className=\"flex flex-1 flex-col gap-5 p-4 sm:p-6\">\n {/* Page header */}\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2.5\">\n <h1 className=\"text-2xl font-bold tracking-tight\">\n {tr(\"fluidgrids.workflowsList.title\", \"Workflows\")}\n </h1>\n {!loading && !error && (\n <Badge variant=\"secondary\" className=\"font-mono\">\n {workflows.length}\n </Badge>\n )}\n </div>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {tr(\n \"fluidgrids.workflowsList.subtitle\",\n \"Build, run, and manage your automations. Open a workflow to edit it in the visual builder.\",\n )}\n </p>\n </div>\n {createButton}\n </div>\n\n {/* Toolbar: search + status chips (only useful once something exists) */}\n {!loading && !error && workflows.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-3\">\n <div className=\"relative w-full max-w-xs\">\n <Icon\n icon=\"mynaui:search\"\n className=\"pointer-events-none absolute left-2.5 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\"\n />\n <Input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={tr(\n \"fluidgrids.workflowsList.searchPlaceholder\",\n \"Search workflows…\",\n )}\n aria-label={tr(\n \"fluidgrids.workflowsList.searchAriaLabel\",\n \"Search workflows\",\n )}\n className=\"pl-8\"\n />\n </div>\n {presentStatuses.length > 1 && (\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <button\n type=\"button\"\n onClick={() => setStatusFilter(null)}\n className={cn(\n \"rounded-full border px-3 py-1 text-xs font-medium transition-colors\",\n statusFilter === null\n ? \"border-transparent bg-primary text-primary-foreground\"\n : \"border-border bg-card text-muted-foreground hover:text-foreground\",\n )}\n >\n {tr(\"fluidgrids.workflowsList.statusFilterAll\", \"All\")}\n </button>\n {presentStatuses.map((s) => (\n <button\n key={s.value}\n type=\"button\"\n onClick={() =>\n setStatusFilter((cur) =>\n cur === s.value ? null : s.value,\n )\n }\n className={cn(\n \"rounded-full border px-3 py-1 text-xs font-medium transition-colors\",\n statusFilter === s.value\n ? \"border-transparent bg-primary text-primary-foreground\"\n : \"border-border bg-card text-muted-foreground hover:text-foreground\",\n )}\n >\n {s.label}\n </button>\n ))}\n </div>\n )}\n {presentTags.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <Icon\n icon=\"mdi:tag-outline\"\n className=\"size-4 text-muted-foreground\"\n aria-hidden=\"true\"\n />\n {presentTags.map((t) => (\n <button\n key={t.id}\n type=\"button\"\n onClick={() =>\n setTagFilter((cur) => (cur === t.id ? null : t.id))\n }\n className={cn(\n \"rounded-full border px-3 py-1 text-xs font-medium transition-colors\",\n tagFilter === t.id\n ? \"border-transparent bg-primary text-primary-foreground\"\n : \"border-border bg-card text-muted-foreground hover:text-foreground\",\n )}\n >\n {t.label}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {/* Content */}\n {loading ? (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 2xl:grid-cols-4\">\n {Array.from({ length: 6 }, (_, i) => (\n <SkeletonCard key={i} />\n ))}\n </div>\n ) : error ? (\n <div className=\"grid flex-1 place-items-center\">\n <div className=\"flex max-w-md flex-col items-center gap-3 rounded-xl border border-border bg-card p-8 text-center\">\n <Icon\n icon=\"mynaui:danger-triangle\"\n className=\"size-8 text-destructive\"\n />\n <div>\n <p className=\"font-semibold\">\n {tr(\n \"fluidgrids.workflowsList.loadErrorTitle\",\n \"Couldn't load workflows\",\n )}\n </p>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {error.message}\n </p>\n </div>\n <Button variant=\"outline\" size=\"sm\" onClick={() => refetch()}>\n <Icon icon=\"mynaui:refresh\" className=\"size-4\" />\n {tr(\"fluidgrids.workflowsList.tryAgainButton\", \"Try again\")}\n </Button>\n </div>\n </div>\n ) : workflows.length === 0 ? (\n <div className=\"grid flex-1 place-items-center\">\n <IllustratedEmptyState\n illustration=\"onboarding\"\n title={tr(\n \"fluidgrids.workflowsList.emptyStateTitle\",\n \"Create your first workflow\",\n )}\n description={tr(\n \"fluidgrids.workflowsList.emptyStateDescription\",\n \"Workflows automate multi-step processes — sync signups into your CRM, post alerts to Slack, or transform data between apps. Start from a blank canvas or a template.\",\n )}\n action={createButton}\n />\n </div>\n ) : filtered.length === 0 ? (\n <div className=\"grid flex-1 place-items-center\">\n <div className=\"flex flex-col items-center gap-3 text-center\">\n <Icon\n icon=\"mynaui:search\"\n className=\"size-8 text-muted-foreground\"\n />\n <p className=\"font-medium\">\n {tr(\n \"fluidgrids.workflowsList.noFilterMatchTitle\",\n \"No workflows match your filters\",\n )}\n </p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => {\n setSearch(\"\");\n setStatusFilter(null);\n setTagFilter(null);\n }}\n >\n {tr(\n \"fluidgrids.workflowsList.clearFiltersButton\",\n \"Clear filters\",\n )}\n </Button>\n </div>\n </div>\n ) : (\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 2xl:grid-cols-4\">\n {filtered.map((workflow) => (\n <CardWorkflow\n key={workflow.id}\n workflow={{\n id: workflow.id,\n workflow_key: workflow.workflowKey,\n version: workflow.version,\n name: workflow.name,\n description: workflow.description ?? undefined,\n status: workflow.status ?? undefined,\n alias: workflow.alias ?? undefined,\n updated_at: workflow.updatedAt ?? undefined,\n created_at: workflow.createdAt ?? undefined,\n total_versions: workflow.totalVersions ?? undefined,\n tags: (tagsByKey[workflow.workflowKey] ?? []).map((a) => ({\n id: a.tagId,\n label:\n a.tagInfo?.label ??\n a.tagInfo?.key ??\n tr(\n \"fluidgrids.workflowsList.cardTagFallbackLabel\",\n \"Tag\",\n ),\n color: a.tagInfo?.color ?? undefined,\n })),\n }}\n onUpdateSuccess={() => refetch()}\n />\n ))}\n </div>\n )}\n </div>\n </main>\n );\n}\n"]}
|