From fd80c7a6b76f8d419d26f9065ddc4e7c5ec35809 Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Wed, 10 Feb 2021 08:29:18 +0000 Subject: [PATCH] MDL-70789 theme_boost: fix double click on drawer hiding content. If the drawer toggle button was clicked in quick succession to close and then re-open, then the delayed Aria.hide method would be called which hid the drawer content when it finished opening. --- theme/boost/amd/build/drawer.min.js | 2 +- theme/boost/amd/build/drawer.min.js.map | 2 +- theme/boost/amd/src/drawer.js | 5 ++++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/theme/boost/amd/build/drawer.min.js b/theme/boost/amd/build/drawer.min.js index bc8b1a701e9..09816497818 100644 --- a/theme/boost/amd/build/drawer.min.js +++ b/theme/boost/amd/build/drawer.min.js @@ -1,2 +1,2 @@ -define ("theme_boost/drawer",["jquery","core/custom_interaction_events","core/log","core/pubsub","core/aria"],function(a,b,c,d,e){var f={TOGGLE_REGION:"[data-region=\"drawer-toggle\"]",TOGGLE_ACTION:"[data-action=\"toggle-drawer\"]",TOGGLE_TARGET:"aria-controls",TOGGLE_SIDE:"left",BODY:"body",SECTION:".list-group-item[href*=\"#section-\"]",DRAWER:"#nav-drawer"},g=768>a(document).width(),h=function(){if(!a(f.TOGGLE_REGION).length){c.debug("Page is missing a drawer region")}if(!a(f.TOGGLE_ACTION).length){c.debug("Page is missing a drawer toggle link")}a(f.TOGGLE_REGION).each(function(b,c){var d=a(c).find(f.TOGGLE_ACTION),e=d.attr("aria-controls"),h=a(document.getElementById(e)),i="false"==d.attr("aria-expanded"),j=d.attr("data-side"),k=a(f.BODY),l=d.attr("data-preference");if(g){M.util.set_user_preference(l,"false")}h.on("mousewheel DOMMouseScroll",this.preventPageScroll);if(!i){k.addClass("drawer-open-"+j);d.attr("aria-expanded","true")}else{d.attr("aria-expanded","false")}}.bind(this));this.registerEventListeners();if(g){this.closeAll()}};h.prototype.closeAll=function(){a(f.TOGGLE_REGION).each(function(b,c){var d=a(c).find(f.TOGGLE_ACTION),h=d.attr("data-side"),i=a(f.BODY),j=d.attr("aria-controls"),k=a(document.getElementById(j)),l=d.attr("data-preference");d.attr("aria-expanded","false");i.removeClass("drawer-open-"+h);e.hide(k.get());k.addClass("closed");if(!g){M.util.set_user_preference(l,"false")}})};h.prototype.toggleDrawer=function(b){var c=a(b.target).closest("[data-action=toggle-drawer]"),h=c.attr("aria-controls"),i=a(document.getElementById(h)),j=a(f.BODY),k=c.attr("data-side"),l=c.attr("data-preference");if(g){M.util.set_user_preference(l,"false")}j.addClass("drawer-ease");var m="true"==c.attr("aria-expanded");if(!m){c.attr("aria-expanded","true");e.unhide(i.get());i.focus();j.addClass("drawer-open-"+k);i.removeClass("closed");if(!g){M.util.set_user_preference(l,"true")}}else{j.removeClass("drawer-open-"+k);c.attr("aria-expanded","false");i.addClass("closed").delay(500).queue(function(){e.hide(this);a(this).dequeue()});if(!g){M.util.set_user_preference(l,"false")}}d.publish("nav-drawer-toggle-start",m)};h.prototype.preventPageScroll=function(b){var c=b.wheelDelta||b.originalEvent&&b.originalEvent.wheelDelta||-b.originalEvent.detail,d=0<=this.scrollTop+a(this).outerHeight()-this.scrollHeight,e=0>=this.scrollTop;if(0>c&&d||0a(document).width(),h=function(){if(!a(f.TOGGLE_REGION).length){c.debug("Page is missing a drawer region")}if(!a(f.TOGGLE_ACTION).length){c.debug("Page is missing a drawer toggle link")}a(f.TOGGLE_REGION).each(function(b,c){var d=a(c).find(f.TOGGLE_ACTION),e=d.attr("aria-controls"),h=a(document.getElementById(e)),i="false"==d.attr("aria-expanded"),j=d.attr("data-side"),k=a(f.BODY),l=d.attr("data-preference");if(g){M.util.set_user_preference(l,"false")}h.on("mousewheel DOMMouseScroll",this.preventPageScroll);if(!i){k.addClass("drawer-open-"+j);d.attr("aria-expanded","true")}else{d.attr("aria-expanded","false")}}.bind(this));this.registerEventListeners();if(g){this.closeAll()}};h.prototype.closeAll=function(){a(f.TOGGLE_REGION).each(function(b,c){var d=a(c).find(f.TOGGLE_ACTION),h=d.attr("data-side"),i=a(f.BODY),j=d.attr("aria-controls"),k=a(document.getElementById(j)),l=d.attr("data-preference");d.attr("aria-expanded","false");i.removeClass("drawer-open-"+h);e.hide(k.get());k.addClass("closed");if(!g){M.util.set_user_preference(l,"false")}})};h.prototype.toggleDrawer=function(b){var c=a(b.target).closest("[data-action=toggle-drawer]"),h=c.attr("aria-controls"),i=a(document.getElementById(h)),j=a(f.BODY),k=c.attr("data-side"),l=c.attr("data-preference");if(g){M.util.set_user_preference(l,"false")}j.addClass("drawer-ease");var m="true"==c.attr("aria-expanded");if(!m){c.attr("aria-expanded","true");e.unhide(i.get());i.focus();j.addClass("drawer-open-"+k);i.removeClass("closed");if(!g){M.util.set_user_preference(l,"true")}}else{j.removeClass("drawer-open-"+k);c.attr("aria-expanded","false");i.addClass("closed").delay(500).queue(function(){if(a(this).hasClass("closed")){e.hide(this)}a(this).dequeue()});if(!g){M.util.set_user_preference(l,"false")}}d.publish("nav-drawer-toggle-start",m)};h.prototype.preventPageScroll=function(b){var c=b.wheelDelta||b.originalEvent&&b.originalEvent.wheelDelta||-b.originalEvent.detail,d=0<=this.scrollTop+a(this).outerHeight()-this.scrollHeight,e=0>=this.scrollTop;if(0>c&&d||0.\n\n/**\n * Contain the logic for a drawer.\n *\n * @package theme_boost\n * @copyright 2016 Damyon Wiese\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/custom_interaction_events', 'core/log', 'core/pubsub', 'core/aria'],\n function($, CustomEvents, Log, PubSub, Aria) {\n\n var SELECTORS = {\n TOGGLE_REGION: '[data-region=\"drawer-toggle\"]',\n TOGGLE_ACTION: '[data-action=\"toggle-drawer\"]',\n TOGGLE_TARGET: 'aria-controls',\n TOGGLE_SIDE: 'left',\n BODY: 'body',\n SECTION: '.list-group-item[href*=\"#section-\"]',\n DRAWER: '#nav-drawer'\n };\n\n var small = $(document).width() < 768;\n\n /**\n * Constructor for the Drawer.\n *\n * @param {object} root The root jQuery element for the modal\n */\n var Drawer = function() {\n\n if (!$(SELECTORS.TOGGLE_REGION).length) {\n Log.debug('Page is missing a drawer region');\n }\n if (!$(SELECTORS.TOGGLE_ACTION).length) {\n Log.debug('Page is missing a drawer toggle link');\n }\n $(SELECTORS.TOGGLE_REGION).each(function(index, ele) {\n var trigger = $(ele).find(SELECTORS.TOGGLE_ACTION);\n var drawerid = trigger.attr('aria-controls');\n var drawer = $(document.getElementById(drawerid));\n var hidden = trigger.attr('aria-expanded') == 'false';\n var side = trigger.attr('data-side');\n var body = $(SELECTORS.BODY);\n var preference = trigger.attr('data-preference');\n if (small) {\n M.util.set_user_preference(preference, 'false');\n }\n\n drawer.on('mousewheel DOMMouseScroll', this.preventPageScroll);\n\n if (!hidden) {\n body.addClass('drawer-open-' + side);\n trigger.attr('aria-expanded', 'true');\n } else {\n trigger.attr('aria-expanded', 'false');\n }\n }.bind(this));\n\n this.registerEventListeners();\n if (small) {\n this.closeAll();\n }\n };\n\n Drawer.prototype.closeAll = function() {\n $(SELECTORS.TOGGLE_REGION).each(function(index, ele) {\n var trigger = $(ele).find(SELECTORS.TOGGLE_ACTION);\n var side = trigger.attr('data-side');\n var body = $(SELECTORS.BODY);\n var drawerid = trigger.attr('aria-controls');\n var drawer = $(document.getElementById(drawerid));\n var preference = trigger.attr('data-preference');\n\n trigger.attr('aria-expanded', 'false');\n body.removeClass('drawer-open-' + side);\n Aria.hide(drawer.get());\n drawer.addClass('closed');\n if (!small) {\n M.util.set_user_preference(preference, 'false');\n }\n });\n };\n\n /**\n * Open / close the blocks drawer.\n *\n * @method toggleDrawer\n * @param {Event} e\n */\n Drawer.prototype.toggleDrawer = function(e) {\n var trigger = $(e.target).closest('[data-action=toggle-drawer]');\n var drawerid = trigger.attr('aria-controls');\n var drawer = $(document.getElementById(drawerid));\n var body = $(SELECTORS.BODY);\n var side = trigger.attr('data-side');\n var preference = trigger.attr('data-preference');\n if (small) {\n M.util.set_user_preference(preference, 'false');\n }\n\n body.addClass('drawer-ease');\n var open = trigger.attr('aria-expanded') == 'true';\n if (!open) {\n // Open.\n trigger.attr('aria-expanded', 'true');\n Aria.unhide(drawer.get());\n drawer.focus();\n body.addClass('drawer-open-' + side);\n drawer.removeClass('closed');\n if (!small) {\n M.util.set_user_preference(preference, 'true');\n }\n } else {\n // Close.\n body.removeClass('drawer-open-' + side);\n trigger.attr('aria-expanded', 'false');\n drawer.addClass('closed').delay(500).queue(function() {\n Aria.hide(this);\n $(this).dequeue();\n });\n if (!small) {\n M.util.set_user_preference(preference, 'false');\n }\n }\n\n // Publish an event to tell everything that the drawer has been toggled.\n // The drawer transitions closed so another event will fire once teh transition\n // has completed.\n PubSub.publish('nav-drawer-toggle-start', open);\n };\n\n /**\n * Prevent the page from scrolling when the drawer is at max scroll.\n *\n * @method preventPageScroll\n * @param {Event} e\n */\n Drawer.prototype.preventPageScroll = function(e) {\n var delta = e.wheelDelta || (e.originalEvent && e.originalEvent.wheelDelta) || -e.originalEvent.detail,\n bottomOverflow = (this.scrollTop + $(this).outerHeight() - this.scrollHeight) >= 0,\n topOverflow = this.scrollTop <= 0;\n\n if ((delta < 0 && bottomOverflow) || (delta > 0 && topOverflow)) {\n e.preventDefault();\n }\n };\n\n /**\n * Set up all of the event handling for the modal.\n *\n * @method registerEventListeners\n */\n Drawer.prototype.registerEventListeners = function() {\n\n $(SELECTORS.TOGGLE_ACTION).each(function(index, element) {\n CustomEvents.define($(element), [CustomEvents.events.activate]);\n $(element).on(CustomEvents.events.activate, function(e, data) {\n this.toggleDrawer(data.originalEvent);\n data.originalEvent.preventDefault();\n }.bind(this));\n }.bind(this));\n\n $(SELECTORS.SECTION).click(function() {\n if (small) {\n this.closeAll();\n }\n }.bind(this));\n\n // Publish an event to tell everything that the drawer completed the transition\n // to either an open or closed state.\n $(SELECTORS.DRAWER).on('webkitTransitionEnd msTransitionEnd transitionend', function(e) {\n var drawer = $(e.target).closest(SELECTORS.DRAWER);\n // Note: aria-hidden is either present, or absent. It should not be set to false.\n var open = !!drawer.attr('aria-hidden');\n PubSub.publish('nav-drawer-toggle-end', open);\n });\n };\n\n return {\n 'init': function() {\n return new Drawer();\n }\n };\n});\n"],"file":"drawer.min.js"} \ No newline at end of file +{"version":3,"sources":["../src/drawer.js"],"names":["define","$","CustomEvents","Log","PubSub","Aria","SELECTORS","TOGGLE_REGION","TOGGLE_ACTION","TOGGLE_TARGET","TOGGLE_SIDE","BODY","SECTION","DRAWER","small","document","width","Drawer","length","debug","each","index","ele","trigger","find","drawerid","attr","drawer","getElementById","hidden","side","body","preference","M","util","set_user_preference","on","preventPageScroll","addClass","bind","registerEventListeners","closeAll","prototype","removeClass","hide","get","toggleDrawer","e","target","closest","open","unhide","focus","delay","queue","hasClass","dequeue","publish","delta","wheelDelta","originalEvent","detail","bottomOverflow","scrollTop","outerHeight","scrollHeight","topOverflow","preventDefault","element","events","activate","data","click"],"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 .\n\n/**\n * Contain the logic for a drawer.\n *\n * @package theme_boost\n * @copyright 2016 Damyon Wiese\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['jquery', 'core/custom_interaction_events', 'core/log', 'core/pubsub', 'core/aria'],\n function($, CustomEvents, Log, PubSub, Aria) {\n\n var SELECTORS = {\n TOGGLE_REGION: '[data-region=\"drawer-toggle\"]',\n TOGGLE_ACTION: '[data-action=\"toggle-drawer\"]',\n TOGGLE_TARGET: 'aria-controls',\n TOGGLE_SIDE: 'left',\n BODY: 'body',\n SECTION: '.list-group-item[href*=\"#section-\"]',\n DRAWER: '#nav-drawer'\n };\n\n var small = $(document).width() < 768;\n\n /**\n * Constructor for the Drawer.\n *\n * @param {object} root The root jQuery element for the modal\n */\n var Drawer = function() {\n\n if (!$(SELECTORS.TOGGLE_REGION).length) {\n Log.debug('Page is missing a drawer region');\n }\n if (!$(SELECTORS.TOGGLE_ACTION).length) {\n Log.debug('Page is missing a drawer toggle link');\n }\n $(SELECTORS.TOGGLE_REGION).each(function(index, ele) {\n var trigger = $(ele).find(SELECTORS.TOGGLE_ACTION);\n var drawerid = trigger.attr('aria-controls');\n var drawer = $(document.getElementById(drawerid));\n var hidden = trigger.attr('aria-expanded') == 'false';\n var side = trigger.attr('data-side');\n var body = $(SELECTORS.BODY);\n var preference = trigger.attr('data-preference');\n if (small) {\n M.util.set_user_preference(preference, 'false');\n }\n\n drawer.on('mousewheel DOMMouseScroll', this.preventPageScroll);\n\n if (!hidden) {\n body.addClass('drawer-open-' + side);\n trigger.attr('aria-expanded', 'true');\n } else {\n trigger.attr('aria-expanded', 'false');\n }\n }.bind(this));\n\n this.registerEventListeners();\n if (small) {\n this.closeAll();\n }\n };\n\n Drawer.prototype.closeAll = function() {\n $(SELECTORS.TOGGLE_REGION).each(function(index, ele) {\n var trigger = $(ele).find(SELECTORS.TOGGLE_ACTION);\n var side = trigger.attr('data-side');\n var body = $(SELECTORS.BODY);\n var drawerid = trigger.attr('aria-controls');\n var drawer = $(document.getElementById(drawerid));\n var preference = trigger.attr('data-preference');\n\n trigger.attr('aria-expanded', 'false');\n body.removeClass('drawer-open-' + side);\n Aria.hide(drawer.get());\n drawer.addClass('closed');\n if (!small) {\n M.util.set_user_preference(preference, 'false');\n }\n });\n };\n\n /**\n * Open / close the blocks drawer.\n *\n * @method toggleDrawer\n * @param {Event} e\n */\n Drawer.prototype.toggleDrawer = function(e) {\n var trigger = $(e.target).closest('[data-action=toggle-drawer]');\n var drawerid = trigger.attr('aria-controls');\n var drawer = $(document.getElementById(drawerid));\n var body = $(SELECTORS.BODY);\n var side = trigger.attr('data-side');\n var preference = trigger.attr('data-preference');\n if (small) {\n M.util.set_user_preference(preference, 'false');\n }\n\n body.addClass('drawer-ease');\n var open = trigger.attr('aria-expanded') == 'true';\n if (!open) {\n // Open.\n trigger.attr('aria-expanded', 'true');\n Aria.unhide(drawer.get());\n drawer.focus();\n body.addClass('drawer-open-' + side);\n drawer.removeClass('closed');\n if (!small) {\n M.util.set_user_preference(preference, 'true');\n }\n } else {\n // Close.\n body.removeClass('drawer-open-' + side);\n trigger.attr('aria-expanded', 'false');\n drawer.addClass('closed').delay(500).queue(function() {\n // Ensure that during the delay, the drawer wasn't re-opened.\n if ($(this).hasClass('closed')) {\n Aria.hide(this);\n }\n $(this).dequeue();\n });\n if (!small) {\n M.util.set_user_preference(preference, 'false');\n }\n }\n\n // Publish an event to tell everything that the drawer has been toggled.\n // The drawer transitions closed so another event will fire once teh transition\n // has completed.\n PubSub.publish('nav-drawer-toggle-start', open);\n };\n\n /**\n * Prevent the page from scrolling when the drawer is at max scroll.\n *\n * @method preventPageScroll\n * @param {Event} e\n */\n Drawer.prototype.preventPageScroll = function(e) {\n var delta = e.wheelDelta || (e.originalEvent && e.originalEvent.wheelDelta) || -e.originalEvent.detail,\n bottomOverflow = (this.scrollTop + $(this).outerHeight() - this.scrollHeight) >= 0,\n topOverflow = this.scrollTop <= 0;\n\n if ((delta < 0 && bottomOverflow) || (delta > 0 && topOverflow)) {\n e.preventDefault();\n }\n };\n\n /**\n * Set up all of the event handling for the modal.\n *\n * @method registerEventListeners\n */\n Drawer.prototype.registerEventListeners = function() {\n\n $(SELECTORS.TOGGLE_ACTION).each(function(index, element) {\n CustomEvents.define($(element), [CustomEvents.events.activate]);\n $(element).on(CustomEvents.events.activate, function(e, data) {\n this.toggleDrawer(data.originalEvent);\n data.originalEvent.preventDefault();\n }.bind(this));\n }.bind(this));\n\n $(SELECTORS.SECTION).click(function() {\n if (small) {\n this.closeAll();\n }\n }.bind(this));\n\n // Publish an event to tell everything that the drawer completed the transition\n // to either an open or closed state.\n $(SELECTORS.DRAWER).on('webkitTransitionEnd msTransitionEnd transitionend', function(e) {\n var drawer = $(e.target).closest(SELECTORS.DRAWER);\n // Note: aria-hidden is either present, or absent. It should not be set to false.\n var open = !!drawer.attr('aria-hidden');\n PubSub.publish('nav-drawer-toggle-end', open);\n });\n };\n\n return {\n 'init': function() {\n return new Drawer();\n }\n };\n});\n"],"file":"drawer.min.js"} \ No newline at end of file diff --git a/theme/boost/amd/src/drawer.js b/theme/boost/amd/src/drawer.js index 160f14ccfa3..c64de0c54c3 100644 --- a/theme/boost/amd/src/drawer.js +++ b/theme/boost/amd/src/drawer.js @@ -129,7 +129,10 @@ define(['jquery', 'core/custom_interaction_events', 'core/log', 'core/pubsub', ' body.removeClass('drawer-open-' + side); trigger.attr('aria-expanded', 'false'); drawer.addClass('closed').delay(500).queue(function() { - Aria.hide(this); + // Ensure that during the delay, the drawer wasn't re-opened. + if ($(this).hasClass('closed')) { + Aria.hide(this); + } $(this).dequeue(); }); if (!small) {