@burdenoff/fluidgrids-fe-sdk 2026.930.7 → 2026.1005.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.
@@ -1,4 +1,5 @@
1
- export { WorkflowBuilder } from './chunk-WZEYHEGQ.js';
1
+ export { WorkflowBuilder } from './chunk-2DN6NTKM.js';
2
+ import './chunk-KGD6CRSA.js';
2
3
  import './chunk-IVWSTICA.js';
3
4
  import './chunk-XQP33UJR.js';
4
5
  import './chunk-P5PKRQAO.js';
@@ -16,5 +17,5 @@ import './chunk-3P4YQ7DO.js';
16
17
  import './chunk-LMO5ASOE.js';
17
18
  import './chunk-7YWBH2A5.js';
18
19
  import './chunk-5BDQNSP3.js';
19
- //# sourceMappingURL=WorkflowBuilder-P2LCNQT3.js.map
20
- //# sourceMappingURL=WorkflowBuilder-P2LCNQT3.js.map
20
+ //# sourceMappingURL=WorkflowBuilder-B3VBBZVG.js.map
21
+ //# sourceMappingURL=WorkflowBuilder-B3VBBZVG.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"WorkflowBuilder-P2LCNQT3.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"WorkflowBuilder-B3VBBZVG.js"}
@@ -1,4 +1,5 @@
1
- export { WorkflowsList } from './chunk-JYBARIVZ.js';
1
+ export { WorkflowsList } from './chunk-ZZRRG37Q.js';
2
+ import './chunk-KGD6CRSA.js';
2
3
  import './chunk-AANIWER2.js';
3
4
  import './chunk-W23ZXNKU.js';
4
5
  import './chunk-3ZYUGTIT.js';
@@ -9,5 +10,5 @@ import './chunk-3P4YQ7DO.js';
9
10
  import './chunk-LMO5ASOE.js';
10
11
  import './chunk-7YWBH2A5.js';
11
12
  import './chunk-5BDQNSP3.js';
12
- //# sourceMappingURL=WorkflowsList-BLTHWPFH.js.map
13
- //# sourceMappingURL=WorkflowsList-BLTHWPFH.js.map
13
+ //# sourceMappingURL=WorkflowsList-3Q7SSUYR.js.map
14
+ //# sourceMappingURL=WorkflowsList-3Q7SSUYR.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"WorkflowsList-BLTHWPFH.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"WorkflowsList-3Q7SSUYR.js"}
@@ -1,10 +1,12 @@
1
+ import { isCreateIntent, decideMissingWorkflow } from './chunk-KGD6CRSA.js';
1
2
  import { useInstalledNodes, buildNodeCheck, refetchStoreNodes, FlowBuilderPage, buildRequiredNodeTypes, mergeStickyNotes } from './chunk-IVWSTICA.js';
2
3
  import { useLazyWorkflowDefinition, useCreateWorkflow } from './chunk-GKSXZFDY.js';
3
4
  import { useFlowStore } from './chunk-3B5YEXSW.js';
4
- import { useNavigate, useParams } from 'react-router';
5
+ import { useTr } from './chunk-7YWBH2A5.js';
6
+ import { useNavigate, useParams, useLocation } from 'react-router';
5
7
  import { toast } from 'sonner';
6
8
  import { Icon } from '@iconify/react';
7
- import { lazy, useState, useRef, useCallback, useEffect, useMemo, Suspense } from 'react';
9
+ import { lazy, useRef, useEffect, useState, useCallback, useMemo, Suspense } from 'react';
8
10
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
9
11
  import { ErrorBoundary } from '@burdenoff/fe-libs/shared/components';
10
12
  import '@xyflow/react/dist/style.css';
