From aa304792f935c6f053f7881bdeb869590c88dc2c Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Wed, 4 Oct 2023 17:44:21 +0100 Subject: [PATCH] MDL-79629 reportbuilder: enhance condition/filter selection in editor. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Enhance the select element used for each with the autocomplete module. Co-authored-by: Mikel Martín --- .../amd/build/local/editor/conditions.min.js | 2 +- .../amd/build/local/editor/conditions.min.js.map | 2 +- .../amd/build/local/editor/filters.min.js | 2 +- .../amd/build/local/editor/filters.min.js.map | 2 +- reportbuilder/amd/src/local/editor/conditions.js | 16 ++++++++++------ reportbuilder/amd/src/local/editor/filters.js | 15 ++++++++++----- .../templates/local/settings/conditions.mustache | 13 ++++++------- .../templates/local/settings/filters.mustache | 13 ++++++------- theme/boost/scss/moodle/reportbuilder.scss | 15 +++++++++++++++ theme/boost/style/moodle.css | 12 ++++++++++++ theme/classic/style/moodle.css | 12 ++++++++++++ 11 files changed, 75 insertions(+), 29 deletions(-) diff --git a/reportbuilder/amd/build/local/editor/conditions.min.js b/reportbuilder/amd/build/local/editor/conditions.min.js index cc6f40c79e4..427bf3f7c7d 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/custom_interaction_events","core/event_dispatcher","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,_custom_interaction_events,_event_dispatcher,_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),_custom_interaction_events=_interopRequireDefault(_custom_interaction_events),_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=()=>{_custom_interaction_events.default.define(reportSelectors.actions.reportAddCondition,[_custom_interaction_events.default.events.accessibleChange]);const reportElement=document.querySelector(reportSelectors.regions.report),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=>{((0,_prefetch.prefetchStrings)("core_reportbuilder",["conditionadded","conditiondeleted","conditionmoved","conditionsapplied","conditionsreset","deletecondition","deleteconditionconfirm","resetall","resetconditions","resetconditionsconfirm"]),(0,_prefetch.prefetchStrings)("core",["delete"]),initConditionsForm(),initialized)||((0,_jquery.default)(document).on(_custom_interaction_events.default.events.accessibleChange,reportSelectors.actions.reportAddCondition,(event=>{const reportAddCondition=event.target.closest(reportSelectors.actions.reportAddCondition);if(reportAddCondition){if(event.preventDefault(),0===reportAddCondition.selectedIndex)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((()=>{}))}})),new _sortable_list.default("".concat(reportSelectors.regions.activeConditions),{isHorizontal:!1}).getElementName=element=>Promise.resolve(element.data("conditionName")),(0,_jquery.default)(document).on(_sortable_list.default.EVENTS.DROP,reportSelectors.regions.activeCondition,((event,info)=>{if(info.positionChanged){const pendingPromise=new _pending.default("core_reportbuilder/conditions:reorder"),reportElement=event.target.closest(reportSelectors.regions.report),conditionId=info.element.data("conditionId"),conditionPosition=info.element.data("conditionPosition");let targetConditionPosition=info.targetNextElement.data("conditionPosition")||info.element.siblings().length+2;targetConditionPosition>conditionPosition&&targetConditionPosition--,(0,_conditions.reorderCondition)(reportElement.dataset.reportId,conditionId,targetConditionPosition).then((data=>reloadSettingsConditionsRegion(reportElement,data))).then((()=>(0,_str.getString)("conditionmoved","core_reportbuilder",info.element.data("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","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.enhance(reportAddCondition,!1,"",(0,_str.getString)("selectacondition","core_reportbuilder"));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=>{((0,_prefetch.prefetchStrings)("core_reportbuilder",["conditionadded","conditiondeleted","conditionmoved","conditionsapplied","conditionsreset","deletecondition","deleteconditionconfirm","resetall","resetconditions","resetconditionsconfirm","selectacondition"]),(0,_prefetch.prefetchStrings)("core",["delete"]),initConditionsForm(),initialized)||(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((()=>{}))}})),new _sortable_list.default("".concat(reportSelectors.regions.activeConditions),{isHorizontal:!1}).getElementName=element=>Promise.resolve(element.data("conditionName")),(0,_jquery.default)(document).on(_sortable_list.default.EVENTS.DROP,reportSelectors.regions.activeCondition,((event,info)=>{if(info.positionChanged){const pendingPromise=new _pending.default("core_reportbuilder/conditions:reorder"),reportElement=event.target.closest(reportSelectors.regions.report),conditionId=info.element.data("conditionId"),conditionPosition=info.element.data("conditionPosition");let targetConditionPosition=info.targetNextElement.data("conditionPosition")||info.element.siblings().length+2;targetConditionPosition>conditionPosition&&targetConditionPosition--,(0,_conditions.reorderCondition)(reportElement.dataset.reportId,conditionId,targetConditionPosition).then((data=>reloadSettingsConditionsRegion(reportElement,data))).then((()=>(0,_str.getString)("conditionmoved","core_reportbuilder",info.element.data("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 64abbcfb0b8..9b1d9bcf105 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 CustomEvents from 'core/custom_interaction_events';\nimport {dispatchEvent} from 'core/event_dispatcher';\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 CustomEvents.define(reportSelectors.actions.reportAddCondition, [CustomEvents.events.accessibleChange]);\n\n // Handle dynamic conditions form.\n const reportElement = document.querySelector(reportSelectors.regions.report);\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 ]);\n\n prefetchStrings('core', [\n 'delete',\n ]);\n\n initConditionsForm();\n if (initialized) {\n return;\n }\n\n // Add condition to report. Use custom events helper to ensure consistency across platforms.\n $(document).on(CustomEvents.events.accessibleChange, reportSelectors.actions.reportAddCondition, 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.selectedIndex === 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 (note JQuery dependency, see MDL-72293 for resolution).\n var activeConditionsSortableList = new SortableList(`${reportSelectors.regions.activeConditions}`,\n {isHorizontal: false});\n activeConditionsSortableList.getElementName = element => Promise.resolve(element.data('conditionName'));\n\n $(document).on(SortableList.EVENTS.DROP, reportSelectors.regions.activeCondition, (event, info) => {\n if (info.positionChanged) {\n const pendingPromise = new Pending('core_reportbuilder/conditions:reorder');\n const reportElement = event.target.closest(reportSelectors.regions.report);\n const conditionId = info.element.data('conditionId');\n const conditionPosition = info.element.data('conditionPosition');\n\n // Select target position, if moving to the end then count number of element siblings.\n let targetConditionPosition = info.targetNextElement.data('conditionPosition') || info.element.siblings().length + 2;\n if (targetConditionPosition > conditionPosition) {\n targetConditionPosition--;\n }\n\n reorderCondition(reportElement.dataset.reportId, conditionId, targetConditionPosition)\n .then(data => reloadSettingsConditionsRegion(reportElement, data))\n .then(() => getString('conditionmoved', 'core_reportbuilder', info.element.data('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","define","CustomEvents","events","accessibleChange","document","report","conditionFormContainer","conditionForm","DynamicForm","addEventListener","FORM_SUBMITTED","event","preventDefault","addToast","catch","Notification","exception","reportEvents","tableReload","NOSUBMIT_BUTTON_PRESSED","saveCancelPromise","triggerElement","detail","dataset","reportId","data","initialized","on","target","closest","selectedIndex","value","options","text","reportRemoveCondition","conditionContainer","activeCondition","conditionName","conditionId","SortableList","activeConditions","isHorizontal","getElementName","element","Promise","EVENTS","DROP","info","positionChanged","conditionPosition","targetConditionPosition","targetNextElement","siblings","length"],"mappings":"qqEAgDMA,+BAAiC,CAACC,cAAeC,yBAC7CC,eAAiB,IAAIC,iBAAQ,wCAC7BC,yBAA2BJ,cAAcK,cAAcC,gBAAgBC,QAAQC,2BAE9EC,mBAAUC,iBAAiB,+CAAgD,CAACC,WAAYV,kBAC1FW,MAAKC,WAACC,KAACA,KAADC,GAAOA,eACJC,aAAeC,gBAAEC,UAAUjB,gBAAgBkB,WAAY,MAAM,GAAMC,KAAIC,MAAQA,KAAKC,YAAWC,KAAK,yBAChGC,YAAYpB,yBAA0BU,KAAMC,GAAKC,cAE3DS,2BAGMC,mBAAqB1B,cAAcK,cAAcC,gBAAgBqB,QAAQD,2BAC/EA,MAAAA,oBAAAA,mBAAoBE,QAEb1B,eAAe2B,cAO5BJ,mBAAqB,wCACVK,OAAOxB,gBAAgBqB,QAAQD,mBAAoB,CAACK,mCAAaC,OAAOC,yBAG/EjC,cAAgBkC,SAAS7B,cAAcC,gBAAgBC,QAAQ4B,QAC/DC,uBAAyBpC,cAAcK,cAAcC,gBAAgBC,QAAQC,wBAC9E4B,oCAGCC,cAAgB,IAAIC,qBAAYF,uBAAwB,yCAG9DC,cAAcE,iBAAiBF,cAAcL,OAAOQ,gBAAgBC,QAChEA,MAAMC,oCAEI,oBAAqB,sBAC1B9B,KAAK+B,YACLC,MAAMC,sBAAaC,+CAGVC,aAAaC,YAAa,GAAIhD,kBAIhDqC,cAAcE,iBAAiBF,cAAcL,OAAOiB,yBAAyBR,QACzEA,MAAMC,uCAEOQ,mBACT,kBAAU,kBAAmB,uBAC7B,kBAAU,yBAA0B,uBACpC,kBAAU,WAAY,sBACtB,CAACC,eAAgBV,MAAMW,SACzBxC,MAAK,WACGV,eAAiB,IAAIC,iBAAQ,8CAE5B,+BAAgBH,cAAcqD,QAAQC,UACxC1C,MAAK2C,MAAQxD,+BAA+BC,cAAeuD,QAC3D3C,MAAK,KAAM,eAAS,kBAAU,kBAAmB,yBACjDA,MAAK,yCACYmC,aAAaC,YAAa,GAAIhD,eACrCE,eAAe2B,aAEzBe,MAAMC,sBAAaC,cACzBF,OAAM,2BAWGY,6CACA,qBAAsB,CAClC,iBACA,mBACA,iBACA,oBACA,kBACA,kBACA,yBACA,WACA,kBACA,yDAGY,OAAQ,CACpB,WAGJ/B,qBACI+B,mCAKFtB,UAAUuB,GAAG1B,mCAAaC,OAAOC,iBAAkB3B,gBAAgBqB,QAAQD,oBAAoBe,cACvFf,mBAAqBe,MAAMiB,OAAOC,QAAQrD,gBAAgBqB,QAAQD,uBACpEA,mBAAoB,IACpBe,MAAMC,iBAGmC,IAArChB,mBAAmBkC,2BAIjB5D,cAAgB0B,mBAAmBiC,QAAQrD,gBAAgBC,QAAQ4B,QACnEjC,eAAiB,IAAIC,iBAAQ,kEAEtBH,cAAcqD,QAAQC,SAAU5B,mBAAmBmC,OAC3DjD,MAAK2C,MAAQxD,+BAA+BC,cAAeuD,QAC3D3C,MAAK,KAAM,kBAAU,iBAAkB,qBACpCc,mBAAmBoC,QAAQpC,mBAAmBkC,eAAeG,QAChEnD,KAAK+B,YACL/B,MAAK,yCACYmC,aAAaC,YAAa,GAAIhD,eACrCE,eAAe2B,aAEzBe,MAAMC,sBAAaC,eAIhCZ,SAASK,iBAAiB,SAASE,cAGzBuB,sBAAwBvB,MAAMiB,OAAOC,QAAQrD,gBAAgBqB,QAAQqC,0BACvEA,sBAAuB,CACvBvB,MAAMC,uBAEA1C,cAAgBgE,sBAAsBL,QAAQrD,gBAAgBC,QAAQ4B,QACtE8B,mBAAqBD,sBAAsBL,QAAQrD,gBAAgBC,QAAQ2D,iBAC3EC,cAAgBF,mBAAmBZ,QAAQc,oCAEpCjB,mBACT,kBAAU,kBAAmB,qBAAsBiB,gBACnD,kBAAU,yBAA0B,qBAAsBA,gBAC1D,kBAAU,SAAU,QACpB,CAAChB,eAAgBa,wBACnBpD,MAAK,WACGV,eAAiB,IAAIC,iBAAQ,+CAE5B,+BAAgBH,cAAcqD,QAAQC,SAAUW,mBAAmBZ,QAAQe,aAC7ExD,MAAK2C,MAAQxD,+BAA+BC,cAAeuD,QAC3D3C,MAAK,KAAM,eAAS,kBAAU,mBAAoB,qBAAsBuD,kBACxEvD,MAAK,yCACYmC,aAAaC,YAAa,GAAIhD,eACrCE,eAAe2B,aAEzBe,MAAMC,sBAAaC,cACzBF,OAAM,aAOkB,IAAIyB,iCAAgB/D,gBAAgBC,QAAQ+D,kBAC3E,CAACC,cAAc,IACUC,eAAiBC,SAAWC,QAAQ7C,QAAQ4C,QAAQlB,KAAK,sCAEpFrB,UAAUuB,GAAGY,uBAAaM,OAAOC,KAAMtE,gBAAgBC,QAAQ2D,iBAAiB,CAACzB,MAAOoC,WAClFA,KAAKC,gBAAiB,OAChB5E,eAAiB,IAAIC,iBAAQ,yCAC7BH,cAAgByC,MAAMiB,OAAOC,QAAQrD,gBAAgBC,QAAQ4B,QAC7DiC,YAAcS,KAAKJ,QAAQlB,KAAK,eAChCwB,kBAAoBF,KAAKJ,QAAQlB,KAAK,yBAGxCyB,wBAA0BH,KAAKI,kBAAkB1B,KAAK,sBAAwBsB,KAAKJ,QAAQS,WAAWC,OAAS,EAC/GH,wBAA0BD,mBAC1BC,2DAGahF,cAAcqD,QAAQC,SAAUc,YAAaY,yBACzDpE,MAAK2C,MAAQxD,+BAA+BC,cAAeuD,QAC3D3C,MAAK,KAAM,kBAAU,iBAAkB,qBAAsBiE,KAAKJ,QAAQlB,KAAK,oBAC/E3C,KAAK+B,YACL/B,MAAK,yCACYmC,aAAaC,YAAa,GAAIhD,eACrCE,eAAe2B,aAEzBe,MAAMC,sBAAaC"} \ 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 $ 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.enhance(reportAddCondition, false, '', getString('selectacondition', 'core_reportbuilder'));\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 (note JQuery dependency, see MDL-72293 for resolution).\n var activeConditionsSortableList = new SortableList(`${reportSelectors.regions.activeConditions}`,\n {isHorizontal: false});\n activeConditionsSortableList.getElementName = element => Promise.resolve(element.data('conditionName'));\n\n $(document).on(SortableList.EVENTS.DROP, reportSelectors.regions.activeCondition, (event, info) => {\n if (info.positionChanged) {\n const pendingPromise = new Pending('core_reportbuilder/conditions:reorder');\n const reportElement = event.target.closest(reportSelectors.regions.report);\n const conditionId = info.element.data('conditionId');\n const conditionPosition = info.element.data('conditionPosition');\n\n // Select target position, if moving to the end then count number of element siblings.\n let targetConditionPosition = info.targetNextElement.data('conditionPosition') || info.element.siblings().length + 2;\n if (targetConditionPosition > conditionPosition) {\n targetConditionPosition--;\n }\n\n reorderCondition(reportElement.dataset.reportId, conditionId, targetConditionPosition)\n .then(data => reloadSettingsConditionsRegion(reportElement, data))\n .then(() => getString('conditionmoved', 'core_reportbuilder', info.element.data('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","enhance","conditionFormContainer","conditionForm","DynamicForm","addEventListener","events","FORM_SUBMITTED","event","preventDefault","addToast","catch","Notification","exception","reportEvents","tableReload","NOSUBMIT_BUTTON_PRESSED","saveCancelPromise","triggerElement","detail","dataset","reportId","data","initialized","target","closest","value","options","selectedIndex","text","reportRemoveCondition","conditionContainer","activeCondition","conditionName","conditionId","SortableList","activeConditions","isHorizontal","getElementName","element","Promise","on","EVENTS","DROP","info","positionChanged","conditionPosition","targetConditionPosition","targetNextElement","siblings","length"],"mappings":"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"} \ No newline at end of file diff --git a/reportbuilder/amd/build/local/editor/filters.min.js b/reportbuilder/amd/build/local/editor/filters.min.js index 9427167a701..89d5846296a 100644 --- a/reportbuilder/amd/build/local/editor/filters.min.js +++ b/reportbuilder/amd/build/local/editor/filters.min.js @@ -1,3 +1,3 @@ -define("core_reportbuilder/local/editor/filters",["exports","jquery","core/custom_interaction_events","core/inplace_editable","core/notification","core/pending","core/prefetch","core/sortable_list","core/str","core/templates","core/toast","core_reportbuilder/local/selectors","core_reportbuilder/local/repository/filters"],(function(_exports,_jquery,_custom_interaction_events,_inplace_editable,_notification,_pending,_prefetch,_sortable_list,_str,_templates,_toast,reportSelectors,_filters){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),_custom_interaction_events=_interopRequireDefault(_custom_interaction_events),_notification=_interopRequireDefault(_notification),_pending=_interopRequireDefault(_pending),_sortable_list=_interopRequireDefault(_sortable_list),_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);const reloadSettingsFiltersRegion=(reportElement,templateContext)=>{const pendingPromise=new _pending.default("core_reportbuilder/filters:reload"),settingsFiltersRegion=reportElement.querySelector(reportSelectors.regions.settingsFilters);return _templates.default.renderForPromise("core_reportbuilder/local/settings/filters",{filters:templateContext}).then((_ref=>{let{html:html,js:js}=_ref;_templates.default.replaceNode(settingsFiltersRegion,html,js),initFiltersForm();const reportAddFilter=reportElement.querySelector(reportSelectors.actions.reportAddFilter);return null==reportAddFilter||reportAddFilter.focus(),pendingPromise.resolve()}))},initFiltersForm=()=>{_custom_interaction_events.default.define(reportSelectors.actions.reportAddFilter,[_custom_interaction_events.default.events.accessibleChange])};_exports.init=initialized=>{((0,_prefetch.prefetchStrings)("core_reportbuilder",["deletefilter","deletefilterconfirm","filteradded","filterdeleted","filtermoved"]),(0,_prefetch.prefetchStrings)("core",["delete"]),initFiltersForm(),initialized)||((0,_jquery.default)(document).on(_custom_interaction_events.default.events.accessibleChange,reportSelectors.actions.reportAddFilter,(event=>{const reportAddFilter=event.target.closest(reportSelectors.actions.reportAddFilter);if(reportAddFilter){if(event.preventDefault(),0===reportAddFilter.selectedIndex)return;const reportElement=reportAddFilter.closest(reportSelectors.regions.report),pendingPromise=new _pending.default("core_reportbuilder/filters:add");(0,_filters.addFilter)(reportElement.dataset.reportId,reportAddFilter.value).then((data=>reloadSettingsFiltersRegion(reportElement,data))).then((()=>(0,_str.getString)("filteradded","core_reportbuilder",reportAddFilter.options[reportAddFilter.selectedIndex].text))).then(_toast.add).then((()=>pendingPromise.resolve())).catch(_notification.default.exception)}})),document.addEventListener("click",(event=>{const reportRemoveFilter=event.target.closest(reportSelectors.actions.reportRemoveFilter);if(reportRemoveFilter){event.preventDefault();const reportElement=reportRemoveFilter.closest(reportSelectors.regions.report),filterContainer=reportRemoveFilter.closest(reportSelectors.regions.activeFilter),filterName=filterContainer.dataset.filterName;_notification.default.saveCancelPromise((0,_str.getString)("deletefilter","core_reportbuilder",filterName),(0,_str.getString)("deletefilterconfirm","core_reportbuilder",filterName),(0,_str.getString)("delete","core"),{triggerElement:reportRemoveFilter}).then((()=>{const pendingPromise=new _pending.default("core_reportbuilder/filters:remove");return(0,_filters.deleteFilter)(reportElement.dataset.reportId,filterContainer.dataset.filterId).then((data=>reloadSettingsFiltersRegion(reportElement,data))).then((()=>(0,_toast.add)((0,_str.getString)("filterdeleted","core_reportbuilder",filterName)))).then((()=>pendingPromise.resolve())).catch(_notification.default.exception)})).catch((()=>{}))}})),new _sortable_list.default("".concat(reportSelectors.regions.activeFilters," ul"),{isHorizontal:!1}).getElementName=element=>Promise.resolve(element.data("filterName")),(0,_jquery.default)(document).on(_sortable_list.default.EVENTS.DROP,"".concat(reportSelectors.regions.report," li[data-filter-id]"),((event,info)=>{if(info.positionChanged){const pendingPromise=new _pending.default("core_reportbuilder/filters:reorder"),reportElement=event.target.closest(reportSelectors.regions.report),filterId=info.element.data("filterId"),filterPosition=info.element.data("filterPosition");let targetFilterPosition=info.targetNextElement.data("filterPosition")||info.element.siblings().length+2;targetFilterPosition>filterPosition&&targetFilterPosition--,(0,_filters.reorderFilter)(reportElement.dataset.reportId,filterId,targetFilterPosition).then((data=>reloadSettingsFiltersRegion(reportElement,data))).then((()=>(0,_str.getString)("filtermoved","core_reportbuilder",info.element.data("filterName")))).then(_toast.add).then((()=>pendingPromise.resolve())).catch(_notification.default.exception)}})))}})); +define("core_reportbuilder/local/editor/filters",["exports","jquery","core/form-autocomplete","core/inplace_editable","core/notification","core/pending","core/prefetch","core/sortable_list","core/str","core/templates","core/toast","core_reportbuilder/local/selectors","core_reportbuilder/local/repository/filters"],(function(_exports,_jquery,_formAutocomplete,_inplace_editable,_notification,_pending,_prefetch,_sortable_list,_str,_templates,_toast,reportSelectors,_filters){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),_formAutocomplete=_interopRequireDefault(_formAutocomplete),_notification=_interopRequireDefault(_notification),_pending=_interopRequireDefault(_pending),_sortable_list=_interopRequireDefault(_sortable_list),_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);const reloadSettingsFiltersRegion=(reportElement,templateContext)=>{const pendingPromise=new _pending.default("core_reportbuilder/filters:reload"),settingsFiltersRegion=reportElement.querySelector(reportSelectors.regions.settingsFilters);return _templates.default.renderForPromise("core_reportbuilder/local/settings/filters",{filters:templateContext}).then((_ref=>{let{html:html,js:js}=_ref;_templates.default.replaceNode(settingsFiltersRegion,html,js),initFiltersForm();const reportAddFilter=reportElement.querySelector(reportSelectors.actions.reportAddFilter);return null==reportAddFilter||reportAddFilter.focus(),pendingPromise.resolve()}))},initFiltersForm=()=>{const reportAddFilter=document.querySelector(reportSelectors.regions.report).querySelector(reportSelectors.actions.reportAddFilter);_formAutocomplete.default.enhance(reportAddFilter,!1,"",(0,_str.getString)("selectafilter","core_reportbuilder"))};_exports.init=initialized=>{((0,_prefetch.prefetchStrings)("core_reportbuilder",["deletefilter","deletefilterconfirm","filteradded","filterdeleted","filtermoved","selectafilter"]),(0,_prefetch.prefetchStrings)("core",["delete"]),initFiltersForm(),initialized)||(document.addEventListener("change",(event=>{const reportAddFilter=event.target.closest(reportSelectors.actions.reportAddFilter);if(reportAddFilter){if(event.preventDefault(),""===reportAddFilter.value||"0"===reportAddFilter.value)return;const reportElement=reportAddFilter.closest(reportSelectors.regions.report),pendingPromise=new _pending.default("core_reportbuilder/filters:add");(0,_filters.addFilter)(reportElement.dataset.reportId,reportAddFilter.value).then((data=>reloadSettingsFiltersRegion(reportElement,data))).then((()=>(0,_str.getString)("filteradded","core_reportbuilder",reportAddFilter.options[reportAddFilter.selectedIndex].text))).then(_toast.add).then((()=>pendingPromise.resolve())).catch(_notification.default.exception)}})),document.addEventListener("click",(event=>{const reportRemoveFilter=event.target.closest(reportSelectors.actions.reportRemoveFilter);if(reportRemoveFilter){event.preventDefault();const reportElement=reportRemoveFilter.closest(reportSelectors.regions.report),filterContainer=reportRemoveFilter.closest(reportSelectors.regions.activeFilter),filterName=filterContainer.dataset.filterName;_notification.default.saveCancelPromise((0,_str.getString)("deletefilter","core_reportbuilder",filterName),(0,_str.getString)("deletefilterconfirm","core_reportbuilder",filterName),(0,_str.getString)("delete","core"),{triggerElement:reportRemoveFilter}).then((()=>{const pendingPromise=new _pending.default("core_reportbuilder/filters:remove");return(0,_filters.deleteFilter)(reportElement.dataset.reportId,filterContainer.dataset.filterId).then((data=>reloadSettingsFiltersRegion(reportElement,data))).then((()=>(0,_toast.add)((0,_str.getString)("filterdeleted","core_reportbuilder",filterName)))).then((()=>pendingPromise.resolve())).catch(_notification.default.exception)})).catch((()=>{}))}})),new _sortable_list.default("".concat(reportSelectors.regions.activeFilters," ul"),{isHorizontal:!1}).getElementName=element=>Promise.resolve(element.data("filterName")),(0,_jquery.default)(document).on(_sortable_list.default.EVENTS.DROP,"".concat(reportSelectors.regions.report," li[data-filter-id]"),((event,info)=>{if(info.positionChanged){const pendingPromise=new _pending.default("core_reportbuilder/filters:reorder"),reportElement=event.target.closest(reportSelectors.regions.report),filterId=info.element.data("filterId"),filterPosition=info.element.data("filterPosition");let targetFilterPosition=info.targetNextElement.data("filterPosition")||info.element.siblings().length+2;targetFilterPosition>filterPosition&&targetFilterPosition--,(0,_filters.reorderFilter)(reportElement.dataset.reportId,filterId,targetFilterPosition).then((data=>reloadSettingsFiltersRegion(reportElement,data))).then((()=>(0,_str.getString)("filtermoved","core_reportbuilder",info.element.data("filterName")))).then(_toast.add).then((()=>pendingPromise.resolve())).catch(_notification.default.exception)}})))}})); //# sourceMappingURL=filters.min.js.map \ No newline at end of file diff --git a/reportbuilder/amd/build/local/editor/filters.min.js.map b/reportbuilder/amd/build/local/editor/filters.min.js.map index 1f9e664c706..48642c2a879 100644 --- a/reportbuilder/amd/build/local/editor/filters.min.js.map +++ b/reportbuilder/amd/build/local/editor/filters.min.js.map @@ -1 +1 @@ -{"version":3,"file":"filters.min.js","sources":["../../../src/local/editor/filters.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Report builder filters editor\n *\n * @module core_reportbuilder/local/editor/filters\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 CustomEvents from 'core/custom_interaction_events';\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 * as reportSelectors from 'core_reportbuilder/local/selectors';\nimport {addFilter, deleteFilter, reorderFilter} from 'core_reportbuilder/local/repository/filters';\n\n/**\n * Reload filters settings region\n *\n * @param {Element} reportElement\n * @param {Object} templateContext\n * @return {Promise}\n */\nconst reloadSettingsFiltersRegion = (reportElement, templateContext) => {\n const pendingPromise = new Pending('core_reportbuilder/filters:reload');\n const settingsFiltersRegion = reportElement.querySelector(reportSelectors.regions.settingsFilters);\n\n return Templates.renderForPromise('core_reportbuilder/local/settings/filters', {filters: templateContext})\n .then(({html, js}) => {\n Templates.replaceNode(settingsFiltersRegion, html, js);\n\n initFiltersForm();\n\n // Re-focus the add filter element after reloading the region.\n const reportAddFilter = reportElement.querySelector(reportSelectors.actions.reportAddFilter);\n reportAddFilter?.focus();\n\n return pendingPromise.resolve();\n });\n};\n\n/**\n * Initialise filters form, must be called on each init because the form container is re-created when switching editor modes\n */\nconst initFiltersForm = () => {\n CustomEvents.define(reportSelectors.actions.reportAddFilter, [CustomEvents.events.accessibleChange]);\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 'deletefilter',\n 'deletefilterconfirm',\n 'filteradded',\n 'filterdeleted',\n 'filtermoved',\n ]);\n\n prefetchStrings('core', [\n 'delete',\n ]);\n\n initFiltersForm();\n if (initialized) {\n return;\n }\n\n // Add filter to report. Use custom events helper to ensure consistency across platforms.\n $(document).on(CustomEvents.events.accessibleChange, reportSelectors.actions.reportAddFilter, event => {\n const reportAddFilter = event.target.closest(reportSelectors.actions.reportAddFilter);\n if (reportAddFilter) {\n event.preventDefault();\n\n // Check if dropdown is closed with no filter selected.\n if (reportAddFilter.selectedIndex === 0) {\n return;\n }\n\n const reportElement = reportAddFilter.closest(reportSelectors.regions.report);\n const pendingPromise = new Pending('core_reportbuilder/filters:add');\n\n addFilter(reportElement.dataset.reportId, reportAddFilter.value)\n .then(data => reloadSettingsFiltersRegion(reportElement, data))\n .then(() => getString('filteradded', 'core_reportbuilder',\n reportAddFilter.options[reportAddFilter.selectedIndex].text))\n .then(addToast)\n .then(() => pendingPromise.resolve())\n .catch(Notification.exception);\n }\n });\n\n document.addEventListener('click', event => {\n\n // Remove filter from report.\n const reportRemoveFilter = event.target.closest(reportSelectors.actions.reportRemoveFilter);\n if (reportRemoveFilter) {\n event.preventDefault();\n\n const reportElement = reportRemoveFilter.closest(reportSelectors.regions.report);\n const filterContainer = reportRemoveFilter.closest(reportSelectors.regions.activeFilter);\n const filterName = filterContainer.dataset.filterName;\n\n Notification.saveCancelPromise(\n getString('deletefilter', 'core_reportbuilder', filterName),\n getString('deletefilterconfirm', 'core_reportbuilder', filterName),\n getString('delete', 'core'),\n {triggerElement: reportRemoveFilter}\n ).then(() => {\n const pendingPromise = new Pending('core_reportbuilder/filters:remove');\n\n return deleteFilter(reportElement.dataset.reportId, filterContainer.dataset.filterId)\n .then(data => reloadSettingsFiltersRegion(reportElement, data))\n .then(() => addToast(getString('filterdeleted', 'core_reportbuilder', filterName)))\n .then(() => pendingPromise.resolve())\n .catch(Notification.exception);\n }).catch(() => {\n return;\n });\n }\n });\n\n // Initialize sortable list to handle active filters moving (note JQuery dependency, see MDL-72293 for resolution).\n var activeFiltersSortableList = new SortableList(`${reportSelectors.regions.activeFilters} ul`, {isHorizontal: false});\n activeFiltersSortableList.getElementName = element => Promise.resolve(element.data('filterName'));\n\n $(document).on(SortableList.EVENTS.DROP, `${reportSelectors.regions.report} li[data-filter-id]`, (event, info) => {\n if (info.positionChanged) {\n const pendingPromise = new Pending('core_reportbuilder/filters:reorder');\n const reportElement = event.target.closest(reportSelectors.regions.report);\n const filterId = info.element.data('filterId');\n const filterPosition = info.element.data('filterPosition');\n\n // Select target position, if moving to the end then count number of element siblings.\n let targetFilterPosition = info.targetNextElement.data('filterPosition') || info.element.siblings().length + 2;\n if (targetFilterPosition > filterPosition) {\n targetFilterPosition--;\n }\n\n reorderFilter(reportElement.dataset.reportId, filterId, targetFilterPosition)\n .then(data => reloadSettingsFiltersRegion(reportElement, data))\n .then(() => getString('filtermoved', 'core_reportbuilder', info.element.data('filterName')))\n .then(addToast)\n .then(() => pendingPromise.resolve())\n .catch(Notification.exception);\n }\n });\n};\n"],"names":["reloadSettingsFiltersRegion","reportElement","templateContext","pendingPromise","Pending","settingsFiltersRegion","querySelector","reportSelectors","regions","settingsFilters","Templates","renderForPromise","filters","then","_ref","html","js","replaceNode","initFiltersForm","reportAddFilter","actions","focus","resolve","define","CustomEvents","events","accessibleChange","initialized","document","on","event","target","closest","preventDefault","selectedIndex","report","dataset","reportId","value","data","options","text","addToast","catch","Notification","exception","addEventListener","reportRemoveFilter","filterContainer","activeFilter","filterName","saveCancelPromise","triggerElement","filterId","SortableList","activeFilters","isHorizontal","getElementName","element","Promise","EVENTS","DROP","info","positionChanged","filterPosition","targetFilterPosition","targetNextElement","siblings","length"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"filters.min.js","sources":["../../../src/local/editor/filters.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Report builder filters editor\n *\n * @module core_reportbuilder/local/editor/filters\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 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 * as reportSelectors from 'core_reportbuilder/local/selectors';\nimport {addFilter, deleteFilter, reorderFilter} from 'core_reportbuilder/local/repository/filters';\n\n/**\n * Reload filters settings region\n *\n * @param {Element} reportElement\n * @param {Object} templateContext\n * @return {Promise}\n */\nconst reloadSettingsFiltersRegion = (reportElement, templateContext) => {\n const pendingPromise = new Pending('core_reportbuilder/filters:reload');\n const settingsFiltersRegion = reportElement.querySelector(reportSelectors.regions.settingsFilters);\n\n return Templates.renderForPromise('core_reportbuilder/local/settings/filters', {filters: templateContext})\n .then(({html, js}) => {\n Templates.replaceNode(settingsFiltersRegion, html, js);\n\n initFiltersForm();\n\n // Re-focus the add filter element after reloading the region.\n const reportAddFilter = reportElement.querySelector(reportSelectors.actions.reportAddFilter);\n reportAddFilter?.focus();\n\n return pendingPromise.resolve();\n });\n};\n\n/**\n * Initialise filters form, must be called on each init because the form container is re-created when switching editor modes\n */\nconst initFiltersForm = () => {\n const reportElement = document.querySelector(reportSelectors.regions.report);\n\n // Enhance filter selector.\n const reportAddFilter = reportElement.querySelector(reportSelectors.actions.reportAddFilter);\n AutoComplete.enhance(reportAddFilter, false, '', getString('selectafilter', 'core_reportbuilder'));\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 'deletefilter',\n 'deletefilterconfirm',\n 'filteradded',\n 'filterdeleted',\n 'filtermoved',\n 'selectafilter',\n ]);\n\n prefetchStrings('core', [\n 'delete',\n ]);\n\n initFiltersForm();\n if (initialized) {\n return;\n }\n\n // Add filter to report.\n document.addEventListener('change', event => {\n const reportAddFilter = event.target.closest(reportSelectors.actions.reportAddFilter);\n if (reportAddFilter) {\n event.preventDefault();\n\n // Check if dropdown is closed with no filter selected.\n if (reportAddFilter.value === \"\" || reportAddFilter.value === \"0\") {\n return;\n }\n\n const reportElement = reportAddFilter.closest(reportSelectors.regions.report);\n const pendingPromise = new Pending('core_reportbuilder/filters:add');\n\n addFilter(reportElement.dataset.reportId, reportAddFilter.value)\n .then(data => reloadSettingsFiltersRegion(reportElement, data))\n .then(() => getString('filteradded', 'core_reportbuilder',\n reportAddFilter.options[reportAddFilter.selectedIndex].text))\n .then(addToast)\n .then(() => pendingPromise.resolve())\n .catch(Notification.exception);\n }\n });\n\n document.addEventListener('click', event => {\n\n // Remove filter from report.\n const reportRemoveFilter = event.target.closest(reportSelectors.actions.reportRemoveFilter);\n if (reportRemoveFilter) {\n event.preventDefault();\n\n const reportElement = reportRemoveFilter.closest(reportSelectors.regions.report);\n const filterContainer = reportRemoveFilter.closest(reportSelectors.regions.activeFilter);\n const filterName = filterContainer.dataset.filterName;\n\n Notification.saveCancelPromise(\n getString('deletefilter', 'core_reportbuilder', filterName),\n getString('deletefilterconfirm', 'core_reportbuilder', filterName),\n getString('delete', 'core'),\n {triggerElement: reportRemoveFilter}\n ).then(() => {\n const pendingPromise = new Pending('core_reportbuilder/filters:remove');\n\n return deleteFilter(reportElement.dataset.reportId, filterContainer.dataset.filterId)\n .then(data => reloadSettingsFiltersRegion(reportElement, data))\n .then(() => addToast(getString('filterdeleted', 'core_reportbuilder', filterName)))\n .then(() => pendingPromise.resolve())\n .catch(Notification.exception);\n }).catch(() => {\n return;\n });\n }\n });\n\n // Initialize sortable list to handle active filters moving (note JQuery dependency, see MDL-72293 for resolution).\n var activeFiltersSortableList = new SortableList(`${reportSelectors.regions.activeFilters} ul`, {isHorizontal: false});\n activeFiltersSortableList.getElementName = element => Promise.resolve(element.data('filterName'));\n\n $(document).on(SortableList.EVENTS.DROP, `${reportSelectors.regions.report} li[data-filter-id]`, (event, info) => {\n if (info.positionChanged) {\n const pendingPromise = new Pending('core_reportbuilder/filters:reorder');\n const reportElement = event.target.closest(reportSelectors.regions.report);\n const filterId = info.element.data('filterId');\n const filterPosition = info.element.data('filterPosition');\n\n // Select target position, if moving to the end then count number of element siblings.\n let targetFilterPosition = info.targetNextElement.data('filterPosition') || info.element.siblings().length + 2;\n if (targetFilterPosition > filterPosition) {\n targetFilterPosition--;\n }\n\n reorderFilter(reportElement.dataset.reportId, filterId, targetFilterPosition)\n .then(data => reloadSettingsFiltersRegion(reportElement, data))\n .then(() => getString('filtermoved', 'core_reportbuilder', info.element.data('filterName')))\n .then(addToast)\n .then(() => pendingPromise.resolve())\n .catch(Notification.exception);\n }\n });\n};\n"],"names":["reloadSettingsFiltersRegion","reportElement","templateContext","pendingPromise","Pending","settingsFiltersRegion","querySelector","reportSelectors","regions","settingsFilters","Templates","renderForPromise","filters","then","_ref","html","js","replaceNode","initFiltersForm","reportAddFilter","actions","focus","resolve","document","report","enhance","initialized","addEventListener","event","target","closest","preventDefault","value","dataset","reportId","data","options","selectedIndex","text","addToast","catch","Notification","exception","reportRemoveFilter","filterContainer","activeFilter","filterName","saveCancelPromise","triggerElement","filterId","SortableList","activeFilters","isHorizontal","getElementName","element","Promise","on","EVENTS","DROP","info","positionChanged","filterPosition","targetFilterPosition","targetNextElement","siblings","length"],"mappings":"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"} \ No newline at end of file diff --git a/reportbuilder/amd/src/local/editor/conditions.js b/reportbuilder/amd/src/local/editor/conditions.js index 6f5bbe75c28..89f75e3cc9d 100644 --- a/reportbuilder/amd/src/local/editor/conditions.js +++ b/reportbuilder/amd/src/local/editor/conditions.js @@ -24,8 +24,8 @@ "use strict"; import $ from 'jquery'; -import CustomEvents from 'core/custom_interaction_events'; import {dispatchEvent} from 'core/event_dispatcher'; +import AutoComplete from 'core/form-autocomplete'; import 'core/inplace_editable'; import Notification from 'core/notification'; import Pending from 'core/pending'; @@ -69,10 +69,13 @@ const reloadSettingsConditionsRegion = (reportElement, templateContext) => { * Initialise conditions form, must be called on each init because the form container is re-created when switching editor modes */ const initConditionsForm = () => { - CustomEvents.define(reportSelectors.actions.reportAddCondition, [CustomEvents.events.accessibleChange]); + const reportElement = document.querySelector(reportSelectors.regions.report); + + // Enhance condition selector. + const reportAddCondition = reportElement.querySelector(reportSelectors.actions.reportAddCondition); + AutoComplete.enhance(reportAddCondition, false, '', getString('selectacondition', 'core_reportbuilder')); // Handle dynamic conditions form. - const reportElement = document.querySelector(reportSelectors.regions.report); const conditionFormContainer = reportElement.querySelector(reportSelectors.regions.settingsConditions); if (!conditionFormContainer) { return; @@ -134,6 +137,7 @@ export const init = initialized => { 'resetall', 'resetconditions', 'resetconditionsconfirm', + 'selectacondition', ]); prefetchStrings('core', [ @@ -145,14 +149,14 @@ export const init = initialized => { return; } - // Add condition to report. Use custom events helper to ensure consistency across platforms. - $(document).on(CustomEvents.events.accessibleChange, reportSelectors.actions.reportAddCondition, event => { + // Add condition to report. + document.addEventListener('change', event => { const reportAddCondition = event.target.closest(reportSelectors.actions.reportAddCondition); if (reportAddCondition) { event.preventDefault(); // Check if dropdown is closed with no condition selected. - if (reportAddCondition.selectedIndex === 0) { + if (reportAddCondition.value === "" || reportAddCondition.value === "0") { return; } diff --git a/reportbuilder/amd/src/local/editor/filters.js b/reportbuilder/amd/src/local/editor/filters.js index 8b29c9873b0..f509f2507cb 100644 --- a/reportbuilder/amd/src/local/editor/filters.js +++ b/reportbuilder/amd/src/local/editor/filters.js @@ -24,7 +24,7 @@ "use strict"; import $ from 'jquery'; -import CustomEvents from 'core/custom_interaction_events'; +import AutoComplete from 'core/form-autocomplete'; import 'core/inplace_editable'; import Notification from 'core/notification'; import Pending from 'core/pending'; @@ -65,7 +65,11 @@ const reloadSettingsFiltersRegion = (reportElement, templateContext) => { * Initialise filters form, must be called on each init because the form container is re-created when switching editor modes */ const initFiltersForm = () => { - CustomEvents.define(reportSelectors.actions.reportAddFilter, [CustomEvents.events.accessibleChange]); + const reportElement = document.querySelector(reportSelectors.regions.report); + + // Enhance filter selector. + const reportAddFilter = reportElement.querySelector(reportSelectors.actions.reportAddFilter); + AutoComplete.enhance(reportAddFilter, false, '', getString('selectafilter', 'core_reportbuilder')); }; /** @@ -80,6 +84,7 @@ export const init = initialized => { 'filteradded', 'filterdeleted', 'filtermoved', + 'selectafilter', ]); prefetchStrings('core', [ @@ -91,14 +96,14 @@ export const init = initialized => { return; } - // Add filter to report. Use custom events helper to ensure consistency across platforms. - $(document).on(CustomEvents.events.accessibleChange, reportSelectors.actions.reportAddFilter, event => { + // Add filter to report. + document.addEventListener('change', event => { const reportAddFilter = event.target.closest(reportSelectors.actions.reportAddFilter); if (reportAddFilter) { event.preventDefault(); // Check if dropdown is closed with no filter selected. - if (reportAddFilter.selectedIndex === 0) { + if (reportAddFilter.value === "" || reportAddFilter.value === "0") { return; } diff --git a/reportbuilder/templates/local/settings/conditions.mustache b/reportbuilder/templates/local/settings/conditions.mustache index 913313ee866..82c0382c5fd 100644 --- a/reportbuilder/templates/local/settings/conditions.mustache +++ b/reportbuilder/templates/local/settings/conditions.mustache @@ -41,17 +41,16 @@
{{#conditions}} {{#hasavailableconditions}} -
+
diff --git a/reportbuilder/templates/local/settings/filters.mustache b/reportbuilder/templates/local/settings/filters.mustache index 58574f74f73..c0e26bb0daa 100644 --- a/reportbuilder/templates/local/settings/filters.mustache +++ b/reportbuilder/templates/local/settings/filters.mustache @@ -45,17 +45,16 @@
{{#filters}} {{#hasavailablefilters}} -
+
diff --git a/theme/boost/scss/moodle/reportbuilder.scss b/theme/boost/scss/moodle/reportbuilder.scss index dc6ca46a939..c7f8752d893 100644 --- a/theme/boost/scss/moodle/reportbuilder.scss +++ b/theme/boost/scss/moodle/reportbuilder.scss @@ -216,6 +216,21 @@ $rb-right-sidebar-width: 350px !default; width: $rb-right-sidebar-width; flex-shrink: 0; } + + // Improve autocomplete styles. + div[data-region="settings-conditions"] .reportbuilder-conditions-select, + div[data-region="settings-filters"] .reportbuilder-filters-select { + .form-autocomplete-selection { + display: none; + } + .form-autocomplete-input { + width: 100%; + } + .form-autocomplete-suggestions { + width: calc(100% - 2 * #{map-get($spacers, 2)}); + } + } + .list-group-item { padding: .75rem; .icon { diff --git a/theme/boost/style/moodle.css b/theme/boost/style/moodle.css index 740edb0159c..712b7da655b 100644 --- a/theme/boost/style/moodle.css +++ b/theme/boost/style/moodle.css @@ -37998,6 +37998,18 @@ div.editor_atto_toolbar button .icon { flex-shrink: 0; } } +.reportbuilder-sidebar-settings div[data-region=settings-conditions] .reportbuilder-conditions-select .form-autocomplete-selection, +.reportbuilder-sidebar-settings div[data-region=settings-filters] .reportbuilder-filters-select .form-autocomplete-selection { + display: none; +} +.reportbuilder-sidebar-settings div[data-region=settings-conditions] .reportbuilder-conditions-select .form-autocomplete-input, +.reportbuilder-sidebar-settings div[data-region=settings-filters] .reportbuilder-filters-select .form-autocomplete-input { + width: 100%; +} +.reportbuilder-sidebar-settings div[data-region=settings-conditions] .reportbuilder-conditions-select .form-autocomplete-suggestions, +.reportbuilder-sidebar-settings div[data-region=settings-filters] .reportbuilder-filters-select .form-autocomplete-suggestions { + width: calc(100% - 2 * 0.5rem); +} .reportbuilder-sidebar-settings .list-group-item { padding: 0.75rem; } diff --git a/theme/classic/style/moodle.css b/theme/classic/style/moodle.css index 752aec897dc..3fd3a381a4a 100644 --- a/theme/classic/style/moodle.css +++ b/theme/classic/style/moodle.css @@ -37932,6 +37932,18 @@ div.editor_atto_toolbar button .icon { flex-shrink: 0; } } +.reportbuilder-sidebar-settings div[data-region=settings-conditions] .reportbuilder-conditions-select .form-autocomplete-selection, +.reportbuilder-sidebar-settings div[data-region=settings-filters] .reportbuilder-filters-select .form-autocomplete-selection { + display: none; +} +.reportbuilder-sidebar-settings div[data-region=settings-conditions] .reportbuilder-conditions-select .form-autocomplete-input, +.reportbuilder-sidebar-settings div[data-region=settings-filters] .reportbuilder-filters-select .form-autocomplete-input { + width: 100%; +} +.reportbuilder-sidebar-settings div[data-region=settings-conditions] .reportbuilder-conditions-select .form-autocomplete-suggestions, +.reportbuilder-sidebar-settings div[data-region=settings-filters] .reportbuilder-filters-select .form-autocomplete-suggestions { + width: calc(100% - 2 * 0.5rem); +} .reportbuilder-sidebar-settings .list-group-item { padding: 0.75rem; }