@mhamz.01/easyflow-whiteboard 2.25.0 → 2.27.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,2CAkhBzB"}
|
|
@@ -92,30 +92,40 @@ export default function CanvasOverlayLayer({ tasks, documents, onTasksUpdate, on
|
|
|
92
92
|
const target = e.transform?.target || e.target;
|
|
93
93
|
if (!target)
|
|
94
94
|
return;
|
|
95
|
-
// 1. Calculate delta in raw Scene Coordinates
|
|
96
|
-
// We do NOT divide by zoom here because target.left/top are world units.
|
|
97
95
|
const deltaX = target.left - (target._prevLeft ?? target.left);
|
|
98
96
|
const deltaY = target.top - (target._prevTop ?? target.top);
|
|
99
97
|
target._prevLeft = target.left;
|
|
100
98
|
target._prevTop = target.top;
|
|
101
99
|
if (deltaX === 0 && deltaY === 0)
|
|
102
100
|
return;
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
setLocalDocuments((prev) => prev.map((d) => (selectedIds.has(d.id) ? { ...d, x: d.x + deltaX, y: d.y + deltaY } : d)));
|
|
101
|
+
setLocalTasks((prev) => prev.map((t) => selectedIds.has(t.id) ? { ...t, x: t.x + deltaX, y: t.y + deltaY } : t));
|
|
102
|
+
setLocalDocuments((prev) => prev.map((d) => selectedIds.has(d.id) ? { ...d, x: d.x + deltaX, y: d.y + deltaY } : d));
|
|
106
103
|
};
|
|
107
104
|
const handleMouseDown = (e) => {
|
|
105
|
+
// Snapshot for delta tracking
|
|
108
106
|
const target = e.target;
|
|
109
107
|
if (target) {
|
|
110
108
|
target._prevLeft = target.left;
|
|
111
109
|
target._prevTop = target.top;
|
|
112
110
|
}
|
|
111
|
+
// ── FIX: Clear HTML node selection on ANY canvas mousedown ──────────────
|
|
112
|
+
// This covers both: clicking empty canvas (target=null) and clicking a
|
|
113
|
+
// Fabric object (target exists). In both cases HTML nodes should deselect.
|
|
114
|
+
setSelectedIds(new Set());
|
|
113
115
|
};
|
|
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());
|
|
114
120
|
canvas.on("object:moving", handleObjectMoving);
|
|
115
121
|
canvas.on("mouse:down", handleMouseDown);
|
|
122
|
+
canvas.on("selection:created", handleFabricSelection);
|
|
123
|
+
canvas.on("selection:updated", handleFabricSelection);
|
|
116
124
|
return () => {
|
|
117
125
|
canvas.off("object:moving", handleObjectMoving);
|
|
118
126
|
canvas.off("mouse:down", handleMouseDown);
|
|
127
|
+
canvas.off("selection:created", handleFabricSelection);
|
|
128
|
+
canvas.off("selection:updated", handleFabricSelection);
|
|
119
129
|
};
|
|
120
130
|
}, [canvasZoom, selectedIds, fabricCanvas]);
|
|
121
131
|
// ── Helpers ─────────────────────────────────────────────────────────────────
|
|
@@ -228,7 +238,7 @@ export default function CanvasOverlayLayer({ tasks, documents, onTasksUpdate, on
|
|
|
228
238
|
offsetX: worldOffsetX, // Now stored as World Units
|
|
229
239
|
offsetY: worldOffsetY, // Now stored as World Units
|
|
230
240
|
};
|
|
231
|
-
if (!selectedIds.has(itemId)) {
|
|
241
|
+
if (!selectedIds.has(itemId) && dragStateRef.current.itemIds.length === 0) {
|
|
232
242
|
setSelectedIds(new Set([itemId]));
|
|
233
243
|
}
|
|
234
244
|
// 11. Trigger UI states
|
|
@@ -370,22 +380,6 @@ export default function CanvasOverlayLayer({ tasks, documents, onTasksUpdate, on
|
|
|
370
380
|
window.addEventListener("keydown", handleKeyDown);
|
|
371
381
|
return () => window.removeEventListener("keydown", handleKeyDown);
|
|
372
382
|
}, [localTasks, localDocuments, selectedIds, onTasksUpdate, onDocumentsUpdate]);
|
|
373
|
-
// Deselection helper
|
|
374
|
-
useEffect(() => {
|
|
375
|
-
const canvas = fabricCanvas?.current;
|
|
376
|
-
if (!canvas)
|
|
377
|
-
return;
|
|
378
|
-
const handleSelectionCleared = (e) => {
|
|
379
|
-
// If Fabric clears its selection, we clear ours.
|
|
380
|
-
// e.deselected contains the objects that were just dropped.
|
|
381
|
-
setSelectedIds(new Set());
|
|
382
|
-
};
|
|
383
|
-
// This handles clicking the 'empty' part of the canvas
|
|
384
|
-
canvas.on("selection:cleared", handleSelectionCleared);
|
|
385
|
-
return () => {
|
|
386
|
-
canvas.off("selection:cleared", handleSelectionCleared);
|
|
387
|
-
};
|
|
388
|
-
}, [fabricCanvas]);
|
|
389
383
|
// ── Render helper ────────────────────────────────────────────────────────────
|
|
390
384
|
const renderItem = (id, x, y, children) => {
|
|
391
385
|
const screenX = x * canvasZoom;
|
|
@@ -409,15 +403,8 @@ export default function CanvasOverlayLayer({ tasks, documents, onTasksUpdate, on
|
|
|
409
403
|
}, children: children }, id));
|
|
410
404
|
};
|
|
411
405
|
return (_jsx("div", { ref: overlayRef, className: "absolute inset-0 pointer-events-none", style: { zIndex: 50 }, onWheel: handleOverlayWheel, onClick: (e) => {
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
if (fabricCanvas?.current) {
|
|
415
|
-
// Tell Fabric to clear selection
|
|
416
|
-
fabricCanvas.current.discardActiveObject();
|
|
417
|
-
fabricCanvas.current.requestRenderAll();
|
|
418
|
-
// The 'selection:cleared' event listener will handle the React state
|
|
419
|
-
}
|
|
420
|
-
}
|
|
406
|
+
if (e.target === e.currentTarget)
|
|
407
|
+
setSelectedIds(new Set());
|
|
421
408
|
}, children: _jsxs("div", { className: "absolute top-0 left-0 pointer-events-none", style: {
|
|
422
409
|
transform: `translate(${canvasViewport.x}px, ${canvasViewport.y}px)`,
|
|
423
410
|
transformOrigin: "top left",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whiteboard-toolbar.d.ts","sourceRoot":"","sources":["../../../src/components/toolbar/whiteboard-toolbar.tsx"],"names":[],"mappings":"AAEA,OAAa,EAAqB,gBAAgB,EAAY,MAAM,OAAO,CAAC;AAK5E,OAAO,EAAE,MAAM,EAAQ,MAAM,QAAQ,CAAC;AAOtC,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,MAAM,CAAC;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC7F;AACD,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAC3C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC5D;AAkBD,UAAU,sBAAsB;IAC9B,YAAY,EAAE,gBAAgB,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9C,cAAc,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC1C,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IACzC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACjD;AAED,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,sBAAsB,
|
|
1
|
+
{"version":3,"file":"whiteboard-toolbar.d.ts","sourceRoot":"","sources":["../../../src/components/toolbar/whiteboard-toolbar.tsx"],"names":[],"mappings":"AAEA,OAAa,EAAqB,gBAAgB,EAAY,MAAM,OAAO,CAAC;AAK5E,OAAO,EAAE,MAAM,EAAQ,MAAM,QAAQ,CAAC;AAOtC,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,MAAM,CAAC;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC7F;AACD,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAC3C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC5D;AAkBD,UAAU,sBAAsB;IAC9B,YAAY,EAAE,gBAAgB,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9C,cAAc,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC1C,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IACzC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACjD;AAED,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,sBAAsB,2CAkM3H"}
|
|
@@ -84,10 +84,6 @@ export default function WhiteboardToolbar({ fabricCanvas, isRestoringRef, onAddT
|
|
|
84
84
|
return;
|
|
85
85
|
canvas.discardActiveObject();
|
|
86
86
|
canvas.renderAll();
|
|
87
|
-
if (fabricCanvas?.current) {
|
|
88
|
-
fabricCanvas.current.discardActiveObject();
|
|
89
|
-
fabricCanvas.current.requestRenderAll();
|
|
90
|
-
}
|
|
91
87
|
if (toolId === "undo") {
|
|
92
88
|
const state = undo();
|
|
93
89
|
if (state)
|