From aa7bf74a7fe4c50fa9bf76b2a5b95826eb67e4ef Mon Sep 17 00:00:00 2001 From: Quincy Morgan Date: Tue, 11 Jun 2019 09:08:44 -0400 Subject: [PATCH] Fix issue with deleting a member from a relation with a duplicate entity but different roles (close #6504) --- modules/core/graph.js | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/modules/core/graph.js b/modules/core/graph.js index a696252cc..e746d962f 100644 --- a/modules/core/graph.js +++ b/modules/core/graph.js @@ -226,25 +226,30 @@ coreGraph.prototype = { } } else if (type === 'relation') { // Update parentRels + + // diff only on the IDs since the same entity can be a member multiple times with different roles + var oldentityMemberIDs = oldentity ? oldentity.members.map(function(m) { return m.id; }) : []; + var entityMemberIDs = entity ? entity.members.map(function(m) { return m.id; }) : []; + if (oldentity && entity) { - removed = utilArrayDifference(oldentity.members, entity.members); - added = utilArrayDifference(entity.members, oldentity.members); + removed = utilArrayDifference(oldentityMemberIDs, entityMemberIDs); + added = utilArrayDifference(entityMemberIDs, oldentityMemberIDs); } else if (oldentity) { - removed = oldentity.members; + removed = oldentityMemberIDs; added = []; } else if (entity) { removed = []; - added = entity.members; + added = entityMemberIDs; } for (i = 0; i < removed.length; i++) { // make a copy of prototype property, store as own property, and update.. - parentRels[removed[i].id] = new Set(parentRels[removed[i].id]); - parentRels[removed[i].id].delete(oldentity.id); + parentRels[removed[i]] = new Set(parentRels[removed[i]]); + parentRels[removed[i]].delete(oldentity.id); } for (i = 0; i < added.length; i++) { // make a copy of prototype property, store as own property, and update.. - parentRels[added[i].id] = new Set(parentRels[added[i].id]); - parentRels[added[i].id].add(entity.id); + parentRels[added[i]] = new Set(parentRels[added[i]]); + parentRels[added[i]].add(entity.id); } } },