mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2025-12-15 05:36:39 +00:00
refactor: add clipboard to canvas for refactoring of hotkey plugin as a standalone one
This commit is contained in:
parent
0b0015c368
commit
852977c091
@ -36,6 +36,12 @@ sidebar_position: 12
|
|||||||
|
|
||||||
`@type {boolean}`
|
`@type {boolean}`
|
||||||
|
|
||||||
|
### clipboard
|
||||||
|
全局剪贴板实例
|
||||||
|
|
||||||
|
`@type {IPublicModelClipboard}`
|
||||||
|
|
||||||
|
相关类型:[IPublicModelClipboard](https://github.com/alibaba/lowcode-engine/blob/main/packages/types/src/shell/model/clipboard.ts)
|
||||||
|
|
||||||
## 方法
|
## 方法
|
||||||
|
|
||||||
|
|||||||
43
docs/docs/api/model/clipboard.md
Normal file
43
docs/docs/api/model/clipboard.md
Normal file
@ -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)<br/>
|
||||||
|
> **@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;
|
||||||
|
```
|
||||||
@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
title: Resource
|
title: Resource
|
||||||
sidebar_position: 12
|
sidebar_position: 13
|
||||||
---
|
---
|
||||||
|
|
||||||
> **[@experimental](./#experimental)**<br/>
|
> **[@experimental](./#experimental)**<br/>
|
||||||
|
|||||||
@ -1,3 +1,5 @@
|
|||||||
|
import { IPublicModelClipboard } from '@alilc/lowcode-types';
|
||||||
|
|
||||||
function getDataFromPasteEvent(event: ClipboardEvent) {
|
function getDataFromPasteEvent(event: ClipboardEvent) {
|
||||||
const { clipboardData } = event;
|
const { clipboardData } = event;
|
||||||
if (!clipboardData) {
|
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 copyPasters: HTMLTextAreaElement[] = [];
|
||||||
|
|
||||||
private waitFn?: (data: any, e: ClipboardEvent) => void;
|
private waitFn?: (data: any, e: ClipboardEvent) => void;
|
||||||
@ -56,7 +64,7 @@ class Clipboard {
|
|||||||
}
|
}
|
||||||
|
|
||||||
injectCopyPaster(document: Document) {
|
injectCopyPaster(document: Document) {
|
||||||
if (this.copyPasters.find(x => x.ownerDocument === document)) {
|
if (this.copyPasters.find((x) => x.ownerDocument === document)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const copyPaster = document.createElement<'textarea'>('textarea');
|
const copyPaster = document.createElement<'textarea'>('textarea');
|
||||||
@ -69,8 +77,8 @@ class Clipboard {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
setData(data: any) {
|
setData(data: any): void {
|
||||||
const copyPaster = this.copyPasters.find(x => x.ownerDocument);
|
const copyPaster = this.copyPasters.find((x) => x.ownerDocument);
|
||||||
if (!copyPaster) {
|
if (!copyPaster) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -81,12 +89,12 @@ class Clipboard {
|
|||||||
copyPaster.blur();
|
copyPaster.blur();
|
||||||
}
|
}
|
||||||
|
|
||||||
waitPasteData(e: KeyboardEvent, cb: (data: any, e: ClipboardEvent) => void) {
|
waitPasteData(keyboardEvent: KeyboardEvent, cb: (data: any, e: ClipboardEvent) => void) {
|
||||||
const win = e.view;
|
const win = keyboardEvent.view;
|
||||||
if (!win) {
|
if (!win) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const copyPaster = this.copyPasters.find(cp => cp.ownerDocument === win.document);
|
const copyPaster = this.copyPasters.find((cp) => cp.ownerDocument === win.document);
|
||||||
if (copyPaster) {
|
if (copyPaster) {
|
||||||
copyPaster.select();
|
copyPaster.select();
|
||||||
this.waitFn = cb;
|
this.waitFn = cb;
|
||||||
|
|||||||
@ -2,7 +2,6 @@
|
|||||||
import { isFormEvent, isNodeSchema } from '@alilc/lowcode-utils';
|
import { isFormEvent, isNodeSchema } from '@alilc/lowcode-utils';
|
||||||
import {
|
import {
|
||||||
insertChildren,
|
insertChildren,
|
||||||
clipboard,
|
|
||||||
} from '@alilc/lowcode-designer';
|
} from '@alilc/lowcode-designer';
|
||||||
import {
|
import {
|
||||||
IPublicModelPluginContext,
|
IPublicModelPluginContext,
|
||||||
@ -129,6 +128,7 @@ export const builtinHotkey = (ctx: IPublicModelPluginContext) => {
|
|||||||
return {
|
return {
|
||||||
init() {
|
init() {
|
||||||
const { hotkey, project, logger, canvas } = ctx;
|
const { hotkey, project, logger, canvas } = ctx;
|
||||||
|
const { clipboard } = canvas;
|
||||||
// hotkey binding
|
// hotkey binding
|
||||||
hotkey.bind(['backspace', 'del'], (e: KeyboardEvent, action) => {
|
hotkey.bind(['backspace', 'del'], (e: KeyboardEvent, action) => {
|
||||||
logger.info(`action ${action} is triggered`);
|
logger.info(`action ${action} is triggered`);
|
||||||
|
|||||||
@ -8,6 +8,7 @@ import {
|
|||||||
IPublicModelEditor,
|
IPublicModelEditor,
|
||||||
IPublicModelDragon,
|
IPublicModelDragon,
|
||||||
IPublicModelActiveTracker,
|
IPublicModelActiveTracker,
|
||||||
|
IPublicModelClipboard,
|
||||||
} from '@alilc/lowcode-types';
|
} from '@alilc/lowcode-types';
|
||||||
import {
|
import {
|
||||||
ScrollTarget as InnerScrollTarget,
|
ScrollTarget as InnerScrollTarget,
|
||||||
@ -18,10 +19,14 @@ import {
|
|||||||
Dragon as ShellDragon,
|
Dragon as ShellDragon,
|
||||||
DropLocation as ShellDropLocation,
|
DropLocation as ShellDropLocation,
|
||||||
ActiveTracker as ShellActiveTracker,
|
ActiveTracker as ShellActiveTracker,
|
||||||
|
Clipboard as ShellClipboard,
|
||||||
} from '../model';
|
} from '../model';
|
||||||
|
|
||||||
|
const clipboardInstanceSymbol = Symbol('clipboardInstace');
|
||||||
|
|
||||||
export class Canvas implements IPublicApiCanvas {
|
export class Canvas implements IPublicApiCanvas {
|
||||||
private readonly [editorSymbol]: IPublicModelEditor;
|
private readonly [editorSymbol]: IPublicModelEditor;
|
||||||
|
private readonly [clipboardInstanceSymbol]: IPublicModelClipboard;
|
||||||
|
|
||||||
private get [designerSymbol](): IDesigner {
|
private get [designerSymbol](): IDesigner {
|
||||||
return this[editorSymbol].get('designer') as 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);
|
return Boolean(this[editorSymbol].get('designer')?.project?.simulator?.liveEditing?.editing);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get clipboard(): IPublicModelClipboard {
|
||||||
|
return this[clipboardInstanceSymbol];
|
||||||
|
}
|
||||||
|
|
||||||
constructor(editor: IPublicModelEditor, readonly workspaceMode: boolean = false) {
|
constructor(editor: IPublicModelEditor, readonly workspaceMode: boolean = false) {
|
||||||
this[editorSymbol] = editor;
|
this[editorSymbol] = editor;
|
||||||
|
this[clipboardInstanceSymbol] = new ShellClipboard();
|
||||||
}
|
}
|
||||||
|
|
||||||
createScrollTarget(shell: HTMLDivElement): IPublicModelScrollTarget {
|
createScrollTarget(shell: HTMLDivElement): IPublicModelScrollTarget {
|
||||||
|
|||||||
@ -9,6 +9,7 @@ import {
|
|||||||
Dragon,
|
Dragon,
|
||||||
SettingPropEntry,
|
SettingPropEntry,
|
||||||
SettingTopEntry,
|
SettingTopEntry,
|
||||||
|
Clipboard,
|
||||||
} from './model';
|
} from './model';
|
||||||
import {
|
import {
|
||||||
Project,
|
Project,
|
||||||
@ -57,4 +58,5 @@ export {
|
|||||||
Logger,
|
Logger,
|
||||||
Canvas,
|
Canvas,
|
||||||
Workspace,
|
Workspace,
|
||||||
|
Clipboard,
|
||||||
};
|
};
|
||||||
22
packages/shell/src/model/clipboard.ts
Normal file
22
packages/shell/src/model/clipboard.ts
Normal file
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -18,3 +18,4 @@ export * from './resource';
|
|||||||
export * from './active-tracker';
|
export * from './active-tracker';
|
||||||
export * from './plugin-instance';
|
export * from './plugin-instance';
|
||||||
export * from './window';
|
export * from './window';
|
||||||
|
export * from './clipboard';
|
||||||
@ -31,3 +31,4 @@ export const windowSymbol = Symbol('window');
|
|||||||
export const pluginInstanceSymbol = Symbol('plugin-instance');
|
export const pluginInstanceSymbol = Symbol('plugin-instance');
|
||||||
export const resourceTypeSymbol = Symbol('resourceType');
|
export const resourceTypeSymbol = Symbol('resourceType');
|
||||||
export const resourceSymbol = Symbol('resource');
|
export const resourceSymbol = Symbol('resource');
|
||||||
|
export const clipboardSymbol = Symbol('clipboard');
|
||||||
@ -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';
|
import { IPublicTypeLocationData } from '../type';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -54,4 +54,12 @@ export interface IPublicApiCanvas {
|
|||||||
* @since v1.1.0
|
* @since v1.1.0
|
||||||
*/
|
*/
|
||||||
get isInLiveEditing(): boolean;
|
get isInLiveEditing(): boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取全局剪贴板实例
|
||||||
|
* get clipboard instance
|
||||||
|
*
|
||||||
|
* @since v1.1.0
|
||||||
|
*/
|
||||||
|
get clipboard(): IPublicModelClipboard;
|
||||||
}
|
}
|
||||||
|
|||||||
25
packages/types/src/shell/model/clipboard.ts
Normal file
25
packages/types/src/shell/model/clipboard.ts
Normal file
@ -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;
|
||||||
|
}
|
||||||
@ -29,3 +29,4 @@ export * from './preference';
|
|||||||
export * from './plugin-instance';
|
export * from './plugin-instance';
|
||||||
export * from './sensor';
|
export * from './sensor';
|
||||||
export * from './resource';
|
export * from './resource';
|
||||||
|
export * from './clipboard';
|
||||||
Loading…
x
Reference in New Issue
Block a user