From ce8a2d11d895a8bbd51732f1672b849c1f9e8b8c Mon Sep 17 00:00:00 2001
From: Jun Pataleta <jun@moodle.com>
Date: Thu, 10 Oct 2019 15:12:54 +0800
Subject: [PATCH] MDL-66076 forumreport_summary: filter JS and template
 optimisations

---
 .../report/summary/amd/build/filters.min.js   |  2 +-
 .../summary/amd/build/filters.min.js.map      |  2 +-
 .../report/summary/amd/build/selectors.min.js |  2 +
 .../summary/amd/build/selectors.min.js.map    |  1 +
 mod/forum/report/summary/amd/src/filters.js   | 93 ++++++-------------
 mod/forum/report/summary/amd/src/selectors.js | 36 +++++++
 .../report/summary/templates/filters.mustache | 10 +-
 7 files changed, 76 insertions(+), 70 deletions(-)
 create mode 100644 mod/forum/report/summary/amd/build/selectors.min.js
 create mode 100644 mod/forum/report/summary/amd/build/selectors.min.js.map
 create mode 100644 mod/forum/report/summary/amd/src/selectors.js

diff --git a/mod/forum/report/summary/amd/build/filters.min.js b/mod/forum/report/summary/amd/build/filters.min.js
index af21835c4bb..6618d3f162a 100644
--- a/mod/forum/report/summary/amd/build/filters.min.js
+++ b/mod/forum/report/summary/amd/build/filters.min.js
@@ -1,2 +1,2 @@
-define ("forumreport_summary/filters",["exports","jquery","core/popper"],function(a,b,c){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.init=void 0;b=d(b);c=d(c);function d(a){return a&&a.__esModule?a:{default:a}}var e=function(a){a=(0,b.default)(a);(0,b.default)(document).ready(function(){(0,b.default)(".loading-icon").hide();(0,b.default)("#summaryreport").removeClass("hidden")});var d=function(a){var b=a.target.parentNode.parentNode.parentElement.querySelectorAll("input[type=\"checkbox\"]:checked");b.forEach(function(a){a.checked=!1})};(0,b.default)(a).on("click",".filter-clear",function(a){a.preventDefault();d(a)});var e=function(a){var c=(0,b.default)("#filtersform").attr("action");if(a){a.preventDefault();var d=a.target.search.substr(1);c+="&"+d}(0,b.default)("#filtersform").attr("action",c);(0,b.default)("#filtersform").submit()};(0,b.default)(".resettable").on("click","a",function(a){e(a)});(0,b.default)("thead").on("click","a",function(a){e(a)});(0,b.default)(".pagination").on("click","a",function(a){e(a)});var f=function(a){var b=document.getElementById(a),c=b.querySelectorAll("input[type=\"checkbox\"]:not(:checked)");c.forEach(function(a){a.checked=!0})},g=function(a){(0,b.default)(a).addClass("hidden");e(!1)};(0,b.default)("#filter-groups-popover .select-all").on("click",function(a){a.preventDefault();f("filter-groups-popover")});(0,b.default)("#filter-groups-button").on("click",function(){var a=document.querySelector("#filter-groups-button"),b=document.querySelector("#filter-groups-popover");new c.default(a,b,{placement:"bottom"});var d=document.getElementById("filter-groups-button"),e=document.getElementById("filter-groups-popover");e.classList.remove("hidden");d.setAttribute("aria-expanded",!0);d.classList.add("btn-outline-primary");d.classList.remove("btn-primary");e.querySelector("input").focus()});(0,b.default)(a).on("click","#filter-groups-popover .filter-save",function(a){a.preventDefault();g("#filter-groups-popover")});(0,b.default)("#filter-groups-popover").on("keydown",".filter-actions",function(a){if((13===a.charCode||13===a.keyCode||32===a.charCode||32===a.keyCode)&&0<a.target.classList.length){a.preventDefault();switch(a.target.classList[0]){case"select-all":f("filter-groups-popover");break;case"filter-clear":d(a);break;case"filter-save":g("#filter-groups-popover");break;}}})};a.init=e});
+define ("forumreport_summary/filters",["exports","jquery","core/popper","core/custom_interaction_events","forumreport_summary/selectors"],function(a,b,c,d,e){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.init=void 0;b=f(b);c=f(c);d=f(d);e=f(e);function f(a){return a&&a.__esModule?a:{default:a}}var g=function(a){var f=(0,b.default)(a);(0,b.default)(document).ready(function(){(0,b.default)(".loading-icon").hide();(0,b.default)("#summaryreport").removeClass("hidden")});var g=function(a){var c=(0,b.default)("#filtersform").attr("action");if(a){a.preventDefault();var d=a.target.search.substr(1);c+="&"+d}(0,b.default)("#filtersform").attr("action",c);(0,b.default)("#filtersform").submit()};(0,b.default)(".resettable").on("click","a",function(a){g(a)});(0,b.default)("thead").on("click","a",function(a){g(a)});(0,b.default)(".pagination").on("click","a",function(a){g(a)});var h=function(a){(0,b.default)(a).addClass("hidden");g(!1)};f.on(d.default.events.activate,e.default.filters.group.selectall,function(){var b=a.querySelectorAll(e.default.filters.group.checkbox+":not(:checked)");b.forEach(function(a){a.checked=!0})});f.on(d.default.events.activate,e.default.filters.group.clear,function(){var b=a.querySelectorAll(e.default.filters.group.checkbox+":checked");b.forEach(function(a){a.checked=!1})});f.on(d.default.events.activate,e.default.filters.group.trigger,function(){var b=a.querySelector(e.default.filters.group.trigger),d=a.querySelector(e.default.filters.group.popover);new c.default(b,d,{placement:"bottom"});d.classList.remove("hidden");b.classList.add("btn-outline-primary");b.classList.remove("btn-primary");b.setAttribute("aria-expanded",!0)});f.on(d.default.events.activate,e.default.filters.group.save,function(){h("#filter-groups-popover")})};a.init=g});
 //# sourceMappingURL=filters.min.js.map
