@mhamz.01/easyflow-whiteboard 2.28.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,33 +100,29 @@ 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
109
|
const target = e.target;
|
|
106
|
-
// Always snapshot for delta tracking
|
|
107
110
|
if (target) {
|
|
108
111
|
target._prevLeft = target.left;
|
|
109
112
|
target._prevTop = target.top;
|
|
110
113
|
}
|
|
111
114
|
if (!target) {
|
|
112
|
-
// Clicked empty canvas — deselect HTML nodes
|
|
113
115
|
setSelectedIds(new Set());
|
|
114
116
|
return;
|
|
115
117
|
}
|
|
116
|
-
//
|
|
117
|
-
// is NOT already part of the active selection (i.e. not a group drag)
|
|
118
|
+
// ── Read from ref — not stale closure ──
|
|
118
119
|
const activeObjects = canvas.getActiveObjects();
|
|
119
120
|
const isTargetAlreadySelected = activeObjects.includes(target);
|
|
120
121
|
if (!isTargetAlreadySelected) {
|
|
121
122
|
setSelectedIds(new Set());
|
|
122
123
|
}
|
|
123
|
-
// If already selected: preserve HTML selectedIds for mixed-group drag
|
|
124
124
|
};
|
|
125
125
|
const handleFabricSelection = () => {
|
|
126
|
-
// Only clear HTML selection when no HTML drag is active
|
|
127
|
-
// Prevents clearing during programmatic selection updates mid-drag
|
|
128
126
|
if (!dragStateRef.current.isDragging) {
|
|
129
127
|
setSelectedIds(new Set());
|
|
130
128
|
}
|
|
@@ -139,7 +137,11 @@ export default function CanvasOverlayLayer({ tasks, documents, onTasksUpdate, on
|
|
|
139
137
|
canvas.off("selection:created", handleFabricSelection);
|
|
140
138
|
canvas.off("selection:updated", handleFabricSelection);
|
|
141
139
|
};
|
|
142
|
-
|
|
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]);
|
|
143
145
|
// ── Helpers ─────────────────────────────────────────────────────────────────
|
|
144
146
|
const getItemPosition = (id) => {
|
|
145
147
|
const task = localTasks.find((t) => t.id === id);
|