From c43808efffc93204f491dc6e6efb064aad03ecbf Mon Sep 17 00:00:00 2001 From: Huong Nguyen Date: Mon, 24 Mar 2025 16:34:30 +0700 Subject: [PATCH] MDL-74149 Usertours: Fix Behat failure --- admin/tool/usertours/amd/build/tour_filters.min.js | 2 +- admin/tool/usertours/amd/build/tour_filters.min.js.map | 2 +- admin/tool/usertours/amd/src/tour_filters.js | 9 +++++++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/admin/tool/usertours/amd/build/tour_filters.min.js b/admin/tool/usertours/amd/build/tour_filters.min.js index 3128d994aec..b23ca11edf8 100644 --- a/admin/tool/usertours/amd/build/tour_filters.min.js +++ b/admin/tool/usertours/amd/build/tour_filters.min.js @@ -1,3 +1,3 @@ -define("tool_usertours/tour_filters",["exports"],(function(_exports){Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0;_exports.init=()=>{initConfigurationCategoryFilter()};const initConfigurationCategoryFilter=()=>{const categorySelect=document.querySelector("[name='filter_category[]']"),excludeSelect=document.querySelector("[name='filter_exclude_category[]']"),excludeCategoriesContainer=document.getElementById("fitem_id_filter_exclude_category");categorySelect&&excludeSelect&&(categorySelect.addEventListener("change",(()=>{updateExcludeCategories(categorySelect,excludeSelect,excludeCategoriesContainer)})),updateExcludeCategories(categorySelect,excludeSelect,excludeCategoriesContainer))},updateExcludeCategories=(categorySelect,excludeSelect,excludeCategoriesContainer)=>{const selectedCategories=new Set(Array.from(categorySelect.selectedOptions).map((option=>option.value))),excludeSelected=new Set(Array.from(excludeSelect.selectedOptions).map((option=>option.value))),excludeOptions=new Map,anySelected=selectedCategories.has("__ANYVALUE__");var select;Array.from(categorySelect.options).forEach((option=>{const isNotAny="__ANYVALUE__"!==option.value;if(anySelected&&isNotAny)excludeOptions.set(option.value,option.text);else if(isNotAny)for(const selected of selectedCategories){const selectedOption=categorySelect.querySelector('option[value="'.concat(selected,'"]'));if(option.text.startsWith("".concat(selectedOption.text," / "))){excludeOptions.set(option.value,option.text);break}}})),excludeOptions.size?(excludeSelect.innerHTML="",Array.from(excludeOptions).sort(((_ref,_ref2)=>{let[,a]=_ref,[,b]=_ref2;return a.localeCompare(b)})).forEach((_ref3=>{let[key,value]=_ref3;const option=document.createElement("option");option.value=key,option.text=value,excludeSelected.has(key)&&(option.selected=!0),excludeSelect.appendChild(option)})),(select=excludeSelect).size=Math.min(select.options.length||1,10),excludeCategoriesContainer.classList.toggle("d-none",!1)):(excludeCategoriesContainer.classList.toggle("d-none"),excludeSelect.innerHTML="")}})); +define("tool_usertours/tour_filters",["exports"],(function(_exports){Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0;_exports.init=()=>{initConfigurationCategoryFilter()};const initConfigurationCategoryFilter=()=>{const categorySelect=document.querySelector("[name='filter_category[]']"),excludeSelect=document.querySelector("[name='filter_exclude_category[]']"),excludeCategoriesContainer=document.getElementById("fitem_id_filter_exclude_category");categorySelect&&excludeSelect&&(categorySelect.addEventListener("change",(()=>{updateExcludeCategories(categorySelect,excludeSelect,excludeCategoriesContainer)})),updateExcludeCategories(categorySelect,excludeSelect,excludeCategoriesContainer))},updateExcludeCategories=(categorySelect,excludeSelect,excludeCategoriesContainer)=>{const selectedCategories=new Set(Array.from(categorySelect.selectedOptions).map((option=>option.value))),excludeSelected=new Set(Array.from(excludeSelect.selectedOptions).map((option=>option.value))),excludeOptions=new Map,anySelected=selectedCategories.has("__ANYVALUE__");var select;Array.from(categorySelect.options).forEach((option=>{const isNotAny="__ANYVALUE__"!==option.value;if(anySelected&&isNotAny)excludeOptions.set(option.value,option.text);else if(isNotAny)for(const selected of selectedCategories){const selectedOption=categorySelect.querySelector('option[value="'.concat(selected,'"]'));if(option.text.startsWith("".concat(selectedOption.text," / "))){excludeOptions.set(option.value,option.text);break}}})),excludeOptions.size?(excludeSelect.innerHTML="",Array.from(excludeOptions).sort(((_ref,_ref2)=>{let[,a]=_ref,[,b]=_ref2;return a.localeCompare(b)})).forEach((_ref3=>{let[key,value]=_ref3;const option=document.createElement("option");option.value=key,option.text=value,excludeSelected.has(key)&&(option.selected=!0),excludeSelect.appendChild(option)})),(select=excludeSelect).size=Math.min(select.options.length||1,10),excludeCategoriesContainer.classList.contains("d-none")&&excludeCategoriesContainer.classList.remove("d-none")):(excludeCategoriesContainer.classList.contains("d-none")||excludeCategoriesContainer.classList.add("d-none"),excludeSelect.innerHTML="")}})); //# sourceMappingURL=tour_filters.min.js.map \ No newline at end of file diff --git a/admin/tool/usertours/amd/build/tour_filters.min.js.map b/admin/tool/usertours/amd/build/tour_filters.min.js.map index a513229972a..de893b2db31 100644 --- a/admin/tool/usertours/amd/build/tour_filters.min.js.map +++ b/admin/tool/usertours/amd/build/tour_filters.min.js.map @@ -1 +1 @@ -{"version":3,"file":"tour_filters.min.js","sources":["../src/tour_filters.js"],"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 * User tours filters.\n *\n * @module tool_usertours/tour_filters\n * @copyright 2025 The Open University\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nconst ANY_VALUE = \"__ANYVALUE__\";\n\nexport const init = () => {\n // Initialize the category filter\n initConfigurationCategoryFilter();\n};\n\n/**\n * Initialize the category filter for the configuration page.\n */\nconst initConfigurationCategoryFilter = () => {\n const categorySelect = document.querySelector(\"[name='filter_category[]']\");\n const excludeSelect = document.querySelector(\"[name='filter_exclude_category[]']\");\n const excludeCategoriesContainer = document.getElementById('fitem_id_filter_exclude_category');\n\n if (categorySelect && excludeSelect) {\n // Add event listeners to update the exclude categories when the include categories change.\n categorySelect.addEventListener(\"change\", () => {\n updateExcludeCategories(categorySelect, excludeSelect, excludeCategoriesContainer);\n });\n\n // Initialize the exclude categories based on the selected include categories.\n updateExcludeCategories(categorySelect, excludeSelect, excludeCategoriesContainer);\n }\n};\n\n/**\n * Adjust the height of a select element based on the number of options.\n *\n * @param {HTMLSelectElement} select\n */\nconst adjustHeight = (select) => {\n select.size = Math.min(select.options.length || 1, 10);\n};\n\n/**\n * Update the exclude categories based on the selected include categories.\n *\n * @param {HTMLSelectElement} categorySelect\n * @param {HTMLSelectElement} excludeSelect\n * @param {HTMLElement} excludeCategoriesContainer\n */\nconst updateExcludeCategories = (categorySelect, excludeSelect, excludeCategoriesContainer) => {\n // Get the selected categories and update the 'Any' option.\n const selectedCategories = new Set(Array.from(categorySelect.selectedOptions).map(option => option.value));\n\n // Get the selected exclude categories and create a map of options.\n const excludeSelected = new Set(Array.from(excludeSelect.selectedOptions).map(option => option.value));\n const excludeOptions = new Map();\n\n // Flag to check if 'Any' value is selected.\n const anySelected = selectedCategories.has(ANY_VALUE);\n Array.from(categorySelect.options).forEach(option => {\n const isNotAny = option.value !== ANY_VALUE;\n\n // If 'Any' is selected, include all options in excludeOptions.\n if (anySelected && isNotAny) {\n excludeOptions.set(option.value, option.text);\n } else if (isNotAny) {\n // Otherwise, check if the option is a child of any selected category.\n for (const selected of selectedCategories) {\n const selectedOption = categorySelect.querySelector(`option[value=\"${selected}\"]`);\n if (option.text.startsWith(`${selectedOption.text} / `)) {\n excludeOptions.set(option.value, option.text);\n break;\n }\n }\n }\n });\n if (excludeOptions.size) {\n // Update the exclude categories select element.\n excludeSelect.innerHTML = '';\n Array.from(excludeOptions)\n .sort(([, a], [, b]) => a.localeCompare(b))\n .forEach(([key, value]) => {\n const option = document.createElement(\"option\");\n option.value = key;\n option.text = value;\n if (excludeSelected.has(key)) {\n option.selected = true;\n }\n excludeSelect.appendChild(option);\n });\n\n // Adjust the height of the select elements.\n adjustHeight(excludeSelect);\n excludeCategoriesContainer.classList.toggle('d-none', false);\n } else {\n // Hide the exclude categories container when no child categories exist.\n excludeCategoriesContainer.classList.toggle('d-none');\n // Clear selections to prevent submitting excluded categories when container is hidden.\n excludeSelect.innerHTML = '';\n }\n\n};\n"],"names":["initConfigurationCategoryFilter","categorySelect","document","querySelector","excludeSelect","excludeCategoriesContainer","getElementById","addEventListener","updateExcludeCategories","selectedCategories","Set","Array","from","selectedOptions","map","option","value","excludeSelected","excludeOptions","Map","anySelected","has","select","options","forEach","isNotAny","set","text","selected","selectedOption","startsWith","size","innerHTML","sort","a","b","localeCompare","_ref3","key","createElement","appendChild","Math","min","length","classList","toggle"],"mappings":"gKAwBoB,KAEhBA,yCAMEA,gCAAkC,WAC9BC,eAAiBC,SAASC,cAAc,8BACxCC,cAAgBF,SAASC,cAAc,sCACvCE,2BAA6BH,SAASI,eAAe,oCAEvDL,gBAAkBG,gBAElBH,eAAeM,iBAAiB,UAAU,KACtCC,wBAAwBP,eAAgBG,cAAeC,+BAI3DG,wBAAwBP,eAAgBG,cAAeC,8BAoBzDG,wBAA0B,CAACP,eAAgBG,cAAeC,oCAEtDI,mBAAqB,IAAIC,IAAIC,MAAMC,KAAKX,eAAeY,iBAAiBC,KAAIC,QAAUA,OAAOC,SAG7FC,gBAAkB,IAAIP,IAAIC,MAAMC,KAAKR,cAAcS,iBAAiBC,KAAIC,QAAUA,OAAOC,SACzFE,eAAiB,IAAIC,IAGrBC,YAAcX,mBAAmBY,IAnDzB,gBA+BIC,IAAAA,OAqBlBX,MAAMC,KAAKX,eAAesB,SAASC,SAAQT,eACjCU,SArDI,iBAqDOV,OAAOC,SAGpBI,aAAeK,SACfP,eAAeQ,IAAIX,OAAOC,MAAOD,OAAOY,WACrC,GAAIF,aAEF,MAAMG,YAAYnB,mBAAoB,OACjCoB,eAAiB5B,eAAeE,sCAA+ByB,mBACjEb,OAAOY,KAAKG,qBAAcD,eAAeF,aAAY,CACrDT,eAAeQ,IAAIX,OAAOC,MAAOD,OAAOY,iBAMpDT,eAAea,MAEf3B,cAAc4B,UAAY,GAC1BrB,MAAMC,KAAKM,gBACNe,MAAK,oBAAIC,UAAOC,gBAAOD,EAAEE,cAAcD,MACvCX,SAAQa,YAAEC,IAAKtB,mBACND,OAASb,SAASqC,cAAc,UACtCxB,OAAOC,MAAQsB,IACfvB,OAAOY,KAAOX,MACVC,gBAAgBI,IAAIiB,OACpBvB,OAAOa,UAAW,GAEtBxB,cAAcoC,YAAYzB,YAlDpBO,OAsDDlB,eArDV2B,KAAOU,KAAKC,IAAIpB,OAAOC,QAAQoB,QAAU,EAAG,IAsD/CtC,2BAA2BuC,UAAUC,OAAO,UAAU,KAGtDxC,2BAA2BuC,UAAUC,OAAO,UAE5CzC,cAAc4B,UAAY"} \ No newline at end of file +{"version":3,"file":"tour_filters.min.js","sources":["../src/tour_filters.js"],"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 * User tours filters.\n *\n * @module tool_usertours/tour_filters\n * @copyright 2025 The Open University\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nconst ANY_VALUE = \"__ANYVALUE__\";\n\nexport const init = () => {\n // Initialize the category filter\n initConfigurationCategoryFilter();\n};\n\n/**\n * Initialize the category filter for the configuration page.\n */\nconst initConfigurationCategoryFilter = () => {\n const categorySelect = document.querySelector(\"[name='filter_category[]']\");\n const excludeSelect = document.querySelector(\"[name='filter_exclude_category[]']\");\n const excludeCategoriesContainer = document.getElementById('fitem_id_filter_exclude_category');\n\n if (categorySelect && excludeSelect) {\n // Add event listeners to update the exclude categories when the include categories change.\n categorySelect.addEventListener(\"change\", () => {\n updateExcludeCategories(categorySelect, excludeSelect, excludeCategoriesContainer);\n });\n\n // Initialize the exclude categories based on the selected include categories.\n updateExcludeCategories(categorySelect, excludeSelect, excludeCategoriesContainer);\n }\n};\n\n/**\n * Adjust the height of a select element based on the number of options.\n *\n * @param {HTMLSelectElement} select\n */\nconst adjustHeight = (select) => {\n select.size = Math.min(select.options.length || 1, 10);\n};\n\n/**\n * Update the exclude categories based on the selected include categories.\n *\n * @param {HTMLSelectElement} categorySelect\n * @param {HTMLSelectElement} excludeSelect\n * @param {HTMLElement} excludeCategoriesContainer\n */\nconst updateExcludeCategories = (categorySelect, excludeSelect, excludeCategoriesContainer) => {\n // Get the selected categories and update the 'Any' option.\n const selectedCategories = new Set(Array.from(categorySelect.selectedOptions).map(option => option.value));\n\n // Get the selected exclude categories and create a map of options.\n const excludeSelected = new Set(Array.from(excludeSelect.selectedOptions).map(option => option.value));\n const excludeOptions = new Map();\n\n // Flag to check if 'Any' value is selected.\n const anySelected = selectedCategories.has(ANY_VALUE);\n Array.from(categorySelect.options).forEach(option => {\n const isNotAny = option.value !== ANY_VALUE;\n\n // If 'Any' is selected, include all options in excludeOptions.\n if (anySelected && isNotAny) {\n excludeOptions.set(option.value, option.text);\n } else if (isNotAny) {\n // Otherwise, check if the option is a child of any selected category.\n for (const selected of selectedCategories) {\n const selectedOption = categorySelect.querySelector(`option[value=\"${selected}\"]`);\n if (option.text.startsWith(`${selectedOption.text} / `)) {\n excludeOptions.set(option.value, option.text);\n break;\n }\n }\n }\n });\n if (excludeOptions.size) {\n // Update the exclude categories select element.\n excludeSelect.innerHTML = '';\n Array.from(excludeOptions)\n .sort(([, a], [, b]) => a.localeCompare(b))\n .forEach(([key, value]) => {\n const option = document.createElement(\"option\");\n option.value = key;\n option.text = value;\n if (excludeSelected.has(key)) {\n option.selected = true;\n }\n excludeSelect.appendChild(option);\n });\n\n // Adjust the height of the select elements.\n adjustHeight(excludeSelect);\n // Show the exclude categories container if it was hidden.\n if (excludeCategoriesContainer.classList.contains('d-none')) {\n excludeCategoriesContainer.classList.remove('d-none');\n }\n } else {\n // Hide the exclude categories container when no child categories exist.\n if (!excludeCategoriesContainer.classList.contains('d-none')) {\n excludeCategoriesContainer.classList.add('d-none');\n }\n // Clear selections to prevent submitting excluded categories when container is hidden.\n excludeSelect.innerHTML = '';\n }\n\n};\n"],"names":["initConfigurationCategoryFilter","categorySelect","document","querySelector","excludeSelect","excludeCategoriesContainer","getElementById","addEventListener","updateExcludeCategories","selectedCategories","Set","Array","from","selectedOptions","map","option","value","excludeSelected","excludeOptions","Map","anySelected","has","select","options","forEach","isNotAny","set","text","selected","selectedOption","startsWith","size","innerHTML","sort","a","b","localeCompare","_ref3","key","createElement","appendChild","Math","min","length","classList","contains","remove","add"],"mappings":"gKAwBoB,KAEhBA,yCAMEA,gCAAkC,WAC9BC,eAAiBC,SAASC,cAAc,8BACxCC,cAAgBF,SAASC,cAAc,sCACvCE,2BAA6BH,SAASI,eAAe,oCAEvDL,gBAAkBG,gBAElBH,eAAeM,iBAAiB,UAAU,KACtCC,wBAAwBP,eAAgBG,cAAeC,+BAI3DG,wBAAwBP,eAAgBG,cAAeC,8BAoBzDG,wBAA0B,CAACP,eAAgBG,cAAeC,oCAEtDI,mBAAqB,IAAIC,IAAIC,MAAMC,KAAKX,eAAeY,iBAAiBC,KAAIC,QAAUA,OAAOC,SAG7FC,gBAAkB,IAAIP,IAAIC,MAAMC,KAAKR,cAAcS,iBAAiBC,KAAIC,QAAUA,OAAOC,SACzFE,eAAiB,IAAIC,IAGrBC,YAAcX,mBAAmBY,IAnDzB,gBA+BIC,IAAAA,OAqBlBX,MAAMC,KAAKX,eAAesB,SAASC,SAAQT,eACjCU,SArDI,iBAqDOV,OAAOC,SAGpBI,aAAeK,SACfP,eAAeQ,IAAIX,OAAOC,MAAOD,OAAOY,WACrC,GAAIF,aAEF,MAAMG,YAAYnB,mBAAoB,OACjCoB,eAAiB5B,eAAeE,sCAA+ByB,mBACjEb,OAAOY,KAAKG,qBAAcD,eAAeF,aAAY,CACrDT,eAAeQ,IAAIX,OAAOC,MAAOD,OAAOY,iBAMpDT,eAAea,MAEf3B,cAAc4B,UAAY,GAC1BrB,MAAMC,KAAKM,gBACNe,MAAK,oBAAIC,UAAOC,gBAAOD,EAAEE,cAAcD,MACvCX,SAAQa,YAAEC,IAAKtB,mBACND,OAASb,SAASqC,cAAc,UACtCxB,OAAOC,MAAQsB,IACfvB,OAAOY,KAAOX,MACVC,gBAAgBI,IAAIiB,OACpBvB,OAAOa,UAAW,GAEtBxB,cAAcoC,YAAYzB,YAlDpBO,OAsDDlB,eArDV2B,KAAOU,KAAKC,IAAIpB,OAAOC,QAAQoB,QAAU,EAAG,IAuD3CtC,2BAA2BuC,UAAUC,SAAS,WAC9CxC,2BAA2BuC,UAAUE,OAAO,YAI3CzC,2BAA2BuC,UAAUC,SAAS,WAC/CxC,2BAA2BuC,UAAUG,IAAI,UAG7C3C,cAAc4B,UAAY"} \ No newline at end of file diff --git a/admin/tool/usertours/amd/src/tour_filters.js b/admin/tool/usertours/amd/src/tour_filters.js index 5510d769cd2..100f674417a 100755 --- a/admin/tool/usertours/amd/src/tour_filters.js +++ b/admin/tool/usertours/amd/src/tour_filters.js @@ -106,10 +106,15 @@ const updateExcludeCategories = (categorySelect, excludeSelect, excludeCategorie // Adjust the height of the select elements. adjustHeight(excludeSelect); - excludeCategoriesContainer.classList.toggle('d-none', false); + // Show the exclude categories container if it was hidden. + if (excludeCategoriesContainer.classList.contains('d-none')) { + excludeCategoriesContainer.classList.remove('d-none'); + } } else { // Hide the exclude categories container when no child categories exist. - excludeCategoriesContainer.classList.toggle('d-none'); + if (!excludeCategoriesContainer.classList.contains('d-none')) { + excludeCategoriesContainer.classList.add('d-none'); + } // Clear selections to prevent submitting excluded categories when container is hidden. excludeSelect.innerHTML = ''; }