diff --git a/src/addons/block/timeline/components/events/events.ts b/src/addons/block/timeline/components/events/events.ts index fe986201f..653313e31 100644 --- a/src/addons/block/timeline/components/events/events.ts +++ b/src/addons/block/timeline/components/events/events.ts @@ -37,6 +37,7 @@ export class AddonBlockTimelineEventsComponent implements OnChanges { @Input() course?: CoreEnrolledCourseDataWithOptions; // Whether to show the course name. @Input() from = 0; // Number of days from today to offset the events. @Input() to?: number; // Number of days from today to limit the events to. If not defined, no limit. + @Input() overdue = false; // If filtering overdue events or not. @Input() canLoadMore = false; // Whether more events can be loaded. @Output() loadMore = new EventEmitter(); // Notify that more events should be loaded. @@ -53,18 +54,13 @@ export class AddonBlockTimelineEventsComponent implements OnChanges { if (changes.events || changes.from || changes.to) { if (this.events) { - const filteredEvents = await this.filterEventsByTime(this.from, this.to); + const filteredEvents = await this.filterEventsByTime(); this.empty = !filteredEvents || filteredEvents.length <= 0; - const now = CoreTimeUtils.timestamp(); - - const eventsByDay: Record = {}; + const eventsByDay: Record = {}; filteredEvents.forEach((event) => { const dayTimestamp = CoreTimeUtils.getMidnightForTimestamp(event.timesort); - // Already calculated on 4.0 onwards but this will be live. - event.overdue = event.timesort < now; - if (eventsByDay[dayTimestamp]) { eventsByDay[dayTimestamp].push(event); } else { @@ -89,20 +85,34 @@ export class AddonBlockTimelineEventsComponent implements OnChanges { /** * Filter the events by time. * - * @param start Number of days to start getting events from today. E.g. -1 will get events from yesterday. - * @param end Number of days after the start. * @return Filtered events. */ - protected async filterEventsByTime(start: number, end?: number): Promise { - start = AddonBlockTimeline.getDayStart(start); - end = end !== undefined ? AddonBlockTimeline.getDayStart(end) : end; + protected async filterEventsByTime(): Promise { + const start = AddonBlockTimeline.getDayStart(this.from); + const end = this.to !== undefined + ? AddonBlockTimeline.getDayStart(this.to) + : undefined; + + const now = CoreTimeUtils.timestamp(); + const midnight = AddonBlockTimeline.getDayStart(); return await Promise.all(this.events.filter((event) => { - if (end) { - return start <= event.timesort && event.timesort < end; + if (start > event.timesort || (end && event.timesort >= end)) { + return false; } - return start <= event.timesort; + // Already calculated on 4.0 onwards but this will be live. + event.overdue = event.timesort < now; + + if (event.eventtype === 'open' || event.eventtype === 'opensubmission') { + const dayTimestamp = CoreTimeUtils.getMidnightForTimestamp(event.timesort); + + return dayTimestamp > midnight; + } + + // When filtering by overdue, we fetch all events due today, in case any have elapsed already and are overdue. + // This means if filtering by overdue, some events fetched might not be required (eg if due later today). + return (!this.overdue || event.overdue); }).map(async (event) => { event.iconUrl = await CoreCourse.getModuleIconSrc(event.icon.component); event.modulename = event.modulename || event.icon.component; @@ -147,7 +157,8 @@ export class AddonBlockTimelineEventsComponent implements OnChanges { } -type AddonBlockTimelineEvent = AddonCalendarEvent & { +type AddonBlockTimelineEvent = Omit & { + eventtype: string; iconUrl?: string; iconTitle?: string; }; diff --git a/src/addons/block/timeline/components/timeline/addon-block-timeline.html b/src/addons/block/timeline/components/timeline/addon-block-timeline.html index c494a8f6f..e518b440c 100644 --- a/src/addons/block/timeline/components/timeline/addon-block-timeline.html +++ b/src/addons/block/timeline/components/timeline/addon-block-timeline.html @@ -60,12 +60,12 @@ + [from]="dataFrom" [to]="dataTo" [overdue]="overdue"> + [course]="course" [from]="dataFrom" [to]="dataTo" [overdue]="overdue"> diff --git a/src/addons/block/timeline/components/timeline/timeline.ts b/src/addons/block/timeline/components/timeline/timeline.ts index e26045dd8..dc23ebbca 100644 --- a/src/addons/block/timeline/components/timeline/timeline.ts +++ b/src/addons/block/timeline/components/timeline/timeline.ts @@ -58,6 +58,7 @@ export class AddonBlockTimelineComponent extends CoreBlockBaseComponent implemen dataFrom?: number; dataTo?: number; + overdue = false; searchEnabled = false; searchText = ''; @@ -200,6 +201,7 @@ export class AddonBlockTimelineComponent extends CoreBlockBaseComponent implemen switchFilter(filter: string): void { this.filter = filter; this.currentSite.setLocalSiteConfig('AddonBlockTimelineFilter', this.filter); + this.overdue = this.filter === 'overdue'; switch (this.filter) { case 'overdue': diff --git a/src/addons/calendar/services/calendar.ts b/src/addons/calendar/services/calendar.ts index c8bbf90d3..6877b54c3 100644 --- a/src/addons/calendar/services/calendar.ts +++ b/src/addons/calendar/services/calendar.ts @@ -45,7 +45,7 @@ import { CoreText } from '@singletons/text'; const ROOT_CACHE_KEY = 'mmaCalendar:'; /** - * Context levels enumeration. + * Main calendar Event types enumeration. */ export enum AddonCalendarEventType { SITE = 'site',