Fix member list redraws

d3 does not store the keys produced by a data bind -- it
recomputes them on the fly. The key function that was used
referred to `entity`, with the intent that rows referring
to the previous entity would wind up in the exit selection.
But since the key is recomputed for the existing bindings,
and at that point `entity` refers to the new entity, that
portion of the key effectively always matched.

While here, fix deletion of incomplete members (don't know
what the geometry is, so can't do geometry-specific annotations).

Fixes #1548.
This commit is contained in:
John Firebaugh
2013-05-30 11:44:39 -07:00
parent 3cdadd280b
commit 3981279747
4 changed files with 19 additions and 24 deletions
+1 -6
View File
@@ -69,12 +69,7 @@ en:
multiple: "Deleted {n} objects."
incomplete_relation: This feature can't be deleted because it hasn't been fully downloaded.
delete_member:
annotation:
point: Removed a point from a relation.
vertex: Removed a node from a relation.
line: Removed a line from a relation.
area: Removed an area from a relation.
relation: Removed a relation from a relation.
annotation: Removed a member from a relation.
connect:
annotation:
point: Connected a way to a point.
+1 -7
View File
@@ -91,13 +91,7 @@
"incomplete_relation": "This feature can't be deleted because it hasn't been fully downloaded."
},
"delete_member": {
"annotation": {
"point": "Removed a point from a relation.",
"vertex": "Removed a node from a relation.",
"line": "Removed a line from a relation.",
"area": "Removed an area from a relation.",
"relation": "Removed a relation from a relation."
}
"annotation": "Removed a member from a relation."
},
"connect": {
"annotation": {
+16 -10
View File
@@ -2,20 +2,20 @@ iD.ui.RawMemberEditor = function(context) {
var id;
function selectMember(d) {
context.enter(iD.modes.Select(context, [d.member.id]));
context.enter(iD.modes.Select(context, [d.id]));
}
function changeRole(d) {
var role = d3.select(this).property('value');
context.perform(
iD.actions.ChangeMember(id, _.extend({}, d.member, {role: role}), d.index),
iD.actions.ChangeMember(d.relation.id, _.extend({}, d.id, {role: role}), d.index),
t('operations.change_role.annotation'));
}
function deleteMember(d) {
context.perform(
iD.actions.DeleteMember(id, d.index),
t('operations.delete_member.annotation.' + context.geometry(d.member.id)));
iD.actions.DeleteMember(d.relation.id, d.index),
t('operations.delete_member.annotation'));
}
function rawMemberEditor(selection) {
@@ -23,7 +23,13 @@ iD.ui.RawMemberEditor = function(context) {
memberships = [];
entity.members.forEach(function(member, index) {
memberships.push({member: member, index: index, entity: context.hasEntity(member.id)});
memberships.push({
index: index,
id: member.id,
role: member.role,
relation: entity,
member: context.hasEntity(member.id)
});
});
selection.call(iD.ui.Disclosure()
@@ -46,13 +52,13 @@ iD.ui.RawMemberEditor = function(context) {
.attr('class', 'member-list');
var $items = $list.selectAll('li')
.data(memberships, function(d) { return iD.Entity.key(entity) + ',' + d.index; });
.data(memberships, function(d) { return iD.Entity.key(d.relation) + ',' + d.index; });
var $enter = $items.enter().append('li')
.attr('class', 'member-row form-field');
$enter.each(function(d) {
if (d.entity) {
if (d.member) {
var $label = d3.select(this).append('label')
.attr('class', 'form-label')
.append('a')
@@ -61,11 +67,11 @@ iD.ui.RawMemberEditor = function(context) {
$label.append('span')
.attr('class', 'member-entity-type')
.text(function(d) { return context.presets().match(d.entity, context.graph()).name(); });
.text(function(d) { return context.presets().match(d.member, context.graph()).name(); });
$label.append('span')
.attr('class', 'member-entity-name')
.text(function(d) { return iD.util.localeName(d.entity); });
.text(function(d) { return iD.util.localeName(d.member); });
} else {
d3.select(this).append('label')
@@ -79,7 +85,7 @@ iD.ui.RawMemberEditor = function(context) {
.property('type', 'text')
.attr('maxlength', 255)
.attr('placeholder', t('inspector.role'))
.property('value', function(d) { return d.member.role; })
.property('value', function(d) { return d.role; })
.on('change', changeRole);
$enter.append('button')
+1 -1
View File
@@ -15,7 +15,7 @@ iD.ui.RawMembershipEditor = function(context) {
function deleteMembership(d) {
context.perform(
iD.actions.DeleteMember(d.relation.id, d.index),
t('operations.delete_member.annotation.' + context.geometry(d.member.id)));
t('operations.delete_member.annotation'));
}
function rawMembershipEditor(selection) {