MDL-37810 roles: added manager case to test_get_user_roles_in_course()
[moodle.git] / calendar / amd / src / view_manager.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/>.
16 /**
17  * A javascript module to handler calendar view changes.
18  *
19  * @module     core_calendar/view_manager
20  * @package    core_calendar
21  * @copyright  2017 Andrew Nicols <andrew@nicols.co.uk>
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
24 define(['jquery', 'core/templates', 'core/notification', 'core_calendar/repository', 'core_calendar/events'],
25     function($, Templates, Notification, CalendarRepository, CalendarEvents) {
27         var SELECTORS = {
28             ROOT: "[data-region='calendar']",
29             CALENDAR_NAV_LINK: ".calendarwrapper .arrow_link",
30             CALENDAR_MONTH_WRAPPER: ".calendarwrapper",
31             LOADING_ICON_CONTAINER: '[data-region="overlay-icon-container"]'
32         };
34         /**
35          * Register event listeners for the module.
36          *
37          * @param {object} root The root element.
38          */
39         var registerEventListeners = function(root) {
40             root = $(root);
42             root.on('click', SELECTORS.CALENDAR_NAV_LINK, function(e) {
43                 var courseId = $(root).find(SELECTORS.CALENDAR_MONTH_WRAPPER).data('courseid');
44                 var link = $(e.currentTarget);
45                 changeMonth(root, link.attr('href'), link.data('time'), courseId);
47                 e.preventDefault();
48             });
49         };
51         /**
52          * Refresh the month content.
53          *
54          * @param {Number} time The calendar time to be shown
55          * @param {Number} courseid The id of the course whose events are shown
56          * @return {promise}
57          */
58         var refreshMonthContent = function(root, time, courseid) {
59             startLoading(root);
61             return CalendarRepository.getCalendarMonthData(time, courseid)
62                 .then(function(context) {
63                     return Templates.render(root.attr('data-template'), context);
64                 })
65                 .then(function(html, js) {
66                     return Templates.replaceNode(root.find(SELECTORS.CALENDAR_MONTH_WRAPPER), html, js);
67                 })
68                 .then(function() {
69                     $('body').trigger(CalendarEvents.viewUpdated);
70                     return;
71                 })
72                 .always(function() {
73                     return stopLoading(root);
74                 })
75                 .fail(Notification.exception);
76         };
78         /**
79          * Handle changes to the current calendar view.
80          *
81          * @param {String} url The calendar url to be shown
82          * @param {Number} time The calendar time to be shown
83          * @param {Number} courseid The id of the course whose events are shown
84          * @return {promise}
85          */
86         var changeMonth = function(root, url, time, courseid) {
87             return refreshMonthContent(root, time, courseid)
88                 .then(function() {
89                     if (url.length && url !== '#') {
90                         window.history.pushState({}, '', url);
91                     }
92                     return arguments;
93                 })
94                 .then(function() {
95                     $('body').trigger(CalendarEvents.monthChanged, [time, courseid]);
96                     return arguments;
97                 });
98         };
100         /**
101          * Reload the current month view data.
102          *
103          * @param {object} root The container element.
104          * @param {Number} courseId The course id.
105          * @return {promise}
106          */
107         var reloadCurrentMonth = function(root, courseId) {
108             var time = root.find(SELECTORS.CALENDAR_MONTH_WRAPPER).data('current-time');
110             if (!courseId) {
111                 courseId = root.find(SELECTORS.CALENDAR_MONTH_WRAPPER).data('courseid');
112             }
113             return refreshMonthContent(root, time, courseId);
114         };
116         /**
117          * Set the element state to loading.
118          *
119          * @param {object} root The container element
120          * @method startLoading
121          */
122         var startLoading = function(root) {
123             var loadingIconContainer = root.find(SELECTORS.LOADING_ICON_CONTAINER);
125             loadingIconContainer.removeClass('hidden');
126         };
128         /**
129          * Remove the loading state from the element.
130          *
131          * @param {object} root The container element
132          * @method stopLoading
133          */
134         var stopLoading = function(root) {
135             var loadingIconContainer = root.find(SELECTORS.LOADING_ICON_CONTAINER);
137             loadingIconContainer.addClass('hidden');
138         };
140         return {
141             init: function(root) {
142                 registerEventListeners(root);
143             },
144             reloadCurrentMonth: reloadCurrentMonth,
145             changeMonth: changeMonth,
146             refreshMonthContent: refreshMonthContent
147         };
148     });