@mhamz.01/easyflow-whiteboard 2.141.0 → 2.143.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/node/custom-node-overlay-layer.d.ts +1 -0
- package/dist/components/node/custom-node-overlay-layer.d.ts.map +1 -1
- package/dist/components/node/custom-node-overlay-layer.js +11 -1
- package/dist/components/whiteboard/whiteboard-test.d.ts.map +1 -1
- package/dist/components/whiteboard/whiteboard-test.js +20 -22
- package/dist/hooks/useSelection.d.ts +2 -1
- package/dist/hooks/useSelection.d.ts.map +1 -1
- package/dist/hooks/useSelection.js +2 -1
- package/package.json +1 -1
|
@@ -40,6 +40,7 @@ interface CanvasOverlayLayerProps {
|
|
|
40
40
|
selectedCanvasObjects?: FabricObject[];
|
|
41
41
|
fabricCanvas?: React.RefObject<Canvas | null>;
|
|
42
42
|
canvasReady?: boolean;
|
|
43
|
+
clearHtmlSelectionRef?: React.MutableRefObject<() => void>;
|
|
43
44
|
}
|
|
44
45
|
declare const _default: React.NamedExoticComponent<CanvasOverlayLayerProps>;
|
|
45
46
|
export default _default;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-node-overlay-layer.d.ts","sourceRoot":"","sources":["../../../src/components/node/custom-node-overlay-layer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAI9C,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,MAAM,CAAC;IACxC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,UAAU,uBAAuB;IAC/B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACxC,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,YAAY,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACzE,qBAAqB,CAAC,EAAE,YAAY,EAAE,CAAC;IACvC,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9C,WAAW,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"custom-node-overlay-layer.d.ts","sourceRoot":"","sources":["../../../src/components/node/custom-node-overlay-layer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAI9C,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,MAAM,CAAC;IACxC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,UAAU,uBAAuB;IAC/B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACxC,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,YAAY,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACzE,qBAAqB,CAAC,EAAE,YAAY,EAAE,CAAC;IACvC,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,qBAAqB,CAAC,EAAE,KAAK,CAAC,gBAAgB,CAAC,MAAM,IAAI,CAAC,CAAC;CAC5D;;AAaD,wBA+pBG"}
|
|
@@ -4,7 +4,7 @@ import React, { useState, useEffect, useRef } from "react";
|
|
|
4
4
|
import TaskNode from "./custom-node";
|
|
5
5
|
import DocumentNode from "./document-node";
|
|
6
6
|
// ─── Component ────────────────────────────────────────────────────────────────
|
|
7
|
-
export default React.memo(function CanvasOverlayLayer({ tasks, documents, onTasksUpdate, onDocumentsUpdate, canvasZoom = 1, canvasViewport = { x: 0, y: 0 }, selectionBox = null, selectedCanvasObjects = [], fabricCanvas, canvasReady: canvasReadyProp = false, }) {
|
|
7
|
+
export default React.memo(function CanvasOverlayLayer({ tasks, documents, onTasksUpdate, onDocumentsUpdate, canvasZoom = 1, canvasViewport = { x: 0, y: 0 }, selectionBox = null, selectedCanvasObjects = [], fabricCanvas, canvasReady: canvasReadyProp = false, clearHtmlSelectionRef, }) {
|
|
8
8
|
const [localTasks, setLocalTasks] = useState(tasks);
|
|
9
9
|
const [localDocuments, setLocalDocuments] = useState(documents);
|
|
10
10
|
const [selectedIds, setSelectedIds] = useState(new Set());
|
|
@@ -67,6 +67,11 @@ export default React.memo(function CanvasOverlayLayer({ tasks, documents, onTask
|
|
|
67
67
|
e.stopPropagation();
|
|
68
68
|
}
|
|
69
69
|
};
|
|
70
|
+
useEffect(() => {
|
|
71
|
+
if (!clearHtmlSelectionRef)
|
|
72
|
+
return;
|
|
73
|
+
clearHtmlSelectionRef.current = () => setSelectedIds(new Set());
|
|
74
|
+
}, [clearHtmlSelectionRef]);
|
|
70
75
|
// Issue 6: Remove canvasZoom from deps — not used in handler
|
|
71
76
|
useEffect(() => {
|
|
72
77
|
const overlayEl = overlayRef.current;
|
|
@@ -389,6 +394,11 @@ export default React.memo(function CanvasOverlayLayer({ tasks, documents, onTask
|
|
|
389
394
|
}, [dragging, fabricCanvas]); // Issue 3: removed localTasks/localDocuments
|
|
390
395
|
// ── Selection, Status, Keyboard Logic ────────────────────────────────────────
|
|
391
396
|
const handleSelect = (id, e) => {
|
|
397
|
+
const canvas = fabricCanvas?.current;
|
|
398
|
+
if (canvas) {
|
|
399
|
+
canvas.discardActiveObject();
|
|
400
|
+
canvas.requestRenderAll();
|
|
401
|
+
}
|
|
392
402
|
if (e?.shiftKey || e?.ctrlKey || e?.metaKey) {
|
|
393
403
|
setSelectedIds((prev) => {
|
|
394
404
|
const next = new Set(prev);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whiteboard-test.d.ts","sourceRoot":"","sources":["../../../src/components/whiteboard/whiteboard-test.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAkB5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGxD,YAAY,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,YAAY,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAIxE,UAAU,IAAI;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,MAAM,CAAC;IACxC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,qBAAqB;IAC7B,WAAW,CAAC,EAAE;QACZ,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;QACf,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;KACxB,CAAC;IACF,cAAc,CAAC,EAAE,YAAY,EAAE,CAAC;IAChC,kBAAkB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACxC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,GAAG,EAAE,CAAC;QACb,SAAS,EAAE,GAAG,EAAE,CAAC;KAClB,KAAK,IAAI,CAAC;IACX,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;
|
|
1
|
+
{"version":3,"file":"whiteboard-test.d.ts","sourceRoot":"","sources":["../../../src/components/whiteboard/whiteboard-test.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAkB5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGxD,YAAY,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,YAAY,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAIxE,UAAU,IAAI;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,MAAM,CAAC;IACxC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,qBAAqB;IAC7B,WAAW,CAAC,EAAE;QACZ,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;QACf,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;KACxB,CAAC;IACF,cAAc,CAAC,EAAE,YAAY,EAAE,CAAC;IAChC,kBAAkB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACxC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,GAAG,EAAE,CAAC;QACb,SAAS,EAAE,GAAG,EAAE,CAAC;KAClB,KAAK,IAAI,CAAC;IACX,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAoHD,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EACvC,WAAW,EACX,MAAM,EACN,cAAc,EACd,cAAmB,EACnB,kBAAuB,EACvB,aAAqB,GACtB,EAAE,qBAAqB,2CA4RvB"}
|
|
@@ -30,15 +30,13 @@ const MemoizedToolbarWrapper = React.memo(function ToolbarWrapper({ canvasReady,
|
|
|
30
30
|
// ── Memoized Overlay wrapper (Issue 11) ───────────────────────────────────────
|
|
31
31
|
// This wrapper only updates when tasks/documents/canvasReady change
|
|
32
32
|
// Not on every pan/zoom frame
|
|
33
|
-
const MemoizedOverlayWrapper = React.memo(function OverlayWrapper({ tasks, documents, canvasReady, fabricCanvasRef, onTasksUpdate, onDocumentsUpdate,
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
const MemoizedOverlayWrapper = React.memo(function OverlayWrapper({ tasks, documents, canvasReady, fabricCanvasRef, onTasksUpdate, onDocumentsUpdate, selectionBox, // ← destructure from props
|
|
34
|
+
selectedCanvasObjects, clearHtmlSelectionRef, // ← destructure from props
|
|
35
|
+
}) {
|
|
36
|
+
// Only zoom/viewport are read from canvas internally — these two have no external source
|
|
36
37
|
const [canvasZoom, setCanvasZoom] = useState(1);
|
|
37
38
|
const [canvasViewport, setCanvasViewport] = useState({ x: 0, y: 0 });
|
|
38
|
-
|
|
39
|
-
const [selectedCanvasObjects, setSelectedCanvasObjects] = useState([]);
|
|
40
|
-
// Effect to sync zoom/viewport from fabric canvas
|
|
41
|
-
// This keeps the overlay in sync without prop drilling
|
|
39
|
+
// ← Remove the two useState calls for selectionBox and selectedCanvasObjects entirely
|
|
42
40
|
React.useEffect(() => {
|
|
43
41
|
const canvas = fabricCanvasRef.current;
|
|
44
42
|
if (!canvas)
|
|
@@ -47,29 +45,25 @@ const MemoizedOverlayWrapper = React.memo(function OverlayWrapper({ tasks, docum
|
|
|
47
45
|
const vpt = canvas.viewportTransform;
|
|
48
46
|
if (!vpt)
|
|
49
47
|
return;
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const vpX = vpt[4];
|
|
53
|
-
const vpY = vpt[5];
|
|
54
|
-
setCanvasZoom(zoom);
|
|
55
|
-
setCanvasViewport({ x: vpX, y: vpY });
|
|
48
|
+
setCanvasZoom(vpt[0]);
|
|
49
|
+
setCanvasViewport({ x: vpt[4], y: vpt[5] });
|
|
56
50
|
};
|
|
57
|
-
// Update on viewport change
|
|
58
51
|
canvas.on("after:render", updateViewport);
|
|
59
|
-
updateViewport();
|
|
52
|
+
updateViewport();
|
|
60
53
|
return () => {
|
|
61
|
-
canvas.off("after:render", updateViewport);
|
|
54
|
+
canvas.off("after:render", updateViewport);
|
|
62
55
|
};
|
|
63
56
|
}, [fabricCanvasRef, canvasReady]);
|
|
64
|
-
return (_jsx(CanvasOverlayLayer, { tasks: tasks, documents: documents, onTasksUpdate: onTasksUpdate, onDocumentsUpdate: onDocumentsUpdate, canvasZoom: canvasZoom, canvasViewport: canvasViewport, selectionBox: selectionBox, selectedCanvasObjects: selectedCanvasObjects,
|
|
57
|
+
return (_jsx(CanvasOverlayLayer, { tasks: tasks, documents: documents, onTasksUpdate: onTasksUpdate, onDocumentsUpdate: onDocumentsUpdate, canvasZoom: canvasZoom, canvasViewport: canvasViewport, fabricCanvas: fabricCanvasRef, canvasReady: canvasReady, selectionBox: selectionBox, selectedCanvasObjects: selectedCanvasObjects, clearHtmlSelectionRef: clearHtmlSelectionRef }));
|
|
65
58
|
}, (prev, next) => {
|
|
66
|
-
// Custom comparator — only re-render if these props change
|
|
67
59
|
return (prev.tasks === next.tasks &&
|
|
68
60
|
prev.documents === next.documents &&
|
|
69
61
|
prev.canvasReady === next.canvasReady &&
|
|
70
62
|
prev.fabricCanvasRef === next.fabricCanvasRef &&
|
|
71
63
|
prev.onTasksUpdate === next.onTasksUpdate &&
|
|
72
|
-
prev.onDocumentsUpdate === next.onDocumentsUpdate
|
|
64
|
+
prev.onDocumentsUpdate === next.onDocumentsUpdate &&
|
|
65
|
+
prev.selectionBox === next.selectionBox &&
|
|
66
|
+
prev.selectedCanvasObjects === next.selectedCanvasObjects);
|
|
73
67
|
});
|
|
74
68
|
export default function FabricWhiteboard({ initialData, onSave, saveDebounceMs, availableTasks = [], availableDocuments = [], isLoadingData = false, }) {
|
|
75
69
|
// Refs
|
|
@@ -81,6 +75,7 @@ export default function FabricWhiteboard({ initialData, onSave, saveDebounceMs,
|
|
|
81
75
|
const currentShapeRef = useRef(null);
|
|
82
76
|
const suppressHistoryRef = useRef(false);
|
|
83
77
|
const isRestoringRef = useRef(false);
|
|
78
|
+
const clearHtmlSelectionRef = useRef(() => { });
|
|
84
79
|
// Eraser refs
|
|
85
80
|
const eraserTraceRef = useRef(null);
|
|
86
81
|
const eraserTargetsRef = useRef(new Set());
|
|
@@ -96,6 +91,8 @@ export default function FabricWhiteboard({ initialData, onSave, saveDebounceMs,
|
|
|
96
91
|
const [tasks, setTasks] = useState([]);
|
|
97
92
|
const [canvasReady, setCanvasReady] = useState(false);
|
|
98
93
|
const [documents, setDocuments] = useState([]);
|
|
94
|
+
const [selectionBox, setSelectionBox] = useState(null);
|
|
95
|
+
const [selectedCanvasObjects, setSelectedCanvasObjects] = useState([]);
|
|
99
96
|
const MIN_ZOOM = 0.1;
|
|
100
97
|
const MAX_ZOOM = 5;
|
|
101
98
|
const ZOOM_STEP = 0.1;
|
|
@@ -183,9 +180,10 @@ export default function FabricWhiteboard({ initialData, onSave, saveDebounceMs,
|
|
|
183
180
|
activeTool,
|
|
184
181
|
canvasZoom: 1, // Read from canvas instead
|
|
185
182
|
canvasViewport: { x: 0, y: 0 },
|
|
186
|
-
setSelectionBox
|
|
187
|
-
setSelectedCanvasObjects
|
|
183
|
+
setSelectionBox, // Not used anymore
|
|
184
|
+
setSelectedCanvasObjects, // Not used anymore
|
|
188
185
|
isDrawingRef,
|
|
186
|
+
onClearHtmlSelection: clearHtmlSelectionRef.current,
|
|
189
187
|
});
|
|
190
188
|
// Text style updates
|
|
191
189
|
useTextStyle({
|
|
@@ -274,5 +272,5 @@ export default function FabricWhiteboard({ initialData, onSave, saveDebounceMs,
|
|
|
274
272
|
backgroundImage: `radial-gradient(circle, rgba(255,255,255,0.2) 1.2px, transparent 1.2px)`,
|
|
275
273
|
backgroundSize: "40px 40px",
|
|
276
274
|
zIndex: 0,
|
|
277
|
-
} }), _jsx("canvas", { ref: canvasRef, className: "absolute inset-0", style: { zIndex: 1 } }), _jsx(MemoizedOverlayWrapper, { tasks: tasks, documents: documents, canvasReady: canvasReady, fabricCanvasRef: fabricCanvasRef, onTasksUpdate: setTasks, onDocumentsUpdate: setDocuments }), _jsxs("div", { className: "absolute inset-0 pointer-events-none", style: { zIndex: 100 }, children: [_jsx("div", { className: "pointer-events-auto", children: _jsx(MemoizedToolbarWrapper, { canvasReady: canvasReady, fabricCanvasRef: fabricCanvasRef, isRestoringRef: isRestoringRef, onAddTask: handleAddTaskFromDropdown, onAddDocument: handleAddDocumentFromDropdown, availableDocuments: availableDocuments, availableTasks: availableTasks, isLoadingData: isLoadingData }) }), _jsx("div", { className: "pointer-events-auto", children: _jsx(ToolOptionsPanel, { fabricCanvas: fabricCanvasRef }) }), _jsx("div", { className: "pointer-events-auto", children: _jsx(ZoomControls, { zoom: 1, onZoomIn: handleZoomIn, onZoomOut: handleZoomOut, onResetZoom: handleResetZoom }) })] })] }) }));
|
|
275
|
+
} }), _jsx("canvas", { ref: canvasRef, className: "absolute inset-0", style: { zIndex: 1 } }), _jsx(MemoizedOverlayWrapper, { tasks: tasks, documents: documents, canvasReady: canvasReady, fabricCanvasRef: fabricCanvasRef, onTasksUpdate: setTasks, onDocumentsUpdate: setDocuments, selectionBox: selectionBox, selectedCanvasObjects: selectedCanvasObjects, clearHtmlSelectionRef: clearHtmlSelectionRef }), _jsxs("div", { className: "absolute inset-0 pointer-events-none", style: { zIndex: 100 }, children: [_jsx("div", { className: "pointer-events-auto", children: _jsx(MemoizedToolbarWrapper, { canvasReady: canvasReady, fabricCanvasRef: fabricCanvasRef, isRestoringRef: isRestoringRef, onAddTask: handleAddTaskFromDropdown, onAddDocument: handleAddDocumentFromDropdown, availableDocuments: availableDocuments, availableTasks: availableTasks, isLoadingData: isLoadingData }) }), _jsx("div", { className: "pointer-events-auto", children: _jsx(ToolOptionsPanel, { fabricCanvas: fabricCanvasRef }) }), _jsx("div", { className: "pointer-events-auto", children: _jsx(ZoomControls, { zoom: 1, onZoomIn: handleZoomIn, onZoomOut: handleZoomOut, onResetZoom: handleResetZoom }) })] })] }) }));
|
|
278
276
|
}
|
|
@@ -15,7 +15,8 @@ interface UseSelectionProps {
|
|
|
15
15
|
} | null) => void;
|
|
16
16
|
setSelectedCanvasObjects: (objects: FabricObject[]) => void;
|
|
17
17
|
isDrawingRef: React.MutableRefObject<boolean>;
|
|
18
|
+
onClearHtmlSelection?: () => void;
|
|
18
19
|
}
|
|
19
|
-
export declare const useSelection: ({ fabricCanvas, activeTool, setSelectionBox, setSelectedCanvasObjects, isDrawingRef, }: UseSelectionProps) => void;
|
|
20
|
+
export declare const useSelection: ({ fabricCanvas, activeTool, setSelectionBox, setSelectedCanvasObjects, isDrawingRef, onClearHtmlSelection, }: UseSelectionProps) => void;
|
|
20
21
|
export {};
|
|
21
22
|
//# sourceMappingURL=useSelection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSelection.d.ts","sourceRoot":"","sources":["../../src/hooks/useSelection.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAQ,YAAY,EAAe,MAAM,QAAQ,CAAC;AAMjE,UAAU,iBAAiB;IACzB,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,eAAe,EAAE,CAAC,GAAG,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1F,wBAAwB,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,IAAI,CAAC;IAC5D,YAAY,EAAE,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"useSelection.d.ts","sourceRoot":"","sources":["../../src/hooks/useSelection.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAQ,YAAY,EAAe,MAAM,QAAQ,CAAC;AAMjE,UAAU,iBAAiB;IACzB,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,eAAe,EAAE,CAAC,GAAG,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,KAAK,IAAI,CAAC;IAC1F,wBAAwB,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,IAAI,CAAC;IAC5D,YAAY,EAAE,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC9C,oBAAoB,CAAC,EAAE,MAAM,IAAI,CAAC;CACnC;AAGD,eAAO,MAAM,YAAY,GAAI,8GAO1B,iBAAiB,SAwKnB,CAAC"}
|
|
@@ -5,7 +5,7 @@ import { Frame } from "../lib/fabric-frame";
|
|
|
5
5
|
import { Arrow } from "../lib/fabric-arrow";
|
|
6
6
|
import { BidirectionalArrow } from "../lib/fabric-bidirectional-arrow";
|
|
7
7
|
import { useWhiteboardStore } from "../store/whiteboard-store";
|
|
8
|
-
export const useSelection = ({ fabricCanvas, activeTool, setSelectionBox, setSelectedCanvasObjects, isDrawingRef, }) => {
|
|
8
|
+
export const useSelection = ({ fabricCanvas, activeTool, setSelectionBox, setSelectedCanvasObjects, isDrawingRef, onClearHtmlSelection, }) => {
|
|
9
9
|
const setSelectedObjectType = useWhiteboardStore((s) => s.setSelectedObjectType);
|
|
10
10
|
const setActiveTool = useWhiteboardStore((s) => s.setActiveTool);
|
|
11
11
|
// activeTool ref — so effect never re-registers on tool change
|
|
@@ -91,6 +91,7 @@ export const useSelection = ({ fabricCanvas, activeTool, setSelectionBox, setSel
|
|
|
91
91
|
const sel = canvas.getActiveObject();
|
|
92
92
|
if (!sel || isDrawingRef.current)
|
|
93
93
|
return;
|
|
94
|
+
onClearHtmlSelection?.();
|
|
94
95
|
setSelectedCanvasObjects(sel.type === "activeSelection" ? sel.getObjects() : [sel]);
|
|
95
96
|
const typeMap = {
|
|
96
97
|
rect: "rectangle", circle: "circle", line: "line",
|