Rev 1225 | 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 filtros
if (!filterForm) return;
// Crear un objeto FormData que contendrá todos los valores del formulario
const formData = new FormData(filterForm);
// Iterar sobre cada elemento de input en el formulario
filterForm.querySelectorAll("input, select").forEach((element) => {
if (element.type === "checkbox" || element.type === "radio") {
// Si es un checkbox o radio, desmarcarlo
element.checked = false;
} else {
// Si es un input de texto o select, limpiar el valor
element.value = "";
}
// Opcional: para asegurarse de que los valores del FormData también se reseteen
formData.set(element.name, "");
});
// Si hay algún elemento select, deseleccionar la opción seleccionada
filterForm.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
}
});
};