docs(selection): optimize api doc for model/selection, and fix related lint issues

This commit is contained in:
JackLian 2023-01-10 19:20:17 +08:00 committed by 刘菊萍(絮黎)
parent f6771fefac
commit d3cc39ec9c
8 changed files with 201 additions and 86 deletions

View File

@ -67,6 +67,7 @@ release(id: string): void;
leave(): void; leave(): void;
``` ```
## 事件
### onDetectingChange ### onDetectingChange
hover 节点变化事件 hover 节点变化事件
@ -81,6 +82,6 @@ onDetectingChange(fn: (node: IPublicModelNode) => void): IPublicTypeDisposable;
相关类型: 相关类型:
- [IPublicModelNode](https://github.com/alibaba/lowcode-engine/blob/main/packages/types/src/shell/model/node.ts) - [IPublicModelNode](https://github.com/alibaba/lowcode-engine/blob/main/packages/types/src/shell/model/node.ts)
- [IPublicModelNode](https://github.com/alibaba/lowcode-engine/blob/main/packages/types/src/shell/type/disposable.ts) - [IPublicTypeDisposable](https://github.com/alibaba/lowcode-engine/blob/main/packages/types/src/shell/type/disposable.ts)
**@since v1.1.0** **@since v1.1.0**

View File

@ -14,49 +14,110 @@ sidebar_position: 6
返回选中的节点 id 返回选中的节点 id
`@type {string[]}`
### node
返回选中的节点(如多个节点只返回第一个)
`@type {IPublicModelNode | null}`
相关类型:[IPublicModelNode](https://github.com/alibaba/lowcode-engine/blob/main/packages/types/src/shell/model/node.ts)
**@since v1.1.0**
## 方法签名 ## 方法签名
### select ### select
select(id: string)
选中指定节点(覆盖方式) 选中指定节点(覆盖方式)
```typescript
/**
* 选中指定节点(覆盖方式)
* select node with id, this will override current selection
* @param id
*/
select(id: string): void;
```
### selectAll ### selectAll
selectAll(ids: string[])
批量选中指定节点们 批量选中指定节点们
```typescript
/**
* 批量选中指定节点们
* select node with ids, this will override current selection
*
* @param ids
*/
selectAll(ids: string[]): void;
```
### remove ### remove
remove(id: string)
**取消选中**选中的指定节点,不会删除组件 **取消选中**选中的指定节点,不会删除组件
```typescript
/**
* 移除选中的指定节点
* remove node from selection with node id
* @param id
*/
remove(id: string): void;
```
### clear ### clear
clear()
**取消选中**所有选中节点,不会删除组件 **取消选中**所有选中节点,不会删除组件
```typescript
/**
* 清除所有选中节点
* clear current selection
*/
clear(): void;
```
### has ### has
has(id: string)
判断是否选中了指定节点 判断是否选中了指定节点
```typescript
/**
* 判断是否选中了指定节点
* check if node with specific id is selected
* @param id
*/
has(id: string): boolean;
```
### add ### add
add(id: string)
选中指定节点(增量方式) 选中指定节点(增量方式)
```typescript
/**
* 选中指定节点(增量方式)
* add node with specific id to selection
* @param id
*/
add(id: string): void;
```
### getNodes ### getNodes
getNodes()
获取选中的节点实例 获取选中的节点实例
```typescript
/**
* 获取选中的节点实例
* get selected nodes
*/
getNodes(): IPublicModelNode[];
```
相关类型:[IPublicModelNode](https://github.com/alibaba/lowcode-engine/blob/main/packages/types/src/shell/model/node.ts)
### getTopNodes ### getTopNodes
获取选区的顶层节点 获取选区的顶层节点
例如选中的节点为: 例如选中的节点为:
@ -67,19 +128,34 @@ getNodes()
getNodes 返回的是 [DivA、ChildrenA、DivB]getTopNodes 返回的是 [DivA、DivB],其中 ChildrenA 由于是二层节点getTopNodes 不会返回 getNodes 返回的是 [DivA、ChildrenA、DivB]getTopNodes 返回的是 [DivA、DivB],其中 ChildrenA 由于是二层节点getTopNodes 不会返回
```typescript
/**
* 获取选区的顶层节点
* get seleted top nodes
* for example:
* getNodes() returns [A, subA, B], then
* getTopNodes() will return [A, B], subA will be removed
* @since v1.0.16
*/
getTopNodes(includeRoot?: boolean): IPublicModelNode[];
```
**@since v1.0.16** **@since v1.0.16**
## 事件
### onSelectionChange ### onSelectionChange
注册 selection 变化事件回调 注册 selection 变化事件回调
```typescript ```typescript
/** /**
* 注册 selection 变化事件回调 * 注册 selection 变化事件回调
* set callback which will be called when selection is changed * set callback which will be called when selection is changed
* @since v1.1.0 * @since v1.1.0
*/ */
onSelectionChange(fn: (ids: string[]) => void): () => void; onSelectionChange(fn: (ids: string[]) => void): IPublicTypeDisposable;
``` ```
相关类型:[IPublicTypeDisposable](https://github.com/alibaba/lowcode-engine/blob/main/packages/types/src/shell/type/disposable.ts)
**@since v1.1.0** **@since v1.1.0**

View File

@ -8,7 +8,6 @@ import {
IPublicTypeDragNodeObject, IPublicTypeDragNodeObject,
IPublicTypeDragNodeDataObject, IPublicTypeDragNodeDataObject,
IPublicModelDocumentModel, IPublicModelDocumentModel,
IPublicModelSelection,
IPublicModelHistory, IPublicModelHistory,
IPublicModelModalNodesManager, IPublicModelModalNodesManager,
IPublicModelNode, IPublicModelNode,
@ -22,7 +21,7 @@ import { ISimulatorHost } from '../simulator';
import { ComponentMeta } from '../component-meta'; import { ComponentMeta } from '../component-meta';
import { IDropLocation, Designer } from '../designer'; import { IDropLocation, Designer } from '../designer';
import { Node, insertChildren, insertChild, isNode, RootNode, INode } from './node/node'; import { Node, insertChildren, insertChild, isNode, RootNode, INode } from './node/node';
import { Selection } from './selection'; import { Selection, ISelection } from './selection';
import { History } from './history'; import { History } from './history';
import { ModalNodesManager } from './node'; import { 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 } from '@alilc/lowcode-utils';
@ -35,10 +34,16 @@ export type GetDataType<T, NodeType> = T extends undefined
? R ? R
: any : any
: T; : T;
export interface IDocumentModel extends IPublicModelDocumentModel {
export interface IDocumentModel extends Omit< IPublicModelDocumentModel, 'selection' > {
readonly designer: Designer; readonly designer: Designer;
/**
*
*/
readonly selection: ISelection;
/** /**
* id * id
*/ */
@ -59,7 +64,7 @@ export class DocumentModel implements IDocumentModel {
/** /**
* *
*/ */
readonly selection: IPublicModelSelection = new Selection(this); readonly selection: ISelection = new Selection(this);
/** /**
* *
@ -489,7 +494,6 @@ export class DocumentModel implements IDocumentModel {
); );
} }
/** /**
* *
* tab * tab

View File

@ -1,10 +1,20 @@
import { obx, makeObservable, IEventBus, createModuleEventBus } from '@alilc/lowcode-editor-core'; import { obx, makeObservable, IEventBus, createModuleEventBus } from '@alilc/lowcode-editor-core';
import { Node, comparePosition, PositionNO } from './node/node'; import { Node, INode, comparePosition, PositionNO } from './node/node';
import { DocumentModel } from './document-model'; import { DocumentModel } from './document-model';
import { IPublicModelSelection } from '@alilc/lowcode-types'; import { IPublicModelSelection } from '@alilc/lowcode-types';
export interface ISelection extends IPublicModelSelection { export interface ISelection extends Omit< IPublicModelSelection, 'getNodes' | 'getTopNodes' > {
/**
*
* @returns
*/
getNodes(): INode[];
/**
*
*/
getTopNodes(includeRoot?: boolean): INode[];
} }
export class Selection implements ISelection { export class Selection implements ISelection {

View File

@ -19,12 +19,12 @@ import {
IPublicModelSettingTopEntry, IPublicModelSettingTopEntry,
IPublicModelExclusiveGroup, IPublicModelExclusiveGroup,
} from '@alilc/lowcode-types'; } from '@alilc/lowcode-types';
import { Prop } from './prop'; import { Prop as ShellProp } from './prop';
import { Props } from './props'; import { Props as ShellProps } from './props';
import { DocumentModel } from './document-model'; import { DocumentModel as ShellDocumentModel } from './document-model';
import { NodeChildren } from './node-children'; import { NodeChildren as ShellNodeChildren } from './node-children';
import { ComponentMeta } from './component-meta'; import { ComponentMeta as ShellComponentMeta } from './component-meta';
import { SettingTopEntry } from './setting-top-entry'; import { SettingTopEntry as ShellSettingTopEntry } from './setting-top-entry';
import { documentSymbol, nodeSymbol } from '../symbols'; import { documentSymbol, nodeSymbol } from '../symbols';
import { ReactElement } from 'react'; import { ReactElement } from 'react';
@ -36,27 +36,6 @@ export class Node implements IPublicModelNode {
private _id: string; private _id: string;
constructor(node: IPublicModelNode) {
this[nodeSymbol] = node;
this[documentSymbol] = node.document;
this._id = this[nodeSymbol].id;
}
static create(node: IPublicModelNode | null | undefined): IPublicModelNode | null {
if (!node) {
return null;
}
// @ts-ignore 直接返回已挂载的 shell node 实例
if (node[shellNodeSymbol]) {
return (node as any)[shellNodeSymbol];
}
const shellNode = new Node(node);
// @ts-ignore 挂载 shell node 实例
node[shellNodeSymbol] = shellNode;
return shellNode;
}
/** /**
* id * id
*/ */
@ -257,7 +236,7 @@ export class Node implements IPublicModelNode {
* *
*/ */
get componentMeta(): IPublicModelComponentMeta | null { get componentMeta(): IPublicModelComponentMeta | null {
return ComponentMeta.create(this[nodeSymbol].componentMeta); return ShellComponentMeta.create(this[nodeSymbol].componentMeta);
} }
/** /**
@ -265,7 +244,7 @@ export class Node implements IPublicModelNode {
* @returns * @returns
*/ */
get document(): IPublicModelDocumentModel | null { get document(): IPublicModelDocumentModel | null {
return DocumentModel.create(this[documentSymbol]); return ShellDocumentModel.create(this[documentSymbol]);
} }
/** /**
@ -297,7 +276,7 @@ export class Node implements IPublicModelNode {
* @returns * @returns
*/ */
get children(): IPublicModelNodeChildren | null { get children(): IPublicModelNodeChildren | null {
return NodeChildren.create(this[nodeSymbol].children); return ShellNodeChildren.create(this[nodeSymbol].children);
} }
/** /**
@ -311,14 +290,14 @@ export class Node implements IPublicModelNode {
* *
*/ */
get slotFor(): IPublicModelProp | null { get slotFor(): IPublicModelProp | null {
return Prop.create(this[nodeSymbol].slotFor); return ShellProp.create(this[nodeSymbol].slotFor);
} }
/** /**
* *
*/ */
get props(): IPublicModelProps | null { get props(): IPublicModelProps | null {
return Props.create(this[nodeSymbol].props); return ShellProps.create(this[nodeSymbol].props);
} }
/** /**
@ -336,7 +315,28 @@ export class Node implements IPublicModelNode {
} }
get settingEntry(): IPublicModelSettingTopEntry { get settingEntry(): IPublicModelSettingTopEntry {
return SettingTopEntry.create(this[nodeSymbol].settingEntry as any); return ShellSettingTopEntry.create(this[nodeSymbol].settingEntry as any);
}
constructor(node: IPublicModelNode) {
this[nodeSymbol] = node;
this[documentSymbol] = node.document;
this._id = this[nodeSymbol].id;
}
static create(node: InnerNode | null | undefined): IPublicModelNode | null {
if (!node) {
return null;
}
// @ts-ignore 直接返回已挂载的 shell node 实例
if (node[shellNodeSymbol]) {
return (node as any)[shellNodeSymbol];
}
const shellNode = new Node(node);
// @ts-ignore 挂载 shell node 实例
node[shellNodeSymbol] = shellNode;
return shellNode;
} }
/** /**
@ -445,7 +445,7 @@ export class Node implements IPublicModelNode {
* @returns * @returns
*/ */
getProp(path: string, createIfNone = true): IPublicModelProp | null { getProp(path: string, createIfNone = true): IPublicModelProp | null {
return Prop.create(this[nodeSymbol].getProp(path, createIfNone)); return ShellProp.create(this[nodeSymbol].getProp(path, createIfNone));
} }
/** /**
@ -465,7 +465,7 @@ export class Node implements IPublicModelNode {
* @returns * @returns
*/ */
getExtraProp(path: string, createIfNone?: boolean): IPublicModelProp | null { getExtraProp(path: string, createIfNone?: boolean): IPublicModelProp | null {
return Prop.create(this[nodeSymbol].getExtraProp(path, createIfNone)); return ShellProp.create(this[nodeSymbol].getExtraProp(path, createIfNone));
} }
/** /**
@ -591,12 +591,13 @@ export class Node implements IPublicModelNode {
remove(): void { remove(): void {
this[nodeSymbol].remove(); this[nodeSymbol].remove();
} }
/** /**
* @deprecated * @deprecated
* *
*/ */
set isRGLContainer(flag: boolean) { set isRGLContainer(flag: boolean) {
this[nodeSymbol].isRGLContainer = flag; this[nodeSymbol].isRGLContainerNode = flag;
} }
/** /**
@ -605,14 +606,14 @@ export class Node implements IPublicModelNode {
* @returns Boolean * @returns Boolean
*/ */
get isRGLContainer() { get isRGLContainer() {
return this[nodeSymbol].isRGLContainer; return this[nodeSymbol].isRGLContainerNode;
} }
/** /**
* *
*/ */
set isRGLContainerNode(flag: boolean) { set isRGLContainerNode(flag: boolean) {
this[nodeSymbol].isRGLContainer = flag; this[nodeSymbol].isRGLContainerNode = flag;
} }
/** /**
@ -620,7 +621,7 @@ export class Node implements IPublicModelNode {
* @returns Boolean * @returns Boolean
*/ */
get isRGLContainerNode() { get isRGLContainerNode() {
return this[nodeSymbol].isRGLContainer; return this[nodeSymbol].isRGLContainerNode;
} }
internalToShellNode() { internalToShellNode() {

View File

@ -1,19 +1,17 @@
import { import {
DocumentModel as InnerDocumentModel, IDocumentModel as InnerDocumentModel,
Node as InnerNode, INode as InnerNode,
Selection as InnerSelection, ISelection as InnerSelection,
} from '@alilc/lowcode-designer'; } from '@alilc/lowcode-designer';
import { Node } from './node'; import { Node as ShellNode } from './node';
import { selectionSymbol, documentSymbol } from '../symbols'; import { selectionSymbol } from '../symbols';
import { IPublicModelSelection, IPublicModelNode } from '@alilc/lowcode-types'; import { IPublicModelSelection, IPublicModelNode, IPublicTypeDisposable } from '@alilc/lowcode-types';
export class Selection implements IPublicModelSelection { export class Selection implements IPublicModelSelection {
private readonly [selectionSymbol]: InnerSelection; private readonly [selectionSymbol]: InnerSelection;
private readonly [documentSymbol]: InnerDocumentModel;
constructor(document: InnerDocumentModel) { constructor(document: InnerDocumentModel) {
this[selectionSymbol] = document.selection; this[selectionSymbol] = document.selection;
this[documentSymbol] = document;
} }
/** /**
@ -83,8 +81,16 @@ export class Selection implements IPublicModelSelection {
* *
* @returns * @returns
*/ */
getNodes(): Array<IPublicModelNode | null> { getNodes(): IPublicModelNode[] {
return this[selectionSymbol].getNodes().map((node: InnerNode) => Node.create(node)); const innerNodes = this[selectionSymbol].getNodes();
const nodes: IPublicModelNode[] = [];
innerNodes.forEach((node: InnerNode) => {
const shellNode = ShellNode.create(node);
if (shellNode) {
nodes.push(shellNode);
}
});
return nodes;
} }
/** /**
@ -94,12 +100,19 @@ export class Selection implements IPublicModelSelection {
* getTopNodes() will return [A, B], subA will be removed * getTopNodes() will return [A, B], subA will be removed
* @returns * @returns
*/ */
getTopNodes(includeRoot: boolean = false): Array<IPublicModelNode | null> { getTopNodes(includeRoot: boolean = false): IPublicModelNode[] {
return this[selectionSymbol].getTopNodes(includeRoot).map((node: InnerNode) => Node.create(node)); const innerNodes = this[selectionSymbol].getTopNodes(includeRoot);
const nodes: IPublicModelNode[] = [];
innerNodes.forEach((node: InnerNode) => {
const shellNode = ShellNode.create(node);
if (shellNode) {
nodes.push(shellNode);
}
});
return nodes;
} }
onSelectionChange(fn: (ids: string[]) => void): IPublicTypeDisposable {
onSelectionChange(fn: (ids: string[]) => void): () => void {
return this[selectionSymbol].onSelectionChange(fn); return this[selectionSymbol].onSelectionChange(fn);
} }
} }

View File

@ -40,7 +40,7 @@ export interface IPublicModelHistory {
* | 1 | 1 | 1 | * | 1 | 1 | 1 |
* | -------- | -------- | -------- | * | -------- | -------- | -------- |
* | modified | redoable | undoable | * | modified | redoable | undoable |
* eg: * eg.
* 7 means : modified && redoable && undoable * 7 means : modified && redoable && undoable
* 5 means : modified && undoable * 5 means : modified && undoable
*/ */

View File

@ -1,66 +1,76 @@
import { IPublicModelNode } from './'; import { IPublicModelNode } from './';
import { IPublicTypeDisposable } from '../type';
export interface IPublicModelSelection { export interface IPublicModelSelection {
/** /**
* id * id
* get ids of selected nodes
*/ */
get selected(): string[]; get selected(): string[];
/** /**
* return selected Node instance *
* return selected Node instancereturn the first one if multiple nodes are selected
* @since v1.1.0
*/ */
get node(): IPublicModelNode | null; get node(): IPublicModelNode | null;
/** /**
* *
* select node with id, this will override current selection
* @param id * @param id
*/ */
select(id: string): void; select(id: string): void;
/** /**
* *
* select node with ids, this will override current selection
*
* @param ids * @param ids
*/ */
selectAll(ids: string[]): void; selectAll(ids: string[]): void;
/** /**
* *
* remove node from selection with node id
* @param id * @param id
*/ */
remove(id: string): void; remove(id: string): void;
/** /**
* *
* clear current selection
*/ */
clear(): void; clear(): void;
/** /**
* *
* check if node with specific id is selected
* @param id * @param id
* @returns
*/ */
has(id: string): boolean; has(id: string): boolean;
/** /**
* *
* add node with specific id to selection
* @param id * @param id
*/ */
add(id: string): void; add(id: string): void;
/** /**
* *
* @returns * get selected nodes
*/ */
getNodes(): IPublicModelNode[]; getNodes(): IPublicModelNode[];
/** /**
* *
* get seleted top nodes
* for example: * for example:
* getNodes() returns [A, subA, B], then * getNodes() returns [A, subA, B], then
* getTopNodes() will return [A, B], subA will be removed * getTopNodes() will return [A, B], subA will be removed
* @since v1.0.16 * @since v1.0.16
* @returns
*/ */
getTopNodes(includeRoot?: boolean): IPublicModelNode[]; getTopNodes(includeRoot?: boolean): IPublicModelNode[];
@ -69,5 +79,5 @@ export interface IPublicModelSelection {
* set callback which will be called when selection is changed * set callback which will be called when selection is changed
* @since v1.1.0 * @since v1.1.0
*/ */
onSelectionChange(fn: (ids: string[]) => void): () => void; onSelectionChange(fn: (ids: string[]) => void): IPublicTypeDisposable;
} }