diff --git a/js/id/graph/relation.js b/js/id/graph/relation.js index 7d8a9aa89..989ade40c 100644 --- a/js/id/graph/relation.js +++ b/js/id/graph/relation.js @@ -18,6 +18,26 @@ iD.Relation = iD.Entity.extend({ return 'relation'; }, + // Return the first member with the given role. A copy of the member object + // is returned, extended with an 'index' property whose value is the member index. + memberByRole: function(role) { + for (var i = 0; i < this.members.length; i++) { + if (this.members[i].role === role) { + return _.extend({}, this.members[i], {index: i}); + } + } + }, + + // Return the first member with the given id. A copy of the member object + // is returned, extended with an 'index' property whose value is the member index. + memberById: function(id) { + for (var i = 0; i < this.members.length; i++) { + if (this.members[i].id === id) { + return _.extend({}, this.members[i], {index: i}); + } + } + }, + // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm], // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings. // diff --git a/js/id/svg/member_classes.js b/js/id/svg/member_classes.js index b675288c3..d5745a466 100644 --- a/js/id/svg/member_classes.js +++ b/js/id/svg/member_classes.js @@ -19,7 +19,7 @@ iD.svg.MemberClasses = function(graph) { relations.forEach(function (relation) { classes += ' member-type-' + relation.tags.type; - classes += ' member-role-' + _.find(relation.members, function (member) { return member.id == d.id; }).role; + classes += ' member-role-' + relation.memberById(d.id).role; }); classes = classes.trim(); diff --git a/test/spec/graph/relation.js b/test/spec/graph/relation.js index 8880fc98c..b6961a092 100644 --- a/test/spec/graph/relation.js +++ b/test/spec/graph/relation.js @@ -55,6 +55,40 @@ describe('iD.Relation', function () { }); }); + describe("#geometry", function () { + it("returns 'relation'", function () { + expect(iD.Relation().geometry()).to.equal('relation'); + }); + }); + + describe("#memberByRole", function () { + it("returns the first member with the given role", function () { + var r = iD.Relation({members: [ + {id: 'a', role: 'inner'}, + {id: 'b', role: 'outer'}, + {id: 'c', role: 'outer'}]}); + expect(r.memberByRole('outer')).to.eql({id: 'b', role: 'outer', index: 1}); + }); + + it("returns undefined if no members have the given role", function () { + expect(iD.Relation().memberByRole('outer')).to.be.undefined; + }); + }); + + describe("#memberById", function () { + it("returns the first member with the given id", function () { + var r = iD.Relation({members: [ + {id: 'a', role: 'outer'}, + {id: 'b', role: 'outer'}, + {id: 'b', role: 'inner'}]}); + expect(r.memberById('b')).to.eql({id: 'b', role: 'outer', index: 1}); + }); + + it("returns undefined if no members have the given role", function () { + expect(iD.Relation().memberById('b')).to.be.undefined; + }); + }); + describe("#multipolygon", function () { specify("single polygon consisting of a single way", function () { var a = iD.Node(),