diff --git a/lib/amd/build/dynamic_tabs.min.js b/lib/amd/build/dynamic_tabs.min.js index 763c26581d6..c4f15a84d19 100644 --- a/lib/amd/build/dynamic_tabs.min.js +++ b/lib/amd/build/dynamic_tabs.min.js @@ -1,10 +1,10 @@ -define("core/dynamic_tabs",["exports","jquery","core/templates","core/loadingicon","core/notification","core/page_title","core/pending","core/str","core/local/repository/dynamic_tabs","core_form/changechecker"],(function(_exports,_jquery,_templates,_loadingicon,_notification,_page_title,_pending,_str,_dynamic_tabs,_changechecker){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}} +define("core/dynamic_tabs",["exports","core/fragment","core/loadingicon","core/notification","core/page_title","core/pending","core/str","core/templates","core/local/repository/dynamic_tabs","core_form/changechecker"],(function(_exports,_fragment,_loadingicon,_notification,_page_title,_pending,_str,_templates,_dynamic_tabs,_changechecker){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}} /** * Dynamic Tabs UI element with AJAX loading of tabs content * * @module core/dynamic_tabs * @copyright 2021 David Matamoros based on code from Marina Glancy * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_jquery=_interopRequireDefault(_jquery),_templates=_interopRequireDefault(_templates),_notification=_interopRequireDefault(_notification),_pending=_interopRequireDefault(_pending);const SELECTORS={dynamicTabs:".dynamictabs",activeTab:".dynamictabs .nav-link.active",allActiveTabs:'.dynamictabs .nav-link[data-bs-toggle="tab"]:not(.disabled)',tabContent:".dynamictabs .tab-pane [data-tab-content]",tabToggle:'a[data-bs-toggle="tab"]',tabPane:".dynamictabs .tab-pane",forTabName:tabName=>'.dynamictabs [data-tab-content="'.concat(tabName,'"]'),forTabId:tabName=>'.dynamictabs [data-bs-toggle="tab"][href="#'.concat(tabName,'"]')};let watchedFormDirtyNotification=!1;_exports.init=()=>{if(document.querySelectorAll(SELECTORS.tabToggle).forEach((tabToggle=>{tabToggle.addEventListener("show.bs.tab",(event=>{if((0,_changechecker.isAnyWatchedFormDirty)())return event.preventDefault(),event.stopPropagation(),void(watchedFormDirtyNotification||(watchedFormDirtyNotification=!0,_notification.default.saveCancelPromise((0,_str.getString)("changesmade"),(0,_str.getString)("changesmadereallygoaway"),(0,_str.getString)("confirm"),{triggerElement:tabToggle}).then((()=>{(0,_changechecker.resetAllFormDirtyStates)(),tabToggle.dispatchEvent(new Event("click",{bubbles:!0}))})).catch((()=>{})).finally((()=>{watchedFormDirtyNotification=!1}))));const previousTabName=getActiveTabName();if(previousTabName){document.querySelector(SELECTORS.forTabName(previousTabName)).textContent=""}})),tabToggle.addEventListener("shown.bs.tab",(()=>{const tabPane=document.getElementById(tabToggle.getAttribute("href").replace(/^#/,""));tabPane&&loadTab(tabPane.id)}))})),!openTabFromHash()){const tabs=document.querySelector(SELECTORS.allActiveTabs);if(tabs)openTab(tabs.getAttribute("aria-controls"));else{const tabPane=document.querySelector(SELECTORS.tabPane);tabPane&&(tabPane.classList.add("active","show"),loadTab(tabPane.getAttribute("id")))}}};const getActiveTabName=()=>{const element=document.querySelector(SELECTORS.activeTab);return(null==element?void 0:element.getAttribute("aria-controls"))||null},loadTab=tabName=>{var _ref,_tabName;tabName=null!==(_ref=null!==(_tabName=tabName)&&void 0!==_tabName?_tabName:getActiveTabName())&&void 0!==_ref?_ref:(()=>{const element=document.querySelector(SELECTORS.tabContent);return(null==element?void 0:element.dataset.tabContent)||null})();const tab=document.querySelector(SELECTORS.forTabName(tabName));if(!tab)return;const pendingPromise=new _pending.default("core/dynamic_tabs:loadTab:"+tabName),tabLabelledBy=document.getElementById(tab.getAttribute("aria-labelledby"));(0,_page_title.prependPageTitle)(tabLabelledBy.innerText),(0,_loadingicon.addIconToContainer)(tab).then((()=>{let tabArgs={...tab.dataset};return delete tabArgs.tabClass,delete tabArgs.tabContent,(0,_dynamic_tabs.getContent)(tab.dataset.tabClass,JSON.stringify(tabArgs))})).then((response=>Promise.all([_jquery.default.parseHTML(response.javascript,null,!0).map((node=>node.innerHTML)).join("\n"),_templates.default.renderForPromise(response.template,JSON.parse(response.content))]))).then((_ref2=>{let[responseJs,{html:html,js:js}]=_ref2;return _templates.default.replaceNodeContents(tab,html,js+responseJs)})).then((()=>pendingPromise.resolve())).catch(_notification.default.exception)},openTab=tabName=>{const tab=(tabName=>document.querySelector(SELECTORS.forTabId(tabName)))(tabName);return!!tab&&(loadTab(tabName),tab.classList.add("active"),(tabName=>document.getElementById(tabName))(tabName).classList.add("active","show"),!0)},openTabFromHash=()=>{const hash=document.location.hash;return!!hash.match(/^#\w+$/g)&&openTab(hash.replace(/^#/g,""))}})); + */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_notification=_interopRequireDefault(_notification),_pending=_interopRequireDefault(_pending),_templates=_interopRequireDefault(_templates);const SELECTORS={dynamicTabs:".dynamictabs",activeTab:".dynamictabs .nav-link.active",allActiveTabs:'.dynamictabs .nav-link[data-bs-toggle="tab"]:not(.disabled)',tabContent:".dynamictabs .tab-pane [data-tab-content]",tabToggle:'a[data-bs-toggle="tab"]',tabPane:".dynamictabs .tab-pane",forTabName:tabName=>'.dynamictabs [data-tab-content="'.concat(tabName,'"]'),forTabId:tabName=>'.dynamictabs [data-bs-toggle="tab"][href="#'.concat(tabName,'"]')};let watchedFormDirtyNotification=!1;_exports.init=()=>{if(document.querySelectorAll(SELECTORS.tabToggle).forEach((tabToggle=>{tabToggle.addEventListener("show.bs.tab",(event=>{if((0,_changechecker.isAnyWatchedFormDirty)())return event.preventDefault(),event.stopPropagation(),void(watchedFormDirtyNotification||(watchedFormDirtyNotification=!0,_notification.default.saveCancelPromise((0,_str.getString)("changesmade"),(0,_str.getString)("changesmadereallygoaway"),(0,_str.getString)("confirm"),{triggerElement:tabToggle}).then((()=>{(0,_changechecker.resetAllFormDirtyStates)(),tabToggle.dispatchEvent(new Event("click",{bubbles:!0}))})).catch((()=>{})).finally((()=>{watchedFormDirtyNotification=!1}))));const previousTabName=getActiveTabName();if(previousTabName){document.querySelector(SELECTORS.forTabName(previousTabName)).textContent=""}})),tabToggle.addEventListener("shown.bs.tab",(()=>{const tabPane=document.getElementById(tabToggle.getAttribute("href").replace(/^#/,""));tabPane&&loadTab(tabPane.id)}))})),!openTabFromHash()){const tabs=document.querySelector(SELECTORS.allActiveTabs);if(tabs)openTab(tabs.getAttribute("aria-controls"));else{const tabPane=document.querySelector(SELECTORS.tabPane);tabPane&&(tabPane.classList.add("active","show"),loadTab(tabPane.getAttribute("id")))}}};const getActiveTabName=()=>{const element=document.querySelector(SELECTORS.activeTab);return(null==element?void 0:element.getAttribute("aria-controls"))||null},loadTab=tabName=>{var _ref,_tabName;tabName=null!==(_ref=null!==(_tabName=tabName)&&void 0!==_tabName?_tabName:getActiveTabName())&&void 0!==_ref?_ref:(()=>{const element=document.querySelector(SELECTORS.tabContent);return(null==element?void 0:element.dataset.tabContent)||null})();const tab=document.querySelector(SELECTORS.forTabName(tabName));if(!tab)return;const pendingPromise=new _pending.default("core/dynamic_tabs:loadTab:"+tabName),tabLabelledBy=document.getElementById(tab.getAttribute("aria-labelledby"));(0,_page_title.prependPageTitle)(tabLabelledBy.innerText),(0,_loadingicon.addIconToContainer)(tab).then((()=>{let tabArgs={...tab.dataset};return delete tabArgs.tabClass,delete tabArgs.tabContent,(0,_dynamic_tabs.getContent)(tab.dataset.tabClass,JSON.stringify(tabArgs))})).then((response=>Promise.all([(0,_fragment.processCollectedJavascript)(response.javascript),_templates.default.renderForPromise(response.template,JSON.parse(response.content))]))).then((_ref2=>{let[responseJs,{html:html,js:js}]=_ref2;return _templates.default.replaceNodeContents(tab,html,js+responseJs)})).then((()=>pendingPromise.resolve())).catch(_notification.default.exception)},openTab=tabName=>{const tab=(tabName=>document.querySelector(SELECTORS.forTabId(tabName)))(tabName);return!!tab&&(loadTab(tabName),tab.classList.add("active"),(tabName=>document.getElementById(tabName))(tabName).classList.add("active","show"),!0)},openTabFromHash=()=>{const hash=document.location.hash;return!!hash.match(/^#\w+$/g)&&openTab(hash.replace(/^#/g,""))}})); //# sourceMappingURL=dynamic_tabs.min.js.map \ No newline at end of file diff --git a/lib/amd/build/dynamic_tabs.min.js.map b/lib/amd/build/dynamic_tabs.min.js.map index 9b44092a913..5e6a7d33e48 100644 --- a/lib/amd/build/dynamic_tabs.min.js.map +++ b/lib/amd/build/dynamic_tabs.min.js.map @@ -1 +1 @@ -{"version":3,"file":"dynamic_tabs.min.js","sources":["../src/dynamic_tabs.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 * Dynamic Tabs UI element with AJAX loading of tabs content\n *\n * @module core/dynamic_tabs\n * @copyright 2021 David Matamoros based on code from Marina Glancy\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport $ from 'jquery';\nimport Templates from 'core/templates';\nimport {addIconToContainer} from 'core/loadingicon';\nimport Notification from 'core/notification';\nimport {prependPageTitle} from 'core/page_title';\nimport Pending from 'core/pending';\nimport {getString} from 'core/str';\nimport {getContent} from 'core/local/repository/dynamic_tabs';\nimport {isAnyWatchedFormDirty, resetAllFormDirtyStates} from 'core_form/changechecker';\n\nconst SELECTORS = {\n dynamicTabs: '.dynamictabs',\n activeTab: '.dynamictabs .nav-link.active',\n allActiveTabs: '.dynamictabs .nav-link[data-bs-toggle=\"tab\"]:not(.disabled)',\n tabContent: '.dynamictabs .tab-pane [data-tab-content]',\n tabToggle: 'a[data-bs-toggle=\"tab\"]',\n tabPane: '.dynamictabs .tab-pane',\n};\n\nSELECTORS.forTabName = tabName => `.dynamictabs [data-tab-content=\"${tabName}\"]`;\nSELECTORS.forTabId = tabName => `.dynamictabs [data-bs-toggle=\"tab\"][href=\"#${tabName}\"]`;\n\nlet watchedFormDirtyNotification = false;\n\n/**\n * Initialises the tabs view on the page (only one tabs view per page is supported)\n */\nexport const init = () => {\n const tabToggles = document.querySelectorAll(SELECTORS.tabToggle);\n tabToggles.forEach(tabToggle => {\n // Listen to click, warn user if they are navigating away with unsaved form changes.\n tabToggle.addEventListener('show.bs.tab', (event) => {\n if (isAnyWatchedFormDirty()) {\n event.preventDefault();\n event.stopPropagation();\n\n // Prevent double execution of event listener.\n if (!watchedFormDirtyNotification) {\n watchedFormDirtyNotification = true;\n\n Notification.saveCancelPromise(\n getString('changesmade'),\n getString('changesmadereallygoaway'),\n getString('confirm'),\n {triggerElement: tabToggle}\n ).then(() => {\n // Reset form dirty state on confirmation, re-trigger the event.\n resetAllFormDirtyStates();\n tabToggle.dispatchEvent(new Event('click', {bubbles: true}));\n return;\n }).catch(() => {\n // User cancelled the dialogue.\n }).finally(() => {\n watchedFormDirtyNotification = false;\n });\n }\n\n return;\n }\n\n // Clean content from previous tab.\n const previousTabName = getActiveTabName();\n if (previousTabName) {\n const previousTab = document.querySelector(SELECTORS.forTabName(previousTabName));\n previousTab.textContent = '';\n }\n });\n\n tabToggle.addEventListener('shown.bs.tab', () => {\n const tabPane = document.getElementById(tabToggle.getAttribute('href').replace(/^#/, ''));\n if (tabPane) {\n loadTab(tabPane.id);\n }\n });\n });\n\n if (!openTabFromHash()) {\n const tabs = document.querySelector(SELECTORS.allActiveTabs);\n if (tabs) {\n openTab(tabs.getAttribute('aria-controls'));\n } else {\n // We may hide tabs if there is only one available, just load the contents of the first tab.\n const tabPane = document.querySelector(SELECTORS.tabPane);\n if (tabPane) {\n tabPane.classList.add('active', 'show');\n loadTab(tabPane.getAttribute('id'));\n }\n }\n }\n};\n\n/**\n * Returns id/name of the currently active tab\n *\n * @return {String|null}\n */\nconst getActiveTabName = () => {\n const element = document.querySelector(SELECTORS.activeTab);\n return element?.getAttribute('aria-controls') || null;\n};\n\n/**\n * Returns the id/name of the first tab\n *\n * @return {String|null}\n */\nconst getFirstTabName = () => {\n const element = document.querySelector(SELECTORS.tabContent);\n return element?.dataset.tabContent || null;\n};\n\n/**\n * Loads contents of a tab using an AJAX request\n *\n * @param {String} tabName\n */\nconst loadTab = (tabName) => {\n // If tabName is not specified find the active tab, or if is not defined, the first available tab.\n tabName = tabName ?? getActiveTabName() ?? getFirstTabName();\n const tab = document.querySelector(SELECTORS.forTabName(tabName));\n if (!tab) {\n return;\n }\n\n const pendingPromise = new Pending('core/dynamic_tabs:loadTab:' + tabName);\n\n const tabLabelledBy = document.getElementById(tab.getAttribute('aria-labelledby'));\n prependPageTitle(tabLabelledBy.innerText);\n\n addIconToContainer(tab)\n .then(() => {\n let tabArgs = {...tab.dataset};\n delete tabArgs.tabClass;\n delete tabArgs.tabContent;\n return getContent(tab.dataset.tabClass, JSON.stringify(tabArgs));\n })\n .then(response => Promise.all([\n $.parseHTML(response.javascript, null, true).map(node => node.innerHTML).join(\"\\n\"),\n Templates.renderForPromise(response.template, JSON.parse(response.content)),\n ]))\n .then(([responseJs, {html, js}]) => Templates.replaceNodeContents(tab, html, js + responseJs))\n .then(() => pendingPromise.resolve())\n .catch(Notification.exception);\n};\n\n/**\n * Return the tab given the tab name\n *\n * @param {String} tabName\n * @return {HTMLElement}\n */\nconst getTab = (tabName) => {\n return document.querySelector(SELECTORS.forTabId(tabName));\n};\n\n/**\n * Return the tab pane given the tab name\n *\n * @param {String} tabName\n * @return {HTMLElement}\n */\nconst getTabPane = (tabName) => {\n return document.getElementById(tabName);\n};\n\n/**\n * Open the tab on page load. If this script loads before theme_boost/tab we need to open tab ourselves\n *\n * @param {String} tabName\n * @return {Boolean}\n */\nconst openTab = (tabName) => {\n const tab = getTab(tabName);\n if (!tab) {\n return false;\n }\n\n loadTab(tabName);\n tab.classList.add('active');\n getTabPane(tabName).classList.add('active', 'show');\n return true;\n};\n\n/**\n * If there is a location hash that is the same as the tab name - open this tab.\n *\n * @return {Boolean}\n */\nconst openTabFromHash = () => {\n const hash = document.location.hash;\n if (hash.match(/^#\\w+$/g)) {\n return openTab(hash.replace(/^#/g, ''));\n }\n\n return false;\n};\n"],"names":["SELECTORS","dynamicTabs","activeTab","allActiveTabs","tabContent","tabToggle","tabPane","tabName","watchedFormDirtyNotification","document","querySelectorAll","forEach","addEventListener","event","preventDefault","stopPropagation","saveCancelPromise","triggerElement","then","dispatchEvent","Event","bubbles","catch","finally","previousTabName","getActiveTabName","querySelector","forTabName","textContent","getElementById","getAttribute","replace","loadTab","id","openTabFromHash","tabs","openTab","classList","add","element","dataset","getFirstTabName","tab","pendingPromise","Pending","tabLabelledBy","innerText","tabArgs","tabClass","JSON","stringify","response","Promise","all","$","parseHTML","javascript","map","node","innerHTML","join","Templates","renderForPromise","template","parse","content","_ref2","responseJs","html","js","replaceNodeContents","resolve","Notification","exception","forTabId","getTab","getTabPane","hash","location","match"],"mappings":";;;;;;;4QAiCMA,UAAY,CACdC,YAAa,eACbC,UAAW,gCACXC,cAAe,8DACfC,WAAY,4CACZC,UAAW,0BACXC,QAAS,yBAGbN,WAAuBO,mDAA8CA,cACrEP,SAAqBO,8DAAyDA,mBAE1EC,8BAA+B,gBAKf,QACGC,SAASC,iBAAiBV,UAAUK,WAC5CM,SAAQN,YAEfA,UAAUO,iBAAiB,eAAgBC,YACnC,iDACAA,MAAMC,iBACND,MAAME,uBAGDP,+BACDA,8BAA+B,wBAElBQ,mBACT,kBAAU,gBACV,kBAAU,4BACV,kBAAU,WACV,CAACC,eAAgBZ,YACnBa,MAAK,kDAGHb,UAAUc,cAAc,IAAIC,MAAM,QAAS,CAACC,SAAS,QAEtDC,OAAM,SAENC,SAAQ,KACPf,8BAA+B,aAQrCgB,gBAAkBC,sBACpBD,gBAAiB,CACGf,SAASiB,cAAc1B,UAAU2B,WAAWH,kBACpDI,YAAc,OAIlCvB,UAAUO,iBAAiB,gBAAgB,WACjCN,QAAUG,SAASoB,eAAexB,UAAUyB,aAAa,QAAQC,QAAQ,KAAM,KACjFzB,SACA0B,QAAQ1B,QAAQ2B,WAKvBC,kBAAmB,OACdC,KAAO1B,SAASiB,cAAc1B,UAAUG,kBAC1CgC,KACAC,QAAQD,KAAKL,aAAa,sBACvB,OAEGxB,QAAUG,SAASiB,cAAc1B,UAAUM,SAC7CA,UACAA,QAAQ+B,UAAUC,IAAI,SAAU,QAChCN,QAAQ1B,QAAQwB,aAAa,iBAWvCL,iBAAmB,WACfc,QAAU9B,SAASiB,cAAc1B,UAAUE,kBAC1CqC,MAAAA,eAAAA,QAAST,aAAa,mBAAoB,MAkB/CE,QAAWzB,4BAEbA,sCAAUA,qCAAWkB,wCAZD,YACdc,QAAU9B,SAASiB,cAAc1B,UAAUI,mBAC1CmC,MAAAA,eAAAA,QAASC,QAAQpC,aAAc,MAUKqC,SACrCC,IAAMjC,SAASiB,cAAc1B,UAAU2B,WAAWpB,cACnDmC,iBAICC,eAAiB,IAAIC,iBAAQ,6BAA+BrC,SAE5DsC,cAAgBpC,SAASoB,eAAea,IAAIZ,aAAa,qDAC9Ce,cAAcC,+CAEZJ,KAClBxB,MAAK,SACE6B,QAAU,IAAIL,IAAIF,uBACfO,QAAQC,gBACRD,QAAQ3C,YACR,4BAAWsC,IAAIF,QAAQQ,SAAUC,KAAKC,UAAUH,aAE1D7B,MAAKiC,UAAYC,QAAQC,IAAI,CAC1BC,gBAAEC,UAAUJ,SAASK,WAAY,MAAM,GAAMC,KAAIC,MAAQA,KAAKC,YAAWC,KAAK,MAC9EC,mBAAUC,iBAAiBX,SAASY,SAAUd,KAAKe,MAAMb,SAASc,cAErE/C,MAAKgD,YAAEC,YAAYC,KAACA,KAADC,GAAOA,kBAASR,mBAAUS,oBAAoB5B,IAAK0B,KAAMC,GAAKF,eACjFjD,MAAK,IAAMyB,eAAe4B,YAC1BjD,MAAMkD,sBAAaC,YA6BlBrC,QAAW7B,gBACPmC,IArBMnC,CAAAA,SACLE,SAASiB,cAAc1B,UAAU0E,SAASnE,UAoBrCoE,CAAOpE,iBACdmC,MAILV,QAAQzB,SACRmC,IAAIL,UAAUC,IAAI,UAjBF/B,CAAAA,SACTE,SAASoB,eAAetB,SAiB/BqE,CAAWrE,SAAS8B,UAAUC,IAAI,SAAU,SACrC,IAQLJ,gBAAkB,WACd2C,KAAOpE,SAASqE,SAASD,aAC3BA,KAAKE,MAAM,YACJ3C,QAAQyC,KAAK9C,QAAQ,MAAO"} \ No newline at end of file +{"version":3,"file":"dynamic_tabs.min.js","sources":["../src/dynamic_tabs.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 * Dynamic Tabs UI element with AJAX loading of tabs content\n *\n * @module core/dynamic_tabs\n * @copyright 2021 David Matamoros based on code from Marina Glancy\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {processCollectedJavascript} from 'core/fragment';\nimport {addIconToContainer} from 'core/loadingicon';\nimport Notification from 'core/notification';\nimport {prependPageTitle} from 'core/page_title';\nimport Pending from 'core/pending';\nimport {getString} from 'core/str';\nimport Templates from 'core/templates';\nimport {getContent} from 'core/local/repository/dynamic_tabs';\nimport {isAnyWatchedFormDirty, resetAllFormDirtyStates} from 'core_form/changechecker';\n\nconst SELECTORS = {\n dynamicTabs: '.dynamictabs',\n activeTab: '.dynamictabs .nav-link.active',\n allActiveTabs: '.dynamictabs .nav-link[data-bs-toggle=\"tab\"]:not(.disabled)',\n tabContent: '.dynamictabs .tab-pane [data-tab-content]',\n tabToggle: 'a[data-bs-toggle=\"tab\"]',\n tabPane: '.dynamictabs .tab-pane',\n};\n\nSELECTORS.forTabName = tabName => `.dynamictabs [data-tab-content=\"${tabName}\"]`;\nSELECTORS.forTabId = tabName => `.dynamictabs [data-bs-toggle=\"tab\"][href=\"#${tabName}\"]`;\n\nlet watchedFormDirtyNotification = false;\n\n/**\n * Initialises the tabs view on the page (only one tabs view per page is supported)\n */\nexport const init = () => {\n const tabToggles = document.querySelectorAll(SELECTORS.tabToggle);\n tabToggles.forEach(tabToggle => {\n // Listen to click, warn user if they are navigating away with unsaved form changes.\n tabToggle.addEventListener('show.bs.tab', (event) => {\n if (isAnyWatchedFormDirty()) {\n event.preventDefault();\n event.stopPropagation();\n\n // Prevent double execution of event listener.\n if (!watchedFormDirtyNotification) {\n watchedFormDirtyNotification = true;\n\n Notification.saveCancelPromise(\n getString('changesmade'),\n getString('changesmadereallygoaway'),\n getString('confirm'),\n {triggerElement: tabToggle}\n ).then(() => {\n // Reset form dirty state on confirmation, re-trigger the event.\n resetAllFormDirtyStates();\n tabToggle.dispatchEvent(new Event('click', {bubbles: true}));\n return;\n }).catch(() => {\n // User cancelled the dialogue.\n }).finally(() => {\n watchedFormDirtyNotification = false;\n });\n }\n\n return;\n }\n\n // Clean content from previous tab.\n const previousTabName = getActiveTabName();\n if (previousTabName) {\n const previousTab = document.querySelector(SELECTORS.forTabName(previousTabName));\n previousTab.textContent = '';\n }\n });\n\n tabToggle.addEventListener('shown.bs.tab', () => {\n const tabPane = document.getElementById(tabToggle.getAttribute('href').replace(/^#/, ''));\n if (tabPane) {\n loadTab(tabPane.id);\n }\n });\n });\n\n if (!openTabFromHash()) {\n const tabs = document.querySelector(SELECTORS.allActiveTabs);\n if (tabs) {\n openTab(tabs.getAttribute('aria-controls'));\n } else {\n // We may hide tabs if there is only one available, just load the contents of the first tab.\n const tabPane = document.querySelector(SELECTORS.tabPane);\n if (tabPane) {\n tabPane.classList.add('active', 'show');\n loadTab(tabPane.getAttribute('id'));\n }\n }\n }\n};\n\n/**\n * Returns id/name of the currently active tab\n *\n * @return {String|null}\n */\nconst getActiveTabName = () => {\n const element = document.querySelector(SELECTORS.activeTab);\n return element?.getAttribute('aria-controls') || null;\n};\n\n/**\n * Returns the id/name of the first tab\n *\n * @return {String|null}\n */\nconst getFirstTabName = () => {\n const element = document.querySelector(SELECTORS.tabContent);\n return element?.dataset.tabContent || null;\n};\n\n/**\n * Loads contents of a tab using an AJAX request\n *\n * @param {String} tabName\n */\nconst loadTab = (tabName) => {\n // If tabName is not specified find the active tab, or if is not defined, the first available tab.\n tabName = tabName ?? getActiveTabName() ?? getFirstTabName();\n const tab = document.querySelector(SELECTORS.forTabName(tabName));\n if (!tab) {\n return;\n }\n\n const pendingPromise = new Pending('core/dynamic_tabs:loadTab:' + tabName);\n\n const tabLabelledBy = document.getElementById(tab.getAttribute('aria-labelledby'));\n prependPageTitle(tabLabelledBy.innerText);\n\n addIconToContainer(tab)\n .then(() => {\n let tabArgs = {...tab.dataset};\n delete tabArgs.tabClass;\n delete tabArgs.tabContent;\n return getContent(tab.dataset.tabClass, JSON.stringify(tabArgs));\n })\n .then(response => Promise.all([\n processCollectedJavascript(response.javascript),\n Templates.renderForPromise(response.template, JSON.parse(response.content)),\n ]))\n .then(([responseJs, {html, js}]) => Templates.replaceNodeContents(tab, html, js + responseJs))\n .then(() => pendingPromise.resolve())\n .catch(Notification.exception);\n};\n\n/**\n * Return the tab given the tab name\n *\n * @param {String} tabName\n * @return {HTMLElement}\n */\nconst getTab = (tabName) => {\n return document.querySelector(SELECTORS.forTabId(tabName));\n};\n\n/**\n * Return the tab pane given the tab name\n *\n * @param {String} tabName\n * @return {HTMLElement}\n */\nconst getTabPane = (tabName) => {\n return document.getElementById(tabName);\n};\n\n/**\n * Open the tab on page load. If this script loads before theme_boost/tab we need to open tab ourselves\n *\n * @param {String} tabName\n * @return {Boolean}\n */\nconst openTab = (tabName) => {\n const tab = getTab(tabName);\n if (!tab) {\n return false;\n }\n\n loadTab(tabName);\n tab.classList.add('active');\n getTabPane(tabName).classList.add('active', 'show');\n return true;\n};\n\n/**\n * If there is a location hash that is the same as the tab name - open this tab.\n *\n * @return {Boolean}\n */\nconst openTabFromHash = () => {\n const hash = document.location.hash;\n if (hash.match(/^#\\w+$/g)) {\n return openTab(hash.replace(/^#/g, ''));\n }\n\n return false;\n};\n"],"names":["SELECTORS","dynamicTabs","activeTab","allActiveTabs","tabContent","tabToggle","tabPane","tabName","watchedFormDirtyNotification","document","querySelectorAll","forEach","addEventListener","event","preventDefault","stopPropagation","saveCancelPromise","triggerElement","then","dispatchEvent","Event","bubbles","catch","finally","previousTabName","getActiveTabName","querySelector","forTabName","textContent","getElementById","getAttribute","replace","loadTab","id","openTabFromHash","tabs","openTab","classList","add","element","dataset","getFirstTabName","tab","pendingPromise","Pending","tabLabelledBy","innerText","tabArgs","tabClass","JSON","stringify","response","Promise","all","javascript","Templates","renderForPromise","template","parse","content","_ref2","responseJs","html","js","replaceNodeContents","resolve","Notification","exception","forTabId","getTab","getTabPane","hash","location","match"],"mappings":";;;;;;;oOAiCMA,UAAY,CACdC,YAAa,eACbC,UAAW,gCACXC,cAAe,8DACfC,WAAY,4CACZC,UAAW,0BACXC,QAAS,yBAGbN,WAAuBO,mDAA8CA,cACrEP,SAAqBO,8DAAyDA,mBAE1EC,8BAA+B,gBAKf,QACGC,SAASC,iBAAiBV,UAAUK,WAC5CM,SAAQN,YAEfA,UAAUO,iBAAiB,eAAgBC,YACnC,iDACAA,MAAMC,iBACND,MAAME,uBAGDP,+BACDA,8BAA+B,wBAElBQ,mBACT,kBAAU,gBACV,kBAAU,4BACV,kBAAU,WACV,CAACC,eAAgBZ,YACnBa,MAAK,kDAGHb,UAAUc,cAAc,IAAIC,MAAM,QAAS,CAACC,SAAS,QAEtDC,OAAM,SAENC,SAAQ,KACPf,8BAA+B,aAQrCgB,gBAAkBC,sBACpBD,gBAAiB,CACGf,SAASiB,cAAc1B,UAAU2B,WAAWH,kBACpDI,YAAc,OAIlCvB,UAAUO,iBAAiB,gBAAgB,WACjCN,QAAUG,SAASoB,eAAexB,UAAUyB,aAAa,QAAQC,QAAQ,KAAM,KACjFzB,SACA0B,QAAQ1B,QAAQ2B,WAKvBC,kBAAmB,OACdC,KAAO1B,SAASiB,cAAc1B,UAAUG,kBAC1CgC,KACAC,QAAQD,KAAKL,aAAa,sBACvB,OAEGxB,QAAUG,SAASiB,cAAc1B,UAAUM,SAC7CA,UACAA,QAAQ+B,UAAUC,IAAI,SAAU,QAChCN,QAAQ1B,QAAQwB,aAAa,iBAWvCL,iBAAmB,WACfc,QAAU9B,SAASiB,cAAc1B,UAAUE,kBAC1CqC,MAAAA,eAAAA,QAAST,aAAa,mBAAoB,MAkB/CE,QAAWzB,4BAEbA,sCAAUA,qCAAWkB,wCAZD,YACdc,QAAU9B,SAASiB,cAAc1B,UAAUI,mBAC1CmC,MAAAA,eAAAA,QAASC,QAAQpC,aAAc,MAUKqC,SACrCC,IAAMjC,SAASiB,cAAc1B,UAAU2B,WAAWpB,cACnDmC,iBAICC,eAAiB,IAAIC,iBAAQ,6BAA+BrC,SAE5DsC,cAAgBpC,SAASoB,eAAea,IAAIZ,aAAa,qDAC9Ce,cAAcC,+CAEZJ,KAClBxB,MAAK,SACE6B,QAAU,IAAIL,IAAIF,uBACfO,QAAQC,gBACRD,QAAQ3C,YACR,4BAAWsC,IAAIF,QAAQQ,SAAUC,KAAKC,UAAUH,aAE1D7B,MAAKiC,UAAYC,QAAQC,IAAI,EAC1B,wCAA2BF,SAASG,YACpCC,mBAAUC,iBAAiBL,SAASM,SAAUR,KAAKS,MAAMP,SAASQ,cAErEzC,MAAK0C,YAAEC,YAAYC,KAACA,KAADC,GAAOA,kBAASR,mBAAUS,oBAAoBtB,IAAKoB,KAAMC,GAAKF,eACjF3C,MAAK,IAAMyB,eAAesB,YAC1B3C,MAAM4C,sBAAaC,YA6BlB/B,QAAW7B,gBACPmC,IArBMnC,CAAAA,SACLE,SAASiB,cAAc1B,UAAUoE,SAAS7D,UAoBrC8D,CAAO9D,iBACdmC,MAILV,QAAQzB,SACRmC,IAAIL,UAAUC,IAAI,UAjBF/B,CAAAA,SACTE,SAASoB,eAAetB,SAiB/B+D,CAAW/D,SAAS8B,UAAUC,IAAI,SAAU,SACrC,IAQLJ,gBAAkB,WACdqC,KAAO9D,SAAS+D,SAASD,aAC3BA,KAAKE,MAAM,YACJrC,QAAQmC,KAAKxC,QAAQ,MAAO"} \ No newline at end of file diff --git a/lib/amd/src/dynamic_tabs.js b/lib/amd/src/dynamic_tabs.js index e5e66170b43..6cae6fa66da 100644 --- a/lib/amd/src/dynamic_tabs.js +++ b/lib/amd/src/dynamic_tabs.js @@ -21,13 +21,13 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -import $ from 'jquery'; -import Templates from 'core/templates'; +import {processCollectedJavascript} from 'core/fragment'; import {addIconToContainer} from 'core/loadingicon'; import Notification from 'core/notification'; import {prependPageTitle} from 'core/page_title'; import Pending from 'core/pending'; import {getString} from 'core/str'; +import Templates from 'core/templates'; import {getContent} from 'core/local/repository/dynamic_tabs'; import {isAnyWatchedFormDirty, resetAllFormDirtyStates} from 'core_form/changechecker'; @@ -158,7 +158,7 @@ const loadTab = (tabName) => { return getContent(tab.dataset.tabClass, JSON.stringify(tabArgs)); }) .then(response => Promise.all([ - $.parseHTML(response.javascript, null, true).map(node => node.innerHTML).join("\n"), + processCollectedJavascript(response.javascript), Templates.renderForPromise(response.template, JSON.parse(response.content)), ])) .then(([responseJs, {html, js}]) => Templates.replaceNodeContents(tab, html, js + responseJs)) diff --git a/reportbuilder/amd/build/editor.min.js b/reportbuilder/amd/build/editor.min.js index 87dc787c749..b592773b461 100644 --- a/reportbuilder/amd/build/editor.min.js +++ b/reportbuilder/amd/build/editor.min.js @@ -1,3 +1,3 @@ -define("core_reportbuilder/editor",["exports","jquery","core/inplace_editable","core/loadingicon","core/notification","core/pending","core/templates","core/str","core/toast","core_reportbuilder/local/selectors","core_reportbuilder/local/editor/columns","core_reportbuilder/local/editor/conditions","core_reportbuilder/local/editor/filters","core_reportbuilder/local/editor/sorting","core_reportbuilder/local/editor/card_view","core_reportbuilder/local/repository/reports","core_reportbuilder/local/repository/modals"],(function(_exports,_jquery,_inplace_editable,_loadingicon,_notification,_pending,_templates,_str,_toast,reportSelectors,_columns,_conditions,_filters,_sorting,_card_view,_reports,_modals){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)}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_jquery=_interopRequireDefault(_jquery),_notification=_interopRequireDefault(_notification),_pending=_interopRequireDefault(_pending),_templates=_interopRequireDefault(_templates),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);let initialized=!1;_exports.init=()=>{(0,_columns.init)(initialized),(0,_conditions.init)(initialized),(0,_filters.init)(initialized),(0,_sorting.init)(initialized),(0,_card_view.init)(initialized),initialized||(document.addEventListener("click",(event=>{const toggleEditViewMode=event.target.closest(reportSelectors.actions.toggleEditPreview);if(toggleEditViewMode){event.preventDefault();const reportElement=event.target.closest(reportSelectors.regions.report),pendingPromise=new _pending.default("core_reportbuilder/reports:get"),toggledEditMode="1"!==toggleEditViewMode.dataset.editMode;(0,_loadingicon.addIconToContainer)(toggleEditViewMode).then((()=>(0,_reports.getReport)(reportElement.dataset.reportId,toggledEditMode))).then((response=>Promise.all([_jquery.default.parseHTML(response.javascript,null,!0).map((node=>node.innerHTML)).join("\n"),_templates.default.renderForPromise("core_reportbuilder/local/dynamictabs/editor",response)]))).then((_ref=>{let[responseJs,{html:html,js:js}]=_ref;return _templates.default.replaceNode(reportElement,html,js+responseJs)})).then((()=>pendingPromise.resolve())).catch(_notification.default.exception)}const reportEdit=event.target.closest(reportSelectors.actions.reportEdit);if(reportEdit){event.preventDefault();const reportModal=(0,_modals.createReportModal)(event.target,(0,_str.getString)("editreportdetails","core_reportbuilder"),reportEdit.dataset.reportId);reportModal.addEventListener(reportModal.events.FORM_SUBMITTED,(()=>{(0,_str.getString)("reportupdated","core_reportbuilder").then(_toast.add).then((()=>window.location.reload())).catch(_notification.default.exception)})),reportModal.show()}})),initialized=!0)}})); +define("core_reportbuilder/editor",["exports","core/fragment","core/inplace_editable","core/loadingicon","core/notification","core/pending","core/templates","core/str","core/toast","core_reportbuilder/local/selectors","core_reportbuilder/local/editor/columns","core_reportbuilder/local/editor/conditions","core_reportbuilder/local/editor/filters","core_reportbuilder/local/editor/sorting","core_reportbuilder/local/editor/card_view","core_reportbuilder/local/repository/reports","core_reportbuilder/local/repository/modals"],(function(_exports,_fragment,_inplace_editable,_loadingicon,_notification,_pending,_templates,_str,_toast,reportSelectors,_columns,_conditions,_filters,_sorting,_card_view,_reports,_modals){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)}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_notification=_interopRequireDefault(_notification),_pending=_interopRequireDefault(_pending),_templates=_interopRequireDefault(_templates),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);let initialized=!1;_exports.init=()=>{(0,_columns.init)(initialized),(0,_conditions.init)(initialized),(0,_filters.init)(initialized),(0,_sorting.init)(initialized),(0,_card_view.init)(initialized),initialized||(document.addEventListener("click",(event=>{const toggleEditViewMode=event.target.closest(reportSelectors.actions.toggleEditPreview);if(toggleEditViewMode){event.preventDefault();const reportElement=event.target.closest(reportSelectors.regions.report),pendingPromise=new _pending.default("core_reportbuilder/reports:get"),toggledEditMode="1"!==toggleEditViewMode.dataset.editMode;(0,_loadingicon.addIconToContainer)(toggleEditViewMode).then((()=>(0,_reports.getReport)(reportElement.dataset.reportId,toggledEditMode))).then((response=>Promise.all([(0,_fragment.processCollectedJavascript)(response.javascript),_templates.default.renderForPromise("core_reportbuilder/local/dynamictabs/editor",response)]))).then((_ref=>{let[responseJs,{html:html,js:js}]=_ref;return _templates.default.replaceNode(reportElement,html,js+responseJs)})).then((()=>pendingPromise.resolve())).catch(_notification.default.exception)}const reportEdit=event.target.closest(reportSelectors.actions.reportEdit);if(reportEdit){event.preventDefault();const reportModal=(0,_modals.createReportModal)(event.target,(0,_str.getString)("editreportdetails","core_reportbuilder"),reportEdit.dataset.reportId);reportModal.addEventListener(reportModal.events.FORM_SUBMITTED,(()=>{(0,_str.getString)("reportupdated","core_reportbuilder").then(_toast.add).then((()=>window.location.reload())).catch(_notification.default.exception)})),reportModal.show()}})),initialized=!0)}})); //# sourceMappingURL=editor.min.js.map \ No newline at end of file diff --git a/reportbuilder/amd/build/editor.min.js.map b/reportbuilder/amd/build/editor.min.js.map index d8511b95c62..18cd668d54a 100644 --- a/reportbuilder/amd/build/editor.min.js.map +++ b/reportbuilder/amd/build/editor.min.js.map @@ -1 +1 @@ -{"version":3,"file":"editor.min.js","sources":["../src/editor.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 editor\n *\n * @module core_reportbuilder/editor\n * @copyright 2021 David Matamoros \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n\"use strict\";\n\nimport $ from 'jquery';\nimport 'core/inplace_editable';\nimport {addIconToContainer} from 'core/loadingicon';\nimport Notification from 'core/notification';\nimport Pending from 'core/pending';\nimport Templates from 'core/templates';\nimport {getString} from 'core/str';\nimport {add as addToast} from 'core/toast';\nimport * as reportSelectors from 'core_reportbuilder/local/selectors';\nimport {init as columnsEditorInit} from 'core_reportbuilder/local/editor/columns';\nimport {init as conditionsEditorInit} from 'core_reportbuilder/local/editor/conditions';\nimport {init as filtersEditorInit} from 'core_reportbuilder/local/editor/filters';\nimport {init as sortingEditorInit} from 'core_reportbuilder/local/editor/sorting';\nimport {init as cardviewEditorInit} from 'core_reportbuilder/local/editor/card_view';\nimport {getReport} from 'core_reportbuilder/local/repository/reports';\nimport {createReportModal} from 'core_reportbuilder/local/repository/modals';\n\nlet initialized = false;\n\n/**\n * Initialise editor and all it's modules\n */\nexport const init = () => {\n columnsEditorInit(initialized);\n conditionsEditorInit(initialized);\n filtersEditorInit(initialized);\n sortingEditorInit(initialized);\n cardviewEditorInit(initialized);\n\n // Ensure we only add our listeners once (can be called multiple times by mustache template).\n if (initialized) {\n return;\n }\n\n // Add event handlers to generic report editor elements.\n document.addEventListener('click', event => {\n\n // Toggle between edit and preview mode.\n const toggleEditViewMode = event.target.closest(reportSelectors.actions.toggleEditPreview);\n if (toggleEditViewMode) {\n event.preventDefault();\n\n const reportElement = event.target.closest(reportSelectors.regions.report);\n const pendingPromise = new Pending('core_reportbuilder/reports:get');\n const toggledEditMode = toggleEditViewMode.dataset.editMode !== \"1\";\n\n addIconToContainer(toggleEditViewMode)\n .then(() => getReport(reportElement.dataset.reportId, toggledEditMode))\n .then(response => Promise.all([\n $.parseHTML(response.javascript, null, true).map(node => node.innerHTML).join(\"\\n\"),\n Templates.renderForPromise('core_reportbuilder/local/dynamictabs/editor', response),\n ]))\n .then(([responseJs, {html, js}]) => Templates.replaceNode(reportElement, html, js + responseJs))\n .then(() => pendingPromise.resolve())\n .catch(Notification.exception);\n }\n\n // Edit report details modal.\n const reportEdit = event.target.closest(reportSelectors.actions.reportEdit);\n if (reportEdit) {\n event.preventDefault();\n\n const reportModal = createReportModal(event.target, getString('editreportdetails', 'core_reportbuilder'),\n reportEdit.dataset.reportId);\n reportModal.addEventListener(reportModal.events.FORM_SUBMITTED, () => {\n getString('reportupdated', 'core_reportbuilder')\n .then(addToast)\n .then(() => {\n return window.location.reload();\n })\n .catch(Notification.exception);\n });\n reportModal.show();\n }\n });\n\n initialized = true;\n};\n"],"names":["initialized","document","addEventListener","event","toggleEditViewMode","target","closest","reportSelectors","actions","toggleEditPreview","preventDefault","reportElement","regions","report","pendingPromise","Pending","toggledEditMode","dataset","editMode","then","reportId","response","Promise","all","$","parseHTML","javascript","map","node","innerHTML","join","Templates","renderForPromise","_ref","responseJs","html","js","replaceNode","resolve","catch","Notification","exception","reportEdit","reportModal","events","FORM_SUBMITTED","addToast","window","location","reload","show"],"mappings":"09DA0CIA,aAAc,gBAKE,uBACEA,kCACGA,+BACHA,+BACAA,iCACCA,aAGfA,cAKJC,SAASC,iBAAiB,SAASC,cAGzBC,mBAAqBD,MAAME,OAAOC,QAAQC,gBAAgBC,QAAQC,sBACpEL,mBAAoB,CACpBD,MAAMO,uBAEAC,cAAgBR,MAAME,OAAOC,QAAQC,gBAAgBK,QAAQC,QAC7DC,eAAiB,IAAIC,iBAAQ,kCAC7BC,gBAA0D,MAAxCZ,mBAAmBa,QAAQC,6CAEhCd,oBACde,MAAK,KAAM,sBAAUR,cAAcM,QAAQG,SAAUJ,mBACrDG,MAAKE,UAAYC,QAAQC,IAAI,CAC1BC,gBAAEC,UAAUJ,SAASK,WAAY,MAAM,GAAMC,KAAIC,MAAQA,KAAKC,YAAWC,KAAK,MAC9EC,mBAAUC,iBAAiB,8CAA+CX,cAE7EF,MAAKc,WAAEC,YAAYC,KAACA,KAADC,GAAOA,iBAASL,mBAAUM,YAAY1B,cAAewB,KAAMC,GAAKF,eACnFf,MAAK,IAAML,eAAewB,YAC1BC,MAAMC,sBAAaC,iBAItBC,WAAavC,MAAME,OAAOC,QAAQC,gBAAgBC,QAAQkC,eAC5DA,WAAY,CACZvC,MAAMO,uBAEAiC,aAAc,6BAAkBxC,MAAME,QAAQ,kBAAU,oBAAqB,sBAC/EqC,WAAWzB,QAAQG,UACvBuB,YAAYzC,iBAAiByC,YAAYC,OAAOC,gBAAgB,wBAClD,gBAAiB,sBACtB1B,KAAK2B,YACL3B,MAAK,IACK4B,OAAOC,SAASC,WAE1BV,MAAMC,sBAAaC,cAE5BE,YAAYO,WAIpBlD,aAAc"} \ No newline at end of file +{"version":3,"file":"editor.min.js","sources":["../src/editor.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 editor\n *\n * @module core_reportbuilder/editor\n * @copyright 2021 David Matamoros \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n\"use strict\";\n\nimport {processCollectedJavascript} from 'core/fragment';\nimport 'core/inplace_editable';\nimport {addIconToContainer} from 'core/loadingicon';\nimport Notification from 'core/notification';\nimport Pending from 'core/pending';\nimport Templates from 'core/templates';\nimport {getString} from 'core/str';\nimport {add as addToast} from 'core/toast';\nimport * as reportSelectors from 'core_reportbuilder/local/selectors';\nimport {init as columnsEditorInit} from 'core_reportbuilder/local/editor/columns';\nimport {init as conditionsEditorInit} from 'core_reportbuilder/local/editor/conditions';\nimport {init as filtersEditorInit} from 'core_reportbuilder/local/editor/filters';\nimport {init as sortingEditorInit} from 'core_reportbuilder/local/editor/sorting';\nimport {init as cardviewEditorInit} from 'core_reportbuilder/local/editor/card_view';\nimport {getReport} from 'core_reportbuilder/local/repository/reports';\nimport {createReportModal} from 'core_reportbuilder/local/repository/modals';\n\nlet initialized = false;\n\n/**\n * Initialise editor and all it's modules\n */\nexport const init = () => {\n columnsEditorInit(initialized);\n conditionsEditorInit(initialized);\n filtersEditorInit(initialized);\n sortingEditorInit(initialized);\n cardviewEditorInit(initialized);\n\n // Ensure we only add our listeners once (can be called multiple times by mustache template).\n if (initialized) {\n return;\n }\n\n // Add event handlers to generic report editor elements.\n document.addEventListener('click', event => {\n\n // Toggle between edit and preview mode.\n const toggleEditViewMode = event.target.closest(reportSelectors.actions.toggleEditPreview);\n if (toggleEditViewMode) {\n event.preventDefault();\n\n const reportElement = event.target.closest(reportSelectors.regions.report);\n const pendingPromise = new Pending('core_reportbuilder/reports:get');\n const toggledEditMode = toggleEditViewMode.dataset.editMode !== \"1\";\n\n addIconToContainer(toggleEditViewMode)\n .then(() => getReport(reportElement.dataset.reportId, toggledEditMode))\n .then(response => Promise.all([\n processCollectedJavascript(response.javascript),\n Templates.renderForPromise('core_reportbuilder/local/dynamictabs/editor', response),\n ]))\n .then(([responseJs, {html, js}]) => Templates.replaceNode(reportElement, html, js + responseJs))\n .then(() => pendingPromise.resolve())\n .catch(Notification.exception);\n }\n\n // Edit report details modal.\n const reportEdit = event.target.closest(reportSelectors.actions.reportEdit);\n if (reportEdit) {\n event.preventDefault();\n\n const reportModal = createReportModal(event.target, getString('editreportdetails', 'core_reportbuilder'),\n reportEdit.dataset.reportId);\n reportModal.addEventListener(reportModal.events.FORM_SUBMITTED, () => {\n getString('reportupdated', 'core_reportbuilder')\n .then(addToast)\n .then(() => {\n return window.location.reload();\n })\n .catch(Notification.exception);\n });\n reportModal.show();\n }\n });\n\n initialized = true;\n};\n"],"names":["initialized","document","addEventListener","event","toggleEditViewMode","target","closest","reportSelectors","actions","toggleEditPreview","preventDefault","reportElement","regions","report","pendingPromise","Pending","toggledEditMode","dataset","editMode","then","reportId","response","Promise","all","javascript","Templates","renderForPromise","_ref","responseJs","html","js","replaceNode","resolve","catch","Notification","exception","reportEdit","reportModal","events","FORM_SUBMITTED","addToast","window","location","reload","show"],"mappings":"27DA0CIA,aAAc,gBAKE,uBACEA,kCACGA,+BACHA,+BACAA,iCACCA,aAGfA,cAKJC,SAASC,iBAAiB,SAASC,cAGzBC,mBAAqBD,MAAME,OAAOC,QAAQC,gBAAgBC,QAAQC,sBACpEL,mBAAoB,CACpBD,MAAMO,uBAEAC,cAAgBR,MAAME,OAAOC,QAAQC,gBAAgBK,QAAQC,QAC7DC,eAAiB,IAAIC,iBAAQ,kCAC7BC,gBAA0D,MAAxCZ,mBAAmBa,QAAQC,6CAEhCd,oBACde,MAAK,KAAM,sBAAUR,cAAcM,QAAQG,SAAUJ,mBACrDG,MAAKE,UAAYC,QAAQC,IAAI,EAC1B,wCAA2BF,SAASG,YACpCC,mBAAUC,iBAAiB,8CAA+CL,cAE7EF,MAAKQ,WAAEC,YAAYC,KAACA,KAADC,GAAOA,iBAASL,mBAAUM,YAAYpB,cAAekB,KAAMC,GAAKF,eACnFT,MAAK,IAAML,eAAekB,YAC1BC,MAAMC,sBAAaC,iBAItBC,WAAajC,MAAME,OAAOC,QAAQC,gBAAgBC,QAAQ4B,eAC5DA,WAAY,CACZjC,MAAMO,uBAEA2B,aAAc,6BAAkBlC,MAAME,QAAQ,kBAAU,oBAAqB,sBAC/E+B,WAAWnB,QAAQG,UACvBiB,YAAYnC,iBAAiBmC,YAAYC,OAAOC,gBAAgB,wBAClD,gBAAiB,sBACtBpB,KAAKqB,YACLrB,MAAK,IACKsB,OAAOC,SAASC,WAE1BV,MAAMC,sBAAaC,cAE5BE,YAAYO,WAIpB5C,aAAc"} \ No newline at end of file diff --git a/reportbuilder/amd/build/local/editor/conditions.min.js b/reportbuilder/amd/build/local/editor/conditions.min.js index 0fc2b4a9a9b..f55e89f2055 100644 --- a/reportbuilder/amd/build/local/editor/conditions.min.js +++ b/reportbuilder/amd/build/local/editor/conditions.min.js @@ -1,3 +1,3 @@ -define("core_reportbuilder/local/editor/conditions",["exports","jquery","core/event_dispatcher","core/form-autocomplete","core/inplace_editable","core/notification","core/pending","core/prefetch","core/sortable_list","core/str","core/templates","core/toast","core_form/dynamicform","core_reportbuilder/local/events","core_reportbuilder/local/selectors","core_reportbuilder/local/repository/conditions"],(function(_exports,_jquery,_event_dispatcher,_formAutocomplete,_inplace_editable,_notification,_pending,_prefetch,_sortable_list,_str,_templates,_toast,_dynamicform,reportEvents,reportSelectors,_conditions){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)}function _interopRequireWildcard(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]}return newObj.default=obj,cache&&cache.set(obj,newObj),newObj}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_jquery=_interopRequireDefault(_jquery),_formAutocomplete=_interopRequireDefault(_formAutocomplete),_notification=_interopRequireDefault(_notification),_pending=_interopRequireDefault(_pending),_sortable_list=_interopRequireDefault(_sortable_list),_templates=_interopRequireDefault(_templates),_dynamicform=_interopRequireDefault(_dynamicform),reportEvents=_interopRequireWildcard(reportEvents),reportSelectors=_interopRequireWildcard(reportSelectors);const reloadSettingsConditionsRegion=(reportElement,templateContext)=>{const pendingPromise=new _pending.default("core_reportbuilder/conditions:reload"),settingsConditionsRegion=reportElement.querySelector(reportSelectors.regions.settingsConditions);return _templates.default.renderForPromise("core_reportbuilder/local/settings/conditions",{conditions:templateContext}).then((_ref=>{let{html:html,js:js}=_ref;const conditionsjs=_jquery.default.parseHTML(templateContext.javascript,null,!0).map((node=>node.innerHTML)).join("\n");_templates.default.replaceNode(settingsConditionsRegion,html,js+conditionsjs),initConditionsForm();const reportAddCondition=reportElement.querySelector(reportSelectors.actions.reportAddCondition);return null==reportAddCondition||reportAddCondition.focus(),pendingPromise.resolve()}))},initConditionsForm=()=>{const reportElement=document.querySelector(reportSelectors.regions.report),reportAddCondition=reportElement.querySelector(reportSelectors.actions.reportAddCondition);_formAutocomplete.default.enhanceField(reportAddCondition,!1,"",(0,_str.getString)("selectacondition","core_reportbuilder")).catch(_notification.default.exception);const conditionFormContainer=reportElement.querySelector(reportSelectors.regions.settingsConditions);if(!conditionFormContainer)return;const conditionForm=new _dynamicform.default(conditionFormContainer,"\\core_reportbuilder\\form\\condition");conditionForm.addEventListener(conditionForm.events.FORM_SUBMITTED,(event=>{event.preventDefault(),(0,_str.getString)("conditionsapplied","core_reportbuilder").then(_toast.add).catch(_notification.default.exception),(0,_event_dispatcher.dispatchEvent)(reportEvents.tableReload,{},reportElement)})),conditionForm.addEventListener(conditionForm.events.NOSUBMIT_BUTTON_PRESSED,(event=>{event.preventDefault(),_notification.default.saveCancelPromise((0,_str.getString)("resetconditions","core_reportbuilder"),(0,_str.getString)("resetconditionsconfirm","core_reportbuilder"),(0,_str.getString)("resetall","core_reportbuilder"),{triggerElement:event.detail}).then((()=>{const pendingPromise=new _pending.default("core_reportbuilder/conditions:reset");return(0,_conditions.resetConditions)(reportElement.dataset.reportId).then((data=>reloadSettingsConditionsRegion(reportElement,data))).then((()=>(0,_toast.add)((0,_str.getString)("conditionsreset","core_reportbuilder")))).then((()=>((0,_event_dispatcher.dispatchEvent)(reportEvents.tableReload,{},reportElement),pendingPromise.resolve()))).catch(_notification.default.exception)})).catch((()=>{}))}))};_exports.init=initialized=>{if((0,_prefetch.prefetchStrings)("core_reportbuilder",["conditionadded","conditiondeleted","conditionmoved","conditionsapplied","conditionsreset","deletecondition","deleteconditionconfirm","resetall","resetconditions","resetconditionsconfirm","selectacondition"]),(0,_prefetch.prefetchStrings)("core",["delete"]),initConditionsForm(),initialized)return;document.addEventListener("change",(event=>{const reportAddCondition=event.target.closest(reportSelectors.actions.reportAddCondition);if(reportAddCondition){if(event.preventDefault(),""===reportAddCondition.value||"0"===reportAddCondition.value)return;const reportElement=reportAddCondition.closest(reportSelectors.regions.report),pendingPromise=new _pending.default("core_reportbuilder/conditions:add");(0,_conditions.addCondition)(reportElement.dataset.reportId,reportAddCondition.value).then((data=>reloadSettingsConditionsRegion(reportElement,data))).then((()=>(0,_str.getString)("conditionadded","core_reportbuilder",reportAddCondition.options[reportAddCondition.selectedIndex].text))).then(_toast.add).then((()=>((0,_event_dispatcher.dispatchEvent)(reportEvents.tableReload,{},reportElement),pendingPromise.resolve()))).catch(_notification.default.exception)}})),document.addEventListener("click",(event=>{const reportRemoveCondition=event.target.closest(reportSelectors.actions.reportRemoveCondition);if(reportRemoveCondition){event.preventDefault();const reportElement=reportRemoveCondition.closest(reportSelectors.regions.report),conditionContainer=reportRemoveCondition.closest(reportSelectors.regions.activeCondition),conditionName=conditionContainer.dataset.conditionName;_notification.default.saveCancelPromise((0,_str.getString)("deletecondition","core_reportbuilder",conditionName),(0,_str.getString)("deleteconditionconfirm","core_reportbuilder",conditionName),(0,_str.getString)("delete","core"),{triggerElement:reportRemoveCondition}).then((()=>{const pendingPromise=new _pending.default("core_reportbuilder/conditions:remove");return(0,_conditions.deleteCondition)(reportElement.dataset.reportId,conditionContainer.dataset.conditionId).then((data=>reloadSettingsConditionsRegion(reportElement,data))).then((()=>(0,_toast.add)((0,_str.getString)("conditiondeleted","core_reportbuilder",conditionName)))).then((()=>((0,_event_dispatcher.dispatchEvent)(reportEvents.tableReload,{},reportElement),pendingPromise.resolve()))).catch(_notification.default.exception)})).catch((()=>{}))}}));const activeConditionsSelector=reportSelectors.regions.activeConditions;new _sortable_list.default(activeConditionsSelector,{isHorizontal:!1}).getElementName=element=>Promise.resolve(element.data("conditionName")),document.addEventListener(_sortable_list.default.EVENTS.elementDrop,(event=>{const reportOrderCondition=event.target.closest("".concat(activeConditionsSelector," ").concat(reportSelectors.regions.activeCondition));if(reportOrderCondition&&event.detail.positionChanged){const pendingPromise=new _pending.default("core_reportbuilder/conditions:reorder"),reportElement=reportOrderCondition.closest(reportSelectors.regions.report),{conditionId:conditionId,conditionPosition:conditionPosition,conditionName:conditionName}=reportOrderCondition.dataset;let targetConditionPosition=event.detail.targetNextElement.data("conditionPosition")||event.detail.element.siblings().length+2;targetConditionPosition>conditionPosition&&targetConditionPosition--;const reorderPromise=(0,_conditions.reorderCondition)(reportElement.dataset.reportId,conditionId,targetConditionPosition);Promise.all([reorderPromise,new Promise((resolve=>setTimeout(resolve,1e3)))]).then((_ref2=>{let[data]=_ref2;return reloadSettingsConditionsRegion(reportElement,data)})).then((()=>(0,_str.getString)("conditionmoved","core_reportbuilder",conditionName))).then(_toast.add).then((()=>((0,_event_dispatcher.dispatchEvent)(reportEvents.tableReload,{},reportElement),pendingPromise.resolve()))).catch(_notification.default.exception)}}))}})); +define("core_reportbuilder/local/editor/conditions",["exports","core/event_dispatcher","core/form-autocomplete","core/fragment","core/inplace_editable","core/notification","core/pending","core/prefetch","core/sortable_list","core/str","core/templates","core/toast","core_form/dynamicform","core_reportbuilder/local/events","core_reportbuilder/local/selectors","core_reportbuilder/local/repository/conditions"],(function(_exports,_event_dispatcher,_formAutocomplete,_fragment,_inplace_editable,_notification,_pending,_prefetch,_sortable_list,_str,_templates,_toast,_dynamicform,reportEvents,reportSelectors,_conditions){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)}function _interopRequireWildcard(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]}return newObj.default=obj,cache&&cache.set(obj,newObj),newObj}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_formAutocomplete=_interopRequireDefault(_formAutocomplete),_notification=_interopRequireDefault(_notification),_pending=_interopRequireDefault(_pending),_sortable_list=_interopRequireDefault(_sortable_list),_templates=_interopRequireDefault(_templates),_dynamicform=_interopRequireDefault(_dynamicform),reportEvents=_interopRequireWildcard(reportEvents),reportSelectors=_interopRequireWildcard(reportSelectors);const reloadSettingsConditionsRegion=(reportElement,templateContext)=>{const pendingPromise=new _pending.default("core_reportbuilder/conditions:reload"),settingsConditionsRegion=reportElement.querySelector(reportSelectors.regions.settingsConditions);return Promise.all([(0,_fragment.processCollectedJavascript)(templateContext.javascript),_templates.default.renderForPromise("core_reportbuilder/local/settings/conditions",{conditions:templateContext})]).then((_ref=>{let[templateJs,{html:html,js:js}]=_ref;return _templates.default.replaceNode(settingsConditionsRegion,html,js+templateJs)})).then((()=>{initConditionsForm();const reportAddCondition=reportElement.querySelector(reportSelectors.actions.reportAddCondition);return null==reportAddCondition||reportAddCondition.focus(),pendingPromise.resolve()}))},initConditionsForm=()=>{const reportElement=document.querySelector(reportSelectors.regions.report),reportAddCondition=reportElement.querySelector(reportSelectors.actions.reportAddCondition);_formAutocomplete.default.enhanceField(reportAddCondition,!1,"",(0,_str.getString)("selectacondition","core_reportbuilder")).catch(_notification.default.exception);const conditionFormContainer=reportElement.querySelector(reportSelectors.regions.settingsConditions);if(!conditionFormContainer)return;const conditionForm=new _dynamicform.default(conditionFormContainer,"\\core_reportbuilder\\form\\condition");conditionForm.addEventListener(conditionForm.events.FORM_SUBMITTED,(event=>{event.preventDefault(),(0,_str.getString)("conditionsapplied","core_reportbuilder").then(_toast.add).catch(_notification.default.exception),(0,_event_dispatcher.dispatchEvent)(reportEvents.tableReload,{},reportElement)})),conditionForm.addEventListener(conditionForm.events.NOSUBMIT_BUTTON_PRESSED,(event=>{event.preventDefault(),_notification.default.saveCancelPromise((0,_str.getString)("resetconditions","core_reportbuilder"),(0,_str.getString)("resetconditionsconfirm","core_reportbuilder"),(0,_str.getString)("resetall","core_reportbuilder"),{triggerElement:event.detail}).then((()=>{const pendingPromise=new _pending.default("core_reportbuilder/conditions:reset");return(0,_conditions.resetConditions)(reportElement.dataset.reportId).then((data=>reloadSettingsConditionsRegion(reportElement,data))).then((()=>(0,_toast.add)((0,_str.getString)("conditionsreset","core_reportbuilder")))).then((()=>((0,_event_dispatcher.dispatchEvent)(reportEvents.tableReload,{},reportElement),pendingPromise.resolve()))).catch(_notification.default.exception)})).catch((()=>{}))}))};_exports.init=initialized=>{if((0,_prefetch.prefetchStrings)("core_reportbuilder",["conditionadded","conditiondeleted","conditionmoved","conditionsapplied","conditionsreset","deletecondition","deleteconditionconfirm","resetall","resetconditions","resetconditionsconfirm","selectacondition"]),(0,_prefetch.prefetchStrings)("core",["delete"]),initConditionsForm(),initialized)return;document.addEventListener("change",(event=>{const reportAddCondition=event.target.closest(reportSelectors.actions.reportAddCondition);if(reportAddCondition){if(event.preventDefault(),""===reportAddCondition.value||"0"===reportAddCondition.value)return;const reportElement=reportAddCondition.closest(reportSelectors.regions.report),pendingPromise=new _pending.default("core_reportbuilder/conditions:add");(0,_conditions.addCondition)(reportElement.dataset.reportId,reportAddCondition.value).then((data=>reloadSettingsConditionsRegion(reportElement,data))).then((()=>(0,_str.getString)("conditionadded","core_reportbuilder",reportAddCondition.options[reportAddCondition.selectedIndex].text))).then(_toast.add).then((()=>((0,_event_dispatcher.dispatchEvent)(reportEvents.tableReload,{},reportElement),pendingPromise.resolve()))).catch(_notification.default.exception)}})),document.addEventListener("click",(event=>{const reportRemoveCondition=event.target.closest(reportSelectors.actions.reportRemoveCondition);if(reportRemoveCondition){event.preventDefault();const reportElement=reportRemoveCondition.closest(reportSelectors.regions.report),conditionContainer=reportRemoveCondition.closest(reportSelectors.regions.activeCondition),conditionName=conditionContainer.dataset.conditionName;_notification.default.saveCancelPromise((0,_str.getString)("deletecondition","core_reportbuilder",conditionName),(0,_str.getString)("deleteconditionconfirm","core_reportbuilder",conditionName),(0,_str.getString)("delete","core"),{triggerElement:reportRemoveCondition}).then((()=>{const pendingPromise=new _pending.default("core_reportbuilder/conditions:remove");return(0,_conditions.deleteCondition)(reportElement.dataset.reportId,conditionContainer.dataset.conditionId).then((data=>reloadSettingsConditionsRegion(reportElement,data))).then((()=>(0,_toast.add)((0,_str.getString)("conditiondeleted","core_reportbuilder",conditionName)))).then((()=>((0,_event_dispatcher.dispatchEvent)(reportEvents.tableReload,{},reportElement),pendingPromise.resolve()))).catch(_notification.default.exception)})).catch((()=>{}))}}));const activeConditionsSelector=reportSelectors.regions.activeConditions;new _sortable_list.default(activeConditionsSelector,{isHorizontal:!1}).getElementName=element=>Promise.resolve(element.data("conditionName")),document.addEventListener(_sortable_list.default.EVENTS.elementDrop,(event=>{const reportOrderCondition=event.target.closest("".concat(activeConditionsSelector," ").concat(reportSelectors.regions.activeCondition));if(reportOrderCondition&&event.detail.positionChanged){const pendingPromise=new _pending.default("core_reportbuilder/conditions:reorder"),reportElement=reportOrderCondition.closest(reportSelectors.regions.report),{conditionId:conditionId,conditionPosition:conditionPosition,conditionName:conditionName}=reportOrderCondition.dataset;let targetConditionPosition=event.detail.targetNextElement.data("conditionPosition")||event.detail.element.siblings().length+2;targetConditionPosition>conditionPosition&&targetConditionPosition--;const reorderPromise=(0,_conditions.reorderCondition)(reportElement.dataset.reportId,conditionId,targetConditionPosition);Promise.all([reorderPromise,new Promise((resolve=>setTimeout(resolve,1e3)))]).then((_ref2=>{let[data]=_ref2;return reloadSettingsConditionsRegion(reportElement,data)})).then((()=>(0,_str.getString)("conditionmoved","core_reportbuilder",conditionName))).then(_toast.add).then((()=>((0,_event_dispatcher.dispatchEvent)(reportEvents.tableReload,{},reportElement),pendingPromise.resolve()))).catch(_notification.default.exception)}}))}})); //# sourceMappingURL=conditions.min.js.map \ No newline at end of file diff --git a/reportbuilder/amd/build/local/editor/conditions.min.js.map b/reportbuilder/amd/build/local/editor/conditions.min.js.map index 9c817c31ff8..ef60284ceab 100644 --- a/reportbuilder/amd/build/local/editor/conditions.min.js.map +++ b/reportbuilder/amd/build/local/editor/conditions.min.js.map @@ -1 +1 @@ -{"version":3,"file":"conditions.min.js","sources":["../../../src/local/editor/conditions.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 conditions editor\n *\n * @module core_reportbuilder/local/editor/conditions\n * @copyright 2021 Paul Holden \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n\"use strict\";\n\nimport $ from 'jquery';\nimport {dispatchEvent} from 'core/event_dispatcher';\nimport AutoComplete from 'core/form-autocomplete';\nimport 'core/inplace_editable';\nimport Notification from 'core/notification';\nimport Pending from 'core/pending';\nimport {prefetchStrings} from 'core/prefetch';\nimport SortableList from 'core/sortable_list';\nimport {getString} from 'core/str';\nimport Templates from 'core/templates';\nimport {add as addToast} from 'core/toast';\nimport DynamicForm from 'core_form/dynamicform';\nimport * as reportEvents from 'core_reportbuilder/local/events';\nimport * as reportSelectors from 'core_reportbuilder/local/selectors';\nimport {addCondition, deleteCondition, reorderCondition, resetConditions} from 'core_reportbuilder/local/repository/conditions';\n\n/**\n * Reload conditions settings region\n *\n * @param {Element} reportElement\n * @param {Object} templateContext\n * @return {Promise}\n */\nconst reloadSettingsConditionsRegion = (reportElement, templateContext) => {\n const pendingPromise = new Pending('core_reportbuilder/conditions:reload');\n const settingsConditionsRegion = reportElement.querySelector(reportSelectors.regions.settingsConditions);\n\n return Templates.renderForPromise('core_reportbuilder/local/settings/conditions', {conditions: templateContext})\n .then(({html, js}) => {\n const conditionsjs = $.parseHTML(templateContext.javascript, null, true).map(node => node.innerHTML).join(\"\\n\");\n Templates.replaceNode(settingsConditionsRegion, html, js + conditionsjs);\n\n initConditionsForm();\n\n // Re-focus the add condition element after reloading the region.\n const reportAddCondition = reportElement.querySelector(reportSelectors.actions.reportAddCondition);\n reportAddCondition?.focus();\n\n return pendingPromise.resolve();\n });\n};\n\n/**\n * Initialise conditions form, must be called on each init because the form container is re-created when switching editor modes\n */\nconst initConditionsForm = () => {\n const reportElement = document.querySelector(reportSelectors.regions.report);\n\n // Enhance condition selector.\n const reportAddCondition = reportElement.querySelector(reportSelectors.actions.reportAddCondition);\n AutoComplete.enhanceField(reportAddCondition, false, '', getString('selectacondition', 'core_reportbuilder'))\n .catch(Notification.exception);\n\n // Handle dynamic conditions form.\n const conditionFormContainer = reportElement.querySelector(reportSelectors.regions.settingsConditions);\n if (!conditionFormContainer) {\n return;\n }\n const conditionForm = new DynamicForm(conditionFormContainer, '\\\\core_reportbuilder\\\\form\\\\condition');\n\n // Submit report conditions.\n conditionForm.addEventListener(conditionForm.events.FORM_SUBMITTED, event => {\n event.preventDefault();\n\n getString('conditionsapplied', 'core_reportbuilder')\n .then(addToast)\n .catch(Notification.exception);\n\n // After the form has been submitted, we should trigger report table reload.\n dispatchEvent(reportEvents.tableReload, {}, reportElement);\n });\n\n // Reset report conditions.\n conditionForm.addEventListener(conditionForm.events.NOSUBMIT_BUTTON_PRESSED, event => {\n event.preventDefault();\n\n Notification.saveCancelPromise(\n getString('resetconditions', 'core_reportbuilder'),\n getString('resetconditionsconfirm', 'core_reportbuilder'),\n getString('resetall', 'core_reportbuilder'),\n {triggerElement: event.detail}\n ).then(() => {\n const pendingPromise = new Pending('core_reportbuilder/conditions:reset');\n\n return resetConditions(reportElement.dataset.reportId)\n .then(data => reloadSettingsConditionsRegion(reportElement, data))\n .then(() => addToast(getString('conditionsreset', 'core_reportbuilder')))\n .then(() => {\n dispatchEvent(reportEvents.tableReload, {}, reportElement);\n return pendingPromise.resolve();\n })\n .catch(Notification.exception);\n }).catch(() => {\n return;\n });\n });\n};\n\n/**\n * Initialise module, prefetch all required strings\n *\n * @param {Boolean} initialized Ensure we only add our listeners once\n */\nexport const init = initialized => {\n prefetchStrings('core_reportbuilder', [\n 'conditionadded',\n 'conditiondeleted',\n 'conditionmoved',\n 'conditionsapplied',\n 'conditionsreset',\n 'deletecondition',\n 'deleteconditionconfirm',\n 'resetall',\n 'resetconditions',\n 'resetconditionsconfirm',\n 'selectacondition',\n ]);\n\n prefetchStrings('core', [\n 'delete',\n ]);\n\n initConditionsForm();\n if (initialized) {\n return;\n }\n\n // Add condition to report.\n document.addEventListener('change', event => {\n const reportAddCondition = event.target.closest(reportSelectors.actions.reportAddCondition);\n if (reportAddCondition) {\n event.preventDefault();\n\n // Check if dropdown is closed with no condition selected.\n if (reportAddCondition.value === \"\" || reportAddCondition.value === \"0\") {\n return;\n }\n\n const reportElement = reportAddCondition.closest(reportSelectors.regions.report);\n const pendingPromise = new Pending('core_reportbuilder/conditions:add');\n\n addCondition(reportElement.dataset.reportId, reportAddCondition.value)\n .then(data => reloadSettingsConditionsRegion(reportElement, data))\n .then(() => getString('conditionadded', 'core_reportbuilder',\n reportAddCondition.options[reportAddCondition.selectedIndex].text))\n .then(addToast)\n .then(() => {\n dispatchEvent(reportEvents.tableReload, {}, reportElement);\n return pendingPromise.resolve();\n })\n .catch(Notification.exception);\n }\n });\n\n document.addEventListener('click', event => {\n\n // Remove condition from report.\n const reportRemoveCondition = event.target.closest(reportSelectors.actions.reportRemoveCondition);\n if (reportRemoveCondition) {\n event.preventDefault();\n\n const reportElement = reportRemoveCondition.closest(reportSelectors.regions.report);\n const conditionContainer = reportRemoveCondition.closest(reportSelectors.regions.activeCondition);\n const conditionName = conditionContainer.dataset.conditionName;\n\n Notification.saveCancelPromise(\n getString('deletecondition', 'core_reportbuilder', conditionName),\n getString('deleteconditionconfirm', 'core_reportbuilder', conditionName),\n getString('delete', 'core'),\n {triggerElement: reportRemoveCondition}\n ).then(() => {\n const pendingPromise = new Pending('core_reportbuilder/conditions:remove');\n\n return deleteCondition(reportElement.dataset.reportId, conditionContainer.dataset.conditionId)\n .then(data => reloadSettingsConditionsRegion(reportElement, data))\n .then(() => addToast(getString('conditiondeleted', 'core_reportbuilder', conditionName)))\n .then(() => {\n dispatchEvent(reportEvents.tableReload, {}, reportElement);\n return pendingPromise.resolve();\n })\n .catch(Notification.exception);\n }).catch(() => {\n return;\n });\n }\n });\n\n // Initialize sortable list to handle active conditions moving.\n const activeConditionsSelector = reportSelectors.regions.activeConditions;\n const activeConditionsSortableList = new SortableList(activeConditionsSelector, {isHorizontal: false});\n activeConditionsSortableList.getElementName = element => Promise.resolve(element.data('conditionName'));\n\n document.addEventListener(SortableList.EVENTS.elementDrop, event => {\n const reportOrderCondition = event.target.closest(`${activeConditionsSelector} ${reportSelectors.regions.activeCondition}`);\n if (reportOrderCondition && event.detail.positionChanged) {\n const pendingPromise = new Pending('core_reportbuilder/conditions:reorder');\n\n const reportElement = reportOrderCondition.closest(reportSelectors.regions.report);\n const {conditionId, conditionPosition, conditionName} = reportOrderCondition.dataset;\n\n // Select target position, if moving to the end then count number of element siblings.\n let targetConditionPosition = event.detail.targetNextElement.data('conditionPosition')\n || event.detail.element.siblings().length + 2;\n if (targetConditionPosition > conditionPosition) {\n targetConditionPosition--;\n }\n\n // Re-order condition, giving drop event transition time to finish.\n const reorderPromise = reorderCondition(reportElement.dataset.reportId, conditionId, targetConditionPosition);\n Promise.all([reorderPromise, new Promise(resolve => setTimeout(resolve, 1000))])\n .then(([data]) => reloadSettingsConditionsRegion(reportElement, data))\n .then(() => getString('conditionmoved', 'core_reportbuilder', conditionName))\n .then(addToast)\n .then(() => {\n dispatchEvent(reportEvents.tableReload, {}, reportElement);\n return pendingPromise.resolve();\n })\n .catch(Notification.exception);\n }\n });\n};\n"],"names":["reloadSettingsConditionsRegion","reportElement","templateContext","pendingPromise","Pending","settingsConditionsRegion","querySelector","reportSelectors","regions","settingsConditions","Templates","renderForPromise","conditions","then","_ref","html","js","conditionsjs","$","parseHTML","javascript","map","node","innerHTML","join","replaceNode","initConditionsForm","reportAddCondition","actions","focus","resolve","document","report","enhanceField","catch","Notification","exception","conditionFormContainer","conditionForm","DynamicForm","addEventListener","events","FORM_SUBMITTED","event","preventDefault","addToast","reportEvents","tableReload","NOSUBMIT_BUTTON_PRESSED","saveCancelPromise","triggerElement","detail","dataset","reportId","data","initialized","target","closest","value","options","selectedIndex","text","reportRemoveCondition","conditionContainer","activeCondition","conditionName","conditionId","activeConditionsSelector","activeConditions","SortableList","isHorizontal","getElementName","element","Promise","EVENTS","elementDrop","reportOrderCondition","positionChanged","conditionPosition","targetConditionPosition","targetNextElement","siblings","length","reorderPromise","all","setTimeout","_ref2"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"conditions.min.js","sources":["../../../src/local/editor/conditions.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 conditions editor\n *\n * @module core_reportbuilder/local/editor/conditions\n * @copyright 2021 Paul Holden \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n\"use strict\";\n\nimport {dispatchEvent} from 'core/event_dispatcher';\nimport AutoComplete from 'core/form-autocomplete';\nimport {processCollectedJavascript} from 'core/fragment';\nimport 'core/inplace_editable';\nimport Notification from 'core/notification';\nimport Pending from 'core/pending';\nimport {prefetchStrings} from 'core/prefetch';\nimport SortableList from 'core/sortable_list';\nimport {getString} from 'core/str';\nimport Templates from 'core/templates';\nimport {add as addToast} from 'core/toast';\nimport DynamicForm from 'core_form/dynamicform';\nimport * as reportEvents from 'core_reportbuilder/local/events';\nimport * as reportSelectors from 'core_reportbuilder/local/selectors';\nimport {addCondition, deleteCondition, reorderCondition, resetConditions} from 'core_reportbuilder/local/repository/conditions';\n\n/**\n * Reload conditions settings region\n *\n * @param {Element} reportElement\n * @param {Object} templateContext\n * @return {Promise}\n */\nconst reloadSettingsConditionsRegion = (reportElement, templateContext) => {\n const pendingPromise = new Pending('core_reportbuilder/conditions:reload');\n const settingsConditionsRegion = reportElement.querySelector(reportSelectors.regions.settingsConditions);\n\n return Promise.all([\n processCollectedJavascript(templateContext.javascript),\n Templates.renderForPromise('core_reportbuilder/local/settings/conditions', {conditions: templateContext}),\n ])\n .then(([templateJs, {html, js}]) => Templates.replaceNode(settingsConditionsRegion, html, js + templateJs))\n .then(() => {\n initConditionsForm();\n\n // Re-focus the add condition element after reloading the region.\n const reportAddCondition = reportElement.querySelector(reportSelectors.actions.reportAddCondition);\n reportAddCondition?.focus();\n\n return pendingPromise.resolve();\n });\n};\n\n/**\n * Initialise conditions form, must be called on each init because the form container is re-created when switching editor modes\n */\nconst initConditionsForm = () => {\n const reportElement = document.querySelector(reportSelectors.regions.report);\n\n // Enhance condition selector.\n const reportAddCondition = reportElement.querySelector(reportSelectors.actions.reportAddCondition);\n AutoComplete.enhanceField(reportAddCondition, false, '', getString('selectacondition', 'core_reportbuilder'))\n .catch(Notification.exception);\n\n // Handle dynamic conditions form.\n const conditionFormContainer = reportElement.querySelector(reportSelectors.regions.settingsConditions);\n if (!conditionFormContainer) {\n return;\n }\n const conditionForm = new DynamicForm(conditionFormContainer, '\\\\core_reportbuilder\\\\form\\\\condition');\n\n // Submit report conditions.\n conditionForm.addEventListener(conditionForm.events.FORM_SUBMITTED, event => {\n event.preventDefault();\n\n getString('conditionsapplied', 'core_reportbuilder')\n .then(addToast)\n .catch(Notification.exception);\n\n // After the form has been submitted, we should trigger report table reload.\n dispatchEvent(reportEvents.tableReload, {}, reportElement);\n });\n\n // Reset report conditions.\n conditionForm.addEventListener(conditionForm.events.NOSUBMIT_BUTTON_PRESSED, event => {\n event.preventDefault();\n\n Notification.saveCancelPromise(\n getString('resetconditions', 'core_reportbuilder'),\n getString('resetconditionsconfirm', 'core_reportbuilder'),\n getString('resetall', 'core_reportbuilder'),\n {triggerElement: event.detail}\n ).then(() => {\n const pendingPromise = new Pending('core_reportbuilder/conditions:reset');\n\n return resetConditions(reportElement.dataset.reportId)\n .then(data => reloadSettingsConditionsRegion(reportElement, data))\n .then(() => addToast(getString('conditionsreset', 'core_reportbuilder')))\n .then(() => {\n dispatchEvent(reportEvents.tableReload, {}, reportElement);\n return pendingPromise.resolve();\n })\n .catch(Notification.exception);\n }).catch(() => {\n return;\n });\n });\n};\n\n/**\n * Initialise module, prefetch all required strings\n *\n * @param {Boolean} initialized Ensure we only add our listeners once\n */\nexport const init = initialized => {\n prefetchStrings('core_reportbuilder', [\n 'conditionadded',\n 'conditiondeleted',\n 'conditionmoved',\n 'conditionsapplied',\n 'conditionsreset',\n 'deletecondition',\n 'deleteconditionconfirm',\n 'resetall',\n 'resetconditions',\n 'resetconditionsconfirm',\n 'selectacondition',\n ]);\n\n prefetchStrings('core', [\n 'delete',\n ]);\n\n initConditionsForm();\n if (initialized) {\n return;\n }\n\n // Add condition to report.\n document.addEventListener('change', event => {\n const reportAddCondition = event.target.closest(reportSelectors.actions.reportAddCondition);\n if (reportAddCondition) {\n event.preventDefault();\n\n // Check if dropdown is closed with no condition selected.\n if (reportAddCondition.value === \"\" || reportAddCondition.value === \"0\") {\n return;\n }\n\n const reportElement = reportAddCondition.closest(reportSelectors.regions.report);\n const pendingPromise = new Pending('core_reportbuilder/conditions:add');\n\n addCondition(reportElement.dataset.reportId, reportAddCondition.value)\n .then(data => reloadSettingsConditionsRegion(reportElement, data))\n .then(() => getString('conditionadded', 'core_reportbuilder',\n reportAddCondition.options[reportAddCondition.selectedIndex].text))\n .then(addToast)\n .then(() => {\n dispatchEvent(reportEvents.tableReload, {}, reportElement);\n return pendingPromise.resolve();\n })\n .catch(Notification.exception);\n }\n });\n\n document.addEventListener('click', event => {\n\n // Remove condition from report.\n const reportRemoveCondition = event.target.closest(reportSelectors.actions.reportRemoveCondition);\n if (reportRemoveCondition) {\n event.preventDefault();\n\n const reportElement = reportRemoveCondition.closest(reportSelectors.regions.report);\n const conditionContainer = reportRemoveCondition.closest(reportSelectors.regions.activeCondition);\n const conditionName = conditionContainer.dataset.conditionName;\n\n Notification.saveCancelPromise(\n getString('deletecondition', 'core_reportbuilder', conditionName),\n getString('deleteconditionconfirm', 'core_reportbuilder', conditionName),\n getString('delete', 'core'),\n {triggerElement: reportRemoveCondition}\n ).then(() => {\n const pendingPromise = new Pending('core_reportbuilder/conditions:remove');\n\n return deleteCondition(reportElement.dataset.reportId, conditionContainer.dataset.conditionId)\n .then(data => reloadSettingsConditionsRegion(reportElement, data))\n .then(() => addToast(getString('conditiondeleted', 'core_reportbuilder', conditionName)))\n .then(() => {\n dispatchEvent(reportEvents.tableReload, {}, reportElement);\n return pendingPromise.resolve();\n })\n .catch(Notification.exception);\n }).catch(() => {\n return;\n });\n }\n });\n\n // Initialize sortable list to handle active conditions moving.\n const activeConditionsSelector = reportSelectors.regions.activeConditions;\n const activeConditionsSortableList = new SortableList(activeConditionsSelector, {isHorizontal: false});\n activeConditionsSortableList.getElementName = element => Promise.resolve(element.data('conditionName'));\n\n document.addEventListener(SortableList.EVENTS.elementDrop, event => {\n const reportOrderCondition = event.target.closest(`${activeConditionsSelector} ${reportSelectors.regions.activeCondition}`);\n if (reportOrderCondition && event.detail.positionChanged) {\n const pendingPromise = new Pending('core_reportbuilder/conditions:reorder');\n\n const reportElement = reportOrderCondition.closest(reportSelectors.regions.report);\n const {conditionId, conditionPosition, conditionName} = reportOrderCondition.dataset;\n\n // Select target position, if moving to the end then count number of element siblings.\n let targetConditionPosition = event.detail.targetNextElement.data('conditionPosition')\n || event.detail.element.siblings().length + 2;\n if (targetConditionPosition > conditionPosition) {\n targetConditionPosition--;\n }\n\n // Re-order condition, giving drop event transition time to finish.\n const reorderPromise = reorderCondition(reportElement.dataset.reportId, conditionId, targetConditionPosition);\n Promise.all([reorderPromise, new Promise(resolve => setTimeout(resolve, 1000))])\n .then(([data]) => reloadSettingsConditionsRegion(reportElement, data))\n .then(() => getString('conditionmoved', 'core_reportbuilder', conditionName))\n .then(addToast)\n .then(() => {\n dispatchEvent(reportEvents.tableReload, {}, reportElement);\n return pendingPromise.resolve();\n })\n .catch(Notification.exception);\n }\n });\n};\n"],"names":["reloadSettingsConditionsRegion","reportElement","templateContext","pendingPromise","Pending","settingsConditionsRegion","querySelector","reportSelectors","regions","settingsConditions","Promise","all","javascript","Templates","renderForPromise","conditions","then","_ref","templateJs","html","js","replaceNode","initConditionsForm","reportAddCondition","actions","focus","resolve","document","report","enhanceField","catch","Notification","exception","conditionFormContainer","conditionForm","DynamicForm","addEventListener","events","FORM_SUBMITTED","event","preventDefault","addToast","reportEvents","tableReload","NOSUBMIT_BUTTON_PRESSED","saveCancelPromise","triggerElement","detail","dataset","reportId","data","initialized","target","closest","value","options","selectedIndex","text","reportRemoveCondition","conditionContainer","activeCondition","conditionName","conditionId","activeConditionsSelector","activeConditions","SortableList","isHorizontal","getElementName","element","EVENTS","elementDrop","reportOrderCondition","positionChanged","conditionPosition","targetConditionPosition","targetNextElement","siblings","length","reorderPromise","setTimeout","_ref2"],"mappings":"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"} \ No newline at end of file diff --git a/reportbuilder/amd/src/editor.js b/reportbuilder/amd/src/editor.js index a06aebb34ee..085a678ded4 100644 --- a/reportbuilder/amd/src/editor.js +++ b/reportbuilder/amd/src/editor.js @@ -23,7 +23,7 @@ "use strict"; -import $ from 'jquery'; +import {processCollectedJavascript} from 'core/fragment'; import 'core/inplace_editable'; import {addIconToContainer} from 'core/loadingicon'; import Notification from 'core/notification'; @@ -72,7 +72,7 @@ export const init = () => { addIconToContainer(toggleEditViewMode) .then(() => getReport(reportElement.dataset.reportId, toggledEditMode)) .then(response => Promise.all([ - $.parseHTML(response.javascript, null, true).map(node => node.innerHTML).join("\n"), + processCollectedJavascript(response.javascript), Templates.renderForPromise('core_reportbuilder/local/dynamictabs/editor', response), ])) .then(([responseJs, {html, js}]) => Templates.replaceNode(reportElement, html, js + responseJs)) diff --git a/reportbuilder/amd/src/local/editor/conditions.js b/reportbuilder/amd/src/local/editor/conditions.js index c1a863ea1e0..2b1df4bbc63 100644 --- a/reportbuilder/amd/src/local/editor/conditions.js +++ b/reportbuilder/amd/src/local/editor/conditions.js @@ -23,9 +23,9 @@ "use strict"; -import $ from 'jquery'; import {dispatchEvent} from 'core/event_dispatcher'; import AutoComplete from 'core/form-autocomplete'; +import {processCollectedJavascript} from 'core/fragment'; import 'core/inplace_editable'; import Notification from 'core/notification'; import Pending from 'core/pending'; @@ -50,11 +50,12 @@ const reloadSettingsConditionsRegion = (reportElement, templateContext) => { const pendingPromise = new Pending('core_reportbuilder/conditions:reload'); const settingsConditionsRegion = reportElement.querySelector(reportSelectors.regions.settingsConditions); - return Templates.renderForPromise('core_reportbuilder/local/settings/conditions', {conditions: templateContext}) - .then(({html, js}) => { - const conditionsjs = $.parseHTML(templateContext.javascript, null, true).map(node => node.innerHTML).join("\n"); - Templates.replaceNode(settingsConditionsRegion, html, js + conditionsjs); - + return Promise.all([ + processCollectedJavascript(templateContext.javascript), + Templates.renderForPromise('core_reportbuilder/local/settings/conditions', {conditions: templateContext}), + ]) + .then(([templateJs, {html, js}]) => Templates.replaceNode(settingsConditionsRegion, html, js + templateJs)) + .then(() => { initConditionsForm(); // Re-focus the add condition element after reloading the region.