diff --git a/mod/forum/report/summary/amd/build/filters.min.js.map b/mod/forum/report/summary/amd/build/filters.min.js.map
index 41efa75b4af..69e1fba21f8 100644
--- a/mod/forum/report/summary/amd/build/filters.min.js.map
+++ b/mod/forum/report/summary/amd/build/filters.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["../src/filters.js"],"names":["init","root","document","ready","hide","removeClass","clearAll","event","selected","target","parentNode","parentElement","querySelectorAll","forEach","checkbox","checked","on","preventDefault","generateWithFilters","newLink","attr","filterParams","search","substr","submit","selectAll","checkboxdiv","targetdiv","getElementById","deselected","submitWithFilter","containerelement","addClass","referenceElement","querySelector","popperContent","Popper","placement","groupsbutton","groupspopover","classList","remove","setAttribute","add","focus","charCode","keyCode","length"],"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 <http://www.gnu.org/licenses/>.\n\n/**\n * Module responsible for handling forum summary report filters.\n *\n * @module     forumreport_summary/filters\n * @package    forumreport_summary\n * @copyright  2019 Michael Hawkins <michaelh@moodle.com>\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport $ from 'jquery';\nimport Popper from 'core/popper';\n\nexport const init = (root) => {\n    root = $(root);\n\n    // Hide loading spinner and show report once page is ready.\n    // This ensures filters can be applied when sorting by columns.\n    $(document).ready(function() {\n        $('.loading-icon').hide();\n        $('#summaryreport').removeClass('hidden');\n    });\n\n    // Generic filter handlers.\n\n    // Called to clear filters.\n    var clearAll = (event) => {\n        // Clear checkboxes.\n        let selected = event.target.parentNode.parentNode.parentElement.querySelectorAll('input[type=\"checkbox\"]:checked');\n\n        selected.forEach(function(checkbox) {\n            checkbox.checked = false;\n        });\n    };\n\n    // Event handler for clearing filter by clicking option.\n    $(root).on(\"click\", \".filter-clear\", function(event) {\n        event.preventDefault();\n        clearAll(event);\n    });\n\n    // Called to override click event to trigger a proper generate request with filtering.\n    var generateWithFilters = (event) => {\n        var newLink = $('#filtersform').attr('action');\n\n        if (event) {\n            event.preventDefault();\n\n            let filterParams = event.target.search.substr(1);\n            newLink += '&' + filterParams;\n        }\n\n        $('#filtersform').attr('action', newLink);\n        $('#filtersform').submit();\n    };\n\n    // Override 'reset table preferences' so it generates with filters.\n    $('.resettable').on(\"click\", \"a\", function(event) {\n        generateWithFilters(event);\n    });\n\n    // Override table heading sort links so they generate with filters.\n    $('thead').on(\"click\", \"a\", function(event) {\n        generateWithFilters(event);\n    });\n\n    // Override pagination page links so they generate with filters.\n    $('.pagination').on(\"click\", \"a\", function(event) {\n        generateWithFilters(event);\n    });\n\n    // Select all checkboxes within a filter section.\n    var selectAll = (checkboxdiv) => {\n        let targetdiv = document.getElementById(checkboxdiv);\n        let deselected = targetdiv.querySelectorAll('input[type=\"checkbox\"]:not(:checked)');\n\n        deselected.forEach(function(checkbox) {\n            checkbox.checked = true;\n        });\n    };\n\n    // Submit report via filter\n    var submitWithFilter = (containerelement) => {\n        // Close the container (eg popover).\n        $(containerelement).addClass('hidden');\n\n        // Submit the filter values and re-generate report.\n        generateWithFilters(false);\n    };\n\n    // Groups filter specific handlers.\n\n    // Event handler for clicking select all groups.\n    $('#filter-groups-popover .select-all').on('click', function(event) {\n        event.preventDefault();\n        selectAll('filter-groups-popover');\n    });\n\n    // Event handler for showing groups filter popover.\n    $('#filter-groups-button').on('click', function() {\n        // Create popover.\n        var referenceElement = document.querySelector('#filter-groups-button'),\n            popperContent = document.querySelector('#filter-groups-popover');\n\n        new Popper(referenceElement, popperContent, {placement: 'bottom'});\n\n        // Show popover and switch focus.\n        var groupsbutton = document.getElementById('filter-groups-button'),\n            groupspopover = document.getElementById('filter-groups-popover');\n        groupspopover.classList.remove('hidden');\n        groupsbutton.setAttribute('aria-expanded', true);\n        groupsbutton.classList.add('btn-outline-primary');\n        groupsbutton.classList.remove('btn-primary');\n        groupspopover.querySelector('input').focus();\n    });\n\n    // Event handler to click save groups filter.\n    $(root).on(\"click\", \"#filter-groups-popover .filter-save\", function(event) {\n        event.preventDefault();\n        submitWithFilter('#filter-groups-popover');\n    });\n\n    // Event handler to support pressing enter/space on groups filter popover actions.\n    $('#filter-groups-popover').on(\"keydown\", \".filter-actions\", function(event) {\n    if ((event.charCode === 13 || event.keyCode === 13 || event.charCode === 32 || event.keyCode === 32)\n                && event.target.classList.length > 0) {\n            event.preventDefault();\n\n            switch(event.target.classList[0]) {\n                case 'select-all':\n                    selectAll('filter-groups-popover');\n                    break;\n                case 'filter-clear':\n                    clearAll(event);\n                    break;\n                case 'filter-save':\n                    submitWithFilter('#filter-groups-popover');\n                    break;\n            }\n        }\n    });\n};\n"],"file":"filters.min.js"}
\ No newline at end of file
+{"version":3,"sources":["../src/filters.js"],"names":["init","root","jqRoot","document","ready","hide","removeClass","generateWithFilters","event","newLink","attr","preventDefault","filterParams","target","search","substr","submit","on","submitWithFilter","containerelement","addClass","CustomEvents","events","activate","Selectors","filters","group","selectall","deselected","querySelectorAll","checkbox","forEach","checked","clear","selected","trigger","referenceElement","querySelector","popperContent","popover","Popper","placement","classList","remove","add","setAttribute","save"],"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 <http://www.gnu.org/licenses/>.\n\n/**\n * Module responsible for handling forum summary report filters.\n *\n * @module     forumreport_summary/filters\n * @package    forumreport_summary\n * @copyright  2019 Michael Hawkins <michaelh@moodle.com>\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport $ from 'jquery';\nimport Popper from 'core/popper';\nimport CustomEvents from 'core/custom_interaction_events';\nimport Selectors from 'forumreport_summary/selectors';\n\nexport const init = (root) => {\n    let jqRoot = $(root);\n\n    // Hide loading spinner and show report once page is ready.\n    // This ensures filters can be applied when sorting by columns.\n    $(document).ready(function() {\n        $('.loading-icon').hide();\n        $('#summaryreport').removeClass('hidden');\n    });\n\n    // Generic filter handlers.\n\n    // Called to override click event to trigger a proper generate request with filtering.\n    var generateWithFilters = (event) => {\n        var newLink = $('#filtersform').attr('action');\n\n        if (event) {\n            event.preventDefault();\n\n            let filterParams = event.target.search.substr(1);\n            newLink += '&' + filterParams;\n        }\n\n        $('#filtersform').attr('action', newLink);\n        $('#filtersform').submit();\n    };\n\n    // Override 'reset table preferences' so it generates with filters.\n    $('.resettable').on(\"click\", \"a\", function(event) {\n        generateWithFilters(event);\n    });\n\n    // Override table heading sort links so they generate with filters.\n    $('thead').on(\"click\", \"a\", function(event) {\n        generateWithFilters(event);\n    });\n\n    // Override pagination page links so they generate with filters.\n    $('.pagination').on(\"click\", \"a\", function(event) {\n        generateWithFilters(event);\n    });\n\n    // Submit report via filter\n    var submitWithFilter = (containerelement) => {\n        // Close the container (eg popover).\n        $(containerelement).addClass('hidden');\n\n        // Submit the filter values and re-generate report.\n        generateWithFilters(false);\n    };\n\n    // Groups filter specific handlers.\n\n    // Event handler for clicking select all groups.\n    jqRoot.on(CustomEvents.events.activate, Selectors.filters.group.selectall, function() {\n        let deselected = root.querySelectorAll(Selectors.filters.group.checkbox + ':not(:checked)');\n        deselected.forEach(function(checkbox) {\n            checkbox.checked = true;\n        });\n    });\n\n    // Event handler for clearing filter by clicking option.\n    jqRoot.on(CustomEvents.events.activate, Selectors.filters.group.clear, function() {\n        // Clear checkboxes.\n        let selected = root.querySelectorAll(Selectors.filters.group.checkbox + ':checked');\n        selected.forEach(function(checkbox) {\n            checkbox.checked = false;\n        });\n    });\n\n    // Event handler for showing groups filter popover.\n    jqRoot.on(CustomEvents.events.activate, Selectors.filters.group.trigger, function() {\n        // Create popover.\n        var referenceElement = root.querySelector(Selectors.filters.group.trigger),\n            popperContent = root.querySelector(Selectors.filters.group.popover);\n\n        new Popper(referenceElement, popperContent, {placement: 'bottom'});\n\n        // Show popover.\n        popperContent.classList.remove('hidden');\n\n        // Change to outlined button.\n        referenceElement.classList.add('btn-outline-primary');\n        referenceElement.classList.remove('btn-primary');\n\n        // Let screen readers know that it's now expanded.\n        referenceElement.setAttribute('aria-expanded', true);\n    });\n\n    // Event handler to click save groups filter.\n    jqRoot.on(CustomEvents.events.activate, Selectors.filters.group.save, function() {\n        submitWithFilter('#filter-groups-popover');\n    });\n};\n"],"file":"filters.min.js"}
\ No newline at end of file
diff --git a/mod/forum/report/summary/amd/build/selectors.min.js b/mod/forum/report/summary/amd/build/selectors.min.js
new file mode 100644
index 00000000000..320b8f5b972
--- /dev/null
+++ b/mod/forum/report/summary/amd/build/selectors.min.js
@@ -0,0 +1,2 @@
+define ("forumreport_summary/selectors",["exports"],function(a){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.default=void 0;a.default={filters:{group:{checkbox:"[data-region=\"filter-groups\"] input[type=\"checkbox\"]",clear:"[data-region=\"filter-groups\"] .filter-clear",popover:"#filter-groups-popover",save:"[data-region=\"filter-groups\"] .filter-save",selectall:"[data-region=\"filter-groups\"] .select-all",trigger:"#filter-groups-button"}}};return a.default});
+//# sourceMappingURL=selectors.min.js.map
diff --git a/mod/forum/report/summary/amd/build/selectors.min.js.map b/mod/forum/report/summary/amd/build/selectors.min.js.map
new file mode 100644
index 00000000000..2fc04188905
--- /dev/null
+++ b/mod/forum/report/summary/amd/build/selectors.min.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../src/selectors.js"],"names":["filters","group","checkbox","clear","popover","save","selectall","trigger"],"mappings":"yJAwBe,CACXA,OAAO,CAAE,CACLC,KAAK,CAAE,CACHC,QAAQ,CAAE,0DADP,CAEHC,KAAK,CAAE,+CAFJ,CAGHC,OAAO,CAAE,wBAHN,CAIHC,IAAI,CAAE,8CAJH,CAKHC,SAAS,CAAE,6CALR,CAMHC,OAAO,CAAE,uBANN,CADF,CADE,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 <http://www.gnu.org/licenses/>.\n\n/**\n * Module containing the selectors for the forum summary report.\n *\n * @module     forumreport_summary/selectors\n * @package    forumreport_summary\n * @copyright  2019 Jun Pataleta\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nexport default {\n    filters: {\n        group: {\n            checkbox: '[data-region=\"filter-groups\"] input[type=\"checkbox\"]',\n            clear: '[data-region=\"filter-groups\"] .filter-clear',\n            popover: '#filter-groups-popover',\n            save: '[data-region=\"filter-groups\"] .filter-save',\n            selectall: '[data-region=\"filter-groups\"] .select-all',\n            trigger: '#filter-groups-button',\n        }\n    }\n};\n"],"file":"selectors.min.js"}
\ No newline at end of file
diff --git a/mod/forum/report/summary/amd/src/filters.js b/mod/forum/report/summary/amd/src/filters.js
index 3aa22142650..9ee20d857ee 100644
--- a/mod/forum/report/summary/amd/src/filters.js
+++ b/mod/forum/report/summary/amd/src/filters.js
@@ -24,9 +24,11 @@
 
 import $ from 'jquery';
 import Popper from 'core/popper';
