diff --git a/packages/designer/src/component-meta.ts b/packages/designer/src/component-meta.ts index 70d8630b5..9a74d0ddb 100644 --- a/packages/designer/src/component-meta.ts +++ b/packages/designer/src/component-meta.ts @@ -13,9 +13,9 @@ import { IPublicTypeMetadataTransducer, IPublicModelComponentMeta, } from '@alilc/lowcode-types'; -import { deprecate, isRegExp, isTitleConfig } from '@alilc/lowcode-utils'; +import { deprecate, isRegExp, isTitleConfig, isNode } from '@alilc/lowcode-utils'; import { computed, createModuleEventBus, IEventBus } from '@alilc/lowcode-editor-core'; -import { isNode, Node, INode } from './document'; +import { Node, INode } from './document'; import { Designer } from './designer'; import { IconContainer, @@ -161,6 +161,9 @@ export class ComponentMeta implements IComponentMeta { return this._acceptable!; } + // compatiable vision + prototype?: any; + constructor(readonly designer: Designer, metadata: IPublicTypeComponentMetadata) { this.parseMetadata(metadata); } @@ -347,8 +350,6 @@ export class ComponentMeta implements IComponentMeta { }; } - // compatiable vision - prototype?: any; } export function isComponentMeta(obj: any): obj is ComponentMeta { @@ -373,4 +374,3 @@ function preprocessMetadata(metadata: IPublicTypeComponentMetadata): IPublicType configure: {}, }; } - diff --git a/packages/designer/src/document/document-model.ts b/packages/designer/src/document/document-model.ts index 26648403b..5eb60c396 100644 --- a/packages/designer/src/document/document-model.ts +++ b/packages/designer/src/document/document-model.ts @@ -17,11 +17,11 @@ import { IProject, Project } from '../project'; import { ISimulatorHost } from '../simulator'; import { ComponentMeta } from '../component-meta'; import { IDropLocation, Designer, IHistory } from '../designer'; -import { Node, insertChildren, insertChild, isNode, RootNode, INode } from './node/node'; +import { Node, insertChildren, insertChild, RootNode, INode } from './node/node'; import { Selection, ISelection } from './selection'; import { History } from './history'; import { IModalNodesManager, ModalNodesManager } from './node'; -import { uniqueId, isPlainObject, compatStage, isJSExpression, isDOMText, isNodeSchema, isDragNodeObject, isDragNodeDataObject } from '@alilc/lowcode-utils'; +import { uniqueId, isPlainObject, compatStage, isJSExpression, isDOMText, isNodeSchema, isDragNodeObject, isDragNodeDataObject, isNode } from '@alilc/lowcode-utils'; import { EDITOR_EVENT } from '../types'; export type GetDataType = T extends undefined @@ -32,7 +32,7 @@ export type GetDataType = T extends undefined : any : T; -export interface IDocumentModel extends Omit< IPublicModelDocumentModel, 'selection' > { +export interface IDocumentModel extends Omit< IPublicModelDocumentModel, 'selection' | 'checkNesting' > { readonly designer: Designer; @@ -59,6 +59,11 @@ export interface IDocumentModel extends Omit< IPublicModelDocumentModel, 'select get rootNode(): INode | null; + checkNesting( + dropTarget: INode, + dragObject: IPublicTypeDragNodeObject | IPublicTypeNodeSchema | INode | IPublicTypeDragNodeDataObject, + ): boolean; + } export class DocumentModel implements IDocumentModel { @@ -569,7 +574,10 @@ export class DocumentModel implements IDocumentModel { this.rootNode = null; } - checkNesting(dropTarget: INode, dragObject: IPublicTypeDragNodeObject | IPublicTypeNodeSchema | Node | IPublicTypeDragNodeDataObject): boolean { + checkNesting( + dropTarget: INode, + dragObject: IPublicTypeDragNodeObject | IPublicTypeNodeSchema | INode | IPublicTypeDragNodeDataObject, + ): boolean { let items: Array; if (isDragNodeDataObject(dragObject)) { items = Array.isArray(dragObject.data) ? dragObject.data : [dragObject.data]; diff --git a/packages/designer/src/document/node/node.ts b/packages/designer/src/document/node/node.ts index 2b5433b00..f52d7e7bf 100644 --- a/packages/designer/src/document/node/node.ts +++ b/packages/designer/src/document/node/node.ts @@ -16,7 +16,7 @@ import { IPublicModelExclusiveGroup, IPublicEnumTransformStage, } from '@alilc/lowcode-types'; -import { compatStage, isDOMText, isJSExpression } from '@alilc/lowcode-utils'; +import { compatStage, isDOMText, isJSExpression, isNode } from '@alilc/lowcode-utils'; import { SettingTopEntry } from '@alilc/lowcode-designer'; import { Props, getConvertedExtraKey, IProps } from './props/props'; import { DocumentModel, IDocumentModel } from '../document-model'; @@ -109,6 +109,8 @@ export interface INode extends IPublicModelNode { getExtraProp(key: string, createIfNone?: boolean): IProp | null; replaceChild(node: INode, data: any): INode; + + getSuitablePlace(node: INode, ref: any): any; } /** @@ -913,7 +915,7 @@ export class Node /** * 判断是否包含特定节点 */ - contains(node: Node): boolean { + contains(node: INode): boolean { return contains(this, node); } @@ -1149,14 +1151,14 @@ export class Node /** * TODO: replace non standard metas with standard ones. */ - getSuitablePlace(node: Node, ref: any): any { + getSuitablePlace(node: INode, ref: any): any { const focusNode = this.document?.focusNode; // 如果节点是模态框,插入到根节点下 if (node?.componentMeta?.isModal) { return { container: focusNode, ref }; } - if (!ref && this.contains(focusNode)) { + if (!ref && focusNode && this.contains(focusNode)) { const rootCanDropIn = focusNode.componentMeta?.prototype?.options?.canDropIn; if ( rootCanDropIn === undefined || @@ -1171,7 +1173,7 @@ export class Node if (this.isRoot() && this.children) { const dropElement = this.children.filter((c) => { - if (!c.isContainer()) { + if (!c.isContainerNode) { return false; } const canDropIn = c.componentMeta?.prototype?.options?.canDropIn; @@ -1304,22 +1306,15 @@ export type PageNode = Node; export type ComponentNode = Node; export type RootNode = PageNode | ComponentNode; -/** - * @deprecated use same function from '@alilc/lowcode-utils' instead - */ -export function isNode(node: any): node is Node { - return node && node.isNode; +export function isRootNode(node: INode): node is INode { + return node && node.isRootNode; } -export function isRootNode(node: Node): node is RootNode { - return node && node.isRoot(); -} - -export function isLowCodeComponent(node: Node): boolean { +export function isLowCodeComponent(node: INode): node is INode { return node.componentMeta?.getMetadata().devMode === 'lowCode'; } -export function getZLevelTop(child: Node, zLevel: number): Node | null { +export function getZLevelTop(child: INode, zLevel: number): INode | null { let l = child.zLevel; if (l < zLevel || zLevel < 0) { return null; @@ -1340,12 +1335,12 @@ export function getZLevelTop(child: Node, zLevel: number): Node | null { * @param node2 测试的被包含节点 * @returns 是否包含 */ -export function contains(node1: Node, node2: Node): boolean { +export function contains(node1: INode, node2: INode): boolean { if (node1 === node2) { return true; } - if (!node1.isParental() || !node2.parent) { + if (!node1.isParentalNode || !node2.parent) { return false; } @@ -1367,7 +1362,7 @@ export enum PositionNO { BeforeOrAfter = 2, TheSame = 0, } -export function comparePosition(node1: Node, node2: Node): PositionNO { +export function comparePosition(node1: INode, node2: INode): PositionNO { if (node1 === node2) { return PositionNO.TheSame; } diff --git a/packages/designer/tests/document/node/node.test.ts b/packages/designer/tests/document/node/node.test.ts index d8915c991..f7d35f6d6 100644 --- a/packages/designer/tests/document/node/node.test.ts +++ b/packages/designer/tests/document/node/node.test.ts @@ -7,7 +7,6 @@ import { DocumentModel } from '../../../src/document/document-model'; import { isRootNode, Node, - isNode, comparePosition, contains, PositionNO, @@ -23,6 +22,7 @@ import rootHeaderMetadata from '../../fixtures/component-metadata/root-header'; import rootContentMetadata from '../../fixtures/component-metadata/root-content'; import rootFooterMetadata from '../../fixtures/component-metadata/root-footer'; import { shellModelFactory } from '../../../../engine/src/modules/shell-model-factory'; +import { isNode } from '@alilc/lowcode-utils'; describe('Node 方法测试', () => { let editor: Editor; diff --git a/packages/engine/src/inner-plugins/builtin-hotkey.ts b/packages/engine/src/inner-plugins/builtin-hotkey.ts index 75d36bc6f..b6d3a0950 100644 --- a/packages/engine/src/inner-plugins/builtin-hotkey.ts +++ b/packages/engine/src/inner-plugins/builtin-hotkey.ts @@ -6,10 +6,12 @@ import { IPublicModelNode, IPublicTypeNodeSchema, IPublicTypeNodeData, + IPublicEnumDragObjectType, + IPublicTypeDragNodeObject, } from '@alilc/lowcode-types'; import symbols from '../modules/symbols'; -const { nodeSymbol, documentSymbol } = symbols; +const { nodeSymbol } = symbols; function insertChild( container: IPublicModelNode, @@ -265,10 +267,16 @@ export const builtinHotkey = (ctx: IPublicModelPluginContext) => { if (!target) { return; } - let canAddComponentsTree = componentsTree.filter((i) => { - return (doc as any)[documentSymbol].checkNestingUp(target, i); + let canAddComponentsTree = componentsTree.filter((node: IPublicModelNode) => { + const dragNodeObject: IPublicTypeDragNodeObject = { + type: IPublicEnumDragObjectType.Node, + nodes: [node], + }; + return doc.checkNesting(target, dragNodeObject); }); - if (canAddComponentsTree.length === 0) return; + if (canAddComponentsTree.length === 0) { + return; + } const nodes = insertChildren(target, canAddComponentsTree, index); if (nodes) { doc.selection.selectAll(nodes.map((o) => o.id)); diff --git a/packages/shell/src/model/document-model.ts b/packages/shell/src/model/document-model.ts index 13fc49bae..ba371543a 100644 --- a/packages/shell/src/model/document-model.ts +++ b/packages/shell/src/model/document-model.ts @@ -8,7 +8,6 @@ import { GlobalEvent, IPublicModelDocumentModel, IPublicTypeOnChangeOptions, - IPublicModelDragObject, IPublicTypeDragNodeObject, IPublicTypeDragNodeDataObject, IPublicModelNode, @@ -227,9 +226,11 @@ export class DocumentModel implements IPublicModelDocumentModel { dropTarget: IPublicModelNode, dragObject: IPublicTypeDragNodeObject | IPublicTypeDragNodeDataObject, ): boolean { - let innerDragObject: IPublicModelDragObject = dragObject; + let innerDragObject = dragObject; if (isDragNodeObject(dragObject)) { - innerDragObject.nodes = innerDragObject.nodes.map((node: Node) => (node[nodeSymbol] || node)); + innerDragObject.nodes = innerDragObject.nodes?.map( + (node: IPublicModelNode) => ((node as any)[nodeSymbol] || node), + ); } return this[documentSymbol].checkNesting( ((dropTarget as any)[nodeSymbol] || dropTarget) as any,