From 61179bb7c77fe7e96588f41c8c0cc6ff8d02b0ba Mon Sep 17 00:00:00 2001 From: "Alinson S. Xavier" Date: Thu, 13 Nov 2025 08:54:38 -0600 Subject: [PATCH] web: add redo --- .../components/CaseBuilder/CaseBuilder.tsx | 21 ++++++++++++++++++- .../src/components/CaseBuilder/Header.tsx | 12 ++++++++++- .../Buttons/SiteHeaderButton.module.css | 10 +++++++-- .../Common/Buttons/SiteHeaderButton.tsx | 6 +++++- 4 files changed, 44 insertions(+), 5 deletions(-) diff --git a/web/frontend/src/components/CaseBuilder/CaseBuilder.tsx b/web/frontend/src/components/CaseBuilder/CaseBuilder.tsx index 7b34c1c..6150010 100644 --- a/web/frontend/src/components/CaseBuilder/CaseBuilder.tsx +++ b/web/frontend/src/components/CaseBuilder/CaseBuilder.tsx @@ -44,11 +44,13 @@ const CaseBuilder = () => { return processedScenario!!; }); const [undoStack, setUndoStack] = useState([]); + const [redoStack, setRedoStack] = useState([]); const [toastMessage, setToastMessage] = useState(""); const setAndSaveScenario = ( newScenario: UnitCommitmentScenario, updateUndoStack = true, + clearRedoStack = true, ) => { if (updateUndoStack) { const newUndoStack = [...undoStack, scenario]; @@ -57,6 +59,9 @@ const CaseBuilder = () => { } setUndoStack(newUndoStack); } + if (clearRedoStack) { + setRedoStack([]); + } setScenario(newScenario); localStorage.setItem("scenario", JSON.stringify(newScenario)); }; @@ -90,8 +95,19 @@ const CaseBuilder = () => { const onUndo = () => { if (undoStack.length === 0) return; + const newRedoStack = [...redoStack, scenario]; + if (newRedoStack.length > 25) { + newRedoStack.splice(0, newRedoStack.length - 25); + } + setRedoStack(newRedoStack); setUndoStack(undoStack.slice(0, -1)); - setAndSaveScenario(undoStack[undoStack.length - 1]!, false); + setAndSaveScenario(undoStack[undoStack.length - 1]!, false, false); + }; + + const onRedo = () => { + if (redoStack.length === 0) return; + setRedoStack(redoStack.slice(0, -1)); + setAndSaveScenario(redoStack[redoStack.length - 1]!, true, false); }; const onSolve = async () => { @@ -128,7 +144,10 @@ const CaseBuilder = () => { onSave={onSave} onLoad={onLoad} onUndo={onUndo} + onRedo={onRedo} onSolve={onSolve} + canUndo={undoStack.length > 0} + canRedo={redoStack.length > 0} />
void; onSave: () => void; onUndo: () => void; + onRedo: () => void; onLoad: (data: UnitCommitmentScenario) => void; onSolve: () => void; + canUndo: boolean; + canRedo: boolean; } function Header(props: HeaderProps) { @@ -44,6 +47,13 @@ function Header(props: HeaderProps) { title="Undo" icon={faRotateLeft} onClick={props.onUndo} + disabled={!props.canUndo} + /> + void; variant?: "light" | "primary"; + disabled?: boolean; }) { const variantClass = variant === "primary" ? styles.primary : styles.light; + const disabledClass = disabled ? styles.disabled : ""; return (