refactor validation modules to not inject html

This commit is contained in:
Martin Raifer
2022-06-24 12:48:46 +02:00
parent 6626ea0682
commit 8bb1d39431
20 changed files with 73 additions and 68 deletions
+1 -1
View File
@@ -66,7 +66,7 @@ export function validationIssue(attrs) {
if (issue.severity === 'warning') {
// allow ignoring any issue that's not an error
fixes.push(new validationIssueFix({
title: t.html('issues.fix.ignore_issue.title'),
title: t.append('issues.fix.ignore_issue.title'),
icon: 'iD-icon-close',
onClick: function() {
context.validator().ignoreIssue(this.issue.id);
+5 -2
View File
@@ -1,3 +1,5 @@
import { select as d3_select } from 'd3-selection';
import { t } from '../core/localizer';
import { svgIcon } from '../svg/icon';
import { uiTooltip } from './tooltip';
@@ -89,8 +91,9 @@ export function uiCommitWarnings(context) {
.merge(items);
items.selectAll('.issue-message')
.html(function(d) {
return d.message(context);
.text('')
.each(function(d) {
return d.message(context)(d3_select(this));
});
}
}
+2 -2
View File
@@ -205,7 +205,6 @@ export function uiConflicts(context) {
.data(['previous', 'next'])
.enter()
.append('button')
.html(function(d) { return t.html('save.conflict.' + d); })
.attr('class', 'conflict-nav-button action col6')
.attr('disabled', function(d, i) {
return (i === 0 && index === 0) ||
@@ -223,7 +222,8 @@ export function uiConflicts(context) {
container
.call(showConflict, index + sign);
});
})
.call(function(d) { t.append('save.conflict.' + d)(d3_select(this)); });
}
+4 -3
View File
@@ -180,8 +180,9 @@ export function uiSectionEntityIssues(context) {
.classed('active', function(d) { return d.id === _activeIssueID; });
containers.selectAll('.issue-message')
.html(function(d) {
return d.message(context);
.text('')
.each(function(d) {
return d.message(context)(d3_select(this));
});
// fixes
@@ -242,7 +243,7 @@ export function uiSectionEntityIssues(context) {
buttons
.append('span')
.attr('class', 'fix-message')
.html(function(d) { return d.title; });
.each(function(d) { return d.title(d3_select(this)); });
fixesEnter.merge(fixes)
.selectAll('button')
+3 -2
View File
@@ -146,8 +146,9 @@ export function uiSectionValidationIssues(id, severity, context) {
.order();
items.selectAll('.issue-message')
.html(function(d) {
return d.message(context);
.text('')
.each(function(d) {
return d.message(context)(d3_select(this));
});
/*
+3 -3
View File
@@ -55,12 +55,12 @@ export function validationAlmostJunction(context) {
message: function(context) {
const entity1 = context.hasEntity(this.entityIds[0]);
if (this.entityIds[0] === this.entityIds[2]) {
return entity1 ? t.html('issues.almost_junction.self.message', {
return entity1 ? t.append('issues.almost_junction.self.message', {
feature: utilDisplayLabel(entity1, context.graph())
}) : '';
} else {
const entity2 = context.hasEntity(this.entityIds[2]);
return (entity1 && entity2) ? t.html('issues.almost_junction.message', {
return (entity1 && entity2) ? t.append('issues.almost_junction.message', {
feature: utilDisplayLabel(entity1, context.graph()),
feature2: utilDisplayLabel(entity2, context.graph())
}) : '';
@@ -88,7 +88,7 @@ export function validationAlmostJunction(context) {
function makeFixes(context) {
let fixes = [new validationIssueFix({
icon: 'iD-icon-abutment',
title: t.html('issues.fix.connect_features.title'),
title: t.append('issues.fix.connect_features.title'),
onClick: function(context) {
const annotation = t('issues.fix.connect_almost_junction.annotation');
const [, endNodeId, crossWayId] = this.issue.entityIds;
+6 -6
View File
@@ -172,7 +172,7 @@ export function validationCloseNodes(context) {
message: function(context) {
var entity = context.hasEntity(this.entityIds[0]),
entity2 = context.hasEntity(this.entityIds[1]);
return (entity && entity2) ? t.html('issues.close_nodes.detached.message', {
return (entity && entity2) ? t.append('issues.close_nodes.detached.message', {
feature: utilDisplayLabel(entity, context.graph()),
feature2: utilDisplayLabel(entity2, context.graph())
}) : '';
@@ -183,11 +183,11 @@ export function validationCloseNodes(context) {
return [
new validationIssueFix({
icon: 'iD-operation-disconnect',
title: t.html('issues.fix.move_points_apart.title')
title: t.append('issues.fix.move_points_apart.title')
}),
new validationIssueFix({
icon: 'iD-icon-layers',
title: t.html('issues.fix.use_different_layers_or_levels.title')
title: t.append('issues.fix.use_different_layers_or_levels.title')
})
];
}
@@ -237,7 +237,7 @@ export function validationCloseNodes(context) {
severity: 'warning',
message: function(context) {
var entity = context.hasEntity(this.entityIds[0]);
return entity ? t.html('issues.close_nodes.message', { way: utilDisplayLabel(entity, context.graph()) }) : '';
return entity ? t.append('issues.close_nodes.message', { way: utilDisplayLabel(entity, context.graph()) }) : '';
},
reference: showReference,
entityIds: [way.id, node1.id, node2.id],
@@ -246,7 +246,7 @@ export function validationCloseNodes(context) {
return [
new validationIssueFix({
icon: 'iD-icon-plus',
title: t.html('issues.fix.merge_points.title'),
title: t.append('issues.fix.merge_points.title'),
onClick: function(context) {
var entityIds = this.issue.entityIds;
var action = actionMergeNodes([entityIds[1], entityIds[2]]);
@@ -255,7 +255,7 @@ export function validationCloseNodes(context) {
}),
new validationIssueFix({
icon: 'iD-operation-disconnect',
title: t.html('issues.fix.move_points_apart.title')
title: t.append('issues.fix.move_points_apart.title')
})
];
}
+6 -6
View File
@@ -407,7 +407,7 @@ export function validationCrossingWays(context) {
var graph = context.graph();
var entity1 = graph.hasEntity(this.entityIds[0]),
entity2 = graph.hasEntity(this.entityIds[1]);
return (entity1 && entity2) ? t.html('issues.crossing_ways.message', {
return (entity1 && entity2) ? t.append('issues.crossing_ways.message', {
feature: utilDisplayLabel(entity1, graph),
feature2: utilDisplayLabel(entity2, graph)
}) : '';
@@ -440,7 +440,7 @@ export function validationCrossingWays(context) {
if (isCrossingIndoors) {
fixes.push(new validationIssueFix({
icon: 'iD-icon-layers',
title: t.html('issues.fix.use_different_levels.title')
title: t.append('issues.fix.use_different_levels.title')
}));
} else if (isCrossingTunnels ||
isCrossingBridges ||
@@ -469,7 +469,7 @@ export function validationCrossingWays(context) {
// repositioning the features is always an option
fixes.push(new validationIssueFix({
icon: 'iD-operation-move',
title: t.html('issues.fix.reposition_features.title')
title: t.append('issues.fix.reposition_features.title')
}));
return fixes;
@@ -489,7 +489,7 @@ export function validationCrossingWays(context) {
function makeAddBridgeOrTunnelFix(fixTitleID, iconName, bridgeOrTunnel){
return new validationIssueFix({
icon: iconName,
title: t.html('issues.fix.' + fixTitleID + '.title'),
title: t.append('issues.fix.' + fixTitleID + '.title'),
onClick: function(context) {
var mode = context.mode();
if (!mode || mode.id !== 'select') return;
@@ -698,7 +698,7 @@ export function validationCrossingWays(context) {
return new validationIssueFix({
icon: 'iD-icon-crossing',
title: t.html('issues.fix.' + fixTitleID + '.title'),
title: t.append('issues.fix.' + fixTitleID + '.title'),
onClick: function(context) {
var loc = this.issue.loc;
var connectionTags = this.issue.data.connectionTags;
@@ -742,7 +742,7 @@ export function validationCrossingWays(context) {
function makeChangeLayerFix(higherOrLower) {
return new validationIssueFix({
icon: 'iD-icon-' + (higherOrLower === 'higher' ? 'up' : 'down'),
title: t.html('issues.fix.tag_this_as_' + higherOrLower + '.title'),
title: t.append('issues.fix.tag_this_as_' + higherOrLower + '.title'),
onClick: function(context) {
var mode = context.mode();
+5 -5
View File
@@ -25,7 +25,7 @@ export function validationDisconnectedWay() {
message: function(context) {
var entity = this.entityIds.length && context.hasEntity(this.entityIds[0]);
var label = entity && utilDisplayLabel(entity, context.graph());
return t.html('issues.disconnected_way.routable.message', { count: this.entityIds.length, highway: label });
return t.append('issues.disconnected_way.routable.message', { count: this.entityIds.length, highway: label });
},
reference: showReference,
entityIds: Array.from(routingIslandWays).map(function(way) { return way.id; }),
@@ -53,13 +53,13 @@ export function validationDisconnectedWay() {
}
if (!fixes.length) {
fixes.push(new validationIssueFix({
title: t.html('issues.fix.connect_feature.title')
title: t.append('issues.fix.connect_feature.title')
}));
}
fixes.push(new validationIssueFix({
icon: 'iD-operation-delete',
title: t.html('issues.fix.delete_feature.title'),
title: t.append('issues.fix.delete_feature.title'),
entityIds: [singleEntity.id],
onClick: function(context) {
var id = this.issue.entityIds[0];
@@ -71,7 +71,7 @@ export function validationDisconnectedWay() {
}));
} else {
fixes.push(new validationIssueFix({
title: t.html('issues.fix.connect_features.title')
title: t.append('issues.fix.connect_features.title')
}));
}
@@ -184,7 +184,7 @@ export function validationDisconnectedWay() {
return new validationIssueFix({
icon: 'iD-operation-continue' + (useLeftContinue ? '-left' : ''),
title: t.html('issues.fix.continue_from_' + whichEnd + '.title'),
title: t.append('issues.fix.continue_from_' + whichEnd + '.title'),
entityIds: [vertexID],
onClick: function(context) {
var wayId = this.issue.entityIds[0];
+2 -2
View File
@@ -25,14 +25,14 @@ export function validationHelpRequest(context) {
severity: 'warning',
message: function(context) {
var entity = context.hasEntity(this.entityIds[0]);
return entity ? t.html('issues.fixme_tag.message', {
return entity ? t.append('issues.fixme_tag.message', {
feature: utilDisplayLabel(entity, context.graph(), true /* verbose */)
}) : '';
},
dynamicFixes: function() {
return [
new validationIssueFix({
title: t.html('issues.fix.address_the_concern.title')
title: t.append('issues.fix.address_the_concern.title')
})
];
},
+3 -3
View File
@@ -162,7 +162,7 @@ export function validationImpossibleOneway() {
severity: 'warning',
message: function(context) {
var entity = context.hasEntity(this.entityIds[0]);
return entity ? t.html('issues.impossible_oneway.' + messageID + '.message', {
return entity ? t.append('issues.impossible_oneway.' + messageID + '.message', {
feature: utilDisplayLabel(entity, context.graph())
}) : '';
},
@@ -175,7 +175,7 @@ export function validationImpossibleOneway() {
if (attachedOneways.length) {
fixes.push(new validationIssueFix({
icon: 'iD-operation-reverse',
title: t.html('issues.fix.reverse_feature.title'),
title: t.append('issues.fix.reverse_feature.title'),
entityIds: [way.id],
onClick: function(context) {
var id = this.issue.entityIds[0];
@@ -189,7 +189,7 @@ export function validationImpossibleOneway() {
(!isFirst && textDirection === 'rtl');
fixes.push(new validationIssueFix({
icon: 'iD-operation-continue' + (useLeftContinue ? '-left' : ''),
title: t.html('issues.fix.continue_from_' + (isFirst ? 'start' : 'end') + '.title'),
title: t.append('issues.fix.continue_from_' + (isFirst ? 'start' : 'end') + '.title'),
onClick: function(context) {
var entityID = this.issue.entityIds[0];
var vertexID = this.issue.entityIds[1];
+2 -2
View File
@@ -43,7 +43,7 @@ export function validationIncompatibleSource() {
severity: 'warning',
message: (context) => {
const entity = context.hasEntity(entityID);
return entity ? t.html('issues.incompatible_source.feature.message', {
return entity ? t.append('issues.incompatible_source.feature.message', {
feature: utilDisplayLabel(entity, context.graph(), true /* verbose */),
value: source
}) : '';
@@ -53,7 +53,7 @@ export function validationIncompatibleSource() {
hash: source,
dynamicFixes: () => {
return [
new validationIssueFix({ title: t.html('issues.fix.remove_proprietary_data.title') })
new validationIssueFix({ title: t.append('issues.fix.remove_proprietary_data.title') })
];
}
});
+2 -2
View File
@@ -55,7 +55,7 @@ export function validationFormatting() {
severity: 'warning',
message: function(context) {
var entity = context.hasEntity(this.entityIds[0]);
return entity ? t.html('issues.invalid_format.website.message' + this.data,
return entity ? t.append('issues.invalid_format.website.message' + this.data,
{ feature: utilDisplayLabel(entity, context.graph()), site: websites.join(', ') }) : '';
},
reference: showReferenceWebsite,
@@ -80,7 +80,7 @@ export function validationFormatting() {
severity: 'warning',
message: function(context) {
var entity = context.hasEntity(this.entityIds[0]);
return entity ? t.html('issues.invalid_format.email.message' + this.data,
return entity ? t.append('issues.invalid_format.email.message' + this.data,
{ feature: utilDisplayLabel(entity, context.graph()), email: emails.join(', ') }) : '';
},
reference: showReferenceEmail,
+9 -9
View File
@@ -88,7 +88,7 @@ export function validationMismatchedGeometry() {
severity: 'warning',
message: function(context) {
var entity = context.hasEntity(this.entityIds[0]);
return entity ? t.html('issues.tag_suggests_area.message', {
return entity ? t.append('issues.tag_suggests_area.message', {
feature: utilDisplayLabel(entity, 'area', true /* verbose */),
tag: utilTagText({ tags: tagSuggestingArea })
}) : '';
@@ -104,13 +104,13 @@ export function validationMismatchedGeometry() {
var connectEndsOnClick = makeConnectEndpointsFixOnClick(entity, context.graph());
fixes.push(new validationIssueFix({
title: t.html('issues.fix.connect_endpoints.title'),
title: t.append('issues.fix.connect_endpoints.title'),
onClick: connectEndsOnClick
}));
fixes.push(new validationIssueFix({
icon: 'iD-operation-delete',
title: t.html('issues.fix.remove_tag.title'),
title: t.append('issues.fix.remove_tag.title'),
onClick: function(context) {
var entityId = this.issue.entityIds[0];
var entity = context.entity(entityId);
@@ -161,7 +161,7 @@ export function validationMismatchedGeometry() {
severity: 'warning',
message: function(context) {
var entity = context.hasEntity(this.entityIds[0]);
return entity ? t.html('issues.vertex_as_point.message', {
return entity ? t.append('issues.vertex_as_point.message', {
feature: utilDisplayLabel(entity, 'vertex', true /* verbose */)
}) : '';
},
@@ -184,7 +184,7 @@ export function validationMismatchedGeometry() {
severity: 'warning',
message: function(context) {
var entity = context.hasEntity(this.entityIds[0]);
return entity ? t.html('issues.point_as_vertex.message', {
return entity ? t.append('issues.point_as_vertex.message', {
feature: utilDisplayLabel(entity, 'point', true /* verbose */)
}) : '';
},
@@ -264,7 +264,7 @@ export function validationMismatchedGeometry() {
severity: 'warning',
message: function(context) {
var entity = context.hasEntity(this.entityIds[0]);
return entity ? t.html('issues.' + referenceId + '.message', {
return entity ? t.append('issues.' + referenceId + '.message', {
feature: utilDisplayLabel(entity, targetGeom, true /* verbose */)
}) : '';
},
@@ -308,7 +308,7 @@ export function validationMismatchedGeometry() {
return [
new validationIssueFix({
icon: 'iD-icon-line',
title: t.html('issues.fix.convert_to_line.title'),
title: t.append('issues.fix.convert_to_line.title'),
onClick: convertOnClick
})
];
@@ -336,7 +336,7 @@ export function validationMismatchedGeometry() {
return [
new validationIssueFix({
icon: 'iD-operation-extract',
title: t.html('issues.fix.extract_point.title'),
title: t.append('issues.fix.extract_point.title'),
onClick: extractOnClick
})
];
@@ -371,7 +371,7 @@ export function validationMismatchedGeometry() {
severity: 'warning',
message: function(context) {
var entity = context.hasEntity(this.entityIds[0]);
return entity ? t.html('issues.unclosed_multipolygon_part.message', {
return entity ? t.append('issues.unclosed_multipolygon_part.message', {
feature: utilDisplayLabel(entity, context.graph(), true /* verbose */)
}) : '';
},
+3 -3
View File
@@ -44,7 +44,7 @@ export function validationMissingRole() {
message: function(context) {
var member = context.hasEntity(this.entityIds[1]),
relation = context.hasEntity(this.entityIds[0]);
return (member && relation) ? t.html('issues.missing_role.message', {
return (member && relation) ? t.append('issues.missing_role.message', {
member: utilDisplayLabel(member, context.graph()),
relation: utilDisplayLabel(relation, context.graph())
}) : '';
@@ -61,7 +61,7 @@ export function validationMissingRole() {
makeAddRoleFix('outer'),
new validationIssueFix({
icon: 'iD-operation-delete',
title: t.html('issues.fix.remove_from_relation.title'),
title: t.append('issues.fix.remove_from_relation.title'),
onClick: function(context) {
context.perform(
actionDeleteMember(this.issue.entityIds[0], this.issue.data.member.index),
@@ -89,7 +89,7 @@ export function validationMissingRole() {
function makeAddRoleFix(role) {
return new validationIssueFix({
title: t.html('issues.fix.set_as_' + role + '.title'),
title: t.append('issues.fix.set_as_' + role + '.title'),
onClick: function(context) {
var oldMember = this.issue.data.member;
var member = { id: this.issue.entityIds[1], type: oldMember.type, role: role };
+3 -3
View File
@@ -85,7 +85,7 @@ export function validationMissingTag(context) {
severity: severity,
message: function(context) {
var entity = context.hasEntity(this.entityIds[0]);
return entity ? t.html('issues.' + messageID + '.message', {
return entity ? t.append('issues.' + messageID + '.message', {
feature: utilDisplayLabel(entity, context.graph())
}) : '';
},
@@ -99,7 +99,7 @@ export function validationMissingTag(context) {
fixes.push(new validationIssueFix({
icon: 'iD-icon-search',
title: t.html('issues.fix.' + selectFixType + '.title'),
title: t.append('issues.fix.' + selectFixType + '.title'),
onClick: function(context) {
context.ui().sidebar.showPresetList();
}
@@ -123,7 +123,7 @@ export function validationMissingTag(context) {
fixes.push(
new validationIssueFix({
icon: 'iD-operation-delete',
title: t.html('issues.fix.delete_feature.title'),
title: t.append('issues.fix.delete_feature.title'),
disabledReason: disabledReasonID ? t('operations.delete.' + disabledReasonID + '.single') : undefined,
onClick: deleteOnClick
})
+5 -5
View File
@@ -111,7 +111,7 @@ export function validationOutdatedTags() {
let fixes = [
new validationIssueFix({
autoArgs: autoArgs,
title: t.html('issues.fix.upgrade_tags.title'),
title: t.append('issues.fix.upgrade_tags.title'),
onClick: (context) => {
context.perform(doUpgrade, t('issues.fix.upgrade_tags.annotation'));
}
@@ -122,7 +122,7 @@ export function validationOutdatedTags() {
if (item) {
fixes.push(
new validationIssueFix({
title: t.html('issues.fix.tag_as_not.title', { name: item.displayName }),
title: t.append('issues.fix.tag_as_not.title', { name: item.displayName }),
onClick: (context) => {
context.perform(addNotTag, t('issues.fix.tag_as_not.annotation'));
}
@@ -184,7 +184,7 @@ export function validationOutdatedTags() {
if (subtype === 'noncanonical_brand' && isOnlyAddingTags) {
messageID += '_incomplete';
}
return t.html(messageID, {
return t.append(messageID, {
feature: utilDisplayLabel(currEntity, context.graph(), true /* verbose */)
});
}
@@ -247,7 +247,7 @@ export function validationOutdatedTags() {
return [
new validationIssueFix({
autoArgs: [doUpgrade, t('issues.fix.move_tags.annotation')],
title: t.html('issues.fix.move_tags.title'),
title: t.append('issues.fix.move_tags.title'),
onClick: (context) => {
context.perform(doUpgrade, t('issues.fix.move_tags.annotation'));
}
@@ -272,7 +272,7 @@ export function validationOutdatedTags() {
let currMultipolygon = context.hasEntity(multipolygon.id);
if (!currMultipolygon) return '';
return t.html('issues.old_multipolygon.message',
return t.append('issues.old_multipolygon.message',
{ multipolygon: utilDisplayLabel(currMultipolygon, context.graph(), true /* verbose */) }
);
}
+2 -2
View File
@@ -67,7 +67,7 @@ export function validationPrivateData() {
return [
new validationIssueFix({
icon: 'iD-operation-delete',
title: t.html('issues.fix.' + fixID + '.title'),
title: t.append('issues.fix.' + fixID + '.title'),
onClick: function(context) {
context.perform(doUpgrade, t('issues.fix.upgrade_tags.annotation'));
}
@@ -98,7 +98,7 @@ export function validationPrivateData() {
var currEntity = context.hasEntity(this.entityIds[0]);
if (!currEntity) return '';
return t.html('issues.private_data.contact.message',
return t.append('issues.private_data.contact.message',
{ feature: utilDisplayLabel(currEntity, context.graph()) }
);
}
+4 -4
View File
@@ -60,7 +60,7 @@ export function validationSuspiciousName() {
if (!entity) return '';
let preset = presetManager.match(entity, context.graph());
let langName = langCode && localizer.languageName(langCode);
return t.html('issues.generic_name.message' + (langName ? '_language' : ''),
return t.append('issues.generic_name.message' + (langName ? '_language' : ''),
{ feature: preset.name(), name: genericName, language: langName }
);
},
@@ -71,7 +71,7 @@ export function validationSuspiciousName() {
return [
new validationIssueFix({
icon: 'iD-operation-delete',
title: t.html('issues.fix.remove_the_name.title'),
title: t.append('issues.fix.remove_the_name.title'),
onClick: function(context) {
let entityId = this.issue.entityIds[0];
let entity = context.entity(entityId);
@@ -106,7 +106,7 @@ export function validationSuspiciousName() {
if (!entity) return '';
const preset = presetManager.match(entity, context.graph());
const langName = langCode && localizer.languageName(langCode);
return t.html('issues.incorrect_name.message' + (langName ? '_language' : ''),
return t.append('issues.incorrect_name.message' + (langName ? '_language' : ''),
{ feature: preset.name(), name: incorrectName, language: langName }
);
},
@@ -117,7 +117,7 @@ export function validationSuspiciousName() {
return [
new validationIssueFix({
icon: 'iD-operation-delete',
title: t.html('issues.fix.remove_the_name.title'),
title: t.append('issues.fix.remove_the_name.title'),
onClick: function(context) {
const entityId = this.issue.entityIds[0];
const entity = context.entity(entityId);
+3 -3
View File
@@ -76,7 +76,7 @@ export function validationUnsquareWay(context) {
severity: 'warning',
message: function(context) {
var entity = context.hasEntity(this.entityIds[0]);
return entity ? t.html('issues.unsquare_way.message', {
return entity ? t.append('issues.unsquare_way.message', {
feature: utilDisplayLabel(entity, context.graph())
}) : '';
},
@@ -87,7 +87,7 @@ export function validationUnsquareWay(context) {
return [
new validationIssueFix({
icon: 'iD-operation-orthogonalize',
title: t.html('issues.fix.square_feature.title'),
title: t.append('issues.fix.square_feature.title'),
autoArgs: autoArgs,
onClick: function(context, completionHandler) {
var entityId = this.issue.entityIds[0];
@@ -102,7 +102,7 @@ export function validationUnsquareWay(context) {
}),
/*
new validationIssueFix({
title: t.html('issues.fix.tag_as_unsquare.title'),
title: t.append('issues.fix.tag_as_unsquare.title'),
onClick: function(context) {
var entityId = this.issue.entityIds[0];
var entity = context.entity(entityId);