diff --git a/lang/en/reportbuilder.php b/lang/en/reportbuilder.php index fa095f57f78..5183d061b76 100644 --- a/lang/en/reportbuilder.php +++ b/lang/en/reportbuilder.php @@ -92,6 +92,7 @@ $string['deletereport'] = 'Delete report'; $string['deletereportconfirm'] = 'Are you sure you want to delete the report \'{$a}\' and all associated data?'; $string['deleteschedule'] = 'Delete schedule'; $string['deletescheduleconfirm'] = 'Are you sure you want to delete the schedule \'{$a}\'?'; +$string['disableschedule'] = 'Disable schedule'; $string['editaudience'] = 'Edit audience \'{$a}\''; $string['editdetails'] = 'Edit details'; $string['editor'] = 'Editor'; @@ -100,6 +101,7 @@ $string['editreportdetails'] = 'Edit report details'; $string['editreportname'] = 'Edit report name'; $string['editscheduledetails'] = 'Edit schedule details'; $string['editschedulename'] = 'Edit schedule name'; +$string['enableschedule'] = 'Enable schedule'; $string['entitycourse'] = 'Course'; $string['entityuser'] = 'User'; $string['errorreportcreate'] = 'You cannot create a new report'; diff --git a/lib/templates/toggle.mustache b/lib/templates/toggle.mustache new file mode 100644 index 00000000000..5bac5ae4301 --- /dev/null +++ b/lib/templates/toggle.mustache @@ -0,0 +1,48 @@ +{{! + This file is part of Moodle - http://moodle.org/ + + Moodle is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Moodle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Moodle. If not, see . +}} +{{! + @template core/toggle + + Template for toggle element + + Example context (json): + { + "id": "reality-toggle-3", + "checked": true, + "disabled": false, + "dataattributes": [{ + "name": "action", + "value": "toggle-reality" + }], + "label": "Enable/disable reality", + "labelclasses": "sr-only" + } +}} + +
+ + {{$labelmarkup}} + + {{/labelmarkup}} +
diff --git a/reportbuilder/amd/build/schedules.min.js b/reportbuilder/amd/build/schedules.min.js index 5cfb08ad5c1..fccb99df7da 100644 --- a/reportbuilder/amd/build/schedules.min.js +++ b/reportbuilder/amd/build/schedules.min.js @@ -1,2 +1,2 @@ -function _typeof(a){"@babel/helpers - typeof";if("function"==typeof Symbol&&"symbol"==typeof Symbol.iterator){_typeof=function(a){return typeof a}}else{_typeof=function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a}}return _typeof(a)}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(a,b,c,d,e,f,g,h,i,j,k,l){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.init=void 0;d=o(d);e=o(e);i=n(i);j=n(j);function m(){if("function"!=typeof WeakMap)return null;var a=new WeakMap;m=function(){return a};return a}function n(a){if(a&&a.__esModule){return a}if(null===a||"object"!==_typeof(a)&&"function"!=typeof a){return{default:a}}var b=m();if(b&&b.has(a)){return b.get(a)}var c={},d=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var e in a){if(Object.prototype.hasOwnProperty.call(a,e)){var f=d?Object.getOwnPropertyDescriptor(a,e):null;if(f&&(f.get||f.set)){Object.defineProperty(c,e,f)}else{c[e]=a[e]}}}c.default=a;if(b){b.set(a,c)}return c}function o(a){return a&&a.__esModule?a:{default:a}}var p=!1,q=function(a){(0,f.prefetchStrings)("core_reportbuilder",["deleteschedule","deletescheduleconfirm","editscheduledetails","newschedule","schedulecreated","scheduledeleted","schedulesent","scheduleupdated","sendschedule","sendscheduleconfirm"]);(0,f.prefetchStrings)("core",["confirm","delete"]);if(p){return}document.addEventListener("click",function(c){var f=c.target.closest(j.actions.scheduleCreate);if(f){c.preventDefault();var s=(0,k.createScheduleModal)(c.target,(0,g.get_string)("newschedule","core_reportbuilder"),a);s.addEventListener(s.events.FORM_SUBMITTED,function(){(0,g.get_string)("schedulecreated","core_reportbuilder").then(h.add).then(function(){var a=document.querySelector(j.regions.report);(0,b.dispatchEvent)(i.tableReload,{},a)}).catch(d.default.exception)});s.show()}var m=c.target.closest(j.actions.scheduleToggle);if(m){var n=new e.default("core_reportbuilder/schedules:toggle"),o=+!+m.dataset.state;(0,l.toggleSchedule)(a,m.dataset.id,o).then(function(){var a=m.closest("tr");a.classList.toggle("dimmed_text");m.dataset.state=o;return n.resolve()}).catch(d.default.exception)}var p=c.target.closest(j.actions.scheduleEdit);if(p){c.preventDefault();var t=(0,k.createScheduleModal)(p,(0,g.get_string)("editscheduledetails","core_reportbuilder"),a,p.dataset.scheduleId);t.addEventListener(t.events.FORM_SUBMITTED,function(){(0,g.get_string)("scheduleupdated","core_reportbuilder").then(h.add).then(function(){var a=p.closest(j.regions.report);(0,b.dispatchEvent)(i.tableReload,{},a)}).catch(d.default.exception)});t.show()}var q=c.target.closest(j.actions.scheduleSend);if(q){c.preventDefault();d.default.saveCancelPromise((0,g.get_string)("sendschedule","core_reportbuilder"),(0,g.get_string)("sendscheduleconfirm","core_reportbuilder",q.dataset.scheduleName),(0,g.get_string)("confirm","core")).then(function(){var b=new e.default("core_reportbuilder/schedules:send");return(0,l.sendSchedule)(a,q.dataset.scheduleId).then((0,h.add)((0,g.get_string)("schedulesent","core_reportbuilder"))).then(function(){return b.resolve()}).catch(d.default.exception)}).catch(function(){})}var r=c.target.closest(j.actions.scheduleDelete);if(r){c.preventDefault();d.default.saveCancelPromise((0,g.get_string)("deleteschedule","core_reportbuilder"),(0,g.get_string)("deletescheduleconfirm","core_reportbuilder",r.dataset.scheduleName),(0,g.get_string)("delete","core")).then(function(){var c=new e.default("core_reportbuilder/schedules:delete");return(0,l.deleteSchedule)(a,r.dataset.scheduleId).then((0,h.add)((0,g.get_string)("scheduledeleted","core_reportbuilder"))).then(function(){var a=r.closest(j.regions.report);(0,b.dispatchEvent)(i.tableReload,{preservePagination:!0},a);return c.resolve()}).catch(d.default.exception)}).catch(function(){})}});p=!0};a.init=q}); +function _typeof(a){"@babel/helpers - typeof";if("function"==typeof Symbol&&"symbol"==typeof Symbol.iterator){_typeof=function(a){return typeof a}}else{_typeof=function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a}}return _typeof(a)}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(a,b,c,d,e,f,g,h,i,j,k,l){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.init=void 0;d=o(d);e=o(e);i=n(i);j=n(j);function m(){if("function"!=typeof WeakMap)return null;var a=new WeakMap;m=function(){return a};return a}function n(a){if(a&&a.__esModule){return a}if(null===a||"object"!==_typeof(a)&&"function"!=typeof a){return{default:a}}var b=m();if(b&&b.has(a)){return b.get(a)}var c={},d=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var e in a){if(Object.prototype.hasOwnProperty.call(a,e)){var f=d?Object.getOwnPropertyDescriptor(a,e):null;if(f&&(f.get||f.set)){Object.defineProperty(c,e,f)}else{c[e]=a[e]}}}c.default=a;if(b){b.set(a,c)}return c}function o(a){return a&&a.__esModule?a:{default:a}}var p=!1,q=function(a){(0,f.prefetchStrings)("core_reportbuilder",["deleteschedule","deletescheduleconfirm","disableschedule","editscheduledetails","enableschedule","newschedule","schedulecreated","scheduledeleted","schedulesent","scheduleupdated","sendschedule","sendscheduleconfirm"]);(0,f.prefetchStrings)("core",["confirm","delete"]);if(p){return}document.addEventListener("click",function(c){var f=c.target.closest(j.actions.scheduleCreate);if(f){c.preventDefault();var s=(0,k.createScheduleModal)(c.target,(0,g.get_string)("newschedule","core_reportbuilder"),a);s.addEventListener(s.events.FORM_SUBMITTED,function(){(0,g.get_string)("schedulecreated","core_reportbuilder").then(h.add).then(function(){var a=document.querySelector(j.regions.report);(0,b.dispatchEvent)(i.tableReload,{},a)}).catch(d.default.exception)});s.show()}var m=c.target.closest(j.actions.scheduleToggle);if(m){var n=new e.default("core_reportbuilder/schedules:toggle"),o=+!+m.dataset.state;(0,l.toggleSchedule)(a,m.dataset.id,o).then(function(){var a=m.closest("tr");a.classList.toggle("dimmed_text");m.dataset.state=o;var b=o?"disableschedule":"enableschedule";return(0,g.get_string)(b,"core_reportbuilder")}).then(function(a){var b=m.parentElement.querySelector("label[for=\"".concat(m.id,"\"] > span"));b.innerHTML=a;return n.resolve()}).catch(d.default.exception)}var p=c.target.closest(j.actions.scheduleEdit);if(p){c.preventDefault();var t=(0,k.createScheduleModal)(p,(0,g.get_string)("editscheduledetails","core_reportbuilder"),a,p.dataset.scheduleId);t.addEventListener(t.events.FORM_SUBMITTED,function(){(0,g.get_string)("scheduleupdated","core_reportbuilder").then(h.add).then(function(){var a=p.closest(j.regions.report);(0,b.dispatchEvent)(i.tableReload,{},a)}).catch(d.default.exception)});t.show()}var q=c.target.closest(j.actions.scheduleSend);if(q){c.preventDefault();d.default.saveCancelPromise((0,g.get_string)("sendschedule","core_reportbuilder"),(0,g.get_string)("sendscheduleconfirm","core_reportbuilder",q.dataset.scheduleName),(0,g.get_string)("confirm","core")).then(function(){var b=new e.default("core_reportbuilder/schedules:send");return(0,l.sendSchedule)(a,q.dataset.scheduleId).then((0,h.add)((0,g.get_string)("schedulesent","core_reportbuilder"))).then(function(){return b.resolve()}).catch(d.default.exception)}).catch(function(){})}var r=c.target.closest(j.actions.scheduleDelete);if(r){c.preventDefault();d.default.saveCancelPromise((0,g.get_string)("deleteschedule","core_reportbuilder"),(0,g.get_string)("deletescheduleconfirm","core_reportbuilder",r.dataset.scheduleName),(0,g.get_string)("delete","core")).then(function(){var c=new e.default("core_reportbuilder/schedules:delete");return(0,l.deleteSchedule)(a,r.dataset.scheduleId).then((0,h.add)((0,g.get_string)("scheduledeleted","core_reportbuilder"))).then(function(){var a=r.closest(j.regions.report);(0,b.dispatchEvent)(i.tableReload,{preservePagination:!0},a);return c.resolve()}).catch(d.default.exception)}).catch(function(){})}});p=!0};a.init=q}); //# sourceMappingURL=schedules.min.js.map diff --git a/reportbuilder/amd/build/schedules.min.js.map b/reportbuilder/amd/build/schedules.min.js.map index 84a19c582c9..23fade8a18c 100644 --- a/reportbuilder/amd/build/schedules.min.js.map +++ b/reportbuilder/amd/build/schedules.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/schedules.js"],"names":["initialized","init","reportId","document","addEventListener","event","scheduleCreate","target","closest","reportSelectors","actions","preventDefault","scheduleModal","events","FORM_SUBMITTED","then","addToast","reportElement","querySelector","regions","report","reportEvents","tableReload","catch","Notification","exception","show","scheduleToggle","pendingPromise","Pending","scheduleStateToggle","dataset","state","id","tableRow","classList","toggle","resolve","scheduleEdit","scheduleId","scheduleSend","saveCancelPromise","scheduleName","scheduleDelete","preservePagination"],"mappings":"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","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 {get_string as 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 'editscheduledetails',\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('dimmed_text');\n\n scheduleToggle.dataset.state = scheduleStateToggle;\n\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 const scheduleModal = createScheduleModal(scheduleEdit, 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 Notification.saveCancelPromise(\n getString('sendschedule', 'core_reportbuilder'),\n getString('sendscheduleconfirm', 'core_reportbuilder', scheduleSend.dataset.scheduleName),\n getString('confirm', 'core')\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 Notification.saveCancelPromise(\n getString('deleteschedule', 'core_reportbuilder'),\n getString('deletescheduleconfirm', 'core_reportbuilder', scheduleDelete.dataset.scheduleName),\n getString('delete', 'core')\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"],"file":"schedules.min.js"} \ No newline at end of file +{"version":3,"sources":["../src/schedules.js"],"names":["initialized","init","reportId","document","addEventListener","event","scheduleCreate","target","closest","reportSelectors","actions","preventDefault","scheduleModal","events","FORM_SUBMITTED","then","addToast","reportElement","querySelector","regions","report","reportEvents","tableReload","catch","Notification","exception","show","scheduleToggle","pendingPromise","Pending","scheduleStateToggle","dataset","state","id","tableRow","classList","toggle","stringKey","toggleLabel","labelContainer","parentElement","innerHTML","resolve","scheduleEdit","scheduleId","scheduleSend","saveCancelPromise","scheduleName","scheduleDelete","preservePagination"],"mappings":"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","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 {get_string as 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('dimmed_text');\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 const scheduleModal = createScheduleModal(scheduleEdit, 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 Notification.saveCancelPromise(\n getString('sendschedule', 'core_reportbuilder'),\n getString('sendscheduleconfirm', 'core_reportbuilder', scheduleSend.dataset.scheduleName),\n getString('confirm', 'core')\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 Notification.saveCancelPromise(\n getString('deleteschedule', 'core_reportbuilder'),\n getString('deletescheduleconfirm', 'core_reportbuilder', scheduleDelete.dataset.scheduleName),\n getString('delete', 'core')\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"],"file":"schedules.min.js"} \ No newline at end of file diff --git a/reportbuilder/amd/src/schedules.js b/reportbuilder/amd/src/schedules.js index a68eb03c396..6911edb56f5 100644 --- a/reportbuilder/amd/src/schedules.js +++ b/reportbuilder/amd/src/schedules.js @@ -46,7 +46,9 @@ export const init = reportId => { prefetchStrings('core_reportbuilder', [ 'deleteschedule', 'deletescheduleconfirm', + 'disableschedule', 'editscheduledetails', + 'enableschedule', 'newschedule', 'schedulecreated', 'scheduledeleted', @@ -101,6 +103,12 @@ export const init = reportId => { scheduleToggle.dataset.state = scheduleStateToggle; + const stringKey = scheduleStateToggle ? 'disableschedule' : 'enableschedule'; + return getString(stringKey, 'core_reportbuilder'); + }) + .then(toggleLabel => { + const labelContainer = scheduleToggle.parentElement.querySelector(`label[for="${scheduleToggle.id}"] > span`); + labelContainer.innerHTML = toggleLabel; return pendingPromise.resolve(); }) .catch(Notification.exception); diff --git a/reportbuilder/classes/local/systemreports/report_schedules.php b/reportbuilder/classes/local/systemreports/report_schedules.php index c821c3a7cd2..1a7d0587f1e 100644 --- a/reportbuilder/classes/local/systemreports/report_schedules.php +++ b/reportbuilder/classes/local/systemreports/report_schedules.php @@ -121,11 +121,19 @@ class report_schedules extends system_report { global $PAGE; $renderer = $PAGE->get_renderer('core_reportbuilder'); - - return $renderer->render_from_template('core_reportbuilder/local/toggle', [ - 'action' => 'schedule-toggle', - 'id' => $row->id, - 'enabled' => $row->enabled, + $attributes = [ + ['name' => 'id', 'value' => $row->id], + ['name' => 'action', 'value' => 'schedule-toggle'], + ['name' => 'state', 'value' => $row->enabled], + ]; + $label = $row->enabled ? get_string('disableschedule', 'core_reportbuilder') + : get_string('enableschedule', 'core_reportbuilder'); + return $renderer->render_from_template('core/toggle', [ + 'id' => 'schedule-toggle-' . $row->id, + 'checked' => $row->enabled, + 'dataattributes' => $attributes, + 'label' => $label, + 'labelclasses' => 'sr-only' ]); }) ); diff --git a/reportbuilder/templates/local/toggle.mustache b/reportbuilder/templates/local/toggle.mustache deleted file mode 100644 index 57a8cfe57f2..00000000000 --- a/reportbuilder/templates/local/toggle.mustache +++ /dev/null @@ -1,39 +0,0 @@ -{{! - This file is part of Moodle - http://moodle.org/ - - Moodle is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Moodle is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Moodle. If not, see . -}} -{{! - @template core_reportbuilder/local/toggle - - Template for toggle element - - Example context (json): - { - "action": "report-toggle", - "id": 3, - "enabled": true - } -}} - -
- - -
diff --git a/reportbuilder/tests/behat/schedules.feature b/reportbuilder/tests/behat/schedules.feature index 7a6d2dc285f..dfd48636806 100644 --- a/reportbuilder/tests/behat/schedules.feature +++ b/reportbuilder/tests/behat/schedules.feature @@ -58,8 +58,9 @@ Feature: Manage custom report schedules | My report | My schedule | And I am on the "My report" "reportbuilder > Editor" page logged in as "admin" And I click on the "Schedules" dynamic tab - When I click on "Disable" "field" in the "My schedule" "table_row" + When I click on "Disable schedule" "field" in the "My schedule" "table_row" Then the "class" attribute of "My schedule" "table_row" should contain "dimmed_text" + And I click on "Enable schedule" "field" in the "My schedule" "table_row" Scenario: Edit report schedule Given the following "core_reportbuilder > Schedules" exist: