da1e45449b3dbba569a330d8e934a5e27227010e
[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: "span.calendarwrapper .arrow_link",
30             CALENDAR_MONTH_WRAPPER: ".calendarwrapper",
31         };
33         /**
34          * Register event listeners for the module.
35          *
36          * @param {object} root The root element.
37          */
38         var registerEventListeners = function(root) {
39             root = $(root);
41             root.on('click', SELECTORS.CALENDAR_NAV_LINK, function(e) {
42                 var courseId = $(root).find(SELECTORS.CALENDAR_MONTH_WRAPPER).data('courseid');
43                 var link = $(e.currentTarget);
44                 changeMonth(link.attr('href'), link.data('time'), courseId);
46                 e.preventDefault();
47             });
48         };
50         /**
51          * Refresh the month content.
52          *
53          * @param {Number} time The calendar time to be shown
54          * @param {Number} courseid The id of the course whose events are shown
55          * @return {promise}
56          */
57         var refreshMonthContent = function(time, courseid) {
58             return CalendarRepository.getCalendarMonthData(time, courseid)
59                 .then(function(context) {
60                     return Templates.render('core_calendar/month_detailed', context);
61                 })
62                 .then(function(html, js) {
63                     return Templates.replaceNodeContents(SELECTORS.CALENDAR_MONTH_WRAPPER, html, js);
64                 })
65                 .fail(Notification.exception);
66         };
68         /**
69          * Handle changes to the current calendar view.
70          *
71          * @param {String} url The calendar url to be shown
72          * @param {Number} time The calendar time to be shown
73          * @param {Number} courseid The id of the course whose events are shown
74          * @return {promise}
75          */
76         var changeMonth = function(url, time, courseid) {
77             return refreshMonthContent(time, courseid)
78                 .then(function() {
79                     window.history.pushState({}, '', url);
80                 })
81                 .then(function() {
82                     $('body').trigger(CalendarEvents.monthChanged, [time, courseid]);
83                 });
84         };
86         /**
87          * Reload the current month view data.
88          *
89          * @return {promise}
90          */
91         var reloadCurrentMonth = function() {
92             var root = $(SELECTORS.ROOT),
93                 courseid = root.find(SELECTORS.CALENDAR_MONTH_WRAPPER).data('courseid'),
94                 time = root.find(SELECTORS.CALENDAR_MONTH_WRAPPER).data('current-time');
96             return refreshMonthContent(time, courseid);
97         };
99         return {
100             init: function() {
101                 registerEventListeners(SELECTORS.ROOT);
102             },
103             reloadCurrentMonth: reloadCurrentMonth,
104             changeMonth: changeMonth,
105             refreshMonthContent: refreshMonthContent
106         };
107     });