Skip to content

Commit 852977c

Browse files
JackLianliujuping
authored andcommitted
refactor: add clipboard to canvas for refactoring of hotkey plugin as a standalone one
1 parent 0b0015c commit 852977c

File tree

13 files changed

+140
-13
lines changed

13 files changed

+140
-13
lines changed

docs/docs/api/canvas.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ sidebar_position: 12
3636

3737
`@type {boolean}`
3838

39+
### clipboard
40+
全局剪贴板实例
41+
42+
`@type {IPublicModelClipboard}`
43+
44+
相关类型:[IPublicModelClipboard](https://github.com/alibaba/lowcode-engine/blob/main/packages/types/src/shell/model/clipboard.ts)
3945

4046
## 方法
4147

docs/docs/api/model/clipboard.md

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
---
2+
title: Clipboard
3+
sidebar_position: 14
4+
---
5+
6+
> **@types** [IPublicModelClipboard](https://github.com/alibaba/lowcode-engine/blob/main/packages/types/src/shell/model/clipboard.ts)<br/>
7+
> **@since** v1.1.0
8+
9+
## 方法
10+
11+
### setData
12+
13+
给剪贴板赋值
14+
15+
```typescript
16+
/**
17+
* 给剪贴板赋值
18+
* set data to clipboard
19+
*
20+
* @param {*} data
21+
* @since v1.1.0
22+
*/
23+
setData(data: any): void;
24+
```
25+
26+
### waitPasteData
27+
28+
设置剪贴板数据设置的回调
29+
30+
```typescript
31+
/**
32+
* 设置剪贴板数据设置的回调
33+
* set callback for clipboard provide paste data
34+
*
35+
* @param {KeyboardEvent} keyboardEvent
36+
* @param {(data: any, clipboardEvent: ClipboardEvent) => void} cb
37+
* @since v1.1.0
38+
*/
39+
waitPasteData(
40+
keyboardEvent: KeyboardEvent,
41+
cb: (data: any, clipboardEvent: ClipboardEvent) => void,
42+
): void;
43+
```

docs/docs/api/model/resource.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
title: Resource
3-
sidebar_position: 12
3+
sidebar_position: 13
44
---
55

66
> **[@experimental](./#experimental)**<br/>

packages/designer/src/designer/clipboard.ts

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { IPublicModelClipboard } from '@alilc/lowcode-types';
2+
13
function getDataFromPasteEvent(event: ClipboardEvent) {
24
const { clipboardData } = event;
35
if (!clipboardData) {
@@ -23,7 +25,13 @@ function getDataFromPasteEvent(event: ClipboardEvent) {
2325
}
2426
}
2527

26-
class Clipboard {
28+
export interface IClipboard extends IPublicModelClipboard {
29+
30+
initCopyPaster(el: HTMLTextAreaElement): void;
31+
32+
injectCopyPaster(document: Document): void;
33+
}
34+
class Clipboard implements IClipboard {
2735
private copyPasters: HTMLTextAreaElement[] = [];
2836

2937
private waitFn?: (data: any, e: ClipboardEvent) => void;
@@ -56,7 +64,7 @@ class Clipboard {
5664
}
5765

5866
injectCopyPaster(document: Document) {
59-
if (this.copyPasters.find(x => x.ownerDocument === document)) {
67+
if (this.copyPasters.find((x) => x.ownerDocument === document)) {
6068
return;
6169
}
6270
const copyPaster = document.createElement<'textarea'>('textarea');
@@ -69,8 +77,8 @@ class Clipboard {
6977
};
7078
}
7179

72-
setData(data: any) {
73-
const copyPaster = this.copyPasters.find(x => x.ownerDocument);
80+
setData(data: any): void {
81+
const copyPaster = this.copyPasters.find((x) => x.ownerDocument);
7482
if (!copyPaster) {
7583
return;
7684
}
@@ -81,12 +89,12 @@ class Clipboard {
8189
copyPaster.blur();
8290
}
8391

84-
waitPasteData(e: KeyboardEvent, cb: (data: any, e: ClipboardEvent) => void) {
85-
const win = e.view;
92+
waitPasteData(keyboardEvent: KeyboardEvent, cb: (data: any, e: ClipboardEvent) => void) {
93+
const win = keyboardEvent.view;
8694
if (!win) {
8795
return;
8896
}
89-
const copyPaster = this.copyPasters.find(cp => cp.ownerDocument === win.document);
97+
const copyPaster = this.copyPasters.find((cp) => cp.ownerDocument === win.document);
9098
if (copyPaster) {
9199
copyPaster.select();
92100
this.waitFn = cb;

packages/engine/src/inner-plugins/builtin-hotkey.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import { isFormEvent, isNodeSchema } from '@alilc/lowcode-utils';
33
import {
44
insertChildren,
5-
clipboard,
65
} from '@alilc/lowcode-designer';
76
import {
87
IPublicModelPluginContext,
@@ -129,6 +128,7 @@ export const builtinHotkey = (ctx: IPublicModelPluginContext) => {
129128
return {
130129
init() {
131130
const { hotkey, project, logger, canvas } = ctx;
131+
const { clipboard } = canvas;
132132
// hotkey binding
133133
hotkey.bind(['backspace', 'del'], (e: KeyboardEvent, action) => {
134134
logger.info(`action ${action} is triggered`);

packages/shell/src/api/canvas.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
IPublicModelEditor,
99
IPublicModelDragon,
1010
IPublicModelActiveTracker,
11+
IPublicModelClipboard,
1112
} from '@alilc/lowcode-types';
1213
import {
1314
ScrollTarget as InnerScrollTarget,
@@ -18,10 +19,14 @@ import {
1819
Dragon as ShellDragon,
1920
DropLocation as ShellDropLocation,
2021
ActiveTracker as ShellActiveTracker,
22+
Clipboard as ShellClipboard,
2123
} from '../model';
2224

25+
const clipboardInstanceSymbol = Symbol('clipboardInstace');
26+
2327
export class Canvas implements IPublicApiCanvas {
2428
private readonly [editorSymbol]: IPublicModelEditor;
29+
private readonly [clipboardInstanceSymbol]: IPublicModelClipboard;
2530

2631
private get [designerSymbol](): IDesigner {
2732
return this[editorSymbol].get('designer') as IDesigner;
@@ -40,8 +45,13 @@ export class Canvas implements IPublicApiCanvas {
4045
return Boolean(this[editorSymbol].get('designer')?.project?.simulator?.liveEditing?.editing);
4146
}
4247

48+
get clipboard(): IPublicModelClipboard {
49+
return this[clipboardInstanceSymbol];
50+
}
51+
4352
constructor(editor: IPublicModelEditor, readonly workspaceMode: boolean = false) {
4453
this[editorSymbol] = editor;
54+
this[clipboardInstanceSymbol] = new ShellClipboard();
4555
}
4656

4757
createScrollTarget(shell: HTMLDivElement): IPublicModelScrollTarget {

packages/shell/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
Dragon,
1010
SettingPropEntry,
1111
SettingTopEntry,
12+
Clipboard,
1213
} from './model';
1314
import {
1415
Project,
@@ -57,4 +58,5 @@ export {
5758
Logger,
5859
Canvas,
5960
Workspace,
61+
Clipboard,
6062
};
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { IPublicModelClipboard } from '@alilc/lowcode-types';
2+
import { clipboardSymbol } from '../symbols';
3+
import { IClipboard, clipboard } from '@alilc/lowcode-designer';
4+
5+
export class Clipboard implements IPublicModelClipboard {
6+
private readonly [clipboardSymbol]: IClipboard;
7+
8+
constructor() {
9+
this[clipboardSymbol] = clipboard;
10+
}
11+
12+
setData(data: any): void {
13+
this[clipboardSymbol].setData(data);
14+
}
15+
16+
waitPasteData(
17+
keyboardEvent: KeyboardEvent,
18+
cb: (data: any, clipboardEvent: ClipboardEvent) => void,
19+
): void {
20+
this[clipboardSymbol].waitPasteData(keyboardEvent, cb);
21+
}
22+
}

packages/shell/src/model/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,5 @@ export * from './setting-top-entry';
1717
export * from './resource';
1818
export * from './active-tracker';
1919
export * from './plugin-instance';
20-
export * from './window';
20+
export * from './window';
21+
export * from './clipboard';

packages/shell/src/symbols.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,5 @@ export const workspaceSymbol = Symbol('workspace');
3030
export const windowSymbol = Symbol('window');
3131
export const pluginInstanceSymbol = Symbol('plugin-instance');
3232
export const resourceTypeSymbol = Symbol('resourceType');
33-
export const resourceSymbol = Symbol('resource');
33+
export const resourceSymbol = Symbol('resource');
34+
export const clipboardSymbol = Symbol('clipboard');

0 commit comments

Comments
 (0)