@dilipod/ui 0.4.15 → 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-viewer.d.ts +14 -0
- package/dist/components/workflow-viewer.d.ts.map +1 -1
- package/dist/index.js +272 -27
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +273 -28
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/components/workflow-viewer.tsx +367 -60
|
@@ -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
|
@@ -4885,6 +4885,55 @@ function defaultFormatDistance(date, options) {
|
|
|
4885
4885
|
else result = `${diffDays} day${diffDays > 1 ? "s" : ""}`;
|
|
4886
4886
|
return options?.addSuffix ? `${result} ago` : result;
|
|
4887
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
|
+
}
|
|
4888
4937
|
function N8nWorkflowSummary({ workflow, showFlow = false }) {
|
|
4889
4938
|
const nodes = workflow.nodes || [];
|
|
4890
4939
|
const triggerNode = nodes.find(
|
|
@@ -5106,6 +5155,12 @@ function WorkflowViewer({
|
|
|
5106
5155
|
const [pushingToSim, setPushingToSim] = React50.useState(false);
|
|
5107
5156
|
const [pullingFromSim, setPullingFromSim] = React50.useState(false);
|
|
5108
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);
|
|
5109
5164
|
const [localPlatform, setLocalPlatform] = React50.useState(platform);
|
|
5110
5165
|
const [localIsActive, setLocalIsActive] = React50.useState(isActive ?? true);
|
|
5111
5166
|
const hasUnsavedChanges = localPlatform !== platform || localIsActive !== (isActive ?? true);
|
|
@@ -5308,6 +5363,42 @@ function WorkflowViewer({
|
|
|
5308
5363
|
setViewMode("backups");
|
|
5309
5364
|
loadBackups();
|
|
5310
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
|
+
}
|
|
5311
5402
|
function openInSimStudio() {
|
|
5312
5403
|
if (simStudioUrl && simWorkflowId) {
|
|
5313
5404
|
window.open(`${simStudioUrl}/w/${simWorkflowId}`, "_blank");
|
|
@@ -5688,14 +5779,15 @@ function WorkflowViewer({
|
|
|
5688
5779
|
children: pushingToSim ? "Pushing..." : "Push to Sim"
|
|
5689
5780
|
}
|
|
5690
5781
|
),
|
|
5691
|
-
|
|
5782
|
+
apiHandlers?.pullFromSim && /* @__PURE__ */ jsxRuntime.jsx(
|
|
5692
5783
|
Button,
|
|
5693
5784
|
{
|
|
5694
5785
|
onClick: pullFromSim,
|
|
5695
|
-
disabled: pullingFromSim,
|
|
5786
|
+
disabled: pullingFromSim || !simWorkflowId,
|
|
5696
5787
|
variant: "outline",
|
|
5697
5788
|
size: "sm",
|
|
5698
5789
|
icon: /* @__PURE__ */ jsxRuntime.jsx(react_star.CloudArrowDown, { size: 16 }),
|
|
5790
|
+
title: !simWorkflowId ? "No Sim workflow linked yet. Push to Sim first." : void 0,
|
|
5699
5791
|
children: pullingFromSim ? "Pulling..." : "Pull from Sim"
|
|
5700
5792
|
}
|
|
5701
5793
|
),
|
|
@@ -5763,41 +5855,194 @@ function WorkflowViewer({
|
|
|
5763
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) })
|
|
5764
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: [
|
|
5765
5857
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
|
|
5766
|
-
/* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-sm font-medium", children: "Backup History" }),
|
|
5767
|
-
/* @__PURE__ */ jsxRuntime.
|
|
5768
|
-
|
|
5769
|
-
|
|
5770
|
-
|
|
5771
|
-
|
|
5772
|
-
|
|
5773
|
-
|
|
5774
|
-
|
|
5775
|
-
|
|
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
|
+
] })
|
|
5776
5893
|
] }),
|
|
5777
|
-
|
|
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: [
|
|
5778
6007
|
/* @__PURE__ */ jsxRuntime.jsx(react_star.ClockCounterClockwise, { size: 32, className: "mx-auto mb-2 opacity-50" }),
|
|
5779
6008
|
/* @__PURE__ */ jsxRuntime.jsx("p", { children: "No backups yet" }),
|
|
5780
6009
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs mt-1", children: 'Click "Export from Sim" to create a backup' })
|
|
5781
|
-
] }) : /* @__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(
|
|
5782
6011
|
"div",
|
|
5783
6012
|
{
|
|
5784
6013
|
className: "flex items-center justify-between p-3 bg-muted/50 rounded border border-border",
|
|
5785
|
-
children:
|
|
5786
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center
|
|
5787
|
-
"
|
|
5788
|
-
|
|
5789
|
-
|
|
5790
|
-
|
|
5791
|
-
/* @__PURE__ */ jsxRuntime.
|
|
5792
|
-
|
|
5793
|
-
|
|
5794
|
-
|
|
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
|
+
] })
|
|
5795
6026
|
] })
|
|
5796
|
-
] })
|
|
5797
|
-
|
|
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
|
+
]
|
|
5798
6043
|
},
|
|
5799
6044
|
backup.id
|
|
5800
|
-
)) })
|
|
6045
|
+
)) }) })
|
|
5801
6046
|
] }) : platform === "n8n" ? /* @__PURE__ */ jsxRuntime.jsx(N8nWorkflowSummary, { workflow, showFlow: false }) : /* @__PURE__ */ jsxRuntime.jsx(SimWorkflowSummary, { workflow }) })
|
|
5802
6047
|
] })
|
|
5803
6048
|
] });
|