mirror of
https://github.com/FoggedLens/iD.git
synced 2026-02-13 17:23:02 +00:00
181 lines
5.9 KiB
JavaScript
181 lines
5.9 KiB
JavaScript
import _debounce from 'lodash-es/debounce';
|
|
|
|
import { svgIcon } from '../../svg/icon';
|
|
import { prefs } from '../../core/preferences';
|
|
import { t } from '../../core/localizer';
|
|
import { uiSection } from '../section';
|
|
|
|
export function uiSectionValidationStatus(context) {
|
|
|
|
var section = uiSection('issues-status', context)
|
|
.content(renderContent)
|
|
.shouldDisplay(function() {
|
|
var issues = context.validator().getIssues(getOptions());
|
|
return issues.length === 0;
|
|
});
|
|
|
|
function getOptions() {
|
|
return {
|
|
what: prefs('validate-what') || 'edited',
|
|
where: prefs('validate-where') || 'all'
|
|
};
|
|
}
|
|
|
|
function renderContent(selection) {
|
|
|
|
var box = selection.selectAll('.box')
|
|
.data([0]);
|
|
|
|
var boxEnter = box.enter()
|
|
.append('div')
|
|
.attr('class', 'box');
|
|
|
|
boxEnter
|
|
.append('div')
|
|
.call(svgIcon('#iD-icon-apply', 'pre-text'));
|
|
|
|
var noIssuesMessage = boxEnter
|
|
.append('span');
|
|
|
|
noIssuesMessage
|
|
.append('strong')
|
|
.attr('class', 'message');
|
|
|
|
noIssuesMessage
|
|
.append('br');
|
|
|
|
noIssuesMessage
|
|
.append('span')
|
|
.attr('class', 'details');
|
|
|
|
renderIgnoredIssuesReset(selection);
|
|
setNoIssuesText(selection);
|
|
}
|
|
|
|
function renderIgnoredIssuesReset(selection) {
|
|
|
|
var ignoredIssues = context.validator()
|
|
.getIssues({ what: 'all', where: 'all', includeDisabledRules: true, includeIgnored: 'only' });
|
|
|
|
var resetIgnored = selection.selectAll('.reset-ignored')
|
|
.data(ignoredIssues.length ? [0] : []);
|
|
|
|
// exit
|
|
resetIgnored.exit()
|
|
.remove();
|
|
|
|
// enter
|
|
var resetIgnoredEnter = resetIgnored.enter()
|
|
.append('div')
|
|
.attr('class', 'reset-ignored section-footer');
|
|
|
|
resetIgnoredEnter
|
|
.append('a')
|
|
.attr('href', '#');
|
|
|
|
// update
|
|
resetIgnored = resetIgnored
|
|
.merge(resetIgnoredEnter);
|
|
|
|
resetIgnored.select('a')
|
|
.html(t.html('inspector.title_count', { title: { html: t.html('issues.reset_ignored') }, count: ignoredIssues.length }));
|
|
|
|
resetIgnored.on('click', function(d3_event) {
|
|
d3_event.preventDefault();
|
|
context.validator().resetIgnoredIssues();
|
|
});
|
|
}
|
|
|
|
function setNoIssuesText(selection) {
|
|
|
|
var opts = getOptions();
|
|
|
|
function checkForHiddenIssues(cases) {
|
|
for (var type in cases) {
|
|
var hiddenOpts = cases[type];
|
|
var hiddenIssues = context.validator().getIssues(hiddenOpts);
|
|
if (hiddenIssues.length) {
|
|
selection.select('.box .details')
|
|
.html('')
|
|
.call(t.append(
|
|
'issues.no_issues.hidden_issues.' + type,
|
|
{ count: hiddenIssues.length.toString() }
|
|
));
|
|
return;
|
|
}
|
|
}
|
|
selection.select('.box .details')
|
|
.html('')
|
|
.call(t.append('issues.no_issues.hidden_issues.none'));
|
|
}
|
|
|
|
var messageType;
|
|
|
|
if (opts.what === 'edited' && opts.where === 'visible') {
|
|
|
|
messageType = 'edits_in_view';
|
|
|
|
checkForHiddenIssues({
|
|
elsewhere: { what: 'edited', where: 'all' },
|
|
everything_else: { what: 'all', where: 'visible' },
|
|
disabled_rules: { what: 'edited', where: 'visible', includeDisabledRules: 'only' },
|
|
everything_else_elsewhere: { what: 'all', where: 'all' },
|
|
disabled_rules_elsewhere: { what: 'edited', where: 'all', includeDisabledRules: 'only' },
|
|
ignored_issues: { what: 'edited', where: 'visible', includeIgnored: 'only' },
|
|
ignored_issues_elsewhere: { what: 'edited', where: 'all', includeIgnored: 'only' }
|
|
});
|
|
|
|
} else if (opts.what === 'edited' && opts.where === 'all') {
|
|
|
|
messageType = 'edits';
|
|
|
|
checkForHiddenIssues({
|
|
everything_else: { what: 'all', where: 'all' },
|
|
disabled_rules: { what: 'edited', where: 'all', includeDisabledRules: 'only' },
|
|
ignored_issues: { what: 'edited', where: 'all', includeIgnored: 'only' }
|
|
});
|
|
|
|
} else if (opts.what === 'all' && opts.where === 'visible') {
|
|
|
|
messageType = 'everything_in_view';
|
|
|
|
checkForHiddenIssues({
|
|
elsewhere: { what: 'all', where: 'all' },
|
|
disabled_rules: { what: 'all', where: 'visible', includeDisabledRules: 'only' },
|
|
disabled_rules_elsewhere: { what: 'all', where: 'all', includeDisabledRules: 'only' },
|
|
ignored_issues: { what: 'all', where: 'visible', includeIgnored: 'only' },
|
|
ignored_issues_elsewhere: { what: 'all', where: 'all', includeIgnored: 'only' }
|
|
});
|
|
} else if (opts.what === 'all' && opts.where === 'all') {
|
|
|
|
messageType = 'everything';
|
|
|
|
checkForHiddenIssues({
|
|
disabled_rules: { what: 'all', where: 'all', includeDisabledRules: 'only' },
|
|
ignored_issues: { what: 'all', where: 'all', includeIgnored: 'only' }
|
|
});
|
|
}
|
|
|
|
if (opts.what === 'edited' && context.history().difference().summary().length === 0) {
|
|
messageType = 'no_edits';
|
|
}
|
|
|
|
selection.select('.box .message')
|
|
.html('')
|
|
.call(t.append('issues.no_issues.message.' + messageType));
|
|
|
|
}
|
|
|
|
context.validator().on('validated.uiSectionValidationStatus', function() {
|
|
window.requestIdleCallback(section.reRender);
|
|
});
|
|
|
|
context.map().on('move.uiSectionValidationStatus',
|
|
_debounce(function() {
|
|
window.requestIdleCallback(section.reRender);
|
|
}, 1000)
|
|
);
|
|
|
|
return section;
|
|
}
|