diff --git a/js/id/actions/delete_member.js b/js/id/actions/delete_member.js
new file mode 100644
index 000000000..50b331e14
--- /dev/null
+++ b/js/id/actions/delete_member.js
@@ -0,0 +1,5 @@
+iD.actions.DeleteMember = function(relationId, memberIndex) {
+ return function(graph) {
+ return graph.replace(graph.entity(relationId).removeMember(memberIndex));
+ };
+};
diff --git a/js/id/core/relation.js b/js/id/core/relation.js
index 460b8ee43..e65862704 100644
--- a/js/id/core/relation.js
+++ b/js/id/core/relation.js
@@ -73,6 +73,12 @@ _.extend(iD.Relation.prototype, {
return this.update({members: members});
},
+ removeMember: function(index) {
+ var members = this.members.slice();
+ members.splice(index, 1);
+ return this.update({members: members});
+ },
+
removeMembersWithID: function(id) {
var members = _.reject(this.members, function(m) { return m.id === id; });
return this.update({members: members});
diff --git a/test/index.html b/test/index.html
index 91dc1c5f9..580885630 100644
--- a/test/index.html
+++ b/test/index.html
@@ -105,6 +105,7 @@
+
@@ -188,6 +189,7 @@
+
diff --git a/test/index_packaged.html b/test/index_packaged.html
index cf745ce5b..15bcef8df 100644
--- a/test/index_packaged.html
+++ b/test/index_packaged.html
@@ -30,6 +30,7 @@
+
diff --git a/test/spec/actions/delete_member.js b/test/spec/actions/delete_member.js
new file mode 100644
index 000000000..bb6e9c85c
--- /dev/null
+++ b/test/spec/actions/delete_member.js
@@ -0,0 +1,9 @@
+describe("iD.actions.DeleteMember", function () {
+ it("removes the member at the specified index", function () {
+ var node = iD.Node(),
+ relation = iD.Relation({members: [node.id]}),
+ action = iD.actions.DeleteMember(relation.id, 0),
+ graph = action(iD.Graph([node, relation]));
+ expect(graph.entity(relation.id).members).to.eql([]);
+ });
+});
diff --git a/test/spec/core/relation.js b/test/spec/core/relation.js
index 6af273aeb..23e549b0d 100644
--- a/test/spec/core/relation.js
+++ b/test/spec/core/relation.js
@@ -128,6 +128,13 @@ describe('iD.Relation', function () {
});
});
+ describe("#removeMember", function () {
+ it("removes the member at the specified index", function () {
+ var r = iD.Relation({members: [{id: 'a'}, {id: 'b'}, {id: 'c'}]});
+ expect(r.removeMember(1).members).to.eql([{id: 'a'}, {id: 'c'}]);
+ });
+ });
+
describe("#removeMembersWithID", function () {
it("removes members with the given ID", function () {
var r = iD.Relation({members: [{id: 'a'}, {id: 'b'}, {id: 'a'}]});