AutorÃa | 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/>./*** Some UI stuff for participants page.* This is also used by the report/participants/index.php because it has the same functionality.** @module core_user/participants* @copyright 2017 Damyon Wiese* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/import * as DynamicTable from 'core_table/dynamic';import * as Str from 'core/str';import CheckboxToggleAll from 'core/checkbox-toggleall';import CustomEvents from 'core/custom_interaction_events';import DynamicTableSelectors from 'core_table/local/dynamic/selectors';import ModalEvents from 'core/modal_events';import Notification from 'core/notification';import Pending from 'core/pending';import jQuery from 'jquery';import {showAddNote, showSendMessage} from 'core_user/local/participants/bulkactions';import 'core/inplace_editable';const Selectors = {bulkActionSelect: "#formactionid",bulkUserSelectedCheckBoxes: "input[data-togglegroup='participants-table'][data-toggle='slave']:checked",checkCountButton: "#checkall",showCountText: '[data-region="participant-count"]',showCountToggle: '[data-action="showcount"]',stateHelpIcon: '[data-region="state-help-icon"]',tableForm: uniqueId => `form[data-table-unique-id="${uniqueId}"]`,};export const init = ({uniqueid,noteStateNames = {},}) => {const root = document.querySelector(Selectors.tableForm(uniqueid));const getTableFromUniqueId = uniqueId => root.querySelector(DynamicTableSelectors.main.fromRegionId(uniqueId));/*** Private method.** @method registerEventListeners* @private*/const registerEventListeners = () => {CustomEvents.define(Selectors.bulkActionSelect, [CustomEvents.events.accessibleChange]);jQuery(Selectors.bulkActionSelect).on(CustomEvents.events.accessibleChange, e => {const bulkActionSelect = e.target.closest('select');const action = bulkActionSelect.value;const tableRoot = getTableFromUniqueId(uniqueid);const checkboxes = tableRoot.querySelectorAll(Selectors.bulkUserSelectedCheckBoxes);const pendingPromise = new Pending('core_user/participants:bulkActionSelect');if (action.indexOf('#') !== -1) {e.preventDefault();const ids = [];checkboxes.forEach(checkbox => {ids.push(checkbox.getAttribute('name').replace('user', ''));});let bulkAction;if (action === '#messageselect') {bulkAction = showSendMessage(ids);} else if (action === '#addgroupnote') {bulkAction = showAddNote(root.dataset.courseId,ids,noteStateNames,root.querySelector(Selectors.stateHelpIcon));}if (bulkAction) {const pendingBulkAction = new Pending('core_user/participants:bulkActionSelected');bulkAction.then(modal => {modal.getRoot().on(ModalEvents.hidden, () => {// Focus on the action select when the dialog is closed.bulkActionSelect.focus();});pendingBulkAction.resolve();return modal;}).catch(Notification.exception);}} else if (action !== '' && checkboxes.length) {bulkActionSelect.form.submit();}resetBulkAction(bulkActionSelect);pendingPromise.resolve();});root.addEventListener('click', e => {// Handle clicking of the "Select all" actions.const checkCountButton = root.querySelector(Selectors.checkCountButton);const checkCountButtonClicked = checkCountButton && checkCountButton.contains(e.target);if (checkCountButtonClicked) {e.preventDefault();const tableRoot = getTableFromUniqueId(uniqueid);DynamicTable.setPageSize(tableRoot, checkCountButton.dataset.targetPageSize).then(tableRoot => {// Update the toggle state.CheckboxToggleAll.setGroupState(root, 'participants-table', true);return tableRoot;}).catch(Notification.exception);}});// When the content is refreshed, update the row counts in various places.root.addEventListener(DynamicTable.Events.tableContentRefreshed, e => {const checkCountButton = root.querySelector(Selectors.checkCountButton);const tableRoot = e.target;const defaultPageSize = parseInt(tableRoot.dataset.tableDefaultPerPage, 10);const currentPageSize = parseInt(tableRoot.dataset.tablePageSize, 10);const totalRowCount = parseInt(tableRoot.dataset.tableTotalRows, 10);CheckboxToggleAll.updateSlavesFromMasterState(root, 'participants-table');const pageCountStrings = [{key: 'countparticipantsfound',component: 'core_user',param: totalRowCount,},];if (totalRowCount <= defaultPageSize) {if (checkCountButton) {checkCountButton.classList.add('hidden');}} else if (totalRowCount <= currentPageSize) {// The are fewer than the current page size.pageCountStrings.push({key: 'selectalluserswithcount',component: 'core',param: defaultPageSize,});if (checkCountButton) {// The 'Check all [x]' button is only visible when there are values to set.checkCountButton.classList.add('hidden');}} else {pageCountStrings.push({key: 'selectalluserswithcount',component: 'core',param: totalRowCount,});if (checkCountButton) {checkCountButton.classList.remove('hidden');}}Str.get_strings(pageCountStrings).then(([showingParticipantCountString, selectCountString]) => {const showingParticipantCount = root.querySelector(Selectors.showCountText);showingParticipantCount.innerHTML = showingParticipantCountString;if (selectCountString && checkCountButton) {checkCountButton.value = selectCountString;}return;}).catch(Notification.exception);});};const resetBulkAction = bulkActionSelect => {bulkActionSelect.value = '';};registerEventListeners();};