1{"version":3,"sources":["../src/modal_factory.js"],"names":["define","$","ModalEvents","ModalRegistry","Modal","ModalSaveCancel","ModalCancel","ModalAlert","Templates","Notification","CustomEvents","Pending","TEMPLATES","DEFAULT","SAVE_CANCEL","CANCEL","ALERT","TYPES","register","setUpTrigger","modalPromise","triggerElement","modalConfig","actualTriggerElement","hasPreShowCallback","preShowCallback","triggeredCallback","e","data","pendingPromise","currentTarget","then","modal","show","resolve","originalEvent","preventDefault","Array","isArray","selector","events","activate","on","getRoot","hidden","focus","createFromElement","registryConf","modalElement","Module","module","createFromType","templateContext","templateName","template","render","html","fail","exception","create","type","isLarge","large","isScrollable","hasOwnProperty","scrollable","get","message","title","setTitle","body","setBody","footer","setFooter","buttons","Object","entries","forEach","key","value","setButtonText","setLarge","removeOnClose","setRemoveOnClose","setScrollable","types"],"mappings":"+qCAsBAA,OAAM,sBAAC,CAAC,QAAD,CAAW,mBAAX,CAAgC,qBAAhC,CAAuD,YAAvD,CACC,wBADD,CAC2B,mBAD3B,CACgD,wBADhD,CAEC,gBAFD,CAEmB,mBAFnB,CAEwC,gCAFxC,CAGC,cAHD,CAAD,CAIF,SAASC,CAAT,CAAYC,CAAZ,CAAyBC,CAAzB,CAAwCC,CAAxC,CAA+CC,CAA/C,CACIC,CADJ,CACiBC,CADjB,CAC6BC,CAD7B,CACwCC,CADxC,CACsDC,CADtD,CACoEC,CADpE,CAC6E,IAGzEC,CAAAA,CAAS,CAAG,CACZC,OAAO,CAAE,YADG,CAEZC,WAAW,CAAE,wBAFD,CAGZC,MAAM,CAAE,mBAHI,CAIZC,KAAK,CAAE,wBAJK,CAH6D,CAqBzEC,CAAK,CAAG,CACRJ,OAAO,CAAE,SADD,CAERC,WAAW,CAAE,aAFL,CAGRC,MAAM,CAAE,QAHA,CAIRC,KAAK,CAAE,OAJC,CArBiE,CA6B7Eb,CAAa,CAACe,QAAd,CAAuBD,CAAK,CAACJ,OAA7B,CAAsCT,CAAtC,CAA6CQ,CAAS,CAACC,OAAvD,EACAV,CAAa,CAACe,QAAd,CAAuBD,CAAK,CAACH,WAA7B,CAA0CT,CAA1C,CAA2DO,CAAS,CAACE,WAArE,EACAX,CAAa,CAACe,QAAd,CAAuBD,CAAK,CAACF,MAA7B,CAAqCT,CAArC,CAAkDM,CAAS,CAACG,MAA5D,EACAZ,CAAa,CAACe,QAAd,CAAuBD,CAAK,CAACD,KAA7B,CAAoCT,CAApC,CAAgDK,CAAS,CAACI,KAA1D,EAhC6E,GA4CzEG,CAAAA,CAAY,CAAG,SAASC,CAAT,CAAuBC,CAAvB,CAAuCC,CAAvC,CAAoD,IAE/DC,CAAAA,CAAoB,CAAG,IAFwC,CAK/DC,CAAkB,CAA0C,UAAtC,QAAOF,CAAAA,CAAW,CAACG,eALsB,CAO/DC,CAAiB,CAAG,SAASC,CAAT,CAAYC,CAAZ,CAAkB,CACtC,GAAIC,CAAAA,CAAc,CAAG,GAAIlB,CAAAA,CAAJ,CAAY,mDAAZ,CAArB,CACAY,CAAoB,CAAGtB,CAAC,CAAC0B,CAAC,CAACG,aAAH,CAAxB,CACAV,CAAY,CAACW,IAAb,CAAkB,SAASC,CAAT,CAAgB,CAC9B,GAAIR,CAAJ,CAAwB,CAGpBF,CAAW,CAACG,eAAZ,CAA4BF,CAA5B,CAAkDS,CAAlD,CACH,CAEDA,CAAK,CAACC,IAAN,GAEA,MAAOD,CAAAA,CACV,CAVD,EAWCD,IAXD,CAWMF,CAAc,CAACK,OAXrB,EAYAN,CAAI,CAACO,aAAL,CAAmBC,cAAnB,EACH,CAvBkE,CA4BnE,GAAIC,KAAK,CAACC,OAAN,CAAcjB,CAAd,CAAJ,CAAmC,CAC/B,GAAIkB,CAAAA,CAAQ,CAAGlB,CAAc,CAAC,CAAD,CAA7B,CACAA,CAAc,CAAGA,CAAc,CAAC,CAAD,CAA/B,CAEAX,CAAY,CAACV,MAAb,CAAoBqB,CAApB,CAAoC,CAACX,CAAY,CAAC8B,MAAb,CAAoBC,QAArB,CAApC,EACApB,CAAc,CAACqB,EAAf,CAAkBhC,CAAY,CAAC8B,MAAb,CAAoBC,QAAtC,CAAgDF,CAAhD,CAA0Db,CAA1D,CACH,CAND,IAMO,CACHhB,CAAY,CAACV,MAAb,CAAoBqB,CAApB,CAAoC,CAACX,CAAY,CAAC8B,MAAb,CAAoBC,QAArB,CAApC,EACApB,CAAc,CAACqB,EAAf,CAAkBhC,CAAY,CAAC8B,MAAb,CAAoBC,QAAtC,CAAgDf,CAAhD,CACH,CAEDN,CAAY,CAACW,IAAb,CAAkB,SAASC,CAAT,CAAgB,CAC9BA,CAAK,CAACW,OAAN,GAAgBD,EAAhB,CAAmBxC,CAAW,CAAC0C,MAA/B,CAAuC,UAAW,CAE9C,GAA6B,IAAzB,GAAArB,CAAJ,CAAmC,CAC/BA,CAAoB,CAACsB,KAArB,EACH,CACJ,CALD,EAOA,MAAOb,CAAAA,CACV,CATD,CAUH,CA7F4E,CAyGzEc,CAAiB,CAAG,SAASC,CAAT,CAAuBC,CAAvB,CAAqC,CACzDA,CAAY,CAAG/C,CAAC,CAAC+C,CAAD,CAAhB,CADyD,GAErDC,CAAAA,CAAM,CAAGF,CAAY,CAACG,MAF+B,CAGrDlB,CAAK,CAAG,GAAIiB,CAAAA,CAAJ,CAAWD,CAAX,CAH6C,CAKzD,MAAOhB,CAAAA,CACV,CA/G4E,CA2HzEmB,CAAc,CAAG,SAASJ,CAAT,CAAuBK,CAAvB,CAAwC,IACrDC,CAAAA,CAAY,CAAGN,CAAY,CAACO,QADyB,CAGrDlC,CAAY,CAAGZ,CAAS,CAAC+C,MAAV,CAAiBF,CAAjB,CAA+BD,CAA/B,EACdrB,IADc,CACT,SAASyB,CAAT,CAAe,CACjB,GAAIR,CAAAA,CAAY,CAAG/C,CAAC,CAACuD,CAAD,CAApB,CACA,MAAOV,CAAAA,CAAiB,CAACC,CAAD,CAAeC,CAAf,CAC3B,CAJc,EAKdS,IALc,CAKThD,CAAY,CAACiD,SALJ,CAHsC,CAUzD,MAAOtC,CAAAA,CACV,CAtI4E,CA2M7E,MAAO,CACHuC,MAAM,CA5DG,QAATA,CAAAA,MAAS,CAASrC,CAAT,CAAsBD,CAAtB,CAAsC,IAC3CuC,CAAAA,CAAI,CAAGtC,CAAW,CAACsC,IAAZ,EAAoB3C,CAAK,CAACJ,OADU,CAE3CgD,CAAO,CAAGvC,CAAW,CAACwC,KAAZ,MAFiC,CAI3CC,CAAY,CAAGzC,CAAW,CAAC0C,cAAZ,CAA2B,YAA3B,EAA2C1C,CAAW,CAAC2C,UAAvD,GAJ4B,CAK3ClB,CAAY,CAAG,IAL4B,CAM3CK,CAAe,CAAG,EANyB,CAQ/CL,CAAY,CAAG5C,CAAa,CAAC+D,GAAd,CAAkBN,CAAlB,CAAf,CAEA,GAAI,CAACb,CAAL,CAAmB,CACftC,CAAY,CAACiD,SAAb,CAAuB,CAACS,OAAO,CAAE,iCAAmCP,CAA7C,CAAvB,CACH,CAED,GAA0C,WAAtC,QAAOtC,CAAAA,CAAW,CAAC8B,eAAvB,CAAuD,CACnDA,CAAe,CAAG9B,CAAW,CAAC8B,eACjC,CAED,GAAIhC,CAAAA,CAAY,CAAG+B,CAAc,CAACJ,CAAD,CAAeK,CAAf,CAAd,CACdrB,IADc,CACT,SAASC,CAAT,CAAgB,CAClB,GAAgC,WAA5B,QAAOV,CAAAA,CAAW,CAAC8C,KAAvB,CAA6C,CACzCpC,CAAK,CAACqC,QAAN,CAAe/C,CAAW,CAAC8C,KAA3B,CACH,CAED,GAA+B,WAA3B,QAAO9C,CAAAA,CAAW,CAACgD,IAAvB,CAA4C,CACxCtC,CAAK,CAACuC,OAAN,CAAcjD,CAAW,CAACgD,IAA1B,CACH,CAED,GAAiC,WAA7B,QAAOhD,CAAAA,CAAW,CAACkD,MAAvB,CAA8C,CAC1CxC,CAAK,CAACyC,SAAN,CAAgBnD,CAAW,CAACkD,MAA5B,CACH,CAED,GAAIlD,CAAW,CAACoD,OAAhB,CAAyB,CACrBC,MAAM,CAACC,OAAP,CAAetD,CAAW,CAACoD,OAA3B,EAAoCG,OAApC,CAA4C,WAAuB,2BAAbC,CAAa,MAARC,CAAQ,MAC/D/C,CAAK,CAACgD,aAAN,CAAoBF,CAApB,CAAyBC,CAAzB,CACH,CAFD,CAGH,CAED,GAAIlB,CAAJ,CAAa,CACT7B,CAAK,CAACiD,QAAN,EACH,CAED,GAAyC,WAArC,QAAO3D,CAAAA,CAAW,CAAC4D,aAAvB,CAAsD,CAElDlD,CAAK,CAACmD,gBAAN,CAAuB7D,CAAW,CAAC4D,aAAnC,CACH,CAEDlD,CAAK,CAACoD,aAAN,CAAoBrB,CAApB,EAEA,MAAO/B,CAAAA,CACV,CAhCc,CAAnB,CAkCA,GAA6B,WAAzB,QAAOX,CAAAA,CAAX,CAA0C,CACtCF,CAAY,CAACC,CAAD,CAAeC,CAAf,CAA+BC,CAA/B,CACf,CAED,MAAOF,CAAAA,CACV,CAEM,CAEHiE,KAAK,CAAEpE,CAFJ,CAIV,CApNK,CAAN","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 * Create a modal.\n *\n * @module     core/modal_factory\n * @copyright  2016 Ryan Wyllie <ryan@moodle.com>\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/modal_events', 'core/modal_registry', 'core/modal',\n        'core/modal_save_cancel', 'core/modal_cancel', 'core/local/modal/alert',\n        'core/templates', 'core/notification', 'core/custom_interaction_events',\n        'core/pending'],\n    function($, ModalEvents, ModalRegistry, Modal, ModalSaveCancel,\n        ModalCancel, ModalAlert, Templates, Notification, CustomEvents, Pending) {\n\n    // The templates for each type of modal.\n    var TEMPLATES = {\n        DEFAULT: 'core/modal',\n        SAVE_CANCEL: 'core/modal_save_cancel',\n        CANCEL: 'core/modal_cancel',\n        ALERT: 'core/local/modal/alert',\n    };\n\n    /**\n     * The available types of modals.\n     *\n     * @constant\n     * @static\n     * @public\n     * @property {String} DEFAULT The default modal\n     * @property {String} SAVE_CANCEL A modal which can be used to either save, or cancel.\n     * @property {String} CANCEL A modal which displayed a cancel button\n     * @property {String} ALERT An information modal which only displays information.\n     */\n    var TYPES = {\n        DEFAULT: 'DEFAULT',\n        SAVE_CANCEL: 'SAVE_CANCEL',\n        CANCEL: 'CANCEL',\n        ALERT: 'ALERT',\n    };\n\n    // Register the common set of modals.\n    ModalRegistry.register(TYPES.DEFAULT, Modal, TEMPLATES.DEFAULT);\n    ModalRegistry.register(TYPES.SAVE_CANCEL, ModalSaveCancel, TEMPLATES.SAVE_CANCEL);\n    ModalRegistry.register(TYPES.CANCEL, ModalCancel, TEMPLATES.CANCEL);\n    ModalRegistry.register(TYPES.ALERT, ModalAlert, TEMPLATES.ALERT);\n\n    /**\n     * Set up the events required to show the modal and return focus when the modal\n     * is closed.\n     *\n     * @method setUpTrigger\n     * @private\n     * @param {Promise} modalPromise The modal instance\n     * @param {object} triggerElement The jQuery element to open the modal\n     * @param {object} modalConfig The modal configuration given to the factory\n     */\n    var setUpTrigger = function(modalPromise, triggerElement, modalConfig) {\n        // The element that actually shows the modal.\n        var actualTriggerElement = null;\n        // Check if the client has provided a callback function to be called\n        // before the modal is displayed.\n        var hasPreShowCallback = (typeof modalConfig.preShowCallback == 'function');\n        // Function to handle the trigger element being activated.\n        var triggeredCallback = function(e, data) {\n            var pendingPromise = new Pending('core/modal_factory:setUpTrigger:triggeredCallback');\n            actualTriggerElement = $(e.currentTarget);\n            modalPromise.then(function(modal) {\n                if (hasPreShowCallback) {\n                    // If the client provided a pre-show callback then execute\n                    // it now before showing the modal.\n                    modalConfig.preShowCallback(actualTriggerElement, modal);\n                }\n\n                modal.show();\n\n                return modal;\n            })\n            .then(pendingPromise.resolve);\n            data.originalEvent.preventDefault();\n        };\n\n        // The trigger element can either be a single element or it can be an\n        // element + selector pair to create a delegated event handler to trigger\n        // the modal.\n        if (Array.isArray(triggerElement)) {\n            var selector = triggerElement[1];\n            triggerElement = triggerElement[0];\n\n            CustomEvents.define(triggerElement, [CustomEvents.events.activate]);\n            triggerElement.on(CustomEvents.events.activate, selector, triggeredCallback);\n        } else {\n            CustomEvents.define(triggerElement, [CustomEvents.events.activate]);\n            triggerElement.on(CustomEvents.events.activate, triggeredCallback);\n        }\n\n        modalPromise.then(function(modal) {\n            modal.getRoot().on(ModalEvents.hidden, function() {\n                // Focus on the trigger element that actually launched the modal.\n                if (actualTriggerElement !== null) {\n                    actualTriggerElement.focus();\n                }\n            });\n\n            return modal;\n        });\n    };\n\n    /**\n     * Create the correct instance of a modal based on the givem type. Sets up\n     * the trigger between the modal and the trigger element.\n     *\n     * @method createFromElement\n     * @private\n     * @param {object} registryConf A config from the ModalRegistry\n     * @param {object} modalElement The modal HTML jQuery object\n     * @return {object} Modal instance\n     */\n    var createFromElement = function(registryConf, modalElement) {\n        modalElement = $(modalElement);\n        var Module = registryConf.module;\n        var modal = new Module(modalElement);\n\n        return modal;\n    };\n\n    /**\n     * Create the correct modal instance for the given type, including loading\n     * the correct template.\n     *\n     * @method createFromType\n     * @private\n     * @param {object} registryConf A config from the ModalRegistry\n     * @param {object} templateContext The context to render the template with\n     * @returns {promise} Resolved with a Modal instance\n     */\n    var createFromType = function(registryConf, templateContext) {\n        var templateName = registryConf.template;\n\n        var modalPromise = Templates.render(templateName, templateContext)\n            .then(function(html) {\n                var modalElement = $(html);\n                return createFromElement(registryConf, modalElement);\n            })\n            .fail(Notification.exception);\n\n        return modalPromise;\n    };\n\n    /**\n     * Create a Modal instance.\n     *\n     * @method create\n     * @param {object} modalConfig The configuration to create the modal instance\n     * @param {object} triggerElement The trigger HTML jQuery object\n     * @return {promise} Resolved with a Modal instance\n     */\n    var create = function(modalConfig, triggerElement) {\n        var type = modalConfig.type || TYPES.DEFAULT;\n        var isLarge = modalConfig.large ? true : false;\n        // If 'scrollable' is not configured, set the modal to be scrollable by default.\n        var isScrollable = modalConfig.hasOwnProperty('scrollable') ? modalConfig.scrollable : true;\n        var registryConf = null;\n        var templateContext = {};\n\n        registryConf = ModalRegistry.get(type);\n\n        if (!registryConf) {\n            Notification.exception({message: 'Unable to find modal of type: ' + type});\n        }\n\n        if (typeof modalConfig.templateContext != 'undefined') {\n            templateContext = modalConfig.templateContext;\n        }\n\n        var modalPromise = createFromType(registryConf, templateContext)\n            .then(function(modal) {\n                if (typeof modalConfig.title != 'undefined') {\n                    modal.setTitle(modalConfig.title);\n                }\n\n                if (typeof modalConfig.body != 'undefined') {\n                    modal.setBody(modalConfig.body);\n                }\n\n                if (typeof modalConfig.footer != 'undefined') {\n                    modal.setFooter(modalConfig.footer);\n                }\n\n                if (modalConfig.buttons) {\n                    Object.entries(modalConfig.buttons).forEach(function([key, value]) {\n                        modal.setButtonText(key, value);\n                    });\n                }\n\n                if (isLarge) {\n                    modal.setLarge();\n                }\n\n                if (typeof modalConfig.removeOnClose !== 'undefined') {\n                    // If configured remove the modal when hiding it.\n                    modal.setRemoveOnClose(modalConfig.removeOnClose);\n                }\n\n                modal.setScrollable(isScrollable);\n\n                return modal;\n            });\n\n        if (typeof triggerElement != 'undefined') {\n            setUpTrigger(modalPromise, triggerElement, modalConfig);\n        }\n\n        return modalPromise;\n    };\n\n    return {\n        create: create,\n        types: TYPES,\n    };\n});\n"],"file":"modal_factory.min.js"}