diff --git a/modules/validations/outdated_tags.js b/modules/validations/outdated_tags.js index 5c66d281b..5f4258373 100644 --- a/modules/validations/outdated_tags.js +++ b/modules/validations/outdated_tags.js @@ -1,6 +1,6 @@ import { t } from '../util/locale'; import { actionUpgradeTags, actionChangeTags, actionChangePreset } from '../actions'; -import { utilDisplayLabel } from '../util'; +import { utilArrayUnion, utilDisplayLabel } from '../util'; import { validationIssue, validationIssueFix } from '../core/validator'; @@ -8,66 +8,79 @@ export function validationOutdatedTags() { var type = 'outdated_tags'; - function missingRecommendedTags(entity, context, graph) { - var preset = context.presets().match(entity, graph); - if (!preset.isFallback() && preset.tags !== preset.addTags) { - return Object.keys(preset.addTags).reduce(function(obj, key) { - if (!entity.tags[key]) { - obj[key] = preset.addTags[key]; - } - return obj; - }, {}); - } - return {}; - } - - var validation = function checkOutdatedTags(entity, context) { - var replacementPresetID = context.presets().match(entity, context.graph()).replacement; - var deprecatedTagsArray = entity.deprecatedTags(); - var missingTags = missingRecommendedTags(entity, context, context.graph()); + var graph = context.graph(); + var oldTags = Object.assign({}, entity.tags); // shallow copy + var preset = context.presets().match(entity, graph); + + // upgrade preset.. + if (preset.replacement) { + var newPreset = context.presets().item(preset.replacement); + graph = actionChangePreset(entity.id, preset, newPreset, true)(graph); // true = skip field defaults + entity = graph.entity(entity.id); + preset = newPreset; + } + + // upgrade tags.. + var deprecatedTags = entity.deprecatedTags(); + if (deprecatedTags.length) { + deprecatedTags.forEach(function(tag) { + graph = actionUpgradeTags(entity.id, tag.old, tag.replace)(graph); + }); + entity = graph.entity(entity.id); + } + + // add missing addTags.. + var newTags = Object.assign({}, entity.tags); // shallow copy + if (preset.tags !== preset.addTags) { + Object.keys(preset.addTags).forEach(function(k) { + if (!newTags[k]) { + newTags[k] = preset.addTags[k]; + } + }); + } + + // determine diff + var keys = utilArrayUnion(Object.keys(oldTags), Object.keys(newTags)).sort(); + var tagDiff = []; + keys.forEach(function(k) { + var oldVal = oldTags[k]; + var newVal = newTags[k]; + + if (oldVal && (!newVal || newVal !== oldVal)) { + tagDiff.push('- ' + k + '=' + oldVal); + } + if (newVal && (!oldVal || newVal !== oldVal)) { + tagDiff.push('+ ' + k + '=' + newVal); + } + }); + + if (!tagDiff.length) return []; - if (!replacementPresetID && deprecatedTagsArray.length === 0 && - Object.keys(missingTags).length === 0) return []; + // debugging (sorta) + var tooltip = '
\n' + tagDiff.join('\n') + '';
+
return [new validationIssue({
type: type,
severity: 'warning',
message: t('issues.outdated_tags.message', { feature: utilDisplayLabel(entity, context) }),
- tooltip: t('issues.outdated_tags.tip'),
+ tooltip: tooltip, // t('issues.outdated_tags.tip'),
entities: [entity],
info: {
- deprecatedTagsArray: deprecatedTagsArray,
- replacementPresetID: replacementPresetID
+ tagDiff: tagDiff,
+ newTags: newTags
},
fixes: [
new validationIssueFix({
auto: true,
title: t('issues.fix.upgrade_tags.title'),
onClick: function() {
- var replacementPresetID = this.issue.info.replacementPresetID;
- var replacementPreset = replacementPresetID && context.presets().item(replacementPresetID);
- var deprecatedTagsArray = this.issue.info.deprecatedTagsArray;
var entityID = this.issue.entities[0].id;
+ var newTags = this.issue.info.newTags;
context.perform(
- function(graph) {
- if (replacementPreset) {
- var oldPreset = context.presets().match(graph.entity(entityID), context.graph());
- graph = actionChangePreset(entityID, oldPreset, replacementPreset, true /* skip field defaults */)(graph);
- deprecatedTagsArray = graph.entity(entityID).deprecatedTags();
- }
- deprecatedTagsArray.forEach(function(deprecatedTags) {
- graph = actionUpgradeTags(entityID, deprecatedTags.old, deprecatedTags.replace)(graph);
- });
- var missingTags = missingRecommendedTags(graph.entity(entityID), context, graph);
- var tags = Object.assign({}, graph.entity(entityID).tags); // shallow copy
- for (var key in missingTags) {
- tags[key] = missingTags[key];
- }
- graph = actionChangeTags(entityID, tags)(graph);
- return graph;
- },
+ actionChangeTags(entityID, newTags),
t('issues.fix.upgrade_tags.annotation')
);
}
@@ -76,6 +89,7 @@ export function validationOutdatedTags() {
})];
};
+
validation.type = type;
return validation;