Proyectos de Subversion Moodle

Rev

Rev 1 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 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
/**
17
 * Report builder filter management
18
 *
19
 * @module      core_reportbuilder/filters
20
 * @copyright   2021 Paul Holden <paulh@moodle.com>
21
 * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
22
 */
23
 
24
import {dispatchEvent} from 'core/event_dispatcher';
25
import {loadFragment} from 'core/fragment';
26
import Notification from 'core/notification';
27
import Pending from 'core/pending';
28
import {getString} from 'core/str';
29
import Templates from 'core/templates';
30
import {add as addToast} from 'core/toast';
31
import DynamicForm from 'core_form/dynamicform';
32
import * as reportEvents from 'core_reportbuilder/local/events';
33
import * as reportSelectors from 'core_reportbuilder/local/selectors';
34
import {resetFilters} from 'core_reportbuilder/local/repository/filters';
35
 
36
/**
37
 * Update filter button text to indicate applied filter count
38
 *
39
 * @param {Element} reportElement
40
 * @param {Number} filterCount
41
 */
42
const setFilterButtonCount = async(reportElement, filterCount) => {
43
    const filterButtonLabel = reportElement.querySelector(reportSelectors.regions.filterButtonLabel);
44
 
45
    if (filterCount > 0) {
46
        filterButtonLabel.textContent = await getString('filtersappliedx', 'core_reportbuilder', filterCount);
47
    } else {
48
        filterButtonLabel.textContent = await getString('filters', 'moodle');
49
    }
50
};
51
 
52
/**
53
 * Initialise module for given report
54
 *
55
 * @method
56
 * @param {Number} reportId
57
 * @param {Number} contextId
58
 */
59
export const init = (reportId, contextId) => {
60
    const reportElement = document.querySelector(reportSelectors.forReport(reportId));
61
    const filterFormContainer = reportElement.querySelector(reportSelectors.regions.filtersForm);
62
 
63
    // Ensure we only add our listeners once (can be called multiple times by mustache template).
64
    if (filterFormContainer.dataset.initialized) {
65
        return;
66
    }
67
    filterFormContainer.dataset.initialized = true;
68
 
69
    const filterForm = new DynamicForm(filterFormContainer, '\\core_reportbuilder\\form\\filter');
70
 
71
    // Submit report filters.
72
    filterForm.addEventListener(filterForm.events.FORM_SUBMITTED, event => {
73
        event.preventDefault();
74
 
1227 ariadna 75
        const reportParameters = reportElement.dataset.parameter;
76
 
1 efrain 77
        // After the form has been submitted, we should trigger report table reload.
78
        dispatchEvent(reportEvents.tableReload, {}, reportElement);
79
        setFilterButtonCount(reportElement, event.detail);
80
 
81
        getString('filtersapplied', 'core_reportbuilder')
82
            .then(addToast)
1227 ariadna 83
            .then(()=> resetFilters(reportId, reportParameters))
84
            .then(() => loadFragment('core_reportbuilder', 'filters_form', contextId, {
85
                reportid: reportId,
86
                parameters: reportParameters,
87
            }))
88
            .then((html, js) => {
89
                Templates.replaceNodeContents(filterFormContainer, html, js);
90
                setFilterButtonCount(reportElement, 0);
91
            })
1 efrain 92
            .catch(Notification.exception);
93
    });
94
 
95
    // Reset report filters.
96
    filterForm.addEventListener(filterForm.events.NOSUBMIT_BUTTON_PRESSED, event => {
97
        event.preventDefault();
98
 
99
        const pendingPromise = new Pending('core_reportbuilder/filters:reset');
100
        const reportParameters = reportElement.dataset.parameter;
101
 
102
        resetFilters(reportId, reportParameters)
103
            .then(() => getString('filtersreset', 'core_reportbuilder'))
104
            .then(addToast)
105
            .then(() => loadFragment('core_reportbuilder', 'filters_form', contextId, {
106
                reportid: reportId,
107
                parameters: reportParameters,
108
            }))
109
            .then((html, js) => {
110
                Templates.replaceNodeContents(filterFormContainer, html, js);
111
 
112
                dispatchEvent(reportEvents.tableReload, {}, reportElement);
113
                setFilterButtonCount(reportElement, 0);
114
 
115
                return pendingPromise.resolve();
116
            })
117
            .catch(Notification.exception);
118
    });
119
 
120
    // Modify "region-main" overflow for big filter forms.
121
    document.querySelector('#region-main').style.overflowX = "visible";
122
};