modules/ui/sections/changes.js (124 lines of code) (raw):
import { select as d3_select } from 'd3-selection';
import { utilEntityOrMemberSelector } from '@id-sdk/util';
import { presetManager } from '../../presets';
import { fileFetcher } from '../../core/file_fetcher';
import { t } from '../../core/localizer';
import { JXON } from '../../util/jxon';
import { actionDiscardTags } from '../../actions/discard_tags';
import { osmChangeset } from '../../osm';
import { svgIcon } from '../../svg/icon';
import { uiSection } from '../section';
import { utilDetect, utilDisplayName, utilDisplayType } from '../../util';
export function uiSectionChanges(context) {
var detected = utilDetect();
var _discardTags = {};
fileFetcher.get('discarded')
.then(function(d) { _discardTags = d; })
.catch(function() { /* ignore */ });
var section = uiSection('changes-list', context)
.label(function() {
var history = context.history();
var summary = history.difference().summary();
return t('inspector.title_count', { title: t.html('commit.changes'), count: summary.length });
})
.disclosureContent(renderDisclosureContent);
function renderDisclosureContent(selection) {
var history = context.history();
var summary = history.difference().summary();
var container = selection.selectAll('.commit-section')
.data([0]);
var containerEnter = container.enter()
.append('div')
.attr('class', 'commit-section');
containerEnter
.append('ul')
.attr('class', 'changeset-list');
container = containerEnter
.merge(container);
var items = container.select('ul').selectAll('li')
.data(summary);
var itemsEnter = items.enter()
.append('li')
.attr('class', 'change-item');
var buttons = itemsEnter
.append('button')
.on('mouseover', mouseover)
.on('mouseout', mouseout)
.on('click', click);
buttons
.each(function(d) {
d3_select(this)
.call(svgIcon('#iD-icon-' + d.entity.geometry(d.graph), 'pre-text ' + d.changeType));
});
buttons
.append('span')
.attr('class', 'change-type')
.html(function(d) { return t.html('commit.' + d.changeType) + ' '; });
buttons
.append('strong')
.attr('class', 'entity-type')
.html(function(d) {
var matched = presetManager.match(d.entity, d.graph);
return (matched && matched.name()) || utilDisplayType(d.entity.id);
});
buttons
.append('span')
.attr('class', 'entity-name')
.html(function(d) {
var name = utilDisplayName(d.entity) || '',
string = '';
if (name !== '') {
string += ':';
}
return string += ' ' + name;
});
items = itemsEnter
.merge(items);
// Download changeset link
var changeset = new osmChangeset().update({ id: undefined });
var changes = history.changes(actionDiscardTags(history.difference(), _discardTags));
delete changeset.id; // Export without chnageset_id
var data = JXON.stringify(changeset.osmChangeJXON(changes));
var blob = new Blob([data], {type: 'text/xml;charset=utf-8;'});
var fileName = 'changes.osc';
var linkEnter = container.selectAll('.download-changes')
.data([0])
.enter()
.append('a')
.attr('class', 'download-changes');
if (detected.download) { // All except IE11 and Edge
linkEnter // download the data as a file
.attr('href', window.URL.createObjectURL(blob))
.attr('download', fileName);
} else { // IE11 and Edge
linkEnter // open data uri in a new tab
.attr('target', '_blank')
.on('click.download', function() {
navigator.msSaveBlob(blob, fileName);
});
}
linkEnter
.call(svgIcon('#iD-icon-load', 'inline'))
.append('span')
.html(t.html('commit.download_changes'));
function mouseover(d) {
if (d.entity) {
context.surface().selectAll(
utilEntityOrMemberSelector([d.entity.id], context.graph())
).classed('hover', true);
}
}
function mouseout() {
context.surface().selectAll('.hover')
.classed('hover', false);
}
function click(d3_event, change) {
if (change.changeType !== 'deleted') {
var entity = change.entity;
context.map().zoomToEase(entity);
context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph()))
.classed('hover', true);
}
}
}
return section;
}