diff --git a/reportbuilder/amd/build/local/editor/sorting.min.js b/reportbuilder/amd/build/local/editor/sorting.min.js index 50af982b37d..07d70313fe5 100644 --- a/reportbuilder/amd/build/local/editor/sorting.min.js +++ b/reportbuilder/amd/build/local/editor/sorting.min.js @@ -1,3 +1,3 @@ -define("core_reportbuilder/local/editor/sorting",["exports","jquery","core/inplace_editable","core/notification","core/pending","core/pubsub","core/sortable_list","core/str","core/toast","core_reportbuilder/local/selectors","core_reportbuilder/local/repository/sorting","core/templates","core/event_dispatcher","core_reportbuilder/local/events"],(function(_exports,_jquery,_inplace_editable,_notification,_pending,_pubsub,_sortable_list,_str,_toast,reportSelectors,_sorting,_templates,_event_dispatcher,reportEvents){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),_notification=_interopRequireDefault(_notification),_pending=_interopRequireDefault(_pending),_sortable_list=_interopRequireDefault(_sortable_list),reportSelectors=_interopRequireWildcard(reportSelectors),_templates=_interopRequireDefault(_templates),reportEvents=_interopRequireWildcard(reportEvents);const SORTORDER_ASCENDING=4,SORTORDER_DESCENDING=3,reloadSettingsSortingRegion=context=>{const pendingPromise=new _pending.default("core_reportbuilder/sorting:reload"),settingsSortingRegion=document.querySelector(reportSelectors.regions.settingsSorting);return _templates.default.renderForPromise("core_reportbuilder/local/settings/sorting",{sorting:context}).then((_ref=>{let{html:html,js:js}=_ref;return _templates.default.replaceNode(settingsSortingRegion,html,js),pendingPromise.resolve()}))},updateSorting=(reportElement,element,sortenabled,sortdirection)=>{const reportId=reportElement.dataset.reportId,listElement=element.closest("li"),columnId=listElement.dataset.columnSortId,columnName=listElement.dataset.columnSortName;return(0,_sorting.toggleColumnSorting)(reportId,columnId,sortenabled,sortdirection).then(reloadSettingsSortingRegion).then((()=>(0,_str.get_string)("columnsortupdated","core_reportbuilder",columnName))).then(_toast.add).then((()=>((0,_event_dispatcher.dispatchEvent)(reportEvents.tableReload,{},reportElement),null)))};_exports.init=initialized=>{initialized||((0,_pubsub.subscribe)(reportEvents.publish.reportColumnsUpdated,(data=>reloadSettingsSortingRegion(data).catch(_notification.default.exception))),document.addEventListener("click",(event=>{const toggleSorting=event.target.closest(reportSelectors.actions.reportToggleColumnSort);if(toggleSorting){event.preventDefault();const pendingPromise=new _pending.default("core_reportbuilder/sorting:toggle"),reportElement=toggleSorting.closest(reportSelectors.regions.report),sortdirection=parseInt(toggleSorting.closest("li").dataset.columnSortDirection);updateSorting(reportElement,toggleSorting,toggleSorting.checked,sortdirection).then((()=>{const toggleSortingElement=document.getElementById(toggleSorting.id);return null==toggleSortingElement||toggleSortingElement.focus(),pendingPromise.resolve()})).catch(_notification.default.exception)}const toggleSortDirection=event.target.closest(reportSelectors.actions.reportToggleColumnSortDirection);if(toggleSortDirection){event.preventDefault();const pendingPromise=new _pending.default("core_reportbuilder/sorting:direction"),reportElement=toggleSortDirection.closest(reportSelectors.regions.report),listElement=toggleSortDirection.closest("li"),sortenabled=listElement.dataset.columnSortEnabled;let sortdirection=parseInt(listElement.dataset.columnSortDirection);sortdirection===SORTORDER_ASCENDING?sortdirection=SORTORDER_DESCENDING:sortdirection===SORTORDER_DESCENDING&&(sortdirection=SORTORDER_ASCENDING),updateSorting(reportElement,toggleSortDirection,sortenabled,sortdirection).then((()=>{const toggleSortDirectionElement=document.getElementById(toggleSortDirection.id);return null==toggleSortDirectionElement||toggleSortDirectionElement.focus(),pendingPromise.resolve()})).catch(_notification.default.exception)}})),new _sortable_list.default("".concat(reportSelectors.regions.settingsSorting," ul"),{isHorizontal:!1}).getElementName=element=>Promise.resolve(element.data("columnSortName")),(0,_jquery.default)(document).on(_sortable_list.default.EVENTS.DROP,"".concat(reportSelectors.regions.report," li[data-column-sort-id]"),((event,info)=>{if(info.positionChanged){const pendingPromise=new _pending.default("core_reportbuilder/sorting:reorder"),reportElement=event.target.closest(reportSelectors.regions.report),columnId=info.element.data("columnSortId"),columnPosition=info.element.data("columnSortPosition");let targetColumnSortPosition=info.targetNextElement.data("columnSortPosition")||info.element.siblings().length+2;targetColumnSortPosition>columnPosition&&targetColumnSortPosition--,(0,_sorting.reorderColumnSorting)(reportElement.dataset.reportId,columnId,targetColumnSortPosition).then(reloadSettingsSortingRegion).then((()=>(0,_str.get_string)("columnsortupdated","core_reportbuilder",info.element.data("columnSortName")))).then(_toast.add).then((()=>((0,_event_dispatcher.dispatchEvent)(reportEvents.tableReload,{},reportElement),null))).then((()=>pendingPromise.resolve())).catch(_notification.default.exception)}})))}})); +define("core_reportbuilder/local/editor/sorting",["exports","jquery","core/inplace_editable","core/notification","core/pending","core/pubsub","core/sortable_list","core/str","core/toast","core_reportbuilder/local/selectors","core_reportbuilder/local/repository/sorting","core/templates","core/event_dispatcher","core_reportbuilder/local/events"],(function(_exports,_jquery,_inplace_editable,_notification,_pending,_pubsub,_sortable_list,_str,_toast,reportSelectors,_sorting,_templates,_event_dispatcher,reportEvents){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),_notification=_interopRequireDefault(_notification),_pending=_interopRequireDefault(_pending),_sortable_list=_interopRequireDefault(_sortable_list),reportSelectors=_interopRequireWildcard(reportSelectors),_templates=_interopRequireDefault(_templates),reportEvents=_interopRequireWildcard(reportEvents);const SORTORDER_ASCENDING=4,SORTORDER_DESCENDING=3,reloadSettingsSortingRegion=context=>{const pendingPromise=new _pending.default("core_reportbuilder/sorting:reload"),settingsSortingRegion=document.querySelector(reportSelectors.regions.settingsSorting);return _templates.default.renderForPromise("core_reportbuilder/local/settings/sorting",{sorting:context}).then((_ref=>{let{html:html,js:js}=_ref;return _templates.default.replaceNode(settingsSortingRegion,html,js),pendingPromise.resolve()}))},updateSorting=(reportElement,element,sortenabled,sortdirection)=>{const reportId=reportElement.dataset.reportId,listElement=element.closest("li"),columnId=listElement.dataset.columnSortId,columnName=listElement.dataset.columnSortName;return(0,_sorting.toggleColumnSorting)(reportId,columnId,sortenabled,sortdirection).then(reloadSettingsSortingRegion).then((()=>(0,_str.get_string)("columnsortupdated","core_reportbuilder",columnName))).then(_toast.add).then((()=>((0,_event_dispatcher.dispatchEvent)(reportEvents.tableReload,{},reportElement),null)))};_exports.init=initialized=>{initialized||((0,_pubsub.subscribe)(reportEvents.publish.reportColumnsUpdated,(data=>reloadSettingsSortingRegion(data).catch(_notification.default.exception))),document.addEventListener("click",(event=>{const toggleSorting=event.target.closest(reportSelectors.actions.reportToggleColumnSort);if(toggleSorting){event.preventDefault();const pendingPromise=new _pending.default("core_reportbuilder/sorting:toggle"),reportElement=toggleSorting.closest(reportSelectors.regions.report),sortdirection=parseInt(toggleSorting.closest("li").dataset.columnSortDirection);updateSorting(reportElement,toggleSorting,toggleSorting.checked,sortdirection).then((()=>{const toggleSortingElement=document.getElementById(toggleSorting.id);return null==toggleSortingElement||toggleSortingElement.focus(),pendingPromise.resolve()})).catch(_notification.default.exception)}const toggleSortDirection=event.target.closest(reportSelectors.actions.reportToggleColumnSortDirection);if(toggleSortDirection){event.preventDefault();const pendingPromise=new _pending.default("core_reportbuilder/sorting:direction"),reportElement=toggleSortDirection.closest(reportSelectors.regions.report),listElement=toggleSortDirection.closest("li"),toggleSorting=listElement.querySelector(reportSelectors.actions.reportToggleColumnSort);let sortdirection=parseInt(listElement.dataset.columnSortDirection);sortdirection===SORTORDER_ASCENDING?sortdirection=SORTORDER_DESCENDING:sortdirection===SORTORDER_DESCENDING&&(sortdirection=SORTORDER_ASCENDING),updateSorting(reportElement,toggleSortDirection,toggleSorting.checked,sortdirection).then((()=>{const toggleSortDirectionElement=document.getElementById(toggleSortDirection.id);return null==toggleSortDirectionElement||toggleSortDirectionElement.focus(),pendingPromise.resolve()})).catch(_notification.default.exception)}})),new _sortable_list.default("".concat(reportSelectors.regions.settingsSorting," ul"),{isHorizontal:!1}).getElementName=element=>Promise.resolve(element.data("columnSortName")),(0,_jquery.default)(document).on(_sortable_list.default.EVENTS.DROP,"".concat(reportSelectors.regions.report," li[data-column-sort-id]"),((event,info)=>{if(info.positionChanged){const pendingPromise=new _pending.default("core_reportbuilder/sorting:reorder"),reportElement=event.target.closest(reportSelectors.regions.report),columnId=info.element.data("columnSortId"),columnPosition=info.element.data("columnSortPosition");let targetColumnSortPosition=info.targetNextElement.data("columnSortPosition")||info.element.siblings().length+2;targetColumnSortPosition>columnPosition&&targetColumnSortPosition--,(0,_sorting.reorderColumnSorting)(reportElement.dataset.reportId,columnId,targetColumnSortPosition).then(reloadSettingsSortingRegion).then((()=>(0,_str.get_string)("columnsortupdated","core_reportbuilder",info.element.data("columnSortName")))).then(_toast.add).then((()=>((0,_event_dispatcher.dispatchEvent)(reportEvents.tableReload,{},reportElement),null))).then((()=>pendingPromise.resolve())).catch(_notification.default.exception)}})))}})); //# sourceMappingURL=sorting.min.js.map \ No newline at end of file diff --git a/reportbuilder/amd/build/local/editor/sorting.min.js.map b/reportbuilder/amd/build/local/editor/sorting.min.js.map index b6b9a4d5c93..7fba81ed85f 100644 --- a/reportbuilder/amd/build/local/editor/sorting.min.js.map +++ b/reportbuilder/amd/build/local/editor/sorting.min.js.map @@ -1 +1 @@ -{"version":3,"file":"sorting.min.js","sources":["../../../src/local/editor/sorting.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 columns sorting editor\n *\n * @module core_reportbuilder/local/editor/sorting\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 Notification from 'core/notification';\nimport Pending from 'core/pending';\nimport {subscribe} from 'core/pubsub';\nimport SortableList from 'core/sortable_list';\nimport {get_string as getString} from 'core/str';\nimport {add as addToast} from 'core/toast';\nimport * as reportSelectors from 'core_reportbuilder/local/selectors';\nimport {reorderColumnSorting, toggleColumnSorting} from 'core_reportbuilder/local/repository/sorting';\nimport Templates from 'core/templates';\nimport {dispatchEvent} from 'core/event_dispatcher';\nimport * as reportEvents from 'core_reportbuilder/local/events';\n\n// These constants match PHP consts SORT_ASC, SORT_DESC.\nconst SORTORDER = {\n ASCENDING: 4,\n DESCENDING: 3,\n};\n\n/**\n * Reload sorting settings region\n *\n * @param {Object} context\n * @return {Promise}\n */\nconst reloadSettingsSortingRegion = context => {\n const pendingPromise = new Pending('core_reportbuilder/sorting:reload');\n const settingsSortingRegion = document.querySelector(reportSelectors.regions.settingsSorting);\n\n return Templates.renderForPromise('core_reportbuilder/local/settings/sorting', {sorting: context})\n .then(({html, js}) => {\n Templates.replaceNode(settingsSortingRegion, html, js);\n return pendingPromise.resolve();\n });\n};\n\n/**\n * Updates column sorting\n *\n * @param {Element} reportElement\n * @param {Element} element\n * @param {Number} sortenabled\n * @param {Number} sortdirection\n * @return {Promise}\n */\nconst updateSorting = (reportElement, element, sortenabled, sortdirection) => {\n const reportId = reportElement.dataset.reportId;\n const listElement = element.closest('li');\n const columnId = listElement.dataset.columnSortId;\n const columnName = listElement.dataset.columnSortName;\n\n return toggleColumnSorting(reportId, columnId, sortenabled, sortdirection)\n .then(reloadSettingsSortingRegion)\n .then(() => getString('columnsortupdated', 'core_reportbuilder', columnName))\n .then(addToast)\n .then(() => {\n dispatchEvent(reportEvents.tableReload, {}, reportElement);\n return null;\n });\n};\n\n/**\n * Initialise module\n *\n * @param {Boolean} initialized Ensure we only add our listeners once\n */\nexport const init = (initialized) => {\n if (initialized) {\n return;\n }\n\n // Update sorting region each time report columns are updated (added or removed).\n subscribe(reportEvents.publish.reportColumnsUpdated, data => reloadSettingsSortingRegion(data)\n .catch(Notification.exception)\n );\n\n document.addEventListener('click', event => {\n\n // Enable/disable sorting on columns.\n const toggleSorting = event.target.closest(reportSelectors.actions.reportToggleColumnSort);\n if (toggleSorting) {\n event.preventDefault();\n\n const pendingPromise = new Pending('core_reportbuilder/sorting:toggle');\n const reportElement = toggleSorting.closest(reportSelectors.regions.report);\n const sortdirection = parseInt(toggleSorting.closest('li').dataset.columnSortDirection);\n\n updateSorting(reportElement, toggleSorting, toggleSorting.checked, sortdirection)\n .then(() => {\n // Re-focus the toggle sorting element after reloading the region.\n const toggleSortingElement = document.getElementById(toggleSorting.id);\n toggleSortingElement?.focus();\n return pendingPromise.resolve();\n })\n .catch(Notification.exception);\n }\n\n // Change column sort direction.\n const toggleSortDirection = event.target.closest(reportSelectors.actions.reportToggleColumnSortDirection);\n if (toggleSortDirection) {\n event.preventDefault();\n\n const pendingPromise = new Pending('core_reportbuilder/sorting:direction');\n const reportElement = toggleSortDirection.closest(reportSelectors.regions.report);\n const listElement = toggleSortDirection.closest('li');\n const sortenabled = listElement.dataset.columnSortEnabled;\n\n let sortdirection = parseInt(listElement.dataset.columnSortDirection);\n if (sortdirection === SORTORDER.ASCENDING) {\n sortdirection = SORTORDER.DESCENDING;\n } else if (sortdirection === SORTORDER.DESCENDING) {\n sortdirection = SORTORDER.ASCENDING;\n }\n\n updateSorting(reportElement, toggleSortDirection, sortenabled, sortdirection)\n .then(() => {\n // Re-focus the toggle sort direction element after reloading the region.\n const toggleSortDirectionElement = document.getElementById(toggleSortDirection.id);\n toggleSortDirectionElement?.focus();\n return pendingPromise.resolve();\n })\n .catch(Notification.exception);\n }\n });\n\n // Initialize sortable list to handle column sorting moving (note JQuery dependency, see MDL-72293 for resolution).\n var columnsSortingSortableList = new SortableList(`${reportSelectors.regions.settingsSorting} ul`, {isHorizontal: false});\n columnsSortingSortableList.getElementName = element => Promise.resolve(element.data('columnSortName'));\n\n $(document).on(SortableList.EVENTS.DROP, `${reportSelectors.regions.report} li[data-column-sort-id]`, (event, info) => {\n if (info.positionChanged) {\n const pendingPromise = new Pending('core_reportbuilder/sorting:reorder');\n const reportElement = event.target.closest(reportSelectors.regions.report);\n const columnId = info.element.data('columnSortId');\n const columnPosition = info.element.data('columnSortPosition');\n\n // Select target position, if moving to the end then count number of element siblings.\n let targetColumnSortPosition = info.targetNextElement.data('columnSortPosition') || info.element.siblings().length + 2;\n if (targetColumnSortPosition > columnPosition) {\n targetColumnSortPosition--;\n }\n\n reorderColumnSorting(reportElement.dataset.reportId, columnId, targetColumnSortPosition)\n .then(reloadSettingsSortingRegion)\n .then(() => getString('columnsortupdated', 'core_reportbuilder', info.element.data('columnSortName')))\n .then(addToast)\n .then(() => {\n dispatchEvent(reportEvents.tableReload, {}, reportElement);\n return null;\n })\n .then(() => pendingPromise.resolve())\n .catch(Notification.exception);\n }\n });\n};\n"],"names":["SORTORDER","reloadSettingsSortingRegion","context","pendingPromise","Pending","settingsSortingRegion","document","querySelector","reportSelectors","regions","settingsSorting","Templates","renderForPromise","sorting","then","_ref","html","js","replaceNode","resolve","updateSorting","reportElement","element","sortenabled","sortdirection","reportId","dataset","listElement","closest","columnId","columnSortId","columnName","columnSortName","addToast","reportEvents","tableReload","initialized","publish","reportColumnsUpdated","data","catch","Notification","exception","addEventListener","event","toggleSorting","target","actions","reportToggleColumnSort","preventDefault","report","parseInt","columnSortDirection","checked","toggleSortingElement","getElementById","id","focus","toggleSortDirection","reportToggleColumnSortDirection","columnSortEnabled","toggleSortDirectionElement","SortableList","isHorizontal","getElementName","Promise","on","EVENTS","DROP","info","positionChanged","columnPosition","targetColumnSortPosition","targetNextElement","siblings","length"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sorting.min.js","sources":["../../../src/local/editor/sorting.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 columns sorting editor\n *\n * @module core_reportbuilder/local/editor/sorting\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 Notification from 'core/notification';\nimport Pending from 'core/pending';\nimport {subscribe} from 'core/pubsub';\nimport SortableList from 'core/sortable_list';\nimport {get_string as getString} from 'core/str';\nimport {add as addToast} from 'core/toast';\nimport * as reportSelectors from 'core_reportbuilder/local/selectors';\nimport {reorderColumnSorting, toggleColumnSorting} from 'core_reportbuilder/local/repository/sorting';\nimport Templates from 'core/templates';\nimport {dispatchEvent} from 'core/event_dispatcher';\nimport * as reportEvents from 'core_reportbuilder/local/events';\n\n// These constants match PHP consts SORT_ASC, SORT_DESC.\nconst SORTORDER = {\n ASCENDING: 4,\n DESCENDING: 3,\n};\n\n/**\n * Reload sorting settings region\n *\n * @param {Object} context\n * @return {Promise}\n */\nconst reloadSettingsSortingRegion = context => {\n const pendingPromise = new Pending('core_reportbuilder/sorting:reload');\n const settingsSortingRegion = document.querySelector(reportSelectors.regions.settingsSorting);\n\n return Templates.renderForPromise('core_reportbuilder/local/settings/sorting', {sorting: context})\n .then(({html, js}) => {\n Templates.replaceNode(settingsSortingRegion, html, js);\n return pendingPromise.resolve();\n });\n};\n\n/**\n * Updates column sorting\n *\n * @param {Element} reportElement\n * @param {Element} element\n * @param {Number} sortenabled\n * @param {Number} sortdirection\n * @return {Promise}\n */\nconst updateSorting = (reportElement, element, sortenabled, sortdirection) => {\n const reportId = reportElement.dataset.reportId;\n const listElement = element.closest('li');\n const columnId = listElement.dataset.columnSortId;\n const columnName = listElement.dataset.columnSortName;\n\n return toggleColumnSorting(reportId, columnId, sortenabled, sortdirection)\n .then(reloadSettingsSortingRegion)\n .then(() => getString('columnsortupdated', 'core_reportbuilder', columnName))\n .then(addToast)\n .then(() => {\n dispatchEvent(reportEvents.tableReload, {}, reportElement);\n return null;\n });\n};\n\n/**\n * Initialise module\n *\n * @param {Boolean} initialized Ensure we only add our listeners once\n */\nexport const init = (initialized) => {\n if (initialized) {\n return;\n }\n\n // Update sorting region each time report columns are updated (added or removed).\n subscribe(reportEvents.publish.reportColumnsUpdated, data => reloadSettingsSortingRegion(data)\n .catch(Notification.exception)\n );\n\n document.addEventListener('click', event => {\n\n // Enable/disable sorting on columns.\n const toggleSorting = event.target.closest(reportSelectors.actions.reportToggleColumnSort);\n if (toggleSorting) {\n event.preventDefault();\n\n const pendingPromise = new Pending('core_reportbuilder/sorting:toggle');\n const reportElement = toggleSorting.closest(reportSelectors.regions.report);\n const sortdirection = parseInt(toggleSorting.closest('li').dataset.columnSortDirection);\n\n updateSorting(reportElement, toggleSorting, toggleSorting.checked, sortdirection)\n .then(() => {\n // Re-focus the toggle sorting element after reloading the region.\n const toggleSortingElement = document.getElementById(toggleSorting.id);\n toggleSortingElement?.focus();\n return pendingPromise.resolve();\n })\n .catch(Notification.exception);\n }\n\n // Change column sort direction.\n const toggleSortDirection = event.target.closest(reportSelectors.actions.reportToggleColumnSortDirection);\n if (toggleSortDirection) {\n event.preventDefault();\n\n const pendingPromise = new Pending('core_reportbuilder/sorting:direction');\n const reportElement = toggleSortDirection.closest(reportSelectors.regions.report);\n const listElement = toggleSortDirection.closest('li');\n const toggleSorting = listElement.querySelector(reportSelectors.actions.reportToggleColumnSort);\n\n let sortdirection = parseInt(listElement.dataset.columnSortDirection);\n if (sortdirection === SORTORDER.ASCENDING) {\n sortdirection = SORTORDER.DESCENDING;\n } else if (sortdirection === SORTORDER.DESCENDING) {\n sortdirection = SORTORDER.ASCENDING;\n }\n\n updateSorting(reportElement, toggleSortDirection, toggleSorting.checked, sortdirection)\n .then(() => {\n // Re-focus the toggle sort direction element after reloading the region.\n const toggleSortDirectionElement = document.getElementById(toggleSortDirection.id);\n toggleSortDirectionElement?.focus();\n return pendingPromise.resolve();\n })\n .catch(Notification.exception);\n }\n });\n\n // Initialize sortable list to handle column sorting moving (note JQuery dependency, see MDL-72293 for resolution).\n var columnsSortingSortableList = new SortableList(`${reportSelectors.regions.settingsSorting} ul`, {isHorizontal: false});\n columnsSortingSortableList.getElementName = element => Promise.resolve(element.data('columnSortName'));\n\n $(document).on(SortableList.EVENTS.DROP, `${reportSelectors.regions.report} li[data-column-sort-id]`, (event, info) => {\n if (info.positionChanged) {\n const pendingPromise = new Pending('core_reportbuilder/sorting:reorder');\n const reportElement = event.target.closest(reportSelectors.regions.report);\n const columnId = info.element.data('columnSortId');\n const columnPosition = info.element.data('columnSortPosition');\n\n // Select target position, if moving to the end then count number of element siblings.\n let targetColumnSortPosition = info.targetNextElement.data('columnSortPosition') || info.element.siblings().length + 2;\n if (targetColumnSortPosition > columnPosition) {\n targetColumnSortPosition--;\n }\n\n reorderColumnSorting(reportElement.dataset.reportId, columnId, targetColumnSortPosition)\n .then(reloadSettingsSortingRegion)\n .then(() => getString('columnsortupdated', 'core_reportbuilder', info.element.data('columnSortName')))\n .then(addToast)\n .then(() => {\n dispatchEvent(reportEvents.tableReload, {}, reportElement);\n return null;\n })\n .then(() => pendingPromise.resolve())\n .catch(Notification.exception);\n }\n });\n};\n"],"names":["SORTORDER","reloadSettingsSortingRegion","context","pendingPromise","Pending","settingsSortingRegion","document","querySelector","reportSelectors","regions","settingsSorting","Templates","renderForPromise","sorting","then","_ref","html","js","replaceNode","resolve","updateSorting","reportElement","element","sortenabled","sortdirection","reportId","dataset","listElement","closest","columnId","columnSortId","columnName","columnSortName","addToast","reportEvents","tableReload","initialized","publish","reportColumnsUpdated","data","catch","Notification","exception","addEventListener","event","toggleSorting","target","actions","reportToggleColumnSort","preventDefault","report","parseInt","columnSortDirection","checked","toggleSortingElement","getElementById","id","focus","toggleSortDirection","reportToggleColumnSortDirection","toggleSortDirectionElement","SortableList","isHorizontal","getElementName","Promise","on","EVENTS","DROP","info","positionChanged","columnPosition","targetColumnSortPosition","targetNextElement","siblings","length"],"mappings":"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"} \ No newline at end of file diff --git a/reportbuilder/amd/src/local/editor/sorting.js b/reportbuilder/amd/src/local/editor/sorting.js index 8973daa1723..906a817b211 100644 --- a/reportbuilder/amd/src/local/editor/sorting.js +++ b/reportbuilder/amd/src/local/editor/sorting.js @@ -129,7 +129,7 @@ export const init = (initialized) => { const pendingPromise = new Pending('core_reportbuilder/sorting:direction'); const reportElement = toggleSortDirection.closest(reportSelectors.regions.report); const listElement = toggleSortDirection.closest('li'); - const sortenabled = listElement.dataset.columnSortEnabled; + const toggleSorting = listElement.querySelector(reportSelectors.actions.reportToggleColumnSort); let sortdirection = parseInt(listElement.dataset.columnSortDirection); if (sortdirection === SORTORDER.ASCENDING) { @@ -138,7 +138,7 @@ export const init = (initialized) => { sortdirection = SORTORDER.ASCENDING; } - updateSorting(reportElement, toggleSortDirection, sortenabled, sortdirection) + updateSorting(reportElement, toggleSortDirection, toggleSorting.checked, sortdirection) .then(() => { // Re-focus the toggle sort direction element after reloading the region. const toggleSortDirectionElement = document.getElementById(toggleSortDirection.id); diff --git a/reportbuilder/classes/external/custom_report_columns_sorting_exporter.php b/reportbuilder/classes/external/custom_report_columns_sorting_exporter.php index 2fe31585f4a..a9da4f7abeb 100644 --- a/reportbuilder/classes/external/custom_report_columns_sorting_exporter.php +++ b/reportbuilder/classes/external/custom_report_columns_sorting_exporter.php @@ -61,7 +61,7 @@ class custom_report_columns_sorting_exporter extends exporter { 'title' => ['type' => PARAM_TEXT], 'heading' => ['type' => PARAM_TEXT], 'sortdirection' => ['type' => PARAM_INT], - 'sortenabled' => ['type' => PARAM_INT], + 'sortenabled' => ['type' => PARAM_BOOL], 'sortorder' => ['type' => PARAM_INT], 'sorticon' => [ 'type' => [ @@ -120,7 +120,7 @@ class custom_report_columns_sorting_exporter extends exporter { 'title' => $columntitle, 'heading' => $columnheading !== '' ? $columnheading : $columntitle, 'sortdirection' => $persistent->get('sortdirection'), - 'sortenabled' => (int)$persistent->get('sortenabled'), + 'sortenabled' => $persistent->get('sortenabled'), 'sortorder' => $persistent->get('sortorder'), 'sorticon' => $sorticon->export_for_pix(), 'movetitle' => get_string('movesorting', 'core_reportbuilder', $columntitle), diff --git a/reportbuilder/classes/external/custom_report_exporter.php b/reportbuilder/classes/external/custom_report_exporter.php index f313e33f16f..fb62bca7282 100644 --- a/reportbuilder/classes/external/custom_report_exporter.php +++ b/reportbuilder/classes/external/custom_report_exporter.php @@ -97,11 +97,8 @@ class custom_report_exporter extends persistent_exporter { 'cardview' => ['type' => custom_report_card_view_exporter::read_properties_definition()], 'filtersapplied' => ['type' => PARAM_INT], 'filterspresent' => ['type' => PARAM_BOOL], - 'filtersform' => [ - 'type' => PARAM_RAW, - 'optional' => true, - ], - 'editmode' => ['type' => PARAM_INT], + 'filtersform' => ['type' => PARAM_RAW], + 'editmode' => ['type' => PARAM_BOOL], 'javascript' => ['type' => PARAM_RAW], ]; } @@ -164,7 +161,7 @@ class custom_report_exporter extends persistent_exporter { 'filtersapplied' => $report->get_applied_filter_count(), 'filterspresent' => $filterspresent, 'filtersform' => $filtersform, - 'editmode' => (int)$this->editmode, + 'editmode' => $this->editmode, 'javascript' => '', ]; } diff --git a/reportbuilder/templates/local/dynamictabs/editor.mustache b/reportbuilder/templates/local/dynamictabs/editor.mustache index 6d1011d5479..92f0d18e1ba 100644 --- a/reportbuilder/templates/local/dynamictabs/editor.mustache +++ b/reportbuilder/templates/local/dynamictabs/editor.mustache @@ -104,8 +104,14 @@