From eb55e36c3c24f8b7a417239b00ef5464b5b08eb0 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Thu, 26 Jun 2014 09:54:34 -0700 Subject: [PATCH] Delete relations that become empty (#2270) --- js/id/actions/delete_member.js | 10 +++++++++- js/id/ui/raw_member_editor.js | 4 ++++ test/spec/actions/delete_member.js | 19 ++++++++++++++----- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/js/id/actions/delete_member.js b/js/id/actions/delete_member.js index 50b331e14..ffed567ca 100644 --- a/js/id/actions/delete_member.js +++ b/js/id/actions/delete_member.js @@ -1,5 +1,13 @@ iD.actions.DeleteMember = function(relationId, memberIndex) { return function(graph) { - return graph.replace(graph.entity(relationId).removeMember(memberIndex)); + var relation = graph.entity(relationId) + .removeMember(memberIndex); + + graph = graph.replace(relation); + + if (relation.isDegenerate()) + graph = iD.actions.DeleteRelation(relation.id)(graph); + + return graph; }; }; diff --git a/js/id/ui/raw_member_editor.js b/js/id/ui/raw_member_editor.js index dbc34c678..20a0ca0b6 100644 --- a/js/id/ui/raw_member_editor.js +++ b/js/id/ui/raw_member_editor.js @@ -17,6 +17,10 @@ iD.ui.RawMemberEditor = function(context) { context.perform( iD.actions.DeleteMember(d.relation.id, d.index), t('operations.delete_member.annotation')); + + if (!context.hasEntity(d.relation.id)) { + context.enter(iD.modes.Browse(context)); + } } function rawMemberEditor(selection) { diff --git a/test/spec/actions/delete_member.js b/test/spec/actions/delete_member.js index f23cdb700..187f2c20c 100644 --- a/test/spec/actions/delete_member.js +++ b/test/spec/actions/delete_member.js @@ -1,9 +1,18 @@ describe("iD.actions.DeleteMember", function () { it("removes the member at the specified index", function () { - var node = iD.Node(), - relation = iD.Relation({members: [{id: node.id}]}), - action = iD.actions.DeleteMember(relation.id, 0), - graph = action(iD.Graph([node, relation])); - expect(graph.entity(relation.id).members).to.eql([]); + var a = iD.Node({id: 'a'}), + b = iD.Node({id: 'b'}), + r = iD.Relation({members: [{id: 'a'}, {id: 'b'}]}), + action = iD.actions.DeleteMember(r.id, 0), + graph = action(iD.Graph([a, b, r])); + expect(graph.entity(r.id).members).to.eql([{id: 'b'}]); + }); + + it("deletes relations that become degenerate", function () { + var a = iD.Node({id: 'a'}), + r = iD.Relation({id: 'r', members: [{id: 'a'}]}), + action = iD.actions.DeleteMember(r.id, 0), + graph = action(iD.Graph([a, r])); + expect(graph.hasEntity('r')).to.be.undefined; }); });