UNPKG

@logicflow/core

Version:

LogicFlow, help you quickly create flowcharts

200 lines (199 loc) 7.88 kB
import GraphModel from './GraphModel'; import { BaseNodeModel } from './node'; import LogicFlow from '../LogicFlow'; import { ElementState } from '../constant'; export declare namespace Model { import PropertiesType = LogicFlow.PropertiesType; type AdditionStateDataType = Record<string, unknown>; type PropertyType = Record<string, unknown>; type VectorType = [number, number]; type IsAllowMove = { x: boolean; y: boolean; }; type AnchorConfig = { id?: string; x: number; y: number; [key: string]: unknown; }; type AnchorInfo = { index: number; anchor: AnchorConfig; }; type ConnectRule = { message: string; validate: (source?: BaseNodeModel, target?: BaseNodeModel, sourceAnchor?: AnchorConfig, targetAnchor?: AnchorConfig, /** * REMIND: 调整的边的 id * 在开启 adjustEdgeStartAndEnd 后调整边连接的节点时会传入 * 详见:https://github.com/didi/LogicFlow/issues/926#issuecomment-1371823306 */ edgeID?: string) => boolean | undefined; }; type ConnectRuleResult = { isAllPass: boolean; msg?: string; }; /** * 限制节点移动规则 * model: 移动节点的 model * deltaX: 移动的 X 轴距离 * deltaY: 移动的 Y 轴距离 */ type NodeMoveRule = (model: BaseNodeModel, deltaX: number, deltaY: number) => boolean | IsAllowMove; /** * 限制节点resize规则 * model: 移动节点的 model * deltaX: 中心点移动的 X 轴距离 * deltaY: 中心点移动的 Y 轴距离 * width: 中心点新的width * height: 中心点新的height */ type NodeResizeRule = (model: BaseNodeModel, deltaX: number, deltaY: number, width: number, height: number) => boolean; type AdjustEdgeStartAndEndParams = { startPoint: LogicFlow.Point; endPoint: LogicFlow.Point; sourceNode?: BaseNodeModel; targetNode?: BaseNodeModel; }; type BoxBoundsPoint = { minX: number; minY: number; maxX: number; maxY: number; }; interface BoxBounds extends BoxBoundsPoint { x: number; y: number; width: number; height: number; centerX: number; centerY: number; } type OutlineInfo = { x: number; y: number; x1: number; y1: number; }; interface BoxBounds { x: number; y: number; width: number; height: number; minX: number; minY: number; maxX: number; maxY: number; centerX: number; centerY: number; } interface BaseModel<P extends PropertiesType = PropertiesType> { /** * 节点或边对应的 ID. * * 默认情况下,使用 uuidV4 生成。如需自定义,可通过传入 createId 方法覆盖。 */ id: string; /** * model 对应的图形外观类型 (eg: 圆形、矩形、多边形等) * * 不可自定义,用于 LogicFlow 内部计算使用 */ readonly modelType: string; /** * 请勿直接修改属性,如果想要将一个节点类型修改为另一个类型。(直接禁止修改不就可以了 public readonly) * `lf.graphModel.changeEdgeType` or `lf.graphModel.changeNodeType` * * 流程图元素类型,自定义元素时对应的标识 * 在 logicflow/core 中对应着 rect/circle/polyline 这种 * 在实际项目中,我们会基于业务类型进行自定义 type. * 例如 BPMN 场景中,我们会定义开始节点的类型为 bpmn:start-event * * 与 modelType 的区别是,type 更多的是业务上的类型,而 modelType 则是外观上的类型。 * 例如 bpmn.js 的开始节点和结束节点 type 分别为 'bpmn:start-event' 和 'bpmn:end-event'。 * 但是他们的 modelType 都是 circle-node,因为他们的外观都是基于圆形自定义而来。 */ readonly type: string; graphModel: GraphModel; /** * 状态附加数据,例如显示菜单,菜单的位置信息 * @deprecated: 请勿使用,即将废弃 */ additionStateData?: AdditionStateDataType; /** * Rule 相关配置,包括连入、连出、移动等 */ targetRules?: ConnectRule[]; sourceRules?: ConnectRule[]; moveRules?: NodeMoveRule[]; hasSetTargetRules?: boolean; hasSetSourceRules?: boolean; /** * 元素上的文本 * * LogicFlow 中存在两种文本:1. 脱离边和节点单独存在的问题;2. 必须和边、节点关联的文本 * 此属性控制的是第二种。节点和边在删除、调整的同时,其关联的文本也会对应删除、调整。 */ text: LogicFlow.TextConfig; properties: P; isSelected: boolean; isHovered: boolean; isHitable: boolean; isHittable: boolean; draggable: boolean; visible: boolean; virtual: boolean; /** * 元素堆叠的层级,默认情况下节点 zIndex 值为 1,边 zIndex 为 0 */ zIndex: number; /** * 元素状态: 不同状态不应不同元素的显示效果(无法直接修改) */ readonly state: ElementState; /** * 创建节点 ID * * 默认情况下,LogicFlow 内部使用 uuidV4 生成 id。在自定义节点的时候,可以重写此方法, * 基于自己的规则生成 id。 * 注意 📢:此方法必须是同步方法,如果想要异步修改 ID,建议删除此节点后在同一位置创建一个新的节点 * @overridable 可被重写 * @returns string */ createId: () => string | null; isAllowMoveNode?: (deltaX: number, deltaY: number) => boolean | IsAllowMove; moveText: (deltaX: number, deltaY: number) => void; moveTo?: (x: number, y: number, isIgnoreRule: boolean) => boolean; getMoveDistance?: (deltaX: number, deltaY: number, isIgnoreRule: boolean) => VectorType; move?: (x: number, y: number, isIgnoreRule: boolean) => boolean; updateText: (text: string) => void; setSelected: (isSelected: boolean) => void; setHovered: (isHovered: boolean) => void; setHitable: (isHittable: boolean) => void; setHittable: (isHittable: boolean) => void; setZIndex: (zIndex?: number) => void; updateAttributes: (attributes: LogicFlow.AttributesType) => void; /** * 设置 Node | Edge 等 model 的状态 * @param state 状态 * @param additionStateData 额外的参数 */ setElementState: (state: ElementState, additionStateData?: AdditionStateDataType) => void; getData: () => Record<string, unknown>; getProperties: () => PropertyType; setProperty: (key: string, val: unknown) => void; setProperties: (properties: PropertyType) => void; deleteProperty: (key: string) => void; getNodeStyle?: () => LogicFlow.CommonTheme; getEdgeStyle?: () => LogicFlow.EdgeTheme; getTextStyle: () => LogicFlow.TextNodeTheme; getAnchorStyle?: () => LogicFlow.AnchorTheme; getAnchorLineStyle?: () => LogicFlow.AnchorLineTheme; getOutlineStyle: () => LogicFlow.OutlineTheme; setStyle: (key: string, val: LogicFlow.CommonThemePropTypes) => void; setStyles: (styles: LogicFlow.CommonTheme) => void; updateStyles: (styles: LogicFlow.CommonTheme) => void; } }