@mhamz.01/easyflow-whiteboard 2.59.0 → 2.60.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;IAC9C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;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;IAC9C,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;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,2CA4nBzB"}
|
|
@@ -10,6 +10,10 @@ export default function CanvasOverlayLayer({ tasks, documents, onTasksUpdate, on
|
|
|
10
10
|
const [selectedIds, setSelectedIds] = useState(new Set());
|
|
11
11
|
const [dragging, setDragging] = useState(null);
|
|
12
12
|
const [canvasReady, setCanvasReady] = useState(false);
|
|
13
|
+
const nodeClipboardRef = useRef({
|
|
14
|
+
tasks: [],
|
|
15
|
+
documents: [],
|
|
16
|
+
});
|
|
13
17
|
const dragStateRef = useRef({
|
|
14
18
|
isDragging: false,
|
|
15
19
|
itemIds: [],
|
|
@@ -395,6 +399,59 @@ export default function CanvasOverlayLayer({ tasks, documents, onTasksUpdate, on
|
|
|
395
399
|
e.preventDefault();
|
|
396
400
|
setSelectedIds(new Set([...localTasks.map((t) => t.id), ...localDocuments.map((d) => d.id)]));
|
|
397
401
|
}
|
|
402
|
+
// ── Copy HTML nodes ──────────────────────────────────────────────────────
|
|
403
|
+
if ((e.ctrlKey || e.metaKey) && e.key === "c") {
|
|
404
|
+
const ids = selectedIdsRef.current;
|
|
405
|
+
if (ids.size === 0)
|
|
406
|
+
return;
|
|
407
|
+
// Snapshot selected nodes into clipboard — plain data, no refs
|
|
408
|
+
nodeClipboardRef.current = {
|
|
409
|
+
tasks: localTasks.filter((t) => ids.has(t.id)),
|
|
410
|
+
documents: localDocuments.filter((d) => ids.has(d.id)),
|
|
411
|
+
};
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
414
|
+
// ── Paste HTML nodes ─────────────────────────────────────────────────────
|
|
415
|
+
if ((e.ctrlKey || e.metaKey) && e.key === "v") {
|
|
416
|
+
const { tasks: copiedTasks, documents: copiedDocs } = nodeClipboardRef.current;
|
|
417
|
+
if (copiedTasks.length === 0 && copiedDocs.length === 0)
|
|
418
|
+
return;
|
|
419
|
+
const now = Date.now();
|
|
420
|
+
const pastedTasks = copiedTasks.map((t, i) => ({
|
|
421
|
+
...t,
|
|
422
|
+
id: `${t.id}-copy-${now}-${i}`,
|
|
423
|
+
x: t.x + 20,
|
|
424
|
+
y: t.y + 20,
|
|
425
|
+
}));
|
|
426
|
+
const pastedDocs = copiedDocs.map((d, i) => ({
|
|
427
|
+
...d,
|
|
428
|
+
id: `${d.id}-copy-${now}-${i}`,
|
|
429
|
+
x: d.x + 20,
|
|
430
|
+
y: d.y + 20,
|
|
431
|
+
}));
|
|
432
|
+
setLocalTasks((prev) => {
|
|
433
|
+
const updated = [...prev, ...pastedTasks];
|
|
434
|
+
onTasksUpdate?.(updated);
|
|
435
|
+
return updated;
|
|
436
|
+
});
|
|
437
|
+
setLocalDocuments((prev) => {
|
|
438
|
+
const updated = [...prev, ...pastedDocs];
|
|
439
|
+
onDocumentsUpdate?.(updated);
|
|
440
|
+
return updated;
|
|
441
|
+
});
|
|
442
|
+
// Select the newly pasted nodes
|
|
443
|
+
setSelectedIds(new Set([
|
|
444
|
+
...pastedTasks.map((t) => t.id),
|
|
445
|
+
...pastedDocs.map((d) => d.id),
|
|
446
|
+
]));
|
|
447
|
+
// Mirror official Fabric pattern — offset clipboard itself for cascading paste
|
|
448
|
+
// so each Ctrl+V lands 20px further than the last
|
|
449
|
+
nodeClipboardRef.current = {
|
|
450
|
+
tasks: copiedTasks.map((t) => ({ ...t, x: t.x + 20, y: t.y + 20 })),
|
|
451
|
+
documents: copiedDocs.map((d) => ({ ...d, x: d.x + 20, y: d.y + 20 })),
|
|
452
|
+
};
|
|
453
|
+
return;
|
|
454
|
+
}
|
|
398
455
|
// Clear selection
|
|
399
456
|
if (e.key === "Escape") {
|
|
400
457
|
setSelectedIds(new Set());
|