@mhamz.01/easyflow-whiteboard 2.27.0 → 2.29.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":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAS9C,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;CAC/C;AAaD,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,EACzC,KAAK,EACL,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,UAAc,EACd,cAA+B,EAC/B,YAAmB,EACnB,qBAA0B,EAC1B,YAAY,GACb,EAAE,uBAAuB,
|
|
1
|
+
{"version":3,"file":"custom-node-overlay-layer.d.ts","sourceRoot":"","sources":["../../../src/components/node/custom-node-overlay-layer.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAS9C,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;CAC/C;AAaD,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,EACzC,KAAK,EACL,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,UAAc,EACd,cAA+B,EAC/B,YAAmB,EACnB,qBAA0B,EAC1B,YAAY,GACb,EAAE,uBAAuB,2CAoiBzB"}
|
|
@@ -19,6 +19,8 @@ export default function CanvasOverlayLayer({ tasks, documents, onTasksUpdate, on
|
|
|
19
19
|
});
|
|
20
20
|
const rafIdRef = useRef(null);
|
|
21
21
|
const overlayRef = useRef(null);
|
|
22
|
+
const selectedIdsRef = useRef(selectedIds);
|
|
23
|
+
selectedIdsRef.current = selectedIds;
|
|
22
24
|
// ── Sync props → local state ────────────────────────────────────────────────
|
|
23
25
|
useEffect(() => { setLocalTasks(tasks); }, [tasks]);
|
|
24
26
|
useEffect(() => { setLocalDocuments(documents); }, [documents]);
|
|
@@ -98,25 +100,33 @@ export default function CanvasOverlayLayer({ tasks, documents, onTasksUpdate, on
|
|
|
98
100
|
target._prevTop = target.top;
|
|
99
101
|
if (deltaX === 0 && deltaY === 0)
|
|
100
102
|
return;
|
|
101
|
-
|
|
102
|
-
|
|
103
|
+
// ── Read from ref — always fresh, never stale ──
|
|
104
|
+
const sel = selectedIdsRef.current;
|
|
105
|
+
setLocalTasks((prev) => prev.map((t) => sel.has(t.id) ? { ...t, x: t.x + deltaX, y: t.y + deltaY } : t));
|
|
106
|
+
setLocalDocuments((prev) => prev.map((d) => sel.has(d.id) ? { ...d, x: d.x + deltaX, y: d.y + deltaY } : d));
|
|
103
107
|
};
|
|
104
108
|
const handleMouseDown = (e) => {
|
|
105
|
-
// Snapshot for delta tracking
|
|
106
109
|
const target = e.target;
|
|
107
110
|
if (target) {
|
|
108
111
|
target._prevLeft = target.left;
|
|
109
112
|
target._prevTop = target.top;
|
|
110
113
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
114
|
+
if (!target) {
|
|
115
|
+
setSelectedIds(new Set());
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
// ── Read from ref — not stale closure ──
|
|
119
|
+
const activeObjects = canvas.getActiveObjects();
|
|
120
|
+
const isTargetAlreadySelected = activeObjects.includes(target);
|
|
121
|
+
if (!isTargetAlreadySelected) {
|
|
122
|
+
setSelectedIds(new Set());
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
const handleFabricSelection = () => {
|
|
126
|
+
if (!dragStateRef.current.isDragging) {
|
|
127
|
+
setSelectedIds(new Set());
|
|
128
|
+
}
|
|
115
129
|
};
|
|
116
|
-
// ── FIX: Also clear on Fabric selection events ───────────────────────────
|
|
117
|
-
// Handles the case where Fabric selection is created via drag-selection rect
|
|
118
|
-
// (which doesn't always trigger mouse:down on the object itself)
|
|
119
|
-
const handleFabricSelection = () => setSelectedIds(new Set());
|
|
120
130
|
canvas.on("object:moving", handleObjectMoving);
|
|
121
131
|
canvas.on("mouse:down", handleMouseDown);
|
|
122
132
|
canvas.on("selection:created", handleFabricSelection);
|
|
@@ -127,7 +137,11 @@ export default function CanvasOverlayLayer({ tasks, documents, onTasksUpdate, on
|
|
|
127
137
|
canvas.off("selection:created", handleFabricSelection);
|
|
128
138
|
canvas.off("selection:updated", handleFabricSelection);
|
|
129
139
|
};
|
|
130
|
-
|
|
140
|
+
// ── selectedIds REMOVED from deps — read via selectedIdsRef instead ──────
|
|
141
|
+
// Having selectedIds here caused the effect to re-register on every selection
|
|
142
|
+
// change, creating a new closure each time. The second drag captured a stale
|
|
143
|
+
// or empty selectedIds from the closure at re-registration time.
|
|
144
|
+
}, [canvasZoom, fabricCanvas]);
|
|
131
145
|
// ── Helpers ─────────────────────────────────────────────────────────────────
|
|
132
146
|
const getItemPosition = (id) => {
|
|
133
147
|
const task = localTasks.find((t) => t.id === id);
|