Skip to content

Commit 7d27465

Browse files
committed
fix #702: children element move unexpected while use SelectionSelect
1 parent 7dbdf2b commit 7d27465

File tree

15 files changed

+83
-23
lines changed

15 files changed

+83
-23
lines changed

docs/api/edgeModelApi.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ LogicFlow在`model`上还维护一些属性,开发者可以通过这些属性
5454
| sourceAnchorId| string | - | 连线起点锚点id |
5555
| targetAnchorId| string | - | 连线终点锚点id |
5656
| customTextPosition| boolean | - | 自定义连线文本位置 |
57-
57+
| virtual | boolean| - | 是否为虚拟节点,默认false。当为true时导出数据不会包含此元素。 `v1.1.24`|
5858

5959
## 样式属性
6060

docs/api/graphModelApi.md

+4
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,10 @@ lf.on('user:detail', (res) => {})
196196
|-|-|-|-|
197197
|leftTopPoint|PointTuple|| 区域左上方的点 |
198198
|rightBottomPoint|PointTuple|| 区域右下角的点 |
199+
|rightBottomPoint|PointTuple|| 区域右下角的点 |
200+
|wholeEdge|boolean|| 是否要整个边都在区域内部 |
201+
|wholeNode|boolean|| 是否要整个节点都在区域内部 |
202+
|ignoreHideElement|boolean|| 是否忽略隐藏的节点 |
199203

