cohort/amd/src/actions.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. * Cohorts actions.
  17. *
  18. * @module core_cohort/actions
  19. * @copyright 2024 David Woloszyn <david.woloszyn@moodle.com>
  20. * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  21. */
  22. import {dispatchEvent} from 'core/event_dispatcher';
  23. import Notification from 'core/notification';
  24. import Pending from 'core/pending';
  25. import {prefetchStrings} from 'core/prefetch';
  26. import {getString} from 'core/str';
  27. import {add as addToast} from 'core/toast';
  28. import {deleteCohort, deleteCohorts} from 'core_cohort/repository';
  29. import * as reportEvents from 'core_reportbuilder/local/events';
  30. import * as reportSelectors from 'core_reportbuilder/local/selectors';
  31. import {eventTypes} from 'core/local/inplace_editable/events';
  32. const SELECTORS = {
  33. CHECKBOXES: '[data-togglegroup="report-select-all"][data-toggle="slave"]:checked',
  34. DELETE: '[data-action="cohort-delete"]',
  35. DELETEBUTTON: '[data-action="cohort-delete-selected"]',
  36. EDITNAME: '[data-itemtype="cohortname"]',
  37. };
  38. /**
  39. * Initialise module.
  40. */
  41. export const init = () => {
  42. prefetchStrings('core_cohort', [
  43. 'delcohortsconfirm',
  44. 'delcohortssuccess',
  45. 'delconfirm',
  46. 'delsuccess',
  47. ]);
  48. prefetchStrings('core', [
  49. 'delete',
  50. 'deleteselected',
  51. 'selectitem',
  52. ]);
  53. registerEventListeners();
  54. };
  55. /**
  56. * Register event listeners.
  57. */
  58. export const registerEventListeners = () => {
  59. // Edit cohort name inplace.
  60. document.addEventListener(eventTypes.elementUpdated, async(event) => {
  61. const editCohortName = event.target.closest(SELECTORS.EDITNAME);
  62. if (editCohortName) {
  63. const cohortId = event.target.dataset.itemid;
  64. const checkbox = document.querySelector(`input[value="${cohortId}"][type="checkbox"]`);
  65. const label = document.querySelector(`label[for="${checkbox.id}"]`);
  66. if (label) {
  67. label.innerHTML = await getString('selectitem', 'core', event.target.dataset.value);
  68. }
  69. }
  70. });
  71. document.addEventListener('click', event => {
  72. // Delete single cohort.
  73. const cohortDeleteSingle = event.target.closest(SELECTORS.DELETE);
  74. if (cohortDeleteSingle) {
  75. event.preventDefault();
  76. const {cohortId, cohortName} = cohortDeleteSingle.dataset;
  77. Notification.saveCancelPromise(
  78. getString('deleteselected', 'core'),
  79. getString('delconfirm', 'core_cohort', cohortName),
  80. getString('delete', 'core'),
  81. {triggerElement: cohortDeleteSingle}
  82. ).then(() => {
  83. const pendingPromise = new Pending('core_cohort/cohort:delete');
  84. const reportElement = event.target.closest(reportSelectors.regions.report);
  85. // eslint-disable-next-line promise/no-nesting
  86. return deleteCohort(cohortId)
  87. .then(() => addToast(getString('delsuccess', 'core_cohort')))
  88. .then(() => {
  89. dispatchEvent(reportEvents.tableReload, {preservePagination: true}, reportElement);
  90. return pendingPromise.resolve();
  91. })
  92. .catch(Notification.exception);
  93. }).catch(() => {
  94. return;
  95. });
  96. }
  97. // Delete multiple cohorts.
  98. const cohortDeleteMultiple = event.target.closest(SELECTORS.DELETEBUTTON);
  99. if (cohortDeleteMultiple) {
  100. event.preventDefault();
  101. const reportElement = document.querySelector(reportSelectors.regions.report);
  102. const cohortDeleteChecked = reportElement.querySelectorAll(SELECTORS.CHECKBOXES);
  103. if (cohortDeleteChecked.length === 0) {
  104. return;
  105. }
  106. Notification.saveCancelPromise(
  107. getString('deleteselected', 'core'),
  108. getString('delcohortsconfirm', 'core_cohort'),
  109. getString('delete', 'core'),
  110. {triggerElement: cohortDeleteMultiple}
  111. ).then(() => {
  112. const pendingPromise = new Pending('core_cohort/cohorts:delete');
  113. const deleteCohortIds = [...cohortDeleteChecked].map(check => check.value);
  114. // eslint-disable-next-line promise/no-nesting
  115. return deleteCohorts(deleteCohortIds)
  116. .then(() => addToast(getString('delcohortssuccess', 'core_cohort')))
  117. .then(() => {
  118. dispatchEvent(reportEvents.tableReload, {preservePagination: true}, reportElement);
  119. return pendingPromise.resolve();
  120. })
  121. .catch(Notification.exception);
  122. }).catch(() => {
  123. return;
  124. });
  125. }
  126. });
  127. };