@logicflow/core
Version:
LogicFlow, help you quickly create flowcharts
1,043 lines (1,042 loc) • 34.1 kB
TypeScript
import { ComponentType, createElement as h } from 'preact/compat';
import { Options as LFOptions } from './options';
import * as _Model from './model';
import { BaseEdgeModel, BaseNodeModel, IEditConfigType, GraphModel, SnaplineModel, ZoomParamType } from './model';
import { Dnd } from './view/behavior';
import Tool from './tool';
import History from './history';
import Keyboard from './keyboard';
import { EventCallback, CallbackArgs, EventArgs } from './event/eventEmitter';
import { EventType, SegmentDirection } from './constant';
import { Grid } from './view/overlay';
import Extension = LogicFlow.Extension;
import ExtensionConfig = LogicFlow.ExtensionConfig;
import ExtensionConstructor = LogicFlow.ExtensionConstructor;
import GraphConfigData = LogicFlow.GraphConfigData;
import NodeConfig = LogicFlow.NodeConfig;
import EdgeConfig = LogicFlow.EdgeConfig;
import GraphData = LogicFlow.GraphData;
import NodeData = LogicFlow.NodeData;
import EdgeData = LogicFlow.EdgeData;
import RegisterConfig = LogicFlow.RegisterConfig;
import GraphElements = LogicFlow.GraphElements;
import Position = LogicFlow.Position;
import PointTuple = LogicFlow.PointTuple;
import ExtensionRenderFunc = LogicFlow.ExtensionRenderFunc;
import RegisterElementFunc = LogicFlow.RegisterElementFunc;
import PropertiesType = LogicFlow.PropertiesType;
import ClientPosition = LogicFlow.ClientPosition;
import ExtensionDefinition = LogicFlow.ExtensionDefinition;
import ExtensionType = LogicFlow.ExtensionType;
declare const pluginFlag: unique symbol;
export declare class LogicFlow {
readonly container: HTMLElement;
readonly options: LFOptions.Definition;
readonly graphModel: GraphModel;
viewMap: Map<string, ComponentType>;
history: History;
keyboard: Keyboard;
dnd: Dnd;
tool: Tool;
snaplineModel?: SnaplineModel;
components: ExtensionRenderFunc[];
readonly plugins: ExtensionType[];
static extensions: Map<string, ExtensionConfig>;
extension: Record<string, Extension | ExtensionDefinition>;
readonly width?: number;
readonly height?: number;
/**
* 自定义数据转换方法
* 当接入系统格式和 LogicFlow 数据格式不一致时,可自定义此方法来进行数据格式转换
* 详情请参考 adapter docs
* 包括 adapterIn 和 adapterOut 两个方法
*/
adapterIn?: (data: unknown) => GraphData;
adapterOut?: (data: GraphData, ...rest: any) => unknown;
[propName: string]: any;
private initContainer;
protected get [Symbol.toStringTag](): string;
constructor(options: LFOptions.Common);
/*********************************************************
* Register 相关
********************************************************/
private setView;
private getView;
register(element: RegisterConfig): void;
register(type: string, fn: RegisterElementFunc, isObserverView?: boolean): void;
/**
* 注册元素(节点 or 边)
* @param config 注册元素的配置项
* @private
*/
private registerElement;
/**
* 批量注册元素
* @param elements 注册的元素
*/
batchRegister(elements?: RegisterConfig[]): void;
private defaultRegister;
/*********************************************************
* Node 相关方法
********************************************************/
/**
* 添加节点
* @param nodeConfig 节点配置
* @param eventType 新增节点事件类型,默认EventType.NODE_ADD
* @param e MouseEvent 事件
*/
addNode(nodeConfig: NodeConfig, eventType?: EventType, e?: MouseEvent): BaseNodeModel;
/**
* 删除节点
* @param {string} nodeId 节点Id
*/
deleteNode(nodeId: string): boolean;
/**
* 克隆节点
* @param nodeId 节点Id
*/
cloneNode(nodeId: string): NodeData | undefined;
/**
* 修改节点的id,如果不传新的id,会内部自动创建一个。
* @param { string } nodeId 将要被修改的id
* @param { string } newId 可选,修改后的id
* @returns 修改后的节点id, 如果传入的oldId不存在,返回空字符串
*/
changeNodeId(nodeId: string, newId?: string): string;
/**
* 修改指定节点类型
* @param nodeId 节点id
* @param type 节点类型
*/
changeNodeType(nodeId: string, type: string): void;
/**
* 获取节点对象
* @param nodeId 节点Id
*/
getNodeModelById(nodeId: string): BaseNodeModel | undefined;
/**
* 获取节点数据
* @param nodeId 节点
*/
getNodeDataById(nodeId: string): NodeData | undefined;
/**
* 获取所有以此节点为终点的边
* @param { string } nodeId
*/
getNodeIncomingEdge(nodeId: string): _Model.BaseEdgeModel<PropertiesType>[];
/**
* 获取所有以此节点为起点的边
* @param {string} nodeId
*/
getNodeOutgoingEdge(nodeId: string): _Model.BaseEdgeModel<PropertiesType>[];
/**
* 获取节点连接到的所有起始节点
* @param {string} nodeId
*/
getNodeIncomingNode(nodeId: string): _Model.BaseNodeModel<PropertiesType>[];
/**
* 获取节点连接到的所有目标节点
* @param {string} nodeId
*/
getNodeOutgoingNode(nodeId: string): _Model.BaseNodeModel<PropertiesType>[];
/**
* 内部保留方法
* 创建一个fakeNode,用于dnd插件拖动节点进画布的时候使用。
*/
createFakeNode(nodeConfig: NodeConfig): _Model.BaseNodeModel<PropertiesType> | null;
/**
* 内部保留方法
* 移除fakeNode
*/
removeFakeNode(): void;
/**
* 内部保留方法
* 用于fakeNode显示对齐线
*/
setNodeSnapLine(data: NodeData): void;
/**
* 内部保留方法
* 用于fakeNode移除对齐线
*/
removeNodeSnapLine(): void;
/*********************************************************
* Edge 相关方法
********************************************************/
/**
* 设置默认的边类型。
* 也就是设置在节点直接由用户手动绘制的连线类型。
* @param type LFOptions.EdgeType
*/
setDefaultEdgeType(type: LFOptions.EdgeType): void;
/**
* 给两个节点之间添加一条边
* @example
* lf.addEdge({
* type: 'polygon'
* sourceNodeId: 'node_id_1',
* targetNodeId: 'node_id_2',
* })
* @param {EdgeConfig} edgeConfig
*/
addEdge(edgeConfig: EdgeConfig): BaseEdgeModel;
/**
* 基于id获取边数据
* @param edgeId 边Id
* @returns EdgeData
*/
getEdgeDataById(edgeId: string): EdgeData | undefined;
/**
* 基于边Id获取边的model
* @param edgeId 边的Id
* @return model
*/
getEdgeModelById(edgeId: string): BaseEdgeModel | undefined;
/**
* 获取满足条件边的model
* @param edgeFilter 过滤条件
* @example
* 获取所有起点为节点 A 的边的 model
* lf.getEdgeModels({
* sourceNodeId: 'nodeA_id'
* })
* 获取所有终点为节点 B 的边的 model
* lf.getEdgeModels({
* targetNodeId: 'nodeB_id'
* })
* 获取起点为节点 A,终点为节点 B 的边
* lf.getEdgeModels({
* sourceNodeId: 'nodeA_id',
* targetNodeId: 'nodeB_id'
* })
* @return model数组
*/
getEdgeModels({ sourceNodeId, targetNodeId, }: {
sourceNodeId?: string;
targetNodeId?: string;
}): BaseEdgeModel[];
/**
* 修改边的id, 如果不传新的id,会内部自动创建一个。
* @param { string } edgeId 将要被修改的id
* @param { string } newId 可选,修改后的id
* @returns 修改后的节点id, 如果传入的oldId不存在,返回空字符串
*/
changeEdgeId(edgeId: string, newId?: string): string;
/**
* 切换边的类型
* @param edgeId 边Id
* @param type 边类型
*/
changeEdgeType(edgeId: string, type: LFOptions.EdgeType): void;
/**
* 删除边
* @param {string} edgeId 边Id
*/
deleteEdge(edgeId: string): boolean;
/**
* 基于给定节点(作为边起点或终点,可以只传其一),删除对应的边
* @param sourceNodeId 边的起点节点ID
* @param targetNodeId 边的终点节点ID
*/
deleteEdgeByNodeId({ sourceNodeId, targetNodeId, }: {
sourceNodeId?: string;
targetNodeId?: string;
}): void;
/**
* 获取节点连接的所有边的model
* @param nodeId 节点ID
* @returns model数组
*/
getNodeEdges(nodeId: string): BaseEdgeModel[];
/*********************************************************
* Element 相关方法
********************************************************/
/**
* 添加多个元素, 包括边和节点。
* @param nodes
* @param edges
* @param distance
*/
addElements({ nodes, edges }: GraphConfigData, distance?: number): GraphElements;
/**
* 将图形选中
* @param id 选择元素ID
* @param multiple 是否允许多选,如果为true,不会将上一个选中的元素重置
* @param toFront 是否将选中的元素置顶,默认为true
*/
selectElementById(id: string, multiple?: boolean, toFront?: boolean): void;
/**
* 移除选中的元素
* @param id 元素ID
*/
deselectElementById(id: string): void;
/**
* 获取选中的元素数据
* @param isIgnoreCheck 是否包括sourceNode和targetNode没有被选中的边,默认包括。
* 注意:复制的时候不能包括此类边, 因为复制的时候不允许悬空的边。
*/
getSelectElements(isIgnoreCheck?: boolean): GraphData;
/**
* 将所有选中的元素设置为非选中
*/
clearSelectElements(): void;
/**
* 获取节点或边对象
* @param id id
*/
getModelById(id: string): LogicFlow.GraphElement | undefined;
/**
* 获取节点或边的数据
* @param id id
*/
getDataById(id: string): NodeData | EdgeData | undefined;
/**
* 删除元素,在不确定当前id是节点还是边时使用
* @param id 元素id
*/
deleteElement(id: string): boolean;
/**
* 设置元素的zIndex.
* 注意:默认堆叠模式下,不建议使用此方法。
* @see todo link 堆叠模式
* @param id 元素id
* @param zIndex zIndex的值,可以传数字,也支持传入 'top' 和 'bottom'
*/
setElementZIndex(id: string, zIndex: number | 'top' | 'bottom'): void;
/**
* 获取指定区域内的所有元素,此区域必须是DOM层。
* 例如鼠标绘制选区后,获取选区内的所有元素。
* @see todo 分层
* @param leftTopPoint 区域左上角坐标, dom层坐标
* @param rightBottomPoint 区域右下角坐标,dom层坐标
* @param wholeEdge
* @param wholeNode
* @param ignoreHideElement
*/
getAreaElement(leftTopPoint: PointTuple, rightBottomPoint: PointTuple, wholeEdge?: boolean, wholeNode?: boolean, ignoreHideElement?: boolean): (EdgeData | NodeData)[];
/**
* 设置元素的自定义属性
* @see http://logicflow.cn/api/detail#setproperties
* @param id 元素的id
* @param properties 自定义属性
*/
setProperties(id: string, properties: PropertiesType): void;
/**
* 获取元素的自定义属性
* @param id 元素的id
* @returns 自定义属性
*/
getProperties(id: string): PropertiesType | undefined;
deleteProperty(id: string, key: string): void;
/**
* FBI WARNING !!! 慎用 === 不要用
* 修改对应元素 model 中的属性
* 注意:此方法慎用,除非您对logicflow内部有足够的了解。
* 大多数情况下,请使用setProperties、updateText、changeNodeId等方法。
* 例如直接使用此方法修改节点的id,那么就是会导致连接到此节点的边的sourceNodeId出现找不到的情况。
* @param {string} id 元素id
* @param {object} attributes 需要更新的属性
*/
updateAttributes(id: string, attributes: object): void;
/*********************************************************
* Text 相关方法
********************************************************/
/**
* 显示节点、连线文本编辑框
* @param id 元素id
*/
editText(id: string): void;
/**
* 更新节点或边的文案
* @param id 节点或者边id
* @param value 文案内容
*/
updateText(id: string, value: string): void;
/*********************************************************
* EditConfig 相关方法
********************************************************/
/**
* 更新流程图编辑相关设置
* @param {object} config 编辑配置
* @see http://logicflow.cn/api/detail#updateeditconfig
*/
updateEditConfig(config: Partial<IEditConfigType>): void;
/**
* 获取流程图当前编辑相关设置
* @see http://logicflow.cn/api/detail#geteditconfig
*/
getEditConfig(): _Model.IEditConfigType;
/*********************************************************
* Graph 相关方法
********************************************************/
/**
* 设置主题样式
* @param { object } style 自定义主题样式
* todo docs link
*/
setTheme(style: Partial<LogicFlow.Theme>, themeMode?: 'radius' | 'dark' | 'colorful' | 'default' | string): void;
/**
* 获取当前主题样式
* @see todo docs link
*/
getTheme(): LogicFlow.Theme;
private focusByElement;
private focusByCoordinate;
/**
* 定位到画布视口中心
* 支持用户传入图形当前的坐标或id,可以通过type来区分是节点还是边的id,也可以不传(兜底)
* @param focusOnArgs.id 如果传入的是id, 则画布视口中心移动到此id的元素中心点。
* @param focusOnArgs.coordinate 如果传入的是坐标,则画布视口中心移动到此坐标。
* TODO: 测试下面代码,重构了一下逻辑,重载 api 定义
*/
focusOn(id: string): void;
focusOn(coordinate: Position): void;
focusOn(focusOnArgs: LogicFlow.FocusOnArgsType): void;
/**
* 重新设置画布的宽高
* 不传会自动计算画布宽高
*/
resize(width?: number, height?: number): void;
/**
* 将某个元素放置到顶部。
* 如果堆叠模式为默认模式,则将原置顶元素重新恢复原有层级。
* 如果堆叠模式为递增模式,则将需指定元素zIndex设置为当前最大zIndex + 1。
* @see todo link 堆叠模式
* @param id 元素Id
*/
toFront(id: string): void;
/**
* 获取事件位置相对于画布左上角的坐标
* 画布所在的位置可以是页面任何地方,原生事件返回的坐标是相对于页面左上角的,该方法可以提供以画布左上角为原点的准确位置。
* @param {number} x
* @param {number} y
* @returns {object} Point 事件位置的坐标
* @returns {object} Point.domOverlayPosition HTML层上的坐标
* @returns {object} Point.canvasOverlayPosition SVG层上的坐标
*/
getPointByClient(x: number, y: number): ClientPosition;
getPointByClient(point: Position): ClientPosition;
/**
* 获取流程绘图数据
* 注意: getGraphData返回的数据受到adapter影响,所以其数据格式不一定是logicflow内部图数据格式。
* 如果实现通用插件,请使用getGraphRawData
*/
getGraphData(...params: any): GraphData | unknown;
/**
* 获取流程绘图原始数据
* 在存在adapter时,可以使用getGraphRawData获取图原始数据
*/
getGraphRawData(): GraphData;
/**
* 清空画布
*/
clearData(): void;
/*********************************************************
* LogicFlow Render方法
********************************************************/
renderRawData(graphRawData: GraphConfigData): void;
/**
* 渲染图
* @example
* lf.render({
* nodes: [
* {
* id: 'node_1',
* type: 'rect',
* x: 100,
* y: 100
* },
* {
* id: 'node_2',
* type: 'circle',
* x: 300,
* y: 200
* }
* ],
* edges: [
* {
* sourceNodeId: 'node_1',
* targetNodeId: 'node_2',
* type: 'polyline'
* }
* ]
* })
* @param graphData 图数据
*/
render(graphData: GraphConfigData): void;
/*********************************************************
* History/Resize 相关方法
********************************************************/
/**
* 历史记录操作
* 返回上一步
*/
undo(): void;
/**
* 历史记录操作
* 恢复下一步
*/
redo(): void;
/**
* 放大缩小图形
* @param zoomSize 放大缩小的值,支持传入0-n之间的数字。小于1表示缩小,大于1表示放大。也支持传入true和false按照内置的刻度放大缩小
* @param point 缩放的原点
* @returns {string} -放大缩小的比例
*/
zoom(zoomSize?: ZoomParamType, point?: PointTuple): string;
/**
* 重置图形的放大缩写比例为默认
*/
resetZoom(): void;
/**
* 设置图形缩小时,能缩放到的最小倍数。参数为0-1自己。默认0.2
* @param size 图形缩小的最小值
*/
setZoomMiniSize(size: number): void;
/**
* 设置图形放大时,能放大到的最大倍数,默认16
* @param size 图形放大的最大值
*/
setZoomMaxSize(size: number): void;
/**
* 获取缩放的值和平移的值。
*/
getTransform(): {
SCALE_X: number;
SCALE_Y: number;
TRANSLATE_X: number;
TRANSLATE_Y: number;
};
/**
* 平移图
* @param x 向x轴移动距离
* @param y 向y轴移动距离
*/
translate(x: number, y: number): void;
/**
* 还原图形为初始位置
*/
resetTranslate(): void;
/**
* 图形画布居中显示
*/
translateCenter(): void;
/**
* 图形适应屏幕大小
* @param verticalOffset number 距离盒子上下的距离, 默认为20
* @param horizontalOffset number 距离盒子左右的距离, 默认为20
*/
fitView(verticalOffset?: number, horizontalOffset?: number): void;
/**
* 开启边的动画
* @param edgeId string
*/
openEdgeAnimation(edgeId: string): void;
/**
* 关闭边的动画
* @param edgeId string
*/
closeEdgeAnimation(edgeId: string): void;
/*********************************************************
* 事件系统方法
********************************************************/
/**
* 监听事件
* 事件详情见 @see todo
* 支持同时监听多个事件
* @example
* lf.on('node:click,node:contextmenu', (data) => {
* });
*/
on<T extends keyof EventArgs>(evt: T, callback: EventCallback<T>): void;
on<T extends string>(evt: T, callback: EventCallback<T>): void;
/**
* 撤销监听事件
*/
off<T extends keyof EventArgs>(evt: T, callback: EventCallback<T>): void;
off<T extends string>(evt: T, callback: EventCallback<T>): void;
/**
* 监听事件,只监听一次
*/
once<T extends keyof EventArgs>(evt: T, callback: EventCallback<T>): void;
once<T extends string>(evt: T, callback: EventCallback<T>): void;
/**
* 触发监听事件
*/
emit<T extends keyof EventArgs>(evts: T, eventArgs: CallbackArgs<T>): void;
emit<T extends string>(evts: T, eventArgs: CallbackArgs<T>): void;
/*********************************************************
* 插件系统方法
********************************************************/
/**
* 添加扩展, 待讨论,这里是不是静态方法好一些?
* 重复添加插件的时候,把上一次添加的插件的销毁。
* @param extension
* @param props
*/
static use(extension: ExtensionConstructor | ExtensionDefinition, props?: Record<string, unknown>): void;
/**
* 添加主题模式
* @param themeMode 主题模式
* @param style 主题样式
*/
static addThemeMode(themeMode: string, style: Partial<LogicFlow.Theme>): void;
static removeThemeMode(themeMode: string): void;
static clearThemeMode(): void;
private installPlugins;
/**
* 加载插件-内部方法
*/
private installPlugin;
/** 销毁当前实例 */
destroy(): void;
}
export declare namespace LogicFlow {
/**
* LogicFlow init Options
*/
interface Options extends LFOptions.Common {
}
type DomAttributes = {
className?: string;
[key: string]: string | undefined;
};
interface PropertiesType {
width?: number;
height?: number;
rx?: number;
ry?: number;
style?: LogicFlow.CommonTheme;
textStyle?: LogicFlow.CommonTheme;
[key: string]: any;
}
type AttributesType = Record<string, any>;
type VectorData = {
deltaX: number;
deltaY: number;
};
type OffsetData = {
dx: number;
dy: number;
};
type Position = {
x: number;
y: number;
};
type Point = {
id?: string;
[key: string]: any;
} & Position;
type PointTuple = [number, number];
type ClientPosition = {
domOverlayPosition: Position;
canvasOverlayPosition: Position;
};
interface LineSegment {
start: Point;
end: Point;
}
type Direction = SegmentDirection;
type RadiusCircleInfo = {
r: number;
} & Position;
type Vector = {
id?: string;
x: number;
y: number;
z: 0;
[key: string]: any;
};
type RectSize = {
width: number;
height: number;
};
type TextConfig = {
value: string;
x: number;
y: number;
editable?: boolean;
draggable?: boolean;
};
type LabelConfig = {
id?: string;
type?: string;
x: number;
y: number;
content?: string;
value: string;
rotate?: number;
style?: h.JSX.CSSProperties;
editable?: boolean;
draggable?: boolean;
labelWidth?: number;
textOverflowMode?: 'ellipsis' | 'wrap' | 'clip' | 'nowrap' | 'default';
vertical?: boolean;
};
type LabelOption = {
isVertical: boolean;
isMultiple: boolean;
maxCount?: number;
};
interface LabelData extends LabelConfig {
id: string;
x: number;
y: number;
content: string;
value: string;
}
type AppendConfig = {
startIndex: number;
endIndex: number;
direction: Direction;
draggable?: boolean;
} & LineSegment;
type ArrowConfig = {
markerStart: string;
markerEnd: string;
};
type ArrowInfo = {
start: Point;
end: Point;
hover: boolean;
isSelected: boolean;
};
interface GraphConfigData {
nodes?: NodeConfig[];
edges?: EdgeConfig[];
}
interface GraphData {
nodes: NodeData[];
edges: EdgeData[];
}
interface FakeNodeConfig {
type: string;
text?: TextConfig | string;
properties?: PropertiesType;
[key: string]: unknown;
}
type OnDragNodeConfig = {
type: string;
text?: TextConfig | string;
properties?: Record<string, unknown>;
[key: string]: any;
};
interface NodeConfig<P extends PropertiesType = PropertiesType> {
id?: string;
type: string;
x: number;
y: number;
text?: TextConfig | string;
zIndex?: number;
properties?: P;
virtual?: boolean;
rotate?: number;
rotatable?: boolean;
resizable?: boolean;
[key: string]: any;
}
interface NodeData extends NodeConfig {
id: string;
text?: TextConfig;
[key: string]: unknown;
}
interface EdgeConfig<P extends PropertiesType = PropertiesType> {
id?: string;
type?: string;
sourceNodeId: string;
sourceAnchorId?: string;
targetNodeId: string;
targetAnchorId?: string;
startPoint?: Point;
endPoint?: Point;
text?: TextConfig | string;
pointsList?: Point[];
zIndex?: number;
properties?: P;
}
interface EdgeData extends EdgeConfig {
id: string;
type: string;
text?: TextConfig;
startPoint: Point;
endPoint: Point;
[key: string]: unknown;
}
interface MenuConfig {
text?: string;
className?: string;
icon?: boolean;
callback: (id: string | number) => void;
}
}
export declare namespace LogicFlow {
type NumberOrPercent = `${number}%` | number;
/**
* 颜色 - CSS 属性用颜色
* 如:#000000, rgba(0, 0, 0, 0), 如果是透明的,可以传 'none'
*/
type Color = string | 'none';
/**
* svg虚线
* 格式为逗号分割字符串,如
* @see https://developer.mozilla.org/zh-CN/docs/Web/SVG/Attribute/stroke-dasharray
*/
type DashArray = string;
type CommonTheme = {
fill?: Color;
stroke?: Color;
strokeWidth?: number;
/**
* 其他属性 - 我们会把你自定义的所有属性最终传递到 DOM 上
* 详情请参考 svg 属性规范:
* https://developer.mozilla.org/zh-CN/docs/Web/SVG/Attribute
* 注意: 请不要在主题中设置“形状属性”,例如:x、y、width、height、radius、r、rx、ry
* @see https://docs.logic-flow.cn/docs/#/zh/api/themeApi?id=%e5%bd%a2%e7%8a%b6%e5%b1%9e%e6%80%a7)
*/
radius?: number;
rx?: number;
ry?: number;
width?: number;
height?: number;
path?: string;
[key: string]: unknown;
};
type CommonThemePropTypes = CommonTheme[keyof CommonTheme];
type AppendAttributes = {
d: string;
fill: string;
stroke: Color;
strokeWidth: number;
strokeDasharray: DashArray;
};
type ContainerTheme = {
width?: string;
height?: string;
};
/**
* rect 节点主题
* svg基础图形-矩形
* https://developer.mozilla.org/zh-CN/docs/Web/SVG/Element/rect
*/
type RectTheme = CommonTheme;
/**
* circle 节点主题
* svg基础图形-圆形
* https://developer.mozilla.org/zh-CN/docs/Web/SVG/Element/circle
*/
type CircleTheme = CommonTheme;
/**
* polygon 节点主题
* svg基础图形-多边形
* https://developer.mozilla.org/zh-CN/docs/Web/SVG/Element/polygon
*/
type PolygonTheme = CommonTheme;
/**
* ellipse 节点主题
* svg基础图形-椭圆
* https://developer.mozilla.org/zh-CN/docs/Web/SVG/Element/ellipse
*/
type EllipseTheme = CommonTheme;
type AnchorTheme = {
r?: number;
hover?: {
r?: number;
} & CommonTheme;
} & CommonTheme;
type TextTheme = {
color?: Color;
fontSize: number;
textWidth?: number;
lineHeight?: number;
textAnchor?: 'start' | 'middle' | 'end';
dominantBaseline?: 'auto' | 'text-bottom' | 'alphabetic' | 'ideographic' | 'middle' | 'central' | 'mathematical' | 'hanging' | 'text-top';
} & CommonTheme;
type TextNodeTheme = {
background?: RectTheme;
} & TextTheme;
type NodeTextTheme = {
/**
* 文本超出指定宽度处理方式
* default: 不特殊处理,允许超出
* autoWrap: 超出自动换行
* ellipsis: 超出省略
*/
overflowMode?: 'default' | 'autoWrap' | 'ellipsis';
textWidth?: number;
background?: RectTheme;
/**
* 背景区域 padding
* wrapPadding: '5px,10px'
*/
wrapPadding?: string;
} & TextTheme;
type EdgeTextTheme = {
textWidth: number;
background?: {
/**
* 背景区域 padding
* wrapPadding: '5px,10px'
*/
wrapPadding?: string;
} & RectTheme;
hover?: EdgeTextTheme;
} & NodeTextTheme & TextTheme;
type EdgeTheme = CommonTheme;
type EdgeBezierTheme = {
adjustLine?: EdgeTheme;
adjustAnchor?: CircleTheme;
} & EdgeTheme;
type EdgePolylineTheme = EdgeTheme;
type EdgeAnimation = {
stroke?: Color;
strokeDasharray?: string;
strokeDashoffset?: NumberOrPercent;
animationName?: string;
animationDuration?: `${number}s` | `${number}ms`;
animationIterationCount?: 'infinite' | number;
animationTimingFunction?: string;
animationDirection?: string;
};
type OutlineTheme = {
hover?: CommonTheme;
} & CommonTheme & EdgeAnimation;
type ArrowTheme = {
/**
* 箭头长度.
* 以符号"->"为例, offset表示箭头大于号的宽度。
*/
offset: number;
/**
* 箭头垂直于边的距离
* 以符号"->"为例, verticalLength表示箭头大于号的高度
*/
refX?: number;
refY?: number;
verticalLength: number;
endArrowType?: 'solid' | 'hollow' | 'diamond' | 'circle' | 'none';
startArrowType?: 'solid' | 'hollow' | 'diamond' | 'circle' | 'none';
strokeLinecap?: 'butt' | 'round' | 'square';
strokeLinejoin?: 'miter' | 'round' | 'bevel';
} & CommonTheme;
type ArrowAttributesType = {
d: string;
} & ArrowTheme;
type AnchorLineTheme = EdgeTheme & EdgeAnimation;
interface Theme {
baseNode: CommonTheme;
baseEdge: EdgeTheme;
/**
* 基础图形节点相关主题
*/
rect: RectTheme;
circle: CircleTheme;
diamond: PolygonTheme;
ellipse: EllipseTheme;
polygon: PolygonTheme;
/**
* 基础图形线相关主题
*/
line: EdgeTheme;
polyline: EdgePolylineTheme;
bezier: EdgeBezierTheme;
anchorLine: AnchorLineTheme;
/**
* 文本内容相关主题
*/
text: TextNodeTheme;
nodeText: NodeTextTheme;
edgeText: EdgeTextTheme;
inputText?: CommonTheme;
/**
* 其他元素相关主题
*/
anchor: AnchorTheme;
arrow: ArrowTheme;
snapline: EdgeTheme;
rotateControl: CommonTheme;
resizeControl: CommonTheme;
resizeOutline: CommonTheme;
/**
* REMIND: 当开启了跳转边的起点和终点(adjustEdgeStartAndEnd:true)后
* 边的两端会出现调整按钮
* 边连段的调整点样式
*/
edgeAdjust: CircleTheme;
outline: OutlineTheme;
edgeAnimation: EdgeAnimation;
background?: boolean | Partial<LFOptions.BackgroundConfig>;
grid?: boolean | Partial<Grid.GridOptions>;
}
}
export declare namespace LogicFlow {
type FocusOnById = {
id: string;
coordinate?: never;
};
type FocusOnByCoordinate = {
id?: string;
coordinate: Position;
};
export type FocusOnArgsType = FocusOnById | FocusOnByCoordinate;
export type BaseNodeModelCtor = typeof BaseNodeModel<PropertiesType>;
export type BaseEdgeModelCtor = typeof BaseEdgeModel<PropertiesType>;
export type GraphElementCtor = BaseNodeModelCtor | BaseEdgeModelCtor;
export type GraphElement = BaseNodeModel | BaseEdgeModel;
export type GraphElements = {
nodes: BaseNodeModel[];
edges: BaseEdgeModel[];
};
export type RegisterConfig = {
type: string;
view: ComponentType<any> & {
isObserved?: boolean;
};
model: GraphElementCtor;
isObserverView?: boolean;
};
export type RegisterElement = {
view: any;
model: any;
};
export type RegisterParam = {
h: typeof h;
[key: string]: unknown;
};
export type RegisterElementFunc = (params: RegisterParam) => RegisterElement;
export interface LogicFlowConstructor {
new (options: LFOptions.Definition): LogicFlow;
}
/**
* Extension 插件类型
*/
export type ExtensionType = ExtensionConstructor | ExtensionDefinition;
export type ExtensionConfig = {
[pluginFlag]: symbol;
extension: ExtensionType;
props?: Record<string, any>;
};
export type IExtensionProps = {
lf: LogicFlow;
LogicFlow: LogicFlowConstructor;
props?: Record<string, unknown>;
options: Record<string, unknown>;
};
export interface ExtensionConstructor {
pluginName: string;
new (props: IExtensionProps): Extension;
}
export type ExtensionRenderFunc = (lf: LogicFlow, container: HTMLElement) => void;
export type ExtensionDefinition = {
pluginName: string;
install?: (lf: LogicFlow, LFCtor: LogicFlowConstructor) => void;
render?: ExtensionRenderFunc;
};
export interface Extension {
render: ExtensionRenderFunc;
destroy?: () => void;
}
export {};
}
export declare namespace LogicFlow {
const toStringTag: string;
}
export default LogicFlow;