From 8f28fbee118d63304ed1a7aed06d9bef079fd12a Mon Sep 17 00:00:00 2001 From: Andrew Nicols Date: Thu, 18 Jun 2020 19:19:41 +0800 Subject: [PATCH] MDL-69086 theme_boost: Improve pendingJs checks for bootstrap Where an element, like an `alert`, is closed it is removed from the DOM before the event fires (this is a correct behaviour). This means that the final event confirming that the action happened (i.e. close => closed) fires, but does not bubble up the DOM to the document.body. This change moves the end event listener to only be added after a start event has been fired, and to attach directly to the HTMLElement where it will be fired. This means that the Event handler will still be called, even though it has been removed from the DOM, because it does not need to bubble up to the body. --- theme/boost/amd/build/pending.min.js | 2 +- theme/boost/amd/build/pending.min.js.map | 2 +- theme/boost/amd/src/pending.js | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/theme/boost/amd/build/pending.min.js b/theme/boost/amd/build/pending.min.js index 3630be6a88f..8aff8447a50 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",["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);ca.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 */\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 +{"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","e","M","util","js_pending","target","one","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,SAAAK,CAAC,CAAI,CACtCC,CAAC,CAACC,IAAF,CAAOC,UAAP,CAAkBP,CAAlB,EACA,cAAOI,CAAC,CAACI,MAAT,EAAiBC,GAAjB,CAAqBT,CAArB,CAA+B,UAAM,CACjCK,CAAC,CAACC,IAAF,CAAOI,WAAP,CAAmBV,CAAnB,CACH,CAFD,CAGH,CALD,CAOH,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, e => {\n M.util.js_pending(eventEnd);\n jQuery(e.target).one(eventEnd, () => {\n M.util.js_complete(eventEnd);\n });\n });\n\n });\n });\n};\n"],"file":"pending.min.js"} \ No newline at end of file diff --git a/theme/boost/amd/src/pending.js b/theme/boost/amd/src/pending.js index 4b3a5480fef..ad036d4f11f 100644 --- a/theme/boost/amd/src/pending.js +++ b/theme/boost/amd/src/pending.js @@ -121,13 +121,13 @@ export default () => { pairs.forEach(pair => { const eventStart = `${pair.start}.bs.${key}`; const eventEnd = `${pair.end}.bs.${key}`; - jQuery(document.body).on(eventStart, () => { + jQuery(document.body).on(eventStart, e => { M.util.js_pending(eventEnd); + jQuery(e.target).one(eventEnd, () => { + M.util.js_complete(eventEnd); + }); }); - jQuery(document.body).on(eventEnd, () => { - M.util.js_complete(eventEnd); - }); }); }); };