modules/validations/private_data.js (113 lines of code) (raw):
import { actionChangeTags } from '../actions/change_tags';
import { t } from '../util/locale';
import { utilDisplayLabel, utilTagDiff } from '../util';
import { validationIssue, validationIssueFix } from '../core/validation';
export function validationPrivateData() {
var type = 'private_data';
// assume that some buildings are private
var privateBuildingValues = {
detached: true,
farm: true,
house: true,
houseboat: true,
residential: true,
semidetached_house: true,
static_caravan: true
};
// but they might be public if they have one of these other tags
var publicKeys = {
amenity: true,
craft: true,
historic: true,
leisure: true,
office: true,
shop: true,
tourism: true
};
// these tags may contain personally identifying info
var personalTags = {
'contact:email': true,
'contact:fax': true,
'contact:phone': true,
email: true,
fax: true,
phone: true
};
var validation = function checkPrivateData(entity) {
var tags = entity.tags;
if (!tags.building || !privateBuildingValues[tags.building]) return [];
var keepTags = {};
for (var k in tags) {
if (publicKeys[k]) return []; // probably a public feature
if (!personalTags[k]) {
keepTags[k] = tags[k];
}
}
var tagDiff = utilTagDiff(tags, keepTags);
if (!tagDiff.length) return [];
var fixID = tagDiff.length === 1 ? 'remove_tag' : 'remove_tags';
return [new validationIssue({
type: type,
severity: 'warning',
message: showMessage,
reference: showReference,
entityIds: [entity.id],
dynamicFixes: function() {
return [
new validationIssueFix({
icon: 'iD-operation-delete',
title: t('issues.fix.' + fixID + '.title'),
onClick: function(context) {
context.perform(doUpgrade, t('issues.fix.upgrade_tags.annotation'));
}
})
];
}
})];
function doUpgrade(graph) {
var currEntity = graph.hasEntity(entity.id);
if (!currEntity) return graph;
var newTags = Object.assign({}, currEntity.tags); // shallow copy
tagDiff.forEach(function(diff) {
if (diff.type === '-') {
delete newTags[diff.key];
} else if (diff.type === '+') {
newTags[diff.key] = diff.newVal;
}
});
return actionChangeTags(currEntity.id, newTags)(graph);
}
function showMessage(context) {
var currEntity = context.hasEntity(this.entityIds[0]);
if (!currEntity) return '';
return t('issues.private_data.contact.message',
{ feature: utilDisplayLabel(currEntity, context) }
);
}
function showReference(selection) {
var enter = selection.selectAll('.issue-reference')
.data([0])
.enter();
enter
.append('div')
.attr('class', 'issue-reference')
.text(t('issues.private_data.reference'));
enter
.append('strong')
.text(t('issues.suggested'));
enter
.append('table')
.attr('class', 'tagDiff-table')
.selectAll('.tagDiff-row')
.data(tagDiff)
.enter()
.append('tr')
.attr('class', 'tagDiff-row')
.append('td')
.attr('class', function(d) {
var klass = d.type === '+' ? 'add' : 'remove';
return 'tagDiff-cell tagDiff-cell-' + klass;
})
.text(function(d) { return d.display; });
}
};
validation.type = type;
return validation;
}