diff --git a/modules/core/difference.js b/modules/core/difference.js index bc97dc891..a3b726a83 100644 --- a/modules/core/difference.js +++ b/modules/core/difference.js @@ -1,7 +1,7 @@ import deepEqual from 'fast-deep-equal'; import { geoVecEqual } from '../geo'; -import { utilArrayDifference } from '../util'; +import { utilArrayDifference, utilArrayUnion } from '../util'; /* @@ -173,6 +173,8 @@ export function coreDifference(base, head) { }; + // returns complete set of entities that require a redraw + // (optionally within given `extent`) _diff.complete = function complete(extent) { var result = {}; var id, change; @@ -183,6 +185,7 @@ export function coreDifference(base, head) { var h = change.head; var b = change.base; var entity = h || b; + var i; if (extent && (!h || !h.intersects(extent, head)) && @@ -194,7 +197,7 @@ export function coreDifference(base, head) { if (entity.type === 'way') { var nh = h ? h.nodes : []; var nb = b ? b.nodes : []; - var diff, i; + var diff; diff = utilArrayDifference(nh, nb); for (i = 0; i < diff.length; i++) { @@ -207,6 +210,15 @@ export function coreDifference(base, head) { } } + if (entity.type === 'relation' && entity.isMultipolygon()) { + var mh = h ? h.members.map(function(m) { return m.id; }) : []; + var mb = b ? b.members.map(function(m) { return m.id; }) : []; + var ids = utilArrayUnion(mh, mb); + for (i = 0; i < ids.length; i++) { + result[ids[i]] = head.hasEntity(ids[i]); + } + } + addParents(head.parentWays(entity), result); addParents(head.parentRelations(entity), result); } diff --git a/test/spec/core/difference.js b/test/spec/core/difference.js index 8c27eb5e3..45ae6e04c 100644 --- a/test/spec/core/difference.js +++ b/test/spec/core/difference.js @@ -382,6 +382,22 @@ describe('iD.coreDifference', function () { expect(diff.complete().n2).to.equal(n2); }); + it('includes multipolygon members', function () { + var w1 = iD.osmWay({id: 'w1'}); + var w2 = iD.osmWay({id: 'w2'}); + var r1 = iD.osmRelation({ + id: 'r', + tags: { type: 'multipolygon' }, + members: [{role: 'outer', id: 'w1', type: 'way'}, {role: '', id: 'w2', type: 'way'}] + }); + var r2 = r1.updateMember({role: 'inner', id: 'w2', type: 'way'}, 1); + var base = iD.coreGraph([w1, w2, r1]); + var head = base.replace(r2); + var diff = iD.coreDifference(base, head); + + expect(diff.complete().w2).to.equal(w2); + }); + it('includes parent ways of modified nodes', function () { var n1 = iD.osmNode({id: 'n'}); var n2 = n1.move([1, 2]);