modules/ui/contributors.js (64 lines of code) (raw):

import _debounce from 'lodash-es/debounce'; import { select as d3_select } from 'd3-selection'; import { t } from '../core/localizer'; import { svgIcon } from '../svg/index'; export function uiContributors(context) { var osm = context.connection(), debouncedUpdate = _debounce(function() { update(); }, 1000), limit = 4, hidden = false, wrap = d3_select(null); function update() { if (!osm) return; var users = {}, entities = context.history().intersects(context.map().extent()); entities.forEach(function(entity) { if (entity && entity.user) users[entity.user] = true; }); var u = Object.keys(users), subset = u.slice(0, u.length > limit ? limit - 1 : limit); wrap.html('') .call(svgIcon('#iD-icon-nearby', 'pre-text light')); var userList = d3_select(document.createElement('span')); userList.selectAll() .data(subset) .enter() .append('a') .attr('class', 'user-link') .attr('href', function(d) { return osm.userURL(d); }) .attr('target', '_blank') .html(String); if (u.length > limit) { var count = d3_select(document.createElement('span')); var othersNum = u.length - limit + 1; count.append('a') .attr('target', '_blank') .attr('href', function() { return osm.changesetsURL(context.map().center(), context.map().zoom()); }) .html(othersNum); wrap.append('span') .html(t.html('contributors.truncated_list', { n: othersNum, users: userList.html(), count: count.html() })); } else { wrap.append('span') .html(t.html('contributors.list', { users: userList.html() })); } if (!u.length) { hidden = true; wrap .transition() .style('opacity', 0); } else if (hidden) { wrap .transition() .style('opacity', 1); } } return function(selection) { if (!osm) return; wrap = selection; update(); osm.on('loaded.contributors', debouncedUpdate); context.map().on('move.contributors', debouncedUpdate); }; }