diff --git a/Makefile b/Makefile index f34805ada..c04c4128a 100644 --- a/Makefile +++ b/Makefile @@ -43,11 +43,15 @@ $(BUILDJS_TARGETS): $(BUILDJS_SOURCES) build.js MODULE_TARGETS = \ - js/lib/id/actions.js + js/lib/id/actions.js \ + js/lib/id/validations.js js/lib/id/actions.js: modules/ node_modules/.bin/rollup -f umd -n iD.actions modules/actions/index.js --no-strict > $@ +js/lib/id/validations.js: modules/ + node_modules/.bin/rollup -f umd -n iD.validations modules/validations/index.js --no-strict > $@ + dist/iD.js: \ js/lib/bootstrap-tooltip.js \ js/lib/d3.v3.js \ @@ -226,11 +230,6 @@ dist/iD.js: \ js/id/presets/collection.js \ js/id/presets/field.js \ js/id/presets/preset.js \ - js/id/validations.js \ - js/id/validations/deprecated_tag.js \ - js/id/validations/many_deletions.js \ - js/id/validations/missing_tag.js \ - js/id/validations/tag_suggests_area.js \ js/id/end.js \ js/lib/locale.js \ data/introGraph.js diff --git a/js/id/validations.js b/js/id/validations.js deleted file mode 100644 index 4bfccb1e4..000000000 --- a/js/id/validations.js +++ /dev/null @@ -1 +0,0 @@ -iD.validations = {}; diff --git a/js/lib/id/actions.js b/js/lib/id/actions.js index b1ae56512..8882a2386 100644 --- a/js/lib/id/actions.js +++ b/js/lib/id/actions.js @@ -8,7 +8,7 @@ return function(graph) { return graph.replace(way); }; - }; + } function AddMember(relationId, member, memberIndex) { return function(graph) { @@ -38,7 +38,7 @@ return graph.replace(relation.addMember(member, memberIndex)); }; - }; + } function AddMidpoint(midpoint, node) { return function(graph) { @@ -62,20 +62,20 @@ return graph; }; - }; + } // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as function AddVertex(wayId, nodeId, index) { return function(graph) { return graph.replace(graph.entity(wayId).addNode(nodeId, index)); }; - }; + } function ChangeMember(relationId, member, memberIndex) { return function(graph) { return graph.replace(graph.entity(relationId).updateMember(member, memberIndex)); }; - }; + } function ChangePreset(entityId, oldPreset, newPreset) { return function(graph) { @@ -88,14 +88,14 @@ return graph.replace(entity.update({tags: tags})); }; - }; + } function ChangeTags(entityId, tags) { return function(graph) { var entity = graph.entity(entityId); return graph.replace(entity.update({tags: tags})); }; - }; + } function Circularize(wayId, projection, maxAngle) { maxAngle = (maxAngle || 20) * Math.PI / 180; @@ -279,7 +279,7 @@ }; return action; - }; + } function DeleteMultiple(ids) { var actions = { @@ -307,7 +307,7 @@ }; return action; - }; + } // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as function DeleteRelation(relationId) { @@ -398,7 +398,7 @@ }; return action; - }; + } // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteNodeAction.as function DeleteNode(nodeId) { @@ -433,7 +433,7 @@ }; return action; - }; + } // Connect the ways at the given nodes. // @@ -476,7 +476,7 @@ return graph; }; - }; + } function CopyEntities(ids, fromGraph) { var copies = {}; @@ -498,7 +498,7 @@ }; return action; - }; + } function DeleteMember(relationId, memberIndex) { return function(graph) { @@ -512,7 +512,7 @@ return graph; }; - }; + } function DeprecateTags(entityId) { return function(graph) { @@ -1168,7 +1168,7 @@ }; return action; - }; + } // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as @@ -1448,7 +1448,7 @@ }; return action; - }; + } // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as diff --git a/js/lib/id/validations.js b/js/lib/id/validations.js new file mode 100644 index 000000000..3aaf8c271 --- /dev/null +++ b/js/lib/id/validations.js @@ -0,0 +1,121 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.iD = global.iD || {}, global.iD.validations = global.iD.validations || {}))); +}(this, function (exports) { 'use strict'; + + function DeprecatedTag() { + + var validation = function(changes) { + var warnings = []; + for (var i = 0; i < changes.created.length; i++) { + var change = changes.created[i], + deprecatedTags = change.deprecatedTags(); + + if (!_.isEmpty(deprecatedTags)) { + var tags = iD.util.tagText({ tags: deprecatedTags }); + warnings.push({ + id: 'deprecated_tags', + message: t('validations.deprecated_tags', { tags: tags }), + entity: change + }); + } + } + return warnings; + }; + + return validation; + } + + function ManyDeletions() { + var threshold = 100; + + var validation = function(changes) { + var warnings = []; + if (changes.deleted.length > threshold) { + warnings.push({ + id: 'many_deletions', + message: t('validations.many_deletions', { n: changes.deleted.length }) + }); + } + return warnings; + }; + + return validation; + } + + function MissingTag() { + + // Slightly stricter check than Entity#isUsed (#3091) + function hasTags(entity, graph) { + return _.without(Object.keys(entity.tags), 'area', 'name').length > 0 || + graph.parentRelations(entity).length > 0; + } + + var validation = function(changes, graph) { + var warnings = []; + for (var i = 0; i < changes.created.length; i++) { + var change = changes.created[i], + geometry = change.geometry(graph); + + if ((geometry === 'point' || geometry === 'line' || geometry === 'area') && !hasTags(change, graph)) { + warnings.push({ + id: 'missing_tag', + message: t('validations.untagged_' + geometry), + tooltip: t('validations.untagged_' + geometry + '_tooltip'), + entity: change + }); + } + } + return warnings; + }; + + return validation; + } + + function TagSuggestsArea() { + + // https://github.com/openstreetmap/josm/blob/mirror/src/org/ + // openstreetmap/josm/data/validation/tests/UnclosedWays.java#L80 + function tagSuggestsArea(tags) { + if (_.isEmpty(tags)) return false; + + var presence = ['landuse', 'amenities', 'tourism', 'shop']; + for (var i = 0; i < presence.length; i++) { + if (tags[presence[i]] !== undefined) { + return presence[i] + '=' + tags[presence[i]]; + } + } + + if (tags.building && tags.building === 'yes') return 'building=yes'; + } + + var validation = function(changes, graph) { + var warnings = []; + for (var i = 0; i < changes.created.length; i++) { + var change = changes.created[i], + geometry = change.geometry(graph), + suggestion = (geometry === 'line' ? tagSuggestsArea(change.tags) : undefined); + + if (suggestion) { + warnings.push({ + id: 'tag_suggests_area', + message: t('validations.tag_suggests_area', { tag: suggestion }), + entity: change + }); + } + } + return warnings; + }; + + return validation; + } + + exports.DeprecatedTag = DeprecatedTag; + exports.ManyDeletions = ManyDeletions; + exports.MissingTag = MissingTag; + exports.TagSuggestsArea = TagSuggestsArea; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); \ No newline at end of file diff --git a/js/id/validations/deprecated_tag.js b/modules/validations/deprecated_tag.js similarity index 93% rename from js/id/validations/deprecated_tag.js rename to modules/validations/deprecated_tag.js index d8b749445..d9ff27c45 100644 --- a/js/id/validations/deprecated_tag.js +++ b/modules/validations/deprecated_tag.js @@ -1,4 +1,4 @@ -iD.validations.DeprecatedTag = function() { +export function DeprecatedTag() { var validation = function(changes) { var warnings = []; @@ -19,4 +19,4 @@ iD.validations.DeprecatedTag = function() { }; return validation; -}; +} diff --git a/modules/validations/index.js b/modules/validations/index.js new file mode 100644 index 000000000..1e8966154 --- /dev/null +++ b/modules/validations/index.js @@ -0,0 +1,4 @@ +export { DeprecatedTag } from './deprecated_tag'; +export { ManyDeletions } from './many_deletions'; +export { MissingTag } from './missing_tag'; +export { TagSuggestsArea } from './tag_suggests_area'; diff --git a/js/id/validations/many_deletions.js b/modules/validations/many_deletions.js similarity index 88% rename from js/id/validations/many_deletions.js rename to modules/validations/many_deletions.js index 96a6ddb85..01b917e62 100644 --- a/js/id/validations/many_deletions.js +++ b/modules/validations/many_deletions.js @@ -1,4 +1,4 @@ -iD.validations.ManyDeletions = function() { +export function ManyDeletions() { var threshold = 100; var validation = function(changes) { @@ -13,4 +13,4 @@ iD.validations.ManyDeletions = function() { }; return validation; -}; +} diff --git a/js/id/validations/missing_tag.js b/modules/validations/missing_tag.js similarity index 95% rename from js/id/validations/missing_tag.js rename to modules/validations/missing_tag.js index 9e3807c46..8477b63ff 100644 --- a/js/id/validations/missing_tag.js +++ b/modules/validations/missing_tag.js @@ -1,4 +1,4 @@ -iD.validations.MissingTag = function() { +export function MissingTag() { // Slightly stricter check than Entity#isUsed (#3091) function hasTags(entity, graph) { @@ -25,4 +25,4 @@ iD.validations.MissingTag = function() { }; return validation; -}; +} diff --git a/js/id/validations/tag_suggests_area.js b/modules/validations/tag_suggests_area.js similarity index 96% rename from js/id/validations/tag_suggests_area.js rename to modules/validations/tag_suggests_area.js index 8c91a7d96..48d085d75 100644 --- a/js/id/validations/tag_suggests_area.js +++ b/modules/validations/tag_suggests_area.js @@ -1,4 +1,4 @@ -iD.validations.TagSuggestsArea = function() { +export function TagSuggestsArea() { // https://github.com/openstreetmap/josm/blob/mirror/src/org/ // openstreetmap/josm/data/validation/tests/UnclosedWays.java#L80 @@ -34,4 +34,4 @@ iD.validations.TagSuggestsArea = function() { }; return validation; -}; +} diff --git a/test/index.html b/test/index.html index f93b5e2b8..f293d4b18 100644 --- a/test/index.html +++ b/test/index.html @@ -42,6 +42,7 @@ + @@ -193,12 +194,6 @@ - - - - - -