diff --git a/admin/tool/langimport/amd/build/search.min.js b/admin/tool/langimport/amd/build/search.min.js index d3313c3c3bd..dbce71ec70e 100644 --- a/admin/tool/langimport/amd/build/search.min.js +++ b/admin/tool/langimport/amd/build/search.min.js @@ -5,6 +5,6 @@ define("tool_langimport/search",["exports","core/pending","core/utils"],(functio * @module tool_langimport/search * @copyright 2021 Paul Holden * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.default=void 0,_pending=(obj=_pending)&&obj.__esModule?obj:{default:obj};const SELECTORS_AVAILABLE_LANG_SELECT="select",SELECTORS_AVAILABLE_LANG_SEARCH='[data-action="search"]';var _default={init:form=>{const availableLangsElement=form.querySelector(SELECTORS_AVAILABLE_LANG_SELECT),availableLangsFilter=event=>{const pendingPromise=new _pending.default("tool_langimport/search:filter");availableLangsElement.querySelectorAll("option").forEach((option=>{option.remove()}));const searchTerm=event.target.value.toLowerCase(),availableLanguages=JSON.parse(availableLangsElement.dataset.availableLanguages),filteredLanguages=Object.keys(availableLanguages).reduce(((matches,langcode)=>(availableLanguages[langcode].toLowerCase().includes(searchTerm)&&(matches[langcode]=availableLanguages[langcode]),matches)),[]);Object.entries(filteredLanguages).forEach((_ref=>{let[langcode,langname]=_ref;const option=document.createElement("option");option.value=langcode,option.innerText=langname,availableLangsElement.append(option)})),pendingPromise.resolve()},availableLanguages={};availableLangsElement.querySelectorAll("option").forEach((option=>{availableLanguages[option.value]=option.text})),availableLangsElement.dataset.availableLanguages=JSON.stringify(availableLanguages);const availableLangsSearch=form.querySelector(SELECTORS_AVAILABLE_LANG_SEARCH);availableLangsSearch.addEventListener("keydown",(event=>{"Enter"===event.key&&event.preventDefault()})),availableLangsSearch.addEventListener("keyup",(event=>{const pendingPromise=new _pending.default("tool_langimport/search:keyup");(0,_utils.debounce)(availableLangsFilter,250)(event),setTimeout((()=>{pendingPromise.resolve()}),250)}))}};return _exports.default=_default,_exports.default})); + */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_pending=(obj=_pending)&&obj.__esModule?obj:{default:obj};const SELECTORS_AVAILABLE_LANG_SELECT="select",SELECTORS_AVAILABLE_LANG_SEARCH='[data-action="search"]';_exports.init=form=>{const availableLangsElement=form.querySelector(SELECTORS_AVAILABLE_LANG_SELECT),availableLanguages={};availableLangsElement.querySelectorAll("option").forEach((option=>{availableLanguages[option.value]=option.text})),availableLangsElement.dataset.availableLanguages=JSON.stringify(availableLanguages);const availableLangsSearch=form.querySelector(SELECTORS_AVAILABLE_LANG_SEARCH);availableLangsSearch.addEventListener("keydown",(event=>{"Enter"===event.key&&event.preventDefault()}));const availableLangsSearchDebounce=(0,_utils.debounce)((event=>{const pendingPromise=new _pending.default("tool_langimport/search:filter");availableLangsElement.querySelectorAll("option").forEach((option=>{option.remove()}));const searchTerm=event.target.value.toLowerCase(),availableLanguages=JSON.parse(availableLangsElement.dataset.availableLanguages),filteredLanguages=Object.keys(availableLanguages).reduce(((matches,langcode)=>(availableLanguages[langcode].toLowerCase().includes(searchTerm)&&(matches[langcode]=availableLanguages[langcode]),matches)),[]);Object.entries(filteredLanguages).forEach((_ref=>{let[langcode,langname]=_ref;const option=document.createElement("option");option.value=langcode,option.innerText=langname,availableLangsElement.append(option)})),pendingPromise.resolve()}),250);availableLangsSearch.addEventListener("keyup",(event=>{const pendingPromise=new _pending.default("tool_langimport/search:keyup");availableLangsSearchDebounce(event),setTimeout((()=>{pendingPromise.resolve()}),250)}))}})); //# sourceMappingURL=search.min.js.map \ No newline at end of file diff --git a/admin/tool/langimport/amd/build/search.min.js.map b/admin/tool/langimport/amd/build/search.min.js.map index 04116ba2df7..273a4d3edba 100644 --- a/admin/tool/langimport/amd/build/search.min.js.map +++ b/admin/tool/langimport/amd/build/search.min.js.map @@ -1 +1 @@ -{"version":3,"file":"search.min.js","sources":["../src/search.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 * Add search filtering of available language packs\n *\n * @module tool_langimport/search\n * @copyright 2021 Paul Holden \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Pending from 'core/pending';\nimport {debounce} from 'core/utils';\n\nconst SELECTORS = {\n AVAILABLE_LANG_SELECT: 'select',\n AVAILABLE_LANG_SEARCH: '[data-action=\"search\"]',\n};\n\nconst DEBOUNCE_TIMER = 250;\n\n/**\n * Initialize module\n *\n * @param {Element} form\n */\nconst init = (form) => {\n const availableLangsElement = form.querySelector(SELECTORS.AVAILABLE_LANG_SELECT);\n\n const availableLangsFilter = (event) => {\n const pendingPromise = new Pending('tool_langimport/search:filter');\n\n // Remove existing options.\n availableLangsElement.querySelectorAll('option').forEach((option) => {\n option.remove();\n });\n\n // Filter for matching languages.\n const searchTerm = event.target.value.toLowerCase();\n const availableLanguages = JSON.parse(availableLangsElement.dataset.availableLanguages);\n const filteredLanguages = Object.keys(availableLanguages).reduce((matches, langcode) => {\n if (availableLanguages[langcode].toLowerCase().includes(searchTerm)) {\n matches[langcode] = availableLanguages[langcode];\n }\n return matches;\n }, []);\n\n // Re-create filtered options.\n Object.entries(filteredLanguages).forEach(([langcode, langname]) => {\n const option = document.createElement('option');\n option.value = langcode;\n option.innerText = langname;\n availableLangsElement.append(option);\n });\n\n pendingPromise.resolve();\n };\n\n // Cache initial available language options.\n const availableLanguages = {};\n availableLangsElement.querySelectorAll('option').forEach((option) => {\n availableLanguages[option.value] = option.text;\n });\n availableLangsElement.dataset.availableLanguages = JSON.stringify(availableLanguages);\n\n // Register event listeners on the search element.\n const availableLangsSearch = form.querySelector(SELECTORS.AVAILABLE_LANG_SEARCH);\n availableLangsSearch.addEventListener('keydown', (event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n }\n });\n\n // Debounce the event listener to allow the user to finish typing.\n availableLangsSearch.addEventListener('keyup', (event) => {\n const pendingPromise = new Pending('tool_langimport/search:keyup');\n\n debounce(availableLangsFilter, DEBOUNCE_TIMER)(event);\n setTimeout(() => {\n pendingPromise.resolve();\n }, DEBOUNCE_TIMER);\n });\n};\n\nexport default {\n init: init,\n};\n"],"names":["SELECTORS","init","form","availableLangsElement","querySelector","availableLangsFilter","event","pendingPromise","Pending","querySelectorAll","forEach","option","remove","searchTerm","target","value","toLowerCase","availableLanguages","JSON","parse","dataset","filteredLanguages","Object","keys","reduce","matches","langcode","includes","entries","_ref","langname","document","createElement","innerText","append","resolve","text","stringify","availableLangsSearch","addEventListener","key","preventDefault","setTimeout"],"mappings":";;;;;;;qJA0BMA,gCACqB,SADrBA,gCAEqB,sCAoEZ,CACXC,KA3DUC,aACJC,sBAAwBD,KAAKE,cAAcJ,iCAE3CK,qBAAwBC,cACpBC,eAAiB,IAAIC,iBAAQ,iCAGnCL,sBAAsBM,iBAAiB,UAAUC,SAASC,SACtDA,OAAOC,kBAILC,WAAaP,MAAMQ,OAAOC,MAAMC,cAChCC,mBAAqBC,KAAKC,MAAMhB,sBAAsBiB,QAAQH,oBAC9DI,kBAAoBC,OAAOC,KAAKN,oBAAoBO,QAAO,CAACC,QAASC,YACnET,mBAAmBS,UAAUV,cAAcW,SAASd,cACpDY,QAAQC,UAAYT,mBAAmBS,WAEpCD,UACR,IAGHH,OAAOM,QAAQP,mBAAmBX,SAAQmB,WAAEH,SAAUI,qBAC5CnB,OAASoB,SAASC,cAAc,UACtCrB,OAAOI,MAAQW,SACff,OAAOsB,UAAYH,SACnB3B,sBAAsB+B,OAAOvB,WAGjCJ,eAAe4B,WAIblB,mBAAqB,GAC3Bd,sBAAsBM,iBAAiB,UAAUC,SAASC,SACtDM,mBAAmBN,OAAOI,OAASJ,OAAOyB,QAE9CjC,sBAAsBiB,QAAQH,mBAAqBC,KAAKmB,UAAUpB,0BAG5DqB,qBAAuBpC,KAAKE,cAAcJ,iCAChDsC,qBAAqBC,iBAAiB,WAAYjC,QAC5B,UAAdA,MAAMkC,KACNlC,MAAMmC,oBAKdH,qBAAqBC,iBAAiB,SAAUjC,cACtCC,eAAiB,IAAIC,iBAAQ,oDAE1BH,qBA1DM,KA0DgCC,OAC/CoC,YAAW,KACPnC,eAAe4B,YA5DJ"} \ No newline at end of file +{"version":3,"file":"search.min.js","sources":["../src/search.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 * Add search filtering of available language packs\n *\n * @module tool_langimport/search\n * @copyright 2021 Paul Holden \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Pending from 'core/pending';\nimport {debounce} from 'core/utils';\n\nconst SELECTORS = {\n AVAILABLE_LANG_SELECT: 'select',\n AVAILABLE_LANG_SEARCH: '[data-action=\"search\"]',\n};\n\nconst DEBOUNCE_TIMER = 250;\n\n/**\n * Initialize module\n *\n * @param {Element} form\n */\nexport const init = form => {\n const availableLangsElement = form.querySelector(SELECTORS.AVAILABLE_LANG_SELECT);\n\n const availableLangsFilter = (event) => {\n const pendingPromise = new Pending('tool_langimport/search:filter');\n\n // Remove existing options.\n availableLangsElement.querySelectorAll('option').forEach((option) => {\n option.remove();\n });\n\n // Filter for matching languages.\n const searchTerm = event.target.value.toLowerCase();\n const availableLanguages = JSON.parse(availableLangsElement.dataset.availableLanguages);\n const filteredLanguages = Object.keys(availableLanguages).reduce((matches, langcode) => {\n if (availableLanguages[langcode].toLowerCase().includes(searchTerm)) {\n matches[langcode] = availableLanguages[langcode];\n }\n return matches;\n }, []);\n\n // Re-create filtered options.\n Object.entries(filteredLanguages).forEach(([langcode, langname]) => {\n const option = document.createElement('option');\n option.value = langcode;\n option.innerText = langname;\n availableLangsElement.append(option);\n });\n\n pendingPromise.resolve();\n };\n\n // Cache initial available language options.\n const availableLanguages = {};\n availableLangsElement.querySelectorAll('option').forEach((option) => {\n availableLanguages[option.value] = option.text;\n });\n availableLangsElement.dataset.availableLanguages = JSON.stringify(availableLanguages);\n\n // Register event listeners on the search element.\n const availableLangsSearch = form.querySelector(SELECTORS.AVAILABLE_LANG_SEARCH);\n availableLangsSearch.addEventListener('keydown', (event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n }\n });\n\n // Debounce the event listener to allow the user to finish typing.\n const availableLangsSearchDebounce = debounce(availableLangsFilter, DEBOUNCE_TIMER);\n availableLangsSearch.addEventListener('keyup', (event) => {\n const pendingPromise = new Pending('tool_langimport/search:keyup');\n\n availableLangsSearchDebounce(event);\n setTimeout(() => {\n pendingPromise.resolve();\n }, DEBOUNCE_TIMER);\n });\n};\n"],"names":["SELECTORS","form","availableLangsElement","querySelector","availableLanguages","querySelectorAll","forEach","option","value","text","dataset","JSON","stringify","availableLangsSearch","addEventListener","event","key","preventDefault","availableLangsSearchDebounce","pendingPromise","Pending","remove","searchTerm","target","toLowerCase","parse","filteredLanguages","Object","keys","reduce","matches","langcode","includes","entries","_ref","langname","document","createElement","innerText","append","resolve","setTimeout"],"mappings":";;;;;;;kJA0BMA,gCACqB,SADrBA,gCAEqB,uCAUPC,aACVC,sBAAwBD,KAAKE,cAAcH,iCAgC3CI,mBAAqB,GAC3BF,sBAAsBG,iBAAiB,UAAUC,SAASC,SACtDH,mBAAmBG,OAAOC,OAASD,OAAOE,QAE9CP,sBAAsBQ,QAAQN,mBAAqBO,KAAKC,UAAUR,0BAG5DS,qBAAuBZ,KAAKE,cAAcH,iCAChDa,qBAAqBC,iBAAiB,WAAYC,QAC5B,UAAdA,MAAMC,KACND,MAAME,0BAKRC,8BAA+B,oBA7CPH,cACpBI,eAAiB,IAAIC,iBAAQ,iCAGnClB,sBAAsBG,iBAAiB,UAAUC,SAASC,SACtDA,OAAOc,kBAILC,WAAaP,MAAMQ,OAAOf,MAAMgB,cAChCpB,mBAAqBO,KAAKc,MAAMvB,sBAAsBQ,QAAQN,oBAC9DsB,kBAAoBC,OAAOC,KAAKxB,oBAAoByB,QAAO,CAACC,QAASC,YACnE3B,mBAAmB2B,UAAUP,cAAcQ,SAASV,cACpDQ,QAAQC,UAAY3B,mBAAmB2B,WAEpCD,UACR,IAGHH,OAAOM,QAAQP,mBAAmBpB,SAAQ4B,WAAEH,SAAUI,qBAC5C5B,OAAS6B,SAASC,cAAc,UACtC9B,OAAOC,MAAQuB,SACfxB,OAAO+B,UAAYH,SACnBjC,sBAAsBqC,OAAOhC,WAGjCY,eAAeqB,YApCA,KAwDnB3B,qBAAqBC,iBAAiB,SAAUC,cACtCI,eAAiB,IAAIC,iBAAQ,gCAEnCF,6BAA6BH,OAC7B0B,YAAW,KACPtB,eAAeqB,YA7DJ"} \ No newline at end of file diff --git a/admin/tool/langimport/amd/src/search.js b/admin/tool/langimport/amd/src/search.js index b4f341a2684..c9819182017 100644 --- a/admin/tool/langimport/amd/src/search.js +++ b/admin/tool/langimport/amd/src/search.js @@ -36,7 +36,7 @@ const DEBOUNCE_TIMER = 250; * * @param {Element} form */ -const init = (form) => { +export const init = form => { const availableLangsElement = form.querySelector(SELECTORS.AVAILABLE_LANG_SELECT); const availableLangsFilter = (event) => { @@ -84,16 +84,13 @@ const init = (form) => { }); // Debounce the event listener to allow the user to finish typing. + const availableLangsSearchDebounce = debounce(availableLangsFilter, DEBOUNCE_TIMER); availableLangsSearch.addEventListener('keyup', (event) => { const pendingPromise = new Pending('tool_langimport/search:keyup'); - debounce(availableLangsFilter, DEBOUNCE_TIMER)(event); + availableLangsSearchDebounce(event); setTimeout(() => { pendingPromise.resolve(); }, DEBOUNCE_TIMER); }); }; - -export default { - init: init, -}; diff --git a/reportbuilder/amd/build/sidebar.min.js b/reportbuilder/amd/build/sidebar.min.js index 302edf0a441..d98065fb81f 100644 --- a/reportbuilder/amd/build/sidebar.min.js +++ b/reportbuilder/amd/build/sidebar.min.js @@ -5,6 +5,6 @@ define("core_reportbuilder/sidebar",["exports","core/pending","core/utils","core * @module core_reportbuilder/sidebar * @copyright 2021 Paul Holden * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */function _getRequireWildcardCache(nodeInterop){if("function"!=typeof WeakMap)return null;var cacheBabelInterop=new WeakMap,cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_pending=(obj=_pending)&&obj.__esModule?obj:{default:obj},reportSelectors=function(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}newObj.default=obj,cache&&cache.set(obj,newObj);return newObj}(reportSelectors);const CLASSES_EXPANDED="show",CLASSES_COLLAPSED="collapsed",CLASSES_HIDE="d-none",sidebarCardFilter=(event,sidebarMenu)=>{const pendingPromise=new _pending.default("core_reportbuilder/sidebar:cardFilter"),sidebarCards=sidebarMenu.querySelectorAll(reportSelectors.regions.sidebarCard),sidebarItems=sidebarMenu.querySelectorAll(reportSelectors.regions.sidebarItem),searchTerm=event.target.value.toLowerCase();sidebarItems.forEach((item=>{const itemContent=item.textContent.toLowerCase();item.classList.toggle(CLASSES_HIDE,!itemContent.includes(searchTerm))})),sidebarCards.forEach((card=>{const visibleItems=card.querySelectorAll("".concat(reportSelectors.regions.sidebarItem,":not(.").concat(CLASSES_HIDE,")"));card.classList.toggle(CLASSES_HIDE,!visibleItems.length),expandCard(card)})),pendingPromise.resolve()},expandCard=card=>{let cardButton=card.querySelector('[data-toggle="collapse"]');if(cardButton.classList.contains(CLASSES_COLLAPSED)){cardButton.classList.remove(CLASSES_COLLAPSED),cardButton.setAttribute("aria-expanded","true"),card.querySelector(cardButton.dataset.target).classList.add(CLASSES_EXPANDED)}};_exports.init=selectorId=>{const sidebarMenu=document.querySelector(selectorId+reportSelectors.regions.sidebarMenu);sidebarMenu.querySelector(reportSelectors.actions.sidebarSearch).addEventListener("keyup",(event=>{const pendingPromise=new _pending.default("core_reportbuilder/sidebar:keyup");(0,_utils.debounce)(sidebarCardFilter,250)(event,sidebarMenu),setTimeout((()=>{pendingPromise.resolve()}),250)}))}})); + */function _getRequireWildcardCache(nodeInterop){if("function"!=typeof WeakMap)return null;var cacheBabelInterop=new WeakMap,cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_pending=(obj=_pending)&&obj.__esModule?obj:{default:obj},reportSelectors=function(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}newObj.default=obj,cache&&cache.set(obj,newObj);return newObj}(reportSelectors);const CLASSES_EXPANDED="show",CLASSES_COLLAPSED="collapsed",CLASSES_HIDE="d-none",sidebarCardFilter=(event,sidebarMenu)=>{const pendingPromise=new _pending.default("core_reportbuilder/sidebar:cardFilter"),sidebarCards=sidebarMenu.querySelectorAll(reportSelectors.regions.sidebarCard),sidebarItems=sidebarMenu.querySelectorAll(reportSelectors.regions.sidebarItem),searchTerm=event.target.value.toLowerCase();sidebarItems.forEach((item=>{const itemContent=item.textContent.toLowerCase();item.classList.toggle(CLASSES_HIDE,!itemContent.includes(searchTerm))})),sidebarCards.forEach((card=>{const visibleItems=card.querySelectorAll("".concat(reportSelectors.regions.sidebarItem,":not(.").concat(CLASSES_HIDE,")"));card.classList.toggle(CLASSES_HIDE,!visibleItems.length),expandCard(card)})),pendingPromise.resolve()},expandCard=card=>{let cardButton=card.querySelector('[data-toggle="collapse"]');if(cardButton.classList.contains(CLASSES_COLLAPSED)){cardButton.classList.remove(CLASSES_COLLAPSED),cardButton.setAttribute("aria-expanded","true"),card.querySelector(cardButton.dataset.target).classList.add(CLASSES_EXPANDED)}};_exports.init=selectorId=>{const sidebarMenu=document.querySelector(selectorId+reportSelectors.regions.sidebarMenu),sidebarSearch=sidebarMenu.querySelector(reportSelectors.actions.sidebarSearch),sidebarSearchDebounce=(0,_utils.debounce)(sidebarCardFilter,250);sidebarSearch.addEventListener("keyup",(event=>{const pendingPromise=new _pending.default("core_reportbuilder/sidebar:keyup");sidebarSearchDebounce(event,sidebarMenu),setTimeout((()=>{pendingPromise.resolve()}),250)}))}})); //# sourceMappingURL=sidebar.min.js.map \ No newline at end of file diff --git a/reportbuilder/amd/build/sidebar.min.js.map b/reportbuilder/amd/build/sidebar.min.js.map index 93665b4b4df..49bd60996c9 100644 --- a/reportbuilder/amd/build/sidebar.min.js.map +++ b/reportbuilder/amd/build/sidebar.min.js.map @@ -1 +1 @@ -{"version":3,"file":"sidebar.min.js","sources":["../src/sidebar.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 * Report builder sidebar component\n *\n * @module core_reportbuilder/sidebar\n * @copyright 2021 Paul Holden \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Pending from 'core/pending';\nimport {debounce} from 'core/utils';\nimport * as reportSelectors from 'core_reportbuilder/local/selectors';\n\nconst DEBOUNCE_TIMER = 250;\n\nconst CLASSES = {\n EXPANDED: 'show',\n COLLAPSED: 'collapsed',\n HIDE: 'd-none',\n};\n\n/**\n * Initialise module\n *\n * @param {Event} event\n * @param {Element} sidebarMenu\n */\nconst sidebarCardFilter = (event, sidebarMenu) => {\n const pendingPromise = new Pending('core_reportbuilder/sidebar:cardFilter');\n\n const sidebarCards = sidebarMenu.querySelectorAll(reportSelectors.regions.sidebarCard);\n const sidebarItems = sidebarMenu.querySelectorAll(reportSelectors.regions.sidebarItem);\n const searchTerm = event.target.value.toLowerCase();\n\n // Toggle items according to match against search term.\n sidebarItems.forEach(item => {\n const itemContent = item.textContent.toLowerCase();\n item.classList.toggle(CLASSES.HIDE, !itemContent.includes(searchTerm));\n });\n\n // Toggle cards according to whether they have any visible items.\n sidebarCards.forEach(card => {\n const visibleItems = card.querySelectorAll(`${reportSelectors.regions.sidebarItem}:not(.${CLASSES.HIDE})`);\n card.classList.toggle(CLASSES.HIDE, !visibleItems.length);\n\n expandCard(card);\n });\n\n pendingPromise.resolve();\n};\n\n/**\n * Show a collapsed card.\n * This function simulates the behaviour of JQuery show method on a collapsible element.\n *\n * @param {Element} card\n */\nconst expandCard = (card) => {\n let cardButton = card.querySelector('[data-toggle=\"collapse\"]');\n if (cardButton.classList.contains(CLASSES.COLLAPSED)) {\n cardButton.classList.remove(CLASSES.COLLAPSED);\n cardButton.setAttribute('aria-expanded', \"true\");\n let cardContent = card.querySelector(cardButton.dataset.target);\n cardContent.classList.add(CLASSES.EXPANDED);\n }\n};\n\n/**\n * Initialise module\n *\n * @param {string} selectorId\n */\nexport const init = (selectorId) => {\n const sidebarMenu = document.querySelector(selectorId + reportSelectors.regions.sidebarMenu);\n const sidebarSearch = sidebarMenu.querySelector(reportSelectors.actions.sidebarSearch);\n\n // Debounce the event listener to allow the user to finish typing.\n sidebarSearch.addEventListener('keyup', event => {\n const pendingPromise = new Pending('core_reportbuilder/sidebar:keyup');\n\n debounce(sidebarCardFilter, DEBOUNCE_TIMER)(event, sidebarMenu);\n setTimeout(() => {\n pendingPromise.resolve();\n }, DEBOUNCE_TIMER);\n });\n};\n"],"names":["CLASSES","sidebarCardFilter","event","sidebarMenu","pendingPromise","Pending","sidebarCards","querySelectorAll","reportSelectors","regions","sidebarCard","sidebarItems","sidebarItem","searchTerm","target","value","toLowerCase","forEach","item","itemContent","textContent","classList","toggle","includes","card","visibleItems","length","expandCard","resolve","cardButton","querySelector","contains","remove","setAttribute","dataset","add","selectorId","document","actions","sidebarSearch","addEventListener","setTimeout"],"mappings":";;;;;;;mlCA6BMA,iBACQ,OADRA,kBAES,YAFTA,aAGI,SASJC,kBAAoB,CAACC,MAAOC,qBACxBC,eAAiB,IAAIC,iBAAQ,yCAE7BC,aAAeH,YAAYI,iBAAiBC,gBAAgBC,QAAQC,aACpEC,aAAeR,YAAYI,iBAAiBC,gBAAgBC,QAAQG,aACpEC,WAAaX,MAAMY,OAAOC,MAAMC,cAGtCL,aAAaM,SAAQC,aACXC,YAAcD,KAAKE,YAAYJ,cACrCE,KAAKG,UAAUC,OAAOtB,cAAemB,YAAYI,SAASV,gBAI9DP,aAAaW,SAAQO,aACXC,aAAeD,KAAKjB,2BAAoBC,gBAAgBC,QAAQG,6BAAoBZ,mBAC1FwB,KAAKH,UAAUC,OAAOtB,cAAeyB,aAAaC,QAElDC,WAAWH,SAGfpB,eAAewB,WASbD,WAAcH,WACZK,WAAaL,KAAKM,cAAc,+BAChCD,WAAWR,UAAUU,SAAS/B,mBAAoB,CAClD6B,WAAWR,UAAUW,OAAOhC,mBAC5B6B,WAAWI,aAAa,gBAAiB,QACvBT,KAAKM,cAAcD,WAAWK,QAAQpB,QAC5CO,UAAUc,IAAInC,kCASboC,mBACXjC,YAAckC,SAASP,cAAcM,WAAa5B,gBAAgBC,QAAQN,aAC1DA,YAAY2B,cAActB,gBAAgB8B,QAAQC,eAG1DC,iBAAiB,SAAStC,cAC9BE,eAAiB,IAAIC,iBAAQ,wDAE1BJ,kBAnEM,KAmE6BC,MAAOC,aACnDsC,YAAW,KACPrC,eAAewB,YArEJ"} \ No newline at end of file +{"version":3,"file":"sidebar.min.js","sources":["../src/sidebar.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 * Report builder sidebar component\n *\n * @module core_reportbuilder/sidebar\n * @copyright 2021 Paul Holden \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Pending from 'core/pending';\nimport {debounce} from 'core/utils';\nimport * as reportSelectors from 'core_reportbuilder/local/selectors';\n\nconst DEBOUNCE_TIMER = 250;\n\nconst CLASSES = {\n EXPANDED: 'show',\n COLLAPSED: 'collapsed',\n HIDE: 'd-none',\n};\n\n/**\n * Initialise module\n *\n * @param {Event} event\n * @param {Element} sidebarMenu\n */\nconst sidebarCardFilter = (event, sidebarMenu) => {\n const pendingPromise = new Pending('core_reportbuilder/sidebar:cardFilter');\n\n const sidebarCards = sidebarMenu.querySelectorAll(reportSelectors.regions.sidebarCard);\n const sidebarItems = sidebarMenu.querySelectorAll(reportSelectors.regions.sidebarItem);\n const searchTerm = event.target.value.toLowerCase();\n\n // Toggle items according to match against search term.\n sidebarItems.forEach(item => {\n const itemContent = item.textContent.toLowerCase();\n item.classList.toggle(CLASSES.HIDE, !itemContent.includes(searchTerm));\n });\n\n // Toggle cards according to whether they have any visible items.\n sidebarCards.forEach(card => {\n const visibleItems = card.querySelectorAll(`${reportSelectors.regions.sidebarItem}:not(.${CLASSES.HIDE})`);\n card.classList.toggle(CLASSES.HIDE, !visibleItems.length);\n\n expandCard(card);\n });\n\n pendingPromise.resolve();\n};\n\n/**\n * Show a collapsed card.\n * This function simulates the behaviour of JQuery show method on a collapsible element.\n *\n * @param {Element} card\n */\nconst expandCard = (card) => {\n let cardButton = card.querySelector('[data-toggle=\"collapse\"]');\n if (cardButton.classList.contains(CLASSES.COLLAPSED)) {\n cardButton.classList.remove(CLASSES.COLLAPSED);\n cardButton.setAttribute('aria-expanded', \"true\");\n let cardContent = card.querySelector(cardButton.dataset.target);\n cardContent.classList.add(CLASSES.EXPANDED);\n }\n};\n\n/**\n * Initialise module\n *\n * @param {string} selectorId\n */\nexport const init = (selectorId) => {\n const sidebarMenu = document.querySelector(selectorId + reportSelectors.regions.sidebarMenu);\n const sidebarSearch = sidebarMenu.querySelector(reportSelectors.actions.sidebarSearch);\n\n // Debounce the event listener to allow the user to finish typing.\n const sidebarSearchDebounce = debounce(sidebarCardFilter, DEBOUNCE_TIMER);\n sidebarSearch.addEventListener('keyup', event => {\n const pendingPromise = new Pending('core_reportbuilder/sidebar:keyup');\n\n sidebarSearchDebounce(event, sidebarMenu);\n setTimeout(() => {\n pendingPromise.resolve();\n }, DEBOUNCE_TIMER);\n });\n};\n"],"names":["CLASSES","sidebarCardFilter","event","sidebarMenu","pendingPromise","Pending","sidebarCards","querySelectorAll","reportSelectors","regions","sidebarCard","sidebarItems","sidebarItem","searchTerm","target","value","toLowerCase","forEach","item","itemContent","textContent","classList","toggle","includes","card","visibleItems","length","expandCard","resolve","cardButton","querySelector","contains","remove","setAttribute","dataset","add","selectorId","document","sidebarSearch","actions","sidebarSearchDebounce","addEventListener","setTimeout"],"mappings":";;;;;;;mlCA6BMA,iBACQ,OADRA,kBAES,YAFTA,aAGI,SASJC,kBAAoB,CAACC,MAAOC,qBACxBC,eAAiB,IAAIC,iBAAQ,yCAE7BC,aAAeH,YAAYI,iBAAiBC,gBAAgBC,QAAQC,aACpEC,aAAeR,YAAYI,iBAAiBC,gBAAgBC,QAAQG,aACpEC,WAAaX,MAAMY,OAAOC,MAAMC,cAGtCL,aAAaM,SAAQC,aACXC,YAAcD,KAAKE,YAAYJ,cACrCE,KAAKG,UAAUC,OAAOtB,cAAemB,YAAYI,SAASV,gBAI9DP,aAAaW,SAAQO,aACXC,aAAeD,KAAKjB,2BAAoBC,gBAAgBC,QAAQG,6BAAoBZ,mBAC1FwB,KAAKH,UAAUC,OAAOtB,cAAeyB,aAAaC,QAElDC,WAAWH,SAGfpB,eAAewB,WASbD,WAAcH,WACZK,WAAaL,KAAKM,cAAc,+BAChCD,WAAWR,UAAUU,SAAS/B,mBAAoB,CAClD6B,WAAWR,UAAUW,OAAOhC,mBAC5B6B,WAAWI,aAAa,gBAAiB,QACvBT,KAAKM,cAAcD,WAAWK,QAAQpB,QAC5CO,UAAUc,IAAInC,kCASboC,mBACXjC,YAAckC,SAASP,cAAcM,WAAa5B,gBAAgBC,QAAQN,aAC1EmC,cAAgBnC,YAAY2B,cAActB,gBAAgB+B,QAAQD,eAGlEE,uBAAwB,mBAASvC,kBAhEpB,KAiEnBqC,cAAcG,iBAAiB,SAASvC,cAC9BE,eAAiB,IAAIC,iBAAQ,oCAEnCmC,sBAAsBtC,MAAOC,aAC7BuC,YAAW,KACPtC,eAAewB,YAtEJ"} \ No newline at end of file diff --git a/reportbuilder/amd/src/sidebar.js b/reportbuilder/amd/src/sidebar.js index 26f8c367072..da390aa467d 100644 --- a/reportbuilder/amd/src/sidebar.js +++ b/reportbuilder/amd/src/sidebar.js @@ -89,10 +89,11 @@ export const init = (selectorId) => { const sidebarSearch = sidebarMenu.querySelector(reportSelectors.actions.sidebarSearch); // Debounce the event listener to allow the user to finish typing. + const sidebarSearchDebounce = debounce(sidebarCardFilter, DEBOUNCE_TIMER); sidebarSearch.addEventListener('keyup', event => { const pendingPromise = new Pending('core_reportbuilder/sidebar:keyup'); - debounce(sidebarCardFilter, DEBOUNCE_TIMER)(event, sidebarMenu); + sidebarSearchDebounce(event, sidebarMenu); setTimeout(() => { pendingPromise.resolve(); }, DEBOUNCE_TIMER);