Add delete button and prompt to set the icon
This commit is contained in:
parent
4047ef2bf0
commit
1b7347577e
@ -17,6 +17,7 @@ const nodeTypes = {
|
|||||||
function Diagram() {
|
function Diagram() {
|
||||||
const [nodes, setNodes, onNodesChange] = useNodesState([]);
|
const [nodes, setNodes, onNodesChange] = useNodesState([]);
|
||||||
const [edges, setEdges, onEdgesChange] = useEdgesState([]);
|
const [edges, setEdges, onEdgesChange] = useEdgesState([]);
|
||||||
|
const [selectedNode, setSelectedNode] = useState(null);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
fetchDiagram().then((data) => {
|
fetchDiagram().then((data) => {
|
||||||
@ -44,18 +45,26 @@ function Diagram() {
|
|||||||
|
|
||||||
const handleAddNode = () => {
|
const handleAddNode = () => {
|
||||||
const id = (nodes.length + 1).toString();
|
const id = (nodes.length + 1).toString();
|
||||||
|
const icon = prompt('Enter icon URL:', 'https://s3.dvirlabs.com/lab-icons/default.svg') || 'https://s3.dvirlabs.com/lab-icons/default.svg';
|
||||||
|
const label = prompt('Enter label:', `Node ${id}`) || `Node ${id}`;
|
||||||
|
|
||||||
const newNode = {
|
const newNode = {
|
||||||
id,
|
id,
|
||||||
type: 'custom',
|
type: 'custom',
|
||||||
data: {
|
data: { label, icon },
|
||||||
label: `Node ${id}`,
|
|
||||||
icon: 'https://s3.dvirlabs.com/lab-icons/default.svg',
|
|
||||||
},
|
|
||||||
position: { x: Math.random() * 400, y: Math.random() * 300 },
|
position: { x: Math.random() * 400, y: Math.random() * 300 },
|
||||||
};
|
};
|
||||||
|
|
||||||
setNodes((nds) => [...nds, newNode]);
|
setNodes((nds) => [...nds, newNode]);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleDeleteNode = () => {
|
||||||
|
if (!selectedNode) return;
|
||||||
|
setNodes((nds) => nds.filter((n) => n.id !== selectedNode.id));
|
||||||
|
setEdges((eds) => eds.filter((e) => e.source !== selectedNode.id && e.target !== selectedNode.id));
|
||||||
|
setSelectedNode(null);
|
||||||
|
};
|
||||||
|
|
||||||
const onConnect = useCallback(
|
const onConnect = useCallback(
|
||||||
(params) => setEdges((eds) => addEdge({ ...params, animated: true }, eds)),
|
(params) => setEdges((eds) => addEdge({ ...params, animated: true }, eds)),
|
||||||
[setEdges]
|
[setEdges]
|
||||||
@ -72,11 +81,16 @@ function Diagram() {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const onNodeClick = (_, node) => {
|
||||||
|
setSelectedNode(node);
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div style={{ width: '100vw', height: '100vh' }}>
|
<div style={{ width: '100vw', height: '100vh' }}>
|
||||||
<div style={{ position: 'absolute', zIndex: 10, right: 10, top: 10 }}>
|
<div style={{ position: 'absolute', zIndex: 10, right: 10, top: 10 }}>
|
||||||
<button onClick={handleSave} className="btn">💾 Save</button>
|
<button onClick={handleSave} className="btn">💾 Save</button>
|
||||||
<button onClick={handleAddNode} className="btn" style={{ marginLeft: 8 }}>➕ Add Node</button>
|
<button onClick={handleAddNode} className="btn" style={{ marginLeft: 8 }}>➕ Add Node</button>
|
||||||
|
<button onClick={handleDeleteNode} className="btn" style={{ marginLeft: 8 }} disabled={!selectedNode}>🗑️ Delete Node</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<ReactFlow
|
<ReactFlow
|
||||||
@ -85,6 +99,7 @@ function Diagram() {
|
|||||||
onNodesChange={onNodesChange}
|
onNodesChange={onNodesChange}
|
||||||
onEdgesChange={onEdgesChange}
|
onEdgesChange={onEdgesChange}
|
||||||
onConnect={onConnect}
|
onConnect={onConnect}
|
||||||
|
onNodeClick={onNodeClick}
|
||||||
onNodeDoubleClick={handleNodeDoubleClick}
|
onNodeDoubleClick={handleNodeDoubleClick}
|
||||||
nodeTypes={nodeTypes}
|
nodeTypes={nodeTypes}
|
||||||
fitView
|
fitView
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user