Skip to content

Commit ce413ce

Browse files
fix: group redraw bug
1 parent 38c8be6 commit ce413ce

File tree

5 files changed

+104
-74
lines changed

5 files changed

+104
-74
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-monitor-dag",
3-
"version": "1.1.1",
3+
"version": "1.1.2",
44
"description": "一个基于React的运维/监控DAG图",
55
"main": "dist/index.js",
66
"pack": "pack/index.js",

src/adaptor.js

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export let transformInitData = (info) => {
2828
let {
2929
data, config, nodeMenu,
3030
edgeMenu,groupMenu, registerStatus,
31-
nodeMenuClassName
31+
nodeMenuClassName, groupCfg = {}
3232
} = info;
3333

3434
let nodes = (data.nodes || []).map((item) => {
@@ -66,6 +66,52 @@ export let transformInitData = (info) => {
6666
});
6767
});
6868

69+
70+
// group的分页处理
71+
let _groupEnablePagination = groupCfg.enablePagination;
72+
let _groupPageSize = groupCfg.pageSize || 20;
73+
if (_groupEnablePagination && groups && groups.length > 0) {
74+
75+
let _groupsObj = {};
76+
let _groupHiddenNodes = {};
77+
78+
for(let i = 0; i < groups.length; i++) {
79+
let _group = groups[i];
80+
if (!_groupsObj[_group.id]) {
81+
_groupsObj[_group.id] = [];
82+
}
83+
}
84+
for(let i = 0; i < nodes.length; i++) {
85+
let _node = nodes[i];
86+
if (_node.group) {
87+
_groupsObj[_node.group].push(_node);
88+
}
89+
}
90+
91+
groups.forEach((item) => {
92+
let _nodes = _groupsObj[item.id];
93+
item._enablePagination = _groupEnablePagination;
94+
item._allNodeList = item._showNodeList = _nodes;
95+
item._pageSize = _groupPageSize;
96+
item._pageNum = 1;
97+
item._totolNum = _nodes.length;
98+
});
99+
100+
let _rmNodes = [];
101+
for(let key in _groupsObj) {
102+
let _group = _groupsObj[key];
103+
_rmNodes = _rmNodes.concat(_group.slice(_groupPageSize, _group.length));
104+
}
105+
106+
nodes = nodes.filter((item) => {
107+
let isRmNode = _.some(_rmNodes, (node) => node.id === item.id);
108+
if (isRmNode) {
109+
_groupHiddenNodes[item.id] = item;
110+
}
111+
return !isRmNode;
112+
});
113+
}
114+
69115
return {
70116
nodes,
71117
edges,
@@ -81,6 +127,13 @@ export let diffPropsData = (newData, oldData, diffOptions = []) => {
81127
let rmNodes = _.differenceWith(oldData.nodes, newData.nodes, (a, b) => {
82128
return a.id === b.id;
83129
});
130+
let addGroups = _.differenceWith(newData.groups, oldData.groups, (a, b) => {
131+
return a.id === b.id;
132+
});
133+
let rmGroups = _.differenceWith(oldData.groups, newData.groups, (a, b) => {
134+
return a.id === b.id;
135+
});
136+
84137
if (diffOptions.length > 0) {
85138
updateNodes = _.differenceWith(newData.nodes, oldData.nodes, (a, b) => {
86139
return diffOptions.reduce((pre, cur) => {
@@ -118,6 +171,8 @@ export let diffPropsData = (newData, oldData, diffOptions = []) => {
118171
});
119172

120173
return {
174+
addGroups,
175+
rmGroups,
121176
addNodes,
122177
rmNodes,
123178
updateNodes,

src/canvas/canvas.js

Lines changed: 32 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22
import { Canvas, Layout } from 'butterfly-dag';
3-
import {Node} from './node';
3+
import AutoLayout from '../utils/layout';
44

55
export default class MonitorCanvas extends Canvas {
66
constructor(opts) {
@@ -23,64 +23,30 @@ export default class MonitorCanvas extends Canvas {
2323
result._onSearchGroup = this._onSearchGroup;
2424
return result;
2525
}
26-
draw(opts, callback) {
27-
28-
// group的分页处理
29-
if (this._groupEnablePagination && opts.groups && opts.groups.length > 0) {
30-
31-
let _groupsObj = {};
32-
let _groupHiddenNodes = {};
33-
34-
for(let i = 0; i < opts.groups.length; i++) {
35-
let _group = opts.groups[i];
36-
if (!_groupsObj[_group.id]) {
37-
_groupsObj[_group.id] = [];
38-
}
39-
}
40-
for(let i = 0; i < opts.nodes.length; i++) {
41-
let _node = opts.nodes[i];
42-
if (_node.group) {
43-
_groupsObj[_node.group].push(_node);
44-
}
45-
}
46-
47-
opts.groups.forEach((item) => {
48-
let nodes = _groupsObj[item.id];
49-
item._enablePagination = this._groupEnablePagination;
50-
item._allNodeList = item._showNodeList = nodes;
51-
item._pageSize = this._groupPageSize;
52-
item._pageNum = 1;
53-
item._totolNum = nodes.length;
54-
});
55-
56-
let _rmNodes = [];
57-
for(let key in _groupsObj) {
58-
let _group = _groupsObj[key];
59-
_rmNodes = _rmNodes.concat(_group.slice(this._groupPageSize, _group.length));
60-
}
61-
62-
opts.nodes = opts.nodes.filter((item) => {
63-
let isRmNode = _.some(_rmNodes, (node) => node.id === item.id);
64-
if (isRmNode) {
65-
_groupHiddenNodes[item.id] = item;
66-
}
67-
return !isRmNode;
68-
});
69-
}
70-
71-
super.draw(opts, callback);
72-
}
7326
redraw() {
7427
let nodes = this.nodes.map((item) => {
7528
return item.options;
7629
});
30+
let groups = this.groups.map((item) => {
31+
return {
32+
id: item.id,
33+
width: item.width,
34+
height: item.height,
35+
isGroup: true
36+
}
37+
});
7738
let edges = this.edges.map((item) => {
7839
return {
79-
source: item.sourceNode.id,
80-
target: item.targetNode.id
40+
sourceNode: item.sourceNode.id,
41+
targetNode: item.targetNode.id
8142
}
8243
});
83-
Layout.dagreLayout({
44+
45+
AutoLayout({
46+
nodes: nodes,
47+
groups: groups,
48+
edges: edges
49+
}, {
8450
rankdir: _.get(this.layout, 'options.rankdir') || 'TB',
8551
align: _.get(this.layout, 'options.align'),
8652
nodeSize: _.get(this.layout, 'options.nodeSize'),
@@ -89,14 +55,10 @@ export default class MonitorCanvas extends Canvas {
8955
nodesep: _.get(this.layout, 'options.nodesep') || 50,
9056
ranksep: _.get(this.layout, 'options.ranksep') || 50,
9157
controlPoints: _.get(this.layout, 'options.controlPoints') || false,
92-
data: {
93-
nodes: nodes,
94-
edges: edges.map(item => ({
95-
source: item.type === 'endpoint' ? item.sourceNode : item.source,
96-
target: item.type === 'endpoint' ? item.targetNode : item.target
97-
}))
98-
}
58+
}, {
59+
rowCtn: this._groupRowCnt
9960
});
61+
10062
this.nodes.forEach((item, index) => {
10163
let newLeft = nodes[index].left;
10264
let newTop = nodes[index].top;
@@ -106,6 +68,18 @@ export default class MonitorCanvas extends Canvas {
10668
item.moveTo(newLeft, newTop);
10769
}
10870
});
71+
72+
this.groups.forEach((item, index) => {
73+
let newLeft = groups[index].left;
74+
let newTop = groups[index].top;
75+
if (item.top !== newTop || item.left !== newLeft) {
76+
item.options.top = newTop;
77+
item.options.left = newLeft;
78+
item.moveTo(newLeft, newTop);
79+
}
80+
});
81+
82+
10983
this.focusCenterWithAnimate();
11084
}
11185

src/canvas/group.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ class BaseGroup extends Group {
6565
group.append(this._container);
6666

6767
this._titleContainer = titleContainer;
68-
console.log(this._titleContainer);
6968

7069
return _dom;
7170
}

src/index.tsx

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,8 @@ export default class MonitorDag extends React.Component<ComProps, any> {
149149
groupMenu: this.props.groupMenu,
150150
nodeMenuClassName: this.props.nodeMenuClassName,
151151
data: _.cloneDeep(this.props.data || {nodes: [], edges: [], groups: []}),
152-
registerStatus: _.cloneDeep(this.props.registerStatus)
152+
registerStatus: _.cloneDeep(this.props.registerStatus),
153+
groupCfg: _.get(this, 'props.config.group'),
153154
});
154155
let canvasObj = ({
155156
root: root,
@@ -196,14 +197,6 @@ export default class MonitorDag extends React.Component<ComProps, any> {
196197
rowCtn: _.get(this.props, 'config.group.rowCnt')
197198
});
198199

199-
// canvasObj['layout'] = {
200-
// type: 'dagreLayout',
201-
// options: {
202-
// rankdir: _.get(this.props, 'config.direction', 'top-bottom') === 'top-bottom' ? 'TB' : 'LR',
203-
// nodesep: 40,
204-
// ranksep: 40
205-
// }
206-
// };
207200
}
208201

209202
setTimeout(() => {
@@ -278,9 +271,16 @@ export default class MonitorDag extends React.Component<ComProps, any> {
278271
groupMenu: this.props.groupMenu,
279272
nodeMenuClassName: this.props.nodeMenuClassName,
280273
data: _.cloneDeep(newProps.data),
281-
registerStatus: _.cloneDeep(newProps.registerStatus)
274+
registerStatus: _.cloneDeep(newProps.registerStatus),
275+
groupCfg: _.get(newProps, 'config.group'),
282276
});
283277
let diffInfo = diffPropsData(result, this.canvasData, _.get(this, 'props.config.diffOptions', []));
278+
if (diffInfo.rmGroups.length > 0) {
279+
this.canvas.removeGroups(diffInfo.rmNodes.map(item => item.id));
280+
}
281+
if (diffInfo.addGroups.length > 0) {
282+
this.canvas.addGroups(diffInfo.addGroups);
283+
}
284284
if (diffInfo.rmNodes.length > 0) {
285285
this.canvas.removeNodes(diffInfo.rmNodes.map(item => item.id));
286286
}
@@ -312,19 +312,21 @@ export default class MonitorDag extends React.Component<ComProps, any> {
312312
});
313313
}
314314

315+
this.canvasData = result;
316+
315317
if (
316318
_.get(this.props, 'config.autoLayout.isAlways', false) && (
317319
diffInfo.addNodes.length > 0 ||
318320
diffInfo.rmNodes.length > 0 ||
319321
diffInfo.addEdges.length > 0 ||
320-
diffInfo.rmEdges.length > 0
322+
diffInfo.rmEdges.length > 0 ||
323+
diffInfo.addGroups.length > 0 ||
324+
diffInfo.rmGroups.length > 0
321325
)
322326
) {
323327
this.canvas.redraw();
324328
}
325329

326-
this.canvasData = result;
327-
328330
// 检测轮训
329331
this._polling(newProps.polling);
330332

0 commit comments

Comments
 (0)