HEX
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/8.0.30
System: Linux multiplicar 3.10.0-1160.102.1.el7.x86_64 #1 SMP Tue Oct 17 15:42:21 UTC 2023 x86_64
User: root (0)
PHP: 8.0.30
Disabled: NONE
Upload Files
File: /var/www/html/formacion.bdp.com.py-bk/lib/form/amd/build/dynamicform.min.js.map
{"version":3,"file":"dynamicform.min.js","sources":["../src/dynamicform.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Display an embedded form, it is only loaded and reloaded inside its container\n *\n *\n * @module     core_form/dynamicform\n * @copyright  2019 Marina Glancy\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * See also https://docs.moodle.org/dev/Modal_and_AJAX_forms\n *\n * @example\n *    import DynamicForm from 'core_form/dynamicform';\n *\n *    const dynamicForm = new DynamicForm(document.querySelector('#mycontainer', 'pluginname\\\\form\\\\formname');\n *    dynamicForm.addEventListener(dynamicForm.events.FORM_SUBMITTED, e => {\n *        e.preventDefault();\n *        window.console.log(e.detail);\n *        dynamicForm.container.innerHTML = 'Thank you, your form is submitted!';\n *    });\n *    dynamicForm.load();\n *\n */\n\nimport Ajax from 'core/ajax';\nimport Notification from 'core/notification';\nimport Templates from 'core/templates';\nimport Event from 'core/event';\nimport {get_strings as getStrings} from 'core/str';\nimport Y from 'core/yui';\nimport Fragment from 'core/fragment';\nimport Pending from 'core/pending';\nimport {serialize} from './util';\n\n/**\n * @class core_form/dynamicform\n */\nexport default class DynamicForm {\n\n    /**\n     * Various events that can be observed.\n     *\n     * @type {Object}\n     */\n    events = {\n        // Form was successfully submitted - the response is passed to the event listener.\n        // Cancellable (in order to prevent default behavior to clear the container).\n        FORM_SUBMITTED: 'core_form_dynamicform_formsubmitted',\n        // Cancel button was pressed.\n        // Cancellable (in order to prevent default behavior to clear the container).\n        FORM_CANCELLED: 'core_form_dynamicform_formcancelled',\n        // User attempted to submit the form but there was client-side validation error.\n        CLIENT_VALIDATION_ERROR: 'core_form_dynamicform_clientvalidationerror',\n        // User attempted to submit the form but server returned validation error.\n        SERVER_VALIDATION_ERROR: 'core_form_dynamicform_validationerror',\n        // Error occurred while performing request to the server.\n        // Cancellable (by default calls Notification.exception).\n        ERROR: 'core_form_dynamicform_error',\n        // Right after user pressed no-submit button,\n        // listen to this event if you want to add JS validation or processing for no-submit button.\n        // Cancellable.\n        NOSUBMIT_BUTTON_PRESSED: 'core_form_dynamicform_nosubmitbutton',\n        // Right after user pressed submit button,\n        // listen to this event if you want to add additional JS validation or confirmation dialog.\n        // Cancellable.\n        SUBMIT_BUTTON_PRESSED: 'core_form_dynamicform_submitbutton',\n        // Right after user pressed cancel button,\n        // listen to this event if you want to add confirmation dialog.\n        // Cancellable.\n        CANCEL_BUTTON_PRESSED: 'core_form_dynamicform_cancelbutton',\n    };\n\n    /**\n     * Constructor\n     *\n     * Creates an instance\n     *\n     * @param {Element} container - the parent element for the form\n     * @param {string} formClass full name of the php class that extends \\core_form\\modal , must be in autoloaded location\n     */\n    constructor(container, formClass) {\n        this.formClass = formClass;\n        this.container = container;\n\n        // Ensure strings required for shortforms are always available.\n        getStrings([\n            {key: 'collapseall', component: 'moodle'},\n            {key: 'expandall', component: 'moodle'}\n        ]).catch(Notification.exception);\n\n        // Register delegated events handlers in vanilla JS.\n        this.container.addEventListener('click', e => {\n            if (e.target.matches('form input[type=submit][data-cancel]')) {\n                e.preventDefault();\n                const event = this.trigger(this.events.CANCEL_BUTTON_PRESSED, e.target);\n                if (!event.defaultPrevented) {\n                    this.processCancelButton();\n                }\n            } else if (e.target.matches('form input[type=submit][data-no-submit=\"1\"]')) {\n                e.preventDefault();\n                const event = this.trigger(this.events.NOSUBMIT_BUTTON_PRESSED, e.target);\n                if (!event.defaultPrevented) {\n                    this.processNoSubmitButton(e.target);\n                }\n            }\n        });\n\n        this.container.addEventListener('submit', e => {\n            if (e.target.matches('form')) {\n                e.preventDefault();\n                const event = this.trigger(this.events.SUBMIT_BUTTON_PRESSED);\n                if (!event.defaultPrevented) {\n                    this.submitFormAjax();\n                }\n            }\n        });\n    }\n\n    /**\n     * Loads the form via AJAX and shows it inside a given container\n     *\n     * @param {Object} args\n     * @return {Promise}\n     * @public\n     */\n    load(args = null) {\n        const formData = serialize(args || {});\n        const pendingPromise = new Pending('core_form/dynamicform:load');\n        return this.getBody(formData)\n        .then((resp) => this.updateForm(resp))\n        .then(pendingPromise.resolve);\n    }\n\n    /**\n     * Triggers a custom event\n     *\n     * @private\n     * @param {String} eventName\n     * @param {*} detail\n     * @param {Boolean} cancelable\n     * @return {CustomEvent<unknown>}\n     */\n    trigger(eventName, detail = null, cancelable = true) {\n        const e = new CustomEvent(eventName, {detail, cancelable});\n        this.container.dispatchEvent(e);\n        return e;\n    }\n\n    /**\n     * Add listener for an event\n     *\n     * @param {array} args\n     * @example:\n     *    const dynamicForm = new DynamicForm(...);\n     *    dynamicForm.addEventListener(dynamicForm.events.FORM_SUBMITTED, e => {\n     *        e.preventDefault();\n     *        window.console.log(e.detail);\n     *        dynamicForm.container.innerHTML = 'Thank you, your form is submitted!';\n     *    });\n     */\n    addEventListener(...args) {\n        this.container.addEventListener(...args);\n    }\n\n    /**\n     * Get form body\n     *\n     * @param {String} formDataString form data in format of a query string\n     * @private\n     * @return {Promise}\n     */\n    getBody(formDataString) {\n        return Ajax.call([{\n            methodname: 'core_form_dynamic_form',\n            args: {\n                formdata: formDataString,\n                form: this.formClass,\n            }\n        }])[0]\n        .then(response => {\n            return {html: response.html, js: Fragment.processCollectedJavascript(response.javascript)};\n        });\n    }\n\n    /**\n     * On form submit\n     *\n     * @param {*} response Response received from the form's \"process\" method\n     */\n    onSubmitSuccess(response) {\n        const event = this.trigger(this.events.FORM_SUBMITTED, response);\n        if (event.defaultPrevented) {\n            return;\n        }\n\n        // Default implementation is to remove the form. Event listener should either remove or reload the form\n        // since its contents is no longer correct. For example, if an element was created as a result of\n        // form submission, the \"id\" in the form would be still zero. Also the server-side validation\n        // errors from the previous submission may still be present.\n        this.container.innerHTML = '';\n    }\n\n    /**\n     * On exception during form processing\n     *\n     * @private\n     * @param {Object} exception\n     */\n    onSubmitError(exception) {\n        const event = this.trigger(this.events.ERROR, exception);\n        if (event.defaultPrevented) {\n            return;\n        }\n\n        Notification.exception(exception);\n    }\n\n    /**\n     * Click on a \"submit\" button that is marked in the form as registerNoSubmitButton()\n     *\n     * @method submitButtonPressed\n     * @param {Element} button that was pressed\n     */\n    processNoSubmitButton(button) {\n        const pendingPromise = new Pending('core_form/dynamicform:nosubmit');\n        const form = this.container.querySelector('form');\n        const formData = new URLSearchParams([...(new FormData(form)).entries()]);\n        formData.append(button.getAttribute('name'), button.getAttribute('value'));\n\n        this.notifyFormSubmitAjax(true)\n        .then(() => {\n            // Add the button name to the form data and submit it.\n            this.disableButtons();\n            return this.getBody(formData.toString());\n        })\n        .then((resp) => this.updateForm(resp))\n        .finally(pendingPromise.resolve)\n        .catch(exception => this.onSubmitError(exception));\n    }\n\n    /**\n     * Wrapper for Event.notifyFormSubmitAjax that waits for the module to load\n     *\n     * We often destroy the form right after calling this function and we need to make sure that it actually\n     * completes before it, or otherwise it will try to work with a form that does not exist.\n     *\n     * @param {Boolean} skipValidation\n     * @return {Promise}\n     */\n    notifyFormSubmitAjax(skipValidation = false) {\n        const form = this.container.querySelector('form');\n        return new Promise(resolve => {\n            Y.use('event', 'moodle-core-event', 'moodle-core-formchangechecker', function() {\n                Event.notifyFormSubmitAjax(form, skipValidation);\n                resolve();\n            });\n        });\n    }\n\n    /**\n     * Notifies listeners that form dirty state should be reset.\n     *\n     * @return {Promise<unknown>}\n     */\n    notifyResetFormChanges() {\n        const form = this.container.querySelector('form');\n        return new Promise(resolve => {\n            Y.use('event', 'moodle-core-event', 'moodle-core-formchangechecker', () => {\n                Event.notifyFormSubmitAjax(form, true);\n                M.core_formchangechecker.reset_form_dirty_state();\n                resolve();\n            });\n        });\n    }\n\n    /**\n     * Click on a \"cancel\" button\n     */\n    processCancelButton() {\n        // Notify listeners that the form is about to be submitted (this will reset atto autosave).\n        this.notifyResetFormChanges()\n        .then(() => {\n            const event = this.trigger(this.events.FORM_CANCELLED);\n            if (!event.defaultPrevented) {\n                // By default removes the form from the DOM.\n                this.container.innerHTML = '';\n            }\n            return null;\n        })\n        .catch(null);\n    }\n\n    /**\n     * Update form contents\n     *\n     * @param {object} param\n     * @param {string} param.html\n     * @param {string} param.js\n     */\n    updateForm({html, js}) {\n        Templates.replaceNodeContents(this.container, html, js);\n    }\n\n    /**\n     * Validate form elements\n     * @return {Promise} promise that returns true if client-side validation has passed, false if there are errors\n     */\n    validateElements() {\n        // Notify listeners that the form is about to be submitted (this will reset atto autosave).\n        return this.notifyFormSubmitAjax()\n        .then(() => {\n            // Now the change events have run, see if there are any \"invalid\" form fields.\n            const invalid = [...this.container.querySelectorAll('[aria-invalid=\"true\"], .error')];\n\n            // If we found invalid fields, focus on the first one and do not submit via ajax.\n            if (invalid.length) {\n                invalid[0].focus();\n                return false;\n            }\n\n            return true;\n        });\n    }\n\n    /**\n     * Disable buttons during form submission\n     */\n    disableButtons() {\n        this.container.querySelectorAll('form input[type=\"submit\"]')\n            .forEach(el => el.setAttribute('disabled', true));\n    }\n\n    /**\n     * Enable buttons after form submission (on validation error)\n     */\n    enableButtons() {\n        this.container.querySelectorAll('form input[type=\"submit\"]')\n            .forEach(el => el.removeAttribute('disabled'));\n    }\n\n    /**\n     * Submit the form via AJAX call to the core_form_dynamic_form WS\n     */\n    async submitFormAjax() {\n        // If we found invalid fields, focus on the first one and do not submit via ajax.\n        if (!(await this.validateElements())) {\n            this.trigger(this.events.CLIENT_VALIDATION_ERROR, null, false);\n            return;\n        }\n        this.disableButtons();\n\n        // Convert all the form elements values to a serialised string.\n        const form = this.container.querySelector('form');\n        const formData = new URLSearchParams([...(new FormData(form)).entries()]);\n\n        // Now we can continue...\n        Ajax.call([{\n            methodname: 'core_form_dynamic_form',\n            args: {\n                formdata: formData.toString(),\n                form: this.formClass\n            }\n        }])[0]\n        .then((response) => {\n            if (!response.submitted) {\n                // Form was not submitted, it could be either because validation failed or because no-submit button was pressed.\n                this.updateForm({html: response.html, js: Fragment.processCollectedJavascript(response.javascript)});\n                this.enableButtons();\n                this.trigger(this.events.SERVER_VALIDATION_ERROR, null, false);\n            } else {\n                // Form was submitted properly.\n                const data = JSON.parse(response.data);\n                this.enableButtons();\n                this.notifyResetFormChanges()\n                .then(() => this.onSubmitSuccess(data))\n                .catch();\n            }\n            return null;\n        })\n        .catch(exception => this.onSubmitError(exception));\n    }\n}\n"],"names":["DynamicForm","container","formClass","FORM_SUBMITTED","FORM_CANCELLED","CLIENT_VALIDATION_ERROR","SERVER_VALIDATION_ERROR","ERROR","NOSUBMIT_BUTTON_PRESSED","SUBMIT_BUTTON_PRESSED","CANCEL_BUTTON_PRESSED","key","component","catch","Notification","exception","addEventListener","e","target","matches","preventDefault","_this","trigger","events","defaultPrevented","processCancelButton","processNoSubmitButton","submitFormAjax","args","formData","pendingPromise","Pending","this","getBody","then","resp","_this2","updateForm","resolve","eventName","detail","cancelable","CustomEvent","dispatchEvent","formDataString","Ajax","call","methodname","formdata","form","response","html","js","Fragment","processCollectedJavascript","javascript","innerHTML","button","querySelector","URLSearchParams","FormData","entries","append","getAttribute","notifyFormSubmitAjax","_this3","disableButtons","toString","finally","onSubmitError","skipValidation","Promise","use","M","core_formchangechecker","reset_form_dirty_state","notifyResetFormChanges","_this4","replaceNodeContents","invalid","_this5","querySelectorAll","length","focus","forEach","el","setAttribute","removeAttribute","validateElements","submitted","data","JSON","parse","_this6","enableButtons","onSubmitSuccess"],"mappings":"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"}