From 64da1d093ad07b3e418c8494e7b404f5e01ce356 Mon Sep 17 00:00:00 2001 From: Michael Hawkins Date: Fri, 1 Nov 2019 14:19:04 +0800 Subject: [PATCH] MDL-66297 forumreport_summary: Added filter data to forum export links From/to date filter timestamps, as well as discussion IDs of any filtered groups. --- .../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 | 2 +- mod/forum/report/summary/amd/src/filters.js | 11 +++++ mod/forum/report/summary/amd/src/selectors.js | 3 ++ .../report/summary/classes/output/filters.php | 31 ++++++++++++++ .../report/summary/classes/summary_table.php | 40 ++++++++++++++++--- mod/forum/report/summary/index.php | 2 +- .../summary/lang/en/forumreport_summary.php | 2 + .../templates/export_link_button.mustache | 31 ++++++++++++++ .../report/summary/templates/filters.mustache | 13 ++++++ 12 files changed, 130 insertions(+), 11 deletions(-) create mode 100644 mod/forum/report/summary/templates/export_link_button.mustache diff --git a/mod/forum/report/summary/amd/build/filters.min.js b/mod/forum/report/summary/amd/build/filters.min.js index 6b122fe0a15..c2fdef94765 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","core/custom_interaction_events","forumreport_summary/selectors","core/yui","core/ajax","core/key_codes"],function(a,b,c,d,e,f,g,h){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.init=void 0;b=i(b);c=i(c);d=i(d);e=i(e);f=i(f);g=i(g);h=i(h);function i(a){return a&&a.__esModule?a:{default:a}}var j=function(a){var i=(0,b.default)(a);(0,b.default)(document).ready(function(){(0,b.default)(".loading-icon").hide();(0,b.default)("#summaryreport").removeClass("hidden")});var j=function(a,b){var c=document.forms.filtersform.action,d;if(a){a.preventDefault();var e=c.split("?"),f=e[1],g=b.split("&"),h="",i=[],j=[];f.split("&").forEach(function(a){var b=a.split("=");i.push(b[0]);j.push(b[1])});g.forEach(function(a){var b=a.split("="),c=i.indexOf(b[0]);if(-1e){var g=document.getElementById("dates-filter-warning");g.classList.remove("hidden");g.classList.add("d-block")}else{b.elements["datefrom[timestamp]"].value=c;b.elements["datefrom[enabled]"].value=d;b.elements["dateto[timestamp]"].value=e;b.elements["dateto[enabled]"].value=f;l("#filter-dates-popover")}})}});i.on(d.default.events.activate,e.default.filters.date.calendariconfrom,function(){m(e.default.filters.date.calendariconfrom)});i.on(d.default.events.activate,e.default.filters.date.calendariconto,function(){m(e.default.filters.date.calendariconto)})};a.init=j}); +define ("forumreport_summary/filters",["exports","jquery","core/popper","core/custom_interaction_events","forumreport_summary/selectors","core/yui","core/ajax","core/key_codes"],function(a,b,c,d,e,f,g,h){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.init=void 0;b=i(b);c=i(c);d=i(d);e=i(e);f=i(f);g=i(g);h=i(h);function i(a){return a&&a.__esModule?a:{default:a}}var j=function(a){var i=(0,b.default)(a);(0,b.default)(document).ready(function(){(0,b.default)(".loading-icon").hide();(0,b.default)("#summaryreport").removeClass("hidden")});var j=function(a,b){var c=document.forms.filtersform.action,d;if(a){a.preventDefault();var e=c.split("?"),f=e[1],g=b.split("&"),h="",i=[],j=[];f.split("&").forEach(function(a){var b=a.split("=");i.push(b[0]);j.push(b[1])});g.forEach(function(a){var b=a.split("="),c=i.indexOf(b[0]);if(-1e){var g=document.getElementById("dates-filter-warning");g.classList.remove("hidden");g.classList.add("d-block")}else{b.elements["datefrom[timestamp]"].value=c;b.elements["datefrom[enabled]"].value=d;b.elements["dateto[timestamp]"].value=e;b.elements["dateto[enabled]"].value=f;l("#filter-dates-popover")}})}});i.on(d.default.events.activate,e.default.filters.date.calendariconfrom,function(){m(e.default.filters.date.calendariconfrom)});i.on(d.default.events.activate,e.default.filters.date.calendariconto,function(){m(e.default.filters.date.calendariconto)})};a.init=j}); //# 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 7e71e603a95..b8b9a858ede 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","jqRoot","document","ready","hide","removeClass","generateWithFilters","event","getparams","currentLink","forms","filtersform","action","newLink","preventDefault","currentSplit","split","currentstring","newparamsarray","paramsstring","paramkeys","paramvalues","forEach","param","splitparam","push","paramstring","newparam","existingkey","indexOf","name","key","substr","submit","on","target","search","selectperpage","onsubmit","getparam","elements","perpage","value","downloadForm","getElementById","querySelector","downloadType","getParams","prevAction","submitWithFilter","containerelement","Y","use","M","core_formchangechecker","reset_form_dirty_state","addClass","updateCalendarPosition","referenceid","referenceElement","popperContent","Selectors","filters","date","calendar","style","removeProperty","Popper","placement","closeOpenFilters","openFilterButton","openFilter","classList","add","setAttribute","remove","CustomEvents","events","activate","group","selectall","deselected","querySelectorAll","checkbox","checked","clear","selected","trigger","popover","closeListener","e","id","closest","keyCode","KeyCodes","enter","space","removeEventListener","escCloseListener","addEventListener","escape","save","popcheckboxes","popcheckbox","saveid","getAttribute","focus","filtersForm","datesPopover","fromEnabled","toEnabled","args","data","Ajax","call","methodname","done","result","fromTimestamp","toTimestamp","timestamp","warningdiv","calendariconfrom","calendariconto"],"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 * Module responsible for handling forum summary report filters.\n *\n * @module forumreport_summary/filters\n * @package forumreport_summary\n * @copyright 2019 Michael Hawkins \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';\nimport Y from 'core/yui';\nimport Ajax from 'core/ajax';\nimport KeyCodes from 'core/key_codes';\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 const generateWithFilters = (event, getparams) => {\n let currentLink = document.forms.filtersform.action,\n newLink;\n\n if (event) {\n event.preventDefault();\n\n let currentSplit = currentLink.split('?'),\n currentstring = currentSplit[1],\n newparamsarray = getparams.split('&'),\n paramsstring = '',\n paramkeys = [],\n paramvalues = [];\n\n // Separate out the existing action GET param string.\n currentstring.split('&').forEach(function(param) {\n let splitparam = param.split('=');\n paramkeys.push(splitparam[0]);\n paramvalues.push(splitparam[1]);\n });\n\n newparamsarray.forEach(function(paramstring) {\n let newparam = paramstring.split('='),\n existingkey = paramkeys.indexOf(newparam[0]);\n\n // Overwrite value if existing, otherwise add new param.\n if (existingkey > -1) {\n paramvalues[existingkey] = newparam[1];\n } else {\n paramkeys.push(newparam[0]);\n paramvalues.push(newparam[1]);\n }\n });\n\n // Build URL.\n paramkeys.forEach(function(name, key) {\n paramsstring += `&${name}=${paramvalues[key]}`;\n });\n\n newLink = currentSplit[0] + '?' + paramsstring.substr(1);\n } else {\n newLink = currentLink;\n }\n\n document.forms.filtersform.action = newLink;\n document.forms.filtersform.submit();\n };\n\n // Override 'reset table preferences' so it generates with filters.\n $('.resettable').on(\"click\", \"a\", function(event) {\n generateWithFilters(event, event.target.search.substr(1));\n });\n\n // Override table heading sort links so they generate with filters.\n $('thead').on(\"click\", \"a\", function(event) {\n generateWithFilters(event, event.target.search.substr(1));\n });\n\n // Override pagination page links so they generate with filters.\n $('.pagination').on(\"click\", \"a\", function(event) {\n generateWithFilters(event, event.target.search.substr(1));\n });\n\n // Override rows per page submission so it generates with filters.\n if (document.forms.selectperpage) {\n document.forms.selectperpage.onsubmit = (event) => {\n let getparam = 'perpage=' + document.forms.selectperpage.elements.perpage.value;\n generateWithFilters(event, getparam);\n };\n }\n\n // Override download link so the file is generated with filters.\n const downloadForm = document.getElementById('summaryreport').querySelector('form.dataformatselector');\n if (downloadForm) {\n downloadForm.onsubmit = (event) => {\n const downloadType = downloadForm.querySelector('#downloadtype_download').value;\n const getParams = `download=${downloadType}`;\n const prevAction = document.forms.filtersform.action;\n\n generateWithFilters(event, getParams);\n\n // Revert action, so re-submitting the form via filter does not trigger a further download.\n document.forms.filtersform.action = prevAction;\n };\n }\n\n // Submit report via filter\n const submitWithFilter = (containerelement) => {\n // Disable the dates filter mform checker to prevent any changes triggering a warning to the user.\n Y.use('moodle-core-formchangechecker', function() {\n M.core_formchangechecker.reset_form_dirty_state();\n });\n\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 // Use popper to override date mform calendar position.\n const updateCalendarPosition = (referenceid) => {\n let referenceElement = document.querySelector(referenceid),\n popperContent = document.querySelector(Selectors.filters.date.calendar);\n\n popperContent.style.removeProperty(\"z-index\");\n new Popper(referenceElement, popperContent, {placement: 'bottom'});\n };\n\n // Close the relevant filter.\n const closeOpenFilters = (openFilterButton, openFilter) => {\n openFilter.classList.add('hidden');\n openFilter.setAttribute('data-openfilter', 'false');\n\n openFilterButton.classList.add('btn-primary');\n openFilterButton.classList.remove('btn-outline-primary');\n openFilterButton.setAttribute('aria-expanded', 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 let 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 popperContent.setAttribute('data-openfilter', 'true');\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 // Add listeners to handle closing filter.\n const closeListener = e => {\n if (e.target.id !== referenceElement.id && popperContent !== e.target.closest('[data-openfilter=\"true\"]') &&\n (typeof e.keyCode === 'undefined' || e.keyCode === KeyCodes.enter || e.keyCode === KeyCodes.space)) {\n closeOpenFilters(referenceElement, popperContent);\n document.removeEventListener('click', closeListener);\n document.removeEventListener('keyup', closeListener);\n document.removeEventListener('keyup', escCloseListener);\n }\n };\n\n document.addEventListener('click', closeListener);\n document.addEventListener('keyup', closeListener);\n\n const escCloseListener = e => {\n if (e.keyCode === KeyCodes.escape) {\n closeOpenFilters(referenceElement, popperContent);\n document.removeEventListener('keyup', escCloseListener);\n document.removeEventListener('click', closeListener);\n }\n };\n\n document.addEventListener('keyup', escCloseListener);\n });\n\n // Event handler to click save groups filter.\n jqRoot.on(CustomEvents.events.activate, Selectors.filters.group.save, function() {\n // Copy the saved values into the form before submitting.\n let popcheckboxes = root.querySelectorAll(Selectors.filters.group.checkbox);\n\n popcheckboxes.forEach(function(popcheckbox) {\n let filtersform = document.forms.filtersform,\n saveid = popcheckbox.getAttribute('data-saveid');\n\n filtersform.querySelector(`#${saveid}`).checked = popcheckbox.checked;\n });\n\n submitWithFilter('#filter-groups-popover');\n });\n\n // Dates filter specific handlers.\n\n // Event handler for showing dates filter popover.\n jqRoot.on(CustomEvents.events.activate, Selectors.filters.date.trigger, function() {\n\n // Create popover.\n let referenceElement = root.querySelector(Selectors.filters.date.trigger),\n popperContent = root.querySelector(Selectors.filters.date.popover);\n\n new Popper(referenceElement, popperContent, {placement: 'bottom'});\n\n // Show popover and move focus.\n popperContent.classList.remove('hidden');\n popperContent.setAttribute('data-openfilter', 'true');\n popperContent.querySelector('[name=\"filterdatefrompopover[enabled]\"]').focus();\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 // Add listener to handle closing filter.\n const closeListener = e => {\n if (e.target.id !== referenceElement.id && popperContent !== e.target.closest('[data-openfilter=\"true\"]') &&\n (typeof e.keyCode === 'undefined' || e.keyCode === KeyCodes.enter || e.keyCode === KeyCodes.space)) {\n closeOpenFilters(referenceElement, popperContent);\n document.removeEventListener('click', closeListener);\n document.removeEventListener('keyup', closeListener);\n document.removeEventListener('keyup', escCloseListener);\n }\n };\n\n document.addEventListener('click', closeListener);\n document.addEventListener('keyup', closeListener);\n\n const escCloseListener = e => {\n if (e.keyCode === KeyCodes.escape) {\n closeOpenFilters(referenceElement, popperContent);\n document.removeEventListener('keyup', escCloseListener);\n document.removeEventListener('click', closeListener);\n }\n };\n\n document.addEventListener('keyup', escCloseListener);\n });\n\n // Event handler to save dates filter.\n jqRoot.on(CustomEvents.events.activate, Selectors.filters.date.save, function() {\n // Populate the hidden form inputs to submit the data.\n let filtersForm = document.forms.filtersform;\n const datesPopover = root.querySelector(Selectors.filters.date.popover);\n const fromEnabled = datesPopover.querySelector('[name=\"filterdatefrompopover[enabled]\"]').checked ? 1 : 0;\n const toEnabled = datesPopover.querySelector('[name=\"filterdatetopopover[enabled]\"]').checked ? 1 : 0;\n\n if (!fromEnabled && !toEnabled) {\n // Update the elements in the filter form.\n filtersForm.elements['datefrom[timestamp]'].value = 0;\n filtersForm.elements['datefrom[enabled]'].value = fromEnabled;\n filtersForm.elements['dateto[timestamp]'].value = 0;\n filtersForm.elements['dateto[enabled]'].value = toEnabled;\n\n // Submit the filter values and re-generate report.\n submitWithFilter('#filter-dates-popover');\n } else {\n let args = {data: []};\n\n if (fromEnabled) {\n args.data.push({\n 'key': 'from',\n 'year': datesPopover.querySelector('[name=\"filterdatefrompopover[year]\"]').value,\n 'month': datesPopover.querySelector('[name=\"filterdatefrompopover[month]\"]').value,\n 'day': datesPopover.querySelector('[name=\"filterdatefrompopover[day]\"]').value,\n 'hour': 0,\n 'minute': 0\n });\n }\n\n if (toEnabled) {\n args.data.push({\n 'key': 'to',\n 'year': datesPopover.querySelector('[name=\"filterdatetopopover[year]\"]').value,\n 'month': datesPopover.querySelector('[name=\"filterdatetopopover[month]\"]').value,\n 'day': datesPopover.querySelector('[name=\"filterdatetopopover[day]\"]').value,\n 'hour': 23,\n 'minute': 59\n });\n }\n\n const request = {\n methodname: 'core_calendar_get_timestamps',\n args: args\n };\n\n Ajax.call([request])[0].done(function(result) {\n let fromTimestamp = 0,\n toTimestamp = 0;\n\n result['timestamps'].forEach(function(data){\n if (data.key === 'from') {\n fromTimestamp = data.timestamp;\n } else if (data.key === 'to') {\n toTimestamp = data.timestamp;\n }\n });\n\n // Display an error if the from date is later than the do date.\n if (toTimestamp > 0 && fromTimestamp > toTimestamp) {\n const warningdiv = document.getElementById('dates-filter-warning');\n warningdiv.classList.remove('hidden');\n warningdiv.classList.add('d-block');\n } else {\n filtersForm.elements['datefrom[timestamp]'].value = fromTimestamp;\n filtersForm.elements['datefrom[enabled]'].value = fromEnabled;\n filtersForm.elements['dateto[timestamp]'].value = toTimestamp;\n filtersForm.elements['dateto[enabled]'].value = toEnabled;\n\n // Submit the filter values and re-generate report.\n submitWithFilter('#filter-dates-popover');\n }\n });\n }\n });\n\n jqRoot.on(CustomEvents.events.activate, Selectors.filters.date.calendariconfrom, function() {\n updateCalendarPosition(Selectors.filters.date.calendariconfrom);\n });\n\n jqRoot.on(CustomEvents.events.activate, Selectors.filters.date.calendariconto, function() {\n updateCalendarPosition(Selectors.filters.date.calendariconto);\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","getparams","currentLink","forms","filtersform","action","newLink","preventDefault","currentSplit","split","currentstring","newparamsarray","paramsstring","paramkeys","paramvalues","forEach","param","splitparam","push","paramstring","newparam","existingkey","indexOf","name","key","substr","submit","on","target","search","selectperpage","onsubmit","getparam","elements","perpage","value","downloadForm","getElementById","querySelector","downloadType","getParams","prevAction","submitWithFilter","containerelement","Y","use","M","core_formchangechecker","reset_form_dirty_state","addClass","updateCalendarPosition","referenceid","referenceElement","popperContent","Selectors","filters","date","calendar","style","removeProperty","Popper","placement","closeOpenFilters","openFilterButton","openFilter","classList","add","setAttribute","remove","CustomEvents","events","activate","group","selectall","deselected","querySelectorAll","checkbox","checked","clear","selected","trigger","popover","closeListener","e","id","closest","keyCode","KeyCodes","enter","space","removeEventListener","escCloseListener","addEventListener","escape","save","popcheckboxes","popcheckbox","saveid","getAttribute","exportlink","link","exportbutton","exportlinkform","dataset","url","focus","filtersForm","datesPopover","fromEnabled","toEnabled","args","data","Ajax","call","methodname","done","result","fromTimestamp","toTimestamp","timestamp","warningdiv","calendariconfrom","calendariconto"],"mappings":"wRAwBA,OACA,OACA,OACA,OACA,OACA,OACA,O,mDAEO,GAAMA,CAAAA,CAAI,CAAG,SAACC,CAAD,CAAU,CAC1B,GAAIC,CAAAA,CAAM,CAAG,cAAED,CAAF,CAAb,CAIA,cAAEE,QAAF,EAAYC,KAAZ,CAAkB,UAAW,CACzB,cAAE,eAAF,EAAmBC,IAAnB,GACA,cAAE,gBAAF,EAAoBC,WAApB,CAAgC,QAAhC,CACH,CAHD,EAQA,GAAMC,CAAAA,CAAmB,CAAG,SAACC,CAAD,CAAQC,CAAR,CAAsB,CAC9C,GAAIC,CAAAA,CAAW,CAAGP,QAAQ,CAACQ,KAAT,CAAeC,WAAf,CAA2BC,MAA7C,CACIC,CADJ,CAGA,GAAIN,CAAJ,CAAW,CACPA,CAAK,CAACO,cAAN,GAED,GAAIC,CAAAA,CAAY,CAAGN,CAAW,CAACO,KAAZ,CAAkB,GAAlB,CAAnB,CACIC,CAAa,CAAGF,CAAY,CAAC,CAAD,CADhC,CAEIG,CAAc,CAAGV,CAAS,CAACQ,KAAV,CAAgB,GAAhB,CAFrB,CAGIG,CAAY,CAAG,EAHnB,CAIIC,CAAS,CAAG,EAJhB,CAKIC,CAAW,CAAG,EALlB,CAQCJ,CAAa,CAACD,KAAd,CAAoB,GAApB,EAAyBM,OAAzB,CAAiC,SAASC,CAAT,CAAgB,CAC7C,GAAIC,CAAAA,CAAU,CAAGD,CAAK,CAACP,KAAN,CAAY,GAAZ,CAAjB,CACAI,CAAS,CAACK,IAAV,CAAeD,CAAU,CAAC,CAAD,CAAzB,EACAH,CAAW,CAACI,IAAZ,CAAiBD,CAAU,CAAC,CAAD,CAA3B,CACH,CAJD,EAMAN,CAAc,CAACI,OAAf,CAAuB,SAASI,CAAT,CAAsB,CACzC,GAAIC,CAAAA,CAAQ,CAAGD,CAAW,CAACV,KAAZ,CAAkB,GAAlB,CAAf,CACIY,CAAW,CAAGR,CAAS,CAACS,OAAV,CAAkBF,CAAQ,CAAC,CAAD,CAA1B,CADlB,CAIA,GAAkB,CAAC,CAAf,CAAAC,CAAJ,CAAsB,CAClBP,CAAW,CAACO,CAAD,CAAX,CAA2BD,CAAQ,CAAC,CAAD,CACtC,CAFD,IAEO,CACHP,CAAS,CAACK,IAAV,CAAeE,CAAQ,CAAC,CAAD,CAAvB,EACAN,CAAW,CAACI,IAAZ,CAAiBE,CAAQ,CAAC,CAAD,CAAzB,CACH,CACJ,CAXD,EAcAP,CAAS,CAACE,OAAV,CAAkB,SAASQ,CAAT,CAAeC,CAAf,CAAoB,CAClCZ,CAAY,aAAQW,CAAR,aAAgBT,CAAW,CAACU,CAAD,CAA3B,CACf,CAFD,EAIAlB,CAAO,CAAGE,CAAY,CAAC,CAAD,CAAZ,CAAkB,GAAlB,CAAwBI,CAAY,CAACa,MAAb,CAAoB,CAApB,CACrC,CApCD,IAoCO,CACHnB,CAAO,CAAGJ,CACb,CAEDP,QAAQ,CAACQ,KAAT,CAAeC,WAAf,CAA2BC,MAA3B,CAAoCC,CAApC,CACAX,QAAQ,CAACQ,KAAT,CAAeC,WAAf,CAA2BsB,MAA3B,EACH,CA9CD,CAiDA,cAAE,aAAF,EAAiBC,EAAjB,CAAoB,OAApB,CAA6B,GAA7B,CAAkC,SAAS3B,CAAT,CAAgB,CAC9CD,CAAmB,CAACC,CAAD,CAAQA,CAAK,CAAC4B,MAAN,CAAaC,MAAb,CAAoBJ,MAApB,CAA2B,CAA3B,CAAR,CACtB,CAFD,EAKA,cAAE,OAAF,EAAWE,EAAX,CAAc,OAAd,CAAuB,GAAvB,CAA4B,SAAS3B,CAAT,CAAgB,CACxCD,CAAmB,CAACC,CAAD,CAAQA,CAAK,CAAC4B,MAAN,CAAaC,MAAb,CAAoBJ,MAApB,CAA2B,CAA3B,CAAR,CACtB,CAFD,EAKA,cAAE,aAAF,EAAiBE,EAAjB,CAAoB,OAApB,CAA6B,GAA7B,CAAkC,SAAS3B,CAAT,CAAgB,CAC9CD,CAAmB,CAACC,CAAD,CAAQA,CAAK,CAAC4B,MAAN,CAAaC,MAAb,CAAoBJ,MAApB,CAA2B,CAA3B,CAAR,CACtB,CAFD,EAKA,GAAI9B,QAAQ,CAACQ,KAAT,CAAe2B,aAAnB,CAAkC,CAC9BnC,QAAQ,CAACQ,KAAT,CAAe2B,aAAf,CAA6BC,QAA7B,CAAwC,SAAC/B,CAAD,CAAW,CAC/C,GAAIgC,CAAAA,CAAQ,CAAG,WAAarC,QAAQ,CAACQ,KAAT,CAAe2B,aAAf,CAA6BG,QAA7B,CAAsCC,OAAtC,CAA8CC,KAA1E,CACApC,CAAmB,CAACC,CAAD,CAAQgC,CAAR,CACtB,CACJ,CAGD,GAAMI,CAAAA,CAAY,CAAGzC,QAAQ,CAAC0C,cAAT,CAAwB,eAAxB,EAAyCC,aAAzC,CAAuD,yBAAvD,CAArB,CACA,GAAIF,CAAJ,CAAkB,CACdA,CAAY,CAACL,QAAb,CAAwB,SAAC/B,CAAD,CAAW,IACzBuC,CAAAA,CAAY,CAAGH,CAAY,CAACE,aAAb,CAA2B,wBAA3B,EAAqDH,KAD3C,CAEzBK,CAAS,oBAAeD,CAAf,CAFgB,CAGzBE,CAAU,CAAG9C,QAAQ,CAACQ,KAAT,CAAeC,WAAf,CAA2BC,MAHf,CAK/BN,CAAmB,CAACC,CAAD,CAAQwC,CAAR,CAAnB,CAGA7C,QAAQ,CAACQ,KAAT,CAAeC,WAAf,CAA2BC,MAA3B,CAAoCoC,CACvC,CACJ,CAjGyB,GAoGpBC,CAAAA,CAAgB,CAAG,SAACC,CAAD,CAAsB,CAE3CC,UAAEC,GAAF,CAAM,+BAAN,CAAuC,UAAW,CAC9CC,CAAC,CAACC,sBAAF,CAAyBC,sBAAzB,EACH,CAFD,EAKA,cAAEL,CAAF,EAAoBM,QAApB,CAA6B,QAA7B,EAGAlD,CAAmB,IACtB,CA/GyB,CAkHpBmD,CAAsB,CAAG,SAACC,CAAD,CAAiB,CAC5C,GAAIC,CAAAA,CAAgB,CAAGzD,QAAQ,CAAC2C,aAAT,CAAuBa,CAAvB,CAAvB,CACIE,CAAa,CAAG1D,QAAQ,CAAC2C,aAAT,CAAuBgB,UAAUC,OAAV,CAAkBC,IAAlB,CAAuBC,QAA9C,CADpB,CAGAJ,CAAa,CAACK,KAAd,CAAoBC,cAApB,CAAmC,SAAnC,EACA,GAAIC,UAAJ,CAAWR,CAAX,CAA6BC,CAA7B,CAA4C,CAACQ,SAAS,CAAE,QAAZ,CAA5C,CACH,CAxHyB,CA2HpBC,CAAgB,CAAG,SAACC,CAAD,CAAmBC,CAAnB,CAAkC,CACvDA,CAAU,CAACC,SAAX,CAAqBC,GAArB,CAAyB,QAAzB,EACAF,CAAU,CAACG,YAAX,CAAwB,iBAAxB,CAA2C,OAA3C,EAEAJ,CAAgB,CAACE,SAAjB,CAA2BC,GAA3B,CAA+B,aAA/B,EACAH,CAAgB,CAACE,SAAjB,CAA2BG,MAA3B,CAAkC,qBAAlC,EACAL,CAAgB,CAACI,YAAjB,CAA8B,eAA9B,IACH,CAlIyB,CAuI1BzE,CAAM,CAACiC,EAAP,CAAU0C,UAAaC,MAAb,CAAoBC,QAA9B,CAAwCjB,UAAUC,OAAV,CAAkBiB,KAAlB,CAAwBC,SAAhE,CAA2E,UAAW,CAClF,GAAIC,CAAAA,CAAU,CAAGjF,CAAI,CAACkF,gBAAL,CAAsBrB,UAAUC,OAAV,CAAkBiB,KAAlB,CAAwBI,QAAxB,CAAmC,gBAAzD,CAAjB,CACAF,CAAU,CAAC3D,OAAX,CAAmB,SAAS6D,CAAT,CAAmB,CAClCA,CAAQ,CAACC,OAAT,GACH,CAFD,CAGH,CALD,EAQAnF,CAAM,CAACiC,EAAP,CAAU0C,UAAaC,MAAb,CAAoBC,QAA9B,CAAwCjB,UAAUC,OAAV,CAAkBiB,KAAlB,CAAwBM,KAAhE,CAAuE,UAAW,CAE9E,GAAIC,CAAAA,CAAQ,CAAGtF,CAAI,CAACkF,gBAAL,CAAsBrB,UAAUC,OAAV,CAAkBiB,KAAlB,CAAwBI,QAAxB,CAAmC,UAAzD,CAAf,CACAG,CAAQ,CAAChE,OAAT,CAAiB,SAAS6D,CAAT,CAAmB,CAChCA,CAAQ,CAACC,OAAT,GACH,CAFD,CAGH,CAND,EASAnF,CAAM,CAACiC,EAAP,CAAU0C,UAAaC,MAAb,CAAoBC,QAA9B,CAAwCjB,UAAUC,OAAV,CAAkBiB,KAAlB,CAAwBQ,OAAhE,CAAyE,UAAW,CAEhF,GAAI5B,CAAAA,CAAgB,CAAG3D,CAAI,CAAC6C,aAAL,CAAmBgB,UAAUC,OAAV,CAAkBiB,KAAlB,CAAwBQ,OAA3C,CAAvB,CACI3B,CAAa,CAAG5D,CAAI,CAAC6C,aAAL,CAAmBgB,UAAUC,OAAV,CAAkBiB,KAAlB,CAAwBS,OAA3C,CADpB,CAGA,GAAIrB,UAAJ,CAAWR,CAAX,CAA6BC,CAA7B,CAA4C,CAACQ,SAAS,CAAE,QAAZ,CAA5C,EAGAR,CAAa,CAACY,SAAd,CAAwBG,MAAxB,CAA+B,QAA/B,EACAf,CAAa,CAACc,YAAd,CAA2B,iBAA3B,CAA8C,MAA9C,EAGAf,CAAgB,CAACa,SAAjB,CAA2BC,GAA3B,CAA+B,qBAA/B,EACAd,CAAgB,CAACa,SAAjB,CAA2BG,MAA3B,CAAkC,aAAlC,EAGAhB,CAAgB,CAACe,YAAjB,CAA8B,eAA9B,KAGA,GAAMe,CAAAA,CAAa,CAAG,SAAAC,CAAC,CAAI,CACvB,GAAIA,CAAC,CAACvD,MAAF,CAASwD,EAAT,GAAgBhC,CAAgB,CAACgC,EAAjC,EAAuC/B,CAAa,GAAK8B,CAAC,CAACvD,MAAF,CAASyD,OAAT,CAAiB,4BAAjB,CAAzD,GAC0B,WAArB,QAAOF,CAAAA,CAAC,CAACG,OAAT,EAAoCH,CAAC,CAACG,OAAF,GAAcC,UAASC,KAA3D,EAAoEL,CAAC,CAACG,OAAF,GAAcC,UAASE,KADhG,CAAJ,CAC4G,CACxG3B,CAAgB,CAACV,CAAD,CAAmBC,CAAnB,CAAhB,CACA1D,QAAQ,CAAC+F,mBAAT,CAA6B,OAA7B,CAAsCR,CAAtC,EACAvF,QAAQ,CAAC+F,mBAAT,CAA6B,OAA7B,CAAsCR,CAAtC,EACAvF,QAAQ,CAAC+F,mBAAT,CAA6B,OAA7B,CAAsCC,CAAtC,CACH,CACJ,CARD,CAUAhG,QAAQ,CAACiG,gBAAT,CAA0B,OAA1B,CAAmCV,CAAnC,EACAvF,QAAQ,CAACiG,gBAAT,CAA0B,OAA1B,CAAmCV,CAAnC,EAEA,GAAMS,CAAAA,CAAgB,CAAG,SAAAR,CAAC,CAAI,CAC1B,GAAIA,CAAC,CAACG,OAAF,GAAcC,UAASM,MAA3B,CAAmC,CAC/B/B,CAAgB,CAACV,CAAD,CAAmBC,CAAnB,CAAhB,CACA1D,QAAQ,CAAC+F,mBAAT,CAA6B,OAA7B,CAAsCC,CAAtC,EACAhG,QAAQ,CAAC+F,mBAAT,CAA6B,OAA7B,CAAsCR,CAAtC,CACH,CACJ,CAND,CAQAvF,QAAQ,CAACiG,gBAAT,CAA0B,OAA1B,CAAmCD,CAAnC,CACH,CAzCD,EA4CAjG,CAAM,CAACiC,EAAP,CAAU0C,UAAaC,MAAb,CAAoBC,QAA9B,CAAwCjB,UAAUC,OAAV,CAAkBiB,KAAlB,CAAwBsB,IAAhE,CAAsE,UAAW,CAE7E,GAAIC,CAAAA,CAAa,CAAGtG,CAAI,CAACkF,gBAAL,CAAsBrB,UAAUC,OAAV,CAAkBiB,KAAlB,CAAwBI,QAA9C,CAApB,CAEAmB,CAAa,CAAChF,OAAd,CAAsB,SAASiF,CAAT,CAAsB,CACxC,GAAI5F,CAAAA,CAAW,CAAGT,QAAQ,CAACQ,KAAT,CAAeC,WAAjC,CACI6F,CAAM,CAAGD,CAAW,CAACE,YAAZ,CAAyB,aAAzB,CADb,CAGA9F,CAAW,CAACkC,aAAZ,YAA8B2D,CAA9B,GAAwCpB,OAAxC,CAAkDmB,CAAW,CAACnB,OACjE,CALD,EAOAnC,CAAgB,CAAC,wBAAD,CACnB,CAZD,EAkBA/C,QAAQ,CAACgF,gBAAT,CAA0BrB,UAAUC,OAAV,CAAkB4C,UAAlB,CAA6BC,IAAvD,EAA6DrF,OAA7D,CAAqE,SAASsF,CAAT,CAAuB,CACxFA,CAAY,CAACT,gBAAb,CAA8B,OAA9B,CAAuC,SAAS5F,CAAT,CAAgB,CACnDL,QAAQ,CAACQ,KAAT,CAAemG,cAAf,CAA8BjG,MAA9B,CAAuCL,CAAK,CAAC4B,MAAN,CAAa2E,OAAb,CAAqBC,GAA5D,CACA7G,QAAQ,CAACQ,KAAT,CAAemG,cAAf,CAA8B5E,MAA9B,EACH,CAHD,CAIH,CALD,EAUAhC,CAAM,CAACiC,EAAP,CAAU0C,UAAaC,MAAb,CAAoBC,QAA9B,CAAwCjB,UAAUC,OAAV,CAAkBC,IAAlB,CAAuBwB,OAA/D,CAAwE,UAAW,CAG/E,GAAI5B,CAAAA,CAAgB,CAAG3D,CAAI,CAAC6C,aAAL,CAAmBgB,UAAUC,OAAV,CAAkBC,IAAlB,CAAuBwB,OAA1C,CAAvB,CACI3B,CAAa,CAAG5D,CAAI,CAAC6C,aAAL,CAAmBgB,UAAUC,OAAV,CAAkBC,IAAlB,CAAuByB,OAA1C,CADpB,CAGA,GAAIrB,UAAJ,CAAWR,CAAX,CAA6BC,CAA7B,CAA4C,CAACQ,SAAS,CAAE,QAAZ,CAA5C,EAGAR,CAAa,CAACY,SAAd,CAAwBG,MAAxB,CAA+B,QAA/B,EACAf,CAAa,CAACc,YAAd,CAA2B,iBAA3B,CAA8C,MAA9C,EACAd,CAAa,CAACf,aAAd,CAA4B,2CAA5B,EAAuEmE,KAAvE,GAGArD,CAAgB,CAACa,SAAjB,CAA2BC,GAA3B,CAA+B,qBAA/B,EACAd,CAAgB,CAACa,SAAjB,CAA2BG,MAA3B,CAAkC,aAAlC,EAGAhB,CAAgB,CAACe,YAAjB,CAA8B,eAA9B,KAGA,GAAMe,CAAAA,CAAa,CAAG,SAAAC,CAAC,CAAI,CACvB,GAAIA,CAAC,CAACvD,MAAF,CAASwD,EAAT,GAAgBhC,CAAgB,CAACgC,EAAjC,EAAuC/B,CAAa,GAAK8B,CAAC,CAACvD,MAAF,CAASyD,OAAT,CAAiB,4BAAjB,CAAzD,GAC0B,WAArB,QAAOF,CAAAA,CAAC,CAACG,OAAT,EAAoCH,CAAC,CAACG,OAAF,GAAcC,UAASC,KAA3D,EAAoEL,CAAC,CAACG,OAAF,GAAcC,UAASE,KADhG,CAAJ,CAC4G,CACxG3B,CAAgB,CAACV,CAAD,CAAmBC,CAAnB,CAAhB,CACA1D,QAAQ,CAAC+F,mBAAT,CAA6B,OAA7B,CAAsCR,CAAtC,EACAvF,QAAQ,CAAC+F,mBAAT,CAA6B,OAA7B,CAAsCR,CAAtC,EACAvF,QAAQ,CAAC+F,mBAAT,CAA6B,OAA7B,CAAsCC,CAAtC,CACH,CACJ,CARD,CAUAhG,QAAQ,CAACiG,gBAAT,CAA0B,OAA1B,CAAmCV,CAAnC,EACAvF,QAAQ,CAACiG,gBAAT,CAA0B,OAA1B,CAAmCV,CAAnC,EAEA,GAAMS,CAAAA,CAAgB,CAAG,SAAAR,CAAC,CAAI,CAC1B,GAAIA,CAAC,CAACG,OAAF,GAAcC,UAASM,MAA3B,CAAmC,CAC/B/B,CAAgB,CAACV,CAAD,CAAmBC,CAAnB,CAAhB,CACA1D,QAAQ,CAAC+F,mBAAT,CAA6B,OAA7B,CAAsCC,CAAtC,EACAhG,QAAQ,CAAC+F,mBAAT,CAA6B,OAA7B,CAAsCR,CAAtC,CACH,CACJ,CAND,CAQAvF,QAAQ,CAACiG,gBAAT,CAA0B,OAA1B,CAAmCD,CAAnC,CACH,CA3CD,EA8CAjG,CAAM,CAACiC,EAAP,CAAU0C,UAAaC,MAAb,CAAoBC,QAA9B,CAAwCjB,UAAUC,OAAV,CAAkBC,IAAlB,CAAuBsC,IAA/D,CAAqE,UAAW,IAExEY,CAAAA,CAAW,CAAG/G,QAAQ,CAACQ,KAAT,CAAeC,WAF2C,CAGtEuG,CAAY,CAAGlH,CAAI,CAAC6C,aAAL,CAAmBgB,UAAUC,OAAV,CAAkBC,IAAlB,CAAuByB,OAA1C,CAHuD,CAItE2B,CAAW,CAAGD,CAAY,CAACrE,aAAb,CAA2B,2CAA3B,EAAsEuC,OAAtE,CAAgF,CAAhF,CAAoF,CAJ5B,CAKtEgC,CAAS,CAAGF,CAAY,CAACrE,aAAb,CAA2B,yCAA3B,EAAoEuC,OAApE,CAA8E,CAA9E,CAAkF,CALxB,CAO5E,GAAI,CAAC+B,CAAD,EAAgB,CAACC,CAArB,CAAgC,CAE5BH,CAAW,CAACzE,QAAZ,CAAqB,qBAArB,EAA4CE,KAA5C,CAAoD,CAApD,CACAuE,CAAW,CAACzE,QAAZ,CAAqB,mBAArB,EAA0CE,KAA1C,CAAkDyE,CAAlD,CACAF,CAAW,CAACzE,QAAZ,CAAqB,mBAArB,EAA0CE,KAA1C,CAAkD,CAAlD,CACAuE,CAAW,CAACzE,QAAZ,CAAqB,iBAArB,EAAwCE,KAAxC,CAAgD0E,CAAhD,CAGAnE,CAAgB,CAAC,uBAAD,CACnB,CATD,IASO,CACH,GAAIoE,CAAAA,CAAI,CAAG,CAACC,IAAI,CAAE,EAAP,CAAX,CAEA,GAAIH,CAAJ,CAAiB,CACbE,CAAI,CAACC,IAAL,CAAU7F,IAAV,CAAe,CACX,IAAO,MADI,CAEX,KAAQyF,CAAY,CAACrE,aAAb,CAA2B,wCAA3B,EAAmEH,KAFhE,CAGX,MAASwE,CAAY,CAACrE,aAAb,CAA2B,yCAA3B,EAAoEH,KAHlE,CAIX,IAAOwE,CAAY,CAACrE,aAAb,CAA2B,uCAA3B,EAAkEH,KAJ9D,CAKX,KAAQ,CALG,CAMX,OAAU,CANC,CAAf,CAQH,CAED,GAAI0E,CAAJ,CAAe,CACXC,CAAI,CAACC,IAAL,CAAU7F,IAAV,CAAe,CACX,IAAO,IADI,CAEX,KAAQyF,CAAY,CAACrE,aAAb,CAA2B,sCAA3B,EAAiEH,KAF9D,CAGX,MAASwE,CAAY,CAACrE,aAAb,CAA2B,uCAA3B,EAAkEH,KAHhE,CAIX,IAAOwE,CAAY,CAACrE,aAAb,CAA2B,qCAA3B,EAAgEH,KAJ5D,CAKX,KAAQ,EALG,CAMX,OAAU,EANC,CAAf,CAQH,CAOD6E,UAAKC,IAAL,CAAU,CALM,CACZC,UAAU,CAAE,8BADA,CAEZJ,IAAI,CAAEA,CAFM,CAKN,CAAV,EAAqB,CAArB,EAAwBK,IAAxB,CAA6B,SAASC,CAAT,CAAiB,CAC1C,GAAIC,CAAAA,CAAa,CAAG,CAApB,CACIC,CAAW,CAAG,CADlB,CAGAF,CAAM,WAAN,CAAqBrG,OAArB,CAA6B,SAASgG,CAAT,CAAc,CACvC,GAAiB,MAAb,GAAAA,CAAI,CAACvF,GAAT,CAAyB,CACrB6F,CAAa,CAAGN,CAAI,CAACQ,SACxB,CAFD,IAEO,IAAiB,IAAb,GAAAR,CAAI,CAACvF,GAAT,CAAuB,CAC1B8F,CAAW,CAAGP,CAAI,CAACQ,SACtB,CACJ,CAND,EASA,GAAkB,CAAd,CAAAD,CAAW,EAAQD,CAAa,CAAGC,CAAvC,CAAoD,CAChD,GAAME,CAAAA,CAAU,CAAG7H,QAAQ,CAAC0C,cAAT,CAAwB,sBAAxB,CAAnB,CACAmF,CAAU,CAACvD,SAAX,CAAqBG,MAArB,CAA4B,QAA5B,EACAoD,CAAU,CAACvD,SAAX,CAAqBC,GAArB,CAAyB,SAAzB,CACH,CAJD,IAIO,CACHwC,CAAW,CAACzE,QAAZ,CAAqB,qBAArB,EAA4CE,KAA5C,CAAoDkF,CAApD,CACAX,CAAW,CAACzE,QAAZ,CAAqB,mBAArB,EAA0CE,KAA1C,CAAkDyE,CAAlD,CACAF,CAAW,CAACzE,QAAZ,CAAqB,mBAArB,EAA0CE,KAA1C,CAAkDmF,CAAlD,CACAZ,CAAW,CAACzE,QAAZ,CAAqB,iBAArB,EAAwCE,KAAxC,CAAgD0E,CAAhD,CAGAnE,CAAgB,CAAC,uBAAD,CACnB,CACJ,CA1BD,CA2BH,CACJ,CA1ED,EA4EAhD,CAAM,CAACiC,EAAP,CAAU0C,UAAaC,MAAb,CAAoBC,QAA9B,CAAwCjB,UAAUC,OAAV,CAAkBC,IAAlB,CAAuBiE,gBAA/D,CAAiF,UAAW,CACxFvE,CAAsB,CAACI,UAAUC,OAAV,CAAkBC,IAAlB,CAAuBiE,gBAAxB,CACzB,CAFD,EAIA/H,CAAM,CAACiC,EAAP,CAAU0C,UAAaC,MAAb,CAAoBC,QAA9B,CAAwCjB,UAAUC,OAAV,CAAkBC,IAAlB,CAAuBkE,cAA/D,CAA+E,UAAW,CACtFxE,CAAsB,CAACI,UAAUC,OAAV,CAAkBC,IAAlB,CAAuBkE,cAAxB,CACzB,CAFD,CAGH,CAjWM,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 * Module responsible for handling forum summary report filters.\n *\n * @module forumreport_summary/filters\n * @package forumreport_summary\n * @copyright 2019 Michael Hawkins \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';\nimport Y from 'core/yui';\nimport Ajax from 'core/ajax';\nimport KeyCodes from 'core/key_codes';\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 const generateWithFilters = (event, getparams) => {\n let currentLink = document.forms.filtersform.action,\n newLink;\n\n if (event) {\n event.preventDefault();\n\n let currentSplit = currentLink.split('?'),\n currentstring = currentSplit[1],\n newparamsarray = getparams.split('&'),\n paramsstring = '',\n paramkeys = [],\n paramvalues = [];\n\n // Separate out the existing action GET param string.\n currentstring.split('&').forEach(function(param) {\n let splitparam = param.split('=');\n paramkeys.push(splitparam[0]);\n paramvalues.push(splitparam[1]);\n });\n\n newparamsarray.forEach(function(paramstring) {\n let newparam = paramstring.split('='),\n existingkey = paramkeys.indexOf(newparam[0]);\n\n // Overwrite value if existing, otherwise add new param.\n if (existingkey > -1) {\n paramvalues[existingkey] = newparam[1];\n } else {\n paramkeys.push(newparam[0]);\n paramvalues.push(newparam[1]);\n }\n });\n\n // Build URL.\n paramkeys.forEach(function(name, key) {\n paramsstring += `&${name}=${paramvalues[key]}`;\n });\n\n newLink = currentSplit[0] + '?' + paramsstring.substr(1);\n } else {\n newLink = currentLink;\n }\n\n document.forms.filtersform.action = newLink;\n document.forms.filtersform.submit();\n };\n\n // Override 'reset table preferences' so it generates with filters.\n $('.resettable').on(\"click\", \"a\", function(event) {\n generateWithFilters(event, event.target.search.substr(1));\n });\n\n // Override table heading sort links so they generate with filters.\n $('thead').on(\"click\", \"a\", function(event) {\n generateWithFilters(event, event.target.search.substr(1));\n });\n\n // Override pagination page links so they generate with filters.\n $('.pagination').on(\"click\", \"a\", function(event) {\n generateWithFilters(event, event.target.search.substr(1));\n });\n\n // Override rows per page submission so it generates with filters.\n if (document.forms.selectperpage) {\n document.forms.selectperpage.onsubmit = (event) => {\n let getparam = 'perpage=' + document.forms.selectperpage.elements.perpage.value;\n generateWithFilters(event, getparam);\n };\n }\n\n // Override download link so the file is generated with filters.\n const downloadForm = document.getElementById('summaryreport').querySelector('form.dataformatselector');\n if (downloadForm) {\n downloadForm.onsubmit = (event) => {\n const downloadType = downloadForm.querySelector('#downloadtype_download').value;\n const getParams = `download=${downloadType}`;\n const prevAction = document.forms.filtersform.action;\n\n generateWithFilters(event, getParams);\n\n // Revert action, so re-submitting the form via filter does not trigger a further download.\n document.forms.filtersform.action = prevAction;\n };\n }\n\n // Submit report via filter\n const submitWithFilter = (containerelement) => {\n // Disable the dates filter mform checker to prevent any changes triggering a warning to the user.\n Y.use('moodle-core-formchangechecker', function() {\n M.core_formchangechecker.reset_form_dirty_state();\n });\n\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 // Use popper to override date mform calendar position.\n const updateCalendarPosition = (referenceid) => {\n let referenceElement = document.querySelector(referenceid),\n popperContent = document.querySelector(Selectors.filters.date.calendar);\n\n popperContent.style.removeProperty(\"z-index\");\n new Popper(referenceElement, popperContent, {placement: 'bottom'});\n };\n\n // Close the relevant filter.\n const closeOpenFilters = (openFilterButton, openFilter) => {\n openFilter.classList.add('hidden');\n openFilter.setAttribute('data-openfilter', 'false');\n\n openFilterButton.classList.add('btn-primary');\n openFilterButton.classList.remove('btn-outline-primary');\n openFilterButton.setAttribute('aria-expanded', 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 let 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 popperContent.setAttribute('data-openfilter', 'true');\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 // Add listeners to handle closing filter.\n const closeListener = e => {\n if (e.target.id !== referenceElement.id && popperContent !== e.target.closest('[data-openfilter=\"true\"]') &&\n (typeof e.keyCode === 'undefined' || e.keyCode === KeyCodes.enter || e.keyCode === KeyCodes.space)) {\n closeOpenFilters(referenceElement, popperContent);\n document.removeEventListener('click', closeListener);\n document.removeEventListener('keyup', closeListener);\n document.removeEventListener('keyup', escCloseListener);\n }\n };\n\n document.addEventListener('click', closeListener);\n document.addEventListener('keyup', closeListener);\n\n const escCloseListener = e => {\n if (e.keyCode === KeyCodes.escape) {\n closeOpenFilters(referenceElement, popperContent);\n document.removeEventListener('keyup', escCloseListener);\n document.removeEventListener('click', closeListener);\n }\n };\n\n document.addEventListener('keyup', escCloseListener);\n });\n\n // Event handler to click save groups filter.\n jqRoot.on(CustomEvents.events.activate, Selectors.filters.group.save, function() {\n // Copy the saved values into the form before submitting.\n let popcheckboxes = root.querySelectorAll(Selectors.filters.group.checkbox);\n\n popcheckboxes.forEach(function(popcheckbox) {\n let filtersform = document.forms.filtersform,\n saveid = popcheckbox.getAttribute('data-saveid');\n\n filtersform.querySelector(`#${saveid}`).checked = popcheckbox.checked;\n });\n\n submitWithFilter('#filter-groups-popover');\n });\n\n // Listeners for export buttons.\n // These allow fetching of the relevant export URL, before submitting the request with\n // any POST data that is common to all of the export links. This allows filters to be\n // applied that contain potentially a lot of data (eg discussion IDs for groups filtering).\n document.querySelectorAll(Selectors.filters.exportlink.link).forEach(function(exportbutton) {\n exportbutton.addEventListener('click', function(event) {\n document.forms.exportlinkform.action = event.target.dataset.url;\n document.forms.exportlinkform.submit();\n });\n });\n\n // Dates filter specific handlers.\n\n // Event handler for showing dates filter popover.\n jqRoot.on(CustomEvents.events.activate, Selectors.filters.date.trigger, function() {\n\n // Create popover.\n let referenceElement = root.querySelector(Selectors.filters.date.trigger),\n popperContent = root.querySelector(Selectors.filters.date.popover);\n\n new Popper(referenceElement, popperContent, {placement: 'bottom'});\n\n // Show popover and move focus.\n popperContent.classList.remove('hidden');\n popperContent.setAttribute('data-openfilter', 'true');\n popperContent.querySelector('[name=\"filterdatefrompopover[enabled]\"]').focus();\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 // Add listener to handle closing filter.\n const closeListener = e => {\n if (e.target.id !== referenceElement.id && popperContent !== e.target.closest('[data-openfilter=\"true\"]') &&\n (typeof e.keyCode === 'undefined' || e.keyCode === KeyCodes.enter || e.keyCode === KeyCodes.space)) {\n closeOpenFilters(referenceElement, popperContent);\n document.removeEventListener('click', closeListener);\n document.removeEventListener('keyup', closeListener);\n document.removeEventListener('keyup', escCloseListener);\n }\n };\n\n document.addEventListener('click', closeListener);\n document.addEventListener('keyup', closeListener);\n\n const escCloseListener = e => {\n if (e.keyCode === KeyCodes.escape) {\n closeOpenFilters(referenceElement, popperContent);\n document.removeEventListener('keyup', escCloseListener);\n document.removeEventListener('click', closeListener);\n }\n };\n\n document.addEventListener('keyup', escCloseListener);\n });\n\n // Event handler to save dates filter.\n jqRoot.on(CustomEvents.events.activate, Selectors.filters.date.save, function() {\n // Populate the hidden form inputs to submit the data.\n let filtersForm = document.forms.filtersform;\n const datesPopover = root.querySelector(Selectors.filters.date.popover);\n const fromEnabled = datesPopover.querySelector('[name=\"filterdatefrompopover[enabled]\"]').checked ? 1 : 0;\n const toEnabled = datesPopover.querySelector('[name=\"filterdatetopopover[enabled]\"]').checked ? 1 : 0;\n\n if (!fromEnabled && !toEnabled) {\n // Update the elements in the filter form.\n filtersForm.elements['datefrom[timestamp]'].value = 0;\n filtersForm.elements['datefrom[enabled]'].value = fromEnabled;\n filtersForm.elements['dateto[timestamp]'].value = 0;\n filtersForm.elements['dateto[enabled]'].value = toEnabled;\n\n // Submit the filter values and re-generate report.\n submitWithFilter('#filter-dates-popover');\n } else {\n let args = {data: []};\n\n if (fromEnabled) {\n args.data.push({\n 'key': 'from',\n 'year': datesPopover.querySelector('[name=\"filterdatefrompopover[year]\"]').value,\n 'month': datesPopover.querySelector('[name=\"filterdatefrompopover[month]\"]').value,\n 'day': datesPopover.querySelector('[name=\"filterdatefrompopover[day]\"]').value,\n 'hour': 0,\n 'minute': 0\n });\n }\n\n if (toEnabled) {\n args.data.push({\n 'key': 'to',\n 'year': datesPopover.querySelector('[name=\"filterdatetopopover[year]\"]').value,\n 'month': datesPopover.querySelector('[name=\"filterdatetopopover[month]\"]').value,\n 'day': datesPopover.querySelector('[name=\"filterdatetopopover[day]\"]').value,\n 'hour': 23,\n 'minute': 59\n });\n }\n\n const request = {\n methodname: 'core_calendar_get_timestamps',\n args: args\n };\n\n Ajax.call([request])[0].done(function(result) {\n let fromTimestamp = 0,\n toTimestamp = 0;\n\n result['timestamps'].forEach(function(data){\n if (data.key === 'from') {\n fromTimestamp = data.timestamp;\n } else if (data.key === 'to') {\n toTimestamp = data.timestamp;\n }\n });\n\n // Display an error if the from date is later than the do date.\n if (toTimestamp > 0 && fromTimestamp > toTimestamp) {\n const warningdiv = document.getElementById('dates-filter-warning');\n warningdiv.classList.remove('hidden');\n warningdiv.classList.add('d-block');\n } else {\n filtersForm.elements['datefrom[timestamp]'].value = fromTimestamp;\n filtersForm.elements['datefrom[enabled]'].value = fromEnabled;\n filtersForm.elements['dateto[timestamp]'].value = toTimestamp;\n filtersForm.elements['dateto[enabled]'].value = toEnabled;\n\n // Submit the filter values and re-generate report.\n submitWithFilter('#filter-dates-popover');\n }\n });\n }\n });\n\n jqRoot.on(CustomEvents.events.activate, Selectors.filters.date.calendariconfrom, function() {\n updateCalendarPosition(Selectors.filters.date.calendariconfrom);\n });\n\n jqRoot.on(CustomEvents.events.activate, Selectors.filters.date.calendariconto, function() {\n updateCalendarPosition(Selectors.filters.date.calendariconto);\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 index ca815cd4b27..a5ffcc44713 100644 --- a/mod/forum/report/summary/amd/build/selectors.min.js +++ b/mod/forum/report/summary/amd/build/selectors.min.js @@ -1,2 +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"},date:{calendar:"#dateselector-calendar-panel",calendariconfrom:"#id_filterdatefrompopover_calendar",calendariconto:"#id_filterdatetopopover_calendar",popover:"#filter-dates-popover",save:"[data-region=\"filter-dates\"] .filter-save",trigger:"#filter-dates-button"}}};return a.default}); +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"},date:{calendar:"#dateselector-calendar-panel",calendariconfrom:"#id_filterdatefrompopover_calendar",calendariconto:"#id_filterdatetopopover_calendar",popover:"#filter-dates-popover",save:"[data-region=\"filter-dates\"] .filter-save",trigger:"#filter-dates-button"},exportlink:{link:"#summaryreport #forumreport_summary_table button.export-link"}}};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 index 88ee0100a86..1aebcd74e1f 100644 --- a/mod/forum/report/summary/amd/build/selectors.min.js.map +++ b/mod/forum/report/summary/amd/build/selectors.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/selectors.js"],"names":["filters","group","checkbox","clear","popover","save","selectall","trigger","date","calendar","calendariconfrom","calendariconto"],"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,CASLC,IAAI,CAAE,CACFC,QAAQ,CAAE,8BADR,CAEFC,gBAAgB,CAAE,oCAFhB,CAGFC,cAAc,CAAE,kCAHd,CAIFP,OAAO,CAAE,uBAJP,CAKFC,IAAI,CAAE,6CALJ,CAMFE,OAAO,CAAE,sBANP,CATD,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 .\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 date: {\n calendar: '#dateselector-calendar-panel',\n calendariconfrom: '#id_filterdatefrompopover_calendar',\n calendariconto: '#id_filterdatetopopover_calendar',\n popover: '#filter-dates-popover',\n save: '[data-region=\"filter-dates\"] .filter-save',\n trigger: '#filter-dates-button',\n }\n }\n};\n"],"file":"selectors.min.js"} \ No newline at end of file +{"version":3,"sources":["../src/selectors.js"],"names":["filters","group","checkbox","clear","popover","save","selectall","trigger","date","calendar","calendariconfrom","calendariconto","exportlink","link"],"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,CASLC,IAAI,CAAE,CACFC,QAAQ,CAAE,8BADR,CAEFC,gBAAgB,CAAE,oCAFhB,CAGFC,cAAc,CAAE,kCAHd,CAIFP,OAAO,CAAE,uBAJP,CAKFC,IAAI,CAAE,6CALJ,CAMFE,OAAO,CAAE,sBANP,CATD,CAiBLK,UAAU,CAAE,CACRC,IAAI,CAAE,8DADE,CAjBP,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 .\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 date: {\n calendar: '#dateselector-calendar-panel',\n calendariconfrom: '#id_filterdatefrompopover_calendar',\n calendariconto: '#id_filterdatetopopover_calendar',\n popover: '#filter-dates-popover',\n save: '[data-region=\"filter-dates\"] .filter-save',\n trigger: '#filter-dates-button',\n },\n exportlink: {\n link: '#summaryreport #forumreport_summary_table button.export-link'\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 3dfd655750f..458ba613056 100644 --- a/mod/forum/report/summary/amd/src/filters.js +++ b/mod/forum/report/summary/amd/src/filters.js @@ -240,6 +240,17 @@ export const init = (root) => { submitWithFilter('#filter-groups-popover'); }); + // Listeners for export buttons. + // These allow fetching of the relevant export URL, before submitting the request with + // any POST data that is common to all of the export links. This allows filters to be + // applied that contain potentially a lot of data (eg discussion IDs for groups filtering). + document.querySelectorAll(Selectors.filters.exportlink.link).forEach(function(exportbutton) { + exportbutton.addEventListener('click', function(event) { + document.forms.exportlinkform.action = event.target.dataset.url; + document.forms.exportlinkform.submit(); + }); + }); + // Dates filter specific handlers. // Event handler for showing dates filter popover. diff --git a/mod/forum/report/summary/amd/src/selectors.js b/mod/forum/report/summary/amd/src/selectors.js index 553cf28e995..d10537e2573 100644 --- a/mod/forum/report/summary/amd/src/selectors.js +++ b/mod/forum/report/summary/amd/src/selectors.js @@ -39,6 +39,9 @@ export default { popover: '#filter-dates-popover', save: '[data-region="filter-dates"] .filter-save', trigger: '#filter-dates-button', + }, + exportlink: { + link: '#summaryreport #forumreport_summary_table button.export-link' } } }; diff --git a/mod/forum/report/summary/classes/output/filters.php b/mod/forum/report/summary/classes/output/filters.php index 60a71238beb..4fe3398c92e 100644 --- a/mod/forum/report/summary/classes/output/filters.php +++ b/mod/forum/report/summary/classes/output/filters.php @@ -70,6 +70,17 @@ class filters implements renderable, templatable { */ protected $groupsselected = []; + /** + * IDs of discussions required for export links. + * If a subset of groups available are selected, this will include the discussion IDs + * within that group in the forum. + * If all groups are selected, or no groups mode is enabled, this will be empty as + * no discussion filtering is required in the export. + * + * @var array $discussionids + */ + protected $discussionids = []; + /** * HTML for dates filter. * @@ -147,6 +158,23 @@ class filters implements renderable, templatable { // Overwrite groups properties. $this->groupsavailable = $groupsavailable; $this->groupsselected = $groupsselected; + + // If export links will require discussion filtering, find and set the discussion IDs. + $groupsselectedcount = count($groupsselected); + if ($groupsselectedcount > 0 && $groupsselectedcount < count($groupsavailable)) { + list($groupidin, $groupidparams) = $DB->get_in_or_equal($groupsselected, SQL_PARAMS_NAMED); + $dwhere = "course = :courseid AND forum = :forumid AND groupid {$groupidin}"; + $dparams = [ + 'courseid' => $this->cm->course, + 'forumid' => $this->cm->instance, + ]; + $dparams += $groupidparams; + $discussionids = $DB->get_fieldset_select('forum_discussions', 'DISTINCT id', $dwhere, $dparams); + + foreach ($discussionids as $discussionid) { + $this->discussionids[] = ['discid' => $discussionid]; + } + } } /** @@ -263,6 +291,9 @@ class filters implements renderable, templatable { $output->hasgroups = false; } + // Set discussion IDs for use by export links (always included, as it will be empty if not required). + $output->discussionids = $this->discussionids; + // Set date button and generate dates popover mform. $datesformdata = []; diff --git a/mod/forum/report/summary/classes/summary_table.php b/mod/forum/report/summary/classes/summary_table.php index 1c4f6249a7c..4f137791cbe 100644 --- a/mod/forum/report/summary/classes/summary_table.php +++ b/mod/forum/report/summary/classes/summary_table.php @@ -94,6 +94,11 @@ class summary_table extends table_sql { */ protected $canseeprivatereplies; + /** + * @var array Validated filter data, for use in GET parameters by export links. + */ + protected $exportfilterdata = []; + /** * Forum report table constructor. * @@ -158,7 +163,7 @@ class summary_table extends table_sql { $columnheaders['latestpost'] = get_string('latestpost', 'forumreport_summary'); if ($canexport) { - $columnheaders['export'] = ''; + $columnheaders['export'] = get_string('exportposts', 'forumreport_summary'); } $this->define_columns(array_keys($columnheaders)); @@ -291,12 +296,33 @@ class summary_table extends table_sql { public function col_export(\stdClass $data): string { global $OUTPUT; + // If no posts, nothing to export. + if (empty($data->earliestpost)) { + return ''; + } + $params = [ 'id' => $this->cm->instance, // Forum id. - 'userids[]' => $data->userid // User id. + 'userids[]' => $data->userid, // User id. ]; - return $OUTPUT->action_link(new \moodle_url('/mod/forum/export.php', $params), get_string('export', 'mod_forum')); + // Add relevant filter params. + foreach ($this->exportfilterdata as $name => $data) { + if (is_array($data)) { + foreach ($data as $key => $value) { + $params["{$name}[{$key}]"] = $value; + } + } else { + $params[$name] = $data; + } + } + + $buttoncontext = [ + 'url' => new \moodle_url('/mod/forum/export.php', $params), + 'label' => get_string('exportpostslabel', 'forumreport_summary', fullname($data)), + ]; + + return $OUTPUT->render_from_template('forumreport_summary/export_link_button', $buttoncontext); } /** @@ -376,18 +402,17 @@ class summary_table extends table_sql { // Skip adding filter if not applied, or all valid options are selected. if (!empty($groups)) { + list($groupidin, $groupidparams) = $DB->get_in_or_equal($groups, SQL_PARAMS_NAMED); + // Posts within selected groups and/or not in any groups (group ID -1) are included. // No user filtering as anyone enrolled can potentially post to unrestricted discussions. if (array_search(-1, $groups) !== false) { - list($groupidin, $groupidparams) = $DB->get_in_or_equal($groups, SQL_PARAMS_NAMED); - $this->sql->filterwhere .= " AND d.groupid {$groupidin}"; $this->sql->params += $groupidparams; } else { // Only posts and users within selected groups are included. list($groupusersin, $groupusersparams) = $DB->get_in_or_equal($groups, SQL_PARAMS_NAMED); - list($groupidin, $groupidparams) = $DB->get_in_or_equal($groups, SQL_PARAMS_NAMED); // No joins required (handled by where to prevent data duplication). $this->sql->filterwhere .= " @@ -421,6 +446,7 @@ class summary_table extends table_sql { $this->sql->params['fromdate'] = $values['from']['timestamp']; $this->sql->filterbase['dateslog'] .= ' AND timecreated >= :fromdate'; $this->sql->filterbase['dateslogparams']['fromdate'] = $values['from']['timestamp']; + $this->exportfilterdata['timestampfrom'] = $values['from']['timestamp']; } // To date. @@ -431,6 +457,7 @@ class summary_table extends table_sql { $this->sql->params['todate'] = $values['to']['timestamp']; $this->sql->filterbase['dateslog'] .= ' AND timecreated <= :todate'; $this->sql->filterbase['dateslogparams']['todate'] = $values['to']['timestamp']; + $this->exportfilterdata['timestampto'] = $values['to']['timestamp']; } } @@ -457,6 +484,7 @@ class summary_table extends table_sql { $this->pageable(true); $this->is_downloadable(true); $this->no_sorting('select'); + $this->no_sorting('export'); $this->set_attribute('id', 'forumreport_summary_table'); $this->sql = new \stdClass(); $this->sql->params = []; diff --git a/mod/forum/report/summary/index.php b/mod/forum/report/summary/index.php index 8e055451bc8..8ef6e2330b7 100644 --- a/mod/forum/report/summary/index.php +++ b/mod/forum/report/summary/index.php @@ -80,7 +80,7 @@ $PAGE->navbar->add(get_string('nodetitle', "forumreport_summary")); // Prepare and display the report. $allowbulkoperations = !$download && !empty($CFG->messaging) && has_capability('moodle/course:bulkmessaging', $context); $canseeprivatereplies = has_capability('mod/forum:readprivatereplies', $context); -$canexport = has_capability('mod/forum:exportforum', $context); +$canexport = !$download && has_capability('mod/forum:exportforum', $context); $table = new \forumreport_summary\summary_table($courseid, $filters, $allowbulkoperations, $canseeprivatereplies, $perpage, $canexport); diff --git a/mod/forum/report/summary/lang/en/forumreport_summary.php b/mod/forum/report/summary/lang/en/forumreport_summary.php index 71bb4423dfd..4d1813d24b8 100644 --- a/mod/forum/report/summary/lang/en/forumreport_summary.php +++ b/mod/forum/report/summary/lang/en/forumreport_summary.php @@ -37,6 +37,8 @@ $string['filter:groupsname'] = 'Groups'; $string['filter:groupscountall'] = 'Groups (all)'; $string['filter:groupscountnumber'] = 'Groups ({$a})'; $string['latestpost'] = 'Most recent post'; +$string['exportposts'] = 'Export posts'; +$string['exportpostslabel'] = 'Export posts for {$a}'; $string['nodetitle'] = 'Summary report'; $string['pluginname'] = 'Forum summary report'; $string['postcount'] = 'Number of discussions posted'; diff --git a/mod/forum/report/summary/templates/export_link_button.mustache b/mod/forum/report/summary/templates/export_link_button.mustache new file mode 100644 index 00000000000..22d683016fe --- /dev/null +++ b/mod/forum/report/summary/templates/export_link_button.mustache @@ -0,0 +1,31 @@ +{{! + 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 . +}} +{{! + @template forumreport_summary/export_link_button + + Summary report filters. + + Example context (json): + { + "url": "wwwroot/moodle/mod/forum/export.php?userids[]=12", + "label": "Export posts for Joey Jojo" + } +}} + + diff --git a/mod/forum/report/summary/templates/filters.mustache b/mod/forum/report/summary/templates/filters.mustache index f4dd7fbeef7..09dde0e596c 100644 --- a/mod/forum/report/summary/templates/filters.mustache +++ b/mod/forum/report/summary/templates/filters.mustache @@ -49,6 +49,14 @@ "timestamp": "725673600", "enabled": "1" } + ], + "discussionids": [ + { + "discid": 123 + }, + { + "discid": 456 + } ] } }} @@ -62,6 +70,11 @@ {{> forumreport_summary/filter_groups}} +
+ {{#discussionids}} + + {{/discussionids}} +
{{! Dates filter popover - mform must exist outside of the filtersform }} {{> forumreport_summary/filter_dates_popover}}