mirror of
https://github.com/FoggedLens/iD.git
synced 2026-02-14 17:52:55 +00:00
128 lines
4.2 KiB
JavaScript
128 lines
4.2 KiB
JavaScript
import { Browse, Select } from '../modes/index';
|
|
import { ChangeMember, DeleteMember } from '../actions/index';
|
|
import { Disclosure } from './disclosure';
|
|
import { Entity } from '../core/index';
|
|
import { Icon } from '../svg/index';
|
|
import { displayName } from '../util/index';
|
|
|
|
export function RawMemberEditor(context) {
|
|
var id;
|
|
|
|
function selectMember(d) {
|
|
d3.event.preventDefault();
|
|
context.enter(Select(context, [d.id]));
|
|
}
|
|
|
|
function changeRole(d) {
|
|
var role = d3.select(this).property('value');
|
|
var member = {id: d.id, type: d.type, role: role};
|
|
context.perform(
|
|
ChangeMember(d.relation.id, member, d.index),
|
|
t('operations.change_role.annotation'));
|
|
}
|
|
|
|
function deleteMember(d) {
|
|
context.perform(
|
|
DeleteMember(d.relation.id, d.index),
|
|
t('operations.delete_member.annotation'));
|
|
|
|
if (!context.hasEntity(d.relation.id)) {
|
|
context.enter(Browse(context));
|
|
}
|
|
}
|
|
|
|
function rawMemberEditor(selection) {
|
|
var entity = context.entity(id),
|
|
memberships = [];
|
|
|
|
entity.members.forEach(function(member, index) {
|
|
memberships.push({
|
|
index: index,
|
|
id: member.id,
|
|
type: member.type,
|
|
role: member.role,
|
|
relation: entity,
|
|
member: context.hasEntity(member.id)
|
|
});
|
|
});
|
|
|
|
selection.call(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 Entity.key(d.relation) + ',' + d.index + ',' +
|
|
(d.member ? Entity.key(d.member) : 'incomplete');
|
|
});
|
|
|
|
var $enter = $items.enter().append('li')
|
|
.attr('class', 'member-row form-field')
|
|
.classed('member-incomplete', function(d) { return !d.member; });
|
|
|
|
$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 displayName(d.member); });
|
|
|
|
} else {
|
|
d3.select(this).append('label')
|
|
.attr('class', 'form-label')
|
|
.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)
|
|
.call(Icon('#operation-delete'));
|
|
|
|
$items.exit()
|
|
.remove();
|
|
}
|
|
}
|
|
|
|
rawMemberEditor.entityID = function(_) {
|
|
if (!arguments.length) return id;
|
|
id = _;
|
|
return rawMemberEditor;
|
|
};
|
|
|
|
return rawMemberEditor;
|
|
}
|