@logicflow/core
Version:
LogicFlow, help you quickly create flowcharts
644 lines (624 loc) • 14.1 kB
text/typescript
import LogicFlow, {
BaseNodeModel,
BaseEdgeModel,
Model,
GraphModel,
TransformData,
TransformType,
} from '..'
import NodeData = LogicFlow.NodeData
import EdgeData = LogicFlow.EdgeData
import GraphData = LogicFlow.GraphData
import AnchorConfig = Model.AnchorConfig
import ClientPosition = LogicFlow.ClientPosition
type ClickEventArgs = {
/**
* 点击后节点是否处于选中状态
*/
isSelected: boolean
/**
* 是否为多选状态
*/
isMultiple: boolean
}
type NodeEventArgsPick<
T extends
| 'preData'
| 'data'
| 'model'
| 'e'
| 'position'
| 'deltaX'
| 'deltaY'
| 'index',
> = Pick<
{
/**
* 上一个状态的节点数据
*/
preData: NodeData
/**
* 节点数据
*/
data: NodeData
/**
* 节点 model
*/
model: BaseNodeModel
/**
* 原生鼠标事件对象
*/
e: MouseEvent
/**
* 鼠标触发点相对于画布左上角的坐标
*/
position: ClientPosition
/**
* 鼠标 X轴移动的距离
*/
deltaX: number
/**
* 鼠标Y轴移动的距离
*/
deltaY: number
/**
* Resize 时调整的是哪个控制点
*/
index: number
},
T
>
type TextEventArgsPick<
T extends 'data' | 'e' | 'model' | 'element' | 'position',
> = Pick<
{
// 节点数据
data?: any
// 原生鼠标事件对象
e?: MouseEvent | FocusEvent
// 文本所在元素model
model?: BaseNodeModel | BaseEdgeModel | unknown
// 文本dom
element?: HTMLElement | null
// 文本位置
position?: {
x: number
y: number
}
},
T
>
/**
* 节点事件
*/
interface NodeEventArgs {
/**
* 单击节点
*/
'node:click': NodeEventArgsPick<'data' | 'e' | 'position'> & ClickEventArgs
/**
* 双击节点
*/
'node:dbclick': NodeEventArgsPick<'data' | 'e' | 'position'>
/**
* 鼠标按下节点
*/
'node:mousedown': NodeEventArgsPick<'data' | 'e'>
/**
* 鼠标抬起节点
*/
'node:mouseup': NodeEventArgsPick<'data' | 'e'>
/**
* 鼠标移动节点
*/
'node:mousemove': NodeEventArgsPick<'data' | 'e' | 'deltaX' | 'deltaY'>
/**
* 鼠标进入节点
*/
'node:mouseenter': NodeEventArgsPick<'data' | 'e'>
/**
* 鼠标离开节点
*/
'node:mouseleave': NodeEventArgsPick<'data' | 'e'>
/**
* 添加节点
*/
'node:add': NodeEventArgsPick<'data'>
/**
* 删除节点
*/
'node:delete': NodeEventArgsPick<'data' | 'model'>
/**
* 添加外部拖入节点
*/
'node:dnd-add': NodeEventArgsPick<'data'>
/**
* 拖拽外部拖入节点
*/
'node:dnd-drag': NodeEventArgsPick<'data' | 'e'>
/**
* 开始拖拽节点
*/
'node:dragstart': NodeEventArgsPick<'data' | 'e'>
/**
* 拖拽节点
*/
'node:drag': NodeEventArgsPick<'data' | 'e' | 'deltaX' | 'deltaY'>
/**
* 拖拽节点结束
*/
'node:drop': NodeEventArgsPick<'data' | 'e'>
/**
* 右键点击节点
*/
'node:contextmenu': NodeEventArgsPick<'data' | 'e' | 'position'>
/**
* 节点旋转
*/
'node:rotate': NodeEventArgsPick<'data' | 'e' | 'model'>
/**
* 节点缩放
*/
'node:resize': NodeEventArgsPick<
'preData' | 'data' | 'model' | 'deltaX' | 'deltaY' | 'index'
>
/**
* 元素的 properties 发生改变
*/
'node:properties-change': {
/**
* 元素的 id
*/
id: string
/**
* 改变的 properties 的 key
*/
keys: string[]
/**
* 改变前的 properties
*/
preProperties: Record<string, any>
/**
* 改变后的 properties
*/
properties: Record<string, any>
}
/**
* 节点获焦
*/
'node:focus': NodeEventArgsPick<'data'>
/**
* 节点失焦
*/
'node:blur': NodeEventArgsPick<'data'>
}
type EdgeEventArgsPick<T extends 'data' | 'e' | 'position'> = Pick<
{
/**
* 边数据
*/
data: EdgeData
/**
* 原生鼠标事件对象
*/
e: MouseEvent
/**
* 鼠标触发点相对于画布左上角的坐标
*/
position: ClientPosition
},
T
>
/**
* 边事件
*/
interface EdgeEventArgs {
/**
* 单击边
*/
'edge:click': EdgeEventArgsPick<'data' | 'e' | 'position'>
/**
* 双击边
*/
'edge:dbclick': EdgeEventArgsPick<'data' | 'e' | 'position'>
/**
* 鼠标进入边
*/
'edge:mouseenter': EdgeEventArgsPick<'data' | 'e'>
/**
* 鼠标离开边
*/
'edge:mouseleave': EdgeEventArgsPick<'data' | 'e'>
/**
* 添加边
*/
'edge:add': EdgeEventArgsPick<'data'>
/**
* 删除边
*/
'edge:delete': EdgeEventArgsPick<'data'>
/**
* 右键点击边
*/
'edge:contextmenu': EdgeEventArgsPick<'data' | 'e' | 'position'>
/**
* 拖拽调整边
*/
'edge:adjust': EdgeEventArgsPick<'data'>
/**
* 调整边的起点/终点
*/
'edge:exchange-node': {
data: {
/**
* 新的边的数据
*/
newEdge: EdgeData
/**
* 旧的边的数据
*/
oldEdge: EdgeData
}
}
/**
* 边获焦
*/
'edge:focus': EdgeEventArgsPick<'data'>
/**
* 边失焦
*/
'edge:blur': EdgeEventArgsPick<'data'>
}
/**
* 文本事件
*/
interface TextEventArgs {
// 鼠标按下文本
'text:mousedown': TextEventArgsPick<'data' | 'e' | 'model'>
// 开始拖拽文本
'text:dragstart': TextEventArgsPick<'data' | 'e' | 'model'>
// 文本拖拽
'text:drag': TextEventArgsPick<'data' | 'e' | 'model'>
// 文本拖拽结束
'text:drop': TextEventArgsPick<'data' | 'e' | 'model'>
// 文本单击
'text:click': TextEventArgsPick<'data' | 'e' | 'model'>
// 文本双击
'text:dbclick': TextEventArgsPick<'data' | 'e' | 'model'>
// 文本失焦
'text:blur': TextEventArgsPick<'data' | 'e' | 'model' | 'element'>
// 鼠标移动文本
'text:mousemove': TextEventArgsPick<'data' | 'e' | 'model'>
// 鼠标抬起
'text:mouseup': TextEventArgsPick<'data' | 'e' | 'model'>
// 文本获焦
'text:focus': TextEventArgsPick<'data' | 'e' | 'model' | 'element'>
// 文本新增
'text:add': TextEventArgsPick<'data' | 'e' | 'model'>
// 文本更新
'text:update': TextEventArgsPick<'data' | 'e' | 'model'>
// 文本清空
'text:clear': TextEventArgsPick<'data' | 'e' | 'model'>
// 文本删除
'text:delete': TextEventArgsPick<'data' | 'e' | 'model'>
// 不允许增加文本
'text:not-allowed-add': TextEventArgsPick<'data' | 'e' | 'model'>
}
/**
* label插件文本事件
*/
interface TextEventArgs {
// 鼠标按下文本
'label:mousedown': TextEventArgsPick<'data' | 'e' | 'model'>
// 开始拖拽文本
'label:dragstart': TextEventArgsPick<'data' | 'e' | 'model'>
// 文本拖拽
'label:drag': TextEventArgsPick<'data' | 'e' | 'model'>
// 文本拖拽结束
'label:drop': TextEventArgsPick<'data' | 'e' | 'model'>
// 文本单击
'label:click': TextEventArgsPick<'data' | 'e' | 'model'>
// 文本双击
'label:dbclick': TextEventArgsPick<'data' | 'e' | 'model'>
// 文本失焦
'label:blur': TextEventArgsPick<'data' | 'e' | 'model' | 'element'>
// 鼠标移动文本
'label:mousemove': TextEventArgsPick<'data' | 'e' | 'model'>
// 鼠标抬起
'label:mouseup': TextEventArgsPick<'data' | 'e' | 'model'>
// 文本获焦
'label:focus': TextEventArgsPick<'data' | 'e' | 'model' | 'element'>
// 文本新增
'label:add': TextEventArgsPick<'data' | 'e' | 'model'>
// 文本更新
'label:update': TextEventArgsPick<'data' | 'e' | 'model'>
// 文本清空
'label:clear': TextEventArgsPick<'data' | 'e' | 'model'>
// 文本删除
'label:delete': TextEventArgsPick<'data' | 'e' | 'model'>
// 文本新增
'label:should-add': TextEventArgsPick<'data' | 'e' | 'model' | 'position'>
// 文本批量新增
'label:batch-add': TextEventArgsPick<'data' | 'e' | 'model'>
// 文本更新
'label:should-update': TextEventArgsPick<'data' | 'e' | 'model'>
// 文本删除
'label:should-delete': TextEventArgsPick<'data' | 'e' | 'model'>
// 文本批量删除
'label:batch-delete': TextEventArgsPick<'data' | 'e' | 'model'>
// 不允许增加文本
'label:not-allowed-add': TextEventArgsPick<'data' | 'e' | 'model'>
}
/**
* 连线事件
*/
interface ConnectionEventArgs {
'connection:not-allowed': {
/**
* 目标节点数据
*/
data: NodeData
/**
* 校验信息
*/
msg?: string
}
}
/**
* 公共事件
*/
interface CommonEventArgs {
'element:click': {
/**
* 点击元素的数据(节点/边)
*/
data: NodeData | EdgeData
/**
* 原生鼠标事件对象
*/
e: MouseEvent
/**
* 鼠标触发点相对于画布左上角的坐标
*/
position: ClientPosition
}
/**
* 进行画布平移或缩放等变化操作时触发
*/
'graph:transform': {
/**
* 变换操作类型
*/
type: TransformType
/**
* 变换操作后的数据
*/
transform: TransformData
}
/**
* 画布渲染数据后触发,即 `lf.render()` 方法被调用后触发。
*/
'graph:rendered': {
/**
* 渲染后的画布数据
*/
data: GraphData
/**
* 渲染后的画布 model
*/
graphModel: GraphModel
}
/**
* 画布重新更新后触发. 即 lf.render(graphData)方法被调用后或者改变画布(graphModel)上的属性后触发。
* 如果是主动修改某个特定属性导致画布更新,想要在画布更新后做一些操作,建议注册事件后在回调函数中及时注销该事件,或者使用once事件代替on事件。
* 因为其他属性也可能导致画布更新,触发该事件。
*/
'graph:updated': {
/**
* 更新后的画布数据
*/
data: GraphData
}
/**
* 画布容器大小发生变化触发,为了性能考虑对事件做了防抖处理,间隔为16ms
*/
'graph:resize': {
/**
* 更新后的画布数据
*/
target: HTMLElement
contentRect: DOMRectReadOnly
}
}
type AnchorEventArgsPick<T extends 'data' | 'e' | 'nodeModel' | 'edgeModel'> =
Pick<
{
/**
* 锚点数据
*/
data: AnchorConfig
/**
* 原生鼠标事件对象
*/
e: MouseEvent
/**
* 锚点所属节点的数据
*/
nodeModel: BaseNodeModel
/**
* 通过拖动锚点连线添加的边的数据
*/
edgeModel?: BaseEdgeModel
},
T
>
/**
* 锚点事件
*/
interface AnchorEventArgs {
/**
* anchor 锚点 click
*/
'anchor:click': AnchorEventArgsPick<'data' | 'e' | 'nodeModel'>
/**
* anchor 锚点 mousedown
*/
'anchor:mousedown': AnchorEventArgsPick<'data' | 'e' | 'nodeModel'>
/**
* 开始拖拽锚点
*/
'anchor:dragstart': AnchorEventArgsPick<'data' | 'e' | 'nodeModel'>
/**
* 拖拽锚点
*/
'anchor:drag': AnchorEventArgsPick<'data' | 'e' | 'nodeModel'>
/**
* 拖拽锚点结束,并成功添加边。
* 只有在创建连线成功时才触发。用于区分手动创建的连线和自动创建的连线 `edge:add`
*/
'anchor:drop': AnchorEventArgsPick<'data' | 'e' | 'nodeModel' | 'edgeModel'>
/**
* 拖拽锚点结束,不管是否成功添加边都会触发
*/
'anchor:dragend': AnchorEventArgsPick<
'data' | 'e' | 'nodeModel' | 'edgeModel'
>
}
type BlankEventArgsPick<T extends 'e' | 'position'> = Pick<
{
/**
* 原生鼠标事件对象
*/
e: MouseEvent
/**
* 鼠标触发点相对于画布左上角的坐标
*/
position: ClientPosition
},
T
>
/**
* 画布事件
*/
interface BlankEventArgs {
/**
* 鼠标按下画布
*/
'blank:mousedown': BlankEventArgsPick<'e'>
/**
* 鼠标抬起画布
*/
'blank:mouseup': BlankEventArgsPick<'e'>
/**
* 鼠标移动画布
*/
'blank:mousemove': BlankEventArgsPick<'e'>
/**
* 单击画布
*/
'blank:click': BlankEventArgsPick<'e'>
/**
* 右键点击画布
*/
'blank:contextmenu': BlankEventArgsPick<'e' | 'position'>
/**
* 开始拖拽画布
*/
'blank:dragstart': BlankEventArgsPick<'e'>
/**
* 拖拽画布
*/
'blank:drag': BlankEventArgsPick<'e'>
/**
* 拖拽画布结束
*/
'blank:drop': BlankEventArgsPick<'e'>
}
interface HistoryEventArgs {
/**
* 历史记录变化
*/
'history:change': {
/**
* 历史数据
*/
data: {
/**
* 可撤销的 graph 快照
*/
undos: GraphData[]
/**
* 可重做的 graph 快照
*/
redos: GraphData[]
/**
* 是否可以撤销
*/
undoAble: boolean
/**
* 是否可以重做
*/
redoAble: boolean
}
}
}
type SelectionEventArgsPick<T extends 'data' | 'e' | 'position'> = Pick<
{
/**
* 选中元素的数据(节点/边)
*/
data: GraphData
/**
* 原生鼠标事件对象
*/
e: MouseEvent
/**
* 鼠标触发点相对于画布左上角的坐标
*/
position: ClientPosition
},
T
>
/**
* 选区事件
*/
interface SelectionEventArgs {
/**
* 鼠标按下选区
*/
'selection:mousedown': SelectionEventArgsPick<'e'>
/**
* 开始拖拽选区
*/
'selection:dragstart': SelectionEventArgsPick<'e'>
/**
* 拖拽选区
*/
'selection:drag': SelectionEventArgsPick<'e'>
/**
* 拖拽选区结束
*/
'selection:drop': SelectionEventArgsPick<'e'>
/**
* 鼠标移动选区
*/
'selection:mousemove': SelectionEventArgsPick<'e' | 'position'>
/**
* 鼠标抬起选区
*/
'selection:mouseup': SelectionEventArgsPick<'e'>
/**
* 右键点击选区
*/
'selection:contextmenu': SelectionEventArgsPick<'data' | 'e' | 'position'>
}
// 此处主要是对事件参数进行聚合
export type EventArgs = NodeEventArgs &
EdgeEventArgs &
ConnectionEventArgs &
CommonEventArgs &
AnchorEventArgs &
BlankEventArgs &
HistoryEventArgs &
SelectionEventArgs &
TextEventArgs