reportbuilder/amd/src/reports_list.js

  1. // This file is part of Moodle - http://moodle.org/
  2. //
  3. // Moodle is free software: you can redistribute it and/or modify
  4. // it under the terms of the GNU General Public License as published by
  5. // the Free Software Foundation, either version 3 of the License, or
  6. // (at your option) any later version.
  7. //
  8. // Moodle is distributed in the hope that it will be useful,
  9. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. // GNU General Public License for more details.
  12. //
  13. // You should have received a copy of the GNU General Public License
  14. // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
  15. /**
  16. * Report builder reports list management
  17. *
  18. * @module core_reportbuilder/reports_list
  19. * @copyright 2021 David Matamoros <davidmc@moodle.com>
  20. * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  21. */
  22. "use strict";
  23. import {dispatchEvent} from 'core/event_dispatcher';
  24. import Notification from 'core/notification';
  25. import Pending from 'core/pending';
  26. import {prefetchStrings} from 'core/prefetch';
  27. import {getString} from 'core/str';
  28. import {add as addToast} from 'core/toast';
  29. import * as reportEvents from 'core_reportbuilder/local/events';
  30. import * as reportSelectors from 'core_reportbuilder/local/selectors';
  31. import {deleteReport} from 'core_reportbuilder/local/repository/reports';
  32. import {createDuplicateReportModal, createReportModal} from 'core_reportbuilder/local/repository/modals';
  33. /**
  34. * Initialise module
  35. */
  36. export const init = () => {
  37. prefetchStrings('core_reportbuilder', [
  38. 'deletereport',
  39. 'deletereportconfirm',
  40. 'duplicatereport',
  41. 'editreportdetails',
  42. 'newreport',
  43. 'reportdeleted',
  44. 'reportupdated',
  45. ]);
  46. prefetchStrings('core', [
  47. 'delete',
  48. ]);
  49. document.addEventListener('click', event => {
  50. const reportCreate = event.target.closest(reportSelectors.actions.reportCreate);
  51. if (reportCreate) {
  52. event.preventDefault();
  53. // Redirect user to editing interface for the report after submission.
  54. const reportModal = createReportModal(event.target, getString('newreport', 'core_reportbuilder'));
  55. reportModal.addEventListener(reportModal.events.FORM_SUBMITTED, event => {
  56. window.location.href = event.detail;
  57. });
  58. reportModal.show();
  59. }
  60. const reportEdit = event.target.closest(reportSelectors.actions.reportEdit);
  61. if (reportEdit) {
  62. event.preventDefault();
  63. // Reload current report page after submission.
  64. // Use triggerElement to return focus to the action menu toggle.
  65. const triggerElement = reportEdit.closest('.dropdown').querySelector('.dropdown-toggle');
  66. const reportModal = createReportModal(triggerElement, getString('editreportdetails', 'core_reportbuilder'),
  67. reportEdit.dataset.reportId);
  68. reportModal.addEventListener(reportModal.events.FORM_SUBMITTED, () => {
  69. const reportElement = event.target.closest(reportSelectors.regions.report);
  70. getString('reportupdated', 'core_reportbuilder')
  71. .then(addToast)
  72. .then(() => {
  73. dispatchEvent(reportEvents.tableReload, {preservePagination: true}, reportElement);
  74. return;
  75. })
  76. .catch(Notification.exception);
  77. });
  78. reportModal.show();
  79. }
  80. const reportDuplicate = event.target.closest(reportSelectors.actions.reportDuplicate);
  81. if (reportDuplicate) {
  82. event.preventDefault();
  83. const strDuplicateReport = getString('duplicatereport', 'core_reportbuilder');
  84. const {reportId, reportName} = reportDuplicate.dataset;
  85. const reportModal = createDuplicateReportModal(event.target, strDuplicateReport, reportId, reportName);
  86. reportModal.addEventListener(reportModal.events.FORM_SUBMITTED, event => {
  87. window.location.href = event.detail;
  88. });
  89. reportModal.show();
  90. }
  91. const reportDelete = event.target.closest(reportSelectors.actions.reportDelete);
  92. if (reportDelete) {
  93. event.preventDefault();
  94. // Use triggerElement to return focus to the action menu toggle.
  95. const triggerElement = reportDelete.closest('.dropdown').querySelector('.dropdown-toggle');
  96. Notification.saveCancelPromise(
  97. getString('deletereport', 'core_reportbuilder'),
  98. getString('deletereportconfirm', 'core_reportbuilder', reportDelete.dataset.reportName),
  99. getString('delete', 'core'),
  100. {triggerElement}
  101. ).then(() => {
  102. const pendingPromise = new Pending('core_reportbuilder/reports:delete');
  103. const reportElement = event.target.closest(reportSelectors.regions.report);
  104. return deleteReport(reportDelete.dataset.reportId)
  105. .then(() => addToast(getString('reportdeleted', 'core_reportbuilder')))
  106. .then(() => {
  107. dispatchEvent(reportEvents.tableReload, {preservePagination: true}, reportElement);
  108. return pendingPromise.resolve();
  109. })
  110. .catch(Notification.exception);
  111. }).catch(() => {
  112. return;
  113. });
  114. }
  115. });
  116. };