From 940f680489049a7adfd88f58c7de1d64f599e2d8 Mon Sep 17 00:00:00 2001 From: dvirlabs Date: Wed, 2 Jul 2025 02:04:33 +0300 Subject: [PATCH] Add toast alerts --- diagram.json | 23 ++++++++++++++++++++++- frontend/package-lock.json | 21 +++++++++++++++++++++ frontend/package.json | 1 + frontend/src/App.jsx | 9 ++++++++- frontend/src/components/Diagram.jsx | 8 ++++++-- 5 files changed, 58 insertions(+), 4 deletions(-) diff --git a/diagram.json b/diagram.json index 4736f13..aa5bf7d 100644 --- a/diagram.json +++ b/diagram.json @@ -1,4 +1,25 @@ { - "nodes": [], + "nodes": [ + { + "id": "1", + "type": "custom", + "data": { + "label": "Node 1", + "icon": "https://s3.dvirlabs.com/lab-icons/dev-tools/argocd.svg" + }, + "position": { + "x": 68.5849844537563, + "y": 225.18693121594464 + }, + "width": 82, + "height": 82, + "selected": false, + "positionAbsolute": { + "x": 68.5849844537563, + "y": 225.18693121594464 + }, + "dragging": false + } + ], "edges": [] } \ No newline at end of file diff --git a/frontend/package-lock.json b/frontend/package-lock.json index c4deabb..546cb5a 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "react": "^19.1.0", "react-dom": "^19.1.0", + "react-toastify": "^11.0.5", "reactflow": "^11.11.4" }, "devDependencies": { @@ -1589,6 +1590,14 @@ "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==" }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2434,6 +2443,18 @@ "react": "^19.1.0" } }, + "node_modules/react-toastify": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-11.0.5.tgz", + "integrity": "sha512-EpqHBGvnSTtHYhCPLxML05NLY2ZX0JURbAdNYa6BUkk+amz4wbKBQvoKQAB0ardvSarUBuY4Q4s1sluAzZwkmA==", + "dependencies": { + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": "^18 || ^19", + "react-dom": "^18 || ^19" + } + }, "node_modules/reactflow": { "version": "11.11.4", "resolved": "https://registry.npmjs.org/reactflow/-/reactflow-11.11.4.tgz", diff --git a/frontend/package.json b/frontend/package.json index cd010d0..650bff9 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,6 +12,7 @@ "dependencies": { "react": "^19.1.0", "react-dom": "^19.1.0", + "react-toastify": "^11.0.5", "reactflow": "^11.11.4" }, "devDependencies": { diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 535e505..46f4857 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -1,7 +1,14 @@ import Diagram from './components/Diagram'; +import { ToastContainer } from 'react-toastify'; +import 'react-toastify/dist/ReactToastify.css'; function App() { - return ; + return ( + <> + + + + ); } export default App; \ No newline at end of file diff --git a/frontend/src/components/Diagram.jsx b/frontend/src/components/Diagram.jsx index d23927f..bff55d2 100644 --- a/frontend/src/components/Diagram.jsx +++ b/frontend/src/components/Diagram.jsx @@ -1,4 +1,3 @@ -// src/components/Diagram.jsx import { useEffect, useState, useCallback } from 'react'; import ReactFlow, { addEdge, @@ -11,6 +10,7 @@ import 'reactflow/dist/style.css'; import { fetchDiagram, saveDiagram } from '../services/api'; import CustomNode from './CustomNode'; import IconSelector from './IconSelector'; +import { toast } from 'react-toastify'; const nodeTypes = { custom: CustomNode, @@ -45,7 +45,7 @@ function Diagram() { animated: !!animated, })); await saveDiagram({ nodes, edges: cleanedEdges }); - alert('Diagram saved!'); + toast.success('✅ Diagram saved!'); }; const handleAddNode = () => { @@ -65,6 +65,7 @@ function Diagram() { }; setNodes((nds) => [...nds, newNode]); + toast.success(`🟢 Node "${label}" added`); setShowForm(false); setNewLabel(''); setSelectedIcon(''); @@ -72,8 +73,10 @@ function Diagram() { 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)); + toast.error(`🗑️ Node "${selectedNode.data.label}" deleted`); setSelectedNode(null); }; @@ -90,6 +93,7 @@ function Diagram() { n.id === node.id ? { ...n, data: { ...n.data, label: newLabel } } : n ) ); + toast.info(`✏️ Node renamed to "${newLabel}"`); } };