From b4bc5305a1b0532288bca15591f5c73cf84f1458 Mon Sep 17 00:00:00 2001 From: Quincy Morgan Date: Mon, 3 Feb 2020 12:17:14 -0500 Subject: [PATCH] Enable the issues section for multiple selected features (close #7324) --- modules/core/validator.js | 27 +++++++++++++++++++++++++-- modules/ui/entity_editor.js | 9 ++------- modules/ui/entity_issues.js | 17 +++++++++-------- 3 files changed, 36 insertions(+), 17 deletions(-) diff --git a/modules/core/validator.js b/modules/core/validator.js index 71a7ad1ad..ca1f9bf51 100644 --- a/modules/core/validator.js +++ b/modules/core/validator.js @@ -186,10 +186,28 @@ export function coreValidator(context) { 'disconnected_way', 'impossible_oneway' ]; - validator.getEntityIssues = function(entityID, options) { + // returns the issues that the given entity IDs have in common, matching the given options + validator.getSharedEntityIssues = function(entityIDs, options) { var cache = _headCache; - var issueIDs = cache.issuesByEntityID[entityID]; + var issueIDs; + + // gather the issues that are common to all the entities + entityIDs.forEach(function(entityID) { + var entityIssueIDs = cache.issuesByEntityID[entityID]; + if (!entityIssueIDs) return; + + if (!issueIDs) { + issueIDs = new Set(entityIssueIDs); + } else { + for (let elem of issueIDs) { + if (!entityIssueIDs.has(elem)) { + issueIDs.delete(elem); + } + } + } + }); + if (!issueIDs) return []; var opts = options || {}; @@ -226,6 +244,11 @@ export function coreValidator(context) { }; + validator.getEntityIssues = function(entityID, options) { + return validator.getSharedEntityIssues([entityID], options); + }; + + validator.getRuleKeys = function() { return Object.keys(_rules) .filter(function(key) { return key !== 'maprules'; }) diff --git a/modules/ui/entity_editor.js b/modules/ui/entity_editor.js index 48d83469e..d89c0dc63 100644 --- a/modules/ui/entity_editor.js +++ b/modules/ui/entity_editor.js @@ -109,7 +109,6 @@ export function uiEntityEditor(context) { }, { klass: 'preset-list-item inspector-inner', - shouldHave: true, update: function(section) { section.classed('mixed-types', _activePresets.length > 1); @@ -227,16 +226,14 @@ export function uiEntityEditor(context) { }, { klass: 'entity-issues', - shouldHave: singularEntityID, update: function(section) { section .call(entityIssues - .entityID(singularEntityID) + .entityIDs(_entityIDs) ); } }, { klass: 'preset-editor', - shouldHave: true, update: function(section) { section .call(presetEditor @@ -248,7 +245,6 @@ export function uiEntityEditor(context) { } }, { klass: 'raw-tag-editor inspector-inner', - shouldHave: true, update: function(section) { section .call(rawTagEditor @@ -278,7 +274,6 @@ export function uiEntityEditor(context) { } }, { klass: 'key-trap-wrap', - shouldHave: true, create: function(sectionEnter) { sectionEnter .append('input') @@ -297,7 +292,7 @@ export function uiEntityEditor(context) { ]; sectionInfos = sectionInfos.filter(function(info) { - return info.shouldHave; + return info.shouldHave === undefined || info.shouldHave; }); var sections = body.selectAll('.section') diff --git a/modules/ui/entity_issues.js b/modules/ui/entity_issues.js index 5dece486c..8c7f08ee9 100644 --- a/modules/ui/entity_issues.js +++ b/modules/ui/entity_issues.js @@ -3,13 +3,14 @@ import { event as d3_event, select as d3_select } from 'd3-selection'; import { svgIcon } from '../svg/icon'; import { t } from '../util/locale'; import { uiDisclosure } from './disclosure'; +import { utilArrayIdentical } from '../util/array'; import { utilHighlightEntities } from '../util'; export function uiEntityIssues(context) { var _selection = d3_select(null); var _activeIssueID; - var _entityID; + var _entityIDs = []; // Refresh on validated events context.validator() @@ -36,7 +37,7 @@ export function uiEntityIssues(context) { } function getIssues() { - return context.validator().getEntityIssues(_entityID, { includeDisabledRules: true }); + return context.validator().getSharedEntityIssues(_entityIDs, { includeDisabledRules: true }); } function makeActiveIssue(issueID) { @@ -81,13 +82,13 @@ export function uiEntityIssues(context) { .on('mouseover.highlight', function(d) { // don't hover-highlight the selected entity var ids = d.entityIds - .filter(function(e) { return e !== _entityID; }); + .filter(function(e) { return _entityIDs.indexOf(e) === -1; }); utilHighlightEntities(ids, true, context); }) .on('mouseout.highlight', function(d) { var ids = d.entityIds - .filter(function(e) { return e !== _entityID; }); + .filter(function(e) { return _entityIDs.indexOf(e) === -1; }); utilHighlightEntities(ids, false, context); }); @@ -265,10 +266,10 @@ export function uiEntityIssues(context) { } - entityIssues.entityID = function(val) { - if (!arguments.length) return _entityID; - if (_entityID !== val) { - _entityID = val; + entityIssues.entityIDs = function(val) { + if (!arguments.length) return _entityIDs; + if (!_entityIDs || !val || !utilArrayIdentical(_entityIDs, val)) { + _entityIDs = val; _activeIssueID = null; } return entityIssues;