@dilipod/ui 0.4.14 → 0.4.16
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/components/workflow-flow.d.ts +29 -3
- package/dist/components/workflow-flow.d.ts.map +1 -1
- package/dist/components/workflow-viewer.d.ts +14 -0
- package/dist/components/workflow-viewer.d.ts.map +1 -1
- package/dist/index.js +382 -33
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +383 -34
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/components/workflow-flow.tsx +163 -5
- package/src/components/workflow-viewer.tsx +381 -78
|
@@ -14,14 +14,40 @@ export interface N8nWorkflow {
|
|
|
14
14
|
index: number;
|
|
15
15
|
}>>>>;
|
|
16
16
|
}
|
|
17
|
+
export interface SimBlock {
|
|
18
|
+
id: string;
|
|
19
|
+
type: string;
|
|
20
|
+
name: string;
|
|
21
|
+
position?: {
|
|
22
|
+
x: number;
|
|
23
|
+
y: number;
|
|
24
|
+
};
|
|
25
|
+
subBlocks?: Record<string, unknown>;
|
|
26
|
+
outputs?: Record<string, unknown>;
|
|
27
|
+
enabled?: boolean;
|
|
28
|
+
}
|
|
29
|
+
export interface SimWorkflow {
|
|
30
|
+
blocks?: Record<string, SimBlock>;
|
|
31
|
+
edges?: Array<{
|
|
32
|
+
id?: string;
|
|
33
|
+
source?: string;
|
|
34
|
+
target?: string;
|
|
35
|
+
sourceHandle?: string;
|
|
36
|
+
targetHandle?: string;
|
|
37
|
+
}>;
|
|
38
|
+
loops?: Record<string, unknown>;
|
|
39
|
+
parallels?: Record<string, unknown>;
|
|
40
|
+
}
|
|
17
41
|
export interface WorkflowFlowProps {
|
|
18
|
-
/** The
|
|
19
|
-
workflow: N8nWorkflow;
|
|
42
|
+
/** The workflow to visualize (n8n or Sim format) */
|
|
43
|
+
workflow: N8nWorkflow | SimWorkflow;
|
|
20
44
|
/** Height of the flow diagram container */
|
|
21
45
|
height?: number;
|
|
22
46
|
/** Additional CSS class name */
|
|
23
47
|
className?: string;
|
|
48
|
+
/** Platform type */
|
|
49
|
+
platform?: 'n8n' | 'sim';
|
|
24
50
|
}
|
|
25
|
-
export declare function WorkflowFlow({ workflow, height, className }: WorkflowFlowProps): import("react/jsx-runtime").JSX.Element;
|
|
51
|
+
export declare function WorkflowFlow({ workflow, height, className, platform }: WorkflowFlowProps): import("react/jsx-runtime").JSX.Element;
|
|
26
52
|
export default WorkflowFlow;
|
|
27
53
|
//# sourceMappingURL=workflow-flow.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-flow.d.ts","sourceRoot":"","sources":["../../src/components/workflow-flow.tsx"],"names":[],"mappings":"AAcA,OAAO,8BAA8B,CAAA;AAMrC,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrC;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,OAAO,EAAE,CAAA;IAChB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC,CAAC,CAAA;CACzG;AAED,MAAM,WAAW,iBAAiB;IAChC,
|
|
1
|
+
{"version":3,"file":"workflow-flow.d.ts","sourceRoot":"","sources":["../../src/components/workflow-flow.tsx"],"names":[],"mappings":"AAcA,OAAO,8BAA8B,CAAA;AAMrC,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrC;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,OAAO,EAAE,CAAA;IAChB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC,CAAC,CAAA;CACzG;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IACjC,KAAK,CAAC,EAAE,KAAK,CAAC;QACZ,EAAE,CAAC,EAAE,MAAM,CAAA;QACX,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,YAAY,CAAC,EAAE,MAAM,CAAA;KACtB,CAAC,CAAA;IACF,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACpC;AAED,MAAM,WAAW,iBAAiB;IAChC,oDAAoD;IACpD,QAAQ,EAAE,WAAW,GAAG,WAAW,CAAA;IACnC,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gCAAgC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,oBAAoB;IACpB,QAAQ,CAAC,EAAE,KAAK,GAAG,KAAK,CAAA;CACzB;AA+DD,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,MAAY,EAAE,SAAc,EAAE,QAAgB,EAAE,EAAE,iBAAiB,2CAgT3G;AAED,eAAe,YAAY,CAAA"}
|
|
@@ -156,6 +156,20 @@ export interface WorkflowViewerProps {
|
|
|
156
156
|
exportedAt: string;
|
|
157
157
|
}>;
|
|
158
158
|
}>;
|
|
159
|
+
/** Get a specific backup's full state */
|
|
160
|
+
getBackupState?: (workflowDefId: string, backupId: string) => Promise<{
|
|
161
|
+
success: boolean;
|
|
162
|
+
error?: string;
|
|
163
|
+
backup?: {
|
|
164
|
+
id: string;
|
|
165
|
+
version: number;
|
|
166
|
+
versionLabel?: string;
|
|
167
|
+
workflowName: string;
|
|
168
|
+
isDeployed: boolean;
|
|
169
|
+
exportedAt: string;
|
|
170
|
+
state: SimWorkflow | null;
|
|
171
|
+
};
|
|
172
|
+
}>;
|
|
159
173
|
/** Push workflow to Sim Studio */
|
|
160
174
|
pushToSim?: (workflowDefId: string) => Promise<{
|
|
161
175
|
success: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-viewer.d.ts","sourceRoot":"","sources":["../../src/components/workflow-viewer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA4B,SAAS,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"workflow-viewer.d.ts","sourceRoot":"","sources":["../../src/components/workflow-viewer.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -86,6 +86,7 @@ __export(workflow_flow_exports, {
|
|
|
86
86
|
});
|
|
87
87
|
function getNodeTypeLabel(type) {
|
|
88
88
|
const labels = {
|
|
89
|
+
// n8n types
|
|
89
90
|
"n8n-nodes-base.webhook": "Webhook",
|
|
90
91
|
"n8n-nodes-base.scheduleTrigger": "Schedule",
|
|
91
92
|
"n8n-nodes-base.if": "Condition",
|
|
@@ -95,7 +96,22 @@ function getNodeTypeLabel(type) {
|
|
|
95
96
|
"n8n-nodes-base.respondToWebhook": "Response",
|
|
96
97
|
"@n8n/n8n-nodes-langchain.agent": "AI Agent",
|
|
97
98
|
"@n8n/n8n-nodes-langchain.lmChatOpenAi": "OpenAI",
|
|
98
|
-
"@n8n/n8n-nodes-langchain.lmChatAnthropic": "Anthropic"
|
|
99
|
+
"@n8n/n8n-nodes-langchain.lmChatAnthropic": "Anthropic",
|
|
100
|
+
// Sim Studio types
|
|
101
|
+
"starter": "Webhook",
|
|
102
|
+
"webhook": "Webhook",
|
|
103
|
+
"agent": "AI Agent",
|
|
104
|
+
"llm": "LLM",
|
|
105
|
+
"openai": "OpenAI",
|
|
106
|
+
"anthropic": "Anthropic",
|
|
107
|
+
"api": "API Request",
|
|
108
|
+
"http_request": "HTTP Request",
|
|
109
|
+
"condition": "Condition",
|
|
110
|
+
"code": "Code",
|
|
111
|
+
"response": "Response",
|
|
112
|
+
"function": "Function",
|
|
113
|
+
"evaluator": "Evaluator",
|
|
114
|
+
"router": "Router"
|
|
99
115
|
};
|
|
100
116
|
return labels[type] || type.split(".").pop()?.replace(/([A-Z])/g, " $1").trim() || type;
|
|
101
117
|
}
|
|
@@ -107,10 +123,98 @@ function CustomNode({ data }) {
|
|
|
107
123
|
/* @__PURE__ */ jsxRuntime.jsx(react.Handle, { type: "source", position: react.Position.Right, className: "!bg-slate-300 !w-1.5 !h-1.5 !border-0" })
|
|
108
124
|
] });
|
|
109
125
|
}
|
|
110
|
-
function WorkflowFlow({ workflow, height = 350, className = "" }) {
|
|
126
|
+
function WorkflowFlow({ workflow, height = 350, className = "", platform = "n8n" }) {
|
|
111
127
|
const { initialNodes, initialEdges } = React50.useMemo(() => {
|
|
112
|
-
|
|
113
|
-
|
|
128
|
+
if (platform === "sim") {
|
|
129
|
+
const simWorkflow = workflow;
|
|
130
|
+
const blocks = simWorkflow.blocks || {};
|
|
131
|
+
const simEdges = simWorkflow.edges || [];
|
|
132
|
+
const blockList = Object.values(blocks);
|
|
133
|
+
if (blockList.length === 0) {
|
|
134
|
+
return { initialNodes: [], initialEdges: [] };
|
|
135
|
+
}
|
|
136
|
+
const forwardEdges2 = /* @__PURE__ */ new Map();
|
|
137
|
+
const backwardEdges2 = /* @__PURE__ */ new Map();
|
|
138
|
+
simEdges.forEach((edge) => {
|
|
139
|
+
const from = edge.source;
|
|
140
|
+
const to = edge.target;
|
|
141
|
+
if (from && to) {
|
|
142
|
+
if (!forwardEdges2.has(from)) forwardEdges2.set(from, []);
|
|
143
|
+
forwardEdges2.get(from).push(to);
|
|
144
|
+
if (!backwardEdges2.has(to)) backwardEdges2.set(to, []);
|
|
145
|
+
backwardEdges2.get(to).push(from);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
const triggerBlocks = blockList.filter(
|
|
149
|
+
(b) => b.type === "starter" || b.type === "webhook" || b.type === "api"
|
|
150
|
+
);
|
|
151
|
+
const roots2 = triggerBlocks.length > 0 ? triggerBlocks : blockList.filter((b) => !backwardEdges2.has(b.id) || backwardEdges2.get(b.id).length === 0);
|
|
152
|
+
const levels2 = /* @__PURE__ */ new Map();
|
|
153
|
+
const queue2 = [];
|
|
154
|
+
roots2.forEach((r) => {
|
|
155
|
+
levels2.set(r.id, 0);
|
|
156
|
+
queue2.push(r.id);
|
|
157
|
+
});
|
|
158
|
+
const visited2 = /* @__PURE__ */ new Set();
|
|
159
|
+
while (queue2.length > 0) {
|
|
160
|
+
const id = queue2.shift();
|
|
161
|
+
if (visited2.has(id)) continue;
|
|
162
|
+
visited2.add(id);
|
|
163
|
+
const children = forwardEdges2.get(id) || [];
|
|
164
|
+
const myLevel = levels2.get(id) || 0;
|
|
165
|
+
children.forEach((child) => {
|
|
166
|
+
const childLevel = levels2.get(child);
|
|
167
|
+
if (childLevel === void 0 || myLevel + 1 > childLevel) {
|
|
168
|
+
levels2.set(child, myLevel + 1);
|
|
169
|
+
}
|
|
170
|
+
if (!visited2.has(child)) {
|
|
171
|
+
queue2.push(child);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
blockList.forEach((block) => {
|
|
176
|
+
if (!levels2.has(block.id)) {
|
|
177
|
+
const maxLevel = Math.max(0, ...Array.from(levels2.values()));
|
|
178
|
+
levels2.set(block.id, maxLevel + 1);
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
const nodesByLevel2 = /* @__PURE__ */ new Map();
|
|
182
|
+
levels2.forEach((level, id) => {
|
|
183
|
+
if (!nodesByLevel2.has(level)) nodesByLevel2.set(level, []);
|
|
184
|
+
nodesByLevel2.get(level).push(id);
|
|
185
|
+
});
|
|
186
|
+
const xGap2 = 170;
|
|
187
|
+
const yGap2 = 70;
|
|
188
|
+
const positions2 = /* @__PURE__ */ new Map();
|
|
189
|
+
const sortedLevels2 = Array.from(nodesByLevel2.keys()).sort((a, b) => a - b);
|
|
190
|
+
sortedLevels2.forEach((level) => {
|
|
191
|
+
const nodesInLevel = nodesByLevel2.get(level);
|
|
192
|
+
const totalHeight = (nodesInLevel.length - 1) * yGap2;
|
|
193
|
+
const startY = -totalHeight / 2;
|
|
194
|
+
nodesInLevel.forEach((id, i) => {
|
|
195
|
+
positions2.set(id, { x: level * xGap2, y: startY + i * yGap2 });
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
const nodes3 = blockList.map((block) => ({
|
|
199
|
+
id: block.id,
|
|
200
|
+
type: "custom",
|
|
201
|
+
position: positions2.get(block.id) || { x: 0, y: 0 },
|
|
202
|
+
data: { label: block.name || block.type, type: block.type }
|
|
203
|
+
}));
|
|
204
|
+
const edges3 = simEdges.map((edge, idx) => ({
|
|
205
|
+
id: edge.id || `edge-${idx}`,
|
|
206
|
+
source: edge.source || "",
|
|
207
|
+
target: edge.target || "",
|
|
208
|
+
type: "smoothstep",
|
|
209
|
+
pathOptions: { borderRadius: 20 },
|
|
210
|
+
style: { stroke: "#94a3b8", strokeWidth: 1.5 },
|
|
211
|
+
markerEnd: { type: react.MarkerType.ArrowClosed, color: "#94a3b8", width: 14, height: 14 }
|
|
212
|
+
})).filter((e) => e.source && e.target);
|
|
213
|
+
return { initialNodes: nodes3, initialEdges: edges3 };
|
|
214
|
+
}
|
|
215
|
+
const n8nWorkflow = workflow;
|
|
216
|
+
const n8nNodes = n8nWorkflow.nodes || [];
|
|
217
|
+
const connections = n8nWorkflow.connections || {};
|
|
114
218
|
const nodeIdMap = new Map(n8nNodes.map((n) => [n.name, n.id || n.name]));
|
|
115
219
|
const forwardEdges = /* @__PURE__ */ new Map();
|
|
116
220
|
const backwardEdges = /* @__PURE__ */ new Map();
|
|
@@ -4781,6 +4885,55 @@ function defaultFormatDistance(date, options) {
|
|
|
4781
4885
|
else result = `${diffDays} day${diffDays > 1 ? "s" : ""}`;
|
|
4782
4886
|
return options?.addSuffix ? `${result} ago` : result;
|
|
4783
4887
|
}
|
|
4888
|
+
function computeWorkflowDiff(stateA, stateB) {
|
|
4889
|
+
if (!stateA || !stateB) {
|
|
4890
|
+
return {
|
|
4891
|
+
blocksAdded: [],
|
|
4892
|
+
blocksRemoved: [],
|
|
4893
|
+
blocksModified: [],
|
|
4894
|
+
edgesAdded: 0,
|
|
4895
|
+
edgesRemoved: 0,
|
|
4896
|
+
summary: "Unable to compare - missing workflow data"
|
|
4897
|
+
};
|
|
4898
|
+
}
|
|
4899
|
+
const blocksA = stateA.blocks || {};
|
|
4900
|
+
const blocksB = stateB.blocks || {};
|
|
4901
|
+
const edgesA = stateA.edges || [];
|
|
4902
|
+
const edgesB = stateB.edges || [];
|
|
4903
|
+
const blockIdsA = new Set(Object.keys(blocksA));
|
|
4904
|
+
const blockIdsB = new Set(Object.keys(blocksB));
|
|
4905
|
+
const blocksAdded = [...blockIdsB].filter((id) => !blockIdsA.has(id));
|
|
4906
|
+
const blocksRemoved = [...blockIdsA].filter((id) => !blockIdsB.has(id));
|
|
4907
|
+
const blocksModified = [];
|
|
4908
|
+
for (const id of blockIdsA) {
|
|
4909
|
+
if (blockIdsB.has(id)) {
|
|
4910
|
+
const blockA = blocksA[id];
|
|
4911
|
+
const blockB = blocksB[id];
|
|
4912
|
+
if (JSON.stringify(blockA) !== JSON.stringify(blockB)) {
|
|
4913
|
+
blocksModified.push(id);
|
|
4914
|
+
}
|
|
4915
|
+
}
|
|
4916
|
+
}
|
|
4917
|
+
const edgeSignature = (e) => `${e.source || e.from}->${e.target || e.to}`;
|
|
4918
|
+
const edgeSigsA = new Set(edgesA.map(edgeSignature));
|
|
4919
|
+
const edgeSigsB = new Set(edgesB.map(edgeSignature));
|
|
4920
|
+
const edgesAdded = [...edgeSigsB].filter((sig) => !edgeSigsA.has(sig)).length;
|
|
4921
|
+
const edgesRemoved = [...edgeSigsA].filter((sig) => !edgeSigsB.has(sig)).length;
|
|
4922
|
+
const changes = [];
|
|
4923
|
+
if (blocksAdded.length > 0) changes.push(`+${blocksAdded.length} block${blocksAdded.length > 1 ? "s" : ""}`);
|
|
4924
|
+
if (blocksRemoved.length > 0) changes.push(`-${blocksRemoved.length} block${blocksRemoved.length > 1 ? "s" : ""}`);
|
|
4925
|
+
if (blocksModified.length > 0) changes.push(`~${blocksModified.length} modified`);
|
|
4926
|
+
if (edgesAdded > 0) changes.push(`+${edgesAdded} edge${edgesAdded > 1 ? "s" : ""}`);
|
|
4927
|
+
if (edgesRemoved > 0) changes.push(`-${edgesRemoved} edge${edgesRemoved > 1 ? "s" : ""}`);
|
|
4928
|
+
return {
|
|
4929
|
+
blocksAdded,
|
|
4930
|
+
blocksRemoved,
|
|
4931
|
+
blocksModified,
|
|
4932
|
+
edgesAdded,
|
|
4933
|
+
edgesRemoved,
|
|
4934
|
+
summary: changes.length > 0 ? changes.join(", ") : "No changes detected"
|
|
4935
|
+
};
|
|
4936
|
+
}
|
|
4784
4937
|
function N8nWorkflowSummary({ workflow, showFlow = false }) {
|
|
4785
4938
|
const nodes = workflow.nodes || [];
|
|
4786
4939
|
const triggerNode = nodes.find(
|
|
@@ -5002,6 +5155,12 @@ function WorkflowViewer({
|
|
|
5002
5155
|
const [pushingToSim, setPushingToSim] = React50.useState(false);
|
|
5003
5156
|
const [pullingFromSim, setPullingFromSim] = React50.useState(false);
|
|
5004
5157
|
const [switchingPlatform, setSwitchingPlatform] = React50.useState(false);
|
|
5158
|
+
const [diffMode, setDiffMode] = React50.useState(false);
|
|
5159
|
+
const [selectedBackupA, setSelectedBackupA] = React50.useState(null);
|
|
5160
|
+
const [selectedBackupB, setSelectedBackupB] = React50.useState(null);
|
|
5161
|
+
const [backupStateA, setBackupStateA] = React50.useState(null);
|
|
5162
|
+
const [backupStateB, setBackupStateB] = React50.useState(null);
|
|
5163
|
+
const [loadingDiff, setLoadingDiff] = React50.useState(false);
|
|
5005
5164
|
const [localPlatform, setLocalPlatform] = React50.useState(platform);
|
|
5006
5165
|
const [localIsActive, setLocalIsActive] = React50.useState(isActive ?? true);
|
|
5007
5166
|
const hasUnsavedChanges = localPlatform !== platform || localIsActive !== (isActive ?? true);
|
|
@@ -5204,6 +5363,42 @@ function WorkflowViewer({
|
|
|
5204
5363
|
setViewMode("backups");
|
|
5205
5364
|
loadBackups();
|
|
5206
5365
|
}
|
|
5366
|
+
async function loadBackupForDiff(backupId, slot) {
|
|
5367
|
+
if (!workflowDefinitionId || !apiHandlers?.getBackupState) {
|
|
5368
|
+
return;
|
|
5369
|
+
}
|
|
5370
|
+
setLoadingDiff(true);
|
|
5371
|
+
try {
|
|
5372
|
+
const result = await apiHandlers.getBackupState(workflowDefinitionId, backupId);
|
|
5373
|
+
if (result.success && result.backup) {
|
|
5374
|
+
if (slot === "A") {
|
|
5375
|
+
setBackupStateA(result.backup.state);
|
|
5376
|
+
setSelectedBackupA(backupId);
|
|
5377
|
+
} else {
|
|
5378
|
+
setBackupStateB(result.backup.state);
|
|
5379
|
+
setSelectedBackupB(backupId);
|
|
5380
|
+
}
|
|
5381
|
+
}
|
|
5382
|
+
} catch {
|
|
5383
|
+
console.error("Failed to load backup for diff");
|
|
5384
|
+
} finally {
|
|
5385
|
+
setLoadingDiff(false);
|
|
5386
|
+
}
|
|
5387
|
+
}
|
|
5388
|
+
function startDiffMode() {
|
|
5389
|
+
setDiffMode(true);
|
|
5390
|
+
setSelectedBackupA(null);
|
|
5391
|
+
setSelectedBackupB(null);
|
|
5392
|
+
setBackupStateA(null);
|
|
5393
|
+
setBackupStateB(null);
|
|
5394
|
+
}
|
|
5395
|
+
function exitDiffMode() {
|
|
5396
|
+
setDiffMode(false);
|
|
5397
|
+
setSelectedBackupA(null);
|
|
5398
|
+
setSelectedBackupB(null);
|
|
5399
|
+
setBackupStateA(null);
|
|
5400
|
+
setBackupStateB(null);
|
|
5401
|
+
}
|
|
5207
5402
|
function openInSimStudio() {
|
|
5208
5403
|
if (simStudioUrl && simWorkflowId) {
|
|
5209
5404
|
window.open(`${simStudioUrl}/w/${simWorkflowId}`, "_blank");
|
|
@@ -5460,7 +5655,7 @@ function WorkflowViewer({
|
|
|
5460
5655
|
]
|
|
5461
5656
|
}
|
|
5462
5657
|
),
|
|
5463
|
-
|
|
5658
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
5464
5659
|
"button",
|
|
5465
5660
|
{
|
|
5466
5661
|
onClick: () => setViewMode("flow"),
|
|
@@ -5584,14 +5779,15 @@ function WorkflowViewer({
|
|
|
5584
5779
|
children: pushingToSim ? "Pushing..." : "Push to Sim"
|
|
5585
5780
|
}
|
|
5586
5781
|
),
|
|
5587
|
-
|
|
5782
|
+
apiHandlers?.pullFromSim && /* @__PURE__ */ jsxRuntime.jsx(
|
|
5588
5783
|
Button,
|
|
5589
5784
|
{
|
|
5590
5785
|
onClick: pullFromSim,
|
|
5591
|
-
disabled: pullingFromSim,
|
|
5786
|
+
disabled: pullingFromSim || !simWorkflowId,
|
|
5592
5787
|
variant: "outline",
|
|
5593
5788
|
size: "sm",
|
|
5594
5789
|
icon: /* @__PURE__ */ jsxRuntime.jsx(react_star.CloudArrowDown, { size: 16 }),
|
|
5790
|
+
title: !simWorkflowId ? "No Sim workflow linked yet. Push to Sim first." : void 0,
|
|
5595
5791
|
children: pullingFromSim ? "Pulling..." : "Pull from Sim"
|
|
5596
5792
|
}
|
|
5597
5793
|
),
|
|
@@ -5657,43 +5853,196 @@ function WorkflowViewer({
|
|
|
5657
5853
|
)
|
|
5658
5854
|
] }),
|
|
5659
5855
|
/* @__PURE__ */ jsxRuntime.jsx("pre", { className: "p-4 bg-[var(--black)] text-gray-100 text-xs overflow-auto max-h-[500px] font-mono", children: JSON.stringify(workflow, null, 2) })
|
|
5660
|
-
] }) : viewMode === "flow" ?
|
|
5856
|
+
] }) : viewMode === "flow" ? /* @__PURE__ */ jsxRuntime.jsx(React50.Suspense, { fallback: loadingComponent || DefaultLoading, children: /* @__PURE__ */ jsxRuntime.jsx(WorkflowFlow2, { workflow, height: 380, platform }) }) : viewMode === "backups" ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
|
|
5661
5857
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
|
|
5662
|
-
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-sm font-medium", children: "Backup History" }),
|
|
5663
|
-
/* @__PURE__ */ jsxRuntime.
|
|
5664
|
-
|
|
5665
|
-
|
|
5666
|
-
|
|
5667
|
-
|
|
5668
|
-
|
|
5669
|
-
|
|
5670
|
-
|
|
5671
|
-
|
|
5858
|
+
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-sm font-medium", children: diffMode ? "Compare Versions" : "Backup History" }),
|
|
5859
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
5860
|
+
!diffMode && backups.length >= 2 && apiHandlers?.getBackupState && /* @__PURE__ */ jsxRuntime.jsx(
|
|
5861
|
+
Button,
|
|
5862
|
+
{
|
|
5863
|
+
onClick: startDiffMode,
|
|
5864
|
+
variant: "outline",
|
|
5865
|
+
size: "sm",
|
|
5866
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(react_star.ArrowsLeftRight, { size: 14 }),
|
|
5867
|
+
children: "Compare"
|
|
5868
|
+
}
|
|
5869
|
+
),
|
|
5870
|
+
diffMode && /* @__PURE__ */ jsxRuntime.jsx(
|
|
5871
|
+
Button,
|
|
5872
|
+
{
|
|
5873
|
+
onClick: exitDiffMode,
|
|
5874
|
+
variant: "outline",
|
|
5875
|
+
size: "sm",
|
|
5876
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(react_star.X, { size: 14 }),
|
|
5877
|
+
children: "Cancel"
|
|
5878
|
+
}
|
|
5879
|
+
),
|
|
5880
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5881
|
+
Button,
|
|
5882
|
+
{
|
|
5883
|
+
onClick: () => {
|
|
5884
|
+
exitDiffMode();
|
|
5885
|
+
setViewMode("summary");
|
|
5886
|
+
},
|
|
5887
|
+
variant: "outline",
|
|
5888
|
+
size: "sm",
|
|
5889
|
+
children: "Back to Summary"
|
|
5890
|
+
}
|
|
5891
|
+
)
|
|
5892
|
+
] })
|
|
5672
5893
|
] }),
|
|
5673
|
-
|
|
5894
|
+
diffMode && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
|
|
5895
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
|
|
5896
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-3 bg-muted/50 rounded border border-border", children: [
|
|
5897
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-medium text-muted-foreground mb-2", children: "From (older)" }),
|
|
5898
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
5899
|
+
Select,
|
|
5900
|
+
{
|
|
5901
|
+
value: selectedBackupA || "",
|
|
5902
|
+
onChange: (e) => loadBackupForDiff(e.target.value, "A"),
|
|
5903
|
+
disabled: loadingDiff,
|
|
5904
|
+
className: "w-full",
|
|
5905
|
+
children: [
|
|
5906
|
+
/* @__PURE__ */ jsxRuntime.jsx("option", { value: "", children: "Select version..." }),
|
|
5907
|
+
backups.map((b) => /* @__PURE__ */ jsxRuntime.jsxs("option", { value: b.id, disabled: b.id === selectedBackupB, children: [
|
|
5908
|
+
"v",
|
|
5909
|
+
b.version,
|
|
5910
|
+
" - ",
|
|
5911
|
+
b.versionLabel || b.workflowName
|
|
5912
|
+
] }, b.id))
|
|
5913
|
+
]
|
|
5914
|
+
}
|
|
5915
|
+
)
|
|
5916
|
+
] }),
|
|
5917
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-3 bg-muted/50 rounded border border-border", children: [
|
|
5918
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-medium text-muted-foreground mb-2", children: "To (newer)" }),
|
|
5919
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
5920
|
+
Select,
|
|
5921
|
+
{
|
|
5922
|
+
value: selectedBackupB || "",
|
|
5923
|
+
onChange: (e) => loadBackupForDiff(e.target.value, "B"),
|
|
5924
|
+
disabled: loadingDiff,
|
|
5925
|
+
className: "w-full",
|
|
5926
|
+
children: [
|
|
5927
|
+
/* @__PURE__ */ jsxRuntime.jsx("option", { value: "", children: "Select version..." }),
|
|
5928
|
+
backups.map((b) => /* @__PURE__ */ jsxRuntime.jsxs("option", { value: b.id, disabled: b.id === selectedBackupA, children: [
|
|
5929
|
+
"v",
|
|
5930
|
+
b.version,
|
|
5931
|
+
" - ",
|
|
5932
|
+
b.versionLabel || b.workflowName
|
|
5933
|
+
] }, b.id))
|
|
5934
|
+
]
|
|
5935
|
+
}
|
|
5936
|
+
)
|
|
5937
|
+
] })
|
|
5938
|
+
] }),
|
|
5939
|
+
loadingDiff ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "py-4 text-center text-muted-foreground", children: "Loading versions..." }) : backupStateA && backupStateB ? (() => {
|
|
5940
|
+
const diff = computeWorkflowDiff(backupStateA, backupStateB);
|
|
5941
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-3", children: [
|
|
5942
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-3 bg-muted/30 rounded border border-border", children: [
|
|
5943
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium mb-2", children: "Changes Summary" }),
|
|
5944
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: diff.summary })
|
|
5945
|
+
] }),
|
|
5946
|
+
diff.blocksAdded.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-3 bg-green-500/10 rounded border border-green-500/30", children: [
|
|
5947
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-green-600 dark:text-green-400 mb-2", children: [
|
|
5948
|
+
/* @__PURE__ */ jsxRuntime.jsx(react_star.Plus, { size: 14 }),
|
|
5949
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xs font-medium", children: [
|
|
5950
|
+
"Blocks Added (",
|
|
5951
|
+
diff.blocksAdded.length,
|
|
5952
|
+
")"
|
|
5953
|
+
] })
|
|
5954
|
+
] }),
|
|
5955
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: diff.blocksAdded.map((id) => {
|
|
5956
|
+
const block = backupStateB?.blocks?.[id];
|
|
5957
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "success", size: "sm", children: block?.name || id }, id);
|
|
5958
|
+
}) })
|
|
5959
|
+
] }),
|
|
5960
|
+
diff.blocksRemoved.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-3 bg-red-500/10 rounded border border-red-500/30", children: [
|
|
5961
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-red-600 dark:text-red-400 mb-2", children: [
|
|
5962
|
+
/* @__PURE__ */ jsxRuntime.jsx(react_star.Minus, { size: 14 }),
|
|
5963
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xs font-medium", children: [
|
|
5964
|
+
"Blocks Removed (",
|
|
5965
|
+
diff.blocksRemoved.length,
|
|
5966
|
+
")"
|
|
5967
|
+
] })
|
|
5968
|
+
] }),
|
|
5969
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: diff.blocksRemoved.map((id) => {
|
|
5970
|
+
const block = backupStateA?.blocks?.[id];
|
|
5971
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "error", size: "sm", children: block?.name || id }, id);
|
|
5972
|
+
}) })
|
|
5973
|
+
] }),
|
|
5974
|
+
diff.blocksModified.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-3 bg-amber-500/10 rounded border border-amber-500/30", children: [
|
|
5975
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-amber-600 dark:text-amber-400 mb-2", children: [
|
|
5976
|
+
/* @__PURE__ */ jsxRuntime.jsx(react_star.Pencil, { size: 14 }),
|
|
5977
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-xs font-medium", children: [
|
|
5978
|
+
"Blocks Modified (",
|
|
5979
|
+
diff.blocksModified.length,
|
|
5980
|
+
")"
|
|
5981
|
+
] })
|
|
5982
|
+
] }),
|
|
5983
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: diff.blocksModified.map((id) => {
|
|
5984
|
+
const block = backupStateB?.blocks?.[id];
|
|
5985
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "warning", size: "sm", children: block?.name || id }, id);
|
|
5986
|
+
}) })
|
|
5987
|
+
] }),
|
|
5988
|
+
(diff.edgesAdded > 0 || diff.edgesRemoved > 0) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-3 bg-muted/30 rounded border border-border", children: [
|
|
5989
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs font-medium text-muted-foreground mb-1", children: "Connection Changes" }),
|
|
5990
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-3 text-sm", children: [
|
|
5991
|
+
diff.edgesAdded > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-green-600 dark:text-green-400", children: [
|
|
5992
|
+
"+",
|
|
5993
|
+
diff.edgesAdded,
|
|
5994
|
+
" added"
|
|
5995
|
+
] }),
|
|
5996
|
+
diff.edgesRemoved > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-red-600 dark:text-red-400", children: [
|
|
5997
|
+
"-",
|
|
5998
|
+
diff.edgesRemoved,
|
|
5999
|
+
" removed"
|
|
6000
|
+
] })
|
|
6001
|
+
] })
|
|
6002
|
+
] })
|
|
6003
|
+
] });
|
|
6004
|
+
})() : selectedBackupA || selectedBackupB ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "py-4 text-center text-muted-foreground text-sm", children: "Select both versions to compare" }) : null
|
|
6005
|
+
] }),
|
|
6006
|
+
!diffMode && /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: loadingBackups ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "py-8 text-center text-muted-foreground", children: "Loading backups..." }) : backups.length === 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "py-8 text-center text-muted-foreground", children: [
|
|
5674
6007
|
/* @__PURE__ */ jsxRuntime.jsx(react_star.ClockCounterClockwise, { size: 32, className: "mx-auto mb-2 opacity-50" }),
|
|
5675
6008
|
/* @__PURE__ */ jsxRuntime.jsx("p", { children: "No backups yet" }),
|
|
5676
6009
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs mt-1", children: 'Click "Export from Sim" to create a backup' })
|
|
5677
|
-
] }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-2", children: backups.map((backup) => /* @__PURE__ */ jsxRuntime.
|
|
6010
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-2", children: backups.map((backup, index) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
5678
6011
|
"div",
|
|
5679
6012
|
{
|
|
5680
6013
|
className: "flex items-center justify-between p-3 bg-muted/50 rounded border border-border",
|
|
5681
|
-
children:
|
|
5682
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center
|
|
5683
|
-
"
|
|
5684
|
-
|
|
5685
|
-
|
|
5686
|
-
|
|
5687
|
-
/* @__PURE__ */ jsxRuntime.
|
|
5688
|
-
|
|
5689
|
-
|
|
5690
|
-
|
|
6014
|
+
children: [
|
|
6015
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
|
|
6016
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center w-8 h-8 rounded bg-primary/10 text-primary text-sm font-semibold", children: [
|
|
6017
|
+
"v",
|
|
6018
|
+
backup.version
|
|
6019
|
+
] }),
|
|
6020
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
6021
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium", children: backup.versionLabel || backup.workflowName }),
|
|
6022
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs text-muted-foreground", children: [
|
|
6023
|
+
formatDistance(new Date(backup.exportedAt), { addSuffix: true }),
|
|
6024
|
+
backup.isDeployed && /* @__PURE__ */ jsxRuntime.jsx(Badge, { variant: "success", size: "sm", className: "ml-2", children: "Deployed" })
|
|
6025
|
+
] })
|
|
5691
6026
|
] })
|
|
5692
|
-
] })
|
|
5693
|
-
|
|
6027
|
+
] }),
|
|
6028
|
+
index < backups.length - 1 && apiHandlers?.getBackupState && /* @__PURE__ */ jsxRuntime.jsx(
|
|
6029
|
+
Button,
|
|
6030
|
+
{
|
|
6031
|
+
variant: "ghost",
|
|
6032
|
+
size: "sm",
|
|
6033
|
+
onClick: () => {
|
|
6034
|
+
startDiffMode();
|
|
6035
|
+
loadBackupForDiff(backups[index + 1].id, "A");
|
|
6036
|
+
loadBackupForDiff(backup.id, "B");
|
|
6037
|
+
},
|
|
6038
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(react_star.ArrowsLeftRight, { size: 14 }),
|
|
6039
|
+
children: "Diff"
|
|
6040
|
+
}
|
|
6041
|
+
)
|
|
6042
|
+
]
|
|
5694
6043
|
},
|
|
5695
6044
|
backup.id
|
|
5696
|
-
)) })
|
|
6045
|
+
)) }) })
|
|
5697
6046
|
] }) : platform === "n8n" ? /* @__PURE__ */ jsxRuntime.jsx(N8nWorkflowSummary, { workflow, showFlow: false }) : /* @__PURE__ */ jsxRuntime.jsx(SimWorkflowSummary, { workflow }) })
|
|
5698
6047
|
] })
|
|
5699
6048
|
] });
|