refactor: remove dependency of documentSymbol

This commit is contained in:
JackLian 2023-01-29 10:14:26 +08:00 committed by 刘菊萍(絮黎)
parent 093eeb9b70
commit 1b74e71353
6 changed files with 48 additions and 36 deletions

View File

@ -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: {},
};
}

View File

@ -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, NodeType> = T extends undefined
@ -32,7 +32,7 @@ export type GetDataType<T, NodeType> = 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<Node | IPublicTypeNodeSchema>;
if (isDragNodeDataObject(dragObject)) {
items = Array.isArray(dragObject.data) ? dragObject.data : [dragObject.data];

View File

@ -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<Schema extends IPublicTypeNodeSchema = IPublicTypeNodeSchema>
/**
*
*/
contains(node: Node): boolean {
contains(node: INode): boolean {
return contains(this, node);
}
@ -1149,14 +1151,14 @@ export class Node<Schema extends IPublicTypeNodeSchema = IPublicTypeNodeSchema>
/**
* 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<Schema extends IPublicTypeNodeSchema = IPublicTypeNodeSchema>
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<IPublicTypePageSchema>;
export type ComponentNode = Node<IPublicTypeComponentSchema>;
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;
}

View File

@ -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;

View File

@ -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));

View File

@ -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,