MDL-58536 block_myoverview: use moodle user timezone for midnight calc
authorRyan Wyllie <ryan@moodle.com>
Fri, 7 Apr 2017 06:29:15 +0000 (06:29 +0000)
committerRyan Wyllie <ryan@moodle.com>
Wed, 19 Apr 2017 05:38:25 +0000 (05:38 +0000)
Pass the user's midnight timestamp to the javascript to ensure that a
user's timezone is respected when calculating the categories the events
should be placed in on the event list.

blocks/myoverview/amd/build/event_list.min.js
blocks/myoverview/amd/build/event_list_by_course.min.js
blocks/myoverview/amd/src/event_list.js
blocks/myoverview/amd/src/event_list_by_course.js
blocks/myoverview/classes/output/main.php
blocks/myoverview/templates/course-event-list.mustache
blocks/myoverview/templates/event-list.mustache

index 7ebbaf3..cdc315e 100644 (file)
Binary files a/blocks/myoverview/amd/build/event_list.min.js and b/blocks/myoverview/amd/build/event_list.min.js differ
index 589626c..4abb4fb 100644 (file)
Binary files a/blocks/myoverview/amd/build/event_list_by_course.min.js and b/blocks/myoverview/amd/build/event_list_by_course.min.js differ
index ee66549..17e888f 100644 (file)
@@ -222,12 +222,13 @@ define(['jquery', 'core/notification', 'core/templates',
      *
      * @method eventBelongsInContainer
      * @private
+     * @param {object} root         The root element
      * @param {object} event        The calendar event
      * @param {object} container    The group event list container
      * @return {bool}
      */
-    var eventBelongsInContainer = function(event, container) {
-        var todayTime = Math.floor(new Date().setHours(0, 0, 0, 0) / 1000),
+    var eventBelongsInContainer = function(root, event, container) {
+        var todayTime = root.attr('data-midnight'),
             timeUntilContainerStart = +container.attr('data-start-day') * SECONDS_IN_DAY,
             timeUntilContainerEnd = +container.attr('data-end-day') * SECONDS_IN_DAY,
             timeUntilEventNeedsAction = timeUntilEvent(todayTime, event);
@@ -246,12 +247,13 @@ define(['jquery', 'core/notification', 'core/templates',
      *
      * @method getFilterCallbackForContainer
      * @private
+     * @param {object} root      The root element
      * @param {object} container Event list group container
      * @return {function}
      */
-    var getFilterCallbackForContainer = function(container) {
+    var getFilterCallbackForContainer = function(root, container) {
         return function(event) {
-            return eventBelongsInContainer(event, $(container));
+            return eventBelongsInContainer(root, event, $(container));
         };
     };
 
@@ -278,7 +280,7 @@ define(['jquery', 'core/notification', 'core/templates',
         // that belong to that group (as defined by the group's day range). The matching
         // list of calendar events are rendered and added to the DOM within that group.
         return $.when.apply($, $.map(root.find(SELECTORS.EVENT_LIST_GROUP_CONTAINER), function(container) {
-            var events = calendarEvents.filter(getFilterCallbackForContainer(container));
+            var events = calendarEvents.filter(getFilterCallbackForContainer(root, container));
 
             if (events.length) {
                 renderCount += events.length;
@@ -314,12 +316,8 @@ define(['jquery', 'core/notification', 'core/templates',
         var limit = +root.attr('data-limit'),
             courseId = +root.attr('data-course-id'),
             lastId = root.attr('data-last-id'),
-            date = new Date(),
-            startTime;
-
-        date.setDate(date.getDate() - 14);
-        date.setHours(0, 0, 0, 0);
-        startTime = Math.floor(date / 1000);
+            midnight = root.attr('data-midnight'),
+            startTime = midnight - (14 * SECONDS_IN_DAY);
 
         // Don't load twice.
         if (isLoading(root)) {
index db182ee..69fae95 100644 (file)
@@ -29,6 +29,8 @@ define(
 ],
 function($, EventList, EventsRepository) {
 
+    var SECONDS_IN_DAY = 60 * 60 * 24;
+
     var SELECTORS = {
         EVENTS_BY_COURSE_CONTAINER: '[data-region="course-events-container"]',
     };
@@ -46,10 +48,8 @@ function($, EventList, EventsRepository) {
             return;
         }
 
-        var date = new Date();
-        date.setDate(date.getDate() - 14);
-        date.setHours(0, 0, 0, 0);
-        var startTime = Math.floor(date / 1000);
+        var midnight = root.attr('data-midnight');
+        var startTime = midnight - (14 * SECONDS_IN_DAY);
         var limit = courseBlocks.attr('data-limit');
         var courseIds = courseBlocks.map(function() {
             return $(this).attr('data-course-id');
index 377697f..edfa153 100644 (file)
@@ -62,6 +62,7 @@ class main implements renderable, templatable {
         $noeventsurl = $output->image_url('activities', 'block_myoverview')->out();
 
         return [
+            'midnight' => usergetmidnight(time()),
             'coursesview' => $coursesview->export_for_template($output),
             'urls' => [
                 'nocourses' => $nocoursesurl,
index 77cf57c..ac16e44 100644 (file)
@@ -28,6 +28,7 @@
      data-limit="{{$limit}}20{{/limit}}"
      data-course-id="{{$courseid}}{{/courseid}}"
      data-last-id="{{$lastid}}{{/lastid}}"
+     data-midnight="{{midnight}}"
      id="event-list-container-{{$courseid}}{{/courseid}}">
 
     <div data-region="event-list-content">
index 83f6234..ae5553b 100644 (file)
@@ -27,6 +27,7 @@
      data-limit="{{$limit}}20{{/limit}}"
      data-course-id="{{$courseid}}{{/courseid}}"
      data-last-id="{{$lastid}}{{/lastid}}"
+     data-midnight="{{midnight}}"
      id="event-list-container-{{$courseid}}{{/courseid}}">
 
     <div data-region="event-list-content">