Rev 1225 | Rev 1227 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
// 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 <http://www.gnu.org/licenses/>./*** Add bulk actions to the users list report** @module core_admin/bulk_user_actions* @copyright 2024 Marina Glancy* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/import * as reportSelectors from "core_reportbuilder/local/selectors";import * as tableEvents from "core_table/local/dynamic/events";import * as FormChangeChecker from "core_form/changechecker";import * as CustomEvents from "core/custom_interaction_events";import jQuery from "jquery";const Selectors = {bulkActionsForm: "form#user-bulk-action-form",userReportWrapper: '[data-region="report-user-list-wrapper"]',checkbox:'input[type="checkbox"][data-togglegroup="report-select-all"][data-toggle="slave"]',masterCheckbox:'input[type="checkbox"][data-togglegroup="report-select-all"][data-toggle="master"]',checkedRows:'[data-togglegroup="report-select-all"][data-toggle="slave"]:checked',filtersForm: 'form#filters-form', // Seleccionamos el formulario de filtros};/*** Función para resetear los filtros*/const resetFilters = () => {const filterForm = document.querySelector(Selectors.filtersForm); // Asegúrate de que el selector coincide con los filtrosif (!filterForm) return;// Crear un objeto FormData que contendrá todos los valores del formularioconst formData = new FormData(filterForm);// Iterar sobre cada elemento de input en el formulariofilterForm.querySelectorAll("input, select").forEach((element) => {if (element.type === "checkbox" || element.type === "radio") {// Si es un checkbox o radio, desmarcarloelement.checked = false;} else {// Si es un input de texto o select, limpiar el valorelement.value = "";}// Opcional: para asegurarse de que los valores del FormData también se reseteenformData.set(element.name, "");});// Si hay algún elemento select, deseleccionar la opción seleccionadafilterForm.querySelectorAll("select").forEach((select) => {select.selectedIndex = -1; // Deseleccionar la opción seleccionada});};/*** Initialize module*/export const init = () => {const userBulkForm = document.querySelector(Selectors.bulkActionsForm);const userReport = userBulkForm?.closest(Selectors.userReportWrapper)?.querySelector(reportSelectors.regions.report);if (!userBulkForm || !userReport) {return;}const actionSelect = userBulkForm.querySelector("select");CustomEvents.define(actionSelect, [CustomEvents.events.accessibleChange]);jQuery(actionSelect).on(CustomEvents.events.accessibleChange, (event) => {if (event.target.value && `${event.target.value}` !== "0") {const e = new Event("submit", { cancelable: true });userBulkForm.dispatchEvent(e);if (!e.defaultPrevented) {FormChangeChecker.markFormSubmitted(userBulkForm);userBulkForm.submit();}}});// Cada vez que los checkboxes en el informe cambien, actualizamos la lista de usuarios en los valores del formulario// y habilitamos/deshabilitamos el select de acciones.const updateUserIds = () => {const selectedUsers = [...userReport.querySelectorAll(Selectors.checkedRows),];const selectedUserIds = selectedUsers.map((check) => parseInt(check.value));userBulkForm.querySelector('[name="userids"]').value =selectedUserIds.join(",");// Deshabilitar el selector de acción si no se seleccionan usuarios, y resetear la selección actual.actionSelect.disabled = selectedUsers.length === 0;if (actionSelect.disabled) {actionSelect.value = "0";}const selectedUsersNames = selectedUsers.map((check) => document.querySelector(`label[for="${check.id}"]`).textContent);// Agregar los ids y nombres de los usuarios a los atributos de datos del formulario para que estén disponibles desde// otros módulos JS que escuchen el evento de submit del formulario.userBulkForm.data = {userids: selectedUserIds,usernames: selectedUsersNames,};};updateUserIds();document.addEventListener("change", (event) => {// Cuando los checkboxes son marcados junto a usuarios individuales o el toggle maestro (Seleccionar todo/nada).if ((event.target.matches(Selectors.checkbox) ||event.target.matches(Selectors.masterCheckbox)) &&userReport.contains(event.target)) {updateUserIds();}});document.addEventListener(tableEvents.tableContentRefreshed, (event) => {// Cuando el contenido del informe se actualiza (es decir, se cambia la página, se aplican filtros, etc.).if (userReport.contains(event.target)) {updateUserIds();resetFilters(); // Restablecer los filtros después de cada actualización de la tabla}});};