@mhamz.01/easyflow-whiteboard 2.148.0 → 2.150.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.
|
@@ -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;IACtB,qBAAqB,CAAC,EAAE,KAAK,CAAC,gBAAgB,CAAC,MAAM,IAAI,CAAC,CAAC;CAC5D;;AAaD,
|
|
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,wBAqqBG"}
|
|
@@ -17,6 +17,7 @@ export default React.memo(function CanvasOverlayLayer({ tasks, documents, onTask
|
|
|
17
17
|
const localTasksRef = useRef(localTasks);
|
|
18
18
|
const localDocumentsRef = useRef(localDocuments);
|
|
19
19
|
const selectedIdsRef = useRef(selectedIds);
|
|
20
|
+
const isHtmlSelectingRef = useRef(false);
|
|
20
21
|
localTasksRef.current = localTasks;
|
|
21
22
|
localDocumentsRef.current = localDocuments;
|
|
22
23
|
selectedIdsRef.current = selectedIds;
|
|
@@ -145,33 +146,39 @@ export default React.memo(function CanvasOverlayLayer({ tasks, documents, onTask
|
|
|
145
146
|
target._prevLeft = target.left;
|
|
146
147
|
target._prevTop = target.top;
|
|
147
148
|
}
|
|
149
|
+
// Only preserve HTML selection if we're clicking INTO an existing multi-selection
|
|
150
|
+
// Don't use activeObjects.length > 1 alone — it's true even when clicking a NEW object
|
|
148
151
|
const activeObjects = canvas.getActiveObjects();
|
|
149
|
-
const
|
|
150
|
-
|
|
151
|
-
|
|
152
|
+
const isClickingIntoActiveSelection = target &&
|
|
153
|
+
activeObjects.length > 1 &&
|
|
154
|
+
activeObjects.includes(target); // ← target must be IN the selection, not just any click
|
|
155
|
+
if (isClickingIntoActiveSelection)
|
|
156
|
+
return;
|
|
152
157
|
setSelectedIds(new Set());
|
|
153
|
-
// At zoom=1 with identity VPT, getActiveObject() can return null before
|
|
154
|
-
// Fabric updates _activeObject. Use e.transform as the primary check —
|
|
155
|
-
// it is populated by Fabric's hit-test regardless of zoom level.
|
|
156
|
-
const transformTarget = e.transform?.target;
|
|
157
|
-
const activeObject = canvas.getActiveObject();
|
|
158
|
-
// const activeObjects = canvas.getActiveObjects();
|
|
159
|
-
const isPartOfActiveSelection = transformTarget === target || // most reliable — direct from event
|
|
160
|
-
activeObject === target || // selection box group
|
|
161
|
-
activeObjects.includes(target); // individual object in multi-select
|
|
162
|
-
if (!isPartOfActiveSelection) {
|
|
163
|
-
setSelectedIds(new Set());
|
|
164
|
-
}
|
|
165
158
|
};
|
|
166
159
|
// const handleSelectionCleared = () => {
|
|
167
160
|
// setSelectedIds(new Set());
|
|
168
161
|
// };
|
|
162
|
+
const handleFabricSelectionCreated = () => {
|
|
163
|
+
if (isHtmlSelectingRef.current)
|
|
164
|
+
return; // ← skip if HTML node initiated this
|
|
165
|
+
setSelectedIds(new Set());
|
|
166
|
+
};
|
|
167
|
+
const handleFabricSelectionUpdated = () => {
|
|
168
|
+
if (isHtmlSelectingRef.current)
|
|
169
|
+
return; // ← skip if HTML node initiated this
|
|
170
|
+
setSelectedIds(new Set());
|
|
171
|
+
};
|
|
169
172
|
canvas.on("object:moving", handleObjectMoving);
|
|
170
173
|
canvas.on("mouse:down", handleMouseDown);
|
|
174
|
+
canvas.on("selection:created", handleFabricSelectionCreated); // ← add
|
|
175
|
+
canvas.on("selection:updated", handleFabricSelectionUpdated); // ← add
|
|
171
176
|
// canvas.on("selection:cleared", handleSelectionCleared);
|
|
172
177
|
return () => {
|
|
173
178
|
canvas.off("object:moving", handleObjectMoving);
|
|
174
179
|
canvas.off("mouse:down", handleMouseDown);
|
|
180
|
+
canvas.off("selection:created", handleFabricSelectionCreated); // ← add
|
|
181
|
+
canvas.off("selection:updated", handleFabricSelectionUpdated); // ← add
|
|
175
182
|
// canvas.off("selection:cleared", handleSelectionCleared);
|
|
176
183
|
if (fabricMoveRafRef.current !== null) {
|
|
177
184
|
cancelAnimationFrame(fabricMoveRafRef.current);
|
|
@@ -397,8 +404,10 @@ export default React.memo(function CanvasOverlayLayer({ tasks, documents, onTask
|
|
|
397
404
|
const handleSelect = (id, e) => {
|
|
398
405
|
const canvas = fabricCanvas?.current;
|
|
399
406
|
if (canvas) {
|
|
407
|
+
isHtmlSelectingRef.current = true; // ← guard: we're initiating this
|
|
400
408
|
canvas.discardActiveObject();
|
|
401
409
|
canvas.requestRenderAll();
|
|
410
|
+
isHtmlSelectingRef.current = false; // ← reset immediately
|
|
402
411
|
}
|
|
403
412
|
if (e?.shiftKey || e?.ctrlKey || e?.metaKey) {
|
|
404
413
|
setSelectedIds((prev) => {
|