diff --git a/theme/boost/amd/build/loader.min.js b/theme/boost/amd/build/loader.min.js
index ca24dd7f773..baacba5c056 100644
--- a/theme/boost/amd/build/loader.min.js
+++ b/theme/boost/amd/build/loader.min.js
@@ -1,2 +1,2 @@
-define ("theme_boost/loader",["exports","jquery","./aria","./scroll","./bootstrap/index","core/custom_interaction_events"],function(a,b,c,d,e,f){"use strict";Object.defineProperty(a,"__esModule",{value:!0});Object.defineProperty(a,"Bootstrap",{enumerable:!0,get:function get(){return e.default}});a.init=void 0;b=g(b);c=g(c);d=g(d);e=g(e);f=g(f);function g(a){return a&&a.__esModule?a:{default:a}}var h=function(){i();j();k();var a=new d.default;a.init();b.default.fn.dropdown.Constructor.Default.flip=!1;c.default.init()};a.init=h;var i=function(){(0,b.default)("a[data-toggle=\"tab\"]").on("shown.bs.tab",function(a){var c=(0,b.default)(a.target).attr("href");if(history.replaceState){history.replaceState(null,null,c)}else{location.hash=c}});var a=window.location.hash;if(a){(0,b.default)(".nav-link[href=\""+a+"\"]").tab("show")}},j=function(){(0,b.default)("body").popover({selector:"[data-toggle=\"popover\"]",trigger:"focus hover",placement:"auto"});f.default.define((0,b.default)("body"),[f.default.events.escape]);(0,b.default)("body").on(f.default.events.escape,"[data-toggle=popover]",function(){(0,b.default)(this).trigger("blur")})},k=function(){(0,b.default)("body").tooltip({container:"body",selector:"[data-toggle=\"tooltip\"]"})}});
+define ("theme_boost/loader",["exports","jquery","./aria","./bootstrap/index","core/pending","./scroll","./pending"],function(a,b,c,d,e,f,g){"use strict";Object.defineProperty(a,"__esModule",{value:!0});Object.defineProperty(a,"Bootstrap",{enumerable:!0,get:function get(){return d.default}});b=h(b);c=h(c);d=h(d);e=h(e);f=h(f);g=h(g);function h(a){return a&&a.__esModule?a:{default:a}}var i=function(){(0,b.default)("a[data-toggle=\"tab\"]").on("shown.bs.tab",function(a){var c=(0,b.default)(a.target).attr("href");if(history.replaceState){history.replaceState(null,null,c)}else{location.hash=c}});var a=window.location.hash;if(a){(0,b.default)(".nav-link[href=\""+a+"\"]").tab("show")}},j=function(){(0,b.default)("body").popover({container:"body",selector:"[data-toggle=\"popover\"]",trigger:"focus"});document.addEventListener("keydown",function(a){if("Escape"===a.key&&a.target.closest("[data-toggle=\"popover\"]")){(0,b.default)(a.target).popover("hide")}})},k=function(){(0,b.default)("body").tooltip({container:"body",selector:"[data-toggle=\"tooltip\"]"})},l=new e.default("theme_boost/loader:init");(0,g.default)();i();j();k();new f.default().init();b.default.fn.dropdown.Constructor.Default.flip=!1;c.default.init();l.resolve()});
//# sourceMappingURL=loader.min.js.map
diff --git a/theme/boost/amd/build/loader.min.js.map b/theme/boost/amd/build/loader.min.js.map
index bf9bf8dbcbd..bcde39cc2fc 100644
--- a/theme/boost/amd/build/loader.min.js.map
+++ b/theme/boost/amd/build/loader.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/loader.js"],"names":["init","rememberTabs","enablePopovers","enableTooltips","scroll","Scroll","$","fn","dropdown","Constructor","Default","flip","Aria","on","e","hash","target","attr","history","replaceState","location","window","tab","popover","selector","trigger","placement","CustomEvents","define","events","escape","tooltip","container"],"mappings":"uTA0BA,OACA,OACA,OACA,OACA,O,mDAeA,GAAMA,CAAAA,CAAI,CAAG,UAAM,CACfC,CAAY,GAEZC,CAAc,GAEdC,CAAc,GAEd,GAAMC,CAAAA,CAAM,CAAG,GAAIC,UAAnB,CACAD,CAAM,CAACJ,IAAP,GAGAM,UAAEC,EAAF,CAAKC,QAAL,CAAcC,WAAd,CAA0BC,OAA1B,CAAkCC,IAAlC,IAEAC,UAAKZ,IAAL,EACH,CAdD,C,YAmBMC,CAAAA,CAAY,CAAG,UAAM,CACvB,cAAE,wBAAF,EAA0BY,EAA1B,CAA6B,cAA7B,CAA6C,SAASC,CAAT,CAAY,CACrD,GAAIC,CAAAA,CAAI,CAAG,cAAED,CAAC,CAACE,MAAJ,EAAYC,IAAZ,CAAiB,MAAjB,CAAX,CACA,GAAIC,OAAO,CAACC,YAAZ,CAA0B,CACtBD,OAAO,CAACC,YAAR,CAAqB,IAArB,CAA2B,IAA3B,CAAiCJ,CAAjC,CACH,CAFD,IAEO,CACHK,QAAQ,CAACL,IAAT,CAAgBA,CACnB,CACJ,CAPD,EAQA,GAAIA,CAAAA,CAAI,CAAGM,MAAM,CAACD,QAAP,CAAgBL,IAA3B,CACA,GAAIA,CAAJ,CAAU,CACP,cAAE,oBAAqBA,CAArB,CAA4B,KAA9B,EAAoCO,GAApC,CAAwC,MAAxC,CACF,CACJ,C,CAMKpB,CAAc,CAAG,UAAM,CACzB,cAAE,MAAF,EAAUqB,OAAV,CAAkB,CACdC,QAAQ,CAAE,2BADI,CAEdC,OAAO,CAAE,aAFK,CAGdC,SAAS,CAAE,MAHG,CAAlB,EAMAC,UAAaC,MAAb,CAAoB,cAAE,MAAF,CAApB,CAA+B,CAC3BD,UAAaE,MAAb,CAAoBC,MADO,CAA/B,EAGA,cAAE,MAAF,EAAUjB,EAAV,CAAac,UAAaE,MAAb,CAAoBC,MAAjC,CAAyC,uBAAzC,CAAkE,UAAW,CAEzE,cAAE,IAAF,EAAQL,OAAR,CAAgB,MAAhB,CACH,CAHD,CAIH,C,CAMKtB,CAAc,CAAG,UAAM,CACzB,cAAE,MAAF,EAAU4B,OAAV,CAAkB,CACdC,SAAS,CAAE,MADG,CAEdR,QAAQ,CAAE,2BAFI,CAAlB,CAIH,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 * Template renderer for Moodle. Load and render Moodle templates with Mustache.\n *\n * @module core/templates\n * @package core\n * @class templates\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 2.9\n */\n\nimport $ from 'jquery';\nimport Aria from './aria';\nimport Scroll from './scroll';\nimport Bootstrap from './bootstrap/index';\nimport CustomEvents from 'core/custom_interaction_events';\n\n/**\n * Set up the search.\n *\n * @method init\n */\nexport {\n init,\n Bootstrap\n};\n\n/**\n * Bootstrap init function\n */\nconst init = () => {\n rememberTabs();\n\n enablePopovers();\n\n enableTooltips();\n\n const scroll = new Scroll();\n scroll.init();\n\n // Disables flipping the dropdowns up and getting hidden behind the navbar.\n $.fn.dropdown.Constructor.Default.flip = false;\n\n Aria.init();\n};\n\n/**\n * Rember the last visited tabs.\n */\nconst rememberTabs = () => {\n $('a[data-toggle=\"tab\"]').on('shown.bs.tab', function(e) {\n var hash = $(e.target).attr('href');\n if (history.replaceState) {\n history.replaceState(null, null, hash);\n } else {\n location.hash = hash;\n }\n });\n var hash = window.location.hash;\n if (hash) {\n $('.nav-link[href=\"' + hash + '\"]').tab('show');\n }\n};\n\n/**\n * Enable all popovers\n *\n */\nconst enablePopovers = () => {\n $('body').popover({\n selector: '[data-toggle=\"popover\"]',\n trigger: 'focus hover',\n placement: 'auto'\n });\n\n CustomEvents.define($('body'), [\n CustomEvents.events.escape,\n ]);\n $('body').on(CustomEvents.events.escape, '[data-toggle=popover]', function() {\n\n $(this).trigger('blur');\n });\n};\n\n/**\n * Enable tooltips\n *\n */\nconst enableTooltips = () => {\n $('body').tooltip({\n container: 'body',\n selector: '[data-toggle=\"tooltip\"]'\n });\n};"],"file":"loader.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/loader.js"],"names":["rememberTabs","on","e","hash","target","attr","history","replaceState","location","window","tab","enablePopovers","popover","container","selector","trigger","document","addEventListener","key","closest","enableTooltips","tooltip","pendingPromise","Pending","Scroll","init","$","fn","dropdown","Constructor","Default","flip","Aria","resolve"],"mappings":"qSA0BA,OACA,OACA,OACA,OACA,OACA,O,sDAKMA,CAAAA,CAAY,CAAG,UAAM,CACvB,cAAE,wBAAF,EAA0BC,EAA1B,CAA6B,cAA7B,CAA6C,SAASC,CAAT,CAAY,CACrD,GAAIC,CAAAA,CAAI,CAAG,cAAED,CAAC,CAACE,MAAJ,EAAYC,IAAZ,CAAiB,MAAjB,CAAX,CACA,GAAIC,OAAO,CAACC,YAAZ,CAA0B,CACtBD,OAAO,CAACC,YAAR,CAAqB,IAArB,CAA2B,IAA3B,CAAiCJ,CAAjC,CACH,CAFD,IAEO,CACHK,QAAQ,CAACL,IAAT,CAAgBA,CACnB,CACJ,CAPD,EAQA,GAAIA,CAAAA,CAAI,CAAGM,MAAM,CAACD,QAAP,CAAgBL,IAA3B,CACA,GAAIA,CAAJ,CAAU,CACP,cAAE,oBAAqBA,CAArB,CAA4B,KAA9B,EAAoCO,GAApC,CAAwC,MAAxC,CACF,CACJ,C,CAMKC,CAAc,CAAG,UAAM,CACzB,cAAE,MAAF,EAAUC,OAAV,CAAkB,CACdC,SAAS,CAAE,MADG,CAEdC,QAAQ,CAAE,2BAFI,CAGdC,OAAO,CAAE,OAHK,CAAlB,EAMAC,QAAQ,CAACC,gBAAT,CAA0B,SAA1B,CAAqC,SAAAf,CAAC,CAAI,CACtC,GAAc,QAAV,GAAAA,CAAC,CAACgB,GAAF,EAAsBhB,CAAC,CAACE,MAAF,CAASe,OAAT,CAAiB,2BAAjB,CAA1B,CAAuE,CACnE,cAAEjB,CAAC,CAACE,MAAJ,EAAYQ,OAAZ,CAAoB,MAApB,CACH,CACJ,CAJD,CAKH,C,CAMKQ,CAAc,CAAG,UAAM,CACzB,cAAE,MAAF,EAAUC,OAAV,CAAkB,CACdR,SAAS,CAAE,MADG,CAEdC,QAAQ,CAAE,2BAFI,CAAlB,CAIH,C,CAEKQ,CAAc,CAAG,GAAIC,UAAJ,CAAY,yBAAZ,C,CAGvB,gBAGAvB,CAAY,GAGZW,CAAc,GAGdS,CAAc,GAGb,GAAII,UAAJ,EAAD,CAAeC,IAAf,GAGAC,UAAEC,EAAF,CAAKC,QAAL,CAAcC,WAAd,CAA0BC,OAA1B,CAAkCC,IAAlC,IAGAC,UAAKP,IAAL,GAEAH,CAAc,CAACW,OAAf,E","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 * Template renderer for Moodle. Load and render Moodle templates with Mustache.\n *\n * @module core/templates\n * @package core\n * @class templates\n * @copyright 2015 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 2.9\n */\n\nimport $ from 'jquery';\nimport Aria from './aria';\nimport Bootstrap from './bootstrap/index';\nimport Pending from 'core/pending';\nimport Scroll from './scroll';\nimport setupBootstrapPendingChecks from './pending';\n\n/**\n * Rember the last visited tabs.\n */\nconst rememberTabs = () => {\n $('a[data-toggle=\"tab\"]').on('shown.bs.tab', function(e) {\n var hash = $(e.target).attr('href');\n if (history.replaceState) {\n history.replaceState(null, null, hash);\n } else {\n location.hash = hash;\n }\n });\n var hash = window.location.hash;\n if (hash) {\n $('.nav-link[href=\"' + hash + '\"]').tab('show');\n }\n};\n\n/**\n * Enable all popovers\n *\n */\nconst enablePopovers = () => {\n $('body').popover({\n container: 'body',\n selector: '[data-toggle=\"popover\"]',\n trigger: 'focus',\n });\n\n document.addEventListener('keydown', e => {\n if (e.key === 'Escape' && e.target.closest('[data-toggle=\"popover\"]')) {\n $(e.target).popover('hide');\n }\n });\n};\n\n/**\n * Enable tooltips\n *\n */\nconst enableTooltips = () => {\n $('body').tooltip({\n container: 'body',\n selector: '[data-toggle=\"tooltip\"]',\n });\n};\n\nconst pendingPromise = new Pending('theme_boost/loader:init');\n\n// Add pending promise event listeners to relevant Bootstrap custom events.\nsetupBootstrapPendingChecks();\n\n// Remember the last visited tabs.\nrememberTabs();\n\n// Enable all popovers.\nenablePopovers();\n\n// Enable all tooltips.\nenableTooltips();\n\n// Add scroll handling.\n(new Scroll()).init();\n\n// Disables flipping the dropdowns up and getting hidden behind the navbar.\n$.fn.dropdown.Constructor.Default.flip = false;\n\n// Setup Aria helpers for Bootstrap features.\nAria.init();\n\npendingPromise.resolve();\n\nexport {\n Bootstrap,\n};\n"],"file":"loader.min.js"}
\ No newline at end of file
diff --git a/theme/boost/amd/build/pending.min.js b/theme/boost/amd/build/pending.min.js
index d231b81d8f6..3630be6a88f 100644
--- a/theme/boost/amd/build/pending.min.js
+++ b/theme/boost/amd/build/pending.min.js
@@ -1,2 +1,2 @@
-define ("theme_boost/pending",["jquery"],function(a){var b={alert:[{start:"close",end:"closed"}],carousel:[{start:"slide",end:"slid"}],collapse:[{start:"hide",end:"hidden"},{start:"show",end:"shown"}],dropdown:[{start:"hide",end:"hidden"},{start:"show",end:"shown"}],modal:[{start:"hide",end:"hidden"},{start:"show",end:"shown"}],popover:[{start:"hide",end:"hidden"},{start:"show",end:"shown"}],tab:[{start:"hide",end:"hidden"},{start:"show",end:"shown"}],toast:[{start:"hide",end:"hidden"},{start:"show",end:"shown"}],tooltip:[{start:"hide",end:"hidden"},{start:"show",end:"shown"}]};Object.keys(b).forEach(function(c){b[c].forEach(function(b){var d=b.start+".bs."+c,e=b.end+".bs."+c;a(document.body).on(d,function(){M.util.js_pending(e)});a(document.body).on(e,function(){M.util.js_complete(e)})})})});
+define ("theme_boost/pending",["exports","jquery"],function(a,b){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.default=void 0;b=function(a){return a&&a.__esModule?a:{default:a}}(b);function c(a,b){return h(a)||g(a,b)||e(a,b)||d()}function d(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function e(a,b){if(!a)return;if("string"==typeof a)return f(a,b);var c=Object.prototype.toString.call(a).slice(8,-1);if("Object"===c&&a.constructor)c=a.constructor.name;if("Map"===c||"Set"===c)return Array.from(c);if("Arguments"===c||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(c))return f(a,b)}function f(a,b){if(null==b||b>a.length)b=a.length;for(var c=0,d=Array(b);c.\n\n/**\n * Add Pending JS checks to stock Bootstrap transitions.\n *\n * @module theme_boost/pending\n * @copyright 2019 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery'], function($) {\n var moduleTransitions = {\n alert: [\n // Alert.\n {\n start: 'close',\n end: 'closed',\n },\n ],\n\n carousel: [\n {\n start: 'slide',\n end: 'slid',\n },\n ],\n\n collapse: [\n {\n start: 'hide',\n end: 'hidden',\n },\n {\n start: 'show',\n end: 'shown',\n },\n ],\n\n dropdown: [\n {\n start: 'hide',\n end: 'hidden',\n },\n {\n start: 'show',\n end: 'shown',\n },\n ],\n\n modal: [\n {\n start: 'hide',\n end: 'hidden',\n },\n {\n start: 'show',\n end: 'shown',\n },\n ],\n\n popover: [\n {\n start: 'hide',\n end: 'hidden',\n },\n {\n start: 'show',\n end: 'shown',\n },\n ],\n\n tab: [\n {\n start: 'hide',\n end: 'hidden',\n },\n {\n start: 'show',\n end: 'shown',\n },\n ],\n\n toast: [\n {\n start: 'hide',\n end: 'hidden',\n },\n {\n start: 'show',\n end: 'shown',\n },\n ],\n\n tooltip: [\n {\n start: 'hide',\n end: 'hidden',\n },\n {\n start: 'show',\n end: 'shown',\n },\n ],\n };\n\n Object.keys(moduleTransitions).forEach(function(key) {\n moduleTransitions[key].forEach(function(pair) {\n var eventStart = pair.start + '.bs.' + key;\n var eventEnd = pair.end + '.bs.' + key;\n $(document.body).on(eventStart, function() {\n M.util.js_pending(eventEnd);\n });\n\n $(document.body).on(eventEnd, function() {\n M.util.js_complete(eventEnd);\n });\n });\n });\n});\n"],"file":"pending.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/pending.js"],"names":["moduleTransitions","alert","start","end","carousel","collapse","dropdown","modal","popover","tab","toast","tooltip","Object","entries","forEach","key","pairs","pair","eventStart","eventEnd","document","body","on","M","util","js_pending","js_complete"],"mappings":"gJAuBA,uD,+9BACMA,CAAAA,CAAiB,CAAG,CACtBC,KAAK,CAAE,CAEH,CACIC,KAAK,CAAE,OADX,CAEIC,GAAG,CAAE,QAFT,CAFG,CADe,CAStBC,QAAQ,CAAE,CACN,CACIF,KAAK,CAAE,OADX,CAEIC,GAAG,CAAE,MAFT,CADM,CATY,CAgBtBE,QAAQ,CAAE,CACN,CACIH,KAAK,CAAE,MADX,CAEIC,GAAG,CAAE,QAFT,CADM,CAKN,CACID,KAAK,CAAE,MADX,CAEIC,GAAG,CAAE,OAFT,CALM,CAhBY,CA2BtBG,QAAQ,CAAE,CACN,CACIJ,KAAK,CAAE,MADX,CAEIC,GAAG,CAAE,QAFT,CADM,CAKN,CACID,KAAK,CAAE,MADX,CAEIC,GAAG,CAAE,OAFT,CALM,CA3BY,CAsCtBI,KAAK,CAAE,CACH,CACIL,KAAK,CAAE,MADX,CAEIC,GAAG,CAAE,QAFT,CADG,CAKH,CACID,KAAK,CAAE,MADX,CAEIC,GAAG,CAAE,OAFT,CALG,CAtCe,CAiDtBK,OAAO,CAAE,CACL,CACIN,KAAK,CAAE,MADX,CAEIC,GAAG,CAAE,QAFT,CADK,CAKL,CACID,KAAK,CAAE,MADX,CAEIC,GAAG,CAAE,OAFT,CALK,CAjDa,CA4DtBM,GAAG,CAAE,CACD,CACIP,KAAK,CAAE,MADX,CAEIC,GAAG,CAAE,QAFT,CADC,CAKD,CACID,KAAK,CAAE,MADX,CAEIC,GAAG,CAAE,OAFT,CALC,CA5DiB,CAuEtBO,KAAK,CAAE,CACH,CACIR,KAAK,CAAE,MADX,CAEIC,GAAG,CAAE,QAFT,CADG,CAKH,CACID,KAAK,CAAE,MADX,CAEIC,GAAG,CAAE,OAFT,CALG,CAvEe,CAkFtBQ,OAAO,CAAE,CACL,CACIT,KAAK,CAAE,MADX,CAEIC,GAAG,CAAE,QAFT,CADK,CAKL,CACID,KAAK,CAAE,MADX,CAEIC,GAAG,CAAE,OAFT,CALK,CAlFa,C,WA8FX,UAAM,CACjBS,MAAM,CAACC,OAAP,CAAeb,CAAf,EAAkCc,OAAlC,CAA0C,WAAkB,cAAhBC,CAAgB,MAAXC,CAAW,MACxDA,CAAK,CAACF,OAAN,CAAc,SAAAG,CAAI,CAAI,IACZC,CAAAA,CAAU,WAAMD,CAAI,CAACf,KAAX,gBAAuBa,CAAvB,CADE,CAEZI,CAAQ,WAAMF,CAAI,CAACd,GAAX,gBAAqBY,CAArB,CAFI,CAGlB,cAAOK,QAAQ,CAACC,IAAhB,EAAsBC,EAAtB,CAAyBJ,CAAzB,CAAqC,UAAM,CACvCK,CAAC,CAACC,IAAF,CAAOC,UAAP,CAAkBN,CAAlB,CACH,CAFD,EAIA,cAAOC,QAAQ,CAACC,IAAhB,EAAsBC,EAAtB,CAAyBH,CAAzB,CAAmC,UAAM,CACrCI,CAAC,CAACC,IAAF,CAAOE,WAAP,CAAmBP,CAAnB,CACH,CAFD,CAGH,CAVD,CAWH,CAZD,CAaH,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 * Add Pending JS checks to stock Bootstrap transitions.\n *\n * @module theme_boost/pending\n * @copyright 2019 Andrew Nicols \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport jQuery from 'jquery';\nconst moduleTransitions = {\n alert: [\n // Alert.\n {\n start: 'close',\n end: 'closed',\n },\n ],\n\n carousel: [\n {\n start: 'slide',\n end: 'slid',\n },\n ],\n\n collapse: [\n {\n start: 'hide',\n end: 'hidden',\n },\n {\n start: 'show',\n end: 'shown',\n },\n ],\n\n dropdown: [\n {\n start: 'hide',\n end: 'hidden',\n },\n {\n start: 'show',\n end: 'shown',\n },\n ],\n\n modal: [\n {\n start: 'hide',\n end: 'hidden',\n },\n {\n start: 'show',\n end: 'shown',\n },\n ],\n\n popover: [\n {\n start: 'hide',\n end: 'hidden',\n },\n {\n start: 'show',\n end: 'shown',\n },\n ],\n\n tab: [\n {\n start: 'hide',\n end: 'hidden',\n },\n {\n start: 'show',\n end: 'shown',\n },\n ],\n\n toast: [\n {\n start: 'hide',\n end: 'hidden',\n },\n {\n start: 'show',\n end: 'shown',\n },\n ],\n\n tooltip: [\n {\n start: 'hide',\n end: 'hidden',\n },\n {\n start: 'show',\n end: 'shown',\n },\n ],\n};\n\nexport default () => {\n Object.entries(moduleTransitions).forEach(([key, pairs]) => {\n pairs.forEach(pair => {\n const eventStart = `${pair.start}.bs.${key}`;\n const eventEnd = `${pair.end}.bs.${key}`;\n jQuery(document.body).on(eventStart, () => {\n M.util.js_pending(eventEnd);\n });\n\n jQuery(document.body).on(eventEnd, () => {\n M.util.js_complete(eventEnd);\n });\n });\n });\n};\n"],"file":"pending.min.js"}
\ No newline at end of file
diff --git a/theme/boost/amd/src/loader.js b/theme/boost/amd/src/loader.js
index 6d5f9d84d25..a050c6f5187 100644
--- a/theme/boost/amd/src/loader.js
+++ b/theme/boost/amd/src/loader.js
@@ -26,38 +26,10 @@
import $ from 'jquery';
import Aria from './aria';
-import Scroll from './scroll';
import Bootstrap from './bootstrap/index';
-import CustomEvents from 'core/custom_interaction_events';
-
-/**
- * Set up the search.
- *
- * @method init
- */
-export {
- init,
- Bootstrap
-};
-
-/**
- * Bootstrap init function
- */
-const init = () => {
- rememberTabs();
-
- enablePopovers();
-
- enableTooltips();
-
- const scroll = new Scroll();
- scroll.init();
-
- // Disables flipping the dropdowns up and getting hidden behind the navbar.
- $.fn.dropdown.Constructor.Default.flip = false;
-
- Aria.init();
-};
+import Pending from 'core/pending';
+import Scroll from './scroll';
+import setupBootstrapPendingChecks from './pending';
/**
* Rember the last visited tabs.
@@ -83,17 +55,15 @@ const rememberTabs = () => {
*/
const enablePopovers = () => {
$('body').popover({
+ container: 'body',
selector: '[data-toggle="popover"]',
- trigger: 'focus hover',
- placement: 'auto'
+ trigger: 'focus',
});
- CustomEvents.define($('body'), [
- CustomEvents.events.escape,
- ]);
- $('body').on(CustomEvents.events.escape, '[data-toggle=popover]', function() {
-
- $(this).trigger('blur');
+ document.addEventListener('keydown', e => {
+ if (e.key === 'Escape' && e.target.closest('[data-toggle="popover"]')) {
+ $(e.target).popover('hide');
+ }
});
};
@@ -104,6 +74,35 @@ const enablePopovers = () => {
const enableTooltips = () => {
$('body').tooltip({
container: 'body',
- selector: '[data-toggle="tooltip"]'
+ selector: '[data-toggle="tooltip"]',
});
-};
\ No newline at end of file
+};
+
+const pendingPromise = new Pending('theme_boost/loader:init');
+
+// Add pending promise event listeners to relevant Bootstrap custom events.
+setupBootstrapPendingChecks();
+
+// Remember the last visited tabs.
+rememberTabs();
+
+// Enable all popovers.
+enablePopovers();
+
+// Enable all tooltips.
+enableTooltips();
+
+// Add scroll handling.
+(new Scroll()).init();
+
+// Disables flipping the dropdowns up and getting hidden behind the navbar.
+$.fn.dropdown.Constructor.Default.flip = false;
+
+// Setup Aria helpers for Bootstrap features.
+Aria.init();
+
+pendingPromise.resolve();
+
+export {
+ Bootstrap,
+};
diff --git a/theme/boost/amd/src/pending.js b/theme/boost/amd/src/pending.js
index 2e25c8126f4..4b3a5480fef 100644
--- a/theme/boost/amd/src/pending.js
+++ b/theme/boost/amd/src/pending.js
@@ -20,112 +20,114 @@
* @copyright 2019 Andrew Nicols
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
-define(['jquery'], function($) {
- var moduleTransitions = {
- alert: [
- // Alert.
- {
- start: 'close',
- end: 'closed',
- },
- ],
- carousel: [
- {
- start: 'slide',
- end: 'slid',
- },
- ],
+import jQuery from 'jquery';
+const moduleTransitions = {
+ alert: [
+ // Alert.
+ {
+ start: 'close',
+ end: 'closed',
+ },
+ ],
- collapse: [
- {
- start: 'hide',
- end: 'hidden',
- },
- {
- start: 'show',
- end: 'shown',
- },
- ],
+ carousel: [
+ {
+ start: 'slide',
+ end: 'slid',
+ },
+ ],
- dropdown: [
- {
- start: 'hide',
- end: 'hidden',
- },
- {
- start: 'show',
- end: 'shown',
- },
- ],
+ collapse: [
+ {
+ start: 'hide',
+ end: 'hidden',
+ },
+ {
+ start: 'show',
+ end: 'shown',
+ },
+ ],
- modal: [
- {
- start: 'hide',
- end: 'hidden',
- },
- {
- start: 'show',
- end: 'shown',
- },
- ],
+ dropdown: [
+ {
+ start: 'hide',
+ end: 'hidden',
+ },
+ {
+ start: 'show',
+ end: 'shown',
+ },
+ ],
- popover: [
- {
- start: 'hide',
- end: 'hidden',
- },
- {
- start: 'show',
- end: 'shown',
- },
- ],
+ modal: [
+ {
+ start: 'hide',
+ end: 'hidden',
+ },
+ {
+ start: 'show',
+ end: 'shown',
+ },
+ ],
- tab: [
- {
- start: 'hide',
- end: 'hidden',
- },
- {
- start: 'show',
- end: 'shown',
- },
- ],
+ popover: [
+ {
+ start: 'hide',
+ end: 'hidden',
+ },
+ {
+ start: 'show',
+ end: 'shown',
+ },
+ ],
- toast: [
- {
- start: 'hide',
- end: 'hidden',
- },
- {
- start: 'show',
- end: 'shown',
- },
- ],
+ tab: [
+ {
+ start: 'hide',
+ end: 'hidden',
+ },
+ {
+ start: 'show',
+ end: 'shown',
+ },
+ ],
- tooltip: [
- {
- start: 'hide',
- end: 'hidden',
- },
- {
- start: 'show',
- end: 'shown',
- },
- ],
- };
+ toast: [
+ {
+ start: 'hide',
+ end: 'hidden',
+ },
+ {
+ start: 'show',
+ end: 'shown',
+ },
+ ],
- Object.keys(moduleTransitions).forEach(function(key) {
- moduleTransitions[key].forEach(function(pair) {
- var eventStart = pair.start + '.bs.' + key;
- var eventEnd = pair.end + '.bs.' + key;
- $(document.body).on(eventStart, function() {
+ tooltip: [
+ {
+ start: 'hide',
+ end: 'hidden',
+ },
+ {
+ start: 'show',
+ end: 'shown',
+ },
+ ],
+};
+
+export default () => {
+ Object.entries(moduleTransitions).forEach(([key, pairs]) => {
+ pairs.forEach(pair => {
+ const eventStart = `${pair.start}.bs.${key}`;
+ const eventEnd = `${pair.end}.bs.${key}`;
+ jQuery(document.body).on(eventStart, () => {
M.util.js_pending(eventEnd);
});
- $(document.body).on(eventEnd, function() {
+ jQuery(document.body).on(eventEnd, () => {
M.util.js_complete(eventEnd);
});
});
});
-});
+};
diff --git a/theme/boost/templates/columns1.mustache b/theme/boost/templates/columns1.mustache
index 08a0a129e51..51fb23efedb 100644
--- a/theme/boost/templates/columns1.mustache
+++ b/theme/boost/templates/columns1.mustache
@@ -64,8 +64,9 @@
{{{ output.standard_end_of_body_html }}}