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>