diff --git a/lib/amd/build/addblockmodal.min.js b/lib/amd/build/addblockmodal.min.js
index bea876da82f..c7276e715fe 100644
--- a/lib/amd/build/addblockmodal.min.js
+++ b/lib/amd/build/addblockmodal.min.js
@@ -1,2 +1,2 @@
-define ("core/addblockmodal",["exports","core/modal_factory","core/templates","core/str","core/ajax"],function(a,b,c,d,e){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.init=void 0;b=f(b);c=f(c);e=f(e);function f(a){return a&&a.__esModule?a:{default:a}}function g(a,b,c,d,e,f,g){try{var h=a[f](g),i=h.value}catch(a){c(a);return}if(h.done){b(i)}else{Promise.resolve(i).then(d,e)}}function h(a){return function(){var b=this,c=arguments;return new Promise(function(d,e){var i=a.apply(b,c);function f(a){g(i,d,e,f,h,"next",a)}function h(a){g(i,d,e,f,h,"throw",a)}f(void 0)})}}var i={ADD_BLOCK:"[data-key=\"addblock\"]"},j=null,k=function(a,b,c){document.addEventListener("click",function(d){if(d.target.closest(i.ADD_BLOCK)){d.preventDefault();if(null===c){c=d.target.closest(i.ADD_BLOCK).dataset.url}if(j){j.show()}else{l().then(function(d){j=d;var e=m(c,a,b);d.setBody(e);d.show();return e}).catch(function(){j.destroy();j=null})}}})},l=function(){return b.default.create({type:b.default.types.CANCEL,title:(0,d.get_string)("addblock")})},m=function(){var a=h(regeneratorRuntime.mark(function a(b,d,e){var f;return regeneratorRuntime.wrap(function(a){while(1){switch(a.prev=a.next){case 0:a.next=2;return n(d,e);case 2:f=a.sent;return a.abrupt("return",c.default.render("core/add_block_body",{blocks:f,url:b}));case 4:case"end":return a.stop();}}},a)}));return function(){return a.apply(this,arguments)}}(),n=function(){var a=h(regeneratorRuntime.mark(function a(b,c){var d;return regeneratorRuntime.wrap(function(a){while(1){switch(a.prev=a.next){case 0:d={methodname:"core_block_fetch_addable_blocks",args:{pagecontextid:M.cfg.contextid,pagetype:b,pagelayout:c}};return a.abrupt("return",e.default.call([d])[0]);case 2:case"end":return a.stop();}}},a)}));return function(){return a.apply(this,arguments)}}();a.init=function init(a,b){var c=2.\n\n/**\n * Show an add block modal instead of doing it on a separate page.\n *\n * @module core/addblockmodal\n * @copyright 2016 Damyon Wiese \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 Ajax from 'core/ajax';\n\nconst SELECTORS = {\n ADD_BLOCK: '[data-key=\"addblock\"]'\n};\n\nlet addBlockModal = null;\n\n/**\n * Register related event listeners.\n *\n * @method registerListenerEvents\n * @param {String} pageType The type of the page\n * @param {String} pageLayout The layout of the page\n * @param {String|null} addBlockUrl The add block URL\n */\nconst registerListenerEvents = (pageType, pageLayout, addBlockUrl) => {\n document.addEventListener('click', e => {\n\n if (e.target.closest(SELECTORS.ADD_BLOCK)) {\n e.preventDefault();\n\n if (addBlockUrl === null) {\n addBlockUrl = e.target.closest(SELECTORS.ADD_BLOCK).dataset.url;\n }\n\n if (addBlockModal) { // The 'add block' modal has been already created.\n // Display the 'add block' modal.\n addBlockModal.show();\n } else {\n buildAddBlockModal()\n .then(modal => {\n addBlockModal = modal;\n const modalBody = renderBlocks(addBlockUrl, pageType, pageLayout);\n modal.setBody(modalBody);\n modal.show();\n\n return modalBody;\n })\n .catch(() => {\n addBlockModal.destroy();\n // Unset the addBlockModal in case this is a transient error and it goes away on a relaunch.\n addBlockModal = null;\n });\n }\n }\n });\n};\n\n/**\n * Method that creates the 'add block' modal.\n *\n * @method buildAddBlockModal\n * @returns {Promise} The modal promise (modal's body will be rendered later).\n */\nconst buildAddBlockModal = () => {\n return ModalFactory.create({\n type: ModalFactory.types.CANCEL,\n title: getString('addblock')\n });\n};\n\n/**\n * Method that renders the list of available blocks.\n *\n * @method renderBlocks\n * @param {String} addBlockUrl The add block URL\n * @param {String} pageType The type of the page\n * @param {String} pageLayout The layout of the page\n * @return {Promise}\n */\nconst renderBlocks = async(addBlockUrl, pageType, pageLayout) => {\n // Fetch all addable blocks in the given page.\n const blocks = await getAddableBlocks(pageType, pageLayout);\n\n return Templates.render('core/add_block_body', {\n blocks: blocks,\n url: addBlockUrl\n });\n};\n\n/**\n * Method that fetches all addable blocks in a given page.\n *\n * @method getAddableBlocks\n * @param {String} pageType The type of the page\n * @param {String} pageLayout The layout of the page\n * @return {Promise}\n */\nconst getAddableBlocks = async(pageType, pageLayout) => {\n const request = {\n methodname: 'core_block_fetch_addable_blocks',\n args: {\n pagecontextid: M.cfg.contextid,\n pagetype: pageType,\n pagelayout: pageLayout\n },\n };\n\n return Ajax.call([request])[0];\n};\n\n/**\n * Set up the actions.\n *\n * @method init\n * @param {String} pageType The type of the page\n * @param {String} pageLayout The layout of the page\n * @param {String|null} addBlockUrl The add block URL\n */\nexport const init = (pageType, pageLayout, addBlockUrl = null) => {\n registerListenerEvents(pageType, pageLayout, addBlockUrl);\n};\n"],"file":"addblockmodal.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/addblockmodal.js"],"names":["SELECTORS","ADD_BLOCK","listenerEventsRegistered","registerListenerEvents","pageType","pageLayout","addBlockUrl","document","addEventListener","e","addBlock","target","closest","preventDefault","addBlockModal","addBlockModalUrl","dataset","url","buildAddBlockModal","then","modal","modalBody","renderBlocks","setBody","show","catch","destroy","ModalFactory","create","type","types","CANCEL","title","getAddableBlocks","blocks","Templates","render","request","methodname","args","pagecontextid","M","cfg","contextid","pagetype","pagelayout","Ajax","call","init"],"mappings":"sMAuBA,OACA,OAEA,O,qXAEMA,CAAAA,CAAS,CAAG,CACdC,SAAS,CAAE,yBADG,C,CAKdC,CAAwB,G,CAUtBC,CAAsB,CAAG,SAACC,CAAD,CAAWC,CAAX,CAAuBC,CAAvB,CAAuC,CAClEC,QAAQ,CAACC,gBAAT,CAA0B,OAA1B,CAAmC,SAAAC,CAAC,CAAI,CAEpC,GAAMC,CAAAA,CAAQ,CAAGD,CAAC,CAACE,MAAF,CAASC,OAAT,CAAiBZ,CAAS,CAACC,SAA3B,CAAjB,CACA,GAAIS,CAAJ,CAAc,CACVD,CAAC,CAACI,cAAF,GADU,GAGNC,CAAAA,CAAa,CAAG,IAHV,CAINC,CAAgB,QAAGT,CAAH,WAAGA,CAAH,CAAGA,CAAH,CAAkBI,CAAQ,CAACM,OAAT,CAAiBC,GAJ7C,CAMVC,CAAkB,GACbC,IADL,CACU,SAAAC,CAAK,CAAI,CACXN,CAAa,CAAGM,CAAhB,CACA,GAAMC,CAAAA,CAAS,CAAGC,CAAY,CAACP,CAAD,CAAmBX,CAAnB,CAA6BC,CAA7B,CAA9B,CACAe,CAAK,CAACG,OAAN,CAAcF,CAAd,EACAD,CAAK,CAACI,IAAN,GAEA,MAAOH,CAAAA,CACV,CARL,EASKI,KATL,CASW,UAAM,CACTX,CAAa,CAACY,OAAd,EACH,CAXL,CAYH,CACJ,CAtBD,CAuBH,C,CAQKR,CAAkB,CAAG,UAAM,CAC7B,MAAOS,WAAaC,MAAb,CAAoB,CACvBC,IAAI,CAAEF,UAAaG,KAAb,CAAmBC,MADF,CAEvBC,KAAK,CAAE,iBAAU,UAAV,CAFgB,CAApB,CAIV,C,CAWKV,CAAY,4CAAG,WAAMhB,CAAN,CAAmBF,CAAnB,CAA6BC,CAA7B,wGAEI4B,CAAAA,CAAgB,CAAC7B,CAAD,CAAWC,CAAX,CAFpB,QAEX6B,CAFW,iCAIVC,UAAUC,MAAV,CAAiB,qBAAjB,CAAwC,CAC3CF,MAAM,CAAEA,CADmC,CAE3CjB,GAAG,CAAEX,CAFsC,CAAxC,CAJU,0CAAH,uD,CAkBZ2B,CAAgB,4CAAG,WAAM7B,CAAN,CAAgBC,CAAhB,yFACfgC,CADe,CACL,CACZC,UAAU,CAAE,iCADA,CAEZC,IAAI,CAAE,CACFC,aAAa,CAAEC,CAAC,CAACC,GAAF,CAAMC,SADnB,CAEFC,QAAQ,CAAExC,CAFR,CAGFyC,UAAU,CAAExC,CAHV,CAFM,CADK,0BAUdyC,UAAKC,IAAL,CAAU,CAACV,CAAD,CAAV,EAAqB,CAArB,CAVc,0CAAH,uD,CAqBTW,CAAI,CAAG,SAAC5C,CAAD,CAAWC,CAAX,CAA8C,IAAvBC,CAAAA,CAAuB,wDAAT,IAAS,CAC9D,GAAI,CAACJ,CAAL,CAA+B,CAC3BC,CAAsB,CAACC,CAAD,CAAWC,CAAX,CAAuBC,CAAvB,CAAtB,CACAJ,CAAwB,GAC3B,CACJ,C","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 .\n\n/**\n * Show an add block modal instead of doing it on a separate page.\n *\n * @module core/addblockmodal\n * @copyright 2016 Damyon Wiese \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 Ajax from 'core/ajax';\n\nconst SELECTORS = {\n ADD_BLOCK: '[data-key=\"addblock\"]'\n};\n\n// Ensure we only add our listeners once.\nlet listenerEventsRegistered = false;\n\n/**\n * Register related event listeners.\n *\n * @method registerListenerEvents\n * @param {String} pageType The type of the page\n * @param {String} pageLayout The layout of the page\n * @param {String|null} addBlockUrl The add block URL\n */\nconst registerListenerEvents = (pageType, pageLayout, addBlockUrl) => {\n document.addEventListener('click', e => {\n\n const addBlock = e.target.closest(SELECTORS.ADD_BLOCK);\n if (addBlock) {\n e.preventDefault();\n\n let addBlockModal = null;\n let addBlockModalUrl = addBlockUrl ?? addBlock.dataset.url;\n\n buildAddBlockModal()\n .then(modal => {\n addBlockModal = modal;\n const modalBody = renderBlocks(addBlockModalUrl, pageType, pageLayout);\n modal.setBody(modalBody);\n modal.show();\n\n return modalBody;\n })\n .catch(() => {\n addBlockModal.destroy();\n });\n }\n });\n};\n\n/**\n * Method that creates the 'add block' modal.\n *\n * @method buildAddBlockModal\n * @returns {Promise} The modal promise (modal's body will be rendered later).\n */\nconst buildAddBlockModal = () => {\n return ModalFactory.create({\n type: ModalFactory.types.CANCEL,\n title: getString('addblock')\n });\n};\n\n/**\n * Method that renders the list of available blocks.\n *\n * @method renderBlocks\n * @param {String} addBlockUrl The add block URL\n * @param {String} pageType The type of the page\n * @param {String} pageLayout The layout of the page\n * @return {Promise}\n */\nconst renderBlocks = async(addBlockUrl, pageType, pageLayout) => {\n // Fetch all addable blocks in the given page.\n const blocks = await getAddableBlocks(pageType, pageLayout);\n\n return Templates.render('core/add_block_body', {\n blocks: blocks,\n url: addBlockUrl\n });\n};\n\n/**\n * Method that fetches all addable blocks in a given page.\n *\n * @method getAddableBlocks\n * @param {String} pageType The type of the page\n * @param {String} pageLayout The layout of the page\n * @return {Promise}\n */\nconst getAddableBlocks = async(pageType, pageLayout) => {\n const request = {\n methodname: 'core_block_fetch_addable_blocks',\n args: {\n pagecontextid: M.cfg.contextid,\n pagetype: pageType,\n pagelayout: pageLayout\n },\n };\n\n return Ajax.call([request])[0];\n};\n\n/**\n * Set up the actions.\n *\n * @method init\n * @param {String} pageType The type of the page\n * @param {String} pageLayout The layout of the page\n * @param {String|null} addBlockUrl The add block URL\n */\nexport const init = (pageType, pageLayout, addBlockUrl = null) => {\n if (!listenerEventsRegistered) {\n registerListenerEvents(pageType, pageLayout, addBlockUrl);\n listenerEventsRegistered = true;\n }\n};\n"],"file":"addblockmodal.min.js"}
\ No newline at end of file
diff --git a/lib/amd/src/addblockmodal.js b/lib/amd/src/addblockmodal.js
index bf585059af1..f660948c61b 100644
--- a/lib/amd/src/addblockmodal.js
+++ b/lib/amd/src/addblockmodal.js
@@ -30,7 +30,8 @@ const SELECTORS = {
ADD_BLOCK: '[data-key="addblock"]'
};
-let addBlockModal = null;
+// Ensure we only add our listeners once.
+let listenerEventsRegistered = false;
/**
* Register related event listeners.
@@ -43,21 +44,17 @@ let addBlockModal = null;
const registerListenerEvents = (pageType, pageLayout, addBlockUrl) => {
document.addEventListener('click', e => {
- if (e.target.closest(SELECTORS.ADD_BLOCK)) {
+ const addBlock = e.target.closest(SELECTORS.ADD_BLOCK);
+ if (addBlock) {
e.preventDefault();
- if (addBlockUrl === null) {
- addBlockUrl = e.target.closest(SELECTORS.ADD_BLOCK).dataset.url;
- }
+ let addBlockModal = null;
+ let addBlockModalUrl = addBlockUrl ?? addBlock.dataset.url;
- if (addBlockModal) { // The 'add block' modal has been already created.
- // Display the 'add block' modal.
- addBlockModal.show();
- } else {
- buildAddBlockModal()
+ buildAddBlockModal()
.then(modal => {
addBlockModal = modal;
- const modalBody = renderBlocks(addBlockUrl, pageType, pageLayout);
+ const modalBody = renderBlocks(addBlockModalUrl, pageType, pageLayout);
modal.setBody(modalBody);
modal.show();
@@ -65,10 +62,7 @@ const registerListenerEvents = (pageType, pageLayout, addBlockUrl) => {
})
.catch(() => {
addBlockModal.destroy();
- // Unset the addBlockModal in case this is a transient error and it goes away on a relaunch.
- addBlockModal = null;
});
- }
}
});
};
@@ -135,5 +129,8 @@ const getAddableBlocks = async(pageType, pageLayout) => {
* @param {String|null} addBlockUrl The add block URL
*/
export const init = (pageType, pageLayout, addBlockUrl = null) => {
- registerListenerEvents(pageType, pageLayout, addBlockUrl);
+ if (!listenerEventsRegistered) {
+ registerListenerEvents(pageType, pageLayout, addBlockUrl);
+ listenerEventsRegistered = true;
+ }
};