69fae956408df999ee1bb29750a3980cd1233f31
[moodle.git] / blocks / myoverview / amd / src / event_list_by_course.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  * Javascript to load and render the list of calendar events grouping by course.
18  *
19  * @module     block_myoverview/events_by_course_list
20  * @package    block_myoverview
21  * @copyright  2016 Simey Lameze <simey@moodle.com>
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
24 define(
25 [
26     'jquery',
27     'block_myoverview/event_list',
28     'block_myoverview/calendar_events_repository'
29 ],
30 function($, EventList, EventsRepository) {
32     var SECONDS_IN_DAY = 60 * 60 * 24;
34     var SELECTORS = {
35         EVENTS_BY_COURSE_CONTAINER: '[data-region="course-events-container"]',
36     };
38     /**
39      * Loop through course events containers and load calendar events for that course.
40      *
41      * @method load
42      * @param {Object} root The root element of sort by course list.
43      */
44     var load = function(root) {
45         var courseBlocks = root.find(SELECTORS.EVENTS_BY_COURSE_CONTAINER);
47         if (!courseBlocks.length) {
48             return;
49         }
51         var midnight = root.attr('data-midnight');
52         var startTime = midnight - (14 * SECONDS_IN_DAY);
53         var limit = courseBlocks.attr('data-limit');
54         var courseIds = courseBlocks.map(function() {
55             return $(this).attr('data-course-id');
56         }).get();
58         // Load the first set of events for each course in a single request.
59         // We want to avoid sending an individual request for each course because
60         // there could be lots of them.
61         var coursesPromise = EventsRepository.queryByCourses({
62             courseids: courseIds,
63             starttime: startTime,
64             limit: limit
65         });
67         // Load the events into each course block.
68         courseBlocks.each(function(index, container) {
69             container = $(container);
70             var courseId = container.attr('data-course-id');
71             var eventListContainer = container.find(EventList.rootSelector);
72             var promise = $.Deferred();
74             // Once all of the course events have been loaded then we need
75             // to extract just the ones relevant to this course block and
76             // hand them to the event list to render.
77             coursesPromise.done(function(result) {
78                 var events = [];
79                 // Get this course block's events from the collection returned
80                 // from the server.
81                 var courseGroup = result.groupedbycourse.filter(function(group) {
82                     return group.courseid == courseId;
83                 });
85                 if (courseGroup.length) {
86                     events = courseGroup[0].events;
87                 }
89                 promise.resolve({events: events});
90             }).fail(function(e) {
91                 promise.reject(e);
92             });
94             // Provide the event list with a promise that will be resolved
95             // when we have received the events from the server.
96             EventList.load(eventListContainer, promise);
97         });
98     };
100     return {
101         init: function(root) {
102             root = $(root);
103             load(root);
104         }
105     };
106 });