MDL-69166 core_payment: Add paymentarea to the payment subsystem
[moodle.git] / payment / amd / build / gateways_modal.min.js.map
1 {"version":3,"sources":["../src/gateways_modal.js"],"names":["registerEventListenersBySelector","nodeSelector","document","querySelectorAll","forEach","element","registerEventListeners","rootNode","addEventListener","e","preventDefault","show","focusOnClose","target","ModalFactory","ModalGateways","TYPE","Templates","render","type","title","body","create","modal","rootElement","getRoot","on","ModalEvents","hidden","destroy","focus","PaymentEvents","proceed","gateway","querySelector","Selectors","values","value","processPayment","dataset","component","paymentarea","componentid","description","success","message","hide","Notification","addNotification","location","reload","alert","then","matches","elements","gateways","updateCostRegion","cost","context","renderForPromise","html","js","replaceNodeContents","regions","gatewaysContainer","selectSingleGateway","root","length","checked","defaultCost","gatewayElement","surcharge","parseInt","fee","costContainer","paymentArea","componentId","callback","paymentMethod","process"],"mappings":"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","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 * Contain the logic for the gateways modal.\n *\n * @module     core_payment/gateways_modal\n * @package    core_payment\n * @copyright  2019 Shamim Rezaie <shamim@moodle.com>\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport ModalFactory from 'core/modal_factory';\nimport Templates from 'core/templates';\nimport {get_string as getString} from 'core/str';\nimport {getGatewaysSupportingCurrency} from './repository';\nimport Selectors from './selectors';\nimport ModalEvents from 'core/modal_events';\nimport PaymentEvents from 'core_payment/events';\nimport {add as addToast, addToastRegion} from 'core/toast';\nimport Notification from 'core/notification';\nimport ModalGateways from './modal_gateways';\n\n/**\n * Register event listeners for the module.\n *\n * @param {string} nodeSelector The root to listen to.\n */\nexport const registerEventListenersBySelector = (nodeSelector) => {\n    document.querySelectorAll(nodeSelector).forEach((element) => {\n        registerEventListeners(element);\n    });\n};\n\n/**\n * Register event listeners for the module.\n *\n * @param {HTMLElement} rootNode The root to listen to.\n */\nexport const registerEventListeners = (rootNode) => {\n    rootNode.addEventListener('click', (e) => {\n        e.preventDefault();\n        show(rootNode, {focusOnClose: e.target});\n    });\n};\n\n/**\n * Shows the gateway selector modal.\n *\n * @param {HTMLElement} rootNode\n * @param {Object} options - Additional options\n * @param {HTMLElement} options.focusOnClose The element to focus on when the modal is closed.\n */\nconst show = async(rootNode, {\n    focusOnClose = null,\n} = {}) => {\n    const modal = await ModalFactory.create({\n        type: ModalGateways.TYPE,\n        title: await getString('selectpaymenttype', 'core_payment'),\n        body: await Templates.render('core_payment/gateways_modal', {}),\n    });\n\n    const rootElement = modal.getRoot()[0];\n    addToastRegion(rootElement);\n\n    modal.show();\n\n    modal.getRoot().on(ModalEvents.hidden, () => {\n        // Destroy when hidden.\n        modal.destroy();\n        try {\n            focusOnClose.focus();\n        } catch (e) {\n            // eslint-disable-line\n        }\n    });\n\n    modal.getRoot().on(PaymentEvents.proceed, (e) => {\n        const gateway = (rootElement.querySelector(Selectors.values.gateway) || {value: ''}).value;\n\n        if (gateway) {\n            processPayment(\n                gateway,\n                rootNode.dataset.component,\n                rootNode.dataset.paymentarea,\n                rootNode.dataset.componentid,\n                rootNode.dataset.description,\n                ({success, message = ''}) => {\n                    modal.hide();\n                    if (success) {\n                        Notification.addNotification({\n                            message: message,\n                            type: 'success',\n                        });\n                        location.reload();\n                    } else {\n                        Notification.alert('', message);\n                    }\n                },\n            );\n        } else {\n            // We cannot use await in the following line.\n            // The reason is that we are preventing the default action of the save event being triggered,\n            // therefore we cannot define the event handler function asynchronous.\n            getString('nogatewayselected', 'core_payment').then(message => addToast(message));\n        }\n\n        e.preventDefault();\n    });\n\n    // Re-calculate the cost when gateway is changed.\n    rootElement.addEventListener('change', e => {\n        if (e.target.matches(Selectors.elements.gateways)) {\n            updateCostRegion(rootElement, rootNode.dataset.cost);\n        }\n    });\n\n    const gateways = await getGatewaysSupportingCurrency(rootNode.dataset.component, rootNode.dataset.paymentarea,\n        rootNode.dataset.componentid);\n    const context = {\n        gateways\n    };\n\n    const {html, js} = await Templates.renderForPromise('core_payment/gateways', context);\n    Templates.replaceNodeContents(rootElement.querySelector(Selectors.regions.gatewaysContainer), html, js);\n    selectSingleGateway(rootElement);\n    await updateCostRegion(rootElement, rootNode.dataset.cost);\n};\n\n/**\n * Auto-select the gateway if there is only one gateway.\n *\n * @param {HTMLElement} root An HTMLElement that contains the cost region\n */\nconst selectSingleGateway = root => {\n    const gateways = root.querySelectorAll(Selectors.elements.gateways);\n\n    if (gateways.length == 1) {\n        gateways[0].checked = true;\n    }\n};\n\n/**\n * Shows the cost of the item the user is purchasing in the cost region.\n *\n * @param {HTMLElement} root An HTMLElement that contains the cost region\n * @param {string} defaultCost The default cost that is going to be displayed if no gateway is selected\n * @returns {Promise<void>}\n */\nconst updateCostRegion = async(root, defaultCost = '') => {\n    const gatewayElement = root.querySelector(Selectors.values.gateway);\n    const surcharge = parseInt((gatewayElement || {dataset: {surcharge: 0}}).dataset.surcharge);\n    const cost = (gatewayElement || {dataset: {cost: defaultCost}}).dataset.cost;\n\n    const {html, js} = await Templates.renderForPromise('core_payment/fee_breakdown', {fee: cost, surcharge});\n    Templates.replaceNodeContents(root.querySelector(Selectors.regions.costContainer), html, js);\n};\n\n/**\n * Process payment using the selected gateway.\n *\n * @param {string} gateway The gateway to be used for payment\n * @param {string} component Name of the component that the componentId belongs to\n * @param {string} paymentArea Name of the area in the component that the componentId belongs to\n * @param {number} componentId An internal identifier that is used by the component\n * @param {string} description Description of the payment\n * @param {processPaymentCallback} callback The callback function to call when processing is finished\n * @returns {Promise<void>}\n */\nconst processPayment = async(gateway, component, paymentArea, componentId, description, callback) => {\n    const paymentMethod = await import(`pg_${gateway}/gateways_modal`);\n    paymentMethod.process(component, paymentArea, componentId, description, callback);\n};\n\n/**\n * The callback definition for processPayment.\n *\n * @callback processPaymentCallback\n * @param {bool} success\n * @param {string} message\n */\n"],"file":"gateways_modal.min.js"}