mirror of
https://github.com/FoggedLens/iD.git
synced 2026-06-03 13:38:04 +02:00
3981279747
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.
111 lines
3.6 KiB
JavaScript
111 lines
3.6 KiB
JavaScript
iD.ui.RawMemberEditor = function(context) {
|
|
var id;
|
|
|
|
function selectMember(d) {
|
|
context.enter(iD.modes.Select(context, [d.id]));
|
|
}
|
|
|
|
function changeRole(d) {
|
|
var role = d3.select(this).property('value');
|
|
context.perform(
|
|
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(d.relation.id, d.index),
|
|
t('operations.delete_member.annotation'));
|
|
}
|
|
|
|
function rawMemberEditor(selection) {
|
|
var entity = context.entity(id),
|
|
memberships = [];
|
|
|
|
entity.members.forEach(function(member, index) {
|
|
memberships.push({
|
|
index: index,
|
|
id: member.id,
|
|
role: member.role,
|
|
relation: entity,
|
|
member: context.hasEntity(member.id)
|
|
});
|
|
});
|
|
|
|
selection.call(iD.ui.Disclosure()
|
|
.title(t('inspector.all_members') + ' (' + memberships.length + ')')
|
|
.expanded(true)
|
|
.on('toggled', toggled)
|
|
.content(content));
|
|
|
|
function toggled(expanded) {
|
|
if (expanded) {
|
|
selection.node().parentNode.scrollTop += 200;
|
|
}
|
|
}
|
|
|
|
function content($wrap) {
|
|
var $list = $wrap.selectAll('.member-list')
|
|
.data([0]);
|
|
|
|
$list.enter().append('ul')
|
|
.attr('class', 'member-list');
|
|
|
|
var $items = $list.selectAll('li')
|
|
.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.member) {
|
|
var $label = d3.select(this).append('label')
|
|
.attr('class', 'form-label')
|
|
.append('a')
|
|
.attr('href', '#')
|
|
.on('click', selectMember);
|
|
|
|
$label.append('span')
|
|
.attr('class', 'member-entity-type')
|
|
.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.member); });
|
|
|
|
} else {
|
|
d3.select(this).append('label')
|
|
.attr('class', 'form-label member-incomplete')
|
|
.text(t('inspector.incomplete'));
|
|
}
|
|
});
|
|
|
|
$enter.append('input')
|
|
.attr('class', 'member-role')
|
|
.property('type', 'text')
|
|
.attr('maxlength', 255)
|
|
.attr('placeholder', t('inspector.role'))
|
|
.property('value', function(d) { return d.role; })
|
|
.on('change', changeRole);
|
|
|
|
$enter.append('button')
|
|
.attr('tabindex', -1)
|
|
.attr('class', 'remove button-input-action member-delete minor')
|
|
.on('click', deleteMember)
|
|
.append('span')
|
|
.attr('class', 'icon delete');
|
|
|
|
$items.exit()
|
|
.remove();
|
|
}
|
|
}
|
|
|
|
rawMemberEditor.entityID = function(_) {
|
|
if (!arguments.length) return id;
|
|
id = _;
|
|
return rawMemberEditor;
|
|
};
|
|
|
|
return rawMemberEditor;
|
|
};
|