@burdenoff/fluidgrids-fe-sdk 2026.922.13 → 2026.923.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.
Files changed (61) hide show
  1. package/dist/ExecutionDetailPage-BD7CS4KL.js +12 -0
  2. package/dist/{ExecutionDetailPage-OSDL7NDT.js.map → ExecutionDetailPage-BD7CS4KL.js.map} +1 -1
  3. package/dist/ExecutionsListPage-VOGSLA7T.js +11 -0
  4. package/dist/{ExecutionsListPage-AATDFFIH.js.map → ExecutionsListPage-VOGSLA7T.js.map} +1 -1
  5. package/dist/{WorkflowBuilder-D7RKU4UK.js → WorkflowBuilder-WLJBVVHS.js} +8 -8
  6. package/dist/{WorkflowBuilder-D7RKU4UK.js.map → WorkflowBuilder-WLJBVVHS.js.map} +1 -1
  7. package/dist/{WorkflowsList-JHM7Q5HE.js → WorkflowsList-QREUMT55.js} +6 -6
  8. package/dist/{WorkflowsList-JHM7Q5HE.js.map → WorkflowsList-QREUMT55.js.map} +1 -1
  9. package/dist/{chunk-5IAMVAGX.js → chunk-4C6UYNC5.js} +43 -5
  10. package/dist/chunk-4C6UYNC5.js.map +1 -0
  11. package/dist/chunk-5A7GP6O7.js +729 -0
  12. package/dist/chunk-5A7GP6O7.js.map +1 -0
  13. package/dist/{chunk-MTWEYC2W.js → chunk-5PZDLMC4.js} +4 -4
  14. package/dist/{chunk-MTWEYC2W.js.map → chunk-5PZDLMC4.js.map} +1 -1
  15. package/dist/chunk-FKOUPL6Z.js +753 -0
  16. package/dist/chunk-FKOUPL6Z.js.map +1 -0
  17. package/dist/{chunk-EUZZLC3N.js → chunk-HNVWIVJH.js} +202 -6
  18. package/dist/chunk-HNVWIVJH.js.map +1 -0
  19. package/dist/{chunk-PTGKDQ5K.js → chunk-LH2YML5F.js} +8 -2
  20. package/dist/chunk-LH2YML5F.js.map +1 -0
  21. package/dist/chunk-NK32XOQN.js +248 -0
  22. package/dist/chunk-NK32XOQN.js.map +1 -0
  23. package/dist/{chunk-CVVNQCFM.js → chunk-Q4RPP67K.js} +4 -4
  24. package/dist/{chunk-CVVNQCFM.js.map → chunk-Q4RPP67K.js.map} +1 -1
  25. package/dist/{chunk-UNW4I442.js → chunk-Q7RJYGQK.js} +3 -3
  26. package/dist/{chunk-UNW4I442.js.map → chunk-Q7RJYGQK.js.map} +1 -1
  27. package/dist/{chunk-RJQJAN6J.js → chunk-TEZV7I6A.js} +4 -4
  28. package/dist/{chunk-RJQJAN6J.js.map → chunk-TEZV7I6A.js.map} +1 -1
  29. package/dist/{chunk-XQYAM47Y.js → chunk-TOHTP3BT.js} +4 -4
  30. package/dist/{chunk-XQYAM47Y.js.map → chunk-TOHTP3BT.js.map} +1 -1
  31. package/dist/{chunk-IPVHC2DM.js → chunk-TVLE7GNH.js} +374 -7
  32. package/dist/chunk-TVLE7GNH.js.map +1 -0
  33. package/dist/{chunk-ISS73LG3.js → chunk-VPWQN7KV.js} +3 -3
  34. package/dist/{chunk-ISS73LG3.js.map → chunk-VPWQN7KV.js.map} +1 -1
  35. package/dist/{chunk-R6JFXZXN.js → chunk-VTPBYPDV.js} +47 -5
  36. package/dist/chunk-VTPBYPDV.js.map +1 -0
  37. package/dist/{chunk-GWRX2T3K.js → chunk-XF7QA3QT.js} +417 -155
  38. package/dist/chunk-XF7QA3QT.js.map +1 -0
  39. package/dist/executions.js +7 -6
  40. package/dist/history.js +4 -4
  41. package/dist/index.d.ts +71 -1
  42. package/dist/index.js +26 -23
  43. package/dist/index.js.map +1 -1
  44. package/dist/nodes.js +2 -2
  45. package/dist/observability-5ShR4Phm.d.ts +134 -0
  46. package/dist/observability.d.ts +2 -0
  47. package/dist/observability.js +8 -0
  48. package/dist/observability.js.map +1 -0
  49. package/dist/settings.js +5 -1
  50. package/dist/templates.js +6 -6
  51. package/dist/workflow-builder.js +7 -7
  52. package/dist/workflows-list.js +4 -4
  53. package/package.json +5 -1
  54. package/dist/ExecutionDetailPage-OSDL7NDT.js +0 -11
  55. package/dist/ExecutionsListPage-AATDFFIH.js +0 -10
  56. package/dist/chunk-5IAMVAGX.js.map +0 -1
  57. package/dist/chunk-EUZZLC3N.js.map +0 -1
  58. package/dist/chunk-GWRX2T3K.js.map +0 -1
  59. package/dist/chunk-IPVHC2DM.js.map +0 -1
  60. package/dist/chunk-PTGKDQ5K.js.map +0 -1
  61. package/dist/chunk-R6JFXZXN.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../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-TVLE7GNH.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 &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 <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 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 /**\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 {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 { CreateWorkflowDefinitionInput } from \"../generated/graphql-types\";\nimport { useCreateWorkflow } 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 { createWorkflow, loading } = useCreateWorkflow();\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: CreateWorkflowDefinitionInput = {\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 };\n const created = await createWorkflow(input);\n if (!created) return;\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 { 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`)}\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"]}
@@ -1,6 +1,6 @@
1
- import { getFluidGridsClient } from './chunk-5BDQNSP3.js';
2
1
  import { NodeEndpointConfigsDocument, NodeEndpointConfigDocument, NodeManifestDocument } from './chunk-BHITFSOK.js';
3
2
  import { useTr } from './chunk-7YWBH2A5.js';
3
+ import { getFluidGridsClient } from './chunk-5BDQNSP3.js';
4
4
  import { useState, useCallback, useEffect, useMemo } from 'react';
5
5
  import { useNavigate } from 'react-router';
6
6
  import { Icon } from '@iconify/react';
@@ -501,5 +501,5 @@ function NodesPage() {
501
501
  }
502
502
 
503
503
  export { NodesPage, fetchAllNodesWithManifests, useLazyNodeManifest, useNodeEndpoint, useNodeEndpoints, useNodeManifest };
504
- //# sourceMappingURL=chunk-ISS73LG3.js.map
505
- //# sourceMappingURL=chunk-ISS73LG3.js.map
504
+ //# sourceMappingURL=chunk-VPWQN7KV.js.map
505
+ //# sourceMappingURL=chunk-VPWQN7KV.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks/useNodeEndpoints.ts","../src/modules/nodes/pages/NodesPage.tsx"],"names":["useState"],"mappings":"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","file":"chunk-ISS73LG3.js","sourcesContent":["import { useState, useEffect, useCallback } from \"react\";\nimport { getFluidGridsClient } from \"../graphql/client\";\nimport {\n NodeEndpointConfigsDocument,\n NodeEndpointConfigDocument,\n NodeManifestDocument,\n} from \"../generated/operations\";\nimport type {\n NodeEndpointConfig,\n WorkflowPaginationInput,\n} from \"../generated/graphql-types\";\n\n// Alias for backward compatibility\nconst NODE_ENDPOINT_CONFIGS = NodeEndpointConfigsDocument;\nconst NODE_ENDPOINT_CONFIG = NodeEndpointConfigDocument;\nconst NODE_MANIFEST = NodeManifestDocument;\n\ninterface NodeEndpointConfigsData {\n nodeEndpointConfigs: {\n configs: NodeEndpointConfig[];\n pagination: {\n total: number;\n limit: number;\n offset: number;\n hasMore: boolean;\n };\n };\n}\n\ninterface NodeEndpointConfigData {\n nodeEndpointConfig: NodeEndpointConfig | null;\n}\n\ninterface NodeManifestData {\n nodeManifest: unknown;\n}\n\ninterface UseNodeEndpointsOptions {\n pagination?: WorkflowPaginationInput;\n status?: \"AVAILABLE\" | \"DEPRECATED\" | \"DISABLED\";\n publishType?: \"STORE\" | \"CUSTOM\";\n skip?: boolean;\n}\n\n/**\n * Hook to fetch all node endpoint configurations\n * Uses Apollo Client directly to avoid Vite bundling issues with @apollo/client hooks\n */\nexport function useNodeEndpoints(options: UseNodeEndpointsOptions = {}) {\n const { pagination, status = \"AVAILABLE\", publishType, skip } = options;\n\n const [nodes, setNodes] = useState<NodeEndpointConfig[]>([]);\n const [paginationData, setPaginationData] = useState<\n NodeEndpointConfigsData[\"nodeEndpointConfigs\"][\"pagination\"] | undefined\n >();\n const [loading, setLoading] = useState(!skip);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n if (skip) return;\n\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.query<NodeEndpointConfigsData>({\n query: NODE_ENDPOINT_CONFIGS,\n variables: { pagination, status, publishType },\n fetchPolicy: \"cache-first\",\n });\n setNodes(result.data?.nodeEndpointConfigs?.configs ?? []);\n setPaginationData(result.data?.nodeEndpointConfigs?.pagination);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [pagination, status, publishType, skip]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n nodes,\n pagination: paginationData,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n/**\n * Hook to fetch a single node endpoint configuration\n */\nexport function useNodeEndpoint(nodeType: string, nodeVersion: string) {\n const [node, setNode] = useState<NodeEndpointConfig | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n if (!nodeType || !nodeVersion) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.query<NodeEndpointConfigData>({\n query: NODE_ENDPOINT_CONFIG,\n variables: { nodeType, nodeVersion },\n fetchPolicy: \"cache-first\",\n });\n setNode(result.data?.nodeEndpointConfig ?? null);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [nodeType, nodeVersion]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n node,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n/**\n * Hook to fetch node manifest\n */\nexport function useNodeManifest(nodeType: string, version: string) {\n const [manifest, setManifest] = useState<unknown>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n if (!nodeType || !version) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.query<NodeManifestData>({\n query: NODE_MANIFEST,\n variables: { nodeType, version },\n fetchPolicy: \"cache-first\",\n });\n setManifest(result.data?.nodeManifest ?? null);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [nodeType, version]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n manifest,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n/**\n * Lazy hook for fetching node manifest on demand\n */\nexport function useLazyNodeManifest() {\n const [manifest, setManifest] = useState<unknown>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const getManifest = useCallback(async (nodeType: string, version: string) => {\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.query<NodeManifestData>({\n query: NODE_MANIFEST,\n variables: { nodeType, version },\n });\n const manifestData = result.data?.nodeManifest ?? null;\n setManifest(manifestData);\n return manifestData;\n } catch (err) {\n setError(err as Error);\n return null;\n } finally {\n setLoading(false);\n }\n }, []);\n\n return {\n getManifest,\n manifest,\n loading,\n error,\n };\n}\n\n/**\n * Utility function to fetch all nodes and their manifests (for initial load)\n * This replaces the top-level await pattern in blocks/index.ts\n */\nexport async function fetchAllNodesWithManifests(): Promise<\n NodeEndpointConfig[]\n> {\n const client = getFluidGridsClient();\n\n try {\n // Fetch all node configurations\n const { data: nodesData } = await client.query<NodeEndpointConfigsData>({\n query: NODE_ENDPOINT_CONFIGS,\n variables: {\n status: \"AVAILABLE\",\n pagination: { limit: 100 },\n },\n });\n\n const nodes = nodesData?.nodeEndpointConfigs?.configs ?? [];\n\n // Fetch manifests for each node (in parallel)\n const nodesWithManifests = await Promise.all(\n nodes.map(async (node) => {\n try {\n const { data: manifestData } = await client.query<NodeManifestData>({\n query: NODE_MANIFEST,\n variables: {\n nodeType: node.nodeType,\n version: node.nodeVersion,\n },\n });\n\n return {\n ...node,\n manifest: manifestData?.nodeManifest ?? null,\n };\n } catch (err) {\n console.error(`Failed to fetch manifest for ${node.nodeType}:`, err);\n return {\n ...node,\n manifest: null,\n };\n }\n }),\n );\n\n return nodesWithManifests;\n } catch (err) {\n console.error(\"Failed to fetch nodes:\", err);\n return [];\n }\n}\n","import { useState, useMemo } from \"react\";\nimport { useNavigate } from \"react-router\";\nimport { Icon } from \"@iconify/react\";\nimport { Button } from \"@burdenoff/fe-libs/button\";\nimport {\n Skeleton,\n Input,\n Badge,\n Card,\n CardHeader,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n TooltipProvider,\n} from \"@burdenoff/fe-libs/ui\";\nimport { useNodeEndpoints } from \"../../../hooks/useNodeEndpoints\";\nimport { useTr } from \"../../../hooks/useTr\";\nimport type { NodeEndpointConfig as GqlNodeEndpointConfig } from \"../../../generated/graphql-types\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst NODE_CATEGORIES = [\n { value: \"all\", label: \"All\", icon: \"mdi:view-grid\" },\n { value: \"integration\", label: \"Integration\", icon: \"mdi:connection\" },\n { value: \"data\", label: \"Data\", icon: \"mdi:database\" },\n { value: \"logic\", label: \"Logic\", icon: \"mdi:code-braces\" },\n { value: \"ai-ml\", label: \"AI/ML\", icon: \"mdi:brain\" },\n { value: \"communication\", label: \"Communication\", icon: \"mdi:message-text\" },\n] as const;\n\nconst STATUS_STYLES: Record<\n string,\n { className: string; label: string; icon: string }\n> = {\n AVAILABLE: {\n className: \"bg-emerald-500/15 text-emerald-400 border-emerald-500/30\",\n label: \"Available\",\n icon: \"mdi:check-circle\",\n },\n DEPRECATED: {\n className: \"bg-amber-500/15 text-amber-400 border-amber-500/30\",\n label: \"Deprecated\",\n icon: \"mdi:alert\",\n },\n DISABLED: {\n className: \"bg-zinc-500/15 text-zinc-400 border-zinc-500/30\",\n label: \"Disabled\",\n icon: \"mdi:close-circle\",\n },\n};\n\nconst CATEGORY_COLORS: Record<string, string> = {\n integration: \"bg-violet-500/15 text-violet-400 border-violet-500/30\",\n data: \"bg-blue-500/15 text-blue-400 border-blue-500/30\",\n logic: \"bg-cyan-500/15 text-cyan-400 border-cyan-500/30\",\n \"ai-ml\": \"bg-amber-500/15 text-amber-400 border-amber-500/30\",\n communication: \"bg-rose-500/15 text-rose-400 border-rose-500/30\",\n};\n\n/**\n * Infer a category for a node based on its metadata.\n */\nfunction inferNodeCategory(node: GqlNodeEndpointConfig): string {\n const text = [\n node.name,\n node.nodeType,\n ...(node.keywords ?? []),\n ...(node.kind ?? []),\n ]\n .join(\" \")\n .toLowerCase();\n\n if (\n text.includes(\"ai\") ||\n text.includes(\"ml\") ||\n text.includes(\"llm\") ||\n text.includes(\"model\")\n )\n return \"ai-ml\";\n if (\n text.includes(\"integrat\") ||\n text.includes(\"api\") ||\n text.includes(\"http\") ||\n text.includes(\"webhook\") ||\n text.includes(\"oauth\")\n )\n return \"integration\";\n if (\n text.includes(\"data\") ||\n text.includes(\"transform\") ||\n text.includes(\"filter\") ||\n text.includes(\"aggregate\") ||\n text.includes(\"database\")\n )\n return \"data\";\n if (\n text.includes(\"email\") ||\n text.includes(\"slack\") ||\n text.includes(\"notification\") ||\n text.includes(\"sms\") ||\n text.includes(\"message\")\n )\n return \"communication\";\n if (\n text.includes(\"if\") ||\n text.includes(\"switch\") ||\n text.includes(\"loop\") ||\n text.includes(\"merge\") ||\n text.includes(\"logic\") ||\n text.includes(\"condition\")\n )\n return \"logic\";\n return \"integration\"; // default\n}\n\n// ============================================================================\n// Sub-Components\n// ============================================================================\n\nfunction NodesSkeleton() {\n return (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\n {Array.from({ length: 8 }).map((_, i) => (\n <Skeleton key={i} className=\"h-44 rounded-lg bg-card-foreground/10\" />\n ))}\n </div>\n );\n}\n\nfunction EmptyState({ hasFilters }: { hasFilters: boolean }) {\n const tr = useTr();\n return (\n <div className=\"flex flex-col items-center justify-center py-20 text-center\">\n <div className=\"rounded-full bg-background-secondary p-4 mb-4\">\n <Icon\n icon=\"mdi:puzzle-outline\"\n width={40}\n className=\"text-text-secondary\"\n />\n </div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-2\">\n {hasFilters\n ? tr(\n \"fluidgrids.nodes.nodesPage.emptyTitleFiltered\",\n \"No matching nodes\",\n )\n : tr(\"fluidgrids.nodes.nodesPage.emptyTitle\", \"No nodes registered\")}\n </h3>\n <p className=\"text-sm text-text-secondary max-w-md\">\n {hasFilters\n ? tr(\n \"fluidgrids.nodes.nodesPage.emptyHintFiltered\",\n \"Try adjusting your search or category filter.\",\n )\n : tr(\n \"fluidgrids.nodes.nodesPage.emptyHint\",\n \"Node endpoint configurations will appear here once registered.\",\n )}\n </p>\n </div>\n );\n}\n\nfunction ErrorState({\n message,\n onRetry,\n}: {\n message: string;\n onRetry: () => void;\n}) {\n const tr = useTr();\n return (\n <div className=\"p-4 bg-[var(--color-status-error-bg-subtle)] border border-[var(--color-status-error-border)] rounded-lg\">\n <div className=\"flex items-center gap-2 text-[var(--color-status-error-text)]\">\n <Icon icon=\"mdi:alert-circle\" width={20} />\n <span className=\"font-medium\">\n {tr(\"fluidgrids.nodes.nodesPage.errorHeading\", \"Error loading nodes\")}\n </span>\n </div>\n <p className=\"mt-1 text-sm text-[var(--color-status-error-text)]\">\n {message}\n </p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onRetry}\n className=\"mt-3 border-[var(--color-status-error-border)] text-[var(--color-status-error-text)] hover:bg-[var(--color-status-error-bg-subtle)]\"\n >\n {tr(\"fluidgrids.nodes.nodesPage.errorRetry\", \"Retry\")}\n </Button>\n </div>\n );\n}\n\ninterface NodeCardProps {\n node: GqlNodeEndpointConfig;\n category: string;\n}\n\nfunction NodeCard({ node, category }: NodeCardProps) {\n const tr = useTr();\n const status = STATUS_STYLES[node.status] ?? STATUS_STYLES.AVAILABLE;\n const catColor =\n CATEGORY_COLORS[category] ??\n \"bg-zinc-500/15 text-zinc-400 border-zinc-500/30\";\n const catLabel =\n NODE_CATEGORIES.find((c) => c.value === category)?.label ??\n tr(\"fluidgrids.nodes.nodeCard.categoryFallback\", \"Node\");\n\n return (\n <Card className=\"border border-border-secondary bg-background-secondary hover:border-border-primary transition-all duration-200 flex flex-col\">\n <CardHeader className=\"flex-1 pb-3\">\n <div className=\"flex items-start justify-between gap-2 mb-3\">\n <div className=\"rounded-lg bg-background-tertiary p-2\">\n <Icon\n icon={node.icon ?? node.favicon ?? \"mdi:puzzle\"}\n width={22}\n className=\"text-text-primary\"\n />\n </div>\n <Badge variant=\"outline\" className={status.className}>\n <Icon icon={status.icon} width={12} className=\"mr-1\" />\n {status.label}\n </Badge>\n </div>\n <h3 className=\"font-semibold text-text-primary text-sm leading-tight mb-1 line-clamp-1\">\n {node.name}\n </h3>\n <p className=\"text-xs text-text-secondary line-clamp-2 min-h-[2rem]\">\n {node.description ??\n tr(\n \"fluidgrids.nodes.nodeCard.noDescription\",\n \"No description available.\",\n )}\n </p>\n </CardHeader>\n <div className=\"px-6 pb-4 pt-0\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className={catColor}>\n {catLabel}\n </Badge>\n <span className=\"text-xs text-text-secondary\">\n v{node.nodeVersion}\n </span>\n </div>\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <button className=\"p-1.5 rounded hover:bg-background-tertiary text-text-secondary hover:text-text-primary transition-colors\">\n <Icon icon=\"mdi:cog\" width={16} />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n {tr(\n \"fluidgrids.nodes.nodeCard.configureTooltip\",\n \"Configure node\",\n )}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n </div>\n </Card>\n );\n}\n\n// ============================================================================\n// Main Component\n// ============================================================================\n\nexport function NodesPage() {\n const tr = useTr();\n const navigate = useNavigate();\n const [search, setSearch] = useState(\"\");\n const [activeCategory, setActiveCategory] = useState<string>(\"all\");\n\n // Fetch available nodes (default status=AVAILABLE)\n const { nodes, loading, error, refetch } = useNodeEndpoints({\n pagination: { limit: 200 },\n });\n\n // Fetch deprecated nodes for stats\n const { nodes: deprecatedNodes } = useNodeEndpoints({\n pagination: { limit: 200 },\n status: \"DEPRECATED\",\n });\n\n // Fetch disabled nodes for stats\n const { nodes: disabledNodes } = useNodeEndpoints({\n pagination: { limit: 200 },\n status: \"DISABLED\",\n });\n\n // Categorize nodes\n const categorizedNodes = useMemo(() => {\n return nodes.map((n) => ({\n node: n,\n category: inferNodeCategory(n),\n }));\n }, [nodes]);\n\n // Filter\n const filtered = useMemo(() => {\n let items = categorizedNodes;\n\n if (activeCategory !== \"all\") {\n items = items.filter((item) => item.category === activeCategory);\n }\n\n if (search.trim()) {\n const q = search.toLowerCase();\n items = items.filter(\n (item) =>\n item.node.name.toLowerCase().includes(q) ||\n item.node.nodeType.toLowerCase().includes(q) ||\n (item.node.description ?? \"\").toLowerCase().includes(q) ||\n item.node.keywords?.some((k) => k.toLowerCase().includes(q)),\n );\n }\n\n return items;\n }, [categorizedNodes, activeCategory, search]);\n\n // Stats (combine all statuses)\n const stats = useMemo(() => {\n const active = nodes.length;\n const deprecated = deprecatedNodes.length;\n const total = active + deprecated + disabledNodes.length;\n return { total, active, deprecated };\n }, [nodes, deprecatedNodes, disabledNodes]);\n\n // Category counts\n const categoryCounts = useMemo(() => {\n const counts: Record<string, number> = { all: categorizedNodes.length };\n for (const item of categorizedNodes) {\n counts[item.category] = (counts[item.category] ?? 0) + 1;\n }\n return counts;\n }, [categorizedNodes]);\n\n return (\n <div className=\"p-4 sm:p-6 bg-background-primary min-h-screen\">\n {/* Header */}\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 mb-6\">\n <div>\n <h1 className=\"text-2xl sm:text-3xl font-bold text-text-primary\">\n {tr(\"fluidgrids.nodes.nodesPage.title\", \"Node Catalog\")}\n </h1>\n <p className=\"text-text-secondary mt-1\">\n {tr(\n \"fluidgrids.nodes.nodesPage.subtitle\",\n \"Browse and manage available workflow nodes\",\n )}\n </p>\n </div>\n <div className=\"flex items-center gap-3\">\n <Button variant=\"outline\" onClick={() => refetch()}>\n <Icon icon=\"mdi:refresh\" className=\"mr-2\" width={16} />\n {tr(\"fluidgrids.nodes.nodesPage.refreshButton\", \"Refresh\")}\n </Button>\n <Button variant=\"outline\" onClick={() => navigate(\"../list\")}>\n <Icon icon=\"mdi:arrow-left\" className=\"mr-2\" width={16} />\n {tr(\n \"fluidgrids.nodes.nodesPage.backToWorkflowsButton\",\n \"Back to Workflows\",\n )}\n </Button>\n </div>\n </div>\n\n {/* Stats */}\n <div className=\"grid grid-cols-3 gap-3 mb-6\">\n <div className=\"p-3 rounded-lg bg-background-secondary border border-border-secondary\">\n <div className=\"flex items-center gap-2\">\n <Icon\n icon=\"mdi:puzzle\"\n width={18}\n className=\"text-text-secondary\"\n />\n <p className=\"text-xs text-text-secondary\">\n {tr(\"fluidgrids.nodes.nodesPage.statTotal\", \"Total Nodes\")}\n </p>\n </div>\n <p className=\"text-xl font-bold text-text-primary mt-1\">\n {loading ? \"—\" : stats.total}\n </p>\n </div>\n <div className=\"p-3 rounded-lg bg-background-secondary border border-border-secondary\">\n <div className=\"flex items-center gap-2\">\n <Icon\n icon=\"mdi:check-circle\"\n width={18}\n className=\"text-emerald-400\"\n />\n <p className=\"text-xs text-text-secondary\">\n {tr(\"fluidgrids.nodes.nodesPage.statActive\", \"Active\")}\n </p>\n </div>\n <p className=\"text-xl font-bold text-emerald-400 mt-1\">\n {loading ? \"—\" : stats.active}\n </p>\n </div>\n <div className=\"p-3 rounded-lg bg-background-secondary border border-border-secondary\">\n <div className=\"flex items-center gap-2\">\n <Icon icon=\"mdi:alert\" width={18} className=\"text-amber-400\" />\n <p className=\"text-xs text-text-secondary\">\n {tr(\"fluidgrids.nodes.nodesPage.statDeprecated\", \"Deprecated\")}\n </p>\n </div>\n <p className=\"text-xl font-bold text-amber-400 mt-1\">\n {loading ? \"—\" : stats.deprecated}\n </p>\n </div>\n </div>\n\n {/* Search */}\n <div className=\"relative max-w-md mb-6\">\n <Icon\n icon=\"mdi:magnify\"\n width={18}\n className=\"absolute left-3 top-1/2 -translate-y-1/2 text-text-secondary\"\n />\n <Input\n placeholder={tr(\n \"fluidgrids.nodes.nodesPage.searchPlaceholder\",\n \"Search nodes by name, type, or keyword...\",\n )}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"pl-10 bg-background-secondary border-border-secondary\"\n />\n </div>\n\n {/* Category Tabs */}\n <div className=\"flex flex-wrap gap-2 mb-6\">\n {NODE_CATEGORIES.map((cat) => {\n const count = categoryCounts[cat.value] ?? 0;\n const isActive = activeCategory === cat.value;\n return (\n <button\n key={cat.value}\n onClick={() => setActiveCategory(cat.value)}\n className={`inline-flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-sm font-medium transition-colors ${\n isActive\n ? \"bg-background-tertiary text-text-primary border border-border-primary\"\n : \"bg-background-secondary text-text-secondary border border-border-secondary hover:text-text-primary hover:border-border-primary\"\n }`}\n >\n <Icon icon={cat.icon} width={16} />\n {cat.label}\n <span\n className={`ml-0.5 text-xs ${isActive ? \"text-text-primary\" : \"text-text-secondary\"}`}\n >\n ({count})\n </span>\n </button>\n );\n })}\n </div>\n\n {/* Error State */}\n {error && (\n <div className=\"mb-6\">\n <ErrorState message={error.message} onRetry={refetch} />\n </div>\n )}\n\n {/* Content */}\n {loading ? (\n <NodesSkeleton />\n ) : filtered.length === 0 ? (\n <EmptyState\n hasFilters={search.trim().length > 0 || activeCategory !== \"all\"}\n />\n ) : (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\n {filtered.map(({ node, category }) => (\n <NodeCard key={node.id} node={node} category={category} />\n ))}\n </div>\n )}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/hooks/useNodeEndpoints.ts","../src/modules/nodes/pages/NodesPage.tsx"],"names":["useState"],"mappings":"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","file":"chunk-VPWQN7KV.js","sourcesContent":["import { useState, useEffect, useCallback } from \"react\";\nimport { getFluidGridsClient } from \"../graphql/client\";\nimport {\n NodeEndpointConfigsDocument,\n NodeEndpointConfigDocument,\n NodeManifestDocument,\n} from \"../generated/operations\";\nimport type {\n NodeEndpointConfig,\n WorkflowPaginationInput,\n} from \"../generated/graphql-types\";\n\n// Alias for backward compatibility\nconst NODE_ENDPOINT_CONFIGS = NodeEndpointConfigsDocument;\nconst NODE_ENDPOINT_CONFIG = NodeEndpointConfigDocument;\nconst NODE_MANIFEST = NodeManifestDocument;\n\ninterface NodeEndpointConfigsData {\n nodeEndpointConfigs: {\n configs: NodeEndpointConfig[];\n pagination: {\n total: number;\n limit: number;\n offset: number;\n hasMore: boolean;\n };\n };\n}\n\ninterface NodeEndpointConfigData {\n nodeEndpointConfig: NodeEndpointConfig | null;\n}\n\ninterface NodeManifestData {\n nodeManifest: unknown;\n}\n\ninterface UseNodeEndpointsOptions {\n pagination?: WorkflowPaginationInput;\n status?: \"AVAILABLE\" | \"DEPRECATED\" | \"DISABLED\";\n publishType?: \"STORE\" | \"CUSTOM\";\n skip?: boolean;\n}\n\n/**\n * Hook to fetch all node endpoint configurations\n * Uses Apollo Client directly to avoid Vite bundling issues with @apollo/client hooks\n */\nexport function useNodeEndpoints(options: UseNodeEndpointsOptions = {}) {\n const { pagination, status = \"AVAILABLE\", publishType, skip } = options;\n\n const [nodes, setNodes] = useState<NodeEndpointConfig[]>([]);\n const [paginationData, setPaginationData] = useState<\n NodeEndpointConfigsData[\"nodeEndpointConfigs\"][\"pagination\"] | undefined\n >();\n const [loading, setLoading] = useState(!skip);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n if (skip) return;\n\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.query<NodeEndpointConfigsData>({\n query: NODE_ENDPOINT_CONFIGS,\n variables: { pagination, status, publishType },\n fetchPolicy: \"cache-first\",\n });\n setNodes(result.data?.nodeEndpointConfigs?.configs ?? []);\n setPaginationData(result.data?.nodeEndpointConfigs?.pagination);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [pagination, status, publishType, skip]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n nodes,\n pagination: paginationData,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n/**\n * Hook to fetch a single node endpoint configuration\n */\nexport function useNodeEndpoint(nodeType: string, nodeVersion: string) {\n const [node, setNode] = useState<NodeEndpointConfig | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n if (!nodeType || !nodeVersion) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.query<NodeEndpointConfigData>({\n query: NODE_ENDPOINT_CONFIG,\n variables: { nodeType, nodeVersion },\n fetchPolicy: \"cache-first\",\n });\n setNode(result.data?.nodeEndpointConfig ?? null);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [nodeType, nodeVersion]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n node,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n/**\n * Hook to fetch node manifest\n */\nexport function useNodeManifest(nodeType: string, version: string) {\n const [manifest, setManifest] = useState<unknown>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n if (!nodeType || !version) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.query<NodeManifestData>({\n query: NODE_MANIFEST,\n variables: { nodeType, version },\n fetchPolicy: \"cache-first\",\n });\n setManifest(result.data?.nodeManifest ?? null);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [nodeType, version]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n manifest,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n/**\n * Lazy hook for fetching node manifest on demand\n */\nexport function useLazyNodeManifest() {\n const [manifest, setManifest] = useState<unknown>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const getManifest = useCallback(async (nodeType: string, version: string) => {\n setLoading(true);\n setError(null);\n try {\n const client = getFluidGridsClient();\n const result = await client.query<NodeManifestData>({\n query: NODE_MANIFEST,\n variables: { nodeType, version },\n });\n const manifestData = result.data?.nodeManifest ?? null;\n setManifest(manifestData);\n return manifestData;\n } catch (err) {\n setError(err as Error);\n return null;\n } finally {\n setLoading(false);\n }\n }, []);\n\n return {\n getManifest,\n manifest,\n loading,\n error,\n };\n}\n\n/**\n * Utility function to fetch all nodes and their manifests (for initial load)\n * This replaces the top-level await pattern in blocks/index.ts\n */\nexport async function fetchAllNodesWithManifests(): Promise<\n NodeEndpointConfig[]\n> {\n const client = getFluidGridsClient();\n\n try {\n // Fetch all node configurations\n const { data: nodesData } = await client.query<NodeEndpointConfigsData>({\n query: NODE_ENDPOINT_CONFIGS,\n variables: {\n status: \"AVAILABLE\",\n pagination: { limit: 100 },\n },\n });\n\n const nodes = nodesData?.nodeEndpointConfigs?.configs ?? [];\n\n // Fetch manifests for each node (in parallel)\n const nodesWithManifests = await Promise.all(\n nodes.map(async (node) => {\n try {\n const { data: manifestData } = await client.query<NodeManifestData>({\n query: NODE_MANIFEST,\n variables: {\n nodeType: node.nodeType,\n version: node.nodeVersion,\n },\n });\n\n return {\n ...node,\n manifest: manifestData?.nodeManifest ?? null,\n };\n } catch (err) {\n console.error(`Failed to fetch manifest for ${node.nodeType}:`, err);\n return {\n ...node,\n manifest: null,\n };\n }\n }),\n );\n\n return nodesWithManifests;\n } catch (err) {\n console.error(\"Failed to fetch nodes:\", err);\n return [];\n }\n}\n","import { useState, useMemo } from \"react\";\nimport { useNavigate } from \"react-router\";\nimport { Icon } from \"@iconify/react\";\nimport { Button } from \"@burdenoff/fe-libs/button\";\nimport {\n Skeleton,\n Input,\n Badge,\n Card,\n CardHeader,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n TooltipProvider,\n} from \"@burdenoff/fe-libs/ui\";\nimport { useNodeEndpoints } from \"../../../hooks/useNodeEndpoints\";\nimport { useTr } from \"../../../hooks/useTr\";\nimport type { NodeEndpointConfig as GqlNodeEndpointConfig } from \"../../../generated/graphql-types\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst NODE_CATEGORIES = [\n { value: \"all\", label: \"All\", icon: \"mdi:view-grid\" },\n { value: \"integration\", label: \"Integration\", icon: \"mdi:connection\" },\n { value: \"data\", label: \"Data\", icon: \"mdi:database\" },\n { value: \"logic\", label: \"Logic\", icon: \"mdi:code-braces\" },\n { value: \"ai-ml\", label: \"AI/ML\", icon: \"mdi:brain\" },\n { value: \"communication\", label: \"Communication\", icon: \"mdi:message-text\" },\n] as const;\n\nconst STATUS_STYLES: Record<\n string,\n { className: string; label: string; icon: string }\n> = {\n AVAILABLE: {\n className: \"bg-emerald-500/15 text-emerald-400 border-emerald-500/30\",\n label: \"Available\",\n icon: \"mdi:check-circle\",\n },\n DEPRECATED: {\n className: \"bg-amber-500/15 text-amber-400 border-amber-500/30\",\n label: \"Deprecated\",\n icon: \"mdi:alert\",\n },\n DISABLED: {\n className: \"bg-zinc-500/15 text-zinc-400 border-zinc-500/30\",\n label: \"Disabled\",\n icon: \"mdi:close-circle\",\n },\n};\n\nconst CATEGORY_COLORS: Record<string, string> = {\n integration: \"bg-violet-500/15 text-violet-400 border-violet-500/30\",\n data: \"bg-blue-500/15 text-blue-400 border-blue-500/30\",\n logic: \"bg-cyan-500/15 text-cyan-400 border-cyan-500/30\",\n \"ai-ml\": \"bg-amber-500/15 text-amber-400 border-amber-500/30\",\n communication: \"bg-rose-500/15 text-rose-400 border-rose-500/30\",\n};\n\n/**\n * Infer a category for a node based on its metadata.\n */\nfunction inferNodeCategory(node: GqlNodeEndpointConfig): string {\n const text = [\n node.name,\n node.nodeType,\n ...(node.keywords ?? []),\n ...(node.kind ?? []),\n ]\n .join(\" \")\n .toLowerCase();\n\n if (\n text.includes(\"ai\") ||\n text.includes(\"ml\") ||\n text.includes(\"llm\") ||\n text.includes(\"model\")\n )\n return \"ai-ml\";\n if (\n text.includes(\"integrat\") ||\n text.includes(\"api\") ||\n text.includes(\"http\") ||\n text.includes(\"webhook\") ||\n text.includes(\"oauth\")\n )\n return \"integration\";\n if (\n text.includes(\"data\") ||\n text.includes(\"transform\") ||\n text.includes(\"filter\") ||\n text.includes(\"aggregate\") ||\n text.includes(\"database\")\n )\n return \"data\";\n if (\n text.includes(\"email\") ||\n text.includes(\"slack\") ||\n text.includes(\"notification\") ||\n text.includes(\"sms\") ||\n text.includes(\"message\")\n )\n return \"communication\";\n if (\n text.includes(\"if\") ||\n text.includes(\"switch\") ||\n text.includes(\"loop\") ||\n text.includes(\"merge\") ||\n text.includes(\"logic\") ||\n text.includes(\"condition\")\n )\n return \"logic\";\n return \"integration\"; // default\n}\n\n// ============================================================================\n// Sub-Components\n// ============================================================================\n\nfunction NodesSkeleton() {\n return (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\n {Array.from({ length: 8 }).map((_, i) => (\n <Skeleton key={i} className=\"h-44 rounded-lg bg-card-foreground/10\" />\n ))}\n </div>\n );\n}\n\nfunction EmptyState({ hasFilters }: { hasFilters: boolean }) {\n const tr = useTr();\n return (\n <div className=\"flex flex-col items-center justify-center py-20 text-center\">\n <div className=\"rounded-full bg-background-secondary p-4 mb-4\">\n <Icon\n icon=\"mdi:puzzle-outline\"\n width={40}\n className=\"text-text-secondary\"\n />\n </div>\n <h3 className=\"text-lg font-semibold text-text-primary mb-2\">\n {hasFilters\n ? tr(\n \"fluidgrids.nodes.nodesPage.emptyTitleFiltered\",\n \"No matching nodes\",\n )\n : tr(\"fluidgrids.nodes.nodesPage.emptyTitle\", \"No nodes registered\")}\n </h3>\n <p className=\"text-sm text-text-secondary max-w-md\">\n {hasFilters\n ? tr(\n \"fluidgrids.nodes.nodesPage.emptyHintFiltered\",\n \"Try adjusting your search or category filter.\",\n )\n : tr(\n \"fluidgrids.nodes.nodesPage.emptyHint\",\n \"Node endpoint configurations will appear here once registered.\",\n )}\n </p>\n </div>\n );\n}\n\nfunction ErrorState({\n message,\n onRetry,\n}: {\n message: string;\n onRetry: () => void;\n}) {\n const tr = useTr();\n return (\n <div className=\"p-4 bg-[var(--color-status-error-bg-subtle)] border border-[var(--color-status-error-border)] rounded-lg\">\n <div className=\"flex items-center gap-2 text-[var(--color-status-error-text)]\">\n <Icon icon=\"mdi:alert-circle\" width={20} />\n <span className=\"font-medium\">\n {tr(\"fluidgrids.nodes.nodesPage.errorHeading\", \"Error loading nodes\")}\n </span>\n </div>\n <p className=\"mt-1 text-sm text-[var(--color-status-error-text)]\">\n {message}\n </p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onRetry}\n className=\"mt-3 border-[var(--color-status-error-border)] text-[var(--color-status-error-text)] hover:bg-[var(--color-status-error-bg-subtle)]\"\n >\n {tr(\"fluidgrids.nodes.nodesPage.errorRetry\", \"Retry\")}\n </Button>\n </div>\n );\n}\n\ninterface NodeCardProps {\n node: GqlNodeEndpointConfig;\n category: string;\n}\n\nfunction NodeCard({ node, category }: NodeCardProps) {\n const tr = useTr();\n const status = STATUS_STYLES[node.status] ?? STATUS_STYLES.AVAILABLE;\n const catColor =\n CATEGORY_COLORS[category] ??\n \"bg-zinc-500/15 text-zinc-400 border-zinc-500/30\";\n const catLabel =\n NODE_CATEGORIES.find((c) => c.value === category)?.label ??\n tr(\"fluidgrids.nodes.nodeCard.categoryFallback\", \"Node\");\n\n return (\n <Card className=\"border border-border-secondary bg-background-secondary hover:border-border-primary transition-all duration-200 flex flex-col\">\n <CardHeader className=\"flex-1 pb-3\">\n <div className=\"flex items-start justify-between gap-2 mb-3\">\n <div className=\"rounded-lg bg-background-tertiary p-2\">\n <Icon\n icon={node.icon ?? node.favicon ?? \"mdi:puzzle\"}\n width={22}\n className=\"text-text-primary\"\n />\n </div>\n <Badge variant=\"outline\" className={status.className}>\n <Icon icon={status.icon} width={12} className=\"mr-1\" />\n {status.label}\n </Badge>\n </div>\n <h3 className=\"font-semibold text-text-primary text-sm leading-tight mb-1 line-clamp-1\">\n {node.name}\n </h3>\n <p className=\"text-xs text-text-secondary line-clamp-2 min-h-[2rem]\">\n {node.description ??\n tr(\n \"fluidgrids.nodes.nodeCard.noDescription\",\n \"No description available.\",\n )}\n </p>\n </CardHeader>\n <div className=\"px-6 pb-4 pt-0\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className={catColor}>\n {catLabel}\n </Badge>\n <span className=\"text-xs text-text-secondary\">\n v{node.nodeVersion}\n </span>\n </div>\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <button className=\"p-1.5 rounded hover:bg-background-tertiary text-text-secondary hover:text-text-primary transition-colors\">\n <Icon icon=\"mdi:cog\" width={16} />\n </button>\n </TooltipTrigger>\n <TooltipContent>\n {tr(\n \"fluidgrids.nodes.nodeCard.configureTooltip\",\n \"Configure node\",\n )}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n </div>\n </div>\n </Card>\n );\n}\n\n// ============================================================================\n// Main Component\n// ============================================================================\n\nexport function NodesPage() {\n const tr = useTr();\n const navigate = useNavigate();\n const [search, setSearch] = useState(\"\");\n const [activeCategory, setActiveCategory] = useState<string>(\"all\");\n\n // Fetch available nodes (default status=AVAILABLE)\n const { nodes, loading, error, refetch } = useNodeEndpoints({\n pagination: { limit: 200 },\n });\n\n // Fetch deprecated nodes for stats\n const { nodes: deprecatedNodes } = useNodeEndpoints({\n pagination: { limit: 200 },\n status: \"DEPRECATED\",\n });\n\n // Fetch disabled nodes for stats\n const { nodes: disabledNodes } = useNodeEndpoints({\n pagination: { limit: 200 },\n status: \"DISABLED\",\n });\n\n // Categorize nodes\n const categorizedNodes = useMemo(() => {\n return nodes.map((n) => ({\n node: n,\n category: inferNodeCategory(n),\n }));\n }, [nodes]);\n\n // Filter\n const filtered = useMemo(() => {\n let items = categorizedNodes;\n\n if (activeCategory !== \"all\") {\n items = items.filter((item) => item.category === activeCategory);\n }\n\n if (search.trim()) {\n const q = search.toLowerCase();\n items = items.filter(\n (item) =>\n item.node.name.toLowerCase().includes(q) ||\n item.node.nodeType.toLowerCase().includes(q) ||\n (item.node.description ?? \"\").toLowerCase().includes(q) ||\n item.node.keywords?.some((k) => k.toLowerCase().includes(q)),\n );\n }\n\n return items;\n }, [categorizedNodes, activeCategory, search]);\n\n // Stats (combine all statuses)\n const stats = useMemo(() => {\n const active = nodes.length;\n const deprecated = deprecatedNodes.length;\n const total = active + deprecated + disabledNodes.length;\n return { total, active, deprecated };\n }, [nodes, deprecatedNodes, disabledNodes]);\n\n // Category counts\n const categoryCounts = useMemo(() => {\n const counts: Record<string, number> = { all: categorizedNodes.length };\n for (const item of categorizedNodes) {\n counts[item.category] = (counts[item.category] ?? 0) + 1;\n }\n return counts;\n }, [categorizedNodes]);\n\n return (\n <div className=\"p-4 sm:p-6 bg-background-primary min-h-screen\">\n {/* Header */}\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 mb-6\">\n <div>\n <h1 className=\"text-2xl sm:text-3xl font-bold text-text-primary\">\n {tr(\"fluidgrids.nodes.nodesPage.title\", \"Node Catalog\")}\n </h1>\n <p className=\"text-text-secondary mt-1\">\n {tr(\n \"fluidgrids.nodes.nodesPage.subtitle\",\n \"Browse and manage available workflow nodes\",\n )}\n </p>\n </div>\n <div className=\"flex items-center gap-3\">\n <Button variant=\"outline\" onClick={() => refetch()}>\n <Icon icon=\"mdi:refresh\" className=\"mr-2\" width={16} />\n {tr(\"fluidgrids.nodes.nodesPage.refreshButton\", \"Refresh\")}\n </Button>\n <Button variant=\"outline\" onClick={() => navigate(\"../list\")}>\n <Icon icon=\"mdi:arrow-left\" className=\"mr-2\" width={16} />\n {tr(\n \"fluidgrids.nodes.nodesPage.backToWorkflowsButton\",\n \"Back to Workflows\",\n )}\n </Button>\n </div>\n </div>\n\n {/* Stats */}\n <div className=\"grid grid-cols-3 gap-3 mb-6\">\n <div className=\"p-3 rounded-lg bg-background-secondary border border-border-secondary\">\n <div className=\"flex items-center gap-2\">\n <Icon\n icon=\"mdi:puzzle\"\n width={18}\n className=\"text-text-secondary\"\n />\n <p className=\"text-xs text-text-secondary\">\n {tr(\"fluidgrids.nodes.nodesPage.statTotal\", \"Total Nodes\")}\n </p>\n </div>\n <p className=\"text-xl font-bold text-text-primary mt-1\">\n {loading ? \"—\" : stats.total}\n </p>\n </div>\n <div className=\"p-3 rounded-lg bg-background-secondary border border-border-secondary\">\n <div className=\"flex items-center gap-2\">\n <Icon\n icon=\"mdi:check-circle\"\n width={18}\n className=\"text-emerald-400\"\n />\n <p className=\"text-xs text-text-secondary\">\n {tr(\"fluidgrids.nodes.nodesPage.statActive\", \"Active\")}\n </p>\n </div>\n <p className=\"text-xl font-bold text-emerald-400 mt-1\">\n {loading ? \"—\" : stats.active}\n </p>\n </div>\n <div className=\"p-3 rounded-lg bg-background-secondary border border-border-secondary\">\n <div className=\"flex items-center gap-2\">\n <Icon icon=\"mdi:alert\" width={18} className=\"text-amber-400\" />\n <p className=\"text-xs text-text-secondary\">\n {tr(\"fluidgrids.nodes.nodesPage.statDeprecated\", \"Deprecated\")}\n </p>\n </div>\n <p className=\"text-xl font-bold text-amber-400 mt-1\">\n {loading ? \"—\" : stats.deprecated}\n </p>\n </div>\n </div>\n\n {/* Search */}\n <div className=\"relative max-w-md mb-6\">\n <Icon\n icon=\"mdi:magnify\"\n width={18}\n className=\"absolute left-3 top-1/2 -translate-y-1/2 text-text-secondary\"\n />\n <Input\n placeholder={tr(\n \"fluidgrids.nodes.nodesPage.searchPlaceholder\",\n \"Search nodes by name, type, or keyword...\",\n )}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"pl-10 bg-background-secondary border-border-secondary\"\n />\n </div>\n\n {/* Category Tabs */}\n <div className=\"flex flex-wrap gap-2 mb-6\">\n {NODE_CATEGORIES.map((cat) => {\n const count = categoryCounts[cat.value] ?? 0;\n const isActive = activeCategory === cat.value;\n return (\n <button\n key={cat.value}\n onClick={() => setActiveCategory(cat.value)}\n className={`inline-flex items-center gap-1.5 px-3 py-1.5 rounded-lg text-sm font-medium transition-colors ${\n isActive\n ? \"bg-background-tertiary text-text-primary border border-border-primary\"\n : \"bg-background-secondary text-text-secondary border border-border-secondary hover:text-text-primary hover:border-border-primary\"\n }`}\n >\n <Icon icon={cat.icon} width={16} />\n {cat.label}\n <span\n className={`ml-0.5 text-xs ${isActive ? \"text-text-primary\" : \"text-text-secondary\"}`}\n >\n ({count})\n </span>\n </button>\n );\n })}\n </div>\n\n {/* Error State */}\n {error && (\n <div className=\"mb-6\">\n <ErrorState message={error.message} onRetry={refetch} />\n </div>\n )}\n\n {/* Content */}\n {loading ? (\n <NodesSkeleton />\n ) : filtered.length === 0 ? (\n <EmptyState\n hasFilters={search.trim().length > 0 || activeCategory !== \"all\"}\n />\n ) : (\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4\">\n {filtered.map(({ node, category }) => (\n <NodeCard key={node.id} node={node} category={category} />\n ))}\n </div>\n )}\n </div>\n );\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { useExecutionsStore, useExecutionsWithStore, useExecutionStats, useExecutionActions, useAutoRefresh, ExecutionStats, ExecutionFilters, ExecutionTable, ExecutionCards, ExecutionTimeline, Pagination } from './chunk-EUZZLC3N.js';
2
- import { useWorkflowDefinitions } from './chunk-CVVNQCFM.js';
1
+ import { useExecutionsStore, useExecutionsWithStore, useExecutionStats, useExecutionActions, useAutoRefresh, ExecutionStats, ExecutionFilters, ExecutionTable, ExecutionCards, ExecutionTimeline, Pagination } from './chunk-HNVWIVJH.js';
2
+ import { useWorkflowDefinitions } from './chunk-Q4RPP67K.js';
3
3
  import { useTr } from './chunk-7YWBH2A5.js';
4
4
  import { useRef, useCallback, useMemo } from 'react';
5
5
  import { useNavigate, useSearchParams } from 'react-router';
@@ -38,7 +38,13 @@ function ExecutionsListPage() {
38
38
  refetch: refetchStats
39
39
  } = useExecutionStats();
40
40
  const { workflows } = useWorkflowDefinitions({ limit: 100 });
41
- const { cancelExecution, pauseExecution, resumeExecution, retryExecution } = useExecutionActions();
41
+ const {
42
+ cancelExecution,
43
+ pauseExecution,
44
+ resumeExecution,
45
+ retryExecution,
46
+ retryExecutions
47
+ } = useExecutionActions();
42
48
  useAutoRefresh(
43
49
  useCallback(() => {
44
50
  refetch();
@@ -120,6 +126,27 @@ function ExecutionsListPage() {
120
126
  const handleFilterByStatus = (status) => {
121
127
  setStatusFilter(status);
122
128
  };
129
+ const handleBulkRetry = async () => {
130
+ if (selection.runIds.length === 0) return;
131
+ const retried = await retryExecutions(selection.runIds.slice(0, 10));
132
+ if (retried.length === 0) {
133
+ toast.error(
134
+ tr(
135
+ "fluidgrids.executions.executionsList.bulkRetryFailed",
136
+ "Could not retry the selected runs"
137
+ )
138
+ );
139
+ return;
140
+ }
141
+ toast.success(
142
+ tr(
143
+ "fluidgrids.executions.executionsList.bulkRetryStarted",
144
+ `${retried.length} new run${retried.length === 1 ? "" : "s"} started`
145
+ )
146
+ );
147
+ clearSelection();
148
+ refetch();
149
+ };
123
150
  const handleBulkAction = async (action) => {
124
151
  if (selection.runIds.length === 0) return;
125
152
  const promises = selection.runIds.map((id) => {
@@ -228,6 +255,21 @@ function ExecutionsListPage() {
228
255
  )
229
256
  ] }),
230
257
  /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
258
+ /* @__PURE__ */ jsxs(
259
+ Button,
260
+ {
261
+ variant: "outline",
262
+ size: "sm",
263
+ onClick: () => void handleBulkRetry(),
264
+ children: [
265
+ /* @__PURE__ */ jsx(Icon, { icon: "mdi:refresh", className: "mr-1", width: 14 }),
266
+ tr(
267
+ "fluidgrids.executions.executionsList.bulkRetryButton",
268
+ "Retry selected"
269
+ )
270
+ ]
271
+ }
272
+ ),
231
273
  /* @__PURE__ */ jsxs(
232
274
  Button,
233
275
  {
@@ -340,5 +382,5 @@ function ExecutionsListPage() {
340
382
  }
341
383
 
342
384
  export { ExecutionsListPage };
343
- //# sourceMappingURL=chunk-R6JFXZXN.js.map
344
- //# sourceMappingURL=chunk-R6JFXZXN.js.map
385
+ //# sourceMappingURL=chunk-VTPBYPDV.js.map
386
+ //# sourceMappingURL=chunk-VTPBYPDV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/modules/executions/pages/ExecutionsListPage.tsx"],"names":[],"mappings":"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","file":"chunk-VTPBYPDV.js","sourcesContent":["import { useCallback, useMemo, useRef } from \"react\";\nimport { useNavigate, useSearchParams } from \"react-router\";\nimport { Icon } from \"@iconify/react\";\nimport { toast } from \"sonner\";\nimport { Button } from \"@burdenoff/fe-libs/button\";\nimport {\n ExecutionFilters,\n ExecutionStats,\n ExecutionTable,\n ExecutionCards,\n ExecutionTimeline,\n Pagination,\n} from \"../components\";\nimport { useExecutionsStore } from \"../store/executionsStore\";\nimport {\n useExecutionsWithStore,\n useExecutionStats,\n useExecutionActions,\n useAutoRefresh,\n} from \"../hooks/useExecutions\";\nimport { useWorkflowDefinitions } from \"../../../hooks/useWorkflows\";\nimport type { WorkflowRun, RunStatus, ExecutionAction } from \"../types\";\nimport { useTr } from \"../../../hooks/useTr\";\n\nexport function ExecutionsListPage() {\n const tr = useTr();\n const navigate = useNavigate();\n\n // Store state\n const {\n viewMode,\n setViewMode,\n setSelectedExecution,\n selection,\n clearSelection,\n setStatusFilter,\n setWorkflowFilter,\n autoRefresh,\n autoRefreshInterval,\n } = useExecutionsStore();\n\n // Seed the workflow filter from the URL (?workflowKey=...) synchronously —\n // BEFORE useExecutionsWithStore() below reads it — so the first runs query\n // already carries the filter and no stale unfiltered request is fired. Lets\n // \"View Runs\" in the builder open this list scoped to one workflow; arriving\n // without the param (e.g. the sidebar \"Runs\" link) clears any stale filter.\n // Sync only when the URL param actually changes (tracked via a ref) so manual\n // dropdown changes — which update the store but not the URL — aren't reverted.\n const [searchParams] = useSearchParams();\n const workflowKeyParam = searchParams.get(\"workflowKey\") ?? \"\";\n const lastWorkflowKeyParam = useRef<string | null>(null);\n if (lastWorkflowKeyParam.current !== workflowKeyParam) {\n lastWorkflowKeyParam.current = workflowKeyParam;\n if (useExecutionsStore.getState().filter.workflowKey !== workflowKeyParam) {\n setWorkflowFilter(workflowKeyParam);\n }\n }\n\n // Data fetching\n const { executions, total, loading, error, refetch } =\n useExecutionsWithStore();\n const {\n stats,\n loading: statsLoading,\n refetch: refetchStats,\n } = useExecutionStats();\n const { workflows } = useWorkflowDefinitions({ limit: 100 });\n const {\n cancelExecution,\n pauseExecution,\n resumeExecution,\n retryExecution,\n retryExecutions,\n } = useExecutionActions();\n\n // Auto-refresh\n useAutoRefresh(\n useCallback(() => {\n refetch();\n refetchStats();\n }, [refetch, refetchStats]),\n autoRefresh,\n autoRefreshInterval,\n );\n\n // Transform stats for component\n const executionStats = useMemo(() => {\n if (!stats) return null;\n return {\n total: stats.runsCountTotal,\n running: stats.runsRunningCount,\n completed: stats.runsCompletedCount,\n failed: stats.runsFailedCount,\n cancelled: stats.runsCancelledCount ?? 0,\n pending: stats.runsPendingCount,\n waiting: stats.runsWaitingCount ?? 0,\n successRate: stats.workflowSuccessRate,\n avgDuration: stats.avgWorkflowExecutionTimeSeconds,\n };\n }, [stats]);\n\n // Transform workflows for filter\n const workflowOptions = useMemo(\n () =>\n workflows.map((w) => ({\n workflowKey: w.workflowKey,\n name: w.name,\n })),\n [workflows],\n );\n\n // workflowKey → name fallback for run rows whose workflow relation is\n // missing (e.g. before the backend include rolled out).\n const workflowNames = useMemo(() => {\n const map: Record<string, string> = {};\n for (const w of workflows) map[w.workflowKey] = w.name;\n return map;\n }, [workflows]);\n\n // Handlers\n const handleRowClick = (execution: WorkflowRun) => {\n setSelectedExecution(execution);\n navigate(`../runs/${execution.id}`);\n };\n\n // Retry starts a NEW run of the same pinned version, from the same trigger\n // node and with the same trigger payload (BOFF-7269). It used to navigate to\n // the run's detail page, which only offers per-node retry, so nothing ran.\n const handleRetry = async (execution: WorkflowRun) => {\n const result = await retryExecution(execution);\n if (!result.ok) {\n toast.error(\n tr(\n \"fluidgrids.executions.executionsList.retryFailed\",\n \"Could not start a new run\",\n ),\n { description: result.message },\n );\n return;\n }\n toast.success(\n tr(\n \"fluidgrids.executions.executionsList.retryStarted\",\n \"New run started\",\n ),\n );\n navigate(`../runs/${result.run.runId}`);\n };\n\n const handleAction = async (\n action: ExecutionAction,\n execution: WorkflowRun,\n ) => {\n switch (action) {\n case \"cancel\":\n await cancelExecution(execution.id);\n break;\n case \"pause\":\n await pauseExecution(execution.id);\n break;\n case \"resume\":\n await resumeExecution(execution.id);\n break;\n case \"retry\":\n await handleRetry(execution);\n break;\n case \"view\":\n navigate(`../runs/${execution.id}`);\n break;\n }\n refetch();\n };\n\n const handleFilterByStatus = (status: RunStatus | \"all\") => {\n setStatusFilter(status);\n };\n\n const handleBulkRetry = async () => {\n if (selection.runIds.length === 0) return;\n const retried = await retryExecutions(selection.runIds.slice(0, 10));\n if (retried.length === 0) {\n toast.error(\n tr(\n \"fluidgrids.executions.executionsList.bulkRetryFailed\",\n \"Could not retry the selected runs\",\n ),\n );\n return;\n }\n toast.success(\n tr(\n \"fluidgrids.executions.executionsList.bulkRetryStarted\",\n `${retried.length} new run${retried.length === 1 ? \"\" : \"s\"} started`,\n ),\n );\n clearSelection();\n refetch();\n };\n\n const handleBulkAction = async (action: \"cancel\" | \"pause\" | \"resume\") => {\n if (selection.runIds.length === 0) return;\n\n const promises = selection.runIds.map((id) => {\n switch (action) {\n case \"cancel\":\n return cancelExecution(id);\n case \"pause\":\n return pauseExecution(id);\n case \"resume\":\n return resumeExecution(id);\n }\n });\n\n const results = await Promise.allSettled(promises);\n const failures = results.filter((r) => r.status === \"rejected\");\n if (failures.length > 0) {\n console.error(\n `Bulk action partially failed: ${failures.length}/${results.length} failed`,\n );\n }\n clearSelection();\n refetch();\n };\n\n return (\n <div className=\"p-4 sm:p-6 bg-background-primary min-h-screen\">\n {/* Header */}\n <div\n className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 mb-6\"\n data-tour=\"fluidgrids-runs-header\"\n >\n <div>\n <h1 className=\"text-2xl sm:text-3xl font-bold text-text-primary\">\n {tr(\"fluidgrids.executions.executionsList.title\", \"Executions\")}\n </h1>\n <p className=\"text-text-secondary mt-1\">\n {tr(\n \"fluidgrids.executions.executionsList.subtitle\",\n \"Monitor and manage your workflow runs\",\n )}\n </p>\n </div>\n <div className=\"flex items-center gap-3\">\n {/* View Mode Toggle */}\n <div className=\"flex items-center bg-background-secondary rounded-lg border border-border-secondary p-1\">\n <button\n onClick={() => setViewMode(\"table\")}\n className={`p-2 rounded ${\n viewMode === \"table\"\n ? \"bg-background-tertiary text-text-primary\"\n : \"text-text-secondary hover:text-text-primary\"\n }`}\n title={tr(\n \"fluidgrids.executions.executionsList.tableViewTooltip\",\n \"Table View\",\n )}\n >\n <Icon icon=\"mdi:table\" width={18} />\n </button>\n <button\n onClick={() => setViewMode(\"cards\")}\n className={`p-2 rounded ${\n viewMode === \"cards\"\n ? \"bg-background-tertiary text-text-primary\"\n : \"text-text-secondary hover:text-text-primary\"\n }`}\n title={tr(\n \"fluidgrids.executions.executionsList.cardViewTooltip\",\n \"Card View\",\n )}\n >\n <Icon icon=\"mdi:view-grid\" width={18} />\n </button>\n <button\n onClick={() => setViewMode(\"timeline\")}\n className={`p-2 rounded ${\n viewMode === \"timeline\"\n ? \"bg-background-tertiary text-text-primary\"\n : \"text-text-secondary hover:text-text-primary\"\n }`}\n title={tr(\n \"fluidgrids.executions.executionsList.timelineViewTooltip\",\n \"Timeline View\",\n )}\n >\n <Icon icon=\"mdi:timeline\" width={18} />\n </button>\n </div>\n\n <Button variant=\"outline\" onClick={() => navigate(\"../list\")}>\n <Icon icon=\"mdi:arrow-left\" className=\"mr-2\" width={16} />\n {tr(\n \"fluidgrids.executions.executionsList.backToWorkflows\",\n \"Back to Workflows\",\n )}\n </Button>\n </div>\n </div>\n\n {/* Stats Cards */}\n <div className=\"mb-6\" data-tour=\"fluidgrids-runs-stats\">\n <ExecutionStats\n stats={executionStats}\n loading={statsLoading}\n onFilterByStatus={handleFilterByStatus}\n />\n </div>\n\n {/* Filters */}\n <div className=\"mb-6\" data-tour=\"fluidgrids-runs-filters\">\n <ExecutionFilters workflows={workflowOptions} onRefresh={refetch} />\n </div>\n\n {/* Bulk Actions */}\n {selection.runIds.length > 0 && (\n <div className=\"mb-4 p-3 bg-action-primary-bg/10 rounded-lg flex flex-wrap items-center gap-3\">\n <span className=\"text-sm text-text-primary\">\n {selection.runIds.length}{\" \"}\n {selection.runIds.length > 1\n ? tr(\n \"fluidgrids.executions.executionsList.selectionCountPlural\",\n \"executions selected\",\n )\n : tr(\n \"fluidgrids.executions.executionsList.selectionCountSingular\",\n \"execution selected\",\n )}\n </span>\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => void handleBulkRetry()}\n >\n <Icon icon=\"mdi:refresh\" className=\"mr-1\" width={14} />\n {tr(\n \"fluidgrids.executions.executionsList.bulkRetryButton\",\n \"Retry selected\",\n )}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => handleBulkAction(\"cancel\")}\n >\n <Icon icon=\"mdi:stop\" className=\"mr-1\" width={14} />\n {tr(\n \"fluidgrids.executions.executionsList.bulkCancelButton\",\n \"Cancel\",\n )}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => handleBulkAction(\"pause\")}\n >\n <Icon icon=\"mdi:pause\" className=\"mr-1\" width={14} />\n {tr(\n \"fluidgrids.executions.executionsList.bulkPauseButton\",\n \"Pause\",\n )}\n </Button>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => handleBulkAction(\"resume\")}\n >\n <Icon icon=\"mdi:play\" className=\"mr-1\" width={14} />\n {tr(\n \"fluidgrids.executions.executionsList.bulkResumeButton\",\n \"Resume\",\n )}\n </Button>\n </div>\n <button\n onClick={clearSelection}\n className=\"ml-auto text-sm text-text-secondary hover:text-text-primary\"\n >\n {tr(\n \"fluidgrids.executions.executionsList.clearSelection\",\n \"Clear selection\",\n )}\n </button>\n </div>\n )}\n\n {/* Error State */}\n {error && (\n <div className=\"mb-6 p-4 bg-[var(--color-status-error-bg-subtle)] border border-[var(--color-status-error-border)] rounded-lg\">\n <div className=\"flex items-center gap-2 text-[var(--color-status-error-text)]\">\n <Icon icon=\"mdi:alert-circle\" width={20} />\n <span className=\"font-medium\">\n {tr(\n \"fluidgrids.executions.executionsList.loadErrorTitle\",\n \"Error loading executions\",\n )}\n </span>\n </div>\n <p className=\"mt-1 text-sm text-[var(--color-status-error-text)]\">\n {error.message}\n </p>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={refetch}\n className=\"mt-3 border-[var(--color-status-error-border)] text-[var(--color-status-error-text)] hover:bg-[var(--color-status-error-bg-subtle)]\"\n >\n {tr(\"fluidgrids.executions.executionsList.retryButton\", \"Retry\")}\n </Button>\n </div>\n )}\n\n {/* Executions View — switches between table, cards, and timeline */}\n {viewMode === \"table\" && (\n <ExecutionTable\n workflowNames={workflowNames}\n executions={executions}\n loading={loading}\n onRowClick={handleRowClick}\n onAction={handleAction}\n />\n )}\n {viewMode === \"cards\" && (\n <ExecutionCards\n workflowNames={workflowNames}\n executions={executions}\n loading={loading}\n onCardClick={handleRowClick}\n onAction={handleAction}\n />\n )}\n {viewMode === \"timeline\" && (\n <ExecutionTimeline\n executions={executions}\n loading={loading}\n onItemClick={handleRowClick}\n onAction={handleAction}\n />\n )}\n\n {/* Pagination */}\n <Pagination totalItems={total} />\n </div>\n );\n}\n"]}