mirror of
https://github.com/alibaba/lowcode-engine.git
synced 2025-12-14 13:03:07 +00:00
refactor: remove dependency of documentSymbol
This commit is contained in:
parent
093eeb9b70
commit
1b74e71353
@ -13,9 +13,9 @@ import {
|
|||||||
IPublicTypeMetadataTransducer,
|
IPublicTypeMetadataTransducer,
|
||||||
IPublicModelComponentMeta,
|
IPublicModelComponentMeta,
|
||||||
} from '@alilc/lowcode-types';
|
} 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 { computed, createModuleEventBus, IEventBus } from '@alilc/lowcode-editor-core';
|
||||||
import { isNode, Node, INode } from './document';
|
import { Node, INode } from './document';
|
||||||
import { Designer } from './designer';
|
import { Designer } from './designer';
|
||||||
import {
|
import {
|
||||||
IconContainer,
|
IconContainer,
|
||||||
@ -161,6 +161,9 @@ export class ComponentMeta implements IComponentMeta {
|
|||||||
return this._acceptable!;
|
return this._acceptable!;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// compatiable vision
|
||||||
|
prototype?: any;
|
||||||
|
|
||||||
constructor(readonly designer: Designer, metadata: IPublicTypeComponentMetadata) {
|
constructor(readonly designer: Designer, metadata: IPublicTypeComponentMetadata) {
|
||||||
this.parseMetadata(metadata);
|
this.parseMetadata(metadata);
|
||||||
}
|
}
|
||||||
@ -347,8 +350,6 @@ export class ComponentMeta implements IComponentMeta {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// compatiable vision
|
|
||||||
prototype?: any;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function isComponentMeta(obj: any): obj is ComponentMeta {
|
export function isComponentMeta(obj: any): obj is ComponentMeta {
|
||||||
@ -373,4 +374,3 @@ function preprocessMetadata(metadata: IPublicTypeComponentMetadata): IPublicType
|
|||||||
configure: {},
|
configure: {},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -17,11 +17,11 @@ import { IProject, Project } from '../project';
|
|||||||
import { ISimulatorHost } from '../simulator';
|
import { ISimulatorHost } from '../simulator';
|
||||||
import { ComponentMeta } from '../component-meta';
|
import { ComponentMeta } from '../component-meta';
|
||||||
import { IDropLocation, Designer, IHistory } from '../designer';
|
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 { Selection, ISelection } from './selection';
|
||||||
import { History } from './history';
|
import { History } from './history';
|
||||||
import { IModalNodesManager, ModalNodesManager } from './node';
|
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';
|
import { EDITOR_EVENT } from '../types';
|
||||||
|
|
||||||
export type GetDataType<T, NodeType> = T extends undefined
|
export type GetDataType<T, NodeType> = T extends undefined
|
||||||
@ -32,7 +32,7 @@ export type GetDataType<T, NodeType> = T extends undefined
|
|||||||
: any
|
: any
|
||||||
: T;
|
: T;
|
||||||
|
|
||||||
export interface IDocumentModel extends Omit< IPublicModelDocumentModel, 'selection' > {
|
export interface IDocumentModel extends Omit< IPublicModelDocumentModel, 'selection' | 'checkNesting' > {
|
||||||
|
|
||||||
readonly designer: Designer;
|
readonly designer: Designer;
|
||||||
|
|
||||||
@ -59,6 +59,11 @@ export interface IDocumentModel extends Omit< IPublicModelDocumentModel, 'select
|
|||||||
|
|
||||||
get rootNode(): INode | null;
|
get rootNode(): INode | null;
|
||||||
|
|
||||||
|
checkNesting(
|
||||||
|
dropTarget: INode,
|
||||||
|
dragObject: IPublicTypeDragNodeObject | IPublicTypeNodeSchema | INode | IPublicTypeDragNodeDataObject,
|
||||||
|
): boolean;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export class DocumentModel implements IDocumentModel {
|
export class DocumentModel implements IDocumentModel {
|
||||||
@ -569,7 +574,10 @@ export class DocumentModel implements IDocumentModel {
|
|||||||
this.rootNode = null;
|
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>;
|
let items: Array<Node | IPublicTypeNodeSchema>;
|
||||||
if (isDragNodeDataObject(dragObject)) {
|
if (isDragNodeDataObject(dragObject)) {
|
||||||
items = Array.isArray(dragObject.data) ? dragObject.data : [dragObject.data];
|
items = Array.isArray(dragObject.data) ? dragObject.data : [dragObject.data];
|
||||||
|
|||||||
@ -16,7 +16,7 @@ import {
|
|||||||
IPublicModelExclusiveGroup,
|
IPublicModelExclusiveGroup,
|
||||||
IPublicEnumTransformStage,
|
IPublicEnumTransformStage,
|
||||||
} from '@alilc/lowcode-types';
|
} 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 { SettingTopEntry } from '@alilc/lowcode-designer';
|
||||||
import { Props, getConvertedExtraKey, IProps } from './props/props';
|
import { Props, getConvertedExtraKey, IProps } from './props/props';
|
||||||
import { DocumentModel, IDocumentModel } from '../document-model';
|
import { DocumentModel, IDocumentModel } from '../document-model';
|
||||||
@ -109,6 +109,8 @@ export interface INode extends IPublicModelNode {
|
|||||||
getExtraProp(key: string, createIfNone?: boolean): IProp | null;
|
getExtraProp(key: string, createIfNone?: boolean): IProp | null;
|
||||||
|
|
||||||
replaceChild(node: INode, data: any): INode;
|
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);
|
return contains(this, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1149,14 +1151,14 @@ export class Node<Schema extends IPublicTypeNodeSchema = IPublicTypeNodeSchema>
|
|||||||
/**
|
/**
|
||||||
* TODO: replace non standard metas with standard ones.
|
* 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;
|
const focusNode = this.document?.focusNode;
|
||||||
// 如果节点是模态框,插入到根节点下
|
// 如果节点是模态框,插入到根节点下
|
||||||
if (node?.componentMeta?.isModal) {
|
if (node?.componentMeta?.isModal) {
|
||||||
return { container: focusNode, ref };
|
return { container: focusNode, ref };
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ref && this.contains(focusNode)) {
|
if (!ref && focusNode && this.contains(focusNode)) {
|
||||||
const rootCanDropIn = focusNode.componentMeta?.prototype?.options?.canDropIn;
|
const rootCanDropIn = focusNode.componentMeta?.prototype?.options?.canDropIn;
|
||||||
if (
|
if (
|
||||||
rootCanDropIn === undefined ||
|
rootCanDropIn === undefined ||
|
||||||
@ -1171,7 +1173,7 @@ export class Node<Schema extends IPublicTypeNodeSchema = IPublicTypeNodeSchema>
|
|||||||
|
|
||||||
if (this.isRoot() && this.children) {
|
if (this.isRoot() && this.children) {
|
||||||
const dropElement = this.children.filter((c) => {
|
const dropElement = this.children.filter((c) => {
|
||||||
if (!c.isContainer()) {
|
if (!c.isContainerNode) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
const canDropIn = c.componentMeta?.prototype?.options?.canDropIn;
|
const canDropIn = c.componentMeta?.prototype?.options?.canDropIn;
|
||||||
@ -1304,22 +1306,15 @@ export type PageNode = Node<IPublicTypePageSchema>;
|
|||||||
export type ComponentNode = Node<IPublicTypeComponentSchema>;
|
export type ComponentNode = Node<IPublicTypeComponentSchema>;
|
||||||
export type RootNode = PageNode | ComponentNode;
|
export type RootNode = PageNode | ComponentNode;
|
||||||
|
|
||||||
/**
|
export function isRootNode(node: INode): node is INode {
|
||||||
* @deprecated use same function from '@alilc/lowcode-utils' instead
|
return node && node.isRootNode;
|
||||||
*/
|
|
||||||
export function isNode(node: any): node is Node {
|
|
||||||
return node && node.isNode;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function isRootNode(node: Node): node is RootNode {
|
export function isLowCodeComponent(node: INode): node is INode {
|
||||||
return node && node.isRoot();
|
|
||||||
}
|
|
||||||
|
|
||||||
export function isLowCodeComponent(node: Node): boolean {
|
|
||||||
return node.componentMeta?.getMetadata().devMode === 'lowCode';
|
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;
|
let l = child.zLevel;
|
||||||
if (l < zLevel || zLevel < 0) {
|
if (l < zLevel || zLevel < 0) {
|
||||||
return null;
|
return null;
|
||||||
@ -1340,12 +1335,12 @@ export function getZLevelTop(child: Node, zLevel: number): Node | null {
|
|||||||
* @param node2 测试的被包含节点
|
* @param node2 测试的被包含节点
|
||||||
* @returns 是否包含
|
* @returns 是否包含
|
||||||
*/
|
*/
|
||||||
export function contains(node1: Node, node2: Node): boolean {
|
export function contains(node1: INode, node2: INode): boolean {
|
||||||
if (node1 === node2) {
|
if (node1 === node2) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!node1.isParental() || !node2.parent) {
|
if (!node1.isParentalNode || !node2.parent) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1367,7 +1362,7 @@ export enum PositionNO {
|
|||||||
BeforeOrAfter = 2,
|
BeforeOrAfter = 2,
|
||||||
TheSame = 0,
|
TheSame = 0,
|
||||||
}
|
}
|
||||||
export function comparePosition(node1: Node, node2: Node): PositionNO {
|
export function comparePosition(node1: INode, node2: INode): PositionNO {
|
||||||
if (node1 === node2) {
|
if (node1 === node2) {
|
||||||
return PositionNO.TheSame;
|
return PositionNO.TheSame;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,7 +7,6 @@ import { DocumentModel } from '../../../src/document/document-model';
|
|||||||
import {
|
import {
|
||||||
isRootNode,
|
isRootNode,
|
||||||
Node,
|
Node,
|
||||||
isNode,
|
|
||||||
comparePosition,
|
comparePosition,
|
||||||
contains,
|
contains,
|
||||||
PositionNO,
|
PositionNO,
|
||||||
@ -23,6 +22,7 @@ import rootHeaderMetadata from '../../fixtures/component-metadata/root-header';
|
|||||||
import rootContentMetadata from '../../fixtures/component-metadata/root-content';
|
import rootContentMetadata from '../../fixtures/component-metadata/root-content';
|
||||||
import rootFooterMetadata from '../../fixtures/component-metadata/root-footer';
|
import rootFooterMetadata from '../../fixtures/component-metadata/root-footer';
|
||||||
import { shellModelFactory } from '../../../../engine/src/modules/shell-model-factory';
|
import { shellModelFactory } from '../../../../engine/src/modules/shell-model-factory';
|
||||||
|
import { isNode } from '@alilc/lowcode-utils';
|
||||||
|
|
||||||
describe('Node 方法测试', () => {
|
describe('Node 方法测试', () => {
|
||||||
let editor: Editor;
|
let editor: Editor;
|
||||||
|
|||||||
@ -6,10 +6,12 @@ import {
|
|||||||
IPublicModelNode,
|
IPublicModelNode,
|
||||||
IPublicTypeNodeSchema,
|
IPublicTypeNodeSchema,
|
||||||
IPublicTypeNodeData,
|
IPublicTypeNodeData,
|
||||||
|
IPublicEnumDragObjectType,
|
||||||
|
IPublicTypeDragNodeObject,
|
||||||
} from '@alilc/lowcode-types';
|
} from '@alilc/lowcode-types';
|
||||||
import symbols from '../modules/symbols';
|
import symbols from '../modules/symbols';
|
||||||
|
|
||||||
const { nodeSymbol, documentSymbol } = symbols;
|
const { nodeSymbol } = symbols;
|
||||||
|
|
||||||
function insertChild(
|
function insertChild(
|
||||||
container: IPublicModelNode,
|
container: IPublicModelNode,
|
||||||
@ -265,10 +267,16 @@ export const builtinHotkey = (ctx: IPublicModelPluginContext) => {
|
|||||||
if (!target) {
|
if (!target) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let canAddComponentsTree = componentsTree.filter((i) => {
|
let canAddComponentsTree = componentsTree.filter((node: IPublicModelNode) => {
|
||||||
return (doc as any)[documentSymbol].checkNestingUp(target, i);
|
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);
|
const nodes = insertChildren(target, canAddComponentsTree, index);
|
||||||
if (nodes) {
|
if (nodes) {
|
||||||
doc.selection.selectAll(nodes.map((o) => o.id));
|
doc.selection.selectAll(nodes.map((o) => o.id));
|
||||||
|
|||||||
@ -8,7 +8,6 @@ import {
|
|||||||
GlobalEvent,
|
GlobalEvent,
|
||||||
IPublicModelDocumentModel,
|
IPublicModelDocumentModel,
|
||||||
IPublicTypeOnChangeOptions,
|
IPublicTypeOnChangeOptions,
|
||||||
IPublicModelDragObject,
|
|
||||||
IPublicTypeDragNodeObject,
|
IPublicTypeDragNodeObject,
|
||||||
IPublicTypeDragNodeDataObject,
|
IPublicTypeDragNodeDataObject,
|
||||||
IPublicModelNode,
|
IPublicModelNode,
|
||||||
@ -227,9 +226,11 @@ export class DocumentModel implements IPublicModelDocumentModel {
|
|||||||
dropTarget: IPublicModelNode,
|
dropTarget: IPublicModelNode,
|
||||||
dragObject: IPublicTypeDragNodeObject | IPublicTypeDragNodeDataObject,
|
dragObject: IPublicTypeDragNodeObject | IPublicTypeDragNodeDataObject,
|
||||||
): boolean {
|
): boolean {
|
||||||
let innerDragObject: IPublicModelDragObject = dragObject;
|
let innerDragObject = dragObject;
|
||||||
if (isDragNodeObject(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(
|
return this[documentSymbol].checkNesting(
|
||||||
((dropTarget as any)[nodeSymbol] || dropTarget) as any,
|
((dropTarget as any)[nodeSymbol] || dropTarget) as any,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user