mirror of
https://github.com/FoggedLens/iD.git
synced 2026-02-13 01:02:58 +00:00
Refactor validations
This commit is contained in:
3
Makefile
3
Makefile
@@ -89,7 +89,8 @@ dist/iD.js: \
|
||||
js/id/ui/intro/*.js \
|
||||
js/id/presets.js \
|
||||
js/id/presets/*.js \
|
||||
js/id/validate.js \
|
||||
js/id/validations.js \
|
||||
js/id/validations/*.js \
|
||||
js/id/end.js \
|
||||
js/lib/locale.js \
|
||||
data/introGraph.js
|
||||
|
||||
@@ -233,7 +233,11 @@
|
||||
<script src='js/id/presets/collection.js'></script>
|
||||
<script src='js/id/presets/field.js'></script>
|
||||
|
||||
<script src='js/id/validate.js'></script>
|
||||
<script src='js/id/validations.js'></script>
|
||||
<script src='js/id/validations/deprecated_tag.js'></script>
|
||||
<script src='js/id/validations/many_deletions.js'></script>
|
||||
<script src='js/id/validations/missing_tag.js'></script>
|
||||
<script src='js/id/validations/tag_suggests_area.js'></script>
|
||||
|
||||
<script src='js/lib/locale.js'></script>
|
||||
<script src='data/introGraph.js'></script>
|
||||
|
||||
@@ -164,6 +164,13 @@ iD.History = function(context) {
|
||||
};
|
||||
},
|
||||
|
||||
validate: function(changes) {
|
||||
return _(iD.validations)
|
||||
.map(function(fn) { return fn()(changes, stack[index].graph); })
|
||||
.flatten()
|
||||
.value();
|
||||
},
|
||||
|
||||
hasChanges: function() {
|
||||
return this.difference().length() > 0;
|
||||
},
|
||||
|
||||
@@ -52,7 +52,7 @@ iD.ui.Commit = function(context) {
|
||||
|
||||
// Warnings
|
||||
var warnings = body.selectAll('div.warning-section')
|
||||
.data([iD.validate(changes, context.graph())])
|
||||
.data([context.history().validate(changes)])
|
||||
.enter()
|
||||
.append('div')
|
||||
.attr('class', 'modal-section warning-section fillL2')
|
||||
|
||||
@@ -1,53 +0,0 @@
|
||||
iD.validate = function(changes, graph) {
|
||||
var warnings = [];
|
||||
|
||||
// https://github.com/openstreetmap/josm/blob/mirror/src/org/
|
||||
// openstreetmap/josm/data/validation/tests/UnclosedWays.java#L80
|
||||
function tagSuggestsArea(change) {
|
||||
if (_.isEmpty(change.tags)) return false;
|
||||
var tags = change.tags;
|
||||
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';
|
||||
}
|
||||
|
||||
if (changes.deleted.length > 100) {
|
||||
warnings.push({
|
||||
message: t('validations.many_deletions', { n: changes.deleted.length })
|
||||
});
|
||||
}
|
||||
|
||||
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') && !change.isUsed(graph)) {
|
||||
warnings.push({
|
||||
message: t('validations.untagged_' + geometry),
|
||||
tooltip: t('validations.untagged_' + geometry + '_tooltip'),
|
||||
entity: change
|
||||
});
|
||||
}
|
||||
|
||||
var deprecatedTags = change.deprecatedTags();
|
||||
if (!_.isEmpty(deprecatedTags)) {
|
||||
warnings.push({
|
||||
message: t('validations.deprecated_tags', {
|
||||
tags: iD.util.tagText({ tags: deprecatedTags })
|
||||
}), entity: change });
|
||||
}
|
||||
|
||||
if (geometry === 'line' && tagSuggestsArea(change)) {
|
||||
warnings.push({
|
||||
message: t('validations.tag_suggests_area', {tag: tagSuggestsArea(change)}),
|
||||
entity: change
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return warnings;
|
||||
};
|
||||
1
js/id/validations.js
Normal file
1
js/id/validations.js
Normal file
@@ -0,0 +1 @@
|
||||
iD.validations = {};
|
||||
22
js/id/validations/deprecated_tag.js
Normal file
22
js/id/validations/deprecated_tag.js
Normal file
@@ -0,0 +1,22 @@
|
||||
iD.validations.DeprecatedTag = function() {
|
||||
|
||||
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;
|
||||
};
|
||||
16
js/id/validations/many_deletions.js
Normal file
16
js/id/validations/many_deletions.js
Normal file
@@ -0,0 +1,16 @@
|
||||
iD.validations.ManyDeletions = function() {
|
||||
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;
|
||||
};
|
||||
22
js/id/validations/missing_tag.js
Normal file
22
js/id/validations/missing_tag.js
Normal file
@@ -0,0 +1,22 @@
|
||||
iD.validations.MissingTag = function() {
|
||||
|
||||
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') && !change.isUsed(graph)) {
|
||||
warnings.push({
|
||||
id: 'missing_tag',
|
||||
message: t('validations.untagged_' + geometry),
|
||||
tooltip: t('validations.untagged_' + geometry + '_tooltip'),
|
||||
entity: change
|
||||
});
|
||||
}
|
||||
}
|
||||
return warnings;
|
||||
};
|
||||
|
||||
return validation;
|
||||
};
|
||||
37
js/id/validations/tag_suggests_area.js
Normal file
37
js/id/validations/tag_suggests_area.js
Normal file
@@ -0,0 +1,37 @@
|
||||
iD.validations.TagSuggestsArea = function() {
|
||||
|
||||
// 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;
|
||||
};
|
||||
@@ -212,7 +212,11 @@
|
||||
<script src='../js/id/util/session_mutex.js'></script>
|
||||
<script src='../js/id/util/suggest_names.js'></script>
|
||||
|
||||
<script src='../js/id/validate.js'></script>
|
||||
<script src='../js/id/validations.js'></script>
|
||||
<script src='../js/id/validations/deprecated_tag.js'></script>
|
||||
<script src='../js/id/validations/many_deletions.js'></script>
|
||||
<script src='../js/id/validations/missing_tag.js'></script>
|
||||
<script src='../js/id/validations/tag_suggests_area.js'></script>
|
||||
|
||||
<script src='../js/lib/locale.js'></script>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user