diff --git a/src/components/Area.jsx b/src/components/Area.jsx index edf7819..28122a5 100644 --- a/src/components/Area.jsx +++ b/src/components/Area.jsx @@ -13,7 +13,7 @@ import { defaultTableTheme, State, } from "../data/data"; -import { StateContext, TabContext } from "../pages/Editor"; +import { StateContext } from "../pages/Editor"; import useLayout from "../hooks/useLayout"; import useSettings from "../hooks/useSettings"; import useUndoRedo from "../hooks/useUndoRedo"; @@ -26,7 +26,6 @@ export default function Area(props) { const { setState } = useContext(StateContext); const { layout } = useLayout(); const { settings } = useSettings(); - const { tab, setTab } = useContext(TabContext); const { updateArea, deleteArea } = useAreas(); const { setUndoStack, setRedoStack } = useUndoRedo(); const { selectedElement, setSelectedElement } = useSelect(); @@ -79,20 +78,27 @@ export default function Area(props) { {(hovered || (selectedElement.element === ObjectType.AREA && selectedElement.id === props.areaData.id && - selectedElement.openDialogue && + selectedElement.open && !layout.sidebar)) && (
{ + if (selectedElement.editFromToolbar) { + setSelectedElement((prev) => ({ + ...prev, + editFromToolbar: false, + })); + return; + } setSelectedElement((prev) => ({ ...prev, - openDialogue: false, + open: false, })); setState(State.SAVING); }} @@ -261,18 +267,25 @@ export default function Area(props) { }} onClick={() => { if (layout.sidebar) { - setTab(Tab.subject_areas); - if (tab !== Tab.subject_areas) return; + setSelectedElement((prev) => ({ + ...prev, + element: ObjectType.AREA, + id: props.areaData.id, + currentTab: Tab.subject_areas, + open: true, + })); + if (selectedElement.currentTab !== Tab.subject_areas) + return; document .getElementById(`scroll_area_${props.areaData.id}`) .scrollIntoView({ behavior: "smooth" }); } else { - setSelectedElement({ + setSelectedElement((prev) => ({ + ...prev, element: ObjectType.AREA, id: props.areaData.id, - openDialogue: true, - openCollapse: false, - }); + open: true, + })); } }} > diff --git a/src/components/Canvas.jsx b/src/components/Canvas.jsx index e6c3994..8ad97e6 100644 --- a/src/components/Canvas.jsx +++ b/src/components/Canvas.jsx @@ -102,12 +102,12 @@ export default function Canvas() { prevY: note.y, }); } - setSelectedElement({ + setSelectedElement((prev) => ({ + ...prev, element: type, id: id, - openDialogue: false, - openCollapse: false, - }); + open: false, + })); }; const handleMouseMove = (e) => { @@ -284,7 +284,12 @@ export default function Canvas() { }, ]); setRedoStack([]); - setSelectedElement({ element: ObjectType.NONE, id: -1 }); + setSelectedElement((prev) => ({ + ...prev, + element: ObjectType.NONE, + id: -1, + open: false, + })); } setPanning({ state: false, x: 0, y: 0 }); setCursor("default"); diff --git a/src/components/ControlPanel.jsx b/src/components/ControlPanel.jsx index 96e16bd..e83d827 100644 --- a/src/components/ControlPanel.jsx +++ b/src/components/ControlPanel.jsx @@ -43,7 +43,7 @@ import { jsonToMariaDB, jsonToSQLServer, } from "../utils/toSQL"; -import { StateContext, TabContext } from "../pages/Editor"; +import { StateContext } from "../pages/Editor"; import { IconAddTable, IconAddArea, IconAddNote } from "./CustomIcons"; import { ObjectType, Action, Tab, State, Cardinality } from "../data/data"; import jsPDF from "jspdf"; @@ -137,7 +137,6 @@ export default function ControlPanel({ const { areas, setAreas, updateArea, addArea, deleteArea } = useAreas(); const { undoStack, redoStack, setUndoStack, setRedoStack } = useUndoRedo(); const { selectedElement, setSelectedElement } = useSelect(); - const { tab, setTab } = useContext(TabContext); const { transform, setTransform } = useTransform(); const invertLayout = (component) => @@ -574,54 +573,55 @@ export default function ControlPanel({ const edit = () => { if (selectedElement.element === ObjectType.TABLE) { if (!layout.sidebar) { - setSelectedElement({ - element: ObjectType.TABLE, - id: selectedElement.id, - openDialogue: true, - openCollapse: false, - }); + setSelectedElement((prev) => ({ + ...prev, + open: true, + })); } else { - setTab(Tab.tables); - setSelectedElement({ - element: ObjectType.TABLE, - id: selectedElement.id, - openDialogue: false, - openCollapse: true, - }); - if (tab !== Tab.tables) return; + setSelectedElement((prev) => ({ + ...prev, + open: true, + currentTab: Tab.tables, + })); + if (selectedElement.currentTab !== Tab.tables) return; document .getElementById(`scroll_table_${selectedElement.id}`) .scrollIntoView({ behavior: "smooth" }); } } else if (selectedElement.element === ObjectType.AREA) { if (layout.sidebar) { - setTab(Tab.subject_areas); - if (tab !== Tab.subject_areas) return; + setSelectedElement((prev) => ({ + ...prev, + currentTab: Tab.subject_areas, + })); + if (selectedElement.currentTab !== Tab.subject_areas) return; document .getElementById(`scroll_area_${selectedElement.id}`) .scrollIntoView({ behavior: "smooth" }); } else { - setSelectedElement({ - element: ObjectType.AREA, - id: selectedElement.id, - openDialogue: true, - openCollapse: false, - }); + setSelectedElement((prev) => ({ + ...prev, + open: true, + editFromToolbar: true, + })); } } else if (selectedElement.element === ObjectType.NOTE) { if (layout.sidebar) { - setTab(Tab.notes); - if (tab !== Tab.notes) return; + setSelectedElement((prev) => ({ + ...prev, + currentTab: Tab.notes, + open: false, + })); + if (selectedElement.currentTab !== Tab.notes) return; document .getElementById(`scroll_note_${selectedElement.id}`) .scrollIntoView({ behavior: "smooth" }); } else { - setSelectedElement({ - element: ObjectType.NOTE, - id: selectedElement.id, - openDialogue: true, - openCollapse: false, - }); + setSelectedElement((prev) => ({ + ...prev, + open: true, + editFromToolbar: true, + })); } } }; diff --git a/src/components/Note.jsx b/src/components/Note.jsx index 6477da5..6d3fbf4 100644 --- a/src/components/Note.jsx +++ b/src/components/Note.jsx @@ -1,5 +1,5 @@ import { useContext, useState } from "react"; -import { TabContext, StateContext } from "../pages/Editor"; +import { StateContext } from "../pages/Editor"; import { Action, ObjectType, noteThemes, Tab, State } from "../data/data"; import { Input, Button, Popover, Toast } from "@douyinfe/semi-ui"; import { @@ -12,25 +12,24 @@ import useUndoRedo from "../hooks/useUndoRedo"; import useSelect from "../hooks/useSelect"; import useNotes from "../hooks/useNotes"; -export default function Note(props) { - const [editField, setEditField] = useState({}); - const [hovered, setHovered] = useState(false); +export default function Note({ data, onMouseDown }) { const w = 180; const r = 3; const fold = 24; + const [editField, setEditField] = useState({}); + const [hovered, setHovered] = useState(false); + const { layout } = useLayout(); + const { setState } = useContext(StateContext); const { updateNote, deleteNote } = useNotes(); const { setUndoStack, setRedoStack } = useUndoRedo(); - const { setState } = useContext(StateContext); - const { layout } = useLayout(); - const { tab, setTab } = useContext(TabContext); const { selectedElement, setSelectedElement } = useSelect(); const handleChange = (e) => { - const textarea = document.getElementById(`note_${props.data.id}`); + const textarea = document.getElementById(`note_${data.id}`); textarea.style.height = "0"; textarea.style.height = textarea.scrollHeight + "px"; const newHeight = textarea.scrollHeight + 41; - updateNote(props.data.id, { content: e.target.value, height: newHeight }); + updateNote(data.id, { content: e.target.value, height: newHeight }); }; return ( @@ -39,23 +38,21 @@ export default function Note(props) { onMouseLeave={() => setHovered(false)} >
-