Skip to content

Commit c832666

Browse files
dljcolletteNicolas ERNY
authored andcommitted
Fix multiple edges between two nodes (#99)
* Fix multiple edges between two nodes * Add test for multiple links between nodes
1 parent aa5a19a commit c832666

2 files changed

Lines changed: 41 additions & 4 deletions

File tree

src/GojsDiagram.test.tsx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,22 @@ describe('<GojsDiagram />', () => {
190190
},
191191
description: 'adding a new link'
192192
},
193+
{
194+
updatedModel: {
195+
...model,
196+
linkDataArray: [
197+
...model.linkDataArray,
198+
{
199+
from: 'Gamma',
200+
to: 'Omega',
201+
fromPort: portFrom,
202+
toPort: portTo,
203+
key: -5
204+
}
205+
]
206+
},
207+
description: 'adding two new links between same nodes'
208+
},
193209
{
194210
updatedModel: {
195211
...model,
@@ -366,6 +382,7 @@ const checkIfDiagramRendersModel = (model, diagram: Diagram) => {
366382
});
367383
model.linkDataArray.forEach(link => {
368384
expect(diagram.links.any(e => e.fromNode!.key === link.from && e.toNode!.key === link.to)).toBeTruthy();
385+
expect(model.linkDataArray.length === diagram.links.count).toBeTruthy();
369386
});
370387
diagram.links.each(link => {
371388
expect(

src/GojsDiagram.tsx

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,15 +148,35 @@ class GojsDiagram<N extends BaseNodeModel, L extends LinkModel> extends React.Pu
148148
const linksToAdd = this.props.model.linkDataArray
149149
.filter(
150150
e =>
151-
(this.myDiagram.model as GojsModel).linkDataArray.findIndex(
152-
(el: LinkModel) => el.from === e.from && el.to === e.to
153-
) === -1
151+
(this.myDiagram.model as GojsModel).linkDataArray.findIndex((el: LinkModel) => {
152+
if (
153+
this.props.linkKeyProperty &&
154+
el[this.props.linkKeyProperty] &&
155+
e[this.props.linkKeyProperty]
156+
) {
157+
return (
158+
el.from === e.from &&
159+
el.to === e.to &&
160+
el[this.props.linkKeyProperty] === e[this.props.linkKeyProperty]
161+
);
162+
}
163+
return el.from === e.from && el.to === e.to;
164+
}) === -1
154165
)
155166
.map(link => Object.assign({}, link));
156167
(this.myDiagram.model as GojsModel).addLinkDataCollection(linksToAdd);
157168
const linksToRemove = (this.myDiagram.model as GojsModel).linkDataArray.filter(
158169
(e: LinkModel) =>
159-
this.props.model.linkDataArray.findIndex(el => el.from === e.from && el.to === e.to) === -1
170+
this.props.model.linkDataArray.findIndex(el => {
171+
if (this.props.linkKeyProperty && el[this.props.linkKeyProperty] && e[this.props.linkKeyProperty]) {
172+
return (
173+
el.from === e.from &&
174+
el.to === e.to &&
175+
el[this.props.linkKeyProperty] === e[this.props.linkKeyProperty]
176+
);
177+
}
178+
return el.from === e.from && el.to === e.to;
179+
}) === -1
160180
);
161181
(this.myDiagram.model as GojsModel).removeLinkDataCollection(linksToRemove);
162182
}

0 commit comments

Comments
 (0)