diff --git a/modules/ui/raw_member_editor.js b/modules/ui/raw_member_editor.js index 0df12835f..29ecc13a2 100644 --- a/modules/ui/raw_member_editor.js +++ b/modules/ui/raw_member_editor.js @@ -59,12 +59,16 @@ export function uiRawMemberEditor(context) { function changeRole(d) { - var role = d3_select(this).property('value'); - var member = { id: d.id, type: d.type, role: role }; - context.perform( - actionChangeMember(d.relation.id, member, d.index), - t('operations.change_role.annotation') - ); + var oldRole = d.role; + var newRole = d3_select(this).property('value'); + + if (oldRole !== newRole) { + var member = { id: d.id, type: d.type, role: newRole }; + context.perform( + actionChangeMember(d.relation.id, member, d.index), + t('operations.change_role.annotation') + ); + } } @@ -217,6 +221,7 @@ export function uiRawMemberEditor(context) { .attr('placeholder', t('inspector.role')) .call(utilNoAuto) .property('value', function(d) { return d.role; }) + .on('blur', changeRole) .on('change', changeRole); wrapEnter @@ -224,8 +229,8 @@ export function uiRawMemberEditor(context) { .attr('tabindex', -1) .attr('title', t('icons.remove')) .attr('class', 'remove form-field-button member-delete') - .on('click', deleteMember) - .call(svgIcon('#iD-operation-delete')); + .call(svgIcon('#iD-operation-delete')) + .on('click', deleteMember); if (taginfo) { wrapEnter.each(bindTypeahead); diff --git a/modules/ui/raw_membership_editor.js b/modules/ui/raw_membership_editor.js index 48de899da..39fb12d63 100644 --- a/modules/ui/raw_membership_editor.js +++ b/modules/ui/raw_membership_editor.js @@ -44,13 +44,16 @@ export function uiRawMembershipEditor(context) { function changeRole(d) { - var role = d3_select(this).property('value'); if (d === 0) return; // called on newrow (shoudn't happen) + var oldRole = d.member.role; + var newRole = d3_select(this).property('value'); - context.perform( - actionChangeMember(d.relation.id, _extend({}, d.member, { role: role }), d.index), - t('operations.change_role.annotation') - ); + if (oldRole !== newRole) { + context.perform( + actionChangeMember(d.relation.id, _extend({}, d.member, { role: newRole }), d.index), + t('operations.change_role.annotation') + ); + } } @@ -225,28 +228,21 @@ export function uiRawMembershipEditor(context) { .attr('maxlength', 255) .attr('placeholder', t('inspector.role')) .call(utilNoAuto) - .property('value', function(d) { return d.member.role; }); + .property('value', function(d) { return d.member.role; }) + .on('blur', changeRole) + .on('change', changeRole); wrapEnter .append('button') .attr('tabindex', -1) .attr('class', 'remove form-field-button member-delete') - .call(svgIcon('#iD-operation-delete')); + .call(svgIcon('#iD-operation-delete')) + .on('click', deleteMembership); if (taginfo) { wrapEnter.each(bindTypeahead); } - // Update - items = items - .merge(itemsEnter); - - items.selectAll('input.member-role') - .on('change', changeRole); - - items.selectAll('button.member-delete') - .on('click', deleteMembership); - var newMembership = list.selectAll('.member-row-new') .data(_showBlank ? [0] : []); @@ -297,7 +293,10 @@ export function uiRawMembershipEditor(context) { newMembership.selectAll('.member-entity-input') .call(nearbyCombo - .on('accept', onAccept) + .on('accept', function (d) { + var role = list.selectAll('.member-row-new .member-role').property('value'); + addMembership(d, role); + }) .on('cancel', function() { delete this.value; }) ); @@ -321,12 +320,6 @@ export function uiRawMembershipEditor(context) { }); - function onAccept(d) { - var role = list.selectAll('.member-row-new .member-role').property('value'); - addMembership(d, role); - } - - function bindTypeahead(d) { var row = d3_select(this); var role = row.selectAll('input.member-role');