@burdenoff/fluidgrids-fe-sdk 2026.803.4 → 2026.804.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ExecutionDetailPage-FF2DYKAZ.js +10 -0
- package/dist/{ExecutionDetailPage-FCY3S336.js.map → ExecutionDetailPage-FF2DYKAZ.js.map} +1 -1
- package/dist/ExecutionsListPage-NKISRFMA.js +9 -0
- package/dist/{ExecutionsListPage-IZJPACQV.js.map → ExecutionsListPage-NKISRFMA.js.map} +1 -1
- package/dist/MissingNodesInstallModal-HA5L3FK2.js +185 -0
- package/dist/MissingNodesInstallModal-HA5L3FK2.js.map +1 -0
- package/dist/{TemplateConfigurationModal-MTR7VP6G.js → TemplateConfigurationModal-MXNGZQIC.js} +91 -21
- package/dist/TemplateConfigurationModal-MXNGZQIC.js.map +1 -0
- package/dist/{TemplateDetailPanel-T3ZHXOHX.js → TemplateDetailPanel-CJ3NPVTP.js} +50 -14
- package/dist/TemplateDetailPanel-CJ3NPVTP.js.map +1 -0
- package/dist/{WorkflowBuilder-WMAHTZEI.js → WorkflowBuilder-ETVB66U6.js} +9 -9
- package/dist/{WorkflowBuilder-WMAHTZEI.js.map → WorkflowBuilder-ETVB66U6.js.map} +1 -1
- package/dist/WorkflowsList-TZAN3YBA.js +11 -0
- package/dist/{WorkflowsList-BXESQVAH.js.map → WorkflowsList-TZAN3YBA.js.map} +1 -1
- package/dist/{chunk-WAVGHDYH.js → chunk-6PNRM3KQ.js} +469 -114
- package/dist/chunk-6PNRM3KQ.js.map +1 -0
- package/dist/chunk-7VNIEIR6.js +21 -0
- package/dist/chunk-7VNIEIR6.js.map +1 -0
- package/dist/{chunk-F5ACDIYR.js → chunk-IWKLEFC7.js} +205 -51
- package/dist/chunk-IWKLEFC7.js.map +1 -0
- package/dist/{chunk-MRVS73S2.js → chunk-OHGXRM6Z.js} +7 -23
- package/dist/chunk-OHGXRM6Z.js.map +1 -0
- package/dist/chunk-P5PKRQAO.js +25 -0
- package/dist/chunk-P5PKRQAO.js.map +1 -0
- package/dist/{chunk-CQAHXNT2.js → chunk-SG7Z2IRQ.js} +55 -18
- package/dist/chunk-SG7Z2IRQ.js.map +1 -0
- package/dist/chunk-WQ4QNHDN.js +29639 -0
- package/dist/chunk-WQ4QNHDN.js.map +1 -0
- package/dist/{chunk-ZM4SSEVI.js → chunk-Y36DJHU3.js} +211 -3
- package/dist/chunk-Y36DJHU3.js.map +1 -0
- package/dist/{chunk-CBUOMHGH.js → chunk-YJKZSUNC.js} +140 -47
- package/dist/chunk-YJKZSUNC.js.map +1 -0
- package/dist/index.d.ts +33 -2
- package/dist/index.js +643 -182
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/ExecutionDetailPage-FCY3S336.js +0 -9
- package/dist/ExecutionsListPage-IZJPACQV.js +0 -8
- package/dist/TemplateConfigurationModal-MTR7VP6G.js.map +0 -1
- package/dist/TemplateDetailPanel-T3ZHXOHX.js.map +0 -1
- package/dist/WorkflowsList-BXESQVAH.js +0 -11
- package/dist/blocks-7KN7ZRE6.js +0 -11
- package/dist/blocks-7KN7ZRE6.js.map +0 -1
- package/dist/chunk-7LLCYNKY.js +0 -10910
- package/dist/chunk-7LLCYNKY.js.map +0 -1
- package/dist/chunk-CBUOMHGH.js.map +0 -1
- package/dist/chunk-CQAHXNT2.js.map +0 -1
- package/dist/chunk-F5ACDIYR.js.map +0 -1
- package/dist/chunk-MRVS73S2.js.map +0 -1
- package/dist/chunk-OAPYQFQU.js +0 -197
- package/dist/chunk-OAPYQFQU.js.map +0 -1
- package/dist/chunk-WAVGHDYH.js.map +0 -1
- package/dist/chunk-Z3NRSPTV.js +0 -15355
- package/dist/chunk-Z3NRSPTV.js.map +0 -1
- package/dist/chunk-ZM4SSEVI.js.map +0 -1
|
@@ -1,7 +1,13 @@
|
|
|
1
|
+
import { FluidgridsEntityTagsDocument, AvailableFluidgridsTagsDocument, SearchFluidgridsTagsDocument, TagFluidgridsEntityDocument, UntagFluidgridsEntityDocument, ReplaceFluidgridsEntityTagsDocument, CreateFluidgridsTagDocument, WorkflowDefinitionsTagsDocument } from './chunk-V5UEEB74.js';
|
|
2
|
+
import { getFluidGridsClient } from './chunk-5BDQNSP3.js';
|
|
3
|
+
import { useTr } from './chunk-7VNIEIR6.js';
|
|
1
4
|
import { nanoid } from 'nanoid/non-secure';
|
|
2
5
|
import { addEdge, applyEdgeChanges, applyNodeChanges } from '@xyflow/react';
|
|
3
6
|
import { create } from 'zustand';
|
|
4
7
|
import { produce } from 'immer';
|
|
8
|
+
import { useState, useCallback, useEffect } from 'react';
|
|
9
|
+
import { AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction } from '@burdenoff/fe-libs/ui';
|
|
10
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
11
|
|
|
6
12
|
var TAGS = [
|
|
7
13
|
{ value: "marketing", label: "Marketing", color: "#ef4444" },
|
|
@@ -337,7 +343,209 @@ var useFlowStore = create()((set, get) => ({
|
|
|
337
343
|
if (typeof window !== "undefined" && import.meta.env?.DEV) {
|
|
338
344
|
window.__fgFlowStore = useFlowStore;
|
|
339
345
|
}
|
|
346
|
+
var FLUIDGRIDS_ENTITY_TYPES = ["FLUIDGRIDS_WORKFLOW"];
|
|
347
|
+
function tagLabel(assignment) {
|
|
348
|
+
return assignment.tagInfo?.label ?? assignment.tagInfo?.key ?? assignment.tagId.slice(0, 8);
|
|
349
|
+
}
|
|
350
|
+
function useEntityTags(entityType, entityId) {
|
|
351
|
+
const [tags, setTags] = useState([]);
|
|
352
|
+
const [loading, setLoading] = useState(false);
|
|
353
|
+
const [error, setError] = useState(null);
|
|
354
|
+
const refetch = useCallback(async () => {
|
|
355
|
+
if (!entityId) {
|
|
356
|
+
setTags([]);
|
|
357
|
+
return [];
|
|
358
|
+
}
|
|
359
|
+
setLoading(true);
|
|
360
|
+
setError(null);
|
|
361
|
+
try {
|
|
362
|
+
const { data } = await getFluidGridsClient().query({
|
|
363
|
+
query: FluidgridsEntityTagsDocument,
|
|
364
|
+
variables: { input: { entityType, entityId } },
|
|
365
|
+
fetchPolicy: "network-only"
|
|
366
|
+
});
|
|
367
|
+
const next = data?.fluidgridsEntityTags ?? [];
|
|
368
|
+
setTags(next);
|
|
369
|
+
return next;
|
|
370
|
+
} catch (err) {
|
|
371
|
+
setError(err);
|
|
372
|
+
return [];
|
|
373
|
+
} finally {
|
|
374
|
+
setLoading(false);
|
|
375
|
+
}
|
|
376
|
+
}, [entityType, entityId]);
|
|
377
|
+
useEffect(() => {
|
|
378
|
+
void refetch();
|
|
379
|
+
}, [refetch]);
|
|
380
|
+
return { tags, loading, error, refetch };
|
|
381
|
+
}
|
|
382
|
+
function useAvailableTags(limit = 50, options = {}) {
|
|
383
|
+
const [availableTags, setAvailableTags] = useState([]);
|
|
384
|
+
const [loading, setLoading] = useState(false);
|
|
385
|
+
const skip = options.skip ?? false;
|
|
386
|
+
const fetchTags = useCallback(async () => {
|
|
387
|
+
if (skip) return;
|
|
388
|
+
setLoading(true);
|
|
389
|
+
try {
|
|
390
|
+
const { data } = await getFluidGridsClient().query({
|
|
391
|
+
query: AvailableFluidgridsTagsDocument,
|
|
392
|
+
variables: { limit },
|
|
393
|
+
fetchPolicy: "network-only"
|
|
394
|
+
});
|
|
395
|
+
setAvailableTags(data?.availableFluidgridsTags ?? []);
|
|
396
|
+
} catch {
|
|
397
|
+
setAvailableTags([]);
|
|
398
|
+
} finally {
|
|
399
|
+
setLoading(false);
|
|
400
|
+
}
|
|
401
|
+
}, [limit, skip]);
|
|
402
|
+
useEffect(() => {
|
|
403
|
+
void fetchTags();
|
|
404
|
+
}, [fetchTags]);
|
|
405
|
+
return { availableTags, loading, refetch: fetchTags };
|
|
406
|
+
}
|
|
407
|
+
function useSearchTags() {
|
|
408
|
+
return useCallback(
|
|
409
|
+
async (query, limit = 20) => {
|
|
410
|
+
if (!query.trim()) return [];
|
|
411
|
+
try {
|
|
412
|
+
const { data } = await getFluidGridsClient().query({
|
|
413
|
+
query: SearchFluidgridsTagsDocument,
|
|
414
|
+
variables: { query, limit },
|
|
415
|
+
fetchPolicy: "network-only"
|
|
416
|
+
});
|
|
417
|
+
return data?.searchFluidgridsTags ?? [];
|
|
418
|
+
} catch {
|
|
419
|
+
return [];
|
|
420
|
+
}
|
|
421
|
+
},
|
|
422
|
+
[]
|
|
423
|
+
);
|
|
424
|
+
}
|
|
425
|
+
function useTagEntity() {
|
|
426
|
+
return useCallback(
|
|
427
|
+
async (entityType, entityId, tagId) => {
|
|
428
|
+
const { data } = await getFluidGridsClient().mutate({
|
|
429
|
+
mutation: TagFluidgridsEntityDocument,
|
|
430
|
+
variables: { input: { entityType, entityId, tagId, source: "MANUAL" } }
|
|
431
|
+
});
|
|
432
|
+
return Boolean(data?.tagFluidgridsEntity);
|
|
433
|
+
},
|
|
434
|
+
[]
|
|
435
|
+
);
|
|
436
|
+
}
|
|
437
|
+
function useUntagEntity() {
|
|
438
|
+
return useCallback(
|
|
439
|
+
async (entityType, entityId, tagId) => {
|
|
440
|
+
const { data } = await getFluidGridsClient().mutate({
|
|
441
|
+
mutation: UntagFluidgridsEntityDocument,
|
|
442
|
+
variables: { input: { entityType, entityId, tagId } }
|
|
443
|
+
});
|
|
444
|
+
return Boolean(data?.untagFluidgridsEntity);
|
|
445
|
+
},
|
|
446
|
+
[]
|
|
447
|
+
);
|
|
448
|
+
}
|
|
449
|
+
function useReplaceEntityTags() {
|
|
450
|
+
return useCallback(
|
|
451
|
+
async (entityType, entityId, tagIds) => {
|
|
452
|
+
const { data } = await getFluidGridsClient().mutate({
|
|
453
|
+
mutation: ReplaceFluidgridsEntityTagsDocument,
|
|
454
|
+
variables: { input: { entityType, entityId, tagIds } }
|
|
455
|
+
});
|
|
456
|
+
return data?.replaceFluidgridsEntityTags ?? [];
|
|
457
|
+
},
|
|
458
|
+
[]
|
|
459
|
+
);
|
|
460
|
+
}
|
|
461
|
+
function useCreateTag() {
|
|
462
|
+
return useCallback(
|
|
463
|
+
async (label, color) => {
|
|
464
|
+
const { data } = await getFluidGridsClient().mutate({
|
|
465
|
+
mutation: CreateFluidgridsTagDocument,
|
|
466
|
+
variables: { input: { label, color } }
|
|
467
|
+
});
|
|
468
|
+
return data?.createFluidgridsTag ?? null;
|
|
469
|
+
},
|
|
470
|
+
[]
|
|
471
|
+
);
|
|
472
|
+
}
|
|
473
|
+
function useDraftEntityTags(entityType) {
|
|
474
|
+
const [draftTagIds, setDraftTagIds] = useState([]);
|
|
475
|
+
const tagEntity = useTagEntity();
|
|
476
|
+
const flushTags = useCallback(
|
|
477
|
+
async (entityId) => {
|
|
478
|
+
if (!entityId || draftTagIds.length === 0) return;
|
|
479
|
+
await Promise.all(
|
|
480
|
+
draftTagIds.map(
|
|
481
|
+
(tagId) => tagEntity(entityType, entityId, tagId).catch(() => false)
|
|
482
|
+
)
|
|
483
|
+
);
|
|
484
|
+
},
|
|
485
|
+
[draftTagIds, entityType, tagEntity]
|
|
486
|
+
);
|
|
487
|
+
return { draftTagIds, setDraftTagIds, flushTags };
|
|
488
|
+
}
|
|
489
|
+
function useWorkflowTagOverlay(limit = 100) {
|
|
490
|
+
const [tagsByKey, setTagsByKey] = useState({});
|
|
491
|
+
const fetchOverlay = useCallback(async () => {
|
|
492
|
+
try {
|
|
493
|
+
const { data } = await getFluidGridsClient().query({
|
|
494
|
+
query: WorkflowDefinitionsTagsDocument,
|
|
495
|
+
variables: { input: { limit } },
|
|
496
|
+
fetchPolicy: "network-only"
|
|
497
|
+
});
|
|
498
|
+
const next = {};
|
|
499
|
+
for (const item of data?.workflowDefinitions?.items ?? []) {
|
|
500
|
+
const assignments = item.tagAssignments ?? [];
|
|
501
|
+
if (assignments.length > 0 && !next[item.workflowKey]) {
|
|
502
|
+
next[item.workflowKey] = assignments;
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
setTagsByKey(next);
|
|
506
|
+
} catch {
|
|
507
|
+
setTagsByKey({});
|
|
508
|
+
}
|
|
509
|
+
}, [limit]);
|
|
510
|
+
useEffect(() => {
|
|
511
|
+
void fetchOverlay();
|
|
512
|
+
}, [fetchOverlay]);
|
|
513
|
+
return { tagsByKey, refetch: fetchOverlay };
|
|
514
|
+
}
|
|
515
|
+
function QuotaExhaustedDialog({
|
|
516
|
+
open,
|
|
517
|
+
onOpenChange,
|
|
518
|
+
onUpgrade,
|
|
519
|
+
title,
|
|
520
|
+
description
|
|
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
|
+
);
|
|
531
|
+
return /* @__PURE__ */ jsx(AlertDialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs(AlertDialogContent, { children: [
|
|
532
|
+
/* @__PURE__ */ jsxs(AlertDialogHeader, { children: [
|
|
533
|
+
/* @__PURE__ */ jsx(AlertDialogTitle, { children: resolvedTitle }),
|
|
534
|
+
/* @__PURE__ */ jsx(AlertDialogDescription, { children: resolvedDescription })
|
|
535
|
+
] }),
|
|
536
|
+
/* @__PURE__ */ jsxs(AlertDialogFooter, { children: [
|
|
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
|
+
) })
|
|
545
|
+
] })
|
|
546
|
+
] }) });
|
|
547
|
+
}
|
|
340
548
|
|
|
341
|
-
export { useFlowStore };
|
|
342
|
-
//# sourceMappingURL=chunk-
|
|
343
|
-
//# sourceMappingURL=chunk-
|
|
549
|
+
export { FLUIDGRIDS_ENTITY_TYPES, QuotaExhaustedDialog, tagLabel, useAvailableTags, useCreateTag, useDraftEntityTags, useEntityTags, useFlowStore, useReplaceEntityTags, useSearchTags, useTagEntity, useUntagEntity, useWorkflowTagOverlay };
|
|
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"]}
|