diff --git a/modules/core/validator.js b/modules/core/validator.js index 6fb066533..1ccce6aec 100644 --- a/modules/core/validator.js +++ b/modules/core/validator.js @@ -36,9 +36,9 @@ export function coreValidator(context) { } } - self.featureApplicabilityOptions = ['edited', 'all']; + //self.featureApplicabilityOptions = ['edited', 'all']; - var featureApplicability = context.storage('issue-features') || 'edited'; + /*var featureApplicability = context.storage('issue-features') || 'edited'; self.getFeatureApplicability = function() { return featureApplicability; @@ -47,7 +47,7 @@ export function coreValidator(context) { self.setFeatureApplicability = function(applicability) { featureApplicability = applicability; context.storage('issue-features', applicability); - }; + };*/ self.getIssues = function() { return issues; @@ -180,7 +180,7 @@ export function validationIssue(attrs) { return osmEntity.key(entity); }); // factor in the entities this issue is for - id += entityKeys.join(); + id += entityKeys.sort().join(); if (this.coordinates) { // factor in coordinates since two separate issues can have an // idential type and entities, e.g. in crossing_ways diff --git a/modules/ui/issues.js b/modules/ui/issues.js index a619b07a0..0343f4dbb 100644 --- a/modules/ui/issues.js +++ b/modules/ui/issues.js @@ -16,7 +16,7 @@ import { uiTooltipHtml } from './tooltipHtml'; export function uiIssues(context) { var key = t('issues.key'); - var _featureApplicabilityList = d3_select(null); + //var _featureApplicabilityList = d3_select(null); var _errorsList = d3_select(null), _warningsList = d3_select(null); var pane = d3_select(null); @@ -24,7 +24,7 @@ export function uiIssues(context) { context.validator().on('reload.issues_pane', update); - function renderIssuesOptions(selection) { + /*function renderIssuesOptions(selection) { var container = selection.selectAll('.issues-options-container') .data([0]); @@ -42,7 +42,7 @@ export function uiIssues(context) { .merge(_featureApplicabilityList); updateFeatureApplicabilityList(); - } + }*/ function renderErrorsList(selection) { _errorsList = selection.selectAll('.errors-list') @@ -68,7 +68,7 @@ export function uiIssues(context) { updateWarningsList(); } - function drawListItems(selection, data, type, name, change, active) { + /*function drawListItems(selection, data, type, name, change, active) { var items = selection.selectAll('li') .data(data); @@ -109,7 +109,7 @@ export function uiIssues(context) { .classed('active', active) .selectAll('input') .property('checked', active); - } + }*/ function drawIssuesList(selection, issues) { @@ -186,7 +186,7 @@ export function uiIssues(context) { noIssuesLabel.append('span') .text(t('issues.no_issues.info')); } - + /* function showsFeatureApplicability(d) { return context.validator().getFeatureApplicability() === d; } @@ -206,7 +206,7 @@ export function uiIssues(context) { setFeatureApplicability, showsFeatureApplicability ); - } + }*/ function updateErrorsList() { var errors = context.validator().getErrors(); @@ -226,7 +226,7 @@ export function uiIssues(context) { pane.select('.issues-errors').classed('hide', errors.length === 0); if (errors.length > 0) { pane.select('.hide-toggle-issues_errors .hide-toggle-text') - .text(t('issues.errors.list_title', { count: errors.length })) + .text(t('issues.errors.list_title', { count: errors.length })); if (!pane.select('.disclosure-wrap-issues_errors').classed('hide')) { updateErrorsList(); } @@ -236,7 +236,7 @@ export function uiIssues(context) { pane.select('.issues-warnings').classed('hide', warnings.length === 0); if (warnings.length > 0) { pane.select('.hide-toggle-issues_warnings .hide-toggle-text') - .text(t('issues.warnings.list_title', { count: warnings.length })) + .text(t('issues.warnings.list_title', { count: warnings.length })); if (!pane.select('.disclosure-wrap-issues_warnings').classed('hide')) { updateWarningsList(); } @@ -328,7 +328,7 @@ export function uiIssues(context) { content .append('div') .attr('class', 'issues-none') - .call(renderNoIssuesBox) + .call(renderNoIssuesBox); // errors content diff --git a/modules/validations/crossing_ways.js b/modules/validations/crossing_ways.js index 99265ded4..717fb313d 100644 --- a/modules/validations/crossing_ways.js +++ b/modules/validations/crossing_ways.js @@ -191,7 +191,7 @@ export function validationCrossingWays() { if (highwaysDisallowingFords.has(entity1.tags.highway) || highwaysDisallowingFords.has(entity2.tags.highway)) { - // do not allow fords on major highways + // do not allow fords on major highways return null; } return { ford: 'yes' }; @@ -278,96 +278,97 @@ export function validationCrossingWays() { } return []; })); - for (var i = 0; i < waysToCheck.length; i++) { - var crosses = findCrossingsByWay(waysToCheck[i], graph, tree, edgePairsVisited); - for (var j = 0; j < crosses.length; j++) { - var crossing = crosses[j]; + var crossings = waysToCheck.reduce(function(array, way) { + return array.concat(findCrossingsByWay(way, graph, tree, edgePairsVisited)); + }, []); + for (var j in crossings) { + var crossing = crossings[j]; - // use the entities with the tags that define the feature type - var entities = crossing.ways.sort(function(entity1, entity2) { - var type1 = getFeatureTypeForCrossingCheck(entity1, graph); - var type2 = getFeatureTypeForCrossingCheck(entity2, graph); - if (type1 === type2) { - return utilDisplayLabel(entity1, context) > utilDisplayLabel(entity2, context); - } else if (type1 === 'waterway') { - return true; - } else if (type2 === 'waterway') { - return false; - } - return type1 < type2; - }); - entities = _map(entities, function(way) { - return getFeatureWithFeatureTypeTagsForWay(way, graph); - }); - - var connectionTags = tagsForConnectionNodeIfAllowed(entities[0], entities[1]); - - var crossingTypeID; - if (hasTag(entities[0].tags, 'tunnel') && hasTag(entities[1].tags, 'tunnel')) { - crossingTypeID = 'tunnel-tunnel'; - if (connectionTags) { - crossingTypeID += '_connectable'; - } - } - else if (hasTag(entities[0].tags, 'bridge') && hasTag(entities[1].tags, 'bridge')) { - crossingTypeID = 'bridge-bridge'; - if (connectionTags) { - crossingTypeID += '_connectable'; - } - } - else { - crossingTypeID = crossing.featureTypes.sort().join('-'); + // use the entities with the tags that define the feature type + var entities = crossing.ways.sort(function(entity1, entity2) { + var type1 = getFeatureTypeForCrossingCheck(entity1, graph); + var type2 = getFeatureTypeForCrossingCheck(entity2, graph); + if (type1 === type2) { + return utilDisplayLabel(entity1, context) > utilDisplayLabel(entity2, context); + } else if (type1 === 'waterway') { + return true; + } else if (type2 === 'waterway') { + return false; } + return type1 < type2; + }); + entities = _map(entities, function(way) { + return getFeatureWithFeatureTypeTagsForWay(way, graph); + }); - var messageDict = { - feature: utilDisplayLabel(entities[0], context), - feature2: utilDisplayLabel(entities[1], context) - }; + var connectionTags = tagsForConnectionNodeIfAllowed(entities[0], entities[1]); - var fixes = []; + var crossingTypeID; + if (hasTag(entities[0].tags, 'tunnel') && hasTag(entities[1].tags, 'tunnel')) { + crossingTypeID = 'tunnel-tunnel'; if (connectionTags) { - fixes.push(new validationIssueFix({ - title: t('issues.fix.add_connection_vertex.title'), - onClick: function() { - var loc = this.issue.coordinates; - var ways = this.issue.info.ways; - - context.perform( - function actionConnectCrossingWays(graph) { - var projection = context.projection; - - var node = osmNode({ loc: loc, tags: connectionTags }); - graph = graph.replace(node); - - var way0 = graph.entity(ways[0].id); - var choice0 = geoChooseEdge(graph.childNodes(way0), projection(loc), projection); - var edge0 = [way0.nodes[choice0.index - 1], way0.nodes[choice0.index]]; - graph = actionAddMidpoint({loc: loc, edge: edge0}, node)(graph); - - var way1 = graph.entity(ways[1].id); - var choice1 = geoChooseEdge(graph.childNodes(way1), projection(loc), projection); - var edge1 = [way1.nodes[choice1.index - 1], way1.nodes[choice1.index]]; - graph = actionAddMidpoint({loc: loc, edge: edge1}, node)(graph); - - return graph; - }, - t('issues.fix.add_connection_vertex.undo_redo') - ); - } - })); + crossingTypeID += '_connectable'; } + } + else if (hasTag(entities[0].tags, 'bridge') && hasTag(entities[1].tags, 'bridge')) { + crossingTypeID = 'bridge-bridge'; + if (connectionTags) { + crossingTypeID += '_connectable'; + } + } + else { + crossingTypeID = crossing.featureTypes.sort().join('-'); + } - issues.push(new validationIssue({ - type: 'crossing_ways', - severity: 'warning', - message: t('issues.crossing_ways.message', messageDict), - tooltip: t('issues.crossing_ways.'+crossingTypeID+'.tip'), - entities: entities, - info: {'ways': crossing.ways}, - coordinates: crossing.cross_point, - fixes: fixes + var messageDict = { + feature: utilDisplayLabel(entities[0], context), + feature2: utilDisplayLabel(entities[1], context) + }; + + var fixes = []; + if (connectionTags) { + fixes.push(new validationIssueFix({ + title: t('issues.fix.add_connection_vertex.title'), + onClick: function() { + var loc = this.issue.coordinates; + var ways = this.issue.info.ways; + var connectionTags = this.issue.info.connectionTags; + + context.perform( + function actionConnectCrossingWays(graph) { + var projection = context.projection; + + var node = osmNode({ loc: loc, tags: connectionTags }); + graph = graph.replace(node); + + var way0 = graph.entity(ways[0].id); + var choice0 = geoChooseEdge(graph.childNodes(way0), projection(loc), projection); + var edge0 = [way0.nodes[choice0.index - 1], way0.nodes[choice0.index]]; + graph = actionAddMidpoint({loc: loc, edge: edge0}, node)(graph); + + var way1 = graph.entity(ways[1].id); + var choice1 = geoChooseEdge(graph.childNodes(way1), projection(loc), projection); + var edge1 = [way1.nodes[choice1.index - 1], way1.nodes[choice1.index]]; + graph = actionAddMidpoint({loc: loc, edge: edge1}, node)(graph); + + return graph; + }, + t('issues.fix.add_connection_vertex.undo_redo') + ); + } })); } + + issues.push(new validationIssue({ + type: 'crossing_ways', + severity: 'warning', + message: t('issues.crossing_ways.message', messageDict), + tooltip: t('issues.crossing_ways.'+crossingTypeID+'.tip'), + entities: entities, + info: { ways: crossing.ways, connectionTags: connectionTags }, + coordinates: crossing.cross_point, + fixes: fixes + })); } return issues; diff --git a/test/index.html b/test/index.html index c69a406a4..66bf09be9 100644 --- a/test/index.html +++ b/test/index.html @@ -144,13 +144,13 @@ - + - + - +