UNPKG

ingenious-flow-designer

Version:

[演示地址](http://antd-vben5-pro.madong.tech/)

180 lines (162 loc) 4.87 kB
import { GraphModel, h, DiamondNode, DiamondNodeModel } from "@logicflow/core"; import { ColorEnum, NodeStateEnum } from "../types/enums"; class DecisionModel extends DiamondNodeModel { constructor(data: any, graphModel: GraphModel) { super(data, graphModel); } setAttributes(): void { this.text.value = ""; this.text.draggable = false; this.text.editable = false; const baseSize = 48; if (this.properties._width) { this.rx = this.properties._width / 2; this.ry = this.properties._width / 2; } else if (this.properties._height) { this.rx = this.properties._height / 2; this.ry = this.properties._height / 2; } else { this.rx = baseSize / 2; this.ry = baseSize / 2; } if (this.properties._stroke) { this.properties.stroke = this.properties._stroke; } if (this.properties._fill) { this.properties.fill = this.properties._fill; } if (this.properties._strokeWidth) { this.properties.strokeWidth = this.properties._strokeWidth; } if (this.properties._opacity) { this.properties.opacity = this.properties._opacity; } if (!this.properties.conditions) { this.properties.conditions = [ { id: `cond_${Date.now()}_1`, name: "条件1", expression: "condition1 == true", targetNode: "" }, { id: `cond_${Date.now()}_2`, name: "条件2", expression: "condition2 == true", targetNode: "" } ]; } } getNodeStyle() { const style = super.getNodeStyle(); const state = this.properties.state; if(state === NodeStateEnum.history) { style.stroke = ColorEnum.historyColor; style.fill = `${ColorEnum.historyColor}10`; } else if(state === NodeStateEnum.active) { style.stroke = ColorEnum.activeColor; style.fill = `${ColorEnum.activeColor}10`; } else if(state === NodeStateEnum.error) { style.stroke = ColorEnum.errorColor; style.fill = `${ColorEnum.errorColor}10`; } else { style.stroke = '#e6a23c'; style.fill = '#fdf6ec'; } if (this.properties._stroke) { style.stroke = this.properties._stroke; } if (this.properties._fill) { style.fill = this.properties._fill; } if (this.properties._strokeWidth) { style.strokeWidth = this.properties._strokeWidth; } if (this.properties._opacity !== undefined) { style.opacity = this.properties._opacity; } return style; } addCondition(condition: any) { if (!this.properties.conditions) { this.properties.conditions = []; } this.properties.conditions.push({ id: `cond_${Date.now()}`, ...condition }); this.setProperties(this.properties); } removeCondition(conditionId: string) { if (this.properties.conditions) { this.properties.conditions = this.properties.conditions.filter( (cond: any) => cond.id !== conditionId ); this.setProperties(this.properties); } } updateCondition(conditionId: string, updates: any) { if (this.properties.conditions) { const index = this.properties.conditions.findIndex( (cond: any) => cond.id === conditionId ); if (index > -1) { this.properties.conditions[index] = { ...this.properties.conditions[index], ...updates }; this.setProperties(this.properties); } } } } class DecisionView extends DiamondNode { private getDecisionIcon() { const { model } = this.props; const { x, y } = model; const style = model.getNodeStyle(); const iconSize = 16; const halfSize = iconSize / 2; return h("g", {}, [ h("line", { x1: x - halfSize, y1: y - halfSize, x2: x + halfSize, y2: y + halfSize, stroke: style.stroke, strokeWidth: 2, strokeLinecap: "round" }), h("line", { x1: x + halfSize, y1: y - halfSize, x2: x - halfSize, y2: y + halfSize, stroke: style.stroke, strokeWidth: 2, strokeLinecap: "round" }) ]); } getResizeShape() { const { model } = this.props; const { x, y, width, height } = model; const style = model.getNodeStyle(); return h("g", {}, [ h("path", { ...style, d: `M ${x} ${y - height/2} L ${x + width/2} ${y} L ${x} ${y + height/2} L ${x - width/2} ${y} Z` }), this.getDecisionIcon() ]); } getShape() { return this.getResizeShape(); } } export default { type: "decision", view: DecisionView, model: DecisionModel, };