diff --git a/modules/core/validator.js b/modules/core/validator.js index 8c95f2325..141f02c05 100644 --- a/modules/core/validator.js +++ b/modules/core/validator.js @@ -8,6 +8,7 @@ import _uniqWith from 'lodash-es/uniqWith'; import { dispatch as d3_dispatch } from 'd3-dispatch'; +import { geoExtent } from '../geo'; import { osmEntity } from '../osm'; import { utilRebind } from '../util/rebind'; import * as Validations from '../validations/index'; @@ -199,17 +200,19 @@ export function validationIssue(attrs) { }; - this.loc = function() { - if (this.coordinates && Array.isArray(this.coordinates) && this.coordinates.length === 2) { - return this.coordinates; + this.extent = function(resolver) { + if (this.coordinates) { + return geoExtent(this.coordinates); } - /*if (this.entities && this.entities.length > 0) { - if (this.entities[0].loc) { - return this.entities[0].loc; - } - }*/ + if (this.entities && this.entities.length) { + return this.entities.reduce(function(extent, entity) { + return extent.extend(entity.extent(resolver)); + }, geoExtent()); + } + return null; }; + if (this.fixes) { // add a reference in the fixes to the issue for use in fix actions for (var i = 0; i < this.fixes.length; i++) { this.fixes[i].issue = this; diff --git a/modules/ui/entity_issues.js b/modules/ui/entity_issues.js index 2006acb48..afb690386 100644 --- a/modules/ui/entity_issues.js +++ b/modules/ui/entity_issues.js @@ -77,12 +77,13 @@ export function uiEntityIssues(context) { selection.selectAll('.issue') .classed('expanded', function(d, i) { return i === _expanded; }); - var loc = d.loc(); - if (loc) { - context.map().centerZoomEase(loc, Math.max(context.map().zoom(), 18)); - } else if (d.entities && d.entities.length > 0 && - !d.entities[0].intersects(context.map().extent(), context.graph())) { - context.map().zoomToEase(d.entities[0]); + var extent = d.extent(context.graph()); + if (extent) { + var view = context.map().trimmedExtent(); + var zoom = context.map().zoom(); + if (!view.contains(extent) || zoom < 19) { + context.map().centerZoomEase(extent.center(), Math.max(zoom, 19)); + } } }); diff --git a/modules/ui/issues.js b/modules/ui/issues.js index 8dc18175b..9cc9ca7d7 100644 --- a/modules/ui/issues.js +++ b/modules/ui/issues.js @@ -83,16 +83,26 @@ export function uiIssues(context) { .append('li') .attr('class', function (d) { return 'issue severity-' + d.severity; }) .on('click', function(d) { - var loc = d.loc(); - if (loc) { - context.map().centerZoomEase(loc, Math.max(context.map().zoom(), 18)); - } else if (d.entities && d.entities.length > 0) { - context.map().zoomTo(d.entities[0]); - } - if (d.entities) { - var ids = d.entities.map(function(e) { return e.id; }); - context.enter(modeSelect(context, ids)); - utilHighlightEntities(ids, true, context); + var extent = d.extent(context.graph()); + if (extent) { + var msec = 0; + var view = context.map().trimmedExtent(); + var zoom = context.map().zoom(); + + // make sure user can see the issue + if (!view.contains(extent) || zoom < 19) { + msec = 250; + context.map().centerZoomEase(extent.center(), Math.max(zoom, 19), msec); + } + + // select the first entity + if (d.entities && d.entities.length) { + window.setTimeout(function() { + var ids = d.entities.map(function(e) { return e.id; }); + context.enter(modeSelect(context, [ids[0]])); + utilHighlightEntities(ids, true, context); + }, msec); + } } }) .on('mouseover', function(d) { diff --git a/modules/validations/maprules.js b/modules/validations/maprules.js index c5cd87014..23f8d43f4 100644 --- a/modules/validations/maprules.js +++ b/modules/validations/maprules.js @@ -2,7 +2,7 @@ import { services } from '../services'; export function validationMaprules() { - validation.type = 'maprules'; + var type = 'maprules'; var validation = function(entity, context) { @@ -22,5 +22,8 @@ export function validationMaprules() { }; + validation.type = type; + + return validation; }