diff --git a/public/reportbuilder/amd/build/local/repository/modals.min.js b/public/reportbuilder/amd/build/local/repository/modals.min.js index 5eb39147a01..cf74d543969 100644 --- a/public/reportbuilder/amd/build/local/repository/modals.min.js +++ b/public/reportbuilder/amd/build/local/repository/modals.min.js @@ -5,6 +5,6 @@ define("core_reportbuilder/local/repository/modals",["exports","core_form/modalf * @module core_reportbuilder/local/repository/modals * @copyright 2021 David Matamoros * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.createScheduleModal=_exports.createReportModal=_exports.createDuplicateReportModal=void 0,_modalform=(obj=_modalform)&&obj.__esModule?obj:{default:obj};const createModalForm=(triggerElement,modalTitle,formClass,formArgs)=>new _modalform.default({modalConfig:{title:modalTitle},formClass:formClass,args:formArgs,saveButtonText:(0,_str.getString)("save","moodle"),returnFocus:triggerElement});_exports.createReportModal=function(triggerElement,modalTitle){let reportId=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return createModalForm(triggerElement,modalTitle,"core_reportbuilder\\form\\report",{id:reportId})};_exports.createDuplicateReportModal=(triggerElement,modalTitle,reportId,reportName)=>createModalForm(triggerElement,modalTitle,"core_reportbuilder\\form\\duplicate_report",{id:reportId,name:reportName});_exports.createScheduleModal=function(triggerElement,modalTitle,reportId){let scheduleId=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;return createModalForm(triggerElement,modalTitle,"core_reportbuilder\\form\\schedule",{reportid:reportId,id:scheduleId})}})); + */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.createScheduleModal=_exports.createReportModal=_exports.createDuplicateReportModal=void 0,_modalform=(obj=_modalform)&&obj.__esModule?obj:{default:obj};const createModalForm=(triggerElement,modalTitle,formClass,formArgs)=>new _modalform.default({modalConfig:{title:modalTitle},formClass:formClass,args:formArgs,saveButtonText:(0,_str.getString)("save","moodle"),returnFocus:triggerElement});_exports.createReportModal=function(triggerElement,modalTitle){let reportId=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return createModalForm(triggerElement,modalTitle,"core_reportbuilder\\form\\report",{id:reportId})};_exports.createDuplicateReportModal=(triggerElement,modalTitle,reportId,reportName)=>createModalForm(triggerElement,modalTitle,"core_reportbuilder\\form\\duplicate_report",{id:reportId,name:reportName});_exports.createScheduleModal=function(triggerElement,modalTitle,reportId){let scheduleId=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,scheduleClass=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"";return createModalForm(triggerElement,modalTitle,"core_reportbuilder\\form\\schedule",{reportid:reportId,id:scheduleId,classname:scheduleClass})}})); //# sourceMappingURL=modals.min.js.map \ No newline at end of file diff --git a/public/reportbuilder/amd/build/local/repository/modals.min.js.map b/public/reportbuilder/amd/build/local/repository/modals.min.js.map index 77228f201e7..7b796ffe0fe 100644 --- a/public/reportbuilder/amd/build/local/repository/modals.min.js.map +++ b/public/reportbuilder/amd/build/local/repository/modals.min.js.map @@ -1 +1 @@ -{"version":3,"file":"modals.min.js","sources":["../../../src/local/repository/modals.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 * Module to handle modal form requests\n *\n * @module core_reportbuilder/local/repository/modals\n * @copyright 2021 David Matamoros \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport ModalForm from 'core_form/modalform';\nimport {getString} from 'core/str';\n\n/**\n * Return modal instance\n *\n * @param {EventTarget} triggerElement\n * @param {Promise} modalTitle\n * @param {String} formClass\n * @param {Object} formArgs\n * @return {ModalForm}\n */\nconst createModalForm = (triggerElement, modalTitle, formClass, formArgs) => {\n return new ModalForm({\n modalConfig: {\n title: modalTitle,\n },\n formClass: formClass,\n args: formArgs,\n saveButtonText: getString('save', 'moodle'),\n returnFocus: triggerElement,\n });\n};\n\n/**\n * Return report modal instance\n *\n * @param {EventTarget} triggerElement\n * @param {Promise} modalTitle\n * @param {Number} reportId\n * @return {ModalForm}\n */\nexport const createReportModal = (triggerElement, modalTitle, reportId = 0) => {\n return createModalForm(triggerElement, modalTitle, 'core_reportbuilder\\\\form\\\\report', {\n id: reportId,\n });\n};\n\n/**\n * Return duplicate report modal instance\n *\n * @param {EventTarget} triggerElement\n * @param {Promise} modalTitle\n * @param {Number} reportId\n * @param {String} reportName\n * @return {ModalForm}\n */\nexport const createDuplicateReportModal = (triggerElement, modalTitle, reportId, reportName) => {\n return createModalForm(triggerElement, modalTitle, 'core_reportbuilder\\\\form\\\\duplicate_report', {\n id: reportId,\n name: reportName,\n });\n};\n\n/**\n * Return schedule modal instance\n *\n * @param {EventTarget} triggerElement\n * @param {Promise} modalTitle\n * @param {Number} reportId\n * @param {Number} scheduleId\n * @return {ModalForm}\n */\nexport const createScheduleModal = (triggerElement, modalTitle, reportId, scheduleId = 0) => {\n return createModalForm(triggerElement, modalTitle, 'core_reportbuilder\\\\form\\\\schedule', {\n reportid: reportId,\n id: scheduleId,\n });\n};\n"],"names":["createModalForm","triggerElement","modalTitle","formClass","formArgs","ModalForm","modalConfig","title","args","saveButtonText","returnFocus","reportId","id","reportName","name","scheduleId","reportid"],"mappings":";;;;;;;oOAmCMA,gBAAkB,CAACC,eAAgBC,WAAYC,UAAWC,WACrD,IAAIC,mBAAU,CACjBC,YAAa,CACTC,MAAOL,YAEXC,UAAWA,UACXK,KAAMJ,SACNK,gBAAgB,kBAAU,OAAQ,UAClCC,YAAaT,4CAYY,SAACA,eAAgBC,gBAAYS,gEAAW,SAC9DX,gBAAgBC,eAAgBC,WAAY,mCAAoC,CACnFU,GAAID,gDAa8B,CAACV,eAAgBC,WAAYS,SAAUE,aACtEb,gBAAgBC,eAAgBC,WAAY,6CAA8C,CAC7FU,GAAID,SACJG,KAAMD,0CAaqB,SAACZ,eAAgBC,WAAYS,cAAUI,kEAAa,SAC5Ef,gBAAgBC,eAAgBC,WAAY,qCAAsC,CACrFc,SAAUL,SACVC,GAAIG"} \ No newline at end of file +{"version":3,"file":"modals.min.js","sources":["../../../src/local/repository/modals.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 * Module to handle modal form requests\n *\n * @module core_reportbuilder/local/repository/modals\n * @copyright 2021 David Matamoros \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport ModalForm from 'core_form/modalform';\nimport {getString} from 'core/str';\n\n/**\n * Return modal instance\n *\n * @param {EventTarget} triggerElement\n * @param {Promise} modalTitle\n * @param {String} formClass\n * @param {Object} formArgs\n * @return {ModalForm}\n */\nconst createModalForm = (triggerElement, modalTitle, formClass, formArgs) => {\n return new ModalForm({\n modalConfig: {\n title: modalTitle,\n },\n formClass: formClass,\n args: formArgs,\n saveButtonText: getString('save', 'moodle'),\n returnFocus: triggerElement,\n });\n};\n\n/**\n * Return report modal instance\n *\n * @param {EventTarget} triggerElement\n * @param {Promise} modalTitle\n * @param {Number} reportId\n * @return {ModalForm}\n */\nexport const createReportModal = (triggerElement, modalTitle, reportId = 0) => {\n return createModalForm(triggerElement, modalTitle, 'core_reportbuilder\\\\form\\\\report', {\n id: reportId,\n });\n};\n\n/**\n * Return duplicate report modal instance\n *\n * @param {EventTarget} triggerElement\n * @param {Promise} modalTitle\n * @param {Number} reportId\n * @param {String} reportName\n * @return {ModalForm}\n */\nexport const createDuplicateReportModal = (triggerElement, modalTitle, reportId, reportName) => {\n return createModalForm(triggerElement, modalTitle, 'core_reportbuilder\\\\form\\\\duplicate_report', {\n id: reportId,\n name: reportName,\n });\n};\n\n/**\n * Return schedule modal instance\n *\n * @param {EventTarget} triggerElement\n * @param {Promise} modalTitle\n * @param {Number} reportId\n * @param {Number} scheduleId\n * @param {String} scheduleClass\n * @return {ModalForm}\n */\nexport const createScheduleModal = (triggerElement, modalTitle, reportId, scheduleId = 0, scheduleClass = '') => {\n return createModalForm(triggerElement, modalTitle, 'core_reportbuilder\\\\form\\\\schedule', {\n reportid: reportId,\n id: scheduleId,\n classname: scheduleClass,\n });\n};\n"],"names":["createModalForm","triggerElement","modalTitle","formClass","formArgs","ModalForm","modalConfig","title","args","saveButtonText","returnFocus","reportId","id","reportName","name","scheduleId","scheduleClass","reportid","classname"],"mappings":";;;;;;;oOAmCMA,gBAAkB,CAACC,eAAgBC,WAAYC,UAAWC,WACrD,IAAIC,mBAAU,CACjBC,YAAa,CACTC,MAAOL,YAEXC,UAAWA,UACXK,KAAMJ,SACNK,gBAAgB,kBAAU,OAAQ,UAClCC,YAAaT,4CAYY,SAACA,eAAgBC,gBAAYS,gEAAW,SAC9DX,gBAAgBC,eAAgBC,WAAY,mCAAoC,CACnFU,GAAID,gDAa8B,CAACV,eAAgBC,WAAYS,SAAUE,aACtEb,gBAAgBC,eAAgBC,WAAY,6CAA8C,CAC7FU,GAAID,SACJG,KAAMD,0CAcqB,SAACZ,eAAgBC,WAAYS,cAAUI,kEAAa,EAAGC,qEAAgB,UAC/FhB,gBAAgBC,eAAgBC,WAAY,qCAAsC,CACrFe,SAAUN,SACVC,GAAIG,WACJG,UAAWF"} \ No newline at end of file diff --git a/public/reportbuilder/amd/build/schedules.min.js b/public/reportbuilder/amd/build/schedules.min.js index 73bbf3a06ea..9b8275696a7 100644 --- a/public/reportbuilder/amd/build/schedules.min.js +++ b/public/reportbuilder/amd/build/schedules.min.js @@ -1,3 +1,3 @@ -define("core_reportbuilder/schedules",["exports","core/event_dispatcher","core/inplace_editable","core/notification","core/pending","core/prefetch","core/str","core/toast","core_reportbuilder/local/events","core_reportbuilder/local/selectors","core_reportbuilder/local/repository/modals","core_reportbuilder/local/repository/schedules"],(function(_exports,_event_dispatcher,_inplace_editable,_notification,_pending,_prefetch,_str,_toast,reportEvents,reportSelectors,_modals,_schedules){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,_notification=_interopRequireDefault(_notification),_pending=_interopRequireDefault(_pending),reportEvents=_interopRequireWildcard(reportEvents),reportSelectors=_interopRequireWildcard(reportSelectors);let initialized=!1;_exports.init=reportId=>{(0,_prefetch.prefetchStrings)("core_reportbuilder",["deleteschedule","deletescheduleconfirm","disableschedule","editscheduledetails","enableschedule","newschedule","schedulecreated","scheduledeleted","schedulesent","scheduleupdated","sendschedule","sendscheduleconfirm"]),(0,_prefetch.prefetchStrings)("core",["confirm","delete"]),initialized||(document.addEventListener("click",(event=>{if(event.target.closest(reportSelectors.actions.scheduleCreate)){event.preventDefault();const scheduleModal=(0,_modals.createScheduleModal)(event.target,(0,_str.getString)("newschedule","core_reportbuilder"),reportId);scheduleModal.addEventListener(scheduleModal.events.FORM_SUBMITTED,(()=>{(0,_str.getString)("schedulecreated","core_reportbuilder").then(_toast.add).then((()=>{const reportElement=document.querySelector(reportSelectors.regions.report);(0,_event_dispatcher.dispatchEvent)(reportEvents.tableReload,{},reportElement)})).catch(_notification.default.exception)})),scheduleModal.show()}const scheduleToggle=event.target.closest(reportSelectors.actions.scheduleToggle);if(scheduleToggle){const pendingPromise=new _pending.default("core_reportbuilder/schedules:toggle"),scheduleStateToggle=+!Number(scheduleToggle.dataset.state);(0,_schedules.toggleSchedule)(reportId,scheduleToggle.dataset.id,scheduleStateToggle).then((()=>{scheduleToggle.closest("tr").classList.toggle("text-muted"),scheduleToggle.dataset.state=scheduleStateToggle;const stringKey=scheduleStateToggle?"disableschedule":"enableschedule";return(0,_str.getString)(stringKey,"core_reportbuilder")})).then((toggleLabel=>(scheduleToggle.parentElement.querySelector('label[for="'.concat(scheduleToggle.id,'"] > span')).innerHTML=toggleLabel,pendingPromise.resolve()))).catch(_notification.default.exception)}const scheduleEdit=event.target.closest(reportSelectors.actions.scheduleEdit);if(scheduleEdit){event.preventDefault();const triggerElement=scheduleEdit.closest(".dropdown").querySelector(".dropdown-toggle"),scheduleModal=(0,_modals.createScheduleModal)(triggerElement,(0,_str.getString)("editscheduledetails","core_reportbuilder"),reportId,scheduleEdit.dataset.scheduleId);scheduleModal.addEventListener(scheduleModal.events.FORM_SUBMITTED,(()=>{(0,_str.getString)("scheduleupdated","core_reportbuilder").then(_toast.add).then((()=>{const reportElement=scheduleEdit.closest(reportSelectors.regions.report);(0,_event_dispatcher.dispatchEvent)(reportEvents.tableReload,{},reportElement)})).catch(_notification.default.exception)})),scheduleModal.show()}const scheduleSend=event.target.closest(reportSelectors.actions.scheduleSend);if(scheduleSend){event.preventDefault();const triggerElement=scheduleSend.closest(".dropdown").querySelector(".dropdown-toggle");_notification.default.saveCancelPromise((0,_str.getString)("sendschedule","core_reportbuilder"),(0,_str.getString)("sendscheduleconfirm","core_reportbuilder",scheduleSend.dataset.scheduleName),(0,_str.getString)("confirm","core"),{triggerElement:triggerElement}).then((()=>{const pendingPromise=new _pending.default("core_reportbuilder/schedules:send");return(0,_schedules.sendSchedule)(reportId,scheduleSend.dataset.scheduleId).then((0,_toast.add)((0,_str.getString)("schedulesent","core_reportbuilder"))).then((()=>pendingPromise.resolve())).catch(_notification.default.exception)})).catch((()=>{}))}const scheduleDelete=event.target.closest(reportSelectors.actions.scheduleDelete);if(scheduleDelete){event.preventDefault();const triggerElement=scheduleDelete.closest(".dropdown").querySelector(".dropdown-toggle");_notification.default.saveCancelPromise((0,_str.getString)("deleteschedule","core_reportbuilder"),(0,_str.getString)("deletescheduleconfirm","core_reportbuilder",scheduleDelete.dataset.scheduleName),(0,_str.getString)("delete","core"),{triggerElement:triggerElement}).then((()=>{const pendingPromise=new _pending.default("core_reportbuilder/schedules:delete");return(0,_schedules.deleteSchedule)(reportId,scheduleDelete.dataset.scheduleId).then((0,_toast.add)((0,_str.getString)("scheduledeleted","core_reportbuilder"))).then((()=>{const reportElement=scheduleDelete.closest(reportSelectors.regions.report);return(0,_event_dispatcher.dispatchEvent)(reportEvents.tableReload,{preservePagination:!0},reportElement),pendingPromise.resolve()})).catch(_notification.default.exception)})).catch((()=>{}))}})),initialized=!0)}})); +define("core_reportbuilder/schedules",["exports","core/event_dispatcher","core/inplace_editable","core/notification","core/pending","core/prefetch","core/str","core/toast","core_reportbuilder/local/events","core_reportbuilder/local/selectors","core_reportbuilder/local/repository/modals","core_reportbuilder/local/repository/schedules"],(function(_exports,_event_dispatcher,_inplace_editable,_notification,_pending,_prefetch,_str,_toast,reportEvents,reportSelectors,_modals,_schedules){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,_notification=_interopRequireDefault(_notification),_pending=_interopRequireDefault(_pending),reportEvents=_interopRequireWildcard(reportEvents),reportSelectors=_interopRequireWildcard(reportSelectors);let initialized=!1;_exports.init=reportId=>{(0,_prefetch.prefetchStrings)("core_reportbuilder",["deleteschedule","deletescheduleconfirm","disableschedule","editscheduledetails","enableschedule","newschedule","schedulecreated","scheduledeleted","schedulesent","scheduleupdated","sendschedule","sendscheduleconfirm"]),(0,_prefetch.prefetchStrings)("core",["confirm","delete"]),initialized||(document.addEventListener("click",(event=>{const scheduleCreate=event.target.closest(reportSelectors.actions.scheduleCreate);if(scheduleCreate){event.preventDefault();const{scheduleClass:scheduleClass}=scheduleCreate.dataset,scheduleModal=(0,_modals.createScheduleModal)(event.target,(0,_str.getString)("newschedule","core_reportbuilder"),reportId,0,scheduleClass);scheduleModal.addEventListener(scheduleModal.events.FORM_SUBMITTED,(()=>{(0,_str.getString)("schedulecreated","core_reportbuilder").then(_toast.add).then((()=>{const reportElement=document.querySelector(reportSelectors.regions.report);(0,_event_dispatcher.dispatchEvent)(reportEvents.tableReload,{},reportElement)})).catch(_notification.default.exception)})),scheduleModal.show()}const scheduleToggle=event.target.closest(reportSelectors.actions.scheduleToggle);if(scheduleToggle){const pendingPromise=new _pending.default("core_reportbuilder/schedules:toggle"),scheduleStateToggle=+!Number(scheduleToggle.dataset.state);(0,_schedules.toggleSchedule)(reportId,scheduleToggle.dataset.id,scheduleStateToggle).then((()=>{scheduleToggle.closest("tr").classList.toggle("text-muted"),scheduleToggle.dataset.state=scheduleStateToggle;const stringKey=scheduleStateToggle?"disableschedule":"enableschedule";return(0,_str.getString)(stringKey,"core_reportbuilder")})).then((toggleLabel=>(scheduleToggle.parentElement.querySelector('label[for="'.concat(scheduleToggle.id,'"] > span')).innerHTML=toggleLabel,pendingPromise.resolve()))).catch(_notification.default.exception)}const scheduleEdit=event.target.closest(reportSelectors.actions.scheduleEdit);if(scheduleEdit){event.preventDefault();const triggerElement=scheduleEdit.closest(".dropdown").querySelector(".dropdown-toggle"),scheduleModal=(0,_modals.createScheduleModal)(triggerElement,(0,_str.getString)("editscheduledetails","core_reportbuilder"),reportId,scheduleEdit.dataset.scheduleId);scheduleModal.addEventListener(scheduleModal.events.FORM_SUBMITTED,(()=>{(0,_str.getString)("scheduleupdated","core_reportbuilder").then(_toast.add).then((()=>{const reportElement=scheduleEdit.closest(reportSelectors.regions.report);(0,_event_dispatcher.dispatchEvent)(reportEvents.tableReload,{},reportElement)})).catch(_notification.default.exception)})),scheduleModal.show()}const scheduleSend=event.target.closest(reportSelectors.actions.scheduleSend);if(scheduleSend){event.preventDefault();const triggerElement=scheduleSend.closest(".dropdown").querySelector(".dropdown-toggle");_notification.default.saveCancelPromise((0,_str.getString)("sendschedule","core_reportbuilder"),(0,_str.getString)("sendscheduleconfirm","core_reportbuilder",scheduleSend.dataset.scheduleName),(0,_str.getString)("confirm","core"),{triggerElement:triggerElement}).then((()=>{const pendingPromise=new _pending.default("core_reportbuilder/schedules:send");return(0,_schedules.sendSchedule)(reportId,scheduleSend.dataset.scheduleId).then((0,_toast.add)((0,_str.getString)("schedulesent","core_reportbuilder"))).then((()=>pendingPromise.resolve())).catch(_notification.default.exception)})).catch((()=>{}))}const scheduleDelete=event.target.closest(reportSelectors.actions.scheduleDelete);if(scheduleDelete){event.preventDefault();const triggerElement=scheduleDelete.closest(".dropdown").querySelector(".dropdown-toggle");_notification.default.saveCancelPromise((0,_str.getString)("deleteschedule","core_reportbuilder"),(0,_str.getString)("deletescheduleconfirm","core_reportbuilder",scheduleDelete.dataset.scheduleName),(0,_str.getString)("delete","core"),{triggerElement:triggerElement}).then((()=>{const pendingPromise=new _pending.default("core_reportbuilder/schedules:delete");return(0,_schedules.deleteSchedule)(reportId,scheduleDelete.dataset.scheduleId).then((0,_toast.add)((0,_str.getString)("scheduledeleted","core_reportbuilder"))).then((()=>{const reportElement=scheduleDelete.closest(reportSelectors.regions.report);return(0,_event_dispatcher.dispatchEvent)(reportEvents.tableReload,{preservePagination:!0},reportElement),pendingPromise.resolve()})).catch(_notification.default.exception)})).catch((()=>{}))}})),initialized=!0)}})); //# sourceMappingURL=schedules.min.js.map \ No newline at end of file diff --git a/public/reportbuilder/amd/build/schedules.min.js.map b/public/reportbuilder/amd/build/schedules.min.js.map index a8b823a912a..f4795e098fd 100644 --- a/public/reportbuilder/amd/build/schedules.min.js.map +++ b/public/reportbuilder/amd/build/schedules.min.js.map @@ -1 +1 @@ -{"version":3,"file":"schedules.min.js","sources":["../src/schedules.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 audiences\n *\n * @module core_reportbuilder/schedules\n * @copyright 2021 Paul Holden \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n\"use strict\";\n\nimport {dispatchEvent} from 'core/event_dispatcher';\nimport 'core/inplace_editable';\nimport Notification from 'core/notification';\nimport Pending from 'core/pending';\nimport {prefetchStrings} from 'core/prefetch';\nimport {getString} from 'core/str';\nimport {add as addToast} from 'core/toast';\nimport * as reportEvents from 'core_reportbuilder/local/events';\nimport * as reportSelectors from 'core_reportbuilder/local/selectors';\nimport {createScheduleModal} from 'core_reportbuilder/local/repository/modals';\nimport {deleteSchedule, sendSchedule, toggleSchedule} from 'core_reportbuilder/local/repository/schedules';\n\nlet initialized = false;\n\n/**\n * Initialise schedules tab\n *\n * @param {Number} reportId\n */\nexport const init = reportId => {\n prefetchStrings('core_reportbuilder', [\n 'deleteschedule',\n 'deletescheduleconfirm',\n 'disableschedule',\n 'editscheduledetails',\n 'enableschedule',\n 'newschedule',\n 'schedulecreated',\n 'scheduledeleted',\n 'schedulesent',\n 'scheduleupdated',\n 'sendschedule',\n 'sendscheduleconfirm',\n ]);\n\n prefetchStrings('core', [\n 'confirm',\n 'delete',\n ]);\n\n if (initialized) {\n // We already added the event listeners (can be called multiple times by mustache template).\n return;\n }\n\n document.addEventListener('click', event => {\n\n // Create schedule.\n const scheduleCreate = event.target.closest(reportSelectors.actions.scheduleCreate);\n if (scheduleCreate) {\n event.preventDefault();\n\n const scheduleModal = createScheduleModal(event.target, getString('newschedule', 'core_reportbuilder'), reportId);\n scheduleModal.addEventListener(scheduleModal.events.FORM_SUBMITTED, () => {\n getString('schedulecreated', 'core_reportbuilder')\n .then(addToast)\n .then(() => {\n const reportElement = document.querySelector(reportSelectors.regions.report);\n dispatchEvent(reportEvents.tableReload, {}, reportElement);\n return;\n })\n .catch(Notification.exception);\n });\n\n scheduleModal.show();\n }\n\n // Toggle schedule.\n const scheduleToggle = event.target.closest(reportSelectors.actions.scheduleToggle);\n if (scheduleToggle) {\n const pendingPromise = new Pending('core_reportbuilder/schedules:toggle');\n const scheduleStateToggle = +!Number(scheduleToggle.dataset.state);\n\n toggleSchedule(reportId, scheduleToggle.dataset.id, scheduleStateToggle)\n .then(() => {\n const tableRow = scheduleToggle.closest('tr');\n tableRow.classList.toggle('text-muted');\n\n scheduleToggle.dataset.state = scheduleStateToggle;\n\n const stringKey = scheduleStateToggle ? 'disableschedule' : 'enableschedule';\n return getString(stringKey, 'core_reportbuilder');\n })\n .then(toggleLabel => {\n const labelContainer = scheduleToggle.parentElement.querySelector(`label[for=\"${scheduleToggle.id}\"] > span`);\n labelContainer.innerHTML = toggleLabel;\n return pendingPromise.resolve();\n })\n .catch(Notification.exception);\n }\n\n // Edit schedule.\n const scheduleEdit = event.target.closest(reportSelectors.actions.scheduleEdit);\n if (scheduleEdit) {\n event.preventDefault();\n\n // Use triggerElement to return focus to the action menu toggle.\n const triggerElement = scheduleEdit.closest('.dropdown').querySelector('.dropdown-toggle');\n const scheduleModal = createScheduleModal(triggerElement, getString('editscheduledetails', 'core_reportbuilder'),\n reportId, scheduleEdit.dataset.scheduleId);\n scheduleModal.addEventListener(scheduleModal.events.FORM_SUBMITTED, () => {\n getString('scheduleupdated', 'core_reportbuilder')\n .then(addToast)\n .then(() => {\n const reportElement = scheduleEdit.closest(reportSelectors.regions.report);\n dispatchEvent(reportEvents.tableReload, {}, reportElement);\n return;\n })\n .catch(Notification.exception);\n });\n\n scheduleModal.show();\n }\n\n // Send schedule.\n const scheduleSend = event.target.closest(reportSelectors.actions.scheduleSend);\n if (scheduleSend) {\n event.preventDefault();\n\n // Use triggerElement to return focus to the action menu toggle.\n const triggerElement = scheduleSend.closest('.dropdown').querySelector('.dropdown-toggle');\n Notification.saveCancelPromise(\n getString('sendschedule', 'core_reportbuilder'),\n getString('sendscheduleconfirm', 'core_reportbuilder', scheduleSend.dataset.scheduleName),\n getString('confirm', 'core'),\n {triggerElement}\n ).then(() => {\n const pendingPromise = new Pending('core_reportbuilder/schedules:send');\n\n return sendSchedule(reportId, scheduleSend.dataset.scheduleId)\n .then(addToast(getString('schedulesent', 'core_reportbuilder')))\n .then(() => pendingPromise.resolve())\n .catch(Notification.exception);\n }).catch(() => {\n return;\n });\n }\n\n // Delete schedule.\n const scheduleDelete = event.target.closest(reportSelectors.actions.scheduleDelete);\n if (scheduleDelete) {\n event.preventDefault();\n\n // Use triggerElement to return focus to the action menu toggle.\n const triggerElement = scheduleDelete.closest('.dropdown').querySelector('.dropdown-toggle');\n Notification.saveCancelPromise(\n getString('deleteschedule', 'core_reportbuilder'),\n getString('deletescheduleconfirm', 'core_reportbuilder', scheduleDelete.dataset.scheduleName),\n getString('delete', 'core'),\n {triggerElement}\n ).then(() => {\n const pendingPromise = new Pending('core_reportbuilder/schedules:delete');\n\n return deleteSchedule(reportId, scheduleDelete.dataset.scheduleId)\n .then(addToast(getString('scheduledeleted', 'core_reportbuilder')))\n .then(() => {\n const reportElement = scheduleDelete.closest(reportSelectors.regions.report);\n dispatchEvent(reportEvents.tableReload, {preservePagination: true}, reportElement);\n return pendingPromise.resolve();\n })\n .catch(Notification.exception);\n }).catch(() => {\n return;\n });\n }\n });\n\n initialized = true;\n};\n"],"names":["initialized","reportId","document","addEventListener","event","target","closest","reportSelectors","actions","scheduleCreate","preventDefault","scheduleModal","events","FORM_SUBMITTED","then","addToast","reportElement","querySelector","regions","report","reportEvents","tableReload","catch","Notification","exception","show","scheduleToggle","pendingPromise","Pending","scheduleStateToggle","Number","dataset","state","id","classList","toggle","stringKey","toggleLabel","parentElement","innerHTML","resolve","scheduleEdit","triggerElement","scheduleId","scheduleSend","saveCancelPromise","scheduleName","scheduleDelete","preservePagination"],"mappings":"0wDAqCIA,aAAc,gBAOEC,yCACA,qBAAsB,CAClC,iBACA,wBACA,kBACA,sBACA,iBACA,cACA,kBACA,kBACA,eACA,kBACA,eACA,sDAGY,OAAQ,CACpB,UACA,WAGAD,cAKJE,SAASC,iBAAiB,SAASC,WAGRA,MAAMC,OAAOC,QAAQC,gBAAgBC,QAAQC,gBAChD,CAChBL,MAAMM,uBAEAC,eAAgB,+BAAoBP,MAAMC,QAAQ,kBAAU,cAAe,sBAAuBJ,UACxGU,cAAcR,iBAAiBQ,cAAcC,OAAOC,gBAAgB,wBACtD,kBAAmB,sBACxBC,KAAKC,YACLD,MAAK,WACIE,cAAgBd,SAASe,cAAcV,gBAAgBW,QAAQC,4CACvDC,aAAaC,YAAa,GAAIL,kBAG/CM,MAAMC,sBAAaC,cAG5Bb,cAAcc,aAIZC,eAAiBtB,MAAMC,OAAOC,QAAQC,gBAAgBC,QAAQkB,mBAChEA,eAAgB,OACVC,eAAiB,IAAIC,iBAAQ,uCAC7BC,sBAAwBC,OAAOJ,eAAeK,QAAQC,qCAE7C/B,SAAUyB,eAAeK,QAAQE,GAAIJ,qBAC/Cf,MAAK,KACeY,eAAepB,QAAQ,MAC/B4B,UAAUC,OAAO,cAE1BT,eAAeK,QAAQC,MAAQH,0BAEzBO,UAAYP,oBAAsB,kBAAoB,wBACrD,kBAAUO,UAAW,yBAE/BtB,MAAKuB,cACqBX,eAAeY,cAAcrB,mCAA4BS,eAAeO,iBAChFM,UAAYF,YACpBV,eAAea,aAEzBlB,MAAMC,sBAAaC,iBAItBiB,aAAerC,MAAMC,OAAOC,QAAQC,gBAAgBC,QAAQiC,iBAC9DA,aAAc,CACdrC,MAAMM,uBAGAgC,eAAiBD,aAAanC,QAAQ,aAAaW,cAAc,oBACjEN,eAAgB,+BAAoB+B,gBAAgB,kBAAU,sBAAuB,sBACvFzC,SAAUwC,aAAaV,QAAQY,YACnChC,cAAcR,iBAAiBQ,cAAcC,OAAOC,gBAAgB,wBACtD,kBAAmB,sBACxBC,KAAKC,YACLD,MAAK,WACIE,cAAgByB,aAAanC,QAAQC,gBAAgBW,QAAQC,4CACrDC,aAAaC,YAAa,GAAIL,kBAG/CM,MAAMC,sBAAaC,cAG5Bb,cAAcc,aAIZmB,aAAexC,MAAMC,OAAOC,QAAQC,gBAAgBC,QAAQoC,iBAC9DA,aAAc,CACdxC,MAAMM,uBAGAgC,eAAiBE,aAAatC,QAAQ,aAAaW,cAAc,0CAC1D4B,mBACT,kBAAU,eAAgB,uBAC1B,kBAAU,sBAAuB,qBAAsBD,aAAab,QAAQe,eAC5E,kBAAU,UAAW,QACrB,CAACJ,eAAAA,iBACH5B,MAAK,WACGa,eAAiB,IAAIC,iBAAQ,4CAE5B,2BAAa3B,SAAU2C,aAAab,QAAQY,YAC9C7B,MAAK,eAAS,kBAAU,eAAgB,wBACxCA,MAAK,IAAMa,eAAea,YAC1BlB,MAAMC,sBAAaC,cACzBF,OAAM,eAMPyB,eAAiB3C,MAAMC,OAAOC,QAAQC,gBAAgBC,QAAQuC,mBAChEA,eAAgB,CAChB3C,MAAMM,uBAGAgC,eAAiBK,eAAezC,QAAQ,aAAaW,cAAc,0CAC5D4B,mBACT,kBAAU,iBAAkB,uBAC5B,kBAAU,wBAAyB,qBAAsBE,eAAehB,QAAQe,eAChF,kBAAU,SAAU,QACpB,CAACJ,eAAAA,iBACH5B,MAAK,WACGa,eAAiB,IAAIC,iBAAQ,8CAE5B,6BAAe3B,SAAU8C,eAAehB,QAAQY,YAClD7B,MAAK,eAAS,kBAAU,kBAAmB,wBAC3CA,MAAK,WACIE,cAAgB+B,eAAezC,QAAQC,gBAAgBW,QAAQC,kDACvDC,aAAaC,YAAa,CAAC2B,oBAAoB,GAAOhC,eAC7DW,eAAea,aAEzBlB,MAAMC,sBAAaC,cACzBF,OAAM,aAMjBtB,aAAc"} \ No newline at end of file +{"version":3,"file":"schedules.min.js","sources":["../src/schedules.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 audiences\n *\n * @module core_reportbuilder/schedules\n * @copyright 2021 Paul Holden \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n\"use strict\";\n\nimport {dispatchEvent} from 'core/event_dispatcher';\nimport 'core/inplace_editable';\nimport Notification from 'core/notification';\nimport Pending from 'core/pending';\nimport {prefetchStrings} from 'core/prefetch';\nimport {getString} from 'core/str';\nimport {add as addToast} from 'core/toast';\nimport * as reportEvents from 'core_reportbuilder/local/events';\nimport * as reportSelectors from 'core_reportbuilder/local/selectors';\nimport {createScheduleModal} from 'core_reportbuilder/local/repository/modals';\nimport {deleteSchedule, sendSchedule, toggleSchedule} from 'core_reportbuilder/local/repository/schedules';\n\nlet initialized = false;\n\n/**\n * Initialise schedules tab\n *\n * @param {Number} reportId\n */\nexport const init = reportId => {\n prefetchStrings('core_reportbuilder', [\n 'deleteschedule',\n 'deletescheduleconfirm',\n 'disableschedule',\n 'editscheduledetails',\n 'enableschedule',\n 'newschedule',\n 'schedulecreated',\n 'scheduledeleted',\n 'schedulesent',\n 'scheduleupdated',\n 'sendschedule',\n 'sendscheduleconfirm',\n ]);\n\n prefetchStrings('core', [\n 'confirm',\n 'delete',\n ]);\n\n if (initialized) {\n // We already added the event listeners (can be called multiple times by mustache template).\n return;\n }\n\n document.addEventListener('click', event => {\n\n // Create schedule.\n const scheduleCreate = event.target.closest(reportSelectors.actions.scheduleCreate);\n if (scheduleCreate) {\n event.preventDefault();\n\n const {scheduleClass} = scheduleCreate.dataset;\n\n const scheduleModal = createScheduleModal(event.target, getString('newschedule', 'core_reportbuilder'), reportId, 0,\n scheduleClass);\n scheduleModal.addEventListener(scheduleModal.events.FORM_SUBMITTED, () => {\n getString('schedulecreated', 'core_reportbuilder')\n .then(addToast)\n .then(() => {\n const reportElement = document.querySelector(reportSelectors.regions.report);\n dispatchEvent(reportEvents.tableReload, {}, reportElement);\n return;\n })\n .catch(Notification.exception);\n });\n\n scheduleModal.show();\n }\n\n // Toggle schedule.\n const scheduleToggle = event.target.closest(reportSelectors.actions.scheduleToggle);\n if (scheduleToggle) {\n const pendingPromise = new Pending('core_reportbuilder/schedules:toggle');\n const scheduleStateToggle = +!Number(scheduleToggle.dataset.state);\n\n toggleSchedule(reportId, scheduleToggle.dataset.id, scheduleStateToggle)\n .then(() => {\n const tableRow = scheduleToggle.closest('tr');\n tableRow.classList.toggle('text-muted');\n\n scheduleToggle.dataset.state = scheduleStateToggle;\n\n const stringKey = scheduleStateToggle ? 'disableschedule' : 'enableschedule';\n return getString(stringKey, 'core_reportbuilder');\n })\n .then(toggleLabel => {\n const labelContainer = scheduleToggle.parentElement.querySelector(`label[for=\"${scheduleToggle.id}\"] > span`);\n labelContainer.innerHTML = toggleLabel;\n return pendingPromise.resolve();\n })\n .catch(Notification.exception);\n }\n\n // Edit schedule.\n const scheduleEdit = event.target.closest(reportSelectors.actions.scheduleEdit);\n if (scheduleEdit) {\n event.preventDefault();\n\n // Use triggerElement to return focus to the action menu toggle.\n const triggerElement = scheduleEdit.closest('.dropdown').querySelector('.dropdown-toggle');\n const scheduleModal = createScheduleModal(triggerElement, getString('editscheduledetails', 'core_reportbuilder'),\n reportId, scheduleEdit.dataset.scheduleId);\n scheduleModal.addEventListener(scheduleModal.events.FORM_SUBMITTED, () => {\n getString('scheduleupdated', 'core_reportbuilder')\n .then(addToast)\n .then(() => {\n const reportElement = scheduleEdit.closest(reportSelectors.regions.report);\n dispatchEvent(reportEvents.tableReload, {}, reportElement);\n return;\n })\n .catch(Notification.exception);\n });\n\n scheduleModal.show();\n }\n\n // Send schedule.\n const scheduleSend = event.target.closest(reportSelectors.actions.scheduleSend);\n if (scheduleSend) {\n event.preventDefault();\n\n // Use triggerElement to return focus to the action menu toggle.\n const triggerElement = scheduleSend.closest('.dropdown').querySelector('.dropdown-toggle');\n Notification.saveCancelPromise(\n getString('sendschedule', 'core_reportbuilder'),\n getString('sendscheduleconfirm', 'core_reportbuilder', scheduleSend.dataset.scheduleName),\n getString('confirm', 'core'),\n {triggerElement}\n ).then(() => {\n const pendingPromise = new Pending('core_reportbuilder/schedules:send');\n\n return sendSchedule(reportId, scheduleSend.dataset.scheduleId)\n .then(addToast(getString('schedulesent', 'core_reportbuilder')))\n .then(() => pendingPromise.resolve())\n .catch(Notification.exception);\n }).catch(() => {\n return;\n });\n }\n\n // Delete schedule.\n const scheduleDelete = event.target.closest(reportSelectors.actions.scheduleDelete);\n if (scheduleDelete) {\n event.preventDefault();\n\n // Use triggerElement to return focus to the action menu toggle.\n const triggerElement = scheduleDelete.closest('.dropdown').querySelector('.dropdown-toggle');\n Notification.saveCancelPromise(\n getString('deleteschedule', 'core_reportbuilder'),\n getString('deletescheduleconfirm', 'core_reportbuilder', scheduleDelete.dataset.scheduleName),\n getString('delete', 'core'),\n {triggerElement}\n ).then(() => {\n const pendingPromise = new Pending('core_reportbuilder/schedules:delete');\n\n return deleteSchedule(reportId, scheduleDelete.dataset.scheduleId)\n .then(addToast(getString('scheduledeleted', 'core_reportbuilder')))\n .then(() => {\n const reportElement = scheduleDelete.closest(reportSelectors.regions.report);\n dispatchEvent(reportEvents.tableReload, {preservePagination: true}, reportElement);\n return pendingPromise.resolve();\n })\n .catch(Notification.exception);\n }).catch(() => {\n return;\n });\n }\n });\n\n initialized = true;\n};\n"],"names":["initialized","reportId","document","addEventListener","event","scheduleCreate","target","closest","reportSelectors","actions","preventDefault","scheduleClass","dataset","scheduleModal","events","FORM_SUBMITTED","then","addToast","reportElement","querySelector","regions","report","reportEvents","tableReload","catch","Notification","exception","show","scheduleToggle","pendingPromise","Pending","scheduleStateToggle","Number","state","id","classList","toggle","stringKey","toggleLabel","parentElement","innerHTML","resolve","scheduleEdit","triggerElement","scheduleId","scheduleSend","saveCancelPromise","scheduleName","scheduleDelete","preservePagination"],"mappings":"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"} \ No newline at end of file diff --git a/public/reportbuilder/amd/src/local/repository/modals.js b/public/reportbuilder/amd/src/local/repository/modals.js index cc8268d76ed..47ce164bf6a 100644 --- a/public/reportbuilder/amd/src/local/repository/modals.js +++ b/public/reportbuilder/amd/src/local/repository/modals.js @@ -82,11 +82,13 @@ export const createDuplicateReportModal = (triggerElement, modalTitle, reportId, * @param {Promise} modalTitle * @param {Number} reportId * @param {Number} scheduleId + * @param {String} scheduleClass * @return {ModalForm} */ -export const createScheduleModal = (triggerElement, modalTitle, reportId, scheduleId = 0) => { +export const createScheduleModal = (triggerElement, modalTitle, reportId, scheduleId = 0, scheduleClass = '') => { return createModalForm(triggerElement, modalTitle, 'core_reportbuilder\\form\\schedule', { reportid: reportId, id: scheduleId, + classname: scheduleClass, }); }; diff --git a/public/reportbuilder/amd/src/schedules.js b/public/reportbuilder/amd/src/schedules.js index 2ff77ecc811..29ce12c3237 100644 --- a/public/reportbuilder/amd/src/schedules.js +++ b/public/reportbuilder/amd/src/schedules.js @@ -75,7 +75,10 @@ export const init = reportId => { if (scheduleCreate) { event.preventDefault(); - const scheduleModal = createScheduleModal(event.target, getString('newschedule', 'core_reportbuilder'), reportId); + const {scheduleClass} = scheduleCreate.dataset; + + const scheduleModal = createScheduleModal(event.target, getString('newschedule', 'core_reportbuilder'), reportId, 0, + scheduleClass); scheduleModal.addEventListener(scheduleModal.events.FORM_SUBMITTED, () => { getString('schedulecreated', 'core_reportbuilder') .then(addToast) diff --git a/public/reportbuilder/classes/form/schedule.php b/public/reportbuilder/classes/form/schedule.php index a9be825e83f..09445f9efd1 100644 --- a/public/reportbuilder/classes/form/schedule.php +++ b/public/reportbuilder/classes/form/schedule.php @@ -26,10 +26,10 @@ use core\output\notification; use core_form\dynamic_form; use core_reportbuilder\manager; use core_reportbuilder\permission; -use core_reportbuilder\local\helpers\audience; -use core_reportbuilder\local\helpers\schedule as helper; +use core_reportbuilder\local\helpers\{audience, schedule as helper}; use core_reportbuilder\local\models\schedule as model; -use core_reportbuilder\local\report\base; +use core_reportbuilder\local\schedules\base; +use core_reportbuilder\local\report\base as report_base; /** * Schedule form @@ -41,11 +41,30 @@ use core_reportbuilder\local\report\base; class schedule extends dynamic_form { /** - * Return instance of the system report using the filter form + * Return schedule instance * * @return base */ - private function get_report(): base { + private function get_schedule(): base { + $reportid = $this->optional_param('reportid', 0, PARAM_INT); + $scheduleid = $this->optional_param('id', 0, PARAM_INT); + + if ($scheduleid > 0) { + $schedule = model::get_record(['id' => $scheduleid, 'reportid' => $reportid], MUST_EXIST); + return base::from_persistent($schedule); + } else { + /** @var base $scheduleclass */ + $scheduleclass = $this->optional_param('classname', '', PARAM_RAW); + return $scheduleclass::instance(); + } + } + + /** + * Return instance of the system report using the filter form + * + * @return report_base + */ + private function get_report(): report_base { $reportid = $this->optional_param('reportid', 0, PARAM_INT); return manager::get_report_from_id($reportid); } @@ -83,6 +102,9 @@ class schedule extends dynamic_form { $mform->addElement('hidden', 'id'); $mform->setType('id', PARAM_INT); + $mform->addElement('hidden', 'classname'); + $mform->setType('id', PARAM_RAW); + // General fields. $mform->addElement('header', 'headergeneral', get_string('general')); @@ -121,63 +143,47 @@ class schedule extends dynamic_form { } // Audience fields. - $mform->addElement('header', 'headeraudience', get_string('audience', 'core_reportbuilder')); - $mform->setExpanded('headeraudience', true); + $schedule = $this->get_schedule(); + if ($schedule->requires_audience()) { + $mform->addElement('header', 'headeraudience', get_string('audience', 'core_reportbuilder')); + $mform->setExpanded('headeraudience', true); - $audiences = audience::get_base_records($this->optional_param('reportid', 0, PARAM_INT)); - if (empty($audiences)) { - $notification = new notification(get_string('noaudiences', 'core_reportbuilder'), notification::NOTIFY_INFO, false); - $mform->addElement('static', 'noaudiences', '', $OUTPUT->render($notification)); - } - - $audiencecheckboxes = []; - foreach ($audiences as $audience) { - $persistent = $audience->get_persistent(); - - // Check for a custom name, otherwise fall back to default. - if ('' === $audiencelabel = $persistent->get_formatted_heading($context)) { - $audiencelabel = get_string('audiencelabel', 'core_reportbuilder', (object) [ - 'name' => $audience->get_name(), - 'description' => $audience->get_description(), - ]); + $audiences = audience::get_base_records($this->optional_param('reportid', 0, PARAM_INT)); + if (empty($audiences)) { + $notification = new notification(get_string('noaudiences', 'core_reportbuilder'), notification::NOTIFY_INFO, false); + $mform->addElement('static', 'noaudiences', '', $OUTPUT->render($notification)); } - $audiencecheckboxes[] = $mform->createElement('checkbox', $persistent->get('id'), $audiencelabel); + $audiencecheckboxes = []; + foreach ($audiences as $audience) { + $persistent = $audience->get_persistent(); + + // Check for a custom name, otherwise fall back to default. + if ('' === $audiencelabel = $persistent->get_formatted_heading($context)) { + $audiencelabel = get_string('audiencelabel', 'core_reportbuilder', (object) [ + 'name' => $audience->get_name(), + 'description' => $audience->get_description(), + ]); + } + + $audiencecheckboxes[] = $mform->createElement('checkbox', $persistent->get('id'), $audiencelabel); + } + + $mform->addElement('group', 'audiences', '', $audiencecheckboxes, html_writer::div('', 'w-100 mb-2')); } - $mform->addElement('group', 'audiences', '', $audiencecheckboxes, html_writer::div('', 'w-100 mb-2')); - - // Message fields. - $mform->addElement('header', 'headermessage', get_string('messagecontent', 'core_reportbuilder')); - - $mform->addElement('text', 'subject', get_string('messagesubject', 'core_reportbuilder')); - $mform->setType('subject', PARAM_TEXT); - $mform->addRule('subject', null, 'required', null, 'client'); - $mform->addRule('subject', get_string('maximumchars', '', 255), 'maxlength', 255); - - $mform->addElement('editor', 'message', get_string('messagebody', 'core_reportbuilder'), null, ['autosave' => false]); - $mform->setType('message', PARAM_RAW); - $mform->addRule('message', null, 'required', null, 'client'); - - // Advanced. - $mform->addElement('header', 'headeradvanced', get_string('advanced')); - - $mform->addElement('select', 'reportempty', get_string('scheduleempty', 'core_reportbuilder'), - helper::get_report_empty_options()); - $mform->setType('reportempty', PARAM_INT); + // Load schedule type form definition. + $schedule->definition($mform); } /** * Load form data if we are editing an existing schedule */ public function set_data_for_dynamic_submission(): void { - $reportid = $this->optional_param('reportid', 0, PARAM_INT); - $scheduleid = $this->optional_param('id', 0, PARAM_INT); + $schedule = $this->get_schedule(); - if ($scheduleid > 0) { - $schedule = model::get_record(['id' => $scheduleid, 'reportid' => $reportid]); - - $data = (array) $schedule->to_record(); + if ($schedule->get_persistent()->get('id') > 0) { + $data = (array) $schedule->get_persistent()->to_record(); // Pre-process some of the form fields. if (!in_array($data['userviewas'], [model::REPORT_VIEWAS_CREATOR, model::REPORT_VIEWAS_RECIPIENT])) { @@ -185,17 +191,18 @@ class schedule extends dynamic_form { $data['userviewas'] = model::REPORT_VIEWAS_USER; } - $audiences = json_decode($data['audiences']); - $data['audiences'] = array_fill_keys($audiences, 1); + if ($schedule->requires_audience()) { + $audiences = (array) json_decode((string) $data['audiences']); + $data['audiences'] = array_fill_keys($audiences, 1); + } - $data['message'] = [ - 'text' => $data['message'], - 'format' => $data['messageformat'], - ]; + // Load schedule type form definition data. + $data['configdata'] = $schedule->get_configdata(); $this->set_data($data); } else { - $this->set_data(['reportid' => $reportid]); + $reportid = $this->optional_param('reportid', 0, PARAM_INT); + $this->set_data(['reportid' => $reportid, 'classname' => $schedule::class]); } } @@ -220,11 +227,13 @@ class schedule extends dynamic_form { $errors['user'] = get_string('required'); } - if (empty($data['audiences'])) { + // Load schedule type form validation. + $schedule = $this->get_schedule(); + if ($schedule->requires_audience() && empty($data['audiences'])) { $errors['audiences'] = get_string('required'); } - return $errors; + return array_merge($errors, $schedule->validate($data, $files)); } /** @@ -238,13 +247,21 @@ class schedule extends dynamic_form { $data->userviewas = (int) $data->user; } - $data->audiences = json_encode(array_keys($data->audiences)); - ['text' => $data->message, 'format' => $data->messageformat] = $data->message; + $schedule = $this->get_schedule(); - if ($data->id) { + if ($schedule->requires_audience()) { + $data->audiences = json_encode(array_keys($data->audiences)); + } else { + $data->audiences = null; + } + + $data->configdata = json_encode((array) $data->configdata); + + if ($schedule->get_persistent()->get('id') > 0) { helper::update_schedule($data); } else { - helper::create_schedule($data); + unset($data->id); + $schedule::create($data); } } diff --git a/public/reportbuilder/classes/local/helpers/schedule.php b/public/reportbuilder/classes/local/helpers/schedule.php index 5d9657cf00a..481381bb115 100644 --- a/public/reportbuilder/classes/local/helpers/schedule.php +++ b/public/reportbuilder/classes/local/helpers/schedule.php @@ -19,7 +19,7 @@ declare(strict_types=1); namespace core_reportbuilder\local\helpers; use context_user; -use core\{clock, di}; +use core\{component, clock, di}; use core\exception\{coding_exception, invalid_parameter_exception}; use core_user; use stdClass; @@ -50,6 +50,17 @@ class schedule { return class_exists($scheduleclass) && is_subclass_of($scheduleclass, base::class); } + /** + * Return list of all available/valid schedule types + * + * @return base[] + */ + public static function get_schedules(): array { + $classes = component::get_component_classes_in_namespace(null, 'reportbuilder\\schedule'); + + return array_filter(array_keys($classes), [static::class, 'valid']); + } + /** * Create report schedule, calculate when it should be next sent * @@ -327,8 +338,13 @@ class schedule { * @param stdClass $user * @param stored_file $attachment * @return bool + * + * @deprecated since Moodle 5.1 - please do not use this function any more */ + #[\core\attribute\deprecated(reason: 'It is no longer used', since: '5.1', mdl: 'MDL-86066')] public static function send_schedule_message(model $schedule, stdClass $user, stored_file $attachment): bool { + \core\deprecation::emit_deprecation([self::class, __FUNCTION__]); + $message = new message(); $message->component = 'moodle'; $message->name = 'reportbuilderschedule'; @@ -412,12 +428,17 @@ class schedule { * Return list of options for when report is empty * * @return string[] + * + * @deprecated since Moodle 5.1 - please do not use this function any more */ + #[\core\attribute\deprecated(reason: 'It is no longer used', since: '5.1', mdl: 'MDL-86066')] public static function get_report_empty_options(): array { + \core\deprecation::emit_deprecation([self::class, __FUNCTION__]); + return [ - model::REPORT_EMPTY_SEND_EMPTY => get_string('scheduleemptysendwithattachment', 'core_reportbuilder'), - model::REPORT_EMPTY_SEND_WITHOUT => get_string('scheduleemptysendwithoutattachment', 'core_reportbuilder'), - model::REPORT_EMPTY_DONT_SEND => get_string('scheduleemptydontsend', 'core_reportbuilder'), + 0 => get_string('scheduleemptysendwithattachment', 'core_reportbuilder'), + 1 => get_string('scheduleemptysendwithoutattachment', 'core_reportbuilder'), + 2 => get_string('scheduleemptydontsend', 'core_reportbuilder'), ]; } } diff --git a/public/reportbuilder/classes/local/models/schedule.php b/public/reportbuilder/classes/local/models/schedule.php index 82c0703fdca..f28003e8deb 100644 --- a/public/reportbuilder/classes/local/models/schedule.php +++ b/public/reportbuilder/classes/local/models/schedule.php @@ -67,15 +67,6 @@ class schedule extends persistent { /** @var int Annual recurrence */ public const RECURRENCE_ANNUALLY = 5; - /** @var int Send schedule with empty report */ - public const REPORT_EMPTY_SEND_EMPTY = 0; - - /** @var int Send schedule without report */ - public const REPORT_EMPTY_SEND_WITHOUT = 1; - - /** @var int Don't send schedule if report is empty */ - public const REPORT_EMPTY_DONT_SEND = 2; - /** * Return the definition of the properties of this model. * diff --git a/public/reportbuilder/classes/local/systemreports/report_schedules.php b/public/reportbuilder/classes/local/systemreports/report_schedules.php index 58167a184d4..a4bca7d664a 100644 --- a/public/reportbuilder/classes/local/systemreports/report_schedules.php +++ b/public/reportbuilder/classes/local/systemreports/report_schedules.php @@ -30,6 +30,7 @@ use core_reportbuilder\local\filters\{boolean_select, date, text}; use core_reportbuilder\local\helpers\format; use core_reportbuilder\local\models\{report, schedule}; use core_reportbuilder\local\report\{action, column, filter}; +use core_reportbuilder\local\schedules\base; use core_reportbuilder\output\schedule_name_editable; /** @@ -60,7 +61,7 @@ class report_schedules extends system_report { $this->add_base_condition_simple('sc.reportid', $this->get_parameter('reportid', 0, PARAM_INT)); // Select fields required for actions, permission checks, and row class callbacks. - $this->add_base_fields('sc.id, sc.name, sc.enabled, rb.contextid'); + $this->add_base_fields('sc.id, sc.name, sc.enabled, sc.classname, rb.contextid'); // Join user entity for "User modified" column. $entityuser = new user(); @@ -310,31 +311,38 @@ class report_schedules extends system_report { */ protected function add_actions(): void { // Edit action. - $this->add_action(new action( + $this->add_action((new action( new moodle_url('#'), new pix_icon('t/edit', ''), ['data-action' => 'schedule-edit', 'data-schedule-id' => ':id'], false, new lang_string('editscheduledetails', 'core_reportbuilder') - )); + )) + ->add_callback(static function (stdClass $row): bool { + $instance = base::instance(0, $row); + return $instance !== null && $instance->user_can_add(); + })); // Send now action. $this->add_action((new action( new moodle_url('#'), - new pix_icon('t/email', ''), + new pix_icon('t/play', ''), ['data-action' => 'schedule-send', 'data-schedule-id' => ':id', 'data-schedule-name' => ':name'], false, new lang_string('sendschedule', 'core_reportbuilder') )) ->add_callback(function(stdClass $row): bool { + $instance = base::instance(0, $row); + if ($instance === null || !$instance->user_can_add()) { + return false; + } // Ensure data name attribute is properly formatted. - $row->name = (new schedule(0, $row))->get_formatted_name( + $row->name = $instance->get_persistent()->get_formatted_name( context::instance_by_id($row->contextid)); return true; - }) - ); + })); // Delete action. $this->add_action((new action( @@ -350,13 +358,16 @@ class report_schedules extends system_report { new lang_string('deleteschedule', 'core_reportbuilder') )) ->add_callback(function(stdClass $row): bool { + $instance = base::instance(0, $row); + if ($instance !== null && !$instance->user_can_add()) { + return false; + } // Ensure data name attribute is properly formatted. $row->name = (new schedule(0, $row))->get_formatted_name( context::instance_by_id($row->contextid)); return true; - }) - ); + })); } } diff --git a/public/reportbuilder/classes/output/dynamictabs/schedules.php b/public/reportbuilder/classes/output/dynamictabs/schedules.php index 6bb81407d74..17c02c3b342 100644 --- a/public/reportbuilder/classes/output/dynamictabs/schedules.php +++ b/public/reportbuilder/classes/output/dynamictabs/schedules.php @@ -19,13 +19,14 @@ declare(strict_types=1); namespace core_reportbuilder\output\dynamictabs; use context_system; -use renderer_base; +use core\output\{choicelist, renderer_base}; +use core\output\local\dropdown\{dialog, status}; use core\output\dynamic_tabs\base; use core_reportbuilder\permission; use core_reportbuilder\system_report_factory; +use core_reportbuilder\local\helpers\schedule; use core_reportbuilder\local\models\report; use core_reportbuilder\local\systemreports\report_schedules; -use core_reportbuilder\output\report_action; /** * Schedules dynamic tab @@ -45,12 +46,38 @@ class schedules extends base { public function export_for_template(renderer_base $output): array { $report = system_report_factory::create(report_schedules::class, context_system::instance(), '', '', 0, ['reportid' => $this->data['reportid']]); - $report->set_report_action(new report_action( + + // Schedule type menu. + $choicelist = new choicelist(); + $choicelist->set_allow_empty(true); + + // Include those schedule types the user can add. + foreach (schedule::get_schedules() as $schedule) { + $instance = $schedule::instance(); + if ($instance->user_can_add()) { + $choicelist->add_option( + $instance::class, + $instance->get_name(), + [ + 'description' => $instance->get_description(), + 'extras' => ['data-action' => 'schedule-create', 'data-schedule-class' => $instance::class], + ] + ); + } + } + + $dialog = new status( get_string('newschedule', 'core_reportbuilder'), - ['class' => 'btn btn-primary ms-auto', 'data-action' => 'schedule-create'], - )); + $choicelist, + [ + 'classes' => 'd-flex justify-content-end mb-2', + 'buttonclasses' => 'btn btn-primary dropdown-toggle', + ], + ); + $dialog->set_dialog_width(dialog::WIDTH['small']); return [ + 'menu' => $dialog->export_for_template($output), 'reportid' => $this->data['reportid'], 'report' => $report->output(), ]; diff --git a/public/reportbuilder/templates/local/dynamictabs/schedules.mustache b/public/reportbuilder/templates/local/dynamictabs/schedules.mustache index f36bf0943b1..3df0860bd98 100644 --- a/public/reportbuilder/templates/local/dynamictabs/schedules.mustache +++ b/public/reportbuilder/templates/local/dynamictabs/schedules.mustache @@ -21,12 +21,16 @@ Example context (json): { + "menu": {}, "report": "The report content", "reportid": 10 } }}

{{#str}} schedules, core_reportbuilder {{/str}}

+ {{#menu}} + {{> core/local/dropdown/status}} + {{/menu}} {{{ report }}}
diff --git a/public/reportbuilder/tests/behat/audience.feature b/public/reportbuilder/tests/behat/audience.feature index 101bbea6373..0a066a27f59 100644 --- a/public/reportbuilder/tests/behat/audience.feature +++ b/public/reportbuilder/tests/behat/audience.feature @@ -204,6 +204,7 @@ Feature: Configure access to reports based on intended audience And I am on the "My report" "reportbuilder > Editor" page logged in as "admin" And I click on the "Schedules" dynamic tab And I press "New schedule" + And I click on "Schedule an email" "link" in the ".dropdown" "css_element" And I set the following fields in the "New schedule" "dialogue" to these values: | Name | My schedule | | Starting from | ##tomorrow 11:00## | diff --git a/public/reportbuilder/tests/behat/schedules.feature b/public/reportbuilder/tests/behat/schedules.feature index ca539b97a80..5be4927ae12 100644 --- a/public/reportbuilder/tests/behat/schedules.feature +++ b/public/reportbuilder/tests/behat/schedules.feature @@ -30,6 +30,7 @@ Feature: Manage custom report schedules And I press "Save changes" When I click on the "Schedules" dynamic tab And I press "New schedule" + And I click on "Schedule an email" "link" in the ".dropdown" "css_element" And I set the following fields in the "New schedule" "dialogue" to these values: | Name | My schedule | | Starting from | ##tomorrow 11:00## | @@ -52,6 +53,7 @@ Feature: Manage custom report schedules And I set the field "Rename audience 'All users'" to "EnglishSpanish" When I click on the "Schedules" dynamic tab And I press "New schedule" + And I click on "Schedule an email" "link" in the ".dropdown" "css_element" Then I should see "English" in the "New schedule" "dialogue" And I should not see "Spanish" in the "New schedule" "dialogue" And I click on "Cancel" "button" in the "New schedule" "dialogue" @@ -147,11 +149,22 @@ Feature: Manage custom report schedules | Name | My updated schedule | | Starting from | ##tomorrow 11:00## | | All users: All site users | 1 | + | Subject | Tell me how to win your heart | + | Body | For I haven't got a clue | + | If the report is empty | Don't send message | And I click on "Save" "button" in the "Edit schedule details" "dialogue" Then I should see "Schedule updated" And the following should exist in the "Report schedules" table: | Name | Time last sent | Time next send | Modified by | | My updated schedule | Never | ##tomorrow 11:00##%A, %d %B %Y, %H:%M## | Admin User | + And I press "Edit schedule details" action in the "My updated schedule" report row + And the following fields in the "Edit schedule details" "dialogue" match these values: + | Name | My updated schedule | + # | Starting from | ##tomorrow 11:00## | Nope, can't: MDL-86255. + | All users: All site users | 1 | + | Subject | Tell me how to win your heart | + | Body | For I haven't got a clue | + | If the report is empty | Don't send message | Scenario: Send report schedule Given the following "core_reportbuilder > Schedules" exist: