Add navigation prevention while in Edit mode to Avatar menu options in Header

This commit is contained in:
Daniel S. Hansen
2025-07-31 12:40:46 -07:00
parent 364ce0b752
commit 80a0515bb1
4 changed files with 33 additions and 17 deletions
@@ -12,7 +12,7 @@ import SettingsCanvas from "./views/SettingsCanvas"
import { DashboardCanvas } from "./views/DashboardCanvas"; import { DashboardCanvas } from "./views/DashboardCanvas";
import { DASHBOARD_VIEWS } from "@/constants/viewKeys"; import { DASHBOARD_VIEWS } from "@/constants/viewKeys";
export default function Canvas({ isEditable, setIsEditable, isDelete, setIsDelete, view, setView, layout, setLayout, originalLayout, setOriginalLayout, onLayoutChange, onChangeView, darkMode }) { export default function Canvas({ onCancel, isEditable, setIsEditable, isDelete, setIsDelete, view, setView, layout, setLayout, originalLayout, setOriginalLayout, onLayoutChange, onChangeView, darkMode }) {
const recipe = useRecipe({ key: "canvas" }); const recipe = useRecipe({ key: "canvas" });
const styles = recipe(); const styles = recipe();
@@ -30,6 +30,7 @@ export default function Canvas({ isEditable, setIsEditable, isDelete, setIsDelet
setOriginalLayout={ setOriginalLayout } setOriginalLayout={ setOriginalLayout }
onLayoutChange={ onLayoutChange } onLayoutChange={ onLayoutChange }
onChangeView={ onChangeView } onChangeView={ onChangeView }
onCancel={ onCancel }
isEditable={ isEditable } isEditable={ isEditable }
setIsEditable={ setIsEditable } setIsEditable={ setIsEditable }
isDelete={ isDelete } isDelete={ isDelete }
@@ -11,7 +11,7 @@ import { CancelButton } from "../components/CancelButton";
import { SaveButton } from "../components/SaveButton"; import { SaveButton } from "../components/SaveButton";
import DeleteAllButton from "../components/DeleteAllButton"; import DeleteAllButton from "../components/DeleteAllButton";
export function DashboardCanvas({ isEditable, setIsEditable, isDelete, setIsDelete, view, setView, layout, setLayout, originalLayout, setOriginalLayout, onLayoutChange, onChangeView }) { export function DashboardCanvas({ onCancel, isEditable, setIsEditable, isDelete, setIsDelete, view, setView, layout, setLayout, originalLayout, setOriginalLayout, onLayoutChange, onChangeView }) {
// const [isEditable, setIsEditable] = useState(false); // editable=true means static=false (vice versa) // const [isEditable, setIsEditable] = useState(false); // editable=true means static=false (vice versa)
// const [isDelete, setIsDelete] = useState(false); // const [isDelete, setIsDelete] = useState(false);
const [newCounter, setNewCounter] = useState(3); const [newCounter, setNewCounter] = useState(3);
@@ -55,18 +55,19 @@ export function DashboardCanvas({ isEditable, setIsEditable, isDelete, setIsDele
setOriginalLayout([]) // Clear backup layout setOriginalLayout([]) // Clear backup layout
} }
const onCancel = () => { // Lifting up to Dashboard.jsx for prop drilling
console.log("canceling changes..."); // const onCancel = () => {
if (originalLayout.length) { // console.log("canceling changes...");
setLayout(originalLayout.map(item => ({ // if (originalLayout.length) {
...item, // setLayout(originalLayout.map(item => ({
static: true // ...item,
}))); // static: true
}; // })));
setIsEditable(false); // };
setIsDelete(false); // setIsEditable(false);
setOriginalLayout([]); // setIsDelete(false);
} // setOriginalLayout([]);
// }
const onDeleteWidgets = () => { const onDeleteWidgets = () => {
console.log("Start deleting widgets..."); console.log("Start deleting widgets...");
@@ -20,6 +20,19 @@ export default function Dashboard() {
{ i: '2', x: 6, y: 0, w: 3, h: 3, minH: 3, minW: 1, static: true } { i: '2', x: 6, y: 0, w: 3, h: 3, minH: 3, minW: 1, static: true }
]); ]);
const onCancel = () => {
console.log("canceling changes...");
if (originalLayout.length) {
setLayout(originalLayout.map(item => ({
...item,
static: true
})));
};
setIsEditable(false);
setIsDelete(false);
setOriginalLayout([]);
}
// Prevent navigation while in Edit mode without saving or cancelling // Prevent navigation while in Edit mode without saving or cancelling
const handleViewChange = (nextView) => { const handleViewChange = (nextView) => {
if (view === "widget" && isEditable) { if (view === "widget" && isEditable) {
@@ -68,6 +81,7 @@ export default function Dashboard() {
setOriginalLayout={ setOriginalLayout } setOriginalLayout={ setOriginalLayout }
onLayoutChange={( newLayout ) => setLayout( newLayout )} onLayoutChange={( newLayout ) => setLayout( newLayout )}
onChangeView={ handleViewChange } onChangeView={ handleViewChange }
onCancel={ onCancel }
isEditable={ isEditable } isEditable={ isEditable }
setIsEditable={ setIsEditable } setIsEditable={ setIsEditable }
isDelete={ isDelete } isDelete={ isDelete }
@@ -1,7 +1,7 @@
import { Avatar, Menu, Portal, Box } from "@chakra-ui/react" import { Avatar, Menu, Portal, Box } from "@chakra-ui/react"
export default function UserAvatarMenu({ view, setView, name, avatar }) { export default function UserAvatarMenu({ view, setView, onChangeView, name, avatar }) {
return ( return (
<Menu.Root> <Menu.Root>
<Menu.Trigger focusRing="none"> <Menu.Trigger focusRing="none">
@@ -21,10 +21,10 @@ export default function UserAvatarMenu({ view, setView, name, avatar }) {
{/* zIndex: overlay = 1300 */} {/* zIndex: overlay = 1300 */}
<Menu.Positioner zIndex="overlay"> <Menu.Positioner zIndex="overlay">
<Menu.Content> <Menu.Content>
<Menu.Item value="account" onClick={() => setView("account")}> <Menu.Item value="account" onClick={() => onChangeView("account")}>
Account Account
</Menu.Item> </Menu.Item>
<Menu.Item value="settings" onClick={() => setView("settings")}> <Menu.Item value="settings" onClick={() => onChangeView("settings")}>
Settings Settings
</Menu.Item> </Menu.Item>
<Menu.Item value="logout" onClick={() => console.log("Log out triggered")}> <Menu.Item value="logout" onClick={() => console.log("Log out triggered")}>