Skip to content

Commit ab84a19

Browse files
authored
Merge pull request #94 from easyops-cn/zhendong/fix
feat(): draw-canvas添加canvas.copy、canvas.paste事件用于实现快捷键复制粘贴节点功能 ref CU…
2 parents 55f6787 + 2bf91dc commit ab84a19

File tree

2 files changed

+91
-0
lines changed

2 files changed

+91
-0
lines changed

bricks/diagram/src/draw-canvas/index.spec.tsx

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1602,4 +1602,56 @@ describe("eo-draw-canvas", () => {
16021602
document.body.removeChild(element);
16031603
});
16041604
});
1605+
1606+
test("copy and paste ", async () => {
1607+
const element = document.createElement("eo-draw-canvas") as EoDrawCanvas;
1608+
element.defaultNodeBricks = [{ useBrick: { brick: "div" } }];
1609+
element.cells = [
1610+
{
1611+
type: "node",
1612+
id: "a",
1613+
view: {
1614+
x: 20,
1615+
y: 20,
1616+
},
1617+
},
1618+
{
1619+
type: "node",
1620+
id: "b",
1621+
view: {
1622+
x: 20,
1623+
y: 320,
1624+
},
1625+
},
1626+
] as NodeBrickCell[];
1627+
1628+
const onCanvasCopy = jest.fn();
1629+
const onCanvasPaste = jest.fn();
1630+
element.addEventListener("canvas.copy", () => onCanvasCopy());
1631+
1632+
element.addEventListener("canvas.paste", () => onCanvasPaste());
1633+
1634+
act(() => {
1635+
document.body.appendChild(element);
1636+
});
1637+
1638+
await act(() => new Promise((resolve) => setTimeout(resolve, 1)));
1639+
1640+
fireEvent.keyDown(element.shadowRoot!.querySelector("svg")!, {
1641+
key: "c",
1642+
ctrlKey: true,
1643+
});
1644+
1645+
expect(onCanvasCopy).toBeCalledTimes(1);
1646+
1647+
fireEvent.keyDown(element.shadowRoot!.querySelector("svg")!, {
1648+
key: "v",
1649+
ctrlKey: true,
1650+
});
1651+
expect(onCanvasPaste).toBeCalledTimes(1);
1652+
1653+
act(() => {
1654+
document.body.removeChild(element);
1655+
});
1656+
});
16051657
});

bricks/diagram/src/draw-canvas/index.tsx

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,20 @@ class EoDrawCanvas extends ReactNextElement implements EoDrawCanvasProps {
469469
});
470470
};
471471

472+
@event({ type: "canvas.copy" })
473+
accessor #canvasCopy!: EventEmitter<void>;
474+
475+
#handleCanvasCopy = () => {
476+
this.#canvasCopy.emit();
477+
};
478+
479+
@event({ type: "canvas.paste" })
480+
accessor #canvasPaste!: EventEmitter<void>;
481+
482+
#handleCanvasPaste = () => {
483+
this.#canvasPaste.emit();
484+
};
485+
472486
@method()
473487
async dropNode({
474488
id,
@@ -720,6 +734,8 @@ class EoDrawCanvas extends ReactNextElement implements EoDrawCanvasProps {
720734
onScaleChange={this.#handleScaleChange}
721735
onEdgeViewChange={this.#handleEdgeViewChange}
722736
onDecoratorViewChange={this.#handleDecoratorViewChange}
737+
onCanvasCopy={this.#handleCanvasCopy}
738+
onCanvasPaste={this.#handleCanvasPaste}
723739
/>
724740
);
725741
}
@@ -742,6 +758,8 @@ export interface EoDrawCanvasComponentProps extends EoDrawCanvasProps {
742758
onContainerContainerChange(detail: MoveCellPayload[]): void;
743759
onScaleChange(scale: number): void;
744760
onCanvasContextMenu(detail: PositionTuple): void;
761+
onCanvasCopy(): void;
762+
onCanvasPaste(): void;
745763
}
746764

747765
export interface DrawCanvasRef {
@@ -808,6 +826,8 @@ function LegacyEoDrawCanvasComponent(
808826
onEdgeViewChange,
809827
onDecoratorViewChange,
810828
onCanvasContextMenu,
829+
onCanvasCopy,
830+
onCanvasPaste,
811831
}: EoDrawCanvasComponentProps,
812832
ref: React.Ref<DrawCanvasRef>
813833
) {
@@ -1388,6 +1408,24 @@ function LegacyEoDrawCanvasComponent(
13881408
},
13891409
[onCanvasContextMenu, onSwitchActiveTarget]
13901410
);
1411+
// istanbul ignore next
1412+
const handleCanvasKeyDown = useCallback(
1413+
(event: React.KeyboardEvent<SVGElement>) => {
1414+
const modKey = /Mac|iPod|iPhone|iPad/.test(navigator.platform)
1415+
? "metaKey"
1416+
: "ctrlKey";
1417+
if (event[modKey]) {
1418+
if (event.key === "c") {
1419+
onCanvasCopy();
1420+
event.preventDefault();
1421+
} else if (event.key === "v") {
1422+
onCanvasPaste();
1423+
event.preventDefault();
1424+
}
1425+
}
1426+
},
1427+
[onCanvasCopy, onCanvasPaste]
1428+
);
13911429
useEffect(() => {
13921430
const root = rootRef.current;
13931431
if (!root || dragBehavior !== "lasso") {
@@ -1440,6 +1478,7 @@ function LegacyEoDrawCanvasComponent(
14401478
return (
14411479
<HoverStateContext.Provider value={hoverStateContextValue}>
14421480
<svg
1481+
onKeyDown={handleCanvasKeyDown}
14431482
onContextMenu={handleCanvasContextMenu}
14441483
width="100%"
14451484
height="100%"

0 commit comments

Comments
 (0)