Migrate nodes from default diagram to new created diagram
This commit is contained in:
parent
3b8fb6d55b
commit
3058fe5285
40
backend/diagrams/diagram_dvir.json
Normal file
40
backend/diagrams/diagram_dvir.json
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"nodes": [
|
||||||
|
{
|
||||||
|
"id": "1",
|
||||||
|
"type": "custom",
|
||||||
|
"data": {
|
||||||
|
"label": "Node 1",
|
||||||
|
"icon": "https://s3.dvirlabs.com/lab-icons/default.svg"
|
||||||
|
},
|
||||||
|
"position": {
|
||||||
|
"x": 303.3305220688578,
|
||||||
|
"y": 269.54671638680003
|
||||||
|
},
|
||||||
|
"width": 104,
|
||||||
|
"height": 104
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "2",
|
||||||
|
"type": "custom",
|
||||||
|
"data": {
|
||||||
|
"label": "Node 2",
|
||||||
|
"icon": "https://s3.dvirlabs.com/lab-icons/default.svg"
|
||||||
|
},
|
||||||
|
"position": {
|
||||||
|
"x": 87.45932948916324,
|
||||||
|
"y": 183.0493678043483
|
||||||
|
},
|
||||||
|
"width": 104,
|
||||||
|
"height": 104
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"edges": [
|
||||||
|
{
|
||||||
|
"id": "reactflow__edge-1source-left-2target-right",
|
||||||
|
"source": "1",
|
||||||
|
"target": "2",
|
||||||
|
"animated": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -44,17 +44,18 @@ function Diagram() {
|
|||||||
if (diagrams.length > 0) {
|
if (diagrams.length > 0) {
|
||||||
setDiagramName(diagrams[0]);
|
setDiagramName(diagrams[0]);
|
||||||
} else {
|
} else {
|
||||||
setDiagramName(null);
|
setDiagramName("default"); // <- ensure we use this name
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error(err);
|
console.error(err);
|
||||||
setDiagramList([]);
|
setDiagramList([]);
|
||||||
setDiagramName(null);
|
setDiagramName("default"); // <- fallback to default always
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
load();
|
load();
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const loadDiagram = async () => {
|
const loadDiagram = async () => {
|
||||||
if (!diagramName) {
|
if (!diagramName) {
|
||||||
@ -204,19 +205,39 @@ function Diagram() {
|
|||||||
|
|
||||||
{!isIframe && (
|
{!isIframe && (
|
||||||
<>
|
<>
|
||||||
<button className="btn" style={{ background: '#d28519' }} onClick={() => {
|
<button className="btn" style={{ background: '#d28519' }} onClick={async () => {
|
||||||
const newName = prompt("Enter new diagram name:");
|
const newName = prompt("Enter new diagram name:");
|
||||||
if (newName) {
|
if (!newName) return;
|
||||||
if (!diagramList.includes(newName)) {
|
|
||||||
setDiagramList((prev) => [...prev, newName]);
|
|
||||||
}
|
|
||||||
setDiagramName(newName);
|
|
||||||
setNodes([]);
|
|
||||||
setEdges([]);
|
|
||||||
}
|
|
||||||
}}>🆕 New Diagram</button>
|
|
||||||
|
|
||||||
<button className="btn" onClick={handleSave} style={{ background: 'green' }}>💾 Save</button>
|
if (diagramList.includes(newName)) {
|
||||||
|
toast.warn("❗ Diagram already exists.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Save current content (only if in 'default')
|
||||||
|
if (diagramName === 'default' && (nodes.length > 0 || edges.length > 0)) {
|
||||||
|
const cleanedEdges = edges.map(({ id, source, target, animated }) => ({
|
||||||
|
id, source, target, animated: !!animated
|
||||||
|
}));
|
||||||
|
await saveDiagramByName(newName, { nodes, edges: cleanedEdges });
|
||||||
|
toast.success(`📁 Migrated content from 'default' to '${newName}'`);
|
||||||
|
}
|
||||||
|
|
||||||
|
setDiagramList((prev) => [...prev, newName]);
|
||||||
|
setDiagramName(newName); // <- only after saving
|
||||||
|
} catch (err) {
|
||||||
|
toast.error(`❌ Failed to migrate default diagram`);
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
}}>
|
||||||
|
🆕 New Diagram
|
||||||
|
</button>
|
||||||
|
|
||||||
|
|
||||||
|
{diagramName !== 'default' && (
|
||||||
|
<button className="btn" onClick={handleSave} style={{ background: 'green' }}>💾 Save</button>
|
||||||
|
)}
|
||||||
<button className="btn" onClick={() => setShowForm(true)} style={{ background: 'blue' }}>➕ Add Node</button>
|
<button className="btn" onClick={() => setShowForm(true)} style={{ background: 'blue' }}>➕ Add Node</button>
|
||||||
<button className="btn" onClick={handleDeleteNode} style={{ color: 'white', background: selectedNode ? '#b81a1a' : '#424040' }} disabled={!selectedNode}>🗑️ Delete Node</button>
|
<button className="btn" onClick={handleDeleteNode} style={{ color: 'white', background: selectedNode ? '#b81a1a' : '#424040' }} disabled={!selectedNode}>🗑️ Delete Node</button>
|
||||||
<button className="btn" onClick={handleDeleteEdge} style={{ color: 'white', background: selectedEdge ? '#b81a1a' : '#424040' }} disabled={!selectedEdge}>🗑️ Delete Edge</button>
|
<button className="btn" onClick={handleDeleteEdge} style={{ color: 'white', background: selectedEdge ? '#b81a1a' : '#424040' }} disabled={!selectedEdge}>🗑️ Delete Edge</button>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user