@@ -25,6 +27,14 @@ function WorkflowItem({
25
27
  }
26
28
  const { id, version } = useParams();
27
29
  const navigate = useNavigate();
30
+ const tr = useTr();
31
+ const location = useLocation();
32
+ const createIntentRef = useRef(isCreateIntent(location.state));
33
+ useEffect(() => {
34
+ createIntentRef.current = isCreateIntent(location.state);
35
+ }, [location.state]);
36
+ const [notFound, setNotFound] = useState(false);
37
+ const [retryNonce, setRetryNonce] = useState(0);
28
38
  const loadRunId = new URLSearchParams(window.location.search).get("loadRun");
29
39
  const [workflow, setWorkflow] = useState(null);
30
40
  const [isLoading, setIsLoading] = useState(true);
@@ -140,6 +150,7 @@ function WorkflowItem({
140
150
  const loadWorkflow = async () => {
141
151
  try {
142
152
  resetWorkflow();
153
+ if (mounted) setNotFound(false);
143
154
  if (mounted) setLoadError(null);
144
155
  if (version && mounted) {
145
156
  setIsLoading(true);
@@ -249,7 +260,11 @@ function WorkflowItem({
249
260
  return;
250
261
  }
251
262
  const anyVersion = await getWorkflow(id, void 0, void 0);
252
- if (anyVersion?.workflowKey) {
263
+ const missing = decideMissingWorkflow({
264
+ createIntent: createIntentRef.current,
265
+ otherVersionExists: !!anyVersion?.workflowKey
266
+ });
267
+ if (missing === "open-newest" && anyVersion) {
253
268
  toast.info(`Version ${version} not found`, {
254
269
  description: `Opening ${anyVersion.version} instead.`,
255
270
  dismissible: true
@@ -259,6 +274,10 @@ function WorkflowItem({
259
274
  });
260
275
  return;
261
276
  }
277
+ if (missing === "not-found") {
278
+ if (mounted) setNotFound(true);
279
+ return;
280
+ }
262
281
  if (!creatingRef.current) {
263
282
  creatingRef.current = true;
264
283
  const initialDefinitionJson = {
@@ -336,7 +355,8 @@ function WorkflowItem({
336
355
  newWorkflow,
337
356
  resetWorkflow,
338
357
  navigate,
339
- loadRunId
358
+ loadRunId,
359
+ retryNonce
340
360
  // doNodeCheckRef is intentionally omitted — it's a ref (stable by definition)
341
361
  // and including doNodeCheck here caused infinite re-runs because installedAppIds
342
362
  // produces a new Set reference on every render.
@@ -377,6 +397,47 @@ function WorkflowItem({
377
397
  /* @__PURE__ */ jsx("span", { className: "text-sm text-foreground/60", children: "Loading workflow..." })
378
398
  ] }) })
379
399
  );
400
+ if (notFound)
401
+ return /* @__PURE__ */ jsxs(
402
+ "div",
403
+ {
404
+ role: "alert",
405
+ className: "flex h-full min-h-[60vh] w-full flex-col items-center justify-center gap-3 p-6 text-center",
406
+ children: [
407
+ /* @__PURE__ */ jsx("p", { className: "text-base font-medium text-foreground", children: tr(
408
+ "fluidgrids.builder.workflowNotFound.title",
409
+ "Workflow not found"
410
+ ) }),
411
+ /* @__PURE__ */ jsx("p", { className: "max-w-md text-sm text-foreground/60", children: tr(
412
+ "fluidgrids.builder.workflowNotFound.description",
413
+ "No workflow with this key exists in this workspace, or it could not be loaded. Nothing was created."
414
+ ) }),
415
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
416
+ /* @__PURE__ */ jsx(
417
+ "button",
418
+ {
419
+ type: "button",
420
+ className: "rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground",
421
+ onClick: () => setRetryNonce((n) => n + 1),
422
+ children: tr("fluidgrids.builder.workflowNotFound.retry", "Try again")
423
+ }
424
+ ),
425
+ /* @__PURE__ */ jsx(
426
+ "button",
427
+ {
428
+ type: "button",
429
+ className: "rounded-md border px-4 py-2 text-sm font-medium text-foreground",
430
+ onClick: () => navigate("../list"),
431
+ children: tr(
432
+ "fluidgrids.builder.workflowNotFound.back",
433
+ "Back to Workflows"
434
+ )
435
+ }
436
+ )
437
+ ] })
438
+ ]
439
+ }
440
+ );
380
441
  return /* @__PURE__ */ jsxs(Fragment, { children: [
381
442
  configModalOpen && pendingWorkflow && /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(
382
443
  LazyMissingNodesInstallModal,
@@ -438,5 +499,5 @@ function WorkflowBuilder() {
438
499
  }
439
500
 
440
501
  export { WorkflowBuilder };
441
- //# sourceMappingURL=chunk-WZEYHEGQ.js.map
442
- //# sourceMappingURL=chunk-WZEYHEGQ.js.map
502
+ //# sourceMappingURL=chunk-2DN6NTKM.js.map
503
+ //# sourceMappingURL=chunk-2DN6NTKM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/builder/app/workflow/work/page.tsx","../src/pages/WorkflowBuilder.tsx"],"names":["useNavigate","jsx","jsxs"],"mappings":"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","file":"chunk-2DN6NTKM.js","sourcesContent":["import { useLocation, useNavigate, useParams } from \"react-router\";\nimport { toast } from \"sonner\";\nimport { Icon } from \"@iconify/react\";\nimport { FlowBuilderPage } from \"../_components/flow-builder\";\nimport {\n useEffect,\n useState,\n useRef,\n useMemo,\n useCallback,\n lazy,\n Suspense,\n} from \"react\";\nimport { useFlowStore, type IFlowState } from \"../../../stores/flow-store\";\nimport {\n useLazyWorkflowDefinition,\n useCreateWorkflow,\n} from \"../../../../hooks/useWorkflows\";\nimport { useInstalledNodes } from \"../../../../hooks/store/useInstalledNodes\";\nimport { mergeStickyNotes } from \"../../../lib/sticky-notes\";\nimport type {\n TemplateNodeCheckResult,\n WorkflowTemplateContent,\n} from \"../../../../types/workflow-template-content\";\nimport {\n buildRequiredNodeTypes,\n buildNodeCheck,\n} from \"../../../../utils/workflow-node-check\";\nimport { refetchStoreNodes } from \"../../../components/flow-builder/components/blocks\";\nimport { useTr } from \"../../../../hooks/useTr\";\nimport {\n decideMissingWorkflow,\n isCreateIntent,\n} from \"../../../../utils/workflow-open\";\n\n// Lazy-load the modal to avoid bundle-size impact on routes that never hit it.\nconst LazyMissingNodesInstallModal = lazy(() =>\n import(\"../../../components/flow-builder/components/templates/MissingNodesInstallModal\").then(\n (m) => ({ default: m.MissingNodesInstallModal }),\n ),\n);\n\ninterface WorkflowDefinitionData {\n nodes: IFlowState[\"workflow\"][\"nodes\"];\n edges: IFlowState[\"workflow\"][\"edges\"];\n sidebar: IFlowState[\"workflow\"][\"sidebar\"];\n /** Canvas annotations persisted separately from executable nodes. */\n stickyNotes?: IFlowState[\"workflow\"][\"nodes\"];\n}\n\nexport default function WorkflowItem({\n readonly = false,\n}: {\n readonly?: boolean;\n}) {\n if (readonly) {\n const queryParams = new URLSearchParams(window.location.search);\n queryParams.set(\"readonly\", \"true\");\n const newUrl = `${window.location.pathname}?${queryParams.toString()}`;\n window.history.replaceState(null, \"\", newUrl);\n }\n const { id, version } = useParams();\n const navigate = useNavigate();\n const tr = useTr();\n const location = useLocation();\n // Only an explicit \"Create Workflow\" navigation may mint a definition on\n // open (BOFF-8060 F2). Read through a ref so the load effect does not re-run\n // when router state changes.\n const createIntentRef = useRef(isCreateIntent(location.state));\n useEffect(() => {\n createIntentRef.current = isCreateIntent(location.state);\n }, [location.state]);\n // The key (and version) has no definition and nothing was created for it.\n const [notFound, setNotFound] = useState(false);\n // Bumped by \"Try again\" to re-run the load after a failed lookup.\n const [retryNonce, setRetryNonce] = useState(0);\n const loadRunId = new URLSearchParams(window.location.search).get(\"loadRun\");\n const [workflow, setWorkflow] = useState<IFlowState[\"workflow\"] | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [loadError, setLoadError] = useState<string | null>(null);\n const resetWorkflow = useFlowStore((s) => s.actions.resetWorkflow);\n const { getWorkflow } = useLazyWorkflowDefinition();\n const { createWorkflow } = useCreateWorkflow();\n const creatingRef = useRef(false);\n const fromSharedLoadedRef = useRef(false);\n const fetchedWorkflowRef = useRef<IFlowState[\"workflow\"] | null>(null);\n\n // ── Missing-nodes modal state ────────────────────────────────────────────\n const { installedAppIds } = useInstalledNodes();\n const [pendingWorkflow, setPendingWorkflow] = useState<\n IFlowState[\"workflow\"] | null\n >(null);\n const [nodeCheck, setNodeCheck] = useState<TemplateNodeCheckResult | null>(\n null,\n );\n const [configModalOpen, setConfigModalOpen] = useState(false);\n const [installing, setInstalling] = useState(false);\n const [installProgress, setInstallProgress] = useState<{\n current: number;\n total: number;\n nodeName: string;\n } | null>(null);\n const [installErrors, setInstallErrors] = useState<string[]>([]);\n\n // Classify requiredNodeTypes into installed / missing / missingPaid.\n const doNodeCheck = useCallback(\n (requiredNodeTypes: Parameters<typeof buildNodeCheck>[0]) =>\n buildNodeCheck(requiredNodeTypes, installedAppIds),\n [installedAppIds],\n );\n\n // Keep a ref so the loadWorkflow effect can call doNodeCheck without\n // taking it as a reactive dependency (which would re-trigger the effect\n // on every render and cause infinite CreateWorkflowDefinition mutations).\n const doNodeCheckRef = useRef(doNodeCheck);\n useEffect(() => {\n doNodeCheckRef.current = doNodeCheck;\n });\n\n // Install missing free nodes then open the pending workflow in the builder.\n const handleInstallConfirm = useCallback(async () => {\n if (!pendingWorkflow) return;\n // `missing` now holds only nodes the store can actually install;\n // store-unavailable ones are reported separately (BOFF-7267).\n const nodesToInstall = (nodeCheck?.missing ?? []).filter(\n (n) => !!n.storeProductId,\n );\n const failed: string[] = [];\n\n if (nodesToInstall.length > 0) {\n setInstalling(true);\n setInstallErrors([]);\n try {\n const { getGlobalStoreClient } =\n await import(\"../../../../graphql/global-client\");\n const { InstallWorkflowNodeDocument } =\n await import(\"../../../../generated/global-operations\");\n const { getFluidGridsConfig } = await import(\"../../../../config\");\n\n const storeClient = getGlobalStoreClient();\n const cfg = getFluidGridsConfig();\n\n for (let i = 0; i < nodesToInstall.length; i++) {\n const node = nodesToInstall[i];\n setInstallProgress({\n current: i + 1,\n total: nodesToInstall.length,\n nodeName: node.displayName || node.nodeType,\n });\n try {\n if (storeClient) {\n await storeClient.mutate({\n mutation: InstallWorkflowNodeDocument,\n variables: {\n input: {\n productId: node.storeProductId!,\n workspaceId: cfg.workspaceId,\n organizationId: cfg.tenantId,\n version: node.nodeVersion,\n manifest: null,\n },\n },\n });\n }\n } catch {\n // Keep installing the rest, but remember what failed so the user\n // is told instead of the dialog silently closing (BOFF-7267).\n failed.push(node.displayName || node.nodeType);\n }\n }\n\n // Refresh the in-memory node registry so the builder renders the\n // newly-installed nodes with their real manifests and operations.\n await refetchStoreNodes();\n } finally {\n setInstalling(false);\n setInstallProgress(null);\n }\n }\n\n if (failed.length > 0) {\n // Hold the dialog open so the failure is visible and retryable; the user\n // can still choose \"Open Without Installing\".\n setInstallErrors(failed);\n return;\n }\n\n setInstallErrors([]);\n setConfigModalOpen(false);\n setWorkflow(pendingWorkflow);\n setPendingWorkflow(null);\n setNodeCheck(null);\n }, [pendingWorkflow, nodeCheck]);\n\n const handleSkipInstall = useCallback(() => {\n if (!pendingWorkflow) return;\n setConfigModalOpen(false);\n setWorkflow(pendingWorkflow);\n setPendingWorkflow(null);\n setNodeCheck(null);\n }, [pendingWorkflow]);\n\n const newWorkflow = useMemo(\n () => ({\n id: id ?? \"\",\n workflowKey: id ?? \"\",\n version: version ?? \"\",\n name: \"Untitled Workflow\",\n edges: [] as IFlowState[\"workflow\"][\"edges\"],\n nodes: [] as IFlowState[\"workflow\"][\"nodes\"],\n sidebar: {\n active: \"store-browse\" as const,\n panels: {\n nodeProperties: {\n selectedNode: null,\n },\n },\n },\n }),\n [id, version],\n );\n\n useEffect(() => {\n let mounted = true;\n const loadWorkflow = async () => {\n try {\n // Always reset the store first\n resetWorkflow();\n if (mounted) setNotFound(false);\n if (mounted) setLoadError(null);\n\n // For versioned workflows, set loading so FlowBuilderPage unmounts\n // before Zustand is cleared. This prevents the flash of an empty\n // canvas when the component is reused across route navigations.\n if (version && mounted) {\n setIsLoading(true);\n }\n\n if (!version) {\n // Check for a manifest copied from a public shared workflow\n const fromSharedId =\n typeof window !== \"undefined\"\n ? new URLSearchParams(window.location.search).get(\"fromShared\")\n : null;\n const pendingManifestJson =\n fromSharedId && typeof localStorage !== \"undefined\"\n ? localStorage.getItem(\"pendingSharedWorkflow\")\n : null;\n\n if (fromSharedId && pendingManifestJson) {\n try {\n // Do NOT remove from localStorage here — React StrictMode double-fires\n // effects (mount → cleanup → mount). If we remove on the first run,\n // the second run finds null and falls through to an empty workflow.\n // We remove it inside `if (mounted)` so only the \"winning\" run\n // (the one whose mounted flag is still true) clears the entry.\n const manifest = JSON.parse(pendingManifestJson) as {\n nodes?: IFlowState[\"workflow\"][\"nodes\"];\n edges?: IFlowState[\"workflow\"][\"edges\"];\n name?: string;\n };\n\n const sharedWorkflow: IFlowState[\"workflow\"] = {\n ...newWorkflow,\n name: manifest.name ?? \"Copied Workflow\",\n nodes: manifest.nodes ?? [],\n edges: manifest.edges ?? [],\n };\n\n // Detect node types not installed in this workspace and resolve\n // each to its storeProductId so the modal can offer one-click installation.\n let requiredNodeTypes: WorkflowTemplateContent[\"requiredNodeTypes\"] =\n [];\n try {\n requiredNodeTypes = await buildRequiredNodeTypes(\n sharedWorkflow.nodes,\n );\n } catch {\n // Node check failed — skip dependency check and open anyway\n }\n\n if (mounted) {\n // Safe to clear now — this is the winning effect run.\n localStorage.removeItem(\"pendingSharedWorkflow\");\n\n if (requiredNodeTypes.length > 0) {\n // Use the ref so this effect doesn't re-run every time\n // installedAppIds changes (which would cause infinite mutations).\n const check = doNodeCheckRef.current(requiredNodeTypes);\n const needsConfig =\n check.missing.length > 0 || check.missingPaid.length > 0;\n\n if (needsConfig) {\n // Surface the install modal before creating the workflow\n // so the user can install missing nodes first.\n setPendingWorkflow(sharedWorkflow);\n setNodeCheck(check);\n setConfigModalOpen(true);\n setIsLoading(false);\n fromSharedLoadedRef.current = true;\n return;\n }\n }\n\n setWorkflow(sharedWorkflow);\n setIsLoading(false);\n fromSharedLoadedRef.current = true;\n }\n return;\n } catch (e) {\n console.error(\"[WorkflowItem] parse error:\", e);\n // Corrupted localStorage entry — only clear if we're the winning run.\n if (mounted) localStorage.removeItem(\"pendingSharedWorkflow\");\n }\n }\n\n // If a previous effect run already loaded the shared workflow, don't overwrite it\n if (fromSharedId && fromSharedLoadedRef.current) {\n if (mounted) setIsLoading(false);\n return;\n }\n\n if (mounted) {\n setWorkflow(newWorkflow);\n setIsLoading(false);\n }\n return;\n }\n\n // Use GraphQL to fetch workflow by workflowKey + version\n const result = await getWorkflow(id, undefined, version);\n const definitionJson = result?.definitionJson as {\n data?: WorkflowDefinitionData;\n nodes?: unknown[];\n edges?: unknown[];\n } | null;\n\n // Support both { data: { nodes, edges } } and flat { nodes, edges } structures\n const defData =\n definitionJson?.data ??\n (definitionJson?.nodes\n ? (definitionJson as unknown as WorkflowDefinitionData)\n : undefined);\n\n if (defData) {\n // Build the workflow state — store in ref regardless of mounted status so\n // a subsequent effect run can use it if its own getWorkflow call fails.\n const workflowState: IFlowState[\"workflow\"] = {\n ...defData,\n // Sticky notes are stored under a separate definition key — merge\n // them back onto the canvas alongside the executable nodes.\n nodes: mergeStickyNotes(defData) as IFlowState[\"workflow\"][\"nodes\"],\n id: result?.workflowKey ?? \"\",\n workflowKey: result?.workflowKey ?? \"\",\n version: result?.version ?? \"\",\n name: result?.name ?? \"\",\n alias: result?.alias ?? \"\",\n dbId: result?.id ?? \"\",\n status: result?.status ?? \"DRAFT\",\n };\n fetchedWorkflowRef.current = workflowState;\n\n // AI-assistant (and shared) workflows may reference nodes that are not\n // installed in this workspace. Offer one-click install before opening.\n let requiredNodeTypes: WorkflowTemplateContent[\"requiredNodeTypes\"] =\n [];\n try {\n requiredNodeTypes = await buildRequiredNodeTypes(\n workflowState.nodes,\n );\n } catch {\n // Node check failed — skip dependency check and open anyway\n }\n\n if (mounted && requiredNodeTypes.length > 0) {\n const check = doNodeCheckRef.current(requiredNodeTypes);\n if (check.missing.length > 0 || check.missingPaid.length > 0) {\n setPendingWorkflow(workflowState);\n setNodeCheck(check);\n setConfigModalOpen(true);\n setIsLoading(false);\n return;\n }\n }\n\n if (mounted) {\n setWorkflow(workflowState);\n }\n return;\n }\n\n if (mounted) {\n // If a previous effect run already fetched the workflow (but was cancelled),\n // use its result rather than trying to create a new workflow.\n if (fetchedWorkflowRef.current) {\n setWorkflow(fetchedWorkflowRef.current);\n return;\n }\n\n if (loadRunId) {\n setLoadError(\n \"The workflow version for this TEST run is no longer available.\",\n );\n return;\n }\n\n // Version-not-found guard: a mistyped/removed version in the URL must\n // NOT silently create a real row — redirect to the newest version.\n const anyVersion = await getWorkflow(id, undefined, undefined);\n const missing = decideMissingWorkflow({\n createIntent: createIntentRef.current,\n otherVersionExists: !!anyVersion?.workflowKey,\n });\n if (missing === \"open-newest\" && anyVersion) {\n toast.info(`Version ${version} not found`, {\n description: `Opening ${anyVersion.version} instead.`,\n dismissible: true,\n });\n navigate(`../workflow/${id}/${anyVersion.version}`, {\n replace: true,\n });\n return;\n }\n\n // Opening a key that has no definition is READ-ONLY: show a\n // not-found state. Only an explicit \"Create Workflow\" navigation\n // (router state) may create one (BOFF-8060 F2).\n if (missing === \"not-found\") {\n if (mounted) setNotFound(true);\n return;\n }\n\n // Explicit create intent: the person asked for a new workflow.\n if (!creatingRef.current) {\n creatingRef.current = true;\n const initialDefinitionJson = {\n key: id,\n name: newWorkflow.name,\n description: newWorkflow.name,\n workflow_type: \"query-conditional\",\n data: {\n ...newWorkflow,\n },\n meta: {\n creator: \"api_create\",\n version: version,\n },\n tags: [],\n };\n\n try {\n const created = await createWorkflow({\n workflowKey: id!,\n version: version!,\n name: newWorkflow.name,\n description: newWorkflow.name,\n definitionJson: initialDefinitionJson,\n });\n\n if (created && mounted) {\n setWorkflow({\n ...newWorkflow,\n id: created.workflowKey,\n workflowKey: created.workflowKey,\n version: created.version,\n dbId: created.id,\n status: created.status ?? \"DRAFT\",\n });\n } else if (mounted) {\n setWorkflow(newWorkflow);\n }\n } catch (createError) {\n console.error(\n \"[WorkflowItem] Error creating workflow:\",\n createError,\n );\n if (mounted) {\n setWorkflow(fetchedWorkflowRef.current ?? newWorkflow);\n }\n }\n }\n }\n } catch (error) {\n console.error(\"[WorkflowItem] Error loading workflow:\", error);\n if (mounted) {\n if (loadRunId) {\n setLoadError(\n \"The workflow version for this TEST run could not be loaded.\",\n );\n } else {\n setWorkflow(fetchedWorkflowRef.current ?? newWorkflow);\n }\n }\n } finally {\n if (mounted) {\n setIsLoading(false);\n creatingRef.current = false;\n }\n }\n };\n\n loadWorkflow();\n return () => {\n mounted = false;\n };\n }, [\n id,\n version,\n createWorkflow,\n getWorkflow,\n newWorkflow,\n resetWorkflow,\n navigate,\n loadRunId,\n retryNonce,\n // doNodeCheckRef is intentionally omitted — it's a ref (stable by definition)\n // and including doNodeCheck here caused infinite re-runs because installedAppIds\n // produces a new Set reference on every render.\n ]);\n\n if (loadError)\n return (\n <div className=\"flex h-full min-h-[60vh] w-full items-center justify-center p-6\">\n <div className=\"max-w-md rounded-lg border border-[var(--color-status-error-border)] bg-[var(--color-status-error-bg-subtle)] p-6 text-center\">\n <Icon\n icon=\"mdi:alert-circle-outline\"\n className=\"mx-auto mb-3 size-8 text-[var(--color-status-error-text)]\"\n />\n <h2 className=\"text-lg font-semibold text-[var(--color-status-error-text)]\">\n Unable to load run\n </h2>\n <p className=\"mt-2 text-sm text-[var(--color-status-error-text)]\">\n {loadError}\n </p>\n <button\n type=\"button\"\n className=\"mt-4 rounded-md border border-border px-3 py-2 text-sm text-foreground hover:bg-muted\"\n onClick={() => navigate(\"../runs\")}\n >\n Back to executions\n </button>\n </div>\n </div>\n );\n\n if (isLoading)\n return (\n // Same loading treatment as the Available Nodes panel, centered on the\n // full canvas area while the workflow definition is fetched.\n <div className=\"flex h-full min-h-[60vh] w-full items-center justify-center\">\n <div className=\"flex flex-col items-center gap-2\">\n <Icon\n icon=\"mynaui:spinner\"\n className=\"size-6 animate-spin text-primary\"\n />\n <span className=\"text-sm text-foreground/60\">\n Loading workflow...\n </span>\n </div>\n </div>\n );\n\n if (notFound)\n return (\n <div\n role=\"alert\"\n className=\"flex h-full min-h-[60vh] w-full flex-col items-center justify-center gap-3 p-6 text-center\"\n >\n <p className=\"text-base font-medium text-foreground\">\n {tr(\n \"fluidgrids.builder.workflowNotFound.title\",\n \"Workflow not found\",\n )}\n </p>\n <p className=\"max-w-md text-sm text-foreground/60\">\n {tr(\n \"fluidgrids.builder.workflowNotFound.description\",\n \"No workflow with this key exists in this workspace, or it could not be loaded. Nothing was created.\",\n )}\n </p>\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n className=\"rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground\"\n onClick={() => setRetryNonce((n) => n + 1)}\n >\n {tr(\"fluidgrids.builder.workflowNotFound.retry\", \"Try again\")}\n </button>\n <button\n type=\"button\"\n className=\"rounded-md border px-4 py-2 text-sm font-medium text-foreground\"\n onClick={() => navigate(\"../list\")}\n >\n {tr(\n \"fluidgrids.builder.workflowNotFound.back\",\n \"Back to Workflows\",\n )}\n </button>\n </div>\n </div>\n );\n\n return (\n <>\n {/* Missing-nodes modal shown before a workflow with uninstalled nodes is\n opened in the builder. Covers shared workflows and AI-assistant-created\n workflows that reference nodes not yet installed in the workspace. */}\n {configModalOpen && pendingWorkflow && (\n <Suspense fallback={null}>\n <LazyMissingNodesInstallModal\n open={configModalOpen}\n onOpenChange={(open) => {\n if (!open) {\n // Dismissed without confirming — open anyway (user can install later)\n handleSkipInstall();\n }\n }}\n workflowName={pendingWorkflow.name}\n nodeCheckResult={nodeCheck}\n onConfirm={handleInstallConfirm}\n onSkip={handleSkipInstall}\n installing={installing}\n installProgress={installProgress}\n installErrors={installErrors}\n />\n </Suspense>\n )}\n\n {workflow && !isLoading && <FlowBuilderPage workflow={workflow} />}\n </>\n );\n}\n","import WorkflowItem from \"../builder/app/workflow/work/page\";\nimport { ErrorBoundary } from \"@burdenoff/fe-libs/shared/components\";\nimport { useNavigate } from \"react-router\";\nimport \"@xyflow/react/dist/style.css\";\n\n/**\n * WorkflowBuilder page with ErrorBoundary for graceful crash recovery.\n * If the builder throws (React Flow error, node rendering crash, etc.),\n * the user sees a recovery UI instead of a blank screen.\n */\nexport function WorkflowBuilder() {\n const navigate = useNavigate();\n\n return (\n <ErrorBoundary\n fallback={(error) => (\n <div className=\"flex flex-col items-center justify-center min-h-[60vh] gap-4 p-8\">\n <div className=\"rounded-lg border border-[var(--color-status-error-border)] bg-[var(--color-status-error-bg-subtle)] p-6 max-w-lg w-full text-center\">\n <h2 className=\"text-lg font-semibold text-[var(--color-status-error-text)] mb-2\">\n Workflow Builder Error\n </h2>\n <p className=\"text-sm text-[var(--color-text-secondary)] mb-4\">\n Something went wrong while loading the workflow builder. This may\n be caused by invalid workflow data or a rendering issue.\n </p>\n {error && (\n <details className=\"text-left mb-4\">\n <summary className=\"text-xs text-[var(--color-text-tertiary)] cursor-pointer hover:text-[var(--color-text-secondary)]\">\n Error details\n </summary>\n <pre className=\"mt-2 p-2 bg-[var(--color-bg-canvas)] rounded text-xs overflow-auto max-h-32 text-[var(--color-text-tertiary)]\">\n {error.message}\n </pre>\n </details>\n )}\n <div className=\"flex gap-3 justify-center\">\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"px-4 py-2 text-sm font-medium rounded-md bg-[var(--color-bg-accent)] text-[var(--color-text-on-accent)] hover:opacity-90 transition-opacity\"\n >\n Reload Page\n </button>\n <button\n type=\"button\"\n onClick={() => navigate(\"../list\")}\n className=\"px-4 py-2 text-sm font-medium rounded-md border border-default text-[var(--color-text-secondary)] hover:bg-[var(--color-bg-elevated)] transition-colors\"\n >\n Back to Workflows\n </button>\n </div>\n </div>\n </div>\n )}\n >\n <WorkflowItem />\n </ErrorBoundary>\n );\n}\n"]}
@@ -0,0 +1,14 @@
1
+ // src/utils/workflow-open.ts
2
+ var NEW_WORKFLOW_STATE = { createWorkflow: true };
3
+ var NEW_WORKFLOW_NAV = { state: NEW_WORKFLOW_STATE };
4
+ function isCreateIntent(state) {
5
+ return typeof state === "object" && state !== null && state.createWorkflow === true;
6
+ }
7
+ function decideMissingWorkflow(input) {
8
+ if (input.otherVersionExists) return "open-newest";
9
+ return input.createIntent ? "create" : "not-found";
10
+ }
11
+
12
+ export { NEW_WORKFLOW_NAV, decideMissingWorkflow, isCreateIntent };
13
+ //# sourceMappingURL=chunk-KGD6CRSA.js.map
14
+ //# sourceMappingURL=chunk-KGD6CRSA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/workflow-open.ts"],"names":[],"mappings":";AAgBO,IAAM,kBAAA,GAAqB,EAAE,cAAA,EAAgB,IAAA,EAAK;AAGlD,IAAM,gBAAA,GAAmB,EAAE,KAAA,EAAO,kBAAA;AAGlC,SAAS,eAAe,KAAA,EAAyB;AACtD,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,KAAU,IAAA,IACT,MAAuC,cAAA,KAAmB,IAAA;AAE/D;AAcO,SAAS,sBAAsB,KAAA,EAIZ;AACxB,EAAA,IAAI,KAAA,CAAM,oBAAoB,OAAO,aAAA;AACrC,EAAA,OAAO,KAAA,CAAM,eAAe,QAAA,GAAW,WAAA;AACzC","file":"chunk-KGD6CRSA.js","sourcesContent":["/**\n * Opening a workflow by key is READ-ONLY (BOFF-8060 F2).\n *\n * Before this, the builder page created a workflow definition whenever the key\n * in the URL had no versions, so ANY link to an unknown key (a stale bookmark,\n * a mistyped URL, a link an assistant composed) wrote a real row.\n *\n * The one legitimate create-on-open is the person pressing \"Create Workflow\",\n * and THAT navigation says so with router state (`NEW_WORKFLOW_STATE`). A bare\n * URL never carries it, so a bare URL can only ever read.\n *\n * Pure on purpose: this repo's tests run under `bun test` with no DOM, and the\n * decision is the part that must not regress.\n */\n\n/** Router state carried by the explicit \"create a new workflow\" navigation. */\nexport const NEW_WORKFLOW_STATE = { createWorkflow: true } as const;\n\n/** `NavigateOptions` for the explicit \"create a new workflow\" navigation. */\nexport const NEW_WORKFLOW_NAV = { state: NEW_WORKFLOW_STATE } as const;\n\n/** True only for router state set by an explicit \"create a new workflow\" navigation. */\nexport function isCreateIntent(state: unknown): boolean {\n return (\n typeof state === \"object\" &&\n state !== null &&\n (state as { createWorkflow?: unknown }).createWorkflow === true\n );\n}\n\nexport type MissingWorkflowAction =\n /** Other versions of the key exist: open the newest. Nothing is written. */\n | \"open-newest\"\n /** Show a not-found state. Nothing is written. */\n | \"not-found\"\n /** The person asked for a new workflow: mint it. */\n | \"create\";\n\n/**\n * What the builder does when `getWorkflow(key, version)` found nothing.\n * `create` is reachable ONLY with an explicit create intent.\n */\nexport function decideMissingWorkflow(input: {\n createIntent: boolean;\n /** A lookup by key alone (any version) found a definition. */\n otherVersionExists: boolean;\n}): MissingWorkflowAction {\n if (input.otherVersionExists) return \"open-newest\";\n return input.createIntent ? \"create\" : \"not-found\";\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import { NEW_WORKFLOW_NAV } from './chunk-KGD6CRSA.js';
1
2
  import { QuotaExhaustedDialog } from './chunk-AANIWER2.js';
2
3
  import { SdkPermissionButton, FLUIDGRIDS_PERMISSIONS, SdkPermissionGate } from './chunk-W23ZXNKU.js';
3
4
  import { useWorkflowDefinitions, useLazyWorkflowDefinition, useImportWorkflow, useDuplicateWorkflow, useDeleteWorkflow } from './chunk-GKSXZFDY.js';
@@ -1028,7 +1029,7 @@ function WorkflowsList() {
1028
1029
  variant: "default",
1029
1030
  size: "default",
1030
1031
  className: "font-bold text-primary-foreground",
1031
- onClick: () => navigate(`../workflow/${v4()}/v1`),
1032
+ onClick: () => navigate(`../workflow/${v4()}/v1`, NEW_WORKFLOW_NAV),
1032
1033
  "data-tour": "fluidgrids-list-create",
1033
1034
  children: [
1034
1035
  /* @__PURE__ */ jsx(Icon, { icon: "mynaui:plus", className: "size-5 text-primary-foreground" }),
@@ -1250,5 +1251,5 @@ function WorkflowsList() {
1250
1251
  }
1251
1252
 
1252
1253
  export { WorkflowsList };
1253
- //# sourceMappingURL=chunk-JYBARIVZ.js.map
1254
- //# sourceMappingURL=chunk-JYBARIVZ.js.map
1254
+ //# sourceMappingURL=chunk-ZZRRG37Q.js.map
1255
+ //# sourceMappingURL=chunk-ZZRRG37Q.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/share-target.ts","../src/components/SharePopup.tsx","../src/builder/components/ui/card-workflow.tsx","../src/utils/workflow-transfer.ts","../src/components/WorkflowImportDialog.tsx","../src/pages/WorkflowsList.tsx"],"names":["useState","toast","jsxs","jsx","Button","Icon","useNavigate","error","uuidv4","Input","cn"],"mappings":"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","file":"chunk-ZZRRG37Q.js","sourcesContent":["/**\n * Share-target validation for the Share / Embed popup.\n *\n * A share surface must only ever hand users a link that can work: an absolute\n * http(s) URL with a real host and no `undefined` / `null` path segment. The\n * original Share button concatenated an unset config value onto a route that\n * never existed and shipped `undefined/workflow-view/<key>/<version>` to every\n * user (BOFF-7753, BOFF-7790). Everything that feeds SharePopup goes through\n * here so that class of link cannot be rendered again.\n */\n\nexport interface ShareTarget {\n /** Absolute public URL for the Share Link tab. */\n shareUrl: string;\n /** Absolute public URL for the Embed tab; absent hides that tab. */\n embedUrl?: string;\n}\n\nconst PLACEHOLDER_SEGMENTS = new Set([\"undefined\", \"null\"]);\n\n/**\n * Returns the normalised URL when `raw` is a usable public link, else null.\n * Relative paths are rejected on purpose: a share link is pasted somewhere\n * else, so it has to carry its own origin.\n */\nexport function toPublicUrl(raw: string | null | undefined): string | null {\n if (typeof raw !== \"string\" || raw.trim() === \"\") return null;\n\n let parsed: URL;\n try {\n parsed = new URL(raw);\n } catch {\n return null;\n }\n\n if (parsed.protocol !== \"https:\" && parsed.protocol !== \"http:\") return null;\n if (!parsed.hostname || PLACEHOLDER_SEGMENTS.has(parsed.hostname)) {\n return null;\n }\n\n const hasPlaceholderSegment = parsed.pathname\n .split(\"/\")\n .some((segment) => PLACEHOLDER_SEGMENTS.has(segment.toLowerCase()));\n if (hasPlaceholderSegment) return null;\n\n return parsed.href;\n}\n\n/**\n * Resolves the popup's target. Without a valid share URL there is nothing to\n * share, so the result is null and the popup renders as unavailable. An\n * invalid embed URL only drops the Embed tab.\n */\nexport function resolveShareTarget(input: {\n shareUrl?: string | null;\n embedUrl?: string | null;\n}): ShareTarget | null {\n const shareUrl = toPublicUrl(input.shareUrl);\n if (!shareUrl) return null;\n\n const embedUrl = toPublicUrl(input.embedUrl);\n return embedUrl ? { shareUrl, embedUrl } : { shareUrl };\n}\n\nconst MIN_EMBED_SIZE = 100;\nconst MAX_EMBED_SIZE = 4000;\n\nfunction clampEmbedSize(value: number, fallback: number): number {\n if (!Number.isFinite(value)) return fallback;\n return Math.min(MAX_EMBED_SIZE, Math.max(MIN_EMBED_SIZE, Math.round(value)));\n}\n\n/**\n * Builds the iframe snippet. `embedUrl` must already be validated by\n * {@link toPublicUrl}; `URL.href` percent-encodes quotes, so the value cannot\n * break out of the `src` attribute.\n */\nexport function buildEmbedSnippet(\n embedUrl: string,\n width: number,\n height: number,\n): string {\n const w = clampEmbedSize(width, 600);\n const h = clampEmbedSize(height, 400);\n return `<iframe src=\"${embedUrl}\" width=\"${w}\" height=\"${h}\" frameborder=\"0\"></iframe>`;\n}\n","import { useState } from \"react\";\nimport { Copy, Share2 } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport { Button } from \"@burdenoff/fe-libs/ui\";\nimport { useTr } from \"../hooks/useTr\";\nimport { buildEmbedSnippet, resolveShareTarget } from \"./share-target\";\n\ninterface SharePopupProps {\n /**\n * Absolute public URL of the shared resource. When missing or not a usable\n * public link, the Share button renders disabled instead of offering a link\n * that goes nowhere.\n */\n shareUrl?: string | null;\n /** Absolute public URL for the iframe snippet; omit to hide the Embed tab. */\n embedUrl?: string | null;\n}\n\nexport default function SharePopup({ shareUrl, embedUrl }: 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 target = resolveShareTarget({ shareUrl, embedUrl });\n\n if (!target) {\n return (\n <Button variant=\"ghost\" size=\"icon\" disabled aria-disabled=\"true\">\n <Share2 className=\"h-4 w-4\" />\n <span className=\"sr-only\">\n {tr(\n \"fluidgrids.components.sharePopup.unavailableLabel\",\n \"Sharing is not available yet\",\n )}\n </span>\n </Button>\n );\n }\n\n const embedCode = target.embedUrl\n ? buildEmbedSnippet(target.embedUrl, width, height)\n : \"\";\n\n const copyToClipboard = (text: string, message: string) => {\n navigator.clipboard.writeText(text).then(\n () => toast.success(message),\n () =>\n toast.error(\n tr(\n \"fluidgrids.components.sharePopup.copyFailedToast\",\n \"Could not copy to clipboard\",\n ),\n ),\n );\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 &times;\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 {target.embedUrl && (\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 )}\n </div>\n\n {activeTab === \"link\" && (\n <div className=\"flex items-center space-x-2\">\n <input\n readOnly\n value={target.shareUrl}\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 target.shareUrl,\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\" && target.embedUrl && (\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 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 onExport,\n}: {\n workflow: WorkflowData;\n onUpdateSuccess: () => void;\n onExport?: () => 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 const handleOnSettings = () => {\n navigate(\"../settings/\" + workflow.workflow_key);\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 // `[data-card-action]` covers wrappers around controls that can be\n // disabled: a disabled button has pointer-events: none, so the click\n // lands on its wrapper instead and would otherwise open the editor.\n if (\n el.closest(\n \"button, a, input, [role='dialog'], .fixed, [data-card-action]\",\n )\n )\n 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 <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8\"\n onClick={handleOnSettings}\n aria-label={tr(\n \"fluidgrids.builder.cardWorkflow.workflowSettings\",\n \"Workflow settings\",\n )}\n >\n <Icon icon=\"mdi:cog-outline\" className=\"size-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n <p>\n {tr(\n \"fluidgrids.builder.cardWorkflow.workflowSettings\",\n \"Workflow settings\",\n )}\n </p>\n </TooltipContent>\n </Tooltip>\n {/* A workspace workflow has no public, shareable record yet: the\n public viewers (/shared/:id, /embed/workflow) read devportal\n applications and store products, neither of which links back\n to a workflow. Share stays visible but disabled until that link\n exists (BOFF-7753) rather than minting a URL that goes nowhere. */}\n <Tooltip>\n <TooltipTrigger asChild>\n <span tabIndex={0} data-card-action=\"\">\n <SharePopup />\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n <p>\n {tr(\n \"fluidgrids.builder.cardWorkflow.shareUnavailable\",\n \"Sharing is not available for workflows yet\",\n )}\n </p>\n </TooltipContent>\n </Tooltip>\n {onExport && (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-8\"\n onClick={onExport}\n aria-label={tr(\n \"fluidgrids.builder.cardWorkflow.exportWorkflow\",\n \"Export workflow JSON\",\n )}\n >\n <Icon icon=\"mynaui:download\" className=\"size-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">\n <p>\n {tr(\n \"fluidgrids.builder.cardWorkflow.exportWorkflow\",\n \"Export workflow JSON\",\n )}\n </p>\n </TooltipContent>\n </Tooltip>\n )}\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 &quot;{workflow.name}&quot;{\" \"}\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 type { WorkflowDefinition } from \"../generated/graphql-types\";\n\nexport interface WorkflowExportPayload {\n format: \"fluidgrids.workflow\";\n schemaVersion: 1;\n exportedAt: string;\n workflowKey: string;\n version: string;\n name: string;\n description: string | null;\n definitionJson: Record<string, unknown>;\n context: Record<string, unknown> | null;\n tags: string[];\n tagsV2: unknown;\n icon: string | null;\n category: string | null;\n nodeReferences: Array<{\n nodeId: string;\n nodeType: string;\n nodeVersion: string | null;\n }>;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nexport function collectWorkflowNodeReferences(\n definition: unknown,\n): WorkflowExportPayload[\"nodeReferences\"] {\n const root = asRecord(definition);\n const data = asRecord(root?.data);\n const nodes = data?.nodes;\n if (!Array.isArray(nodes)) return [];\n\n const seen = new Set<string>();\n const references: WorkflowExportPayload[\"nodeReferences\"] = [];\n for (const candidate of nodes) {\n const node = asRecord(candidate);\n const nodeData = asRecord(node?.data);\n const nodeId = typeof node?.id === \"string\" ? node.id : null;\n const nodeType =\n typeof nodeData?.nodeId === \"string\" ? nodeData.nodeId : node?.type;\n if (!nodeId || typeof nodeType !== \"string\") continue;\n const nodeVersion =\n typeof nodeData?.nodeVersion === \"string\" ? nodeData.nodeVersion : null;\n const key = `${nodeId}:${nodeType}:${nodeVersion ?? \"\"}`;\n if (seen.has(key)) continue;\n seen.add(key);\n references.push({ nodeId, nodeType, nodeVersion });\n }\n return references;\n}\n\nexport function createWorkflowExportPayload(\n workflow: WorkflowDefinition,\n): WorkflowExportPayload {\n const definitionJson = asRecord(workflow.definitionJson);\n if (!definitionJson)\n throw new Error(\"Workflow definition JSON must be an object\");\n return {\n format: \"fluidgrids.workflow\",\n schemaVersion: 1,\n exportedAt: new Date().toISOString(),\n workflowKey: workflow.workflowKey,\n version: workflow.version,\n name: workflow.name,\n description: workflow.description ?? null,\n definitionJson,\n context: asRecord(workflow.context),\n tags: workflow.tags,\n tagsV2: workflow.tagsV2,\n icon: workflow.icon ?? null,\n category: workflow.category ?? null,\n nodeReferences: collectWorkflowNodeReferences(definitionJson),\n };\n}\n\nexport function downloadWorkflowExport(workflow: WorkflowDefinition): void {\n const payload = createWorkflowExportPayload(workflow);\n const blob = new Blob([JSON.stringify(payload, null, 2)], {\n type: \"application/json\",\n });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = `${workflow.workflowKey}-${workflow.version}.fluidgrids.json`;\n anchor.click();\n URL.revokeObjectURL(url);\n}\n\nexport interface ParsedWorkflowImport {\n definitionJson: Record<string, unknown>;\n name: string;\n workflowKey?: string;\n version?: string;\n description?: string;\n context?: Record<string, unknown>;\n tags?: string[];\n tagsV2?: unknown;\n icon?: string;\n category?: string;\n nodeReferences: WorkflowExportPayload[\"nodeReferences\"];\n}\n\nexport function parseWorkflowImport(raw: string): ParsedWorkflowImport {\n const parsed: unknown = JSON.parse(raw);\n const root = asRecord(parsed);\n if (!root) throw new Error(\"Import must contain a JSON object\");\n const definitionJson = asRecord(root.definitionJson) ?? root;\n const name =\n typeof root.name === \"string\" && root.name.trim()\n ? root.name\n : \"Imported workflow\";\n return {\n definitionJson,\n name,\n workflowKey:\n typeof root.workflowKey === \"string\" ? root.workflowKey : undefined,\n version: typeof root.version === \"string\" ? root.version : undefined,\n description:\n typeof root.description === \"string\" ? root.description : undefined,\n context: asRecord(root.context) ?? undefined,\n tags:\n Array.isArray(root.tags) &&\n root.tags.every((tag) => typeof tag === \"string\")\n ? (root.tags as string[])\n : undefined,\n tagsV2: root.tagsV2,\n icon: typeof root.icon === \"string\" ? root.icon : undefined,\n category: typeof root.category === \"string\" ? root.category : undefined,\n nodeReferences: Array.isArray(root.nodeReferences)\n ? (root.nodeReferences as WorkflowExportPayload[\"nodeReferences\"])\n : collectWorkflowNodeReferences(definitionJson),\n };\n}\n","import { useState } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport { toast } from \"sonner\";\n\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n Label,\n Textarea,\n} from \"@burdenoff/fe-libs/ui\";\nimport type { ImportWorkflowInput } from \"../generated/graphql-types\";\nimport { useImportWorkflow } from \"../hooks/useWorkflows\";\nimport { useTr } from \"../hooks/useTr\";\nimport {\n parseWorkflowImport,\n type ParsedWorkflowImport,\n} from \"../utils/workflow-transfer\";\n\nexport function WorkflowImportDialog({\n onImported,\n}: {\n onImported: () => void;\n}) {\n const tr = useTr();\n const { importWorkflow, loading } = useImportWorkflow();\n const [open, setOpen] = useState(false);\n const [rawJson, setRawJson] = useState(\"\");\n const [url, setUrl] = useState(\"\");\n const [parsed, setParsed] = useState<ParsedWorkflowImport | null>(null);\n const [name, setName] = useState(\"\");\n const [workflowKey, setWorkflowKey] = useState(\"\");\n const [version, setVersion] = useState(\"\");\n const [loadingUrl, setLoadingUrl] = useState(false);\n\n const reset = () => {\n setRawJson(\"\");\n setUrl(\"\");\n setParsed(null);\n setName(\"\");\n setWorkflowKey(\"\");\n setVersion(\"\");\n };\n\n const parse = (value: string) => {\n try {\n const next = parseWorkflowImport(value);\n setParsed(next);\n setName(next.name);\n setWorkflowKey(\"\");\n setVersion(next.version ?? \"\");\n } catch (error) {\n setParsed(null);\n toast.error(\n error instanceof Error\n ? error.message\n : tr(\n \"fluidgrids.workflowsList.importInvalidJson\",\n \"Invalid workflow JSON\",\n ),\n );\n }\n };\n\n const handleFile = async (file: File | undefined) => {\n if (!file) return;\n try {\n parse(await file.text());\n } catch (error) {\n toast.error(\n error instanceof Error ? error.message : \"Unable to read import file\",\n );\n }\n };\n\n const handleUrl = async () => {\n if (!url.trim()) return;\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(url.trim());\n if (parsedUrl.protocol !== \"https:\")\n throw new Error(\"Import URLs must use HTTPS\");\n } catch (error) {\n toast.error(\n error instanceof Error ? error.message : \"Invalid import URL\",\n );\n return;\n }\n setLoadingUrl(true);\n try {\n const response = await fetch(parsedUrl, { credentials: \"omit\" });\n if (!response.ok)\n throw new Error(`Import URL returned HTTP ${response.status}`);\n parse(await response.text());\n } catch (error) {\n toast.error(\n error instanceof Error ? error.message : \"Unable to fetch import URL\",\n );\n } finally {\n setLoadingUrl(false);\n }\n };\n\n const handleImport = async () => {\n if (!parsed || !name.trim()) return;\n const input: ImportWorkflowInput = {\n workflowKey:\n workflowKey.trim() ||\n `${name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")}-${Date.now()}`,\n version: version.trim() || \"v1\",\n name: name.trim(),\n description: parsed.description,\n definitionJson: parsed.definitionJson,\n context: parsed.context,\n tags: parsed.tags,\n tagsV2: parsed.tagsV2 as Record<string, unknown> | undefined,\n icon: parsed.icon,\n category: parsed.category,\n allowMissingNodes: false,\n };\n const imported = await importWorkflow(input);\n if (!imported) return;\n if (!imported.success || !imported.workflow) {\n const validationMessage = [\n ...imported.validation.errors,\n ...imported.validation.warnings,\n ].join(\" \");\n toast.error(\n validationMessage ||\n imported.message ||\n tr(\n \"fluidgrids.workflowsList.importValidationFailed\",\n \"Workflow import validation failed\",\n ),\n );\n return;\n }\n toast.success(\n tr(\"fluidgrids.workflowsList.importSuccess\", \"Workflow imported\"),\n );\n setOpen(false);\n reset();\n onImported();\n };\n\n return (\n <Dialog\n open={open}\n onOpenChange={(nextOpen) => {\n setOpen(nextOpen);\n if (!nextOpen) reset();\n }}\n >\n <Button variant=\"outline\" size=\"default\" onClick={() => setOpen(true)}>\n <Icon icon=\"mynaui:download\" className=\"size-4\" />\n {tr(\"fluidgrids.workflowsList.importButton\", \"Import\")}\n </Button>\n <DialogContent className=\"max-h-[90vh] overflow-y-auto sm:max-w-2xl\">\n <DialogHeader>\n <DialogTitle>\n {tr(\"fluidgrids.workflowsList.importTitle\", \"Import workflow JSON\")}\n </DialogTitle>\n <DialogDescription>\n {tr(\n \"fluidgrids.workflowsList.importDescription\",\n \"Import from a file, an HTTPS URL, or pasted JSON. Credentials remain references and must be configured in this workspace.\",\n )}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap gap-2\">\n <Label\n htmlFor=\"fluidgrids-workflow-import-file\"\n className=\"inline-flex cursor-pointer items-center gap-2 rounded-md border border-border px-3 py-2 text-sm hover:bg-accent\"\n >\n <Icon icon=\"mynaui:upload\" className=\"size-4\" />\n {tr(\n \"fluidgrids.workflowsList.importChooseFile\",\n \"Choose JSON file\",\n )}\n </Label>\n <input\n id=\"fluidgrids-workflow-import-file\"\n type=\"file\"\n accept=\"application/json,.json\"\n className=\"sr-only\"\n onChange={(event) =>\n void handleFile(event.currentTarget.files?.[0])\n }\n />\n </div>\n\n <div className=\"flex gap-2\">\n <Input\n value={url}\n onChange={(event) => setUrl(event.target.value)}\n placeholder=\"https://example.com/workflow.json\"\n aria-label={tr(\n \"fluidgrids.workflowsList.importUrlLabel\",\n \"Workflow JSON URL\",\n )}\n />\n <Button\n variant=\"outline\"\n onClick={() => void handleUrl()}\n disabled={loadingUrl || !url.trim()}\n >\n {loadingUrl\n ? \"Loading…\"\n : tr(\"fluidgrids.workflowsList.importFetchUrl\", \"Fetch\")}\n </Button>\n </div>\n\n <Textarea\n value={rawJson}\n onChange={(event) => {\n setRawJson(event.target.value);\n setParsed(null);\n }}\n onBlur={() => rawJson.trim() && parse(rawJson)}\n placeholder={tr(\n \"fluidgrids.workflowsList.importPastePlaceholder\",\n \"Paste workflow JSON here\",\n )}\n className=\"min-h-44 font-mono text-xs\"\n aria-label={tr(\n \"fluidgrids.workflowsList.importPasteLabel\",\n \"Workflow JSON\",\n )}\n />\n\n {parsed && (\n <div className=\"space-y-3 rounded-lg border border-border bg-muted/30 p-3\">\n <p className=\"text-xs text-muted-foreground\">\n {parsed.nodeReferences.length}{\" \"}\n {tr(\n \"fluidgrids.workflowsList.importNodeReferences\",\n \"node references found\",\n )}\n </p>\n <div className=\"grid gap-3 sm:grid-cols-3\">\n <div className=\"space-y-1 sm:col-span-3\">\n <Label htmlFor=\"fluidgrids-import-name\">\n {tr(\"fluidgrids.workflowsList.importName\", \"Name\")}\n </Label>\n <Input\n id=\"fluidgrids-import-name\"\n value={name}\n onChange={(event) => setName(event.target.value)}\n />\n </div>\n <div className=\"space-y-1 sm:col-span-2\">\n <Label htmlFor=\"fluidgrids-import-key\">\n {tr(\n \"fluidgrids.workflowsList.importKey\",\n \"Workflow key (optional)\",\n )}\n </Label>\n <Input\n id=\"fluidgrids-import-key\"\n value={workflowKey}\n onChange={(event) => setWorkflowKey(event.target.value)}\n />\n </div>\n <div className=\"space-y-1\">\n <Label htmlFor=\"fluidgrids-import-version\">\n {tr(\"fluidgrids.workflowsList.importVersion\", \"Version\")}\n </Label>\n <Input\n id=\"fluidgrids-import-version\"\n value={version}\n onChange={(event) => setVersion(event.target.value)}\n placeholder=\"v1\"\n />\n </div>\n </div>\n </div>\n )}\n </div>\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setOpen(false)}>\n {tr(\"fluidgrids.workflowsList.importCancel\", \"Cancel\")}\n </Button>\n <Button\n onClick={() => void handleImport()}\n disabled={loading || !parsed || !name.trim()}\n >\n {loading\n ? tr(\"fluidgrids.workflowsList.importing\", \"Importing…\")\n : tr(\"fluidgrids.workflowsList.importConfirm\", \"Import workflow\")}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useMemo, useState } from \"react\";\nimport { useNavigate } from \"react-router\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { NEW_WORKFLOW_NAV } from \"../utils/workflow-open\";\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 {\n useWorkflowDefinitions,\n useLazyWorkflowDefinition,\n} from \"../hooks/useWorkflows\";\nimport { WorkflowImportDialog } from \"../components/WorkflowImportDialog\";\nimport { downloadWorkflowExport } from \"../utils/workflow-transfer\";\nimport { useTr } from \"../hooks/useTr\";\nimport { SdkPermissionButton } from \"../permissions/PermissionsBridge\";\nimport { FLUIDGRIDS_PERMISSIONS } from \"../permissions/constants\";\n\nfunction useStatusFilters() {\n const tr = useTr();\n return useMemo(\n () => [\n {\n value: \"ACTIVE\",\n label: tr(\"fluidgrids.workflowsList.statusActive\", \"Active\"),\n },\n {\n value: \"DRAFT\",\n label: tr(\"fluidgrids.workflowsList.statusDraft\", \"Draft\"),\n },\n {\n value: \"ARCHIVED\",\n label: tr(\"fluidgrids.workflowsList.statusArchived\", \"Archived\"),\n },\n {\n value: \"DEPRECATED\",\n label: tr(\"fluidgrids.workflowsList.statusDeprecated\", \"Deprecated\"),\n },\n ],\n [tr],\n );\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 STATUS_FILTERS = useStatusFilters();\n const { workflows, loading, error, tagsByKey, refetch } =\n useWorkflowDefinitions({\n limit: 100,\n latestOnly: true,\n });\n const { getWorkflow } = useLazyWorkflowDefinition();\n\n const [search, setSearch] = useState(\"\");\n const [statusFilter, setStatusFilter] = useState<string | null>(null);\n const [tagFilter, setTagFilter] = useState<string | null>(null);\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, STATUS_FILTERS]);\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 list query's tagAssignments projection; no separate\n // overlay request is needed, avoiding duplicate workflowDefinitions calls.\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 handleExport = async (id: string) => {\n const workflow = await getWorkflow(undefined, id);\n if (!workflow) return;\n try {\n downloadWorkflowExport(workflow);\n } catch (error) {\n console.error(\"Unable to export workflow\", error);\n }\n };\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`, NEW_WORKFLOW_NAV)}\n data-tour=\"fluidgrids-list-create\"\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\n className=\"flex flex-1 flex-col gap-5 p-4 sm:p-6\"\n data-tour=\"fluidgrids-list-results\"\n >\n {/* Page header */}\n <div\n className=\"flex flex-wrap items-start justify-between gap-3\"\n data-tour=\"fluidgrids-list-header\"\n >\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 <WorkflowImportDialog onImported={() => void refetch()} />\n </div>\n\n {/* Toolbar: search + status chips (only useful once something exists) */}\n {!loading && !error && workflows.length > 0 && (\n <div\n className=\"flex flex-wrap items-center gap-3\"\n data-tour=\"fluidgrids-list-toolbar\"\n >\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 onExport={() => void handleExport(workflow.id)}\n />\n ))}\n </div>\n )}\n </div>\n </main>\n );\n}\n"]}