@burdenoff/fluidgrids-fe-sdk 2026.804.1 → 2026.804.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ExecutionDetailPage-FF2DYKAZ.js +10 -0
- package/dist/{ExecutionDetailPage-FCY3S336.js.map → ExecutionDetailPage-FF2DYKAZ.js.map} +1 -1
- package/dist/ExecutionsListPage-NKISRFMA.js +9 -0
- package/dist/{ExecutionsListPage-IZJPACQV.js.map → ExecutionsListPage-NKISRFMA.js.map} +1 -1
- package/dist/{MissingNodesInstallModal-OT3LJZ4M.js → MissingNodesInstallModal-HA5L3FK2.js} +4 -3
- package/dist/MissingNodesInstallModal-HA5L3FK2.js.map +1 -0
- package/dist/{TemplateConfigurationModal-7OT6QBEA.js → TemplateConfigurationModal-MXNGZQIC.js} +90 -21
- package/dist/TemplateConfigurationModal-MXNGZQIC.js.map +1 -0
- package/dist/{TemplateDetailPanel-T3ZHXOHX.js → TemplateDetailPanel-CJ3NPVTP.js} +50 -14
- package/dist/TemplateDetailPanel-CJ3NPVTP.js.map +1 -0
- package/dist/{WorkflowBuilder-42S2S3PO.js → WorkflowBuilder-ETVB66U6.js} +6 -5
- package/dist/{WorkflowBuilder-42S2S3PO.js.map → WorkflowBuilder-ETVB66U6.js.map} +1 -1
- package/dist/WorkflowsList-TZAN3YBA.js +11 -0
- package/dist/{WorkflowsList-L7EJW54K.js.map → WorkflowsList-TZAN3YBA.js.map} +1 -1
- package/dist/{chunk-WAVGHDYH.js → chunk-6PNRM3KQ.js} +469 -114
- package/dist/chunk-6PNRM3KQ.js.map +1 -0
- package/dist/chunk-7VNIEIR6.js +21 -0
- package/dist/chunk-7VNIEIR6.js.map +1 -0
- package/dist/{chunk-F5ACDIYR.js → chunk-IWKLEFC7.js} +205 -51
- package/dist/chunk-IWKLEFC7.js.map +1 -0
- package/dist/{chunk-BRMURCHH.js → chunk-OHGXRM6Z.js} +5 -3
- package/dist/chunk-OHGXRM6Z.js.map +1 -0
- package/dist/{chunk-CQAHXNT2.js → chunk-SG7Z2IRQ.js} +55 -18
- package/dist/chunk-SG7Z2IRQ.js.map +1 -0
- package/dist/{chunk-CN3VSAYR.js → chunk-WQ4QNHDN.js} +4600 -1229
- package/dist/chunk-WQ4QNHDN.js.map +1 -0
- package/dist/{chunk-JPHK5LAL.js → chunk-Y36DJHU3.js} +24 -8
- package/dist/chunk-Y36DJHU3.js.map +1 -0
- package/dist/{chunk-S7FNNFPU.js → chunk-YJKZSUNC.js} +140 -46
- package/dist/chunk-YJKZSUNC.js.map +1 -0
- package/dist/index.d.ts +33 -2
- package/dist/index.js +637 -174
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/ExecutionDetailPage-FCY3S336.js +0 -9
- package/dist/ExecutionsListPage-IZJPACQV.js +0 -8
- package/dist/MissingNodesInstallModal-OT3LJZ4M.js.map +0 -1
- package/dist/TemplateConfigurationModal-7OT6QBEA.js.map +0 -1
- package/dist/TemplateDetailPanel-T3ZHXOHX.js.map +0 -1
- package/dist/WorkflowsList-L7EJW54K.js +0 -10
- package/dist/chunk-BRMURCHH.js.map +0 -1
- package/dist/chunk-CN3VSAYR.js.map +0 -1
- package/dist/chunk-CQAHXNT2.js.map +0 -1
- package/dist/chunk-F5ACDIYR.js.map +0 -1
- package/dist/chunk-JPHK5LAL.js.map +0 -1
- package/dist/chunk-S7FNNFPU.js.map +0 -1
- package/dist/chunk-WAVGHDYH.js.map +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { FluidgridsEntityTagsDocument, AvailableFluidgridsTagsDocument, SearchFluidgridsTagsDocument, TagFluidgridsEntityDocument, UntagFluidgridsEntityDocument, ReplaceFluidgridsEntityTagsDocument, CreateFluidgridsTagDocument, WorkflowDefinitionsTagsDocument } from './chunk-V5UEEB74.js';
|
|
2
2
|
import { getFluidGridsClient } from './chunk-5BDQNSP3.js';
|
|
3
|
+
import { useTr } from './chunk-7VNIEIR6.js';
|
|
3
4
|
import { nanoid } from 'nanoid/non-secure';
|
|
4
5
|
import { addEdge, applyEdgeChanges, applyNodeChanges } from '@xyflow/react';
|
|
5
6
|
import { create } from 'zustand';
|
|
@@ -515,21 +516,36 @@ function QuotaExhaustedDialog({
|
|
|
515
516
|
open,
|
|
516
517
|
onOpenChange,
|
|
517
518
|
onUpgrade,
|
|
518
|
-
title
|
|
519
|
-
description
|
|
519
|
+
title,
|
|
520
|
+
description
|
|
520
521
|
}) {
|
|
522
|
+
const tr = useTr();
|
|
523
|
+
const resolvedTitle = title ?? tr(
|
|
524
|
+
"fluidgrids.components.quotaExhaustedDialog.title",
|
|
525
|
+
"Workflow Limit Reached"
|
|
526
|
+
);
|
|
527
|
+
const resolvedDescription = description ?? tr(
|
|
528
|
+
"fluidgrids.components.quotaExhaustedDialog.description",
|
|
529
|
+
"You've reached the workflow limit for your plan. Upgrade your plan to create more workflows."
|
|
530
|
+
);
|
|
521
531
|
return /* @__PURE__ */ jsx(AlertDialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs(AlertDialogContent, { children: [
|
|
522
532
|
/* @__PURE__ */ jsxs(AlertDialogHeader, { children: [
|
|
523
|
-
/* @__PURE__ */ jsx(AlertDialogTitle, { children:
|
|
524
|
-
/* @__PURE__ */ jsx(AlertDialogDescription, { children:
|
|
533
|
+
/* @__PURE__ */ jsx(AlertDialogTitle, { children: resolvedTitle }),
|
|
534
|
+
/* @__PURE__ */ jsx(AlertDialogDescription, { children: resolvedDescription })
|
|
525
535
|
] }),
|
|
526
536
|
/* @__PURE__ */ jsxs(AlertDialogFooter, { children: [
|
|
527
|
-
/* @__PURE__ */ jsx(AlertDialogCancel, { children:
|
|
528
|
-
|
|
537
|
+
/* @__PURE__ */ jsx(AlertDialogCancel, { children: tr(
|
|
538
|
+
"fluidgrids.components.quotaExhaustedDialog.dismiss",
|
|
539
|
+
"Dismiss"
|
|
540
|
+
) }),
|
|
541
|
+
/* @__PURE__ */ jsx(AlertDialogAction, { onClick: onUpgrade, children: tr(
|
|
542
|
+
"fluidgrids.components.quotaExhaustedDialog.viewBilling",
|
|
543
|
+
"View Billing"
|
|
544
|
+
) })
|
|
529
545
|
] })
|
|
530
546
|
] }) });
|
|
531
547
|
}
|
|
532
548
|
|
|
533
549
|
export { FLUIDGRIDS_ENTITY_TYPES, QuotaExhaustedDialog, tagLabel, useAvailableTags, useCreateTag, useDraftEntityTags, useEntityTags, useFlowStore, useReplaceEntityTags, useSearchTags, useTagEntity, useUntagEntity, useWorkflowTagOverlay };
|
|
534
|
-
//# sourceMappingURL=chunk-
|
|
535
|
-
//# sourceMappingURL=chunk-
|
|
550
|
+
//# sourceMappingURL=chunk-Y36DJHU3.js.map
|
|
551
|
+
//# sourceMappingURL=chunk-Y36DJHU3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/builder/stores/flow-store.ts","../src/hooks/useEntityTags.ts","../src/components/shared/QuotaExhaustedDialog.tsx"],"names":[],"mappings":"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","file":"chunk-Y36DJHU3.js","sourcesContent":["import { nanoid } from \"nanoid/non-secure\";\nimport {\n addEdge,\n applyEdgeChanges,\n applyNodeChanges,\n type Connection,\n type Edge,\n type EdgeChange,\n type Node,\n type NodeChange,\n} from \"@xyflow/react\";\nimport { create } from \"zustand\";\nimport { produce } from \"immer\";\nimport type {\n ExtendedNodeType,\n FlowNode,\n FlowEdge,\n EdgeCondition,\n EdgeMapping,\n} from \"../../types/node\";\nimport type { Tag } from \"../../types/workflow\";\nimport type { ExecutionLog } from \"../../types/execution\";\n\n// Node execution state for visual display\nexport interface NodeExecutionState {\n status: \"idle\" | \"running\" | \"success\" | \"error\";\n itemCount?: number;\n error?: string;\n}\n\n// Execution state for step execution feature\ninterface ExecutionState {\n isExecuting: boolean;\n executingNodeId: string | null;\n currentRunId: string | null;\n logs: ExecutionLog[];\n selectedLogId: string | null;\n panelExpanded: boolean;\n nodeStatuses: Record<string, \"idle\" | \"running\" | \"success\" | \"error\">;\n nodeItemCounts: Record<string, number>;\n}\n\ninterface CustomEdgeProps extends Edge {\n condition?: EdgeCondition;\n mapping?: EdgeMapping;\n}\n\ninterface State {\n nodes: Node[];\n edges: CustomEdgeProps[];\n /** Node currently open in the n8n-style 3-pane Node Detail View modal. */\n ndv?: { nodeId: string; type: ExtendedNodeType } | null;\n /**\n * Node currently open in the single-click floating quick-config panel\n * (Make-style, attached beside the node). The panel derives its own screen\n * position from the node's live rect, so no anchor is stored here.\n */\n quickConfig?: {\n nodeId: string;\n type: ExtendedNodeType;\n } | null;\n /**\n * Source handle awaiting attachment via the Node Store (the n8n-style \"+\"\n * button on an output handle). While set, clicking an operation in the\n * store panel creates the node and wires it to this handle.\n */\n pendingConnection?: { nodeId: string; handleId: string } | null;\n sidebar: {\n active: \"node-properties\" | \"store-browse\" | \"none\";\n panels: {\n nodeProperties: {\n selectedNode: { id: string; type: ExtendedNodeType } | null | undefined;\n };\n };\n };\n}\n\ninterface Actions {\n actions: {\n saveWorkflow: () => {\n id: string;\n name: string;\n version: string;\n alias?: string;\n dbId?: string;\n status?: string;\n nodes: Node[];\n edges: Edge[];\n };\n setWorkflow: (workflow: Partial<IFlowState[\"workflow\"]>) => void;\n resetWorkflow: () => void;\n nodes: {\n onNodesChange: (changes: NodeChange[]) => void;\n setNodes: (nodes: Node[]) => void;\n deleteNode: (node: Node) => void;\n };\n edges: {\n onEdgesChange: (changes: EdgeChange[]) => void;\n onConnect: (connection: Connection) => void;\n setEdges: (edges: Edge[]) => void;\n deleteEdge: (edge: Edge) => void;\n };\n ndv: {\n open: (node: { nodeId: string; type: ExtendedNodeType }) => void;\n close: () => void;\n };\n quickConfig: {\n open: (node: { nodeId: string; type: ExtendedNodeType }) => void;\n close: () => void;\n };\n pendingConnection: {\n /** Arm attach mode for a source handle and open the Node Store panel. */\n start: (connection: { nodeId: string; handleId: string }) => void;\n clear: () => void;\n };\n sidebar: {\n setActivePanel: (\n panel: \"node-properties\" | \"store-browse\" | \"none\",\n ) => void;\n showNodePropertiesOf: (node: {\n id: string;\n type: ExtendedNodeType;\n block?: string;\n }) => void;\n panels: {\n nodeProperties: {\n setSelectedNode: (\n node: { id: string; type: ExtendedNodeType } | undefined | null,\n ) => void;\n };\n tags: {\n setTags: (tags: Tag[]) => void;\n createTag: (tag: Tag) => void;\n deleteTag: (tag: Tag) => void;\n updateTag: (tag: Tag, newTag: Tag) => void;\n };\n };\n };\n };\n}\n\nexport interface IFlowState {\n tags: Tag[];\n workflow: {\n id: string;\n workflowKey: string;\n name: string;\n version: string;\n alias?: string;\n /** Database row ID (used for updateWorkflowDefinition) */\n dbId?: string;\n /** Current workflow status: DRAFT | ACTIVE | ARCHIVED | DEPRECATED */\n status?: string;\n } & State;\n execution: ExecutionState;\n actions: Actions[\"actions\"] & {\n execution: {\n startExecution: (nodeId: string, runId: string) => void;\n addLog: (log: ExecutionLog) => void;\n updateLog: (logId: string, updates: Partial<ExecutionLog>) => void;\n setNodeStatus: (\n nodeId: string,\n status: \"idle\" | \"running\" | \"success\" | \"error\",\n ) => void;\n setNodeItemCount: (nodeId: string, count: number) => void;\n selectLog: (logId: string | null) => void;\n togglePanel: () => void;\n clearLogs: () => void;\n completeExecution: () => void;\n };\n };\n}\n\nconst TAGS: Tag[] = [\n { value: \"marketing\", label: \"Marketing\", color: \"#ef4444\" },\n { value: \"support\", label: \"Support\", color: \"#ef4444\" },\n { value: \"lead\", label: \"Lead\", color: \"#eab308\" },\n { value: \"new\", label: \"New\", color: \"#22c55e\" },\n];\n\n/**\n * Pristine execution state. The `execution` slice is global (one run at a\n * time), so it MUST be reset whenever a different workflow is loaded —\n * otherwise the previous workflow's run logs leak into the next workflow's\n * Logs panel. Shared by the store initializer and `resetWorkflow`.\n */\nconst INITIAL_EXECUTION: ExecutionState = {\n isExecuting: false,\n executingNodeId: null,\n currentRunId: null,\n logs: [],\n selectedLogId: null,\n panelExpanded: false,\n nodeStatuses: {},\n nodeItemCounts: {},\n};\n\nexport const useFlowStore = create<IFlowState>()((set, get) => ({\n tags: TAGS,\n workflow: {\n id: nanoid(),\n workflowKey: \"\",\n name: \"\",\n version: \"\",\n alias: \"\",\n edges: [],\n nodes: [],\n ndv: null,\n quickConfig: null,\n pendingConnection: null,\n sidebar: {\n active: \"none\",\n panels: {\n nodeProperties: {\n selectedNode: null,\n },\n },\n },\n },\n execution: { ...INITIAL_EXECUTION },\n actions: {\n saveWorkflow: () => {\n const { workflow } = get();\n const { id, name, version, alias, dbId, status, nodes, edges } = workflow;\n set({ workflow });\n return { id, name, version, alias, dbId, status, nodes, edges };\n },\n setWorkflow: (workflow: Partial<IFlowState[\"workflow\"]>) => {\n set((state) => ({\n workflow: {\n ...state.workflow,\n ...workflow,\n },\n }));\n },\n resetWorkflow: () => {\n set(() => ({\n workflow: {\n id: nanoid(),\n workflowKey: \"\",\n name: \"\",\n version: \"\",\n alias: \"\",\n dbId: undefined,\n status: undefined,\n edges: [],\n nodes: [],\n ndv: null,\n quickConfig: null,\n pendingConnection: null,\n sidebar: {\n active: \"none\",\n panels: {\n nodeProperties: {\n selectedNode: null,\n },\n },\n },\n },\n // Wipe run state too — resetWorkflow fires when the builder loads a\n // (different) workflow, so the previous workflow's logs must not carry\n // over into this one's Logs panel.\n execution: { ...INITIAL_EXECUTION },\n }));\n },\n ndv: {\n // Opening the full NDV supersedes the floating quick-config panel — the\n // two edit the same node data, so only one should be visible at a time.\n open: (node: { nodeId: string; type: ExtendedNodeType }) =>\n set((state) => ({\n workflow: { ...state.workflow, ndv: node, quickConfig: null },\n })),\n close: () =>\n set((state) => ({\n workflow: { ...state.workflow, ndv: null },\n })),\n },\n quickConfig: {\n open: (node: { nodeId: string; type: ExtendedNodeType }) =>\n set((state) => ({\n workflow: { ...state.workflow, quickConfig: node },\n })),\n close: () =>\n set((state) => ({\n workflow: { ...state.workflow, quickConfig: null },\n })),\n },\n pendingConnection: {\n start: (connection: { nodeId: string; handleId: string }) =>\n set((state) => ({\n workflow: {\n ...state.workflow,\n pendingConnection: connection,\n sidebar: { ...state.workflow.sidebar, active: \"store-browse\" },\n },\n })),\n clear: () =>\n set((state) => ({\n workflow: { ...state.workflow, pendingConnection: null },\n })),\n },\n sidebar: {\n // Leaving the store panel abandons any armed \"+\" attach mode — the\n // pending handle would otherwise silently capture a later insert.\n setActivePanel: (panel: \"node-properties\" | \"store-browse\" | \"none\") =>\n set((state) => ({\n workflow: {\n ...state.workflow,\n sidebar: { ...state.workflow.sidebar, active: panel },\n ...(panel !== \"store-browse\" ? { pendingConnection: null } : {}),\n },\n })),\n showNodePropertiesOf: (node: { id: string; type: ExtendedNodeType }) => {\n set((state) => ({\n workflow: {\n ...state.workflow,\n pendingConnection: null,\n sidebar: {\n ...state.workflow.sidebar,\n active: \"node-properties\",\n panels: {\n ...state.workflow.sidebar.panels,\n nodeProperties: {\n ...state.workflow.sidebar.panels.nodeProperties,\n selectedNode: node,\n },\n },\n },\n },\n }));\n },\n panels: {\n nodeProperties: {\n setSelectedNode: (\n node: { id: string; type: ExtendedNodeType } | undefined | null,\n ) =>\n set((state) => ({\n workflow: {\n ...state.workflow,\n sidebar: {\n ...state.workflow.sidebar,\n panels: {\n ...state.workflow.sidebar.panels,\n nodeProperties: {\n ...state.workflow.sidebar.panels.nodeProperties,\n selectedNode: node,\n },\n },\n },\n },\n })),\n },\n tags: {\n setTags: (tags: Tag[]) => set({ tags }),\n createTag: (tag: Tag) =>\n set((state) => ({\n tags: [...state.tags, tag],\n })),\n updateTag: (tag: Tag, newTag: Tag) =>\n set((state) => ({\n tags: state.tags.map((f) => (f.value === tag.value ? newTag : f)),\n })),\n deleteTag: (tag: Tag) =>\n set((state) => ({\n tags: state.tags.filter((f) => f.value !== tag.value),\n })),\n },\n },\n },\n nodes: {\n onNodesChange: (changes) => {\n set((state) =>\n produce(state, (draft) => {\n const updatedNodes = applyNodeChanges(\n changes,\n draft.workflow.nodes,\n );\n draft.workflow.nodes = updatedNodes;\n }),\n );\n },\n setNodes: (nodes) => {\n set({ workflow: { ...get().workflow, nodes } });\n },\n deleteNode: (node: Node) => {\n set((state) => ({\n workflow: {\n ...state.workflow,\n nodes: state.workflow.nodes.filter((n) => n.id !== node.id),\n // Drop any UI state pointing at the removed node.\n ...(state.workflow.quickConfig?.nodeId === node.id\n ? { quickConfig: null }\n : {}),\n ...(state.workflow.pendingConnection?.nodeId === node.id\n ? { pendingConnection: null }\n : {}),\n },\n }));\n },\n },\n edges: {\n onEdgesChange: (changes) => {\n set((state) =>\n produce(state, (draft) => {\n const updatedEdges = applyEdgeChanges(\n changes,\n draft.workflow.edges,\n );\n draft.workflow.edges = updatedEdges;\n }),\n );\n },\n onConnect: (connection) => {\n const edge = { ...connection, id: nanoid(), type: \"deletable\" } as Edge;\n set({\n workflow: {\n ...get().workflow,\n edges: addEdge(edge, get().workflow.edges),\n },\n });\n },\n setEdges: (edges) => {\n set({ workflow: { ...get().workflow, edges } });\n },\n deleteEdge: (edge: Edge) => {\n set((state) => ({\n workflow: {\n ...state.workflow,\n edges: state.workflow.edges.filter((e) => e.id !== edge.id),\n },\n }));\n },\n },\n execution: {\n startExecution: (nodeId: string, runId: string) => {\n set((state) => ({\n execution: {\n ...state.execution,\n isExecuting: true,\n executingNodeId: nodeId,\n currentRunId: runId,\n panelExpanded: true,\n nodeStatuses: {\n ...state.execution.nodeStatuses,\n [nodeId]: \"running\",\n },\n },\n }));\n },\n addLog: (log: ExecutionLog) => {\n set((state) => ({\n execution: {\n ...state.execution,\n logs: [...state.execution.logs, log],\n selectedLogId: log.id,\n },\n }));\n },\n updateLog: (logId: string, updates: Partial<ExecutionLog>) => {\n set((state) => ({\n execution: {\n ...state.execution,\n logs: state.execution.logs.map((log) =>\n log.id === logId ? { ...log, ...updates } : log,\n ),\n },\n }));\n },\n setNodeStatus: (\n nodeId: string,\n status: \"idle\" | \"running\" | \"success\" | \"error\",\n ) => {\n set((state) => ({\n execution: {\n ...state.execution,\n nodeStatuses: {\n ...state.execution.nodeStatuses,\n [nodeId]: status,\n },\n },\n }));\n },\n setNodeItemCount: (nodeId: string, count: number) => {\n set((state) => ({\n execution: {\n ...state.execution,\n nodeItemCounts: {\n ...state.execution.nodeItemCounts,\n [nodeId]: count,\n },\n },\n }));\n },\n selectLog: (logId: string | null) => {\n set((state) => ({\n execution: {\n ...state.execution,\n selectedLogId: logId,\n },\n }));\n },\n togglePanel: () => {\n set((state) => ({\n execution: {\n ...state.execution,\n panelExpanded: !state.execution.panelExpanded,\n },\n }));\n },\n clearLogs: () => {\n set((state) => ({\n execution: {\n ...state.execution,\n logs: [],\n selectedLogId: null,\n nodeStatuses: {},\n nodeItemCounts: {},\n },\n }));\n },\n completeExecution: () => {\n set((state) => ({\n execution: {\n ...state.execution,\n isExecuting: false,\n executingNodeId: null,\n },\n }));\n },\n },\n },\n}));\n\n// Dev-only debug handle so the store can be inspected/driven from the browser\n// console or automated tests. No-op in production builds.\nif (typeof window !== \"undefined\" && import.meta.env?.DEV) {\n (window as unknown as Record<string, unknown>).__fgFlowStore = useFlowStore;\n}\n","/**\n * Entity tag hooks — thin wrappers over the generic FluidGrids tag API\n * (wspace-workflow-svc `tags` module → wspace-tags-svc).\n *\n * Uses the shared Apollo client directly rather than generated hooks, matching\n * the convention in useWorkflows.ts (works in embeds and other contexts that\n * mount the SDK without an ApolloProvider above them).\n */\nimport { useCallback, useEffect, useState } from \"react\";\n\nimport { getFluidGridsClient } from \"../graphql/client\";\nimport {\n AvailableFluidgridsTagsDocument,\n CreateFluidgridsTagDocument,\n FluidgridsEntityTagsDocument,\n ReplaceFluidgridsEntityTagsDocument,\n SearchFluidgridsTagsDocument,\n TagFluidgridsEntityDocument,\n UntagFluidgridsEntityDocument,\n WorkflowDefinitionsTagsDocument,\n} from \"../generated/operations\";\n\n/** Entity types accepted by the FluidGrids tag API. */\nexport const FLUIDGRIDS_ENTITY_TYPES = [\"FLUIDGRIDS_WORKFLOW\"] as const;\nexport type FluidgridsEntityType = (typeof FLUIDGRIDS_ENTITY_TYPES)[number];\n\nexport interface EntityTagAssignment {\n id: string;\n tagId: string;\n entityType: string;\n entityId: string;\n source: string;\n assignedAt?: string | null;\n tagInfo?: {\n id: string;\n key?: string | null;\n label?: string | null;\n color?: string | null;\n } | null;\n}\n\nexport interface AvailableTag {\n id: string;\n key: string;\n label: string;\n color?: string | null;\n}\n\n/** Display label for an assignment, degrading to the tag id when tags-svc omits the projection. */\nexport function tagLabel(assignment: EntityTagAssignment): string {\n return (\n assignment.tagInfo?.label ??\n assignment.tagInfo?.key ??\n assignment.tagId.slice(0, 8)\n );\n}\n\n/** Tags currently assigned to an entity. */\nexport function useEntityTags(entityType: string, entityId?: string) {\n const [tags, setTags] = useState<EntityTagAssignment[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const refetch = useCallback(async (): Promise<EntityTagAssignment[]> => {\n if (!entityId) {\n setTags([]);\n return [];\n }\n setLoading(true);\n setError(null);\n try {\n const { data } = await getFluidGridsClient().query<{\n fluidgridsEntityTags: EntityTagAssignment[];\n }>({\n query: FluidgridsEntityTagsDocument,\n variables: { input: { entityType, entityId } },\n fetchPolicy: \"network-only\",\n });\n const next = data?.fluidgridsEntityTags ?? [];\n setTags(next);\n return next;\n } catch (err) {\n setError(err as Error);\n return [];\n } finally {\n setLoading(false);\n }\n }, [entityType, entityId]);\n\n useEffect(() => {\n void refetch();\n }, [refetch]);\n\n return { tags, loading, error, refetch };\n}\n\n/** All assignable tags in the workspace. */\nexport function useAvailableTags(limit = 50, options: { skip?: boolean } = {}) {\n const [availableTags, setAvailableTags] = useState<AvailableTag[]>([]);\n const [loading, setLoading] = useState(false);\n const skip = options.skip ?? false;\n\n const fetchTags = useCallback(async () => {\n if (skip) return;\n setLoading(true);\n try {\n const { data } = await getFluidGridsClient().query<{\n availableFluidgridsTags: AvailableTag[];\n }>({\n query: AvailableFluidgridsTagsDocument,\n variables: { limit },\n fetchPolicy: \"network-only\",\n });\n setAvailableTags(data?.availableFluidgridsTags ?? []);\n } catch {\n // Non-fatal: the picker still allows inline creation.\n setAvailableTags([]);\n } finally {\n setLoading(false);\n }\n }, [limit, skip]);\n\n useEffect(() => {\n void fetchTags();\n }, [fetchTags]);\n\n return { availableTags, loading, refetch: fetchTags };\n}\n\n/** Search assignable tags by label. */\nexport function useSearchTags() {\n return useCallback(\n async (query: string, limit = 20): Promise<AvailableTag[]> => {\n if (!query.trim()) return [];\n try {\n const { data } = await getFluidGridsClient().query<{\n searchFluidgridsTags: AvailableTag[];\n }>({\n query: SearchFluidgridsTagsDocument,\n variables: { query, limit },\n fetchPolicy: \"network-only\",\n });\n return data?.searchFluidgridsTags ?? [];\n } catch {\n return [];\n }\n },\n [],\n );\n}\n\n/** Assign a tag to an entity. */\nexport function useTagEntity() {\n return useCallback(\n async (\n entityType: string,\n entityId: string,\n tagId: string,\n ): Promise<boolean> => {\n const { data } = await getFluidGridsClient().mutate<{\n tagFluidgridsEntity: EntityTagAssignment;\n }>({\n mutation: TagFluidgridsEntityDocument,\n variables: { input: { entityType, entityId, tagId, source: \"MANUAL\" } },\n });\n return Boolean(data?.tagFluidgridsEntity);\n },\n [],\n );\n}\n\n/** Remove a tag from an entity. */\nexport function useUntagEntity() {\n return useCallback(\n async (\n entityType: string,\n entityId: string,\n tagId: string,\n ): Promise<boolean> => {\n const { data } = await getFluidGridsClient().mutate<{\n untagFluidgridsEntity: boolean;\n }>({\n mutation: UntagFluidgridsEntityDocument,\n variables: { input: { entityType, entityId, tagId } },\n });\n return Boolean(data?.untagFluidgridsEntity);\n },\n [],\n );\n}\n\n/** Replace the full tag set on an entity. */\nexport function useReplaceEntityTags() {\n return useCallback(\n async (entityType: string, entityId: string, tagIds: string[]) => {\n const { data } = await getFluidGridsClient().mutate<{\n replaceFluidgridsEntityTags: EntityTagAssignment[];\n }>({\n mutation: ReplaceFluidgridsEntityTagsDocument,\n variables: { input: { entityType, entityId, tagIds } },\n });\n return data?.replaceFluidgridsEntityTags ?? [];\n },\n [],\n );\n}\n\n/** Create a new assignable tag (inline creation from the picker). */\nexport function useCreateTag() {\n return useCallback(\n async (label: string, color?: string): Promise<AvailableTag | null> => {\n const { data } = await getFluidGridsClient().mutate<{\n createFluidgridsTag: AvailableTag;\n }>({\n mutation: CreateFluidgridsTagDocument,\n variables: { input: { label, color } },\n });\n return data?.createFluidgridsTag ?? null;\n },\n [],\n );\n}\n\n/**\n * Create-time tagging: collect tag ids while the entity does not exist yet,\n * then flush them once it does.\n *\n * The flush is best-effort — the entity already exists by then, so a tag\n * failure must never block navigation; the detail-surface picker lets the\n * user retry.\n */\nexport function useDraftEntityTags(entityType: FluidgridsEntityType) {\n const [draftTagIds, setDraftTagIds] = useState<string[]>([]);\n const tagEntity = useTagEntity();\n\n const flushTags = useCallback(\n async (entityId: string) => {\n if (!entityId || draftTagIds.length === 0) return;\n await Promise.all(\n draftTagIds.map((tagId) =>\n tagEntity(entityType, entityId, tagId).catch(() => false),\n ),\n );\n },\n [draftTagIds, entityType, tagEntity],\n );\n\n return { draftTagIds, setDraftTagIds, flushTags };\n}\n\n/**\n * Tag overlay for the workflow list: workflowKey -> assignments.\n *\n * Deliberately a separate query from WorkflowDefinitions. If `tagAssignments`\n * is missing from the supergraph (backend not yet deployed, Hive CDN still\n * reconciling) this query fails on its own and the list still renders — it\n * just shows no chips and no tag filter.\n */\nexport function useWorkflowTagOverlay(limit = 100) {\n const [tagsByKey, setTagsByKey] = useState<\n Record<string, EntityTagAssignment[]>\n >({});\n\n const fetchOverlay = useCallback(async () => {\n try {\n const { data } = await getFluidGridsClient().query<{\n workflowDefinitions: {\n items: Array<{\n workflowKey: string;\n tagAssignments?: EntityTagAssignment[] | null;\n }>;\n };\n }>({\n query: WorkflowDefinitionsTagsDocument,\n variables: { input: { limit } },\n fetchPolicy: \"network-only\",\n });\n const next: Record<string, EntityTagAssignment[]> = {};\n for (const item of data?.workflowDefinitions?.items ?? []) {\n const assignments = item.tagAssignments ?? [];\n // Rows are per version and every version shares the workflowKey's tag\n // set — first non-empty wins.\n if (assignments.length > 0 && !next[item.workflowKey]) {\n next[item.workflowKey] = assignments;\n }\n }\n setTagsByKey(next);\n } catch {\n // Tags are decoration — never let this break the list.\n setTagsByKey({});\n }\n }, [limit]);\n\n useEffect(() => {\n void fetchOverlay();\n }, [fetchOverlay]);\n\n return { tagsByKey, refetch: fetchOverlay };\n}\n","import {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from \"@burdenoff/fe-libs/ui\";\nimport { useTr } from \"../../hooks/useTr\";\n\ninterface QuotaExhaustedDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** Called when the user clicks \"View Billing\". */\n onUpgrade: () => void;\n title?: string;\n description?: string;\n}\n\n/**\n * Alert shown when a workflow-creating action (save/duplicate/import) is\n * rejected with `QUOTA_EXHAUSTED` for `fluidgrids.workflows.count`. Mirrors\n * the \"Folder Limit Reached\" dialog in microfe-files' BrowserPage.tsx, built\n * on the same `AlertDialog` primitives already used elsewhere in this SDK\n * (see card-workflow.tsx's delete-confirmation dialog).\n */\nexport function QuotaExhaustedDialog({\n open,\n onOpenChange,\n onUpgrade,\n title,\n description,\n}: QuotaExhaustedDialogProps) {\n const tr = useTr();\n // Defaults are resolved here rather than as default parameter values so the\n // copy can go through `tr()` — a hook cannot be called in a parameter list.\n const resolvedTitle =\n title ??\n tr(\n \"fluidgrids.components.quotaExhaustedDialog.title\",\n \"Workflow Limit Reached\",\n );\n const resolvedDescription =\n description ??\n tr(\n \"fluidgrids.components.quotaExhaustedDialog.description\",\n \"You've reached the workflow limit for your plan. Upgrade your plan to create more workflows.\",\n );\n\n return (\n <AlertDialog open={open} onOpenChange={onOpenChange}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{resolvedTitle}</AlertDialogTitle>\n <AlertDialogDescription>{resolvedDescription}</AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel>\n {tr(\n \"fluidgrids.components.quotaExhaustedDialog.dismiss\",\n \"Dismiss\",\n )}\n </AlertDialogCancel>\n <AlertDialogAction onClick={onUpgrade}>\n {tr(\n \"fluidgrids.components.quotaExhaustedDialog.viewBilling\",\n \"View Billing\",\n )}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n}\n"]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { useWorkflowTagOverlay, useFlowStore, QuotaExhaustedDialog } from './chunk-
|
|
1
|
+
import { useWorkflowTagOverlay, useFlowStore, QuotaExhaustedDialog } from './chunk-Y36DJHU3.js';
|
|
2
2
|
import { useWorkflowDefinitions, useDuplicateWorkflow, useDeleteWorkflow } from './chunk-MH4AHYK3.js';
|
|
3
3
|
import { SdkPermissionButton, FLUIDGRIDS_PERMISSIONS, SdkPermissionGate } from './chunk-UIY2HBWA.js';
|
|
4
4
|
import { config } from './chunk-WWU2O2SR.js';
|
|
5
|
+
import { useTr } from './chunk-7VNIEIR6.js';
|
|
5
6
|
import { useState, useMemo } from 'react';
|
|
6
7
|
import { useNavigate } from 'react-router';
|
|
7
8
|
import { v4 } from 'uuid';
|
|
@@ -18,6 +19,7 @@ function SharePopup({
|
|
|
18
19
|
url = window.location.href,
|
|
19
20
|
embedSrc = `${config.fluidgridFrontendUrl}/workflow-view/565201ec-e803-4281-ad39-a135c46daa89/1.0`
|
|
20
21
|
}) {
|
|
22
|
+
const tr = useTr();
|
|
21
23
|
const [isOpen, setIsOpen] = useState(false);
|
|
22
24
|
const [width, setWidth] = useState(600);
|
|
23
25
|
const [height, setHeight] = useState(400);
|
|
@@ -30,7 +32,7 @@ function SharePopup({
|
|
|
30
32
|
if (!isOpen) {
|
|
31
33
|
return /* @__PURE__ */ jsxs(Button, { variant: "ghost", size: "icon", onClick: () => setIsOpen(true), children: [
|
|
32
34
|
/* @__PURE__ */ jsx(Share2, { className: "h-4 w-4" }),
|
|
33
|
-
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Share" })
|
|
35
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: tr("fluidgrids.components.sharePopup.openLabel", "Share") })
|
|
34
36
|
] });
|
|
35
37
|
}
|
|
36
38
|
return /* @__PURE__ */ jsx(
|
|
@@ -45,7 +47,7 @@ function SharePopup({
|
|
|
45
47
|
onClick: (e) => e.stopPropagation(),
|
|
46
48
|
children: [
|
|
47
49
|
/* @__PURE__ */ jsxs("div", { className: "flex justify-between items-center mb-4", children: [
|
|
48
|
-
/* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold", children: "Share" }),
|
|
50
|
+
/* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold", children: tr("fluidgrids.components.sharePopup.title", "Share") }),
|
|
49
51
|
/* @__PURE__ */ jsx(Button, { variant: "ghost", size: "icon", onClick: () => setIsOpen(false), children: "\xD7" })
|
|
50
52
|
] }),
|
|
51
53
|
/* @__PURE__ */ jsxs("div", { className: "flex gap-2 mb-4", children: [
|
|
@@ -55,7 +57,7 @@ function SharePopup({
|
|
|
55
57
|
variant: activeTab === "link" ? "default" : "outline",
|
|
56
58
|
size: "sm",
|
|
57
59
|
onClick: () => setActiveTab("link"),
|
|
58
|
-
children: "Share Link"
|
|
60
|
+
children: tr("fluidgrids.components.sharePopup.tabShareLink", "Share Link")
|
|
59
61
|
}
|
|
60
62
|
),
|
|
61
63
|
/* @__PURE__ */ jsx(
|
|
@@ -64,7 +66,7 @@ function SharePopup({
|
|
|
64
66
|
variant: activeTab === "embed" ? "default" : "outline",
|
|
65
67
|
size: "sm",
|
|
66
68
|
onClick: () => setActiveTab("embed"),
|
|
67
|
-
children: "Embed"
|
|
69
|
+
children: tr("fluidgrids.components.sharePopup.tabEmbed", "Embed")
|
|
68
70
|
}
|
|
69
71
|
)
|
|
70
72
|
] }),
|
|
@@ -81,7 +83,13 @@ function SharePopup({
|
|
|
81
83
|
Button,
|
|
82
84
|
{
|
|
83
85
|
size: "sm",
|
|
84
|
-
onClick: () => copyToClipboard(
|
|
86
|
+
onClick: () => copyToClipboard(
|
|
87
|
+
url,
|
|
88
|
+
tr(
|
|
89
|
+
"fluidgrids.components.sharePopup.linkCopiedToast",
|
|
90
|
+
"Link copied to clipboard"
|
|
91
|
+
)
|
|
92
|
+
),
|
|
85
93
|
children: /* @__PURE__ */ jsx(Copy, { className: "h-4 w-4" })
|
|
86
94
|
}
|
|
87
95
|
)
|
|
@@ -89,7 +97,7 @@ function SharePopup({
|
|
|
89
97
|
activeTab === "embed" && /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
90
98
|
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
91
99
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
92
|
-
/* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: "Width" }),
|
|
100
|
+
/* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: tr("fluidgrids.components.sharePopup.widthLabel", "Width") }),
|
|
93
101
|
/* @__PURE__ */ jsx(
|
|
94
102
|
"input",
|
|
95
103
|
{
|
|
@@ -101,7 +109,7 @@ function SharePopup({
|
|
|
101
109
|
)
|
|
102
110
|
] }),
|
|
103
111
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
104
|
-
/* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: "Height" }),
|
|
112
|
+
/* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: tr("fluidgrids.components.sharePopup.heightLabel", "Height") }),
|
|
105
113
|
/* @__PURE__ */ jsx(
|
|
106
114
|
"input",
|
|
107
115
|
{
|
|
@@ -114,7 +122,10 @@ function SharePopup({
|
|
|
114
122
|
] })
|
|
115
123
|
] }),
|
|
116
124
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
117
|
-
/* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children:
|
|
125
|
+
/* @__PURE__ */ jsx("label", { className: "text-sm font-medium", children: tr(
|
|
126
|
+
"fluidgrids.components.sharePopup.embedCodeLabel",
|
|
127
|
+
"Embed Code"
|
|
128
|
+
) }),
|
|
118
129
|
/* @__PURE__ */ jsxs("div", { className: "relative mt-1", children: [
|
|
119
130
|
/* @__PURE__ */ jsx(
|
|
120
131
|
"input",
|
|
@@ -129,7 +140,13 @@ function SharePopup({
|
|
|
129
140
|
{
|
|
130
141
|
size: "sm",
|
|
131
142
|
className: "absolute right-1 top-1/2 -translate-y-1/2 h-7",
|
|
132
|
-
onClick: () => copyToClipboard(
|
|
143
|
+
onClick: () => copyToClipboard(
|
|
144
|
+
embedCode,
|
|
145
|
+
tr(
|
|
146
|
+
"fluidgrids.components.sharePopup.embedCopiedToast",
|
|
147
|
+
"Embed code copied to clipboard"
|
|
148
|
+
)
|
|
149
|
+
),
|
|
133
150
|
children: /* @__PURE__ */ jsx(Copy, { className: "h-4 w-4" })
|
|
134
151
|
}
|
|
135
152
|
)
|
|
@@ -175,6 +192,7 @@ var CardWorkflow = ({
|
|
|
175
192
|
workflow,
|
|
176
193
|
onUpdateSuccess
|
|
177
194
|
}) => {
|
|
195
|
+
const tr = useTr();
|
|
178
196
|
const navigate = useNavigate();
|
|
179
197
|
const resetWorkflow = useFlowStore((s) => s.actions.resetWorkflow);
|
|
180
198
|
const { duplicateWorkflow: duplicateWorkflowMutation } = useDuplicateWorkflow();
|
|
@@ -207,7 +225,7 @@ var CardWorkflow = ({
|
|
|
207
225
|
}
|
|
208
226
|
console.error("Error duplicating workflow:", error);
|
|
209
227
|
toast.error(
|
|
210
|
-
|
|
228
|
+
`${tr("fluidgrids.builder.cardWorkflow.duplicateErrorToast", "Error duplicating workflow:")} ${error instanceof Error ? error.message : String(error)}`
|
|
211
229
|
);
|
|
212
230
|
}
|
|
213
231
|
}
|
|
@@ -225,7 +243,7 @@ var CardWorkflow = ({
|
|
|
225
243
|
} catch (error) {
|
|
226
244
|
console.error("Error deleting workflow:", error);
|
|
227
245
|
toast.error(
|
|
228
|
-
|
|
246
|
+
`${tr("fluidgrids.builder.cardWorkflow.deleteErrorToast", "Error deleting workflow:")} ${error instanceof Error ? error.message : String(error)}`
|
|
229
247
|
);
|
|
230
248
|
} finally {
|
|
231
249
|
setIsDeleting(false);
|
|
@@ -249,7 +267,7 @@ var CardWorkflow = ({
|
|
|
249
267
|
{
|
|
250
268
|
role: "button",
|
|
251
269
|
tabIndex: 0,
|
|
252
|
-
"aria-label":
|
|
270
|
+
"aria-label": `${tr("fluidgrids.builder.cardWorkflow.openWorkflowAriaLabel", "Open workflow")} ${workflow.name}`,
|
|
253
271
|
onClick: handleCardClick,
|
|
254
272
|
onKeyDown: (e) => {
|
|
255
273
|
if (e.target === e.currentTarget && (e.key === "Enter" || e.key === " ")) {
|
|
@@ -278,7 +296,10 @@ var CardWorkflow = ({
|
|
|
278
296
|
statusInfo.label
|
|
279
297
|
] })
|
|
280
298
|
] }),
|
|
281
|
-
/* @__PURE__ */ jsx("p", { className: "mt-1 line-clamp-2 text-xs leading-snug text-muted-foreground", children: workflow.description ||
|
|
299
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 line-clamp-2 text-xs leading-snug text-muted-foreground", children: workflow.description || tr(
|
|
300
|
+
"fluidgrids.builder.cardWorkflow.noDescription",
|
|
301
|
+
"No description"
|
|
302
|
+
) }),
|
|
282
303
|
workflow.tags && workflow.tags.length > 0 && /* @__PURE__ */ jsxs("div", { className: "mt-2 flex flex-wrap items-center gap-1", children: [
|
|
283
304
|
workflow.tags.slice(0, 3).map((tag) => /* @__PURE__ */ jsx(
|
|
284
305
|
TagBadge,
|
|
@@ -306,7 +327,8 @@ var CardWorkflow = ({
|
|
|
306
327
|
children: [
|
|
307
328
|
/* @__PURE__ */ jsx(Icon, { icon: "mdi:clock-outline", className: "size-3.5 shrink-0" }),
|
|
308
329
|
/* @__PURE__ */ jsxs("span", { className: "truncate", children: [
|
|
309
|
-
"
|
|
330
|
+
tr("fluidgrids.builder.cardWorkflow.updatedPrefix", "Updated"),
|
|
331
|
+
" ",
|
|
310
332
|
relativeTime(workflow.updated_at)
|
|
311
333
|
] }),
|
|
312
334
|
/* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: "\xB7" }),
|
|
@@ -317,7 +339,11 @@ var CardWorkflow = ({
|
|
|
317
339
|
workflow.total_versions && workflow.total_versions > 1 ? /* @__PURE__ */ jsxs("span", { className: "shrink-0", children: [
|
|
318
340
|
"\xB7 ",
|
|
319
341
|
workflow.total_versions,
|
|
320
|
-
"
|
|
342
|
+
" ",
|
|
343
|
+
tr(
|
|
344
|
+
"fluidgrids.builder.cardWorkflow.versionsSuffix",
|
|
345
|
+
"versions"
|
|
346
|
+
)
|
|
321
347
|
] }) : null
|
|
322
348
|
]
|
|
323
349
|
}
|
|
@@ -331,11 +357,17 @@ var CardWorkflow = ({
|
|
|
331
357
|
size: "icon",
|
|
332
358
|
className: "size-8",
|
|
333
359
|
onClick: handleOnEdit,
|
|
334
|
-
"aria-label":
|
|
360
|
+
"aria-label": tr(
|
|
361
|
+
"fluidgrids.builder.cardWorkflow.editWorkflow",
|
|
362
|
+
"Edit workflow"
|
|
363
|
+
),
|
|
335
364
|
children: /* @__PURE__ */ jsx(Icon, { icon: "mynaui:edit", className: "size-4" })
|
|
336
365
|
}
|
|
337
366
|
) }),
|
|
338
|
-
/* @__PURE__ */ jsx(TooltipContent, { side: "top", children: /* @__PURE__ */ jsx("p", { children:
|
|
367
|
+
/* @__PURE__ */ jsx(TooltipContent, { side: "top", children: /* @__PURE__ */ jsx("p", { children: tr(
|
|
368
|
+
"fluidgrids.builder.cardWorkflow.editWorkflow",
|
|
369
|
+
"Edit workflow"
|
|
370
|
+
) }) })
|
|
339
371
|
] }),
|
|
340
372
|
/* @__PURE__ */ jsxs(Tooltip, { children: [
|
|
341
373
|
/* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(
|
|
@@ -345,7 +377,10 @@ var CardWorkflow = ({
|
|
|
345
377
|
embedSrc: `${config.fluidgridFrontendUrl}/workflow-view/${workflow.workflow_key}/${workflow.version}`
|
|
346
378
|
}
|
|
347
379
|
) }) }),
|
|
348
|
-
/* @__PURE__ */ jsx(TooltipContent, { side: "top", children: /* @__PURE__ */ jsx("p", { children:
|
|
380
|
+
/* @__PURE__ */ jsx(TooltipContent, { side: "top", children: /* @__PURE__ */ jsx("p", { children: tr(
|
|
381
|
+
"fluidgrids.builder.cardWorkflow.shareWorkflow",
|
|
382
|
+
"Share workflow"
|
|
383
|
+
) }) })
|
|
349
384
|
] }),
|
|
350
385
|
/* @__PURE__ */ jsx(
|
|
351
386
|
SdkPermissionGate,
|
|
@@ -359,11 +394,17 @@ var CardWorkflow = ({
|
|
|
359
394
|
size: "icon",
|
|
360
395
|
className: "size-8",
|
|
361
396
|
onClick: () => handleDuplicateWorkflow(),
|
|
362
|
-
"aria-label":
|
|
397
|
+
"aria-label": tr(
|
|
398
|
+
"fluidgrids.builder.cardWorkflow.duplicateWorkflow",
|
|
399
|
+
"Duplicate workflow"
|
|
400
|
+
),
|
|
363
401
|
children: /* @__PURE__ */ jsx(Icon, { icon: "mynaui:copy", className: "size-4" })
|
|
364
402
|
}
|
|
365
403
|
) }),
|
|
366
|
-
/* @__PURE__ */ jsx(TooltipContent, { side: "top", children: /* @__PURE__ */ jsx("p", { children:
|
|
404
|
+
/* @__PURE__ */ jsx(TooltipContent, { side: "top", children: /* @__PURE__ */ jsx("p", { children: tr(
|
|
405
|
+
"fluidgrids.builder.cardWorkflow.duplicateWorkflow",
|
|
406
|
+
"Duplicate workflow"
|
|
407
|
+
) }) })
|
|
367
408
|
] })
|
|
368
409
|
}
|
|
369
410
|
),
|
|
@@ -379,11 +420,17 @@ var CardWorkflow = ({
|
|
|
379
420
|
size: "icon",
|
|
380
421
|
className: "size-8 text-[var(--color-status-error-text)] hover:text-[var(--color-status-error-text)]",
|
|
381
422
|
onClick: () => setShowDeleteDialog(true),
|
|
382
|
-
"aria-label":
|
|
423
|
+
"aria-label": tr(
|
|
424
|
+
"fluidgrids.builder.cardWorkflow.deleteWorkflow",
|
|
425
|
+
"Delete workflow"
|
|
426
|
+
),
|
|
383
427
|
children: /* @__PURE__ */ jsx(Icon, { icon: "mynaui:trash", className: "size-4" })
|
|
384
428
|
}
|
|
385
429
|
) }),
|
|
386
|
-
/* @__PURE__ */ jsx(TooltipContent, { side: "top", children: /* @__PURE__ */ jsx("p", { children:
|
|
430
|
+
/* @__PURE__ */ jsx(TooltipContent, { side: "top", children: /* @__PURE__ */ jsx("p", { children: tr(
|
|
431
|
+
"fluidgrids.builder.cardWorkflow.deleteWorkflow",
|
|
432
|
+
"Delete workflow"
|
|
433
|
+
) }) })
|
|
387
434
|
] })
|
|
388
435
|
}
|
|
389
436
|
)
|
|
@@ -394,22 +441,38 @@ var CardWorkflow = ({
|
|
|
394
441
|
),
|
|
395
442
|
/* @__PURE__ */ jsx(AlertDialog, { open: showDeleteDialog, onOpenChange: setShowDeleteDialog, children: /* @__PURE__ */ jsxs(AlertDialogContent, { children: [
|
|
396
443
|
/* @__PURE__ */ jsxs(AlertDialogHeader, { children: [
|
|
397
|
-
/* @__PURE__ */ jsx(AlertDialogTitle, { children:
|
|
444
|
+
/* @__PURE__ */ jsx(AlertDialogTitle, { children: tr(
|
|
445
|
+
"fluidgrids.builder.cardWorkflow.deleteDialogTitle",
|
|
446
|
+
"Delete Workflow"
|
|
447
|
+
) }),
|
|
398
448
|
/* @__PURE__ */ jsxs(AlertDialogDescription, { children: [
|
|
399
|
-
|
|
449
|
+
tr(
|
|
450
|
+
"fluidgrids.builder.cardWorkflow.deleteDialogDescriptionPrefix",
|
|
451
|
+
"Are you sure you want to delete workflow"
|
|
452
|
+
),
|
|
453
|
+
" ",
|
|
454
|
+
'"',
|
|
400
455
|
workflow.name,
|
|
401
|
-
'"
|
|
456
|
+
'"',
|
|
457
|
+
" ",
|
|
458
|
+
tr(
|
|
459
|
+
"fluidgrids.builder.cardWorkflow.deleteDialogDescriptionSuffix",
|
|
460
|
+
"and all its versions? This action cannot be undone."
|
|
461
|
+
)
|
|
402
462
|
] })
|
|
403
463
|
] }),
|
|
404
464
|
/* @__PURE__ */ jsxs(AlertDialogFooter, { children: [
|
|
405
|
-
/* @__PURE__ */ jsx(AlertDialogCancel, { disabled: isDeleting, children: "Cancel" }),
|
|
465
|
+
/* @__PURE__ */ jsx(AlertDialogCancel, { disabled: isDeleting, children: tr("fluidgrids.builder.cardWorkflow.cancelButton", "Cancel") }),
|
|
406
466
|
/* @__PURE__ */ jsx(
|
|
407
467
|
AlertDialogAction,
|
|
408
468
|
{
|
|
409
469
|
onClick: handleDeleteWorkflow,
|
|
410
470
|
disabled: isDeleting,
|
|
411
471
|
className: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
|
|
412
|
-
children: isDeleting ?
|
|
472
|
+
children: isDeleting ? tr(
|
|
473
|
+
"fluidgrids.builder.cardWorkflow.deletingButton",
|
|
474
|
+
"Deleting..."
|
|
475
|
+
) : tr("fluidgrids.builder.cardWorkflow.deleteButton", "Delete")
|
|
413
476
|
}
|
|
414
477
|
)
|
|
415
478
|
] })
|
|
@@ -447,6 +510,7 @@ function SkeletonCard() {
|
|
|
447
510
|
] });
|
|
448
511
|
}
|
|
449
512
|
function WorkflowsList() {
|
|
513
|
+
const tr = useTr();
|
|
450
514
|
const navigate = useNavigate();
|
|
451
515
|
const { workflows, loading, error, refetch } = useWorkflowDefinitions({
|
|
452
516
|
limit: 100,
|
|
@@ -467,13 +531,13 @@ function WorkflowsList() {
|
|
|
467
531
|
if (!byId.has(a.tagId)) {
|
|
468
532
|
byId.set(a.tagId, {
|
|
469
533
|
id: a.tagId,
|
|
470
|
-
label: a.tagInfo?.label ?? a.tagInfo?.key ?? "Tag"
|
|
534
|
+
label: a.tagInfo?.label ?? a.tagInfo?.key ?? tr("fluidgrids.workflowsList.tagFallbackLabel", "Tag")
|
|
471
535
|
});
|
|
472
536
|
}
|
|
473
537
|
}
|
|
474
538
|
}
|
|
475
539
|
return [...byId.values()].sort((a, b) => a.label.localeCompare(b.label));
|
|
476
|
-
}, [workflows, tagsByKey]);
|
|
540
|
+
}, [workflows, tagsByKey, tr]);
|
|
477
541
|
const filtered = useMemo(() => {
|
|
478
542
|
const q = search.trim().toLowerCase();
|
|
479
543
|
return workflows.filter((w) => {
|
|
@@ -489,7 +553,10 @@ function WorkflowsList() {
|
|
|
489
553
|
SdkPermissionButton,
|
|
490
554
|
{
|
|
491
555
|
permission: FLUIDGRIDS_PERMISSIONS.WORKFLOW_CREATE,
|
|
492
|
-
deniedTooltip:
|
|
556
|
+
deniedTooltip: tr(
|
|
557
|
+
"fluidgrids.workflowsList.createDeniedTooltip",
|
|
558
|
+
"You don't have permission to create workflows"
|
|
559
|
+
),
|
|
493
560
|
children: /* @__PURE__ */ jsxs(
|
|
494
561
|
Button,
|
|
495
562
|
{
|
|
@@ -499,7 +566,7 @@ function WorkflowsList() {
|
|
|
499
566
|
onClick: () => navigate(`../workflow/${v4()}/v1`),
|
|
500
567
|
children: [
|
|
501
568
|
/* @__PURE__ */ jsx(Icon, { icon: "mynaui:plus", className: "size-5 text-primary-foreground" }),
|
|
502
|
-
"Create Workflow"
|
|
569
|
+
tr("fluidgrids.workflowsList.createButton", "Create Workflow")
|
|
503
570
|
]
|
|
504
571
|
}
|
|
505
572
|
)
|
|
@@ -512,10 +579,13 @@ function WorkflowsList() {
|
|
|
512
579
|
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3", children: [
|
|
513
580
|
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
514
581
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2.5", children: [
|
|
515
|
-
/* @__PURE__ */ jsx("h1", { className: "text-2xl font-bold tracking-tight", children: "Workflows" }),
|
|
582
|
+
/* @__PURE__ */ jsx("h1", { className: "text-2xl font-bold tracking-tight", children: tr("fluidgrids.workflowsList.title", "Workflows") }),
|
|
516
583
|
!loading && !error && /* @__PURE__ */ jsx(Badge, { variant: "secondary", className: "font-mono", children: workflows.length })
|
|
517
584
|
] }),
|
|
518
|
-
/* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-muted-foreground", children:
|
|
585
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: tr(
|
|
586
|
+
"fluidgrids.workflowsList.subtitle",
|
|
587
|
+
"Build, run, and manage your automations. Open a workflow to edit it in the visual builder."
|
|
588
|
+
) })
|
|
519
589
|
] }),
|
|
520
590
|
createButton
|
|
521
591
|
] }),
|
|
@@ -533,8 +603,14 @@ function WorkflowsList() {
|
|
|
533
603
|
{
|
|
534
604
|
value: search,
|
|
535
605
|
onChange: (e) => setSearch(e.target.value),
|
|
536
|
-
placeholder:
|
|
537
|
-
|
|
606
|
+
placeholder: tr(
|
|
607
|
+
"fluidgrids.workflowsList.searchPlaceholder",
|
|
608
|
+
"Search workflows\u2026"
|
|
609
|
+
),
|
|
610
|
+
"aria-label": tr(
|
|
611
|
+
"fluidgrids.workflowsList.searchAriaLabel",
|
|
612
|
+
"Search workflows"
|
|
613
|
+
),
|
|
538
614
|
className: "pl-8"
|
|
539
615
|
}
|
|
540
616
|
)
|
|
@@ -549,7 +625,7 @@ function WorkflowsList() {
|
|
|
549
625
|
"rounded-full border px-3 py-1 text-xs font-medium transition-colors",
|
|
550
626
|
statusFilter === null ? "border-transparent bg-primary text-primary-foreground" : "border-border bg-card text-muted-foreground hover:text-foreground"
|
|
551
627
|
),
|
|
552
|
-
children: "All"
|
|
628
|
+
children: tr("fluidgrids.workflowsList.statusFilterAll", "All")
|
|
553
629
|
}
|
|
554
630
|
),
|
|
555
631
|
presentStatuses.map((s) => /* @__PURE__ */ jsx(
|
|
@@ -601,19 +677,28 @@ function WorkflowsList() {
|
|
|
601
677
|
}
|
|
602
678
|
),
|
|
603
679
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
604
|
-
/* @__PURE__ */ jsx("p", { className: "font-semibold", children:
|
|
680
|
+
/* @__PURE__ */ jsx("p", { className: "font-semibold", children: tr(
|
|
681
|
+
"fluidgrids.workflowsList.loadErrorTitle",
|
|
682
|
+
"Couldn't load workflows"
|
|
683
|
+
) }),
|
|
605
684
|
/* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: error.message })
|
|
606
685
|
] }),
|
|
607
686
|
/* @__PURE__ */ jsxs(Button, { variant: "outline", size: "sm", onClick: () => refetch(), children: [
|
|
608
687
|
/* @__PURE__ */ jsx(Icon, { icon: "mynaui:refresh", className: "size-4" }),
|
|
609
|
-
"Try again"
|
|
688
|
+
tr("fluidgrids.workflowsList.tryAgainButton", "Try again")
|
|
610
689
|
] })
|
|
611
690
|
] }) }) : workflows.length === 0 ? /* @__PURE__ */ jsx("div", { className: "grid flex-1 place-items-center", children: /* @__PURE__ */ jsx(
|
|
612
691
|
IllustratedEmptyState,
|
|
613
692
|
{
|
|
614
693
|
illustration: "onboarding",
|
|
615
|
-
title:
|
|
616
|
-
|
|
694
|
+
title: tr(
|
|
695
|
+
"fluidgrids.workflowsList.emptyStateTitle",
|
|
696
|
+
"Create your first workflow"
|
|
697
|
+
),
|
|
698
|
+
description: tr(
|
|
699
|
+
"fluidgrids.workflowsList.emptyStateDescription",
|
|
700
|
+
"Workflows automate multi-step processes \u2014 sync signups into your CRM, post alerts to Slack, or transform data between apps. Start from a blank canvas or a template."
|
|
701
|
+
),
|
|
617
702
|
action: createButton
|
|
618
703
|
}
|
|
619
704
|
) }) : filtered.length === 0 ? /* @__PURE__ */ jsx("div", { className: "grid flex-1 place-items-center", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-3 text-center", children: [
|
|
@@ -624,7 +709,10 @@ function WorkflowsList() {
|
|
|
624
709
|
className: "size-8 text-muted-foreground"
|
|
625
710
|
}
|
|
626
711
|
),
|
|
627
|
-
/* @__PURE__ */ jsx("p", { className: "font-medium", children:
|
|
712
|
+
/* @__PURE__ */ jsx("p", { className: "font-medium", children: tr(
|
|
713
|
+
"fluidgrids.workflowsList.noFilterMatchTitle",
|
|
714
|
+
"No workflows match your filters"
|
|
715
|
+
) }),
|
|
628
716
|
/* @__PURE__ */ jsx(
|
|
629
717
|
Button,
|
|
630
718
|
{
|
|
@@ -635,7 +723,10 @@ function WorkflowsList() {
|
|
|
635
723
|
setStatusFilter(null);
|
|
636
724
|
setTagFilter(null);
|
|
637
725
|
},
|
|
638
|
-
children:
|
|
726
|
+
children: tr(
|
|
727
|
+
"fluidgrids.workflowsList.clearFiltersButton",
|
|
728
|
+
"Clear filters"
|
|
729
|
+
)
|
|
639
730
|
}
|
|
640
731
|
)
|
|
641
732
|
] }) }) : /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3 2xl:grid-cols-4", children: filtered.map((workflow) => /* @__PURE__ */ jsx(
|
|
@@ -654,7 +745,10 @@ function WorkflowsList() {
|
|
|
654
745
|
total_versions: workflow.totalVersions ?? void 0,
|
|
655
746
|
tags: (tagsByKey[workflow.workflowKey] ?? []).map((a) => ({
|
|
656
747
|
id: a.tagId,
|
|
657
|
-
label: a.tagInfo?.label ?? a.tagInfo?.key ??
|
|
748
|
+
label: a.tagInfo?.label ?? a.tagInfo?.key ?? tr(
|
|
749
|
+
"fluidgrids.workflowsList.cardTagFallbackLabel",
|
|
750
|
+
"Tag"
|
|
751
|
+
),
|
|
658
752
|
color: a.tagInfo?.color ?? void 0
|
|
659
753
|
}))
|
|
660
754
|
},
|
|
@@ -667,5 +761,5 @@ function WorkflowsList() {
|
|
|
667
761
|
}
|
|
668
762
|
|
|
669
763
|
export { WorkflowsList };
|
|
670
|
-
//# sourceMappingURL=chunk-
|
|
671
|
-
//# sourceMappingURL=chunk-
|
|
764
|
+
//# sourceMappingURL=chunk-YJKZSUNC.js.map
|
|
765
|
+
//# sourceMappingURL=chunk-YJKZSUNC.js.map
|