in ui-modules/blueprint-composer/app/components/quick-fix/quick-fix.js [320:414]
function proposeSetFromTemplate() {
return function (qfdef, issue, entity, blueprintService, proposals) {
if (!issue.ref) return;
let template = qfdef['template'];
if (!template) {
console.warn("Missing 'template' on hint", qfdef);
return;
}
let sanitize = qfdef['sanitize'];
let sanitizeFn = s => {
if (!sanitize) return s;
return s.replace(/\W+/g, sanitize);
}
if (!proposals) proposals = {};
function replace(s, keyword, fn, skipSanitize) {
if (!s) return null;
let p = "${"+keyword+"}";
if (s.includes(p)) {
let v = fn();
if (v) {
if (!skipSanitize) v = sanitizeFn(v);
do {
s = s.replace(p, v);
} while (s.includes(p));
} else {
return null;
}
}
return s;
}
function replaceTemplate(result, s, x, idFn, isPreview) {
let idLastFn = () => {
let last = x.id;
let takeLast = last || !isPreview;
last = last || idFn(s,x);
if (takeLast) last = last.replace(/^.*\W+(\w+\W*)/, '$1');
return last;
};
result = replace(result, s, () => x.name || idLastFn(), isPreview && !x.name && !x.id);
result = replace(result, s+".name", () => x.name);
result = replace(result, s+".nameOrType", () => x.name || x.miscData.get('typeName') || x.type);
result = replace(result, s+".typeName", () => x.miscData.get('typeName') || x.type);
result = replace(result, s+".type", () => x.type || x.miscData.get('typeName'));
result = replace(result, s+".id", () => x.id || idFn(s,x));
// takes the last word of the ID
result = replace(result, s+".idLast", idLastFn, isPreview);
result = replace(result, s+"._id", () => x._id);
return result;
}
let idFnForPreview = (s,x) => "<"+s+" ID, changed from "+x._id+">";
let preview = qfdef['preview'] || "Set '"+template+"'";
preview = replaceTemplate(preview, "entity", entity, idFnForPreview, true);
preview = replaceTemplate(preview, "application", entity.getApplication(), idFnForPreview, true);
if (preview) {
let pkey = 'set_from_template_' + preview;
if (!proposals[pkey]) {
proposals[pkey] = {
text: preview,
tooltip: "This will fix the error by setting the value here based on a template." +
(sanitize ? " The result will be sanitized using '" + sanitize + "'." : ""),
};
Object.assign(proposals[pkey], {
issues: [],
apply: (issue, entity) => {
entity = (entity || issue.entity);
let result = template;
let idFnForActual = (s, x) => {
blueprintService.populateId(x);
return x.id;
};
result = replaceTemplate(result, "entity", entity, idFnForActual);
result = replaceTemplate(result, "application", entity.getApplication(), idFnForActual);
if (!result) {
console.warn("Could not apply quick fix: template '"+template+"' not valid at entity", entity);
} else {
entity.addConfig(issue.ref, result);
}
}
});
}
if (proposals[pkey]) {
proposals[pkey].issues.push(issue);
}
}
};
}