@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,wBAkqBG"}
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 isClickingActiveSelection = target && (activeObjects.includes(target) || activeObjects.length > 1);
150
- if (isClickingActiveSelection)
151
- return; // ← let the drag proceed with HTML nodes intact
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) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mhamz.01/easyflow-whiteboard",
3
- "version": "2.148.0",
3
+ "version": "2.150.0",
4
4
  "description": "A feature-rich whiteboard component built with Fabric.js and React",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",