From be500b920e5df9a99bafd556b9f8f69b2ae1ae00 Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Tue, 24 Jun 2025 12:19:41 -0500 Subject: [PATCH] web: Add undo functionality --- .../components/CaseBuilder/CaseBuilder.tsx | 30 ++++++++++++++++--- web/src/components/CaseBuilder/Header.tsx | 2 ++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/web/src/components/CaseBuilder/CaseBuilder.tsx b/web/src/components/CaseBuilder/CaseBuilder.tsx index 96db751..8c218cc 100644 --- a/web/src/components/CaseBuilder/CaseBuilder.tsx +++ b/web/src/components/CaseBuilder/CaseBuilder.tsx @@ -29,11 +29,22 @@ const CaseBuilder = () => { // return savedScenario ? JSON.parse(savedScenario) : TEST_SCENARIO; return TEST_SCENARIO; }); + const [undoStack, setUndoStack] = useState([]); const [toastMessage, setToastMessage] = useState(""); - const setAndSaveScenario = (scenario: UnitCommitmentScenario) => { - setScenario(scenario); - localStorage.setItem("scenario", JSON.stringify(scenario)); + const setAndSaveScenario = ( + newScenario: UnitCommitmentScenario, + updateUndoStack = true, + ) => { + if (updateUndoStack) { + const newUndoStack = [...undoStack, scenario]; + if (newUndoStack.length > 25) { + newUndoStack.splice(0, newUndoStack.length - 25); + } + setUndoStack(newUndoStack); + } + setScenario(newScenario); + localStorage.setItem("scenario", JSON.stringify(newScenario)); }; const onClear = () => { @@ -68,9 +79,20 @@ const CaseBuilder = () => { setToastMessage("Data loaded successfully"); }; + const onUndo = () => { + if (undoStack.length === 0) return; + setUndoStack(undoStack.slice(0, -1)); + setAndSaveScenario(undoStack[undoStack.length - 1]!, false); + }; + return (
-
+
void; onSave: () => void; + onUndo: () => void; onLoad: (data: UnitCommitmentScenario) => void; } @@ -32,6 +33,7 @@ function Header(props: HeaderProps) {

UnitCommitment.jl

Case Builder

+