diff --git a/packages/designer/src/designer/builtin-hotkey.ts b/packages/designer/src/designer/builtin-hotkey.ts index a30ee0ad4..13bea87f4 100644 --- a/packages/designer/src/designer/builtin-hotkey.ts +++ b/packages/designer/src/designer/builtin-hotkey.ts @@ -77,7 +77,9 @@ hotkey.bind(['backspace', 'del'], (e: KeyboardEvent) => { const topItems = sel.getTopNodes(); // TODO: check can remove topItems.forEach((node) => { - doc.removeNode(node); + if (node.canPerformAction('remove')) { + doc.removeNode(node); + } }); sel.clear(); }); @@ -102,8 +104,13 @@ hotkey.bind(['command+c', 'ctrl+c', 'command+x', 'ctrl+x'], (e, action) => { } e.preventDefault(); - const selected = doc.selection.getTopNodes(true); - if (!selected || selected.length < 1) return; + let selected = doc.selection.getTopNodes(true); + selected = selected.filter((node) => { + return node.canPerformAction('copy'); + }) + if (!selected || selected.length < 1) { + return; + } const componentsMap = {}; const componentsTree = selected.map((item) => item.export(TransformStage.Clone)); diff --git a/packages/designer/src/document/node/node.ts b/packages/designer/src/document/node/node.ts index 003d6f109..e786a46d0 100644 --- a/packages/designer/src/document/node/node.ts +++ b/packages/designer/src/document/node/node.ts @@ -703,6 +703,14 @@ export class Node { this.document.destroyNode(this); } + /** + * 是否可执行某action + */ + canPerformAction(action: string): boolean { + const availableActions = this.componentMeta?.availableActions?.map((action) => action.name) || []; + return availableActions.indexOf(action) >= 0; + } + // ======= compatible apis ==== isEmpty(): boolean { return this.children ? this.children.isEmpty() : true;