Skip to content

Commit d3d45ef

Browse files
DymoneLewisliuziqiboyongjiong
authored
fix(core): 修复issue反馈的问题 (#1972)
* 修复初始化画布时因为节点吸附网格导致的节点与边错位问题 close #1954 * line 和 polyline 增加getPath方法 close #1929 * 增加节点和边的focus和blur事件上报 close #1917 * 节点和边focus和blur事件逻辑优化:处理浏览器默认focus样式问题&增加类型声明 * 修复polyline points内容变化导致的无法解析问题 & 优化初始化边对齐相关逻辑 * line getPath返回数据格式优化 --------- Co-authored-by: liuziqi <[email protected]> Co-authored-by: 你说呢? <[email protected]>
1 parent a29f216 commit d3d45ef

File tree

11 files changed

+129
-6
lines changed

11 files changed

+129
-6
lines changed

packages/core/src/algorithm/outline.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ export const getEdgeOutline = (
6666
edge: BaseEdgeModel,
6767
): OutlineInfo | undefined => {
6868
if (edge.modelType === ModelType.LINE_EDGE) {
69-
return getLineOutline(edge)
69+
return getLineOutline(edge as LineEdgeModel)
7070
}
7171
if (edge.modelType === ModelType.POLYLINE_EDGE) {
7272
return getPolylineOutline(edge as PolylineEdgeModel)

packages/core/src/constant/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ export enum EventType {
5757
NODE_CONTEXTMENU = 'node:contextmenu',
5858
NODE_ROTATE = 'node:rotate',
5959
NODE_RESIZE = 'node:resize',
60+
NODE_FOCUS = 'node:focus',
61+
NODE_BLUR = 'node:blur',
6062

6163
// 节点 properties 变化事件
6264
NODE_PROPERTIES_CHANGE = 'node:properties-change',
@@ -67,6 +69,8 @@ export enum EventType {
6769
EDGE_DELETE = 'edge:delete',
6870
EDGE_CLICK = 'edge:click',
6971
EDGE_DBCLICK = 'edge:dbclick',
72+
EDGE_FOCUS = 'edge:focus',
73+
EDGE_BLUR = 'edge:blur',
7074

7175
EDGE_MOUSEENTER = 'edge:mouseenter',
7276
EDGE_MOUSELEAVE = 'edge:mouseleave',

packages/core/src/event/eventArgs.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,14 @@ interface NodeEventArgs {
188188
*/
189189
properties: Record<string, any>
190190
}
191+
/**
192+
* 节点获焦
193+
*/
194+
'node:focus': NodeEventArgsPick<'data'>
195+
/**
196+
* 节点失焦
197+
*/
198+
'node:blur': NodeEventArgsPick<'data'>
191199
}
192200

193201
type EdgeEventArgsPick<T extends 'data' | 'e' | 'position'> = Pick<
@@ -259,6 +267,14 @@ interface EdgeEventArgs {
259267
oldEdge: EdgeData
260268
}
261269
}
270+
/**
271+
* 边获焦
272+
*/
273+
'edge:focus': EdgeEventArgsPick<'data'>
274+
/**
275+
* 边失焦
276+
*/
277+
'edge:blur': EdgeEventArgsPick<'data'>
262278
}
263279

264280
/**

packages/core/src/model/GraphModel.ts

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { find, forEach, map, merge, isBoolean, debounce } from 'lodash-es'
1+
import { find, forEach, map, merge, isBoolean, debounce, isEqual } from 'lodash-es'
22
import { action, computed, observable } from 'mobx'
33
import {
44
BaseEdgeModel,
@@ -41,6 +41,7 @@ import Position = LogicFlow.Position
4141
import PointTuple = LogicFlow.PointTuple
4242
import GraphData = LogicFlow.GraphData
4343
import NodeConfig = LogicFlow.NodeConfig
44+
import AnchorConfig = Model.AnchorConfig
4445
import BaseNodeModelCtor = LogicFlow.BaseNodeModelCtor
4546
import BaseEdgeModelCtor = LogicFlow.BaseEdgeModelCtor
4647

@@ -462,6 +463,58 @@ export class GraphModel {
462463
throw new Error(`找不到${edge.type}对应的边。`)
463464
}
464465
const edgeModel = new Model(edge, this)
466+
// 根据edgeModel中存储的数据找到当前画布上的起终锚点坐标
467+
// 判断当前起终锚点数据和Model中存储的起终点数据是否一致,不一致更新起终点信息
468+
const {
469+
sourceNodeId,
470+
targetNodeId,
471+
sourceAnchorId = '',
472+
targetAnchorId = '',
473+
startPoint,
474+
endPoint,
475+
text,
476+
textPosition,
477+
} = edgeModel
478+
const updateAnchorPoint = (
479+
node: BaseNodeModel | undefined,
480+
anchorId: string,
481+
point: Position,
482+
updatePoint: (anchor: AnchorConfig) => void,
483+
) => {
484+
const anchor = node?.anchors.find((anchor) => anchor.id === anchorId)
485+
if (anchor && !isEqual(anchor, point)) {
486+
updatePoint(anchor)
487+
}
488+
}
489+
490+
const sourceNode = this.getNodeModelById(sourceNodeId)
491+
const targetNode = this.getNodeModelById(targetNodeId)
492+
493+
updateAnchorPoint(
494+
sourceNode,
495+
sourceAnchorId,
496+
startPoint,
497+
edgeModel.updateStartPoint.bind(edgeModel),
498+
)
499+
updateAnchorPoint(
500+
targetNode,
501+
targetAnchorId,
502+
endPoint,
503+
edgeModel.updateEndPoint.bind(edgeModel),
504+
)
505+
506+
// 而文本需要先算一下文本与默认文本位置之间的相对位置差
507+
// 再计算新路径的文本默认位置,加上相对位置差,得到调整后边的文本的位置
508+
if (text) {
509+
const { x, y } = text
510+
const { x: defaultX, y: defaultY } = textPosition
511+
if (x && y && defaultX && defaultY) {
512+
const deltaX = x - defaultX
513+
const deltaY = y - defaultY
514+
edgeModel.resetTextPosition()
515+
edgeModel.moveText(deltaX, deltaY)
516+
}
517+
}
465518
this.edgeModelMap.set(edgeModel.id, edgeModel)
466519
this.elementsModelMap.set(edgeModel.id, edgeModel)
467520

packages/core/src/model/edge/LineEdgeModel.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,14 @@ export class LineEdgeModel extends BaseEdgeModel {
1717
...cloneDeep(customStyle),
1818
}
1919
}
20+
initEdgeData(data: LogicFlow.EdgeConfig): void {
21+
super.initEdgeData(data)
22+
this.points = this.getPath([this.startPoint, this.endPoint])
23+
}
24+
getPath(points: Point[]): string {
25+
const [start, end] = points
26+
return `${start.x},${start.y} ${end.x},${end.y}`
27+
}
2028
getTextPosition(): Point {
2129
return {
2230
x: (this.startPoint.x + this.endPoint.x) / 2,

packages/core/src/model/edge/PolylineEdgeModel.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -326,12 +326,14 @@ export class PolylineEdgeModel extends BaseEdgeModel {
326326
})
327327
}
328328

329+
getPath(points: Point[]): string {
330+
return points.map((point) => `${point.x},${point.y}`).join(' ')
331+
}
332+
329333
@action
330334
initPoints() {
331335
if (this.pointsList.length > 0) {
332-
this.points = this.pointsList
333-
.map((point) => `${point.x},${point.y}`)
334-
.join(' ')
336+
this.points = this.getPath(this.pointsList)
335337
} else {
336338
this.updatePoints()
337339
}

packages/core/src/style/index.less

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,11 @@
1919
cursor: move;
2020
}
2121

22+
// 在元素focus时浏览器会给元素outline设置一个5像素宽的默认样式,这里先全局禁用一下,后续再根据需要再做调整
23+
*:focus {
24+
outline: none;
25+
}
26+
2227
.lf-node-anchor {
2328
cursor: crosshair;
2429
}

packages/core/src/style/raw.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ export const content = `.lf-graph {
2121
.lf-text-draggable {
2222
cursor: move;
2323
}
24+
*:focus {
25+
outline: none;
26+
}
2427
.lf-node-anchor {
2528
cursor: crosshair;
2629
}

packages/core/src/view/edge/BaseEdge.tsx

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,20 @@ export abstract class BaseEdge<P extends IProps> extends Component<
459459
this.toFront()
460460
}
461461

462+
handleFocus = () => {
463+
const { model, graphModel } = this.props
464+
graphModel.eventCenter.emit(EventType.EDGE_FOCUS, {
465+
data: model.getData(),
466+
})
467+
}
468+
469+
handleBlur = () => {
470+
const { model, graphModel } = this.props
471+
graphModel.eventCenter.emit(EventType.EDGE_BLUR, {
472+
data: model.getData(),
473+
})
474+
}
475+
462476
/**
463477
* @overridable 支持重写, 此方法为获取边的形状,如果需要自定义边的形状,请重写此方法。
464478
* @example https://docs.logic-flow.cn/docs/#/zh/guide/basic/edge?id=%e5%9f%ba%e4%ba%8e-react-%e7%bb%84%e4%bb%b6%e8%87%aa%e5%ae%9a%e4%b9%89%e8%be%b9
@@ -499,6 +513,8 @@ export abstract class BaseEdge<P extends IProps> extends Component<
499513
onMouseOver={this.setHoverOn}
500514
onMouseEnter={this.setHoverOn}
501515
onMouseLeave={this.setHoverOff}
516+
onFocus={this.handleFocus}
517+
onBlur={this.handleBlur}
502518
>
503519
{this.getShape()}
504520
{this.getAppend()}

packages/core/src/view/node/BaseNode.tsx

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,20 @@ export abstract class BaseNode<P extends IProps = IProps> extends Component<
424424
}
425425
}
426426

427+
handleFocus = () => {
428+
const { model, graphModel } = this.props
429+
graphModel.eventCenter.emit(EventType.NODE_FOCUS, {
430+
data: model.getData(),
431+
})
432+
}
433+
434+
handleBlur = () => {
435+
const { model, graphModel } = this.props
436+
graphModel.eventCenter.emit(EventType.NODE_BLUR, {
437+
data: model.getData(),
438+
})
439+
}
440+
427441
// 因为自定义节点的时候,可能会基于hover状态自定义不同的样式。
428442
setHoverOn = (ev: MouseEvent) => {
429443
const { model, graphModel } = this.props
@@ -508,6 +522,8 @@ export abstract class BaseNode<P extends IProps = IProps> extends Component<
508522
onMouseLeave={this.setHoverOff}
509523
onMouseOut={this.onMouseOut}
510524
onContextMenu={this.handleContextMenu}
525+
onFocus={this.handleFocus}
526+
onBlur={this.handleBlur}
511527
{...restAttributes}
512528
>
513529
{nodeShapeInner}

packages/core/src/view/overlay/OutlineOverlay.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ export class OutlineOverlay extends Component<IProps> {
8282
(hoverOutline && edge.isHovered)
8383
) {
8484
if (edge.modelType === ModelType.LINE_EDGE) {
85-
edgeOutline.push(this.getLineOutline(edge))
85+
edgeOutline.push(this.getLineOutline(edge as LineEdgeModel))
8686
} else if (edge.modelType === ModelType.POLYLINE_EDGE) {
8787
edgeOutline.push(this.getPolylineOutline(edge as PolylineEdgeModel))
8888
} else if (edge.modelType === ModelType.BEZIER_EDGE) {

0 commit comments

Comments
 (0)