From 938ad7c01d2c69f62c8a18c095042c401609af99 Mon Sep 17 00:00:00 2001
From: 1ilit <1ilit@proton.me>
Date: Sat, 7 Jun 2025 22:24:01 +0400
Subject: [PATCH] Lock notes and subject areas (#480)
---
src/components/EditorCanvas/Area.jsx | 47 +++++++++++++++++++-------
src/components/EditorCanvas/Canvas.jsx | 10 ++++++
src/components/EditorCanvas/Note.jsx | 22 ++++++++++--
src/context/AreasContext.jsx | 1 +
src/context/NotesContext.jsx | 1 +
src/data/schemas.js | 2 ++
6 files changed, 68 insertions(+), 15 deletions(-)
diff --git a/src/components/EditorCanvas/Area.jsx b/src/components/EditorCanvas/Area.jsx
index 490c0c7..eb47ce0 100644
--- a/src/components/EditorCanvas/Area.jsx
+++ b/src/components/EditorCanvas/Area.jsx
@@ -1,6 +1,11 @@
import { useMemo, useRef, useState } from "react";
import { Button, Popover, Input, ColorPicker } from "@douyinfe/semi-ui";
-import { IconEdit, IconDeleteStroked } from "@douyinfe/semi-icons";
+import {
+ IconEdit,
+ IconDeleteStroked,
+ IconLock,
+ IconUnlock,
+} from "@douyinfe/semi-icons";
import { Tab, Action, ObjectType, State } from "../../data/constants";
import {
useCanvas,
@@ -30,6 +35,7 @@ export default function Area({
const { layout } = useLayout();
const { settings } = useSettings();
const { setSaveState } = useSaveState();
+ const { updateArea } = useAreas();
const { selectedElement, setSelectedElement, bulkSelectedElements } =
useSelect();
@@ -45,6 +51,10 @@ export default function Area({
});
};
+ const lockUnlockArea = () => {
+ updateArea(data.id, { locked: !data.locked });
+ };
+
const edit = () => {
if (layout.sidebar) {
setSelectedElement((prev) => ({
@@ -123,25 +133,36 @@ export default function Area({
{data.name}
{(isHovered || (areaIsOpen() && !layout.sidebar)) && (
- }
- trigger="custom"
- position="rightTop"
- showArrow
- >
+
}
+ icon={data.locked ?
:
}
size="small"
theme="solid"
style={{
backgroundColor: "#2F68ADB3",
}}
- onClick={edit}
+ onClick={lockUnlockArea}
/>
-
+
}
+ trigger="custom"
+ position="rightTop"
+ showArrow
+ >
+
}
+ size="small"
+ theme="solid"
+ style={{
+ backgroundColor: "#2F68ADB3",
+ }}
+ onClick={edit}
+ />
+
+
)}
diff --git a/src/components/EditorCanvas/Canvas.jsx b/src/components/EditorCanvas/Canvas.jsx
index b5df796..4fb5234 100644
--- a/src/components/EditorCanvas/Canvas.jsx
+++ b/src/components/EditorCanvas/Canvas.jsx
@@ -126,6 +126,8 @@ export default function Canvas() {
});
areas.forEach((area) => {
+ if (area.locked) return;
+
if (
isInsideRect(
{
@@ -145,6 +147,8 @@ export default function Canvas() {
});
notes.forEach((note) => {
+ if (note.locked) return;
+
if (
isInsideRect(
{
@@ -333,11 +337,17 @@ export default function Canvas() {
dragging.id !== null &&
areaResize.id === -1
) {
+ const area = areas.find((t) => t.id === dragging.id);
+ if (area.locked) return;
+
updateArea(dragging.id, {
x: pointer.spaces.diagram.x + grabOffset.x,
y: pointer.spaces.diagram.y + grabOffset.y,
});
} else if (dragging.element === ObjectType.NOTE && dragging.id !== null) {
+ const note = notes.find((t) => t.id === dragging.id);
+ if (note.locked) return;
+
updateNote(dragging.id, {
x: pointer.spaces.diagram.x + grabOffset.x,
y: pointer.spaces.diagram.y + grabOffset.y,
diff --git a/src/components/EditorCanvas/Note.jsx b/src/components/EditorCanvas/Note.jsx
index 99a91ba..4703377 100644
--- a/src/components/EditorCanvas/Note.jsx
+++ b/src/components/EditorCanvas/Note.jsx
@@ -1,7 +1,12 @@
import { useMemo, useState } from "react";
import { Action, ObjectType, Tab, State } from "../../data/constants";
import { Input, Button, Popover, ColorPicker } from "@douyinfe/semi-ui";
-import { IconEdit, IconDeleteStroked } from "@douyinfe/semi-icons";
+import {
+ IconEdit,
+ IconDeleteStroked,
+ IconLock,
+ IconUnlock,
+} from "@douyinfe/semi-icons";
import {
useLayout,
useUndoRedo,
@@ -56,6 +61,10 @@ export default function Note({ data, onPointerDown }) {
setRedoStack([]);
};
+ const lockUnlockNote = () => {
+ updateNote(data.id, { locked: !data.locked });
+ };
+
const edit = () => {
setSelectedElement((prev) => ({
...prev,
@@ -152,7 +161,16 @@ export default function Note({ data, onPointerDown }) {
selectedElement.id === data.id &&
selectedElement.open &&
!layout.sidebar)) && (
-
+
+
:
}
+ size="small"
+ theme="solid"
+ style={{
+ backgroundColor: "#2F68ADB3",
+ }}
+ onClick={lockUnlockNote}
+ />