+import CustomEvents from 'core/custom_interaction_events';
+import Selectors from 'forumreport_summary/selectors';
 
 export const init = (root) => {
-    root = $(root);
+    let jqRoot = $(root);
 
     // Hide loading spinner and show report once page is ready.
     // This ensures filters can be applied when sorting by columns.
@@ -37,22 +39,6 @@ export const init = (root) => {
 
     // Generic filter handlers.
 
-    // Called to clear filters.
-    var clearAll = (event) => {
-        // Clear checkboxes.
-        let selected = event.target.parentNode.parentNode.parentElement.querySelectorAll('input[type="checkbox"]:checked');
-
-        selected.forEach(function(checkbox) {
-            checkbox.checked = false;
-        });
-    };
-
-    // Event handler for clearing filter by clicking option.
-    $(root).on("click", ".filter-clear", function(event) {
-        event.preventDefault();
-        clearAll(event);
-    });
-
     // Called to override click event to trigger a proper generate request with filtering.
     var generateWithFilters = (event) => {
         var newLink = $('#filtersform').attr('action');
@@ -83,16 +69,6 @@ export const init = (root) => {
         generateWithFilters(event);
     });
 
-    // Select all checkboxes within a filter section.
-    var selectAll = (checkboxdiv) => {
-        let targetdiv = document.getElementById(checkboxdiv);
-        let deselected = targetdiv.querySelectorAll('input[type="checkbox"]:not(:checked)');
-
-        deselected.forEach(function(checkbox) {
-            checkbox.checked = true;
-        });
-    };
-
     // Submit report via filter
     var submitWithFilter = (containerelement) => {
         // Close the container (eg popover).
@@ -105,52 +81,43 @@ export const init = (root) => {
     // Groups filter specific handlers.
 
     // Event handler for clicking select all groups.
-    $('#filter-groups-popover .select-all').on('click', function(event) {
-        event.preventDefault();
-        selectAll('filter-groups-popover');
+    jqRoot.on(CustomEvents.events.activate, Selectors.filters.group.selectall, function() {
+        let deselected = root.querySelectorAll(Selectors.filters.group.checkbox + ':not(:checked)');
+        deselected.forEach(function(checkbox) {
+            checkbox.checked = true;
+        });
+    });
+
+    // Event handler for clearing filter by clicking option.
+    jqRoot.on(CustomEvents.events.activate, Selectors.filters.group.clear, function() {
+        // Clear checkboxes.
+        let selected = root.querySelectorAll(Selectors.filters.group.checkbox + ':checked');
+        selected.forEach(function(checkbox) {
+            checkbox.checked = false;
+        });
     });
 
     // Event handler for showing groups filter popover.
-    $('#filter-groups-button').on('click', function() {
+    jqRoot.on(CustomEvents.events.activate, Selectors.filters.group.trigger, function() {
         // Create popover.
-        var referenceElement = document.querySelector('#filter-groups-button'),
-            popperContent = document.querySelector('#filter-groups-popover');
+        var referenceElement = root.querySelector(Selectors.filters.group.trigger),
+            popperContent = root.querySelector(Selectors.filters.group.popover);
 
         new Popper(referenceElement, popperContent, {placement: 'bottom'});
 
-        // Show popover and switch focus.
-        var groupsbutton = document.getElementById('filter-groups-button'),
-            groupspopover = document.getElementById('filter-groups-popover');
-        groupspopover.classList.remove('hidden');
-        groupsbutton.setAttribute('aria-expanded', true);
-        groupsbutton.classList.add('btn-outline-primary');
-        groupsbutton.classList.remove('btn-primary');
-        groupspopover.querySelector('input').focus();
+        // Show popover.
+        popperContent.classList.remove('hidden');
+
+        // Change to outlined button.
+        referenceElement.classList.add('btn-outline-primary');
+        referenceElement.classList.remove('btn-primary');
+
+        // Let screen readers know that it's now expanded.
+        referenceElement.setAttribute('aria-expanded', true);
     });
 
     // Event handler to click save groups filter.
-    $(root).on("click", "#filter-groups-popover .filter-save", function(event) {
-        event.preventDefault();
+    jqRoot.on(CustomEvents.events.activate, Selectors.filters.group.save, function() {
         submitWithFilter('#filter-groups-popover');
     });
-
-    // Event handler to support pressing enter/space on groups filter popover actions.
-    $('#filter-groups-popover').on("keydown", ".filter-actions", function(event) {
-    if ((event.charCode === 13 || event.keyCode === 13 || event.charCode === 32 || event.keyCode === 32)
-                && event.target.classList.length > 0) {
-            event.preventDefault();
-
-            switch(event.target.classList[0]) {
-                case 'select-all':
-                    selectAll('filter-groups-popover');
-                    break;
-                case 'filter-clear':
-                    clearAll(event);
-                    break;
-                case 'filter-save':
-                    submitWithFilter('#filter-groups-popover');
-                    break;
-            }
-        }
-    });
 };
diff --git a/mod/forum/report/summary/amd/src/selectors.js b/mod/forum/report/summary/amd/src/selectors.js
new file mode 100644
index 00000000000..df0c6db8eeb
--- /dev/null
+++ b/mod/forum/report/summary/amd/src/selectors.js
@@ -0,0 +1,36 @@
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// Moodle is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
+
+/**
+ * Module containing the selectors for the forum summary report.
+ *
+ * @module     forumreport_summary/selectors
+ * @package    forumreport_summary
+ * @copyright  2019 Jun Pataleta
+ * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+export default {
+    filters: {
+        group: {
+            checkbox: '[data-region="filter-groups"] input[type="checkbox"]',
+            clear: '[data-region="filter-groups"] .filter-clear',
+            popover: '#filter-groups-popover',
+            save: '[data-region="filter-groups"] .filter-save',
+            selectall: '[data-region="filter-groups"] .select-all',
+            trigger: '#filter-groups-button',
+        }
+    }
+};
diff --git a/mod/forum/report/summary/templates/filters.mustache b/mod/forum/report/summary/templates/filters.mustache
index 92c0dc6b8ac..211546c5fd4 100644
--- a/mod/forum/report/summary/templates/filters.mustache
+++ b/mod/forum/report/summary/templates/filters.mustache
@@ -52,7 +52,7 @@
             {{! Start groups filter popover}}
             <div id="filter-groups-popover" class="popover m-t-1 hidden">
                 <h3 class="popover-header">{{# str}} filter:groupsname, forumreport_summary {{/ str}}</h3>
-                <div class="popover-body">
+                <div class="popover-body" data-region="filter-groups">
                     <div class="form-check filter-scrollable">
                         {{#filtergroups}}
                         <input id="filtergroups{{groupid}}" class="form-check-input" type="checkbox" name="filtergroups[]"
@@ -60,14 +60,14 @@
                         <label class="form-check-label pt-1" for="filtergroups{{groupid}}">{{groupname}}</label>
                         <br>
                         {{/filtergroups}}
-                        <br>
                     </div>
                     <div class="filter-actions">
-                        <button type="button" class="select-all btn btn-link p-0 p-r-1" aria-label="{{# str}} selectall {{/ str}}">{{# str}} selectall {{/ str}}</button>
+                        <button type="button" class="select-all btn btn-link p-0 pr-1" aria-label="{{# str}} selectall {{/ str}}">{{# str}} selectall {{/ str}}</button>
                         <div class="float-right">
-                            <button type="button" class="filter-clear btn btn-link p-0 p-r-1" aria-label="{{# str}} clear {{/ str}}">{{# str}} clear {{/ str}}</button>
+                            <button type="button" class="filter-clear btn btn-link p-0 px-1" aria-label="{{# str}} clear {{/ str}}">{{# str}} clear {{/ str}}</button>
                             <button type="button" class="filter-save btn btn-link p-0" aria-label="{{# str}} save {{/ str}}">
-                                    <strong>{{# str}} save {{/ str}}</strong></button>
+                                <strong>{{# str}} save {{/ str}}</strong>
+                            </button>
                         </div>
                     </div>
                 </div>