UNPKG

gg-editor

Version:

A visual graph editor based on G6 and React

88 lines (68 loc) 2.08 kB
import { isFlow, isMind, getFlowRecallEdges, getMindRecallEdges, executeBatch } from '@/utils'; import { ItemState } from '@/common/constants'; import { TreeGraph, Node, Edge, Behavior, GraphEvent } from '@/common/interfaces'; import behaviorManager from '@/common/behaviorManager'; interface RecallEdgeBehavior extends Behavior { /** 当前高亮边线 Id */ edgeIds: string[]; /** 设置高亮状态 */ setHighLightState(edges: Edge[]): void; /** 清除高亮状态 */ clearHighLightState(): void; /** 处理节点点击 */ handleNodeClick(e: GraphEvent): void; /** 处理边线点击 */ handleEdgeClick(e: GraphEvent): void; /** 处理画布点击 */ handleCanvasClick(e: GraphEvent): void; } const recallEdgeBehavior: RecallEdgeBehavior = { edgeIds: [], getEvents() { return { 'node:click': 'handleNodeClick', 'edge:click': 'handleEdgeClick', 'canvas:click': 'handleCanvasClick', }; }, setHighLightState(edges: Edge[]) { const { graph } = this; this.clearHighLightState(); executeBatch(graph, () => { edges.forEach(item => { graph.setItemState(item, ItemState.HighLight, true); }); }); this.edgeIds = edges.map(edge => edge.get('id')); }, clearHighLightState() { const { graph } = this; executeBatch(graph, () => { this.edgeIds.forEach(id => { const item = graph.findById(id); if (item && !item.destroyed) { graph.setItemState(item, ItemState.HighLight, false); } }); }); this.edgeIds = []; }, handleNodeClick({ item }) { const { graph } = this; let edges: Edge[] = []; if (isFlow(graph)) { edges = getFlowRecallEdges(graph, item as Node); } if (isMind(graph)) { edges = getMindRecallEdges(graph as TreeGraph, item as Node); } this.setHighLightState(edges); }, handleEdgeClick() { this.clearHighLightState(); }, handleCanvasClick() { this.clearHighLightState(); }, }; behaviorManager.register('recall-edge', recallEdgeBehavior);