diff --git a/docs/docs/api/canvas.md b/docs/docs/api/canvas.md
index b6af6680e..c16ba62c5 100644
--- a/docs/docs/api/canvas.md
+++ b/docs/docs/api/canvas.md
@@ -36,6 +36,12 @@ sidebar_position: 12
`@type {boolean}`
+### clipboard
+全局剪贴板实例
+
+`@type {IPublicModelClipboard}`
+
+相关类型:[IPublicModelClipboard](https://github.com/alibaba/lowcode-engine/blob/main/packages/types/src/shell/model/clipboard.ts)
## 方法
diff --git a/docs/docs/api/model/clipboard.md b/docs/docs/api/model/clipboard.md
new file mode 100644
index 000000000..15d9e280c
--- /dev/null
+++ b/docs/docs/api/model/clipboard.md
@@ -0,0 +1,43 @@
+---
+title: Clipboard
+sidebar_position: 14
+---
+
+> **@types** [IPublicModelClipboard](https://github.com/alibaba/lowcode-engine/blob/main/packages/types/src/shell/model/clipboard.ts)
+> **@since** v1.1.0
+
+## 方法
+
+### setData
+
+给剪贴板赋值
+
+```typescript
+/**
+ * 给剪贴板赋值
+ * set data to clipboard
+ *
+ * @param {*} data
+ * @since v1.1.0
+ */
+setData(data: any): void;
+```
+
+### waitPasteData
+
+设置剪贴板数据设置的回调
+
+```typescript
+/**
+ * 设置剪贴板数据设置的回调
+ * set callback for clipboard provide paste data
+ *
+ * @param {KeyboardEvent} keyboardEvent
+ * @param {(data: any, clipboardEvent: ClipboardEvent) => void} cb
+ * @since v1.1.0
+ */
+waitPasteData(
+ keyboardEvent: KeyboardEvent,
+ cb: (data: any, clipboardEvent: ClipboardEvent) => void,
+ ): void;
+```
\ No newline at end of file
diff --git a/docs/docs/api/model/resource.md b/docs/docs/api/model/resource.md
index 30b1e9f41..74f8d8f71 100644
--- a/docs/docs/api/model/resource.md
+++ b/docs/docs/api/model/resource.md
@@ -1,6 +1,6 @@
---
title: Resource
-sidebar_position: 12
+sidebar_position: 13
---
> **[@experimental](./#experimental)**
diff --git a/packages/designer/src/designer/clipboard.ts b/packages/designer/src/designer/clipboard.ts
index a43b51b0e..941f91442 100644
--- a/packages/designer/src/designer/clipboard.ts
+++ b/packages/designer/src/designer/clipboard.ts
@@ -1,3 +1,5 @@
+import { IPublicModelClipboard } from '@alilc/lowcode-types';
+
function getDataFromPasteEvent(event: ClipboardEvent) {
const { clipboardData } = event;
if (!clipboardData) {
@@ -23,7 +25,13 @@ function getDataFromPasteEvent(event: ClipboardEvent) {
}
}
-class Clipboard {
+export interface IClipboard extends IPublicModelClipboard {
+
+ initCopyPaster(el: HTMLTextAreaElement): void;
+
+ injectCopyPaster(document: Document): void;
+}
+class Clipboard implements IClipboard {
private copyPasters: HTMLTextAreaElement[] = [];
private waitFn?: (data: any, e: ClipboardEvent) => void;
@@ -56,7 +64,7 @@ class Clipboard {
}
injectCopyPaster(document: Document) {
- if (this.copyPasters.find(x => x.ownerDocument === document)) {
+ if (this.copyPasters.find((x) => x.ownerDocument === document)) {
return;
}
const copyPaster = document.createElement<'textarea'>('textarea');
@@ -69,8 +77,8 @@ class Clipboard {
};
}
- setData(data: any) {
- const copyPaster = this.copyPasters.find(x => x.ownerDocument);
+ setData(data: any): void {
+ const copyPaster = this.copyPasters.find((x) => x.ownerDocument);
if (!copyPaster) {
return;
}
@@ -81,12 +89,12 @@ class Clipboard {
copyPaster.blur();
}
- waitPasteData(e: KeyboardEvent, cb: (data: any, e: ClipboardEvent) => void) {
- const win = e.view;
+ waitPasteData(keyboardEvent: KeyboardEvent, cb: (data: any, e: ClipboardEvent) => void) {
+ const win = keyboardEvent.view;
if (!win) {
return;
}
- const copyPaster = this.copyPasters.find(cp => cp.ownerDocument === win.document);
+ const copyPaster = this.copyPasters.find((cp) => cp.ownerDocument === win.document);
if (copyPaster) {
copyPaster.select();
this.waitFn = cb;
diff --git a/packages/engine/src/inner-plugins/builtin-hotkey.ts b/packages/engine/src/inner-plugins/builtin-hotkey.ts
index d0165d89f..03d559a9a 100644
--- a/packages/engine/src/inner-plugins/builtin-hotkey.ts
+++ b/packages/engine/src/inner-plugins/builtin-hotkey.ts
@@ -2,7 +2,6 @@
import { isFormEvent, isNodeSchema } from '@alilc/lowcode-utils';
import {
insertChildren,
- clipboard,
} from '@alilc/lowcode-designer';
import {
IPublicModelPluginContext,
@@ -129,6 +128,7 @@ export const builtinHotkey = (ctx: IPublicModelPluginContext) => {
return {
init() {
const { hotkey, project, logger, canvas } = ctx;
+ const { clipboard } = canvas;
// hotkey binding
hotkey.bind(['backspace', 'del'], (e: KeyboardEvent, action) => {
logger.info(`action ${action} is triggered`);
diff --git a/packages/shell/src/api/canvas.ts b/packages/shell/src/api/canvas.ts
index 5489a8b75..444894452 100644
--- a/packages/shell/src/api/canvas.ts
+++ b/packages/shell/src/api/canvas.ts
@@ -8,6 +8,7 @@ import {
IPublicModelEditor,
IPublicModelDragon,
IPublicModelActiveTracker,
+ IPublicModelClipboard,
} from '@alilc/lowcode-types';
import {
ScrollTarget as InnerScrollTarget,
@@ -18,10 +19,14 @@ import {
Dragon as ShellDragon,
DropLocation as ShellDropLocation,
ActiveTracker as ShellActiveTracker,
+ Clipboard as ShellClipboard,
} from '../model';
+const clipboardInstanceSymbol = Symbol('clipboardInstace');
+
export class Canvas implements IPublicApiCanvas {
private readonly [editorSymbol]: IPublicModelEditor;
+ private readonly [clipboardInstanceSymbol]: IPublicModelClipboard;
private get [designerSymbol](): IDesigner {
return this[editorSymbol].get('designer') as IDesigner;
@@ -40,8 +45,13 @@ export class Canvas implements IPublicApiCanvas {
return Boolean(this[editorSymbol].get('designer')?.project?.simulator?.liveEditing?.editing);
}
+ get clipboard(): IPublicModelClipboard {
+ return this[clipboardInstanceSymbol];
+ }
+
constructor(editor: IPublicModelEditor, readonly workspaceMode: boolean = false) {
this[editorSymbol] = editor;
+ this[clipboardInstanceSymbol] = new ShellClipboard();
}
createScrollTarget(shell: HTMLDivElement): IPublicModelScrollTarget {
diff --git a/packages/shell/src/index.ts b/packages/shell/src/index.ts
index 92d616945..0307349ab 100644
--- a/packages/shell/src/index.ts
+++ b/packages/shell/src/index.ts
@@ -9,6 +9,7 @@ import {
Dragon,
SettingPropEntry,
SettingTopEntry,
+ Clipboard,
} from './model';
import {
Project,
@@ -57,4 +58,5 @@ export {
Logger,
Canvas,
Workspace,
+ Clipboard,
};
\ No newline at end of file
diff --git a/packages/shell/src/model/clipboard.ts b/packages/shell/src/model/clipboard.ts
new file mode 100644
index 000000000..9c4b30945
--- /dev/null
+++ b/packages/shell/src/model/clipboard.ts
@@ -0,0 +1,22 @@
+import { IPublicModelClipboard } from '@alilc/lowcode-types';
+import { clipboardSymbol } from '../symbols';
+import { IClipboard, clipboard } from '@alilc/lowcode-designer';
+
+export class Clipboard implements IPublicModelClipboard {
+ private readonly [clipboardSymbol]: IClipboard;
+
+ constructor() {
+ this[clipboardSymbol] = clipboard;
+ }
+
+ setData(data: any): void {
+ this[clipboardSymbol].setData(data);
+ }
+
+ waitPasteData(
+ keyboardEvent: KeyboardEvent,
+ cb: (data: any, clipboardEvent: ClipboardEvent) => void,
+ ): void {
+ this[clipboardSymbol].waitPasteData(keyboardEvent, cb);
+ }
+}
\ No newline at end of file
diff --git a/packages/shell/src/model/index.ts b/packages/shell/src/model/index.ts
index d20120c3e..f2805342e 100644
--- a/packages/shell/src/model/index.ts
+++ b/packages/shell/src/model/index.ts
@@ -17,4 +17,5 @@ export * from './setting-top-entry';
export * from './resource';
export * from './active-tracker';
export * from './plugin-instance';
-export * from './window';
\ No newline at end of file
+export * from './window';
+export * from './clipboard';
\ No newline at end of file
diff --git a/packages/shell/src/symbols.ts b/packages/shell/src/symbols.ts
index cd164f62a..dac981e96 100644
--- a/packages/shell/src/symbols.ts
+++ b/packages/shell/src/symbols.ts
@@ -30,4 +30,5 @@ export const workspaceSymbol = Symbol('workspace');
export const windowSymbol = Symbol('window');
export const pluginInstanceSymbol = Symbol('plugin-instance');
export const resourceTypeSymbol = Symbol('resourceType');
-export const resourceSymbol = Symbol('resource');
\ No newline at end of file
+export const resourceSymbol = Symbol('resource');
+export const clipboardSymbol = Symbol('clipboard');
\ No newline at end of file
diff --git a/packages/types/src/shell/api/canvas.ts b/packages/types/src/shell/api/canvas.ts
index f7983e094..33fbc7781 100644
--- a/packages/types/src/shell/api/canvas.ts
+++ b/packages/types/src/shell/api/canvas.ts
@@ -1,4 +1,4 @@
-import { IPublicModelDragon, IPublicModelDropLocation, IPublicModelScrollTarget, IPublicModelScrollable, IPublicModelScroller, IPublicModelActiveTracker } from '../model';
+import { IPublicModelDragon, IPublicModelDropLocation, IPublicModelScrollTarget, IPublicModelScrollable, IPublicModelScroller, IPublicModelActiveTracker, IPublicModelClipboard } from '../model';
import { IPublicTypeLocationData } from '../type';
/**
@@ -54,4 +54,12 @@ export interface IPublicApiCanvas {
* @since v1.1.0
*/
get isInLiveEditing(): boolean;
+
+ /**
+ * 获取全局剪贴板实例
+ * get clipboard instance
+ *
+ * @since v1.1.0
+ */
+ get clipboard(): IPublicModelClipboard;
}
diff --git a/packages/types/src/shell/model/clipboard.ts b/packages/types/src/shell/model/clipboard.ts
new file mode 100644
index 000000000..7fdcc4b1c
--- /dev/null
+++ b/packages/types/src/shell/model/clipboard.ts
@@ -0,0 +1,25 @@
+
+export interface IPublicModelClipboard {
+
+ /**
+ * 给剪贴板赋值
+ * set data to clipboard
+ *
+ * @param {*} data
+ * @since v1.1.0
+ */
+ setData(data: any): void;
+
+ /**
+ * 设置剪贴板数据设置的回调
+ * set callback for clipboard provide paste data
+ *
+ * @param {KeyboardEvent} keyboardEvent
+ * @param {(data: any, clipboardEvent: ClipboardEvent) => void} cb
+ * @since v1.1.0
+ */
+ waitPasteData(
+ keyboardEvent: KeyboardEvent,
+ cb: (data: any, clipboardEvent: ClipboardEvent) => void,
+ ): void;
+}
diff --git a/packages/types/src/shell/model/index.ts b/packages/types/src/shell/model/index.ts
index e59216faa..8f48f68f1 100644
--- a/packages/types/src/shell/model/index.ts
+++ b/packages/types/src/shell/model/index.ts
@@ -28,4 +28,5 @@ export * from './editor';
export * from './preference';
export * from './plugin-instance';
export * from './sensor';
-export * from './resource';
\ No newline at end of file
+export * from './resource';
+export * from './clipboard';
\ No newline at end of file