@@ -18,10 +18,10 @@ import { CoreDomUtils } from '@services/utils/dom';
1818import { CoreTextUtils } from '@services/utils/text' ;
1919import { CoreTimeUtils } from '@services/utils/time' ;
2020import { CoreCourse } from '@features/course/services/course' ;
21- import moment from 'moment' ;
2221import { CoreContentLinksHelper } from '@features/contentlinks/services/contentlinks-helper' ;
2322import { AddonCalendarEvent } from '@addons/calendar/services/calendar' ;
2423import { CoreEnrolledCourseDataWithOptions } from '@features/courses/services/courses-helper' ;
24+ import { AddonBlockTimeline } from '../../services/timeline' ;
2525
2626/**
2727 * Directive to render a list of events in course overview.
@@ -37,6 +37,7 @@ export class AddonBlockTimelineEventsComponent implements OnChanges {
3737 @Input ( ) course ?: CoreEnrolledCourseDataWithOptions ; // Whether to show the course name.
3838 @Input ( ) from = 0 ; // Number of days from today to offset the events.
3939 @Input ( ) to ?: number ; // Number of days from today to limit the events to. If not defined, no limit.
40+ @Input ( ) overdue = false ; // If filtering overdue events or not.
4041 @Input ( ) canLoadMore = false ; // Whether more events can be loaded.
4142 @Output ( ) loadMore = new EventEmitter ( ) ; // Notify that more events should be loaded.
4243
@@ -53,18 +54,13 @@ export class AddonBlockTimelineEventsComponent implements OnChanges {
5354
5455 if ( changes . events || changes . from || changes . to ) {
5556 if ( this . events ) {
56- const filteredEvents = await this . filterEventsByTime ( this . from , this . to ) ;
57+ const filteredEvents = await this . filterEventsByTime ( ) ;
5758 this . empty = ! filteredEvents || filteredEvents . length <= 0 ;
5859
59- const now = CoreTimeUtils . timestamp ( ) ;
60-
61- const eventsByDay : Record < number , AddonCalendarEvent [ ] > = { } ;
60+ const eventsByDay : Record < number , AddonBlockTimelineEvent [ ] > = { } ;
6261 filteredEvents . forEach ( ( event ) => {
6362 const dayTimestamp = CoreTimeUtils . getMidnightForTimestamp ( event . timesort ) ;
6463
65- // Already calculated on 4.0 onwards but this will be live.
66- event . overdue = event . timesort < now ;
67-
6864 if ( eventsByDay [ dayTimestamp ] ) {
6965 eventsByDay [ dayTimestamp ] . push ( event ) ;
7066 } else {
@@ -89,20 +85,34 @@ export class AddonBlockTimelineEventsComponent implements OnChanges {
8985 /**
9086 * Filter the events by time.
9187 *
92- * @param start Number of days to start getting events from today. E.g. -1 will get events from yesterday.
93- * @param end Number of days after the start.
9488 * @return Filtered events.
9589 */
96- protected async filterEventsByTime ( start : number , end ?: number ) : Promise < AddonBlockTimelineEvent [ ] > {
97- start = moment ( ) . add ( start , 'days' ) . startOf ( 'day' ) . unix ( ) ;
98- end = end !== undefined ? moment ( ) . add ( end , 'days' ) . startOf ( 'day' ) . unix ( ) : end ;
90+ protected async filterEventsByTime ( ) : Promise < AddonBlockTimelineEvent [ ] > {
91+ const start = AddonBlockTimeline . getDayStart ( this . from ) ;
92+ const end = this . to !== undefined
93+ ? AddonBlockTimeline . getDayStart ( this . to )
94+ : undefined ;
95+
96+ const now = CoreTimeUtils . timestamp ( ) ;
97+ const midnight = AddonBlockTimeline . getDayStart ( ) ;
9998
10099 return await Promise . all ( this . events . filter ( ( event ) => {
101- if ( end ) {
102- return start <= event . timesort && event . timesort < end ;
100+ if ( start > event . timesort || ( end && event . timesort >= end ) ) {
101+ return false ;
102+ }
103+
104+ // Already calculated on 4.0 onwards but this will be live.
105+ event . overdue = event . timesort < now ;
106+
107+ if ( event . eventtype === 'open' || event . eventtype === 'opensubmission' ) {
108+ const dayTimestamp = CoreTimeUtils . getMidnightForTimestamp ( event . timesort ) ;
109+
110+ return dayTimestamp > midnight ;
103111 }
104112
105- return start <= event . timesort ;
113+ // When filtering by overdue, we fetch all events due today, in case any have elapsed already and are overdue.
114+ // This means if filtering by overdue, some events fetched might not be required (eg if due later today).
115+ return ( ! this . overdue || event . overdue ) ;
106116 } ) . map ( async ( event ) => {
107117 event . iconUrl = await CoreCourse . getModuleIconSrc ( event . icon . component ) ;
108118 event . modulename = event . modulename || event . icon . component ;
@@ -147,7 +157,8 @@ export class AddonBlockTimelineEventsComponent implements OnChanges {
147157
148158}
149159
150- type AddonBlockTimelineEvent = AddonCalendarEvent & {
160+ type AddonBlockTimelineEvent = Omit < AddonCalendarEvent , 'eventtype' > & {
161+ eventtype : string ;
151162 iconUrl ?: string ;
152163 iconTitle ?: string ;
153164} ;
0 commit comments