diff --git a/user/amd/build/local/participantsfilter/filter.min.js b/user/amd/build/local/participantsfilter/filter.min.js index 0f13ff20617..5c2801e174e 100644 --- a/user/amd/build/local/participantsfilter/filter.min.js +++ b/user/amd/build/local/participantsfilter/filter.min.js @@ -1,2 +1,2 @@ -define ("core_user/local/participantsfilter/filter",["exports","core/form-autocomplete","./selectors","core/str"],function(a,b,c,d){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.default=void 0;b=e(b);c=e(c);function e(a){return a&&a.__esModule?a:{default:a}}function f(a,b,c,d,e,f,g){try{var h=a[f](g),i=h.value}catch(a){c(a);return}if(h.done){b(i)}else{Promise.resolve(i).then(d,e)}}function g(a){return function(){var b=this,c=arguments;return new Promise(function(d,e){var i=a.apply(b,c);function g(a){f(i,d,e,g,h,"next",a)}function h(a){f(i,d,e,g,h,"throw",a)}g(void 0)})}}function h(a,b){if(!(a instanceof b)){throw new TypeError("Cannot call a class as a function")}}function i(a,b){for(var c=0,d;c<b.length;c++){d=b[c];d.enumerable=d.enumerable||!1;d.configurable=!0;if("value"in d)d.writable=!0;Object.defineProperty(a,d.key,d)}}function j(a,b,c){if(b)i(a.prototype,b);if(c)i(a,c);return a}var k=function(a){return a.querySelectorAll(":checked")},l=function(){function a(b,c,d){h(this,a);this.filterType=b;this.rootNode=c;this.addValueSelector(d)}j(a,[{key:"tearDown",value:function tearDown(){}},{key:"addValueSelector",value:function(){var a=g(regeneratorRuntime.mark(function a(){var c=this,d,e,f,g=arguments;return regeneratorRuntime.wrap(function(a){while(1){switch(a.prev=a.next){case 0:d=0<g.length&&g[0]!==void 0?g[0]:[];e=this.getFilterValueNode();e.innerHTML=this.getSourceDataForFilter().outerHTML;f=e.querySelector("select");d.forEach(function(a){var b=f.querySelector("option[value=\"".concat(a,"\"]"));if(b){b.selected=!0}else if(!c.showSuggestions){b=document.createElement("option");b.value=a;b.innerHTML=a;b.selected=!0;f.append(b)}});a.t0=b.default;a.t1=f;a.t2="1"==f.dataset.allowCustom;a.next=10;return this.placeholder;case 10:a.t3=a.sent;a.t4=this.showSuggestions;a.t5=!f.multiple;a.t6={items:"core_user/local/participantsfilter/autocomplete_selection_items",layout:"core_user/local/participantsfilter/autocomplete_layout",selection:"core_user/local/participantsfilter/autocomplete_selection"};a.t0.enhance.call(a.t0,a.t1,a.t2,null,a.t3,!1,a.t4,null,a.t5,a.t6);case 15:case"end":return a.stop();}}},a,this)}));return function addValueSelector(){return a.apply(this,arguments)}}()},{key:"getSourceDataForFilter",value:function getSourceDataForFilter(){var a=this.rootNode.querySelector(c.default.filterset.regions.datasource);return a.querySelector(c.default.data.fields.byName(this.filterType))}},{key:"getFilterValueNode",value:function getFilterValueNode(){return this.filterRoot.querySelector(c.default.filter.regions.values)}},{key:"placeholder",get:function get(){return(0,d.get_string)("placeholdertypeorselect","core_user")}},{key:"showSuggestions",get:function get(){return!0}},{key:"filterRoot",get:function get(){return this.rootNode.querySelector(c.default.filter.byName(this.filterType))}},{key:"name",get:function get(){return this.filterType}},{key:"jointype",get:function get(){return this.filterRoot.querySelector(c.default.filter.fields.join).value}},{key:"rawValues",get:function get(){var a=this.getFilterValueNode(),b=a.querySelector("select");return Object.values(k(b)).map(function(a){return a.value})}},{key:"values",get:function get(){return this.rawValues.map(function(a){return parseInt(a,10)})}},{key:"filterValue",get:function get(){return{name:this.name,jointype:this.jointype,values:this.values}}}]);return a}();a.default=l;return a.default}); +define ("core_user/local/participantsfilter/filter",["exports","core/form-autocomplete","./selectors","core/str"],function(a,b,c,d){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.default=void 0;b=e(b);c=e(c);function e(a){return a&&a.__esModule?a:{default:a}}function f(a,b,c,d,e,f,g){try{var h=a[f](g),i=h.value}catch(a){c(a);return}if(h.done){b(i)}else{Promise.resolve(i).then(d,e)}}function g(a){return function(){var b=this,c=arguments;return new Promise(function(d,e){var i=a.apply(b,c);function g(a){f(i,d,e,g,h,"next",a)}function h(a){f(i,d,e,g,h,"throw",a)}g(void 0)})}}function h(a,b){if(!(a instanceof b)){throw new TypeError("Cannot call a class as a function")}}function i(a,b){for(var c=0,d;c<b.length;c++){d=b[c];d.enumerable=d.enumerable||!1;d.configurable=!0;if("value"in d)d.writable=!0;Object.defineProperty(a,d.key,d)}}function j(a,b,c){if(b)i(a.prototype,b);if(c)i(a,c);return a}var k=function(a){return a.querySelectorAll(":checked")},l=function(){function a(b,c,d){h(this,a);this.filterType=b;this.rootNode=c;this.addValueSelector(d)}j(a,[{key:"tearDown",value:function tearDown(){}},{key:"addValueSelector",value:function(){var a=g(regeneratorRuntime.mark(function a(){var c=this,d,e,f,g=arguments;return regeneratorRuntime.wrap(function(a){while(1){switch(a.prev=a.next){case 0:d=0<g.length&&g[0]!==void 0?g[0]:[];e=this.getFilterValueNode();e.innerHTML=this.getSourceDataForFilter().outerHTML;f=e.querySelector("select");d.forEach(function(a){var b=f.querySelector("option[value=\"".concat(a,"\"]"));if(b){b.selected=!0}else if(!c.showSuggestions){b=document.createElement("option");b.value=a;b.innerHTML=a;b.selected=!0;f.append(b)}});a.t0=b.default;a.t1=f;a.t2="1"==f.dataset.allowCustom;a.next=10;return this.placeholder;case 10:a.t3=a.sent;a.t4=this.showSuggestions;a.t5=!f.multiple;a.t6={items:"core_user/local/participantsfilter/autocomplete_selection_items",layout:"core_user/local/participantsfilter/autocomplete_layout",selection:"core_user/local/participantsfilter/autocomplete_selection"};a.t0.enhance.call(a.t0,a.t1,a.t2,null,a.t3,!1,a.t4,null,a.t5,a.t6);case 15:case"end":return a.stop();}}},a,this)}));return function addValueSelector(){return a.apply(this,arguments)}}()},{key:"getSourceDataForFilter",value:function getSourceDataForFilter(){var a=this.rootNode.querySelector(c.default.filterset.regions.datasource);return a.querySelector(c.default.data.fields.byName(this.filterType))}},{key:"getFilterValueNode",value:function getFilterValueNode(){return this.filterRoot.querySelector(c.default.filter.regions.values)}},{key:"placeholder",get:function get(){return(0,d.get_string)("placeholdertypeorselect","core_user")}},{key:"showSuggestions",get:function get(){return!0}},{key:"filterRoot",get:function get(){return this.rootNode.querySelector(c.default.filter.byName(this.filterType))}},{key:"name",get:function get(){return this.filterType}},{key:"jointype",get:function get(){return parseInt(this.filterRoot.querySelector(c.default.filter.fields.join).value,10)}},{key:"rawValues",get:function get(){var a=this.getFilterValueNode(),b=a.querySelector("select");return Object.values(k(b)).map(function(a){return a.value})}},{key:"values",get:function get(){return this.rawValues.map(function(a){return parseInt(a,10)})}},{key:"filterValue",get:function get(){return{name:this.name,jointype:this.jointype,values:this.values}}}]);return a}();a.default=l;return a.default}); //# sourceMappingURL=filter.min.js.map diff --git a/user/amd/build/local/participantsfilter/filter.min.js.map b/user/amd/build/local/participantsfilter/filter.min.js.map index 1cc0896cdbd..a7780828532 100644 --- a/user/amd/build/local/participantsfilter/filter.min.js.map +++ b/user/amd/build/local/participantsfilter/filter.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["../../../src/local/participantsfilter/filter.js"],"names":["getOptionsForSelect","select","querySelectorAll","filterType","rootNode","initialValues","addValueSelector","filterValueNode","getFilterValueNode","innerHTML","getSourceDataForFilter","outerHTML","dataSource","querySelector","forEach","filterValue","selectedOption","selected","showSuggestions","document","createElement","value","append","Autocomplete","dataset","allowCustom","placeholder","multiple","items","layout","selection","enhance","filterDataNode","Selectors","filterset","regions","datasource","data","fields","byName","filterRoot","filter","values","join","filterValueSelect","Object","map","option","rawValues","parseInt","name","jointype"],"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 * Base Filter class for a filter type in the participants filter UI.\n *\n * @module core_user/local/participantsfilter/filter\n * @package core_user\n * @copyright 2020 Andrew Nicols <andrew@nicols.co.uk>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport Autocomplete from 'core/form-autocomplete';\nimport Selectors from './selectors';\nimport {get_string as getString} from 'core/str';\n\n/**\n * Fetch all checked options in the select.\n *\n * This is a poor-man's polyfill for select.selectedOptions, which is not available in IE11.\n *\n * @param {HTMLSelectElement} select\n * @returns {HTMLOptionElement[]} All selected options\n */\nconst getOptionsForSelect = select => {\n return select.querySelectorAll(':checked');\n};\n\nexport default class {\n\n /**\n * Constructor for a new filter.\n *\n * @param {String} filterType The type of filter that this relates to\n * @param {HTMLElement} rootNode The root node for the participants filterset\n * @param {Array} initialValues The initial values for the selector\n */\n constructor(filterType, rootNode, initialValues) {\n this.filterType = filterType;\n this.rootNode = rootNode;\n\n this.addValueSelector(initialValues);\n }\n\n /**\n * Perform any tear-down for this filter type.\n */\n tearDown() {\n // eslint-disable-line no-empty-function\n }\n\n /**\n * Get the placeholder to use when showing the value selector.\n *\n * @return {Promise} Resolving to a String\n */\n get placeholder() {\n return getString('placeholdertypeorselect', 'core_user');\n }\n\n /**\n * Whether to show suggestions in the autocomplete.\n *\n * @return {Boolean}\n */\n get showSuggestions() {\n return true;\n }\n\n /**\n * Add the value selector to the filter row.\n *\n * @param {Array} initialValues\n */\n async addValueSelector(initialValues = []) {\n const filterValueNode = this.getFilterValueNode();\n\n // Copy the data in place.\n filterValueNode.innerHTML = this.getSourceDataForFilter().outerHTML;\n\n const dataSource = filterValueNode.querySelector('select');\n\n // If there are any initial values then attempt to apply them.\n initialValues.forEach(filterValue => {\n let selectedOption = dataSource.querySelector(`option[value=\"${filterValue}\"]`);\n if (selectedOption) {\n selectedOption.selected = true;\n } else if (!this.showSuggestions) {\n selectedOption = document.createElement('option');\n selectedOption.value = filterValue;\n selectedOption.innerHTML = filterValue;\n selectedOption.selected = true;\n\n dataSource.append(selectedOption);\n }\n });\n\n Autocomplete.enhance(\n // The source select element.\n dataSource,\n\n // Whether to allow 'tags' (custom entries).\n dataSource.dataset.allowCustom == \"1\",\n\n // We do not require AJAX at all as standard.\n null,\n\n // The string to use as a placeholder.\n await this.placeholder,\n\n // Disable case sensitivity on searches.\n false,\n\n // Show suggestions.\n this.showSuggestions,\n\n // Do not override the 'no suggestions' string.\n null,\n\n // Close the suggestions if this is not a multi-select.\n !dataSource.multiple,\n\n // Template overrides.\n {\n items: 'core_user/local/participantsfilter/autocomplete_selection_items',\n layout: 'core_user/local/participantsfilter/autocomplete_layout',\n selection: 'core_user/local/participantsfilter/autocomplete_selection',\n }\n );\n }\n\n /**\n * Get the root node for this filter.\n *\n * @returns {HTMLElement}\n */\n get filterRoot() {\n return this.rootNode.querySelector(Selectors.filter.byName(this.filterType));\n }\n\n /**\n * Get the possible data for this filter type.\n *\n * @returns {Array}\n */\n getSourceDataForFilter() {\n const filterDataNode = this.rootNode.querySelector(Selectors.filterset.regions.datasource);\n\n return filterDataNode.querySelector(Selectors.data.fields.byName(this.filterType));\n }\n\n /**\n * Get the HTMLElement which contains the value selector.\n *\n * @returns {HTMLElement}\n */\n getFilterValueNode() {\n return this.filterRoot.querySelector(Selectors.filter.regions.values);\n }\n\n /**\n * Get the name of this filter.\n *\n * @returns {String}\n */\n get name() {\n return this.filterType;\n }\n\n /**\n * Get the type of join specified.\n *\n * @returns {Number}\n */\n get jointype() {\n return this.filterRoot.querySelector(Selectors.filter.fields.join).value;\n }\n\n /**\n * Get the list of raw values for this filter type.\n *\n * @returns {Array}\n */\n get rawValues() {\n const filterValueNode = this.getFilterValueNode();\n const filterValueSelect = filterValueNode.querySelector('select');\n\n return Object.values(getOptionsForSelect(filterValueSelect)).map(option => option.value);\n }\n\n /**\n * Get the list of values for this filter type.\n *\n * @returns {Array}\n */\n get values() {\n return this.rawValues.map(option => parseInt(option, 10));\n }\n\n /**\n * Get the composed value for this filter.\n *\n * @returns {Object}\n */\n get filterValue() {\n return {\n name: this.name,\n jointype: this.jointype,\n values: this.values,\n };\n }\n}\n"],"file":"filter.min.js"} \ No newline at end of file +{"version":3,"sources":["../../../src/local/participantsfilter/filter.js"],"names":["getOptionsForSelect","select","querySelectorAll","filterType","rootNode","initialValues","addValueSelector","filterValueNode","getFilterValueNode","innerHTML","getSourceDataForFilter","outerHTML","dataSource","querySelector","forEach","filterValue","selectedOption","selected","showSuggestions","document","createElement","value","append","Autocomplete","dataset","allowCustom","placeholder","multiple","items","layout","selection","enhance","filterDataNode","Selectors","filterset","regions","datasource","data","fields","byName","filterRoot","filter","values","parseInt","join","filterValueSelect","Object","map","option","rawValues","name","jointype"],"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 * Base Filter class for a filter type in the participants filter UI.\n *\n * @module core_user/local/participantsfilter/filter\n * @package core_user\n * @copyright 2020 Andrew Nicols <andrew@nicols.co.uk>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport Autocomplete from 'core/form-autocomplete';\nimport Selectors from './selectors';\nimport {get_string as getString} from 'core/str';\n\n/**\n * Fetch all checked options in the select.\n *\n * This is a poor-man's polyfill for select.selectedOptions, which is not available in IE11.\n *\n * @param {HTMLSelectElement} select\n * @returns {HTMLOptionElement[]} All selected options\n */\nconst getOptionsForSelect = select => {\n return select.querySelectorAll(':checked');\n};\n\nexport default class {\n\n /**\n * Constructor for a new filter.\n *\n * @param {String} filterType The type of filter that this relates to\n * @param {HTMLElement} rootNode The root node for the participants filterset\n * @param {Array} initialValues The initial values for the selector\n */\n constructor(filterType, rootNode, initialValues) {\n this.filterType = filterType;\n this.rootNode = rootNode;\n\n this.addValueSelector(initialValues);\n }\n\n /**\n * Perform any tear-down for this filter type.\n */\n tearDown() {\n // eslint-disable-line no-empty-function\n }\n\n /**\n * Get the placeholder to use when showing the value selector.\n *\n * @return {Promise} Resolving to a String\n */\n get placeholder() {\n return getString('placeholdertypeorselect', 'core_user');\n }\n\n /**\n * Whether to show suggestions in the autocomplete.\n *\n * @return {Boolean}\n */\n get showSuggestions() {\n return true;\n }\n\n /**\n * Add the value selector to the filter row.\n *\n * @param {Array} initialValues\n */\n async addValueSelector(initialValues = []) {\n const filterValueNode = this.getFilterValueNode();\n\n // Copy the data in place.\n filterValueNode.innerHTML = this.getSourceDataForFilter().outerHTML;\n\n const dataSource = filterValueNode.querySelector('select');\n\n // If there are any initial values then attempt to apply them.\n initialValues.forEach(filterValue => {\n let selectedOption = dataSource.querySelector(`option[value=\"${filterValue}\"]`);\n if (selectedOption) {\n selectedOption.selected = true;\n } else if (!this.showSuggestions) {\n selectedOption = document.createElement('option');\n selectedOption.value = filterValue;\n selectedOption.innerHTML = filterValue;\n selectedOption.selected = true;\n\n dataSource.append(selectedOption);\n }\n });\n\n Autocomplete.enhance(\n // The source select element.\n dataSource,\n\n // Whether to allow 'tags' (custom entries).\n dataSource.dataset.allowCustom == \"1\",\n\n // We do not require AJAX at all as standard.\n null,\n\n // The string to use as a placeholder.\n await this.placeholder,\n\n // Disable case sensitivity on searches.\n false,\n\n // Show suggestions.\n this.showSuggestions,\n\n // Do not override the 'no suggestions' string.\n null,\n\n // Close the suggestions if this is not a multi-select.\n !dataSource.multiple,\n\n // Template overrides.\n {\n items: 'core_user/local/participantsfilter/autocomplete_selection_items',\n layout: 'core_user/local/participantsfilter/autocomplete_layout',\n selection: 'core_user/local/participantsfilter/autocomplete_selection',\n }\n );\n }\n\n /**\n * Get the root node for this filter.\n *\n * @returns {HTMLElement}\n */\n get filterRoot() {\n return this.rootNode.querySelector(Selectors.filter.byName(this.filterType));\n }\n\n /**\n * Get the possible data for this filter type.\n *\n * @returns {Array}\n */\n getSourceDataForFilter() {\n const filterDataNode = this.rootNode.querySelector(Selectors.filterset.regions.datasource);\n\n return filterDataNode.querySelector(Selectors.data.fields.byName(this.filterType));\n }\n\n /**\n * Get the HTMLElement which contains the value selector.\n *\n * @returns {HTMLElement}\n */\n getFilterValueNode() {\n return this.filterRoot.querySelector(Selectors.filter.regions.values);\n }\n\n /**\n * Get the name of this filter.\n *\n * @returns {String}\n */\n get name() {\n return this.filterType;\n }\n\n /**\n * Get the type of join specified.\n *\n * @returns {Number}\n */\n get jointype() {\n return parseInt(this.filterRoot.querySelector(Selectors.filter.fields.join).value, 10);\n }\n\n /**\n * Get the list of raw values for this filter type.\n *\n * @returns {Array}\n */\n get rawValues() {\n const filterValueNode = this.getFilterValueNode();\n const filterValueSelect = filterValueNode.querySelector('select');\n\n return Object.values(getOptionsForSelect(filterValueSelect)).map(option => option.value);\n }\n\n /**\n * Get the list of values for this filter type.\n *\n * @returns {Array}\n */\n get values() {\n return this.rawValues.map(option => parseInt(option, 10));\n }\n\n /**\n * Get the composed value for this filter.\n *\n * @returns {Object}\n */\n get filterValue() {\n return {\n name: this.name,\n jointype: this.jointype,\n values: this.values,\n };\n }\n}\n"],"file":"filter.min.js"} \ No newline at end of file diff --git a/user/amd/build/participantsfilter.min.js b/user/amd/build/participantsfilter.min.js index 60a726d6039..0e6d74a2f04 100644 --- a/user/amd/build/participantsfilter.min.js +++ b/user/amd/build/participantsfilter.min.js @@ -1,2 +1,2 @@ -function _typeof(a){"@babel/helpers - typeof";if("function"==typeof Symbol&&"symbol"==typeof Symbol.iterator){_typeof=function(a){return typeof a}}else{_typeof=function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a}}return _typeof(a)}define ("core_user/participantsfilter",["exports","./local/participantsfilter/filtertypes/courseid","core_table/dynamic","./local/participantsfilter/filter","core/str","core/notification","./local/participantsfilter/selectors","core/templates"],function(a,b,c,d,e,f,g,h){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.init=void 0;b=k(b);c=j(c);d=k(d);f=k(f);g=k(g);h=k(h);var x="undefined"!=typeof window?window:"undefined"!=typeof self?self:"undefined"!=typeof global?global:{};function i(){if("function"!=typeof WeakMap)return null;var a=new WeakMap;i=function(){return a};return a}function j(a){if(a&&a.__esModule){return a}if(null===a||"object"!==_typeof(a)&&"function"!=typeof a){return{default:a}}var b=i();if(b&&b.has(a)){return b.get(a)}var c={},d=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var e in a){if(Object.prototype.hasOwnProperty.call(a,e)){var f=d?Object.getOwnPropertyDescriptor(a,e):null;if(f&&(f.get||f.set)){Object.defineProperty(c,e,f)}else{c[e]=a[e]}}}c.default=a;if(b){b.set(a,c)}return c}function k(a){return a&&a.__esModule?a:{default:a}}function l(a){return o(a)||n(a)||r(a)||m()}function m(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function n(a){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(a))return Array.from(a)}function o(a){if(Array.isArray(a))return s(a)}function p(a,b){return u(a)||t(a,b)||r(a,b)||q()}function q(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function r(a,b){if(!a)return;if("string"==typeof a)return s(a,b);var c=Object.prototype.toString.call(a).slice(8,-1);if("Object"===c&&a.constructor)c=a.constructor.name;if("Map"===c||"Set"===c)return Array.from(c);if("Arguments"===c||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(c))return s(a,b)}function s(a,b){if(null==b||b>a.length)b=a.length;for(var c=0,d=Array(b);c<b;c++){d[c]=a[c]}return d}function t(a,b){if("undefined"==typeof Symbol||!(Symbol.iterator in Object(a)))return;var c=[],d=!0,e=!1,f=void 0;try{for(var g=a[Symbol.iterator](),h;!(d=(h=g.next()).done);d=!0){c.push(h.value);if(b&&c.length===b)break}}catch(a){e=!0;f=a}finally{try{if(!d&&null!=g["return"])g["return"]()}finally{if(e)throw f}}return c}function u(a){if(Array.isArray(a))return a}function v(a,b,c,d,e,f,g){try{var h=a[f](g),i=h.value}catch(a){c(a);return}if(h.done){b(i)}else{Promise.resolve(i).then(d,e)}}function w(a){return function(){var b=this,c=arguments;return new Promise(function(d,e){var h=a.apply(b,c);function f(a){v(h,d,e,f,g,"next",a)}function g(a){v(h,d,e,f,g,"throw",a)}f(void 0)})}}var y=function(a){var i=document.querySelector("#".concat(a)),j={courseid:new b.default("courseid",i)},k=function(){return i.querySelector(g.default.filterset.regions.filterlist)},m=function(){var a=1+k().querySelectorAll(g.default.filter.region).length;return h.default.renderForPromise("core_user/local/participantsfilter/filterrow",{rownumber:a}).then(function(a){var b=a.html,c=a.js,d=h.default.appendNodeContents(k(),b,c);return d}).then(function(a){var b=i.querySelector(g.default.data.typeList);a.forEach(function(a){var c=a.querySelector(g.default.filter.fields.type);if(c){c.innerHTML=b.innerHTML}});return a}).then(function(a){z();return a}).catch(f.default.exception)},n=function(a){var b=i.querySelector(g.default.filterset.regions.datasource);return b.querySelector(g.default.data.fields.byName(a))},o=function(){var a=w(regeneratorRuntime.mark(function a(b,c,e){var f,h,k;return regeneratorRuntime.wrap(function(a){while(1){switch(a.prev=a.next){case 0:b.dataset.filterType=c;f=n(c);h=d.default;if(!f.dataset.filterTypeClass){a.next=7;break}a.next=6;return"function"==typeof x.define&&x.define.amd?new Promise(function(a,b){x.require([f.dataset.filterTypeClass],a,b)}):"undefined"!=typeof module&&module.exports&&"undefined"!=typeof require||"undefined"!=typeof module&&module.component&&x.require&&"component"===x.require.loader?Promise.resolve(require((f.dataset.filterTypeClass))):Promise.resolve(x[f.dataset.filterTypeClass]);case 6:h=a.sent;case 7:j[c]=new h(c,i,e);k=b.querySelector(g.default.filter.fields.type);k.value=c;k.disabled="disabled";z();return a.abrupt("return",j[c]);case 13:case"end":return a.stop();}}},a)}));return function(){return a.apply(this,arguments)}}(),q=function(a){return j[a]},r=function(a){var b=k().querySelectorAll(g.default.filter.region).length;if(1===b){t(a)}else{s(a)}},s=function(){var a=w(regeneratorRuntime.mark(function a(b){var c;return regeneratorRuntime.wrap(function(a){while(1){switch(a.prev=a.next){case 0:u(b.dataset.filterType);b.remove();z();B();a.next=6;return C();case 6:c=a.sent;k().querySelectorAll(g.default.filter.region).forEach(function(a,b){a.querySelector("legend").innerText=c[b]});case 8:case"end":return a.stop();}}},a)}));return function(){return a.apply(this,arguments)}}(),t=function(a){var b=1<arguments.length&&arguments[1]!==void 0?arguments[1]:1;u(a.dataset.filterType);return h.default.renderForPromise("core_user/local/participantsfilter/filterrow",{rownumber:b}).then(function(b){var c=b.html,d=b.js,e=h.default.replaceNode(a,c,d);return e}).then(function(a){var b=i.querySelector(g.default.data.typeList);a.forEach(function(a){var c=a.querySelector(g.default.filter.fields.type);if(c){c.innerHTML=b.innerHTML}});return a}).then(function(a){z();return a}).then(function(a){B();return a}).catch(f.default.exception)},u=function(a){if(a){var b=q(a);if(b){b.tearDown();delete j[a]}}},v=function(){var a=k().querySelectorAll(g.default.filter.region);a.forEach(function(a){return r(a)});return B()},y=function(){var a=k().querySelectorAll(g.default.filter.region);a.forEach(function(a){var b=a.querySelector(g.default.filter.fields.type);if(!b.value){r(a)}})},z=function(){var a=k().querySelectorAll(g.default.filter.region);a.forEach(function(a){var b=a.querySelectorAll(g.default.filter.fields.type+" option");b.forEach(function(b){if(b.value===a.dataset.filterType){b.classList.remove("hidden");b.disabled=!1}else if(j[b.value]){b.classList.add("hidden");b.disabled=!0}else{b.classList.remove("hidden");b.disabled=!1}})});var b=i.querySelector(g.default.filterset.actions.addRow),c=i.querySelectorAll(g.default.data.fields.all);if(c.length<=a.length){b.setAttribute("disabled","disabled")}else{b.removeAttribute("disabled")}if(1===a.length){i.querySelector(g.default.filterset.regions.filtermatch).classList.add("hidden");i.querySelector(g.default.filterset.fields.join).value=1}else{i.querySelector(g.default.filterset.regions.filtermatch).classList.remove("hidden")}},A=function(a){var b=Object.entries(a.filters);if(!b.length){return}i.querySelector(g.default.filterset.fields.join).value=a.jointype;var c=b.map(function(a){var b=p(a,2),c=b[0],d=b[1];if("courseid"===c){return Promise.resolve()}var e=d.values;if(!e.length){return Promise.resolve()}return m().then(function(a){var b=p(a,1),d=b[0];return o(d,c,e)})});Promise.all(c).then(function(){return y()}).then(z).then(B).catch()},B=function(){return c.setFilters(c.getTableFromId(i.dataset.tableRegion),{filters:Object.values(j).map(function(a){return a.filterValue}),jointype:i.querySelector(g.default.filterset.fields.join).value}).catch(f.default.exception)},C=function(){var a=w(regeneratorRuntime.mark(function a(){var b,c,d;return regeneratorRuntime.wrap(function(a){while(1){switch(a.prev=a.next){case 0:b=document.querySelector(g.default.data.typeListSelect).length-1;c=[];l(Array(b)).forEach(function(a,b){c.push({key:"filterrowlegend",component:"core_user",param:b+1})});a.next=5;return(0,e.get_strings)(c).then(function(a){return a}).catch(f.default.exception);case 5:d=a.sent;return a.abrupt("return",d);case 7:case"end":return a.stop();}}},a)}));return function(){return a.apply(this,arguments)}}();i.querySelector(g.default.filterset.region).addEventListener("click",function(a){if(a.target.closest(g.default.filterset.actions.addRow)){a.preventDefault();m()}if(a.target.closest(g.default.filterset.actions.applyFilters)){a.preventDefault();B()}if(a.target.closest(g.default.filterset.actions.resetFilters)){a.preventDefault();v()}});i.querySelector(g.default.filterset.regions.filterlist).addEventListener("click",function(a){if(a.target.closest(g.default.filter.actions.remove)){a.preventDefault();r(a.target.closest(g.default.filter.region))}});i.querySelector(g.default.filterset.regions.filterlist).addEventListener("change",function(a){var b=a.target.closest(g.default.filter.fields.type);if(b&&b.value){var c=a.target.closest(g.default.filter.region);o(c,b.value)}});i.querySelector(g.default.filterset.fields.join).addEventListener("change",function(a){i.dataset.filterverb=a.target.value});var D=c.getTableFromId(i.dataset.tableRegion),E=c.getFilters(D);if(E){A(E)}};a.init=y}); +function _typeof(a){"@babel/helpers - typeof";if("function"==typeof Symbol&&"symbol"==typeof Symbol.iterator){_typeof=function(a){return typeof a}}else{_typeof=function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a}}return _typeof(a)}define ("core_user/participantsfilter",["exports","./local/participantsfilter/filtertypes/courseid","core_table/dynamic","./local/participantsfilter/filter","core/str","core/notification","./local/participantsfilter/selectors","core/templates"],function(a,b,c,d,e,f,g,h){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.init=void 0;b=k(b);c=j(c);d=k(d);f=k(f);g=k(g);h=k(h);var x="undefined"!=typeof window?window:"undefined"!=typeof self?self:"undefined"!=typeof global?global:{};function i(){if("function"!=typeof WeakMap)return null;var a=new WeakMap;i=function(){return a};return a}function j(a){if(a&&a.__esModule){return a}if(null===a||"object"!==_typeof(a)&&"function"!=typeof a){return{default:a}}var b=i();if(b&&b.has(a)){return b.get(a)}var c={},d=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var e in a){if(Object.prototype.hasOwnProperty.call(a,e)){var f=d?Object.getOwnPropertyDescriptor(a,e):null;if(f&&(f.get||f.set)){Object.defineProperty(c,e,f)}else{c[e]=a[e]}}}c.default=a;if(b){b.set(a,c)}return c}function k(a){return a&&a.__esModule?a:{default:a}}function l(a){return o(a)||n(a)||r(a)||m()}function m(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function n(a){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(a))return Array.from(a)}function o(a){if(Array.isArray(a))return s(a)}function p(a,b){return u(a)||t(a,b)||r(a,b)||q()}function q(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function r(a,b){if(!a)return;if("string"==typeof a)return s(a,b);var c=Object.prototype.toString.call(a).slice(8,-1);if("Object"===c&&a.constructor)c=a.constructor.name;if("Map"===c||"Set"===c)return Array.from(c);if("Arguments"===c||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(c))return s(a,b)}function s(a,b){if(null==b||b>a.length)b=a.length;for(var c=0,d=Array(b);c<b;c++){d[c]=a[c]}return d}function t(a,b){if("undefined"==typeof Symbol||!(Symbol.iterator in Object(a)))return;var c=[],d=!0,e=!1,f=void 0;try{for(var g=a[Symbol.iterator](),h;!(d=(h=g.next()).done);d=!0){c.push(h.value);if(b&&c.length===b)break}}catch(a){e=!0;f=a}finally{try{if(!d&&null!=g["return"])g["return"]()}finally{if(e)throw f}}return c}function u(a){if(Array.isArray(a))return a}function v(a,b,c,d,e,f,g){try{var h=a[f](g),i=h.value}catch(a){c(a);return}if(h.done){b(i)}else{Promise.resolve(i).then(d,e)}}function w(a){return function(){var b=this,c=arguments;return new Promise(function(d,e){var h=a.apply(b,c);function f(a){v(h,d,e,f,g,"next",a)}function g(a){v(h,d,e,f,g,"throw",a)}f(void 0)})}}var y=function(a){var i=document.querySelector("#".concat(a)),j={courseid:new b.default("courseid",i)},k=function(){return i.querySelector(g.default.filterset.regions.filterlist)},m=function(){var a=1+k().querySelectorAll(g.default.filter.region).length;return h.default.renderForPromise("core_user/local/participantsfilter/filterrow",{rownumber:a}).then(function(a){var b=a.html,c=a.js,d=h.default.appendNodeContents(k(),b,c);return d}).then(function(a){var b=i.querySelector(g.default.data.typeList);a.forEach(function(a){var c=a.querySelector(g.default.filter.fields.type);if(c){c.innerHTML=b.innerHTML}});return a}).then(function(a){z();return a}).catch(f.default.exception)},n=function(a){var b=i.querySelector(g.default.filterset.regions.datasource);return b.querySelector(g.default.data.fields.byName(a))},o=function(){var a=w(regeneratorRuntime.mark(function a(b,c,e){var f,h,k;return regeneratorRuntime.wrap(function(a){while(1){switch(a.prev=a.next){case 0:b.dataset.filterType=c;f=n(c);h=d.default;if(!f.dataset.filterTypeClass){a.next=7;break}a.next=6;return"function"==typeof x.define&&x.define.amd?new Promise(function(a,b){x.require([f.dataset.filterTypeClass],a,b)}):"undefined"!=typeof module&&module.exports&&"undefined"!=typeof require||"undefined"!=typeof module&&module.component&&x.require&&"component"===x.require.loader?Promise.resolve(require((f.dataset.filterTypeClass))):Promise.resolve(x[f.dataset.filterTypeClass]);case 6:h=a.sent;case 7:j[c]=new h(c,i,e);k=b.querySelector(g.default.filter.fields.type);k.value=c;k.disabled="disabled";z();return a.abrupt("return",j[c]);case 13:case"end":return a.stop();}}},a)}));return function(){return a.apply(this,arguments)}}(),q=function(a){return j[a]},r=function(a){var b=k().querySelectorAll(g.default.filter.region).length;if(1===b){t(a)}else{s(a)}},s=function(){var a=w(regeneratorRuntime.mark(function a(b){var c;return regeneratorRuntime.wrap(function(a){while(1){switch(a.prev=a.next){case 0:u(b.dataset.filterType);b.remove();z();B();a.next=6;return C();case 6:c=a.sent;k().querySelectorAll(g.default.filter.region).forEach(function(a,b){a.querySelector("legend").innerText=c[b]});case 8:case"end":return a.stop();}}},a)}));return function(){return a.apply(this,arguments)}}(),t=function(a){var b=1<arguments.length&&arguments[1]!==void 0?arguments[1]:1;u(a.dataset.filterType);return h.default.renderForPromise("core_user/local/participantsfilter/filterrow",{rownumber:b}).then(function(b){var c=b.html,d=b.js,e=h.default.replaceNode(a,c,d);return e}).then(function(a){var b=i.querySelector(g.default.data.typeList);a.forEach(function(a){var c=a.querySelector(g.default.filter.fields.type);if(c){c.innerHTML=b.innerHTML}});return a}).then(function(a){z();return a}).then(function(a){B();return a}).catch(f.default.exception)},u=function(a){if(a){var b=q(a);if(b){b.tearDown();delete j[a]}}},v=function(){var a=k().querySelectorAll(g.default.filter.region);a.forEach(function(a){return r(a)});return B()},y=function(){var a=k().querySelectorAll(g.default.filter.region);a.forEach(function(a){var b=a.querySelector(g.default.filter.fields.type);if(!b.value){r(a)}})},z=function(){var a=k().querySelectorAll(g.default.filter.region);a.forEach(function(a){var b=a.querySelectorAll(g.default.filter.fields.type+" option");b.forEach(function(b){if(b.value===a.dataset.filterType){b.classList.remove("hidden");b.disabled=!1}else if(j[b.value]){b.classList.add("hidden");b.disabled=!0}else{b.classList.remove("hidden");b.disabled=!1}})});var b=i.querySelector(g.default.filterset.actions.addRow),c=i.querySelectorAll(g.default.data.fields.all);if(c.length<=a.length){b.setAttribute("disabled","disabled")}else{b.removeAttribute("disabled")}if(1===a.length){i.querySelector(g.default.filterset.regions.filtermatch).classList.add("hidden");i.querySelector(g.default.filterset.fields.join).value=1}else{i.querySelector(g.default.filterset.regions.filtermatch).classList.remove("hidden")}},A=function(a){var b=Object.entries(a.filters);if(!b.length){return}i.querySelector(g.default.filterset.fields.join).value=a.jointype;var c=b.map(function(a){var b=p(a,2),c=b[0],d=b[1];if("courseid"===c){return Promise.resolve()}var e=d.values;if(!e.length){return Promise.resolve()}return m().then(function(a){var b=p(a,1),d=b[0];return o(d,c,e)})});Promise.all(c).then(function(){return y()}).then(z).then(B).catch()},B=function(){var a={};Object.values(j).forEach(function(b){a[b.filterValue.name]=b.filterValue});return c.setFilters(c.getTableFromId(i.dataset.tableRegion),{jointype:parseInt(i.querySelector(g.default.filterset.fields.join).value,10),filters:a}).catch(f.default.exception)},C=function(){var a=w(regeneratorRuntime.mark(function a(){var b,c,d;return regeneratorRuntime.wrap(function(a){while(1){switch(a.prev=a.next){case 0:b=document.querySelector(g.default.data.typeListSelect).length-1;c=[];l(Array(b)).forEach(function(a,b){c.push({key:"filterrowlegend",component:"core_user",param:b+1})});a.next=5;return(0,e.get_strings)(c).then(function(a){return a}).catch(f.default.exception);case 5:d=a.sent;return a.abrupt("return",d);case 7:case"end":return a.stop();}}},a)}));return function(){return a.apply(this,arguments)}}();i.querySelector(g.default.filterset.region).addEventListener("click",function(a){if(a.target.closest(g.default.filterset.actions.addRow)){a.preventDefault();m()}if(a.target.closest(g.default.filterset.actions.applyFilters)){a.preventDefault();B()}if(a.target.closest(g.default.filterset.actions.resetFilters)){a.preventDefault();v()}});i.querySelector(g.default.filterset.regions.filterlist).addEventListener("click",function(a){if(a.target.closest(g.default.filter.actions.remove)){a.preventDefault();r(a.target.closest(g.default.filter.region))}});i.querySelector(g.default.filterset.regions.filterlist).addEventListener("change",function(a){var b=a.target.closest(g.default.filter.fields.type);if(b&&b.value){var c=a.target.closest(g.default.filter.region);o(c,b.value)}});i.querySelector(g.default.filterset.fields.join).addEventListener("change",function(a){i.dataset.filterverb=a.target.value});var D=c.getTableFromId(i.dataset.tableRegion),E=c.getFilters(D);if(E){A(E)}};a.init=y}); //# sourceMappingURL=participantsfilter.min.js.map diff --git a/user/amd/build/participantsfilter.min.js.map b/user/amd/build/participantsfilter.min.js.map index 7965370f8ef..4f67ea502e5 100644 --- a/user/amd/build/participantsfilter.min.js.map +++ b/user/amd/build/participantsfilter.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/participantsfilter.js"],"names":["init","participantsRegionId","filterSet","document","querySelector","activeFilters","courseid","CourseFilter","getFilterRegion","Selectors","filterset","regions","filterlist","addFilterRow","rownum","querySelectorAll","filter","region","length","Templates","renderForPromise","then","html","js","newContentNodes","appendNodeContents","filterRow","typeList","data","forEach","contentNode","contentTypeList","fields","type","innerHTML","updateFiltersOptions","catch","Notification","exception","getFilterDataSource","filterType","filterDataNode","datasource","byName","addFilter","initialFilterValues","dataset","Filter","GenericFilter","filterTypeClass","typeField","value","disabled","getFilterObject","name","removeOrReplaceFilterRow","filterCount","replaceFilterRow","removeFilterRow","removeFilterObject","remove","updateTableFromFilter","getAvailableFilterLegends","filterLegends","index","innerText","rowNum","replaceNode","filterName","tearDown","removeAllFilters","filters","removeEmptyFilters","options","option","classList","add","addRowButton","actions","addRow","all","setAttribute","removeAttribute","filtermatch","join","setFilterFromConfig","config","filterConfig","Object","entries","jointype","filterPromises","map","filterData","Promise","resolve","filterValues","values","DynamicTable","setFilters","getTableFromId","tableRegion","filterValue","maxFilters","typeListSelect","requests","Array","_","rowIndex","push","fetchedStrings","legendStrings","addEventListener","e","target","closest","preventDefault","applyFilters","resetFilters","filterverb","tableRoot","initialFilters","getFilters"],"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 * Participants filter managemnet.\n *\n * @module core_user/participants_filter\n * @package core_user\n * @copyright 2020 Andrew Nicols <andrew@nicols.co.uk>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport CourseFilter from './local/participantsfilter/filtertypes/courseid';\nimport * as DynamicTable from 'core_table/dynamic';\nimport GenericFilter from './local/participantsfilter/filter';\nimport {get_strings as getStrings} from 'core/str';\nimport Notification from 'core/notification';\nimport Selectors from './local/participantsfilter/selectors';\nimport Templates from 'core/templates';\n\n/**\n * Initialise the participants filter on the element with the given id.\n *\n * @param {String} participantsRegionId\n */\nexport const init = participantsRegionId => {\n // Keep a reference to the filterset.\n const filterSet = document.querySelector(`#${participantsRegionId}`);\n\n // Keep a reference to all of the active filters.\n const activeFilters = {\n courseid: new CourseFilter('courseid', filterSet),\n };\n\n /**\n * Get the filter list region.\n *\n * @return {HTMLElement}\n */\n const getFilterRegion = () => filterSet.querySelector(Selectors.filterset.regions.filterlist);\n\n /**\n * Add an unselected filter row.\n *\n * @return {Promise}\n */\n const addFilterRow = () => {\n const rownum = 1 + getFilterRegion().querySelectorAll(Selectors.filter.region).length;\n return Templates.renderForPromise('core_user/local/participantsfilter/filterrow', {\"rownumber\": rownum})\n .then(({html, js}) => {\n const newContentNodes = Templates.appendNodeContents(getFilterRegion(), html, js);\n\n return newContentNodes;\n })\n .then(filterRow => {\n // Note: This is a nasty hack.\n // We should try to find a better way of doing this.\n // We do not have the list of types in a readily consumable format, so we take the pre-rendered one and copy\n // it in place.\n const typeList = filterSet.querySelector(Selectors.data.typeList);\n\n filterRow.forEach(contentNode => {\n const contentTypeList = contentNode.querySelector(Selectors.filter.fields.type);\n\n if (contentTypeList) {\n contentTypeList.innerHTML = typeList.innerHTML;\n }\n });\n\n return filterRow;\n })\n .then(filterRow => {\n updateFiltersOptions();\n\n return filterRow;\n })\n .catch(Notification.exception);\n };\n\n /**\n * Get the filter data source node fro the specified filter type.\n *\n * @param {String} filterType\n * @return {HTMLElement}\n */\n const getFilterDataSource = filterType => {\n const filterDataNode = filterSet.querySelector(Selectors.filterset.regions.datasource);\n\n return filterDataNode.querySelector(Selectors.data.fields.byName(filterType));\n };\n\n /**\n * Add a filter to the list of active filters, performing any necessary setup.\n *\n * @param {HTMLElement} filterRow\n * @param {String} filterType\n * @param {Array} initialFilterValues The initially selected values for the filter\n * @returns {Filter}\n */\n const addFilter = async(filterRow, filterType, initialFilterValues) => {\n // Name the filter on the filter row.\n filterRow.dataset.filterType = filterType;\n\n const filterDataNode = getFilterDataSource(filterType);\n\n // Instantiate the Filter class.\n let Filter = GenericFilter;\n if (filterDataNode.dataset.filterTypeClass) {\n Filter = await import(filterDataNode.dataset.filterTypeClass);\n }\n activeFilters[filterType] = new Filter(filterType, filterSet, initialFilterValues);\n\n // Disable the select.\n const typeField = filterRow.querySelector(Selectors.filter.fields.type);\n typeField.value = filterType;\n typeField.disabled = 'disabled';\n\n // Update the list of available filter types.\n updateFiltersOptions();\n\n return activeFilters[filterType];\n };\n\n /**\n * Get the registered filter class for the named filter.\n *\n * @param {String} name\n * @return {Object} See the Filter class.\n */\n const getFilterObject = name => {\n return activeFilters[name];\n };\n\n /**\n * Remove or replace the specified filter row and associated class, ensuring that if there is only one filter row,\n * that it is replaced instead of being removed.\n *\n * @param {HTMLElement} filterRow\n */\n const removeOrReplaceFilterRow = filterRow => {\n const filterCount = getFilterRegion().querySelectorAll(Selectors.filter.region).length;\n\n if (filterCount === 1) {\n replaceFilterRow(filterRow);\n } else {\n removeFilterRow(filterRow);\n }\n };\n\n /**\n * Remove the specified filter row and associated class.\n *\n * @param {HTMLElement} filterRow\n */\n const removeFilterRow = async filterRow => {\n // Remove the filter object.\n removeFilterObject(filterRow.dataset.filterType);\n\n // Remove the actual filter HTML.\n filterRow.remove();\n\n // Update the list of available filter types.\n updateFiltersOptions();\n\n // Refresh the table.\n updateTableFromFilter();\n\n // Update filter fieldset legends.\n const filterLegends = await getAvailableFilterLegends();\n\n getFilterRegion().querySelectorAll(Selectors.filter.region).forEach((filterRow, index) => {\n filterRow.querySelector('legend').innerText = filterLegends[index];\n });\n\n };\n\n /**\n * Replace the specified filter row with a new one.\n *\n * @param {HTMLElement} filterRow\n * @param {Number} rowNum The number used to label the filter fieldset legend (eg Row 1). Defaults to 1 (the first filter).\n * @return {Promise}\n */\n const replaceFilterRow = (filterRow, rowNum = 1) => {\n // Remove the filter object.\n removeFilterObject(filterRow.dataset.filterType);\n\n return Templates.renderForPromise('core_user/local/participantsfilter/filterrow', {\"rownumber\": rowNum})\n .then(({html, js}) => {\n const newContentNodes = Templates.replaceNode(filterRow, html, js);\n\n return newContentNodes;\n })\n .then(filterRow => {\n // Note: This is a nasty hack.\n // We should try to find a better way of doing this.\n // We do not have the list of types in a readily consumable format, so we take the pre-rendered one and copy\n // it in place.\n const typeList = filterSet.querySelector(Selectors.data.typeList);\n\n filterRow.forEach(contentNode => {\n const contentTypeList = contentNode.querySelector(Selectors.filter.fields.type);\n\n if (contentTypeList) {\n contentTypeList.innerHTML = typeList.innerHTML;\n }\n });\n\n return filterRow;\n })\n .then(filterRow => {\n updateFiltersOptions();\n\n return filterRow;\n })\n .then(filterRow => {\n // Refresh the table.\n updateTableFromFilter();\n\n return filterRow;\n })\n .catch(Notification.exception);\n };\n\n /**\n * Remove the Filter Object from the register.\n *\n * @param {string} filterName The name of the filter to be removed\n */\n const removeFilterObject = filterName => {\n if (filterName) {\n const filter = getFilterObject(filterName);\n if (filter) {\n filter.tearDown();\n\n // Remove from the list of active filters.\n delete activeFilters[filterName];\n }\n }\n };\n\n /**\n * Remove all filters.\n *\n * @returns {Promise}\n */\n const removeAllFilters = () => {\n const filters = getFilterRegion().querySelectorAll(Selectors.filter.region);\n filters.forEach(filterRow => removeOrReplaceFilterRow(filterRow));\n\n // Refresh the table.\n return updateTableFromFilter();\n };\n\n /**\n * Remove any empty filters.\n */\n const removeEmptyFilters = () => {\n const filters = getFilterRegion().querySelectorAll(Selectors.filter.region);\n filters.forEach(filterRow => {\n const filterType = filterRow.querySelector(Selectors.filter.fields.type);\n if (!filterType.value) {\n removeOrReplaceFilterRow(filterRow);\n }\n });\n };\n\n /**\n * Update the list of filter types to filter out those already selected.\n */\n const updateFiltersOptions = () => {\n const filters = getFilterRegion().querySelectorAll(Selectors.filter.region);\n filters.forEach(filterRow => {\n const options = filterRow.querySelectorAll(Selectors.filter.fields.type + ' option');\n options.forEach(option => {\n if (option.value === filterRow.dataset.filterType) {\n option.classList.remove('hidden');\n option.disabled = false;\n } else if (activeFilters[option.value]) {\n option.classList.add('hidden');\n option.disabled = true;\n } else {\n option.classList.remove('hidden');\n option.disabled = false;\n }\n });\n });\n\n // Configure the state of the \"Add row\" button.\n // This button is disabled when there is a filter row available for each condition.\n const addRowButton = filterSet.querySelector(Selectors.filterset.actions.addRow);\n const filterDataNode = filterSet.querySelectorAll(Selectors.data.fields.all);\n if (filterDataNode.length <= filters.length) {\n addRowButton.setAttribute('disabled', 'disabled');\n } else {\n addRowButton.removeAttribute('disabled');\n }\n\n if (filters.length === 1) {\n filterSet.querySelector(Selectors.filterset.regions.filtermatch).classList.add('hidden');\n filterSet.querySelector(Selectors.filterset.fields.join).value = 1;\n } else {\n filterSet.querySelector(Selectors.filterset.regions.filtermatch).classList.remove('hidden');\n }\n };\n\n /**\n * Set the current filter options based on a provided configuration.\n *\n * @param {Object} config\n * @param {Number} config.jointype\n * @param {Object} config.filters\n */\n const setFilterFromConfig = config => {\n const filterConfig = Object.entries(config.filters);\n\n if (!filterConfig.length) {\n // There are no filters to set from.\n return;\n }\n\n // Set the main join type.\n filterSet.querySelector(Selectors.filterset.fields.join).value = config.jointype;\n\n const filterPromises = filterConfig.map(([filterType, filterData]) => {\n if (filterType === 'courseid') {\n // The courseid is a special case.\n return Promise.resolve();\n }\n\n const filterValues = filterData.values;\n\n if (!filterValues.length) {\n // There are no values for this filter.\n // Skip it.\n return Promise.resolve();\n }\n\n return addFilterRow().then(([filterRow]) => addFilter(filterRow, filterType, filterValues));\n });\n\n Promise.all(filterPromises).then(() => {\n return removeEmptyFilters();\n })\n .then(updateFiltersOptions)\n .then(updateTableFromFilter)\n .catch();\n };\n\n /**\n * Update the Dynamic table based upon the current filter.\n *\n * @return {Promise}\n */\n const updateTableFromFilter = () => {\n return DynamicTable.setFilters(\n DynamicTable.getTableFromId(filterSet.dataset.tableRegion),\n {\n filters: Object.values(activeFilters).map(filter => filter.filterValue),\n jointype: filterSet.querySelector(Selectors.filterset.fields.join).value,\n }\n )\n .catch(Notification.exception);\n };\n\n /**\n * Fetch the strings used to populate the fieldset legends for the maximum number of filters possible.\n *\n * @return {array}\n */\n const getAvailableFilterLegends = async() => {\n const maxFilters = document.querySelector(Selectors.data.typeListSelect).length - 1;\n let requests = [];\n\n [...Array(maxFilters)].forEach((_, rowIndex) => {\n requests.push({\n \"key\": \"filterrowlegend\",\n \"component\": \"core_user\",\n // Add 1 since rows begin at 1 (index begins at zero).\n \"param\": rowIndex + 1\n });\n });\n\n const legendStrings = await getStrings(requests)\n .then(fetchedStrings => {\n return fetchedStrings;\n })\n .catch(Notification.exception);\n\n return legendStrings;\n };\n\n // Add listeners for the main actions.\n filterSet.querySelector(Selectors.filterset.region).addEventListener('click', e => {\n if (e.target.closest(Selectors.filterset.actions.addRow)) {\n e.preventDefault();\n\n addFilterRow();\n }\n\n if (e.target.closest(Selectors.filterset.actions.applyFilters)) {\n e.preventDefault();\n\n updateTableFromFilter();\n }\n\n if (e.target.closest(Selectors.filterset.actions.resetFilters)) {\n e.preventDefault();\n\n removeAllFilters();\n }\n });\n\n // Add the listener to remove a single filter.\n filterSet.querySelector(Selectors.filterset.regions.filterlist).addEventListener('click', e => {\n if (e.target.closest(Selectors.filter.actions.remove)) {\n e.preventDefault();\n\n removeOrReplaceFilterRow(e.target.closest(Selectors.filter.region));\n }\n });\n\n // Add listeners for the filter type selection.\n filterSet.querySelector(Selectors.filterset.regions.filterlist).addEventListener('change', e => {\n const typeField = e.target.closest(Selectors.filter.fields.type);\n if (typeField && typeField.value) {\n const filter = e.target.closest(Selectors.filter.region);\n\n addFilter(filter, typeField.value);\n }\n });\n\n filterSet.querySelector(Selectors.filterset.fields.join).addEventListener('change', e => {\n filterSet.dataset.filterverb = e.target.value;\n });\n\n const tableRoot = DynamicTable.getTableFromId(filterSet.dataset.tableRegion);\n const initialFilters = DynamicTable.getFilters(tableRoot);\n if (initialFilters) {\n // Apply the initial filter configuration.\n setFilterFromConfig(initialFilters);\n }\n};\n"],"file":"participantsfilter.min.js"} \ No newline at end of file +{"version":3,"sources":["../src/participantsfilter.js"],"names":["init","participantsRegionId","filterSet","document","querySelector","activeFilters","courseid","CourseFilter","getFilterRegion","Selectors","filterset","regions","filterlist","addFilterRow","rownum","querySelectorAll","filter","region","length","Templates","renderForPromise","then","html","js","newContentNodes","appendNodeContents","filterRow","typeList","data","forEach","contentNode","contentTypeList","fields","type","innerHTML","updateFiltersOptions","catch","Notification","exception","getFilterDataSource","filterType","filterDataNode","datasource","byName","addFilter","initialFilterValues","dataset","Filter","GenericFilter","filterTypeClass","typeField","value","disabled","getFilterObject","name","removeOrReplaceFilterRow","filterCount","replaceFilterRow","removeFilterRow","removeFilterObject","remove","updateTableFromFilter","getAvailableFilterLegends","filterLegends","index","innerText","rowNum","replaceNode","filterName","tearDown","removeAllFilters","filters","removeEmptyFilters","options","option","classList","add","addRowButton","actions","addRow","all","setAttribute","removeAttribute","filtermatch","join","setFilterFromConfig","config","filterConfig","Object","entries","jointype","filterPromises","map","filterData","Promise","resolve","filterValues","values","filterValue","DynamicTable","setFilters","getTableFromId","tableRegion","parseInt","maxFilters","typeListSelect","requests","Array","_","rowIndex","push","fetchedStrings","legendStrings","addEventListener","e","target","closest","preventDefault","applyFilters","resetFilters","filterverb","tableRoot","initialFilters","getFilters"],"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 * Participants filter managemnet.\n *\n * @module core_user/participants_filter\n * @package core_user\n * @copyright 2020 Andrew Nicols <andrew@nicols.co.uk>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport CourseFilter from './local/participantsfilter/filtertypes/courseid';\nimport * as DynamicTable from 'core_table/dynamic';\nimport GenericFilter from './local/participantsfilter/filter';\nimport {get_strings as getStrings} from 'core/str';\nimport Notification from 'core/notification';\nimport Selectors from './local/participantsfilter/selectors';\nimport Templates from 'core/templates';\n\n/**\n * Initialise the participants filter on the element with the given id.\n *\n * @param {String} participantsRegionId\n */\nexport const init = participantsRegionId => {\n // Keep a reference to the filterset.\n const filterSet = document.querySelector(`#${participantsRegionId}`);\n\n // Keep a reference to all of the active filters.\n const activeFilters = {\n courseid: new CourseFilter('courseid', filterSet),\n };\n\n /**\n * Get the filter list region.\n *\n * @return {HTMLElement}\n */\n const getFilterRegion = () => filterSet.querySelector(Selectors.filterset.regions.filterlist);\n\n /**\n * Add an unselected filter row.\n *\n * @return {Promise}\n */\n const addFilterRow = () => {\n const rownum = 1 + getFilterRegion().querySelectorAll(Selectors.filter.region).length;\n return Templates.renderForPromise('core_user/local/participantsfilter/filterrow', {\"rownumber\": rownum})\n .then(({html, js}) => {\n const newContentNodes = Templates.appendNodeContents(getFilterRegion(), html, js);\n\n return newContentNodes;\n })\n .then(filterRow => {\n // Note: This is a nasty hack.\n // We should try to find a better way of doing this.\n // We do not have the list of types in a readily consumable format, so we take the pre-rendered one and copy\n // it in place.\n const typeList = filterSet.querySelector(Selectors.data.typeList);\n\n filterRow.forEach(contentNode => {\n const contentTypeList = contentNode.querySelector(Selectors.filter.fields.type);\n\n if (contentTypeList) {\n contentTypeList.innerHTML = typeList.innerHTML;\n }\n });\n\n return filterRow;\n })\n .then(filterRow => {\n updateFiltersOptions();\n\n return filterRow;\n })\n .catch(Notification.exception);\n };\n\n /**\n * Get the filter data source node fro the specified filter type.\n *\n * @param {String} filterType\n * @return {HTMLElement}\n */\n const getFilterDataSource = filterType => {\n const filterDataNode = filterSet.querySelector(Selectors.filterset.regions.datasource);\n\n return filterDataNode.querySelector(Selectors.data.fields.byName(filterType));\n };\n\n /**\n * Add a filter to the list of active filters, performing any necessary setup.\n *\n * @param {HTMLElement} filterRow\n * @param {String} filterType\n * @param {Array} initialFilterValues The initially selected values for the filter\n * @returns {Filter}\n */\n const addFilter = async(filterRow, filterType, initialFilterValues) => {\n // Name the filter on the filter row.\n filterRow.dataset.filterType = filterType;\n\n const filterDataNode = getFilterDataSource(filterType);\n\n // Instantiate the Filter class.\n let Filter = GenericFilter;\n if (filterDataNode.dataset.filterTypeClass) {\n Filter = await import(filterDataNode.dataset.filterTypeClass);\n }\n activeFilters[filterType] = new Filter(filterType, filterSet, initialFilterValues);\n\n // Disable the select.\n const typeField = filterRow.querySelector(Selectors.filter.fields.type);\n typeField.value = filterType;\n typeField.disabled = 'disabled';\n\n // Update the list of available filter types.\n updateFiltersOptions();\n\n return activeFilters[filterType];\n };\n\n /**\n * Get the registered filter class for the named filter.\n *\n * @param {String} name\n * @return {Object} See the Filter class.\n */\n const getFilterObject = name => {\n return activeFilters[name];\n };\n\n /**\n * Remove or replace the specified filter row and associated class, ensuring that if there is only one filter row,\n * that it is replaced instead of being removed.\n *\n * @param {HTMLElement} filterRow\n */\n const removeOrReplaceFilterRow = filterRow => {\n const filterCount = getFilterRegion().querySelectorAll(Selectors.filter.region).length;\n\n if (filterCount === 1) {\n replaceFilterRow(filterRow);\n } else {\n removeFilterRow(filterRow);\n }\n };\n\n /**\n * Remove the specified filter row and associated class.\n *\n * @param {HTMLElement} filterRow\n */\n const removeFilterRow = async filterRow => {\n // Remove the filter object.\n removeFilterObject(filterRow.dataset.filterType);\n\n // Remove the actual filter HTML.\n filterRow.remove();\n\n // Update the list of available filter types.\n updateFiltersOptions();\n\n // Refresh the table.\n updateTableFromFilter();\n\n // Update filter fieldset legends.\n const filterLegends = await getAvailableFilterLegends();\n\n getFilterRegion().querySelectorAll(Selectors.filter.region).forEach((filterRow, index) => {\n filterRow.querySelector('legend').innerText = filterLegends[index];\n });\n\n };\n\n /**\n * Replace the specified filter row with a new one.\n *\n * @param {HTMLElement} filterRow\n * @param {Number} rowNum The number used to label the filter fieldset legend (eg Row 1). Defaults to 1 (the first filter).\n * @return {Promise}\n */\n const replaceFilterRow = (filterRow, rowNum = 1) => {\n // Remove the filter object.\n removeFilterObject(filterRow.dataset.filterType);\n\n return Templates.renderForPromise('core_user/local/participantsfilter/filterrow', {\"rownumber\": rowNum})\n .then(({html, js}) => {\n const newContentNodes = Templates.replaceNode(filterRow, html, js);\n\n return newContentNodes;\n })\n .then(filterRow => {\n // Note: This is a nasty hack.\n // We should try to find a better way of doing this.\n // We do not have the list of types in a readily consumable format, so we take the pre-rendered one and copy\n // it in place.\n const typeList = filterSet.querySelector(Selectors.data.typeList);\n\n filterRow.forEach(contentNode => {\n const contentTypeList = contentNode.querySelector(Selectors.filter.fields.type);\n\n if (contentTypeList) {\n contentTypeList.innerHTML = typeList.innerHTML;\n }\n });\n\n return filterRow;\n })\n .then(filterRow => {\n updateFiltersOptions();\n\n return filterRow;\n })\n .then(filterRow => {\n // Refresh the table.\n updateTableFromFilter();\n\n return filterRow;\n })\n .catch(Notification.exception);\n };\n\n /**\n * Remove the Filter Object from the register.\n *\n * @param {string} filterName The name of the filter to be removed\n */\n const removeFilterObject = filterName => {\n if (filterName) {\n const filter = getFilterObject(filterName);\n if (filter) {\n filter.tearDown();\n\n // Remove from the list of active filters.\n delete activeFilters[filterName];\n }\n }\n };\n\n /**\n * Remove all filters.\n *\n * @returns {Promise}\n */\n const removeAllFilters = () => {\n const filters = getFilterRegion().querySelectorAll(Selectors.filter.region);\n filters.forEach(filterRow => removeOrReplaceFilterRow(filterRow));\n\n // Refresh the table.\n return updateTableFromFilter();\n };\n\n /**\n * Remove any empty filters.\n */\n const removeEmptyFilters = () => {\n const filters = getFilterRegion().querySelectorAll(Selectors.filter.region);\n filters.forEach(filterRow => {\n const filterType = filterRow.querySelector(Selectors.filter.fields.type);\n if (!filterType.value) {\n removeOrReplaceFilterRow(filterRow);\n }\n });\n };\n\n /**\n * Update the list of filter types to filter out those already selected.\n */\n const updateFiltersOptions = () => {\n const filters = getFilterRegion().querySelectorAll(Selectors.filter.region);\n filters.forEach(filterRow => {\n const options = filterRow.querySelectorAll(Selectors.filter.fields.type + ' option');\n options.forEach(option => {\n if (option.value === filterRow.dataset.filterType) {\n option.classList.remove('hidden');\n option.disabled = false;\n } else if (activeFilters[option.value]) {\n option.classList.add('hidden');\n option.disabled = true;\n } else {\n option.classList.remove('hidden');\n option.disabled = false;\n }\n });\n });\n\n // Configure the state of the \"Add row\" button.\n // This button is disabled when there is a filter row available for each condition.\n const addRowButton = filterSet.querySelector(Selectors.filterset.actions.addRow);\n const filterDataNode = filterSet.querySelectorAll(Selectors.data.fields.all);\n if (filterDataNode.length <= filters.length) {\n addRowButton.setAttribute('disabled', 'disabled');\n } else {\n addRowButton.removeAttribute('disabled');\n }\n\n if (filters.length === 1) {\n filterSet.querySelector(Selectors.filterset.regions.filtermatch).classList.add('hidden');\n filterSet.querySelector(Selectors.filterset.fields.join).value = 1;\n } else {\n filterSet.querySelector(Selectors.filterset.regions.filtermatch).classList.remove('hidden');\n }\n };\n\n /**\n * Set the current filter options based on a provided configuration.\n *\n * @param {Object} config\n * @param {Number} config.jointype\n * @param {Object} config.filters\n */\n const setFilterFromConfig = config => {\n const filterConfig = Object.entries(config.filters);\n\n if (!filterConfig.length) {\n // There are no filters to set from.\n return;\n }\n\n // Set the main join type.\n filterSet.querySelector(Selectors.filterset.fields.join).value = config.jointype;\n\n const filterPromises = filterConfig.map(([filterType, filterData]) => {\n if (filterType === 'courseid') {\n // The courseid is a special case.\n return Promise.resolve();\n }\n\n const filterValues = filterData.values;\n\n if (!filterValues.length) {\n // There are no values for this filter.\n // Skip it.\n return Promise.resolve();\n }\n\n return addFilterRow().then(([filterRow]) => addFilter(filterRow, filterType, filterValues));\n });\n\n Promise.all(filterPromises).then(() => {\n return removeEmptyFilters();\n })\n .then(updateFiltersOptions)\n .then(updateTableFromFilter)\n .catch();\n };\n\n /**\n * Update the Dynamic table based upon the current filter.\n *\n * @return {Promise}\n */\n const updateTableFromFilter = () => {\n const filters = {};\n Object.values(activeFilters).forEach(filter => {\n filters[filter.filterValue.name] = filter.filterValue;\n });\n\n return DynamicTable.setFilters(\n DynamicTable.getTableFromId(filterSet.dataset.tableRegion),\n {\n jointype: parseInt(filterSet.querySelector(Selectors.filterset.fields.join).value, 10),\n filters,\n }\n )\n .catch(Notification.exception);\n };\n\n /**\n * Fetch the strings used to populate the fieldset legends for the maximum number of filters possible.\n *\n * @return {array}\n */\n const getAvailableFilterLegends = async() => {\n const maxFilters = document.querySelector(Selectors.data.typeListSelect).length - 1;\n let requests = [];\n\n [...Array(maxFilters)].forEach((_, rowIndex) => {\n requests.push({\n \"key\": \"filterrowlegend\",\n \"component\": \"core_user\",\n // Add 1 since rows begin at 1 (index begins at zero).\n \"param\": rowIndex + 1\n });\n });\n\n const legendStrings = await getStrings(requests)\n .then(fetchedStrings => {\n return fetchedStrings;\n })\n .catch(Notification.exception);\n\n return legendStrings;\n };\n\n // Add listeners for the main actions.\n filterSet.querySelector(Selectors.filterset.region).addEventListener('click', e => {\n if (e.target.closest(Selectors.filterset.actions.addRow)) {\n e.preventDefault();\n\n addFilterRow();\n }\n\n if (e.target.closest(Selectors.filterset.actions.applyFilters)) {\n e.preventDefault();\n\n updateTableFromFilter();\n }\n\n if (e.target.closest(Selectors.filterset.actions.resetFilters)) {\n e.preventDefault();\n\n removeAllFilters();\n }\n });\n\n // Add the listener to remove a single filter.\n filterSet.querySelector(Selectors.filterset.regions.filterlist).addEventListener('click', e => {\n if (e.target.closest(Selectors.filter.actions.remove)) {\n e.preventDefault();\n\n removeOrReplaceFilterRow(e.target.closest(Selectors.filter.region));\n }\n });\n\n // Add listeners for the filter type selection.\n filterSet.querySelector(Selectors.filterset.regions.filterlist).addEventListener('change', e => {\n const typeField = e.target.closest(Selectors.filter.fields.type);\n if (typeField && typeField.value) {\n const filter = e.target.closest(Selectors.filter.region);\n\n addFilter(filter, typeField.value);\n }\n });\n\n filterSet.querySelector(Selectors.filterset.fields.join).addEventListener('change', e => {\n filterSet.dataset.filterverb = e.target.value;\n });\n\n const tableRoot = DynamicTable.getTableFromId(filterSet.dataset.tableRegion);\n const initialFilters = DynamicTable.getFilters(tableRoot);\n if (initialFilters) {\n // Apply the initial filter configuration.\n setFilterFromConfig(initialFilters);\n }\n};\n"],"file":"participantsfilter.min.js"} \ No newline at end of file diff --git a/user/amd/src/local/participantsfilter/filter.js b/user/amd/src/local/participantsfilter/filter.js index 6670c2efe20..445dd3a3125 100644 --- a/user/amd/src/local/participantsfilter/filter.js +++ b/user/amd/src/local/participantsfilter/filter.js @@ -184,7 +184,7 @@ export default class { * @returns {Number} */ get jointype() { - return this.filterRoot.querySelector(Selectors.filter.fields.join).value; + return parseInt(this.filterRoot.querySelector(Selectors.filter.fields.join).value, 10); } /** diff --git a/user/amd/src/participantsfilter.js b/user/amd/src/participantsfilter.js index 4e31a1590f9..38087537b78 100644 --- a/user/amd/src/participantsfilter.js +++ b/user/amd/src/participantsfilter.js @@ -365,11 +365,16 @@ export const init = participantsRegionId => { * @return {Promise} */ const updateTableFromFilter = () => { + const filters = {}; + Object.values(activeFilters).forEach(filter => { + filters[filter.filterValue.name] = filter.filterValue; + }); + return DynamicTable.setFilters( DynamicTable.getTableFromId(filterSet.dataset.tableRegion), { - filters: Object.values(activeFilters).map(filter => filter.filterValue), - jointype: filterSet.querySelector(Selectors.filterset.fields.join).value, + jointype: parseInt(filterSet.querySelector(Selectors.filterset.fields.join).value, 10), + filters, } ) .catch(Notification.exception);