200204
```js
201205
graphModel.getAreaElement([100, 100], [800, 800])

docs/api/logicFlowApi.md

+10
Original file line numberDiff line numberDiff line change
@@ -893,6 +893,16 @@ lf.addElements({
893893
894894
例如鼠标绘制选区后,获取选区内的所有元素。
895895
896+
入参:
897+
|名称|类型|默认值|说明|
898+
|-|-|-|-|
899+
|leftTopPoint|PointTuple|无| 区域左上方的点 |
900+
|rightBottomPoint|PointTuple|无| 区域右下角的点 |
901+
|rightBottomPoint|PointTuple|无| 区域右下角的点 |
902+
|wholeEdge|boolean|无| 是否要整个边都在区域内部 |
903+
|wholeNode|boolean|无| 是否要整个节点都在区域内部 |
904+
|ignoreHideElement|boolean|无| 是否忽略隐藏的节点 |
905+
896906
```js
897907
lf.getAreaElement([100, 100], [500, 500])
898908
```

docs/api/nodeModelApi.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ nodeModel上节点属性有很多,由于用途不一样,我们对其进行
4141
| isHovered | boolean || 节点是否在hover状态 |
4242
| isHitable | boolean || 节点是否可点击 |
4343
| draggable | boolean || 节点是否可拖动 |
44-
| visible | boolean || 边是否显示, `1.1.0`新增 |
44+
| visible | boolean || 是否显示, `1.1.0`新增 |
4545

4646
## 形状属性
4747

@@ -75,6 +75,7 @@ LogicFlow在`model`上还维护一些属性,开发者可以通过这些属性
7575
| autoToFront | boolean || 控制节点选中时是否自动置顶,默认为true. |
7676
| incoming | object || 进入当前节点的所有边和节点,`v1.1.4` |
7777
| outgoing | object || 离开当前节点的所有边和节点, `v1.1.4` |
78+
| virtual | boolean| - | 是否为虚拟节点,默认false。当为true时导出数据不会包含此元素。 `v1.1.24`|
7879

7980
::: tip modelType与type的区别是什么?
8081

docs/release/1.1.md

+10
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,16 @@
55
- 1.1版本对插件进行规范,现在要求所有的插件必须使用class的方式实现。然后插件的方法可以通过`lf.extension.插件名称.插件方法`来调用。原来的`lf.插件方法`仍然可用,后续版本将废弃。
66
- `MiniMap` api不兼容更新。`MiniMap.show()` -> `lf.extension.miniMap.show()`; `MiniMap.hide()` -> `lf.extension.miniMap.hide()`
77

8+
### 1.1.24
9+
10+
> 发版时间:2022/08/11
11+
12+
- features
13+
- `getAreaElement`增加参数`ignoreHideElement`,支持忽略获取隐藏的节点。
14+
- `baseNodeModel``baseEdgeModel`增加参数`virtual`,导出的图数据会忽略`virtual``true`的元素
15+
- bugfix
16+
- fix [#702](https://github.com/didi/LogicFlow/issues/702): 修复框选分组节点移动时,子节点连线会混乱bug
17+
818
### 1.1.23
919

1020
> 发版时间:2022/08/04

packages/core/src/LogicFlow.tsx

+8-2
Original file line numberDiff line numberDiff line change
@@ -719,9 +719,15 @@ export default class LogicFlow {
719719
rightBottomPoint: PointTuple,
720720
wholeEdge = true,
721721
wholeNode = true,
722+
ignoreHideElement = false,
722723
) {
723-
return this.graphModel.getAreaElement(leftTopPoint, rightBottomPoint, wholeEdge, wholeNode)
724-
.map(element => element.getData());
724+
return this.graphModel.getAreaElement(
725+
leftTopPoint,
726+
rightBottomPoint,
727+
wholeEdge,
728+
wholeNode,
729+
ignoreHideElement,
730+
).map(element => element.getData());
725731
}
726732
/**
727733
* 获取选中的元素数据

packages/core/src/model/BaseModel.ts

+7
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,14 @@ interface IBaseModel {
5959
* 元素是否被选中
6060
*/
6161
isSelected: boolean;
62+
/**
63+
* 节点是否显示
64+
*/
6265
visible: boolean;
66+
/**
67+
* 节点是否可以通过getGraphData获取
68+
*/
69+
virtual: boolean;
6370
/**
6471
* 元素堆叠是层级,默认情况下节点zIndex值为1,边zIndex为0。
6572
* todo:写完善

packages/core/src/model/GraphModel.ts

+8-3
Original file line numberDiff line numberDiff line change
@@ -248,20 +248,25 @@ class GraphModel {
248248
* @param rightBottomPoint 表示区域右下角的点
249249
* @param wholeEdge 是否要整个边都在区域内部
250250
* @param wholeNode 是否要整个节点都在区域内部
251+
* @param ignoreHideElement 是否忽略隐藏的节点
251252
*/
252253
getAreaElement(
253254
leftTopPoint: PointTuple,
254255
rightBottomPoint: PointTuple,
255256
wholeEdge = true,
256257
wholeNode = true,
258+
ignoreHideElement = false,
257259
) {
258260
const areaElements = [];
259261
const elements = [];
260262
this.nodes.forEach(node => elements.push(node));
261263
this.edges.forEach(edge => elements.push(edge));
262264
for (let i = 0; i < elements.length; i++) {
263265
const currentItem = elements[i];
264-
if (this.isElementInArea(currentItem, leftTopPoint, rightBottomPoint, wholeEdge, wholeNode)) {
266+
if (
267+
(!ignoreHideElement || currentItem.visible)
268+
&& this.isElementInArea(currentItem, leftTopPoint, rightBottomPoint, wholeEdge, wholeNode)
269+
) {
265270
areaElements.push(currentItem);
266271
}
267272
}
@@ -388,12 +393,12 @@ class GraphModel {
388393
const edges = [];
389394
this.edges.forEach(edge => {
390395
const data = edge.getData();
391-
if (data) edges.push(data);
396+
if (data && !edge.virtual) edges.push(data);
392397
});
393398
const nodes = [];
394399
this.nodes.forEach(node => {
395400
const data = node.getData();
396-
if (data) nodes.push(data);
401+
if (data && !node.virtual) nodes.push(data);
397402
});
398403
return {
399404
nodes,

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

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ class BaseEdgeModel implements IBaseModel {
4747
@observable isHitable = true; // 细粒度控制边是否对用户操作进行反应
4848
@observable draggable = true;
4949
@observable visible = true;
50+
virtual = false;
5051
@observable isAnimation = false;
5152
// 引用属性
5253
graphModel: GraphModel;

packages/core/src/model/node/BaseNodeModel.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ export default class BaseNodeModel implements IBaseNodeModel {
8686
@observable isHitable = true; // 细粒度控制节点是否对用户操作进行反应
8787
@observable draggable = true;
8888
@observable visible = true;
89+
virtual = false;
8990
// 其它属性
9091
graphModel: GraphModel;
9192
@observable zIndex = 1;
@@ -457,10 +458,10 @@ export default class BaseNodeModel implements IBaseNodeModel {
457458
}
458459
}
459460
@action
460-
move(deltaX, deltaY, isignoreRule = false): boolean {
461+
move(deltaX, deltaY, isIgnoreRule = false): boolean {
461462
let isAllowMoveX = false;
462463
let isAllowMoveY = false;
463-
if (isignoreRule) {
464+
if (isIgnoreRule) {
464465
isAllowMoveX = true;
465466
isAllowMoveY = true;
466467
} else {
@@ -487,10 +488,10 @@ export default class BaseNodeModel implements IBaseNodeModel {
487488
}
488489

489490
@action
490-
moveTo(x, y, isignoreRule = false): boolean {
491+
moveTo(x, y, isIgnoreRule = false): boolean {
491492
const deltaX = x - this.x;
492493
const deltaY = y - this.y;
493-
if (!isignoreRule && !this.isAllowMoveNode(deltaX, deltaY)) return false;
494+
if (!isIgnoreRule && !this.isAllowMoveNode(deltaX, deltaY)) return false;
494495
if (this.text) {
495496
this.text && this.moveText(deltaX, deltaY);
496497
}

packages/extension/examples/group/index.html

+1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
<script src="http://localhost:9093/logic-flow.js"></script>
3333
<script src="/DndPanel.js"></script>
3434
<script src="/Group.js"></script>
35+
<script src="/SelectionSelect.js"></script>
3536
<script src="/Control.js"></script>
3637
<script type="module" src="./index.mjs"></script>
3738

packages/extension/examples/group/index.mjs

+9-1
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,18 @@ const lf = new LogicFlow({
55
keyboard: {
66
enabled: true
77
},
8-
plugins: [Group, Control, DndPanel],
8+
plugins: [Group, Control, DndPanel, SelectionSelect],
99
height: 800
1010
})
1111

12+
lf.extension.control.addItem({
13+
iconClass: "custom-minimap",
14+
title: "",
15+
text: "框选",
16+
onClick: (lf, ev) => {
17+
lf.extension.selectionSelect.openSelectionSelect()
18+
}
19+
})
1220

1321
class MyGroup extends GroupNode.view {}
1422

packages/extension/src/components/selection-select/index.ts

+13-7
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,15 @@ class SelectionSelect {
1313
y: number,
1414
};
1515
__disabled = false;
16-
isDefalutStopMoveGraph = false;
16+
isDefaultStopMoveGraph = false;
1717
isWholeNode = true;
1818
isWholeEdge = true;
1919
static pluginName = 'selectionSelect';
2020
constructor({ lf }) {
2121
this.lf = lf;
22-
// 初始化isDefalutStopMoveGraph取值
22+
// 初始化isDefaultStopMoveGraph取值
2323
const { stopMoveGraph } = lf.getEditConfig();
24-
this.isDefalutStopMoveGraph = stopMoveGraph;
24+
this.isDefaultStopMoveGraph = stopMoveGraph;
2525
lf.openSelectionSelect = () => {
2626
this.openSelectionSelect();
2727
};
@@ -70,7 +70,7 @@ class SelectionSelect {
7070
openSelectionSelect() {
7171
const { stopMoveGraph } = this.lf.getEditConfig();
7272
if (!stopMoveGraph) {
73-
this.isDefalutStopMoveGraph = false;
73+
this.isDefaultStopMoveGraph = false;
7474
this.lf.updateEditConfig({
7575
stopMoveGraph: true,
7676
});
@@ -81,7 +81,7 @@ class SelectionSelect {
8181
* 关闭选区
8282
*/
8383
closeSelectionSelect() {
84-
if (!this.isDefalutStopMoveGraph) {
84+
if (!this.isDefaultStopMoveGraph) {
8585
this.lf.updateEditConfig({
8686
stopMoveGraph: false,
8787
});
@@ -125,9 +125,15 @@ class SelectionSelect {
125125
}
126126
const lt: PointTuple = [Math.min(x, x1), Math.min(y, y1)];
127127
const rt: PointTuple = [Math.max(x, x1), Math.max(y, y1)];
128-
const elements = this.lf.getAreaElement(lt, rt, this.isWholeEdge, this.isWholeNode);
128+
const elements = this.lf.graphModel.getAreaElement(
129+
lt, rt, this.isWholeEdge, this.isWholeNode, true,
130+
);
131+
const { group } = this.lf.graphModel;
129132
elements.forEach((element) => {
130-
this.lf.selectElementById(element.id, true);
133+
// 如果节点属于分组,则不不选中节点
134+
if (!group || !group.getNodeGroup(element.id)) {
135+
this.lf.selectElementById(element.id, true);
136+
}
131137
});
132138
this.lf.emit('selection:selected', elements);
133139
};

packages/extension/src/materials/group/GroupNode.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ class GroupNodeModel extends RectResize.model {
203203
const model = this.graphModel.addEdge(edgeData);
204204
model.virtual = true;
205205
// 强制不保存group连线数据
206-
model.getData = () => null;
206+
// model.getData = () => null;
207207
model.text.editable = false;
208208
model.isFoldedEdge = true;
209209
}

packages/extension/src/materials/group/index.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@ class Group {
3939
return true;
4040
});
4141
lf.graphModel.group = this;
42-
lf.on('node:add', this.appendNodeToGrop);
42+
lf.on('node:add', this.appendNodeToGroup);
4343
lf.on('node:delete', this.deleteGroupChild);
44-
lf.on('node:drop', this.appendNodeToGrop);
44+
lf.on('node:drop', this.appendNodeToGroup);
4545
lf.on('node:dnd-drag', this.setActiveGroup);
4646
lf.on('node:drag', this.setActiveGroup);
4747
lf.on('graph:rendered', this.graphRendered);
@@ -58,7 +58,7 @@ class Group {
5858
});
5959
}
6060
};
61-
appendNodeToGrop = ({ data }) => {
61+
appendNodeToGroup = ({ data }) => {
6262
// 如果这个节点之前已经在group中了,则将其从之前的group中移除
6363
const preGroupId = this.nodeGroupMap.get(data.id);
6464
if (preGroupId) {

0 commit comments

Comments
 (0)