function proposeSetFromTemplate()

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);
            }
        }

    };
}