Home Reference Source

src/formio.embed.js

import { Formio } from './Embed';
const scripts = document.getElementsByTagName('script');
const config = window.FormioConfig || {};
let thisScript = null;
let i = scripts.length;
const scriptName = config.scriptName || 'formio.embed.';
while (i--) {
    if (
        scripts[i].src && (scripts[i].src.indexOf(scriptName) !== -1)
    ) {
        thisScript = scripts[i];
        break;
    }
}

if (thisScript) {
    const query = {};
    const queryString = thisScript.src.replace(/^[^?]+\??/, '');
    queryString.replace(/\?/g, '&').split('&').forEach((item) => {
        query[item.split('=')[0]] = item.split('=')[1] && decodeURIComponent(item.split('=')[1]);
    });

    let scriptSrc = thisScript.src.replace(/^([^?]+).*/, '$1').split('/');
    scriptSrc.pop();
    if (config.formioPath) {
        config.formioPath(scriptSrc);
    }
    scriptSrc = scriptSrc.join('/');
    Formio.config = Object.assign({
        script: query.script || (`${config.updatePath ? config.updatePath() : scriptSrc}/formio.form.min.js`),
        style: query.styles || (`${config.updatePath ? config.updatePath() : scriptSrc}/formio.form.min.css`),
        cdn: query.cdn,
        class: (query.class || 'formio-form-wrapper'),
        src: query.src,
        form: null,
        submission: null,
        project: query.project,
        base: query.base || 'https://api.form.io',
        submit: query.submit,
        includeLibs: (query.libs === 'true' || query.libs === '1'),
        template: query.template,
        debug: (query.debug === 'true' || query.debug === '1'),
        config: {},
        redirect: (query.return || query.redirect),
        embedCSS: (`${config.updatePath ? config.updatePath() : scriptSrc}/formio.embed.css`),
        success: query.success || 'Thank you for your submission!',
        before: null,
        after: null
    }, config);
    const form = (Formio.config.form || Formio.config.src);
    if (form) {
        Formio.debug('Embedding Configuration', config);
        if (Formio.config.addPremiumLib) {
            Formio.config.addPremiumLib(Formio.config, scriptSrc);
        }

        // The id for this embedded form.
        Formio.config.id = `formio-${Math.random().toString(36).substring(7)}`;
        Formio.debug('Creating form element');
        const element = Formio.createElement('div', {
            'id': Formio.config.id,
            class: Formio.config.class
        });

        // insertAfter doesn't exist, but effect is identical.
        thisScript.parentNode.insertBefore(element, thisScript.parentNode.firstElementChild.nextSibling);
        Formio.createForm(element, form, Formio.config.config).then((instance) => {
            if (Formio.config.submit) {
                instance.nosubmit = true;
            }

            // Configure a redirect.
            instance.on('submit', (submission) => {
                Formio.debug("on('submit')", submission);
                if (Formio.config.submit) {
                    Formio.debug(`Sending submission to ${Formio.config.submit}`);
                    const headers = {
                        'content-type': 'application/json'
                    };
                    const token = Formio.FormioClass.getToken();
                    if (token) {
                        headers['x-jwt-token'] = token;
                    }
                    Formio.FormioClass.fetch(Formio.config.submit, {
                        body: JSON.stringify(submission),
                        headers: headers,
                        method: 'POST',
                        mode: 'cors',
                    })
                        .then(resp => resp.json())
                        .then(submission => Formio.submitDone(instance, submission));
                }
                else {
                    Formio.submitDone(instance, submission);
                }
            });
        });
    }
}
else {
    // Show an error if the script cannot be found.
    document.write('<span>Could not locate the Embedded form.</span>');
}

export { Formio };