Skip to content

Commit f9b1951

Browse files
committed
MOBILE-3881 timeline: Fix overdue tasks showing different from LMS
1 parent 6d0b53f commit f9b1951

File tree

4 files changed

+32
-19
lines changed

4 files changed

+32
-19
lines changed

src/addons/block/timeline/components/events/events.ts

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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 = AddonBlockTimeline.getDayStart(start);
98-
end = end !== undefined ? AddonBlockTimeline.getDayStart(end) : 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
};

src/addons/block/timeline/components/timeline/addon-block-timeline.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,12 @@ <h2>{{ 'addon.block_timeline.pluginname' | translate }}</h2>
6060

6161
<core-loading [hideUntil]="timeline.loaded" [hidden]="sort != 'sortbydates'">
6262
<addon-block-timeline-events [events]="timeline.events" [canLoadMore]="timeline.canLoadMore" (loadMore)="loadMore()"
63-
[from]="dataFrom" [to]="dataTo"></addon-block-timeline-events>
63+
[from]="dataFrom" [to]="dataTo" [overdue]="overdue"></addon-block-timeline-events>
6464
</core-loading>
6565
<core-loading [hideUntil]="timelineCourses.loaded" [hidden]="sort != 'sortbycourses'">
6666
<ng-container *ngFor="let course of timelineCourses.courses">
6767
<addon-block-timeline-events [events]="course.events" [canLoadMore]="course.canLoadMore" (loadMore)="loadMore(course)"
68-
[course]="course" [from]="dataFrom" [to]="dataTo"></addon-block-timeline-events>
68+
[course]="course" [from]="dataFrom" [to]="dataTo" [overdue]="overdue"></addon-block-timeline-events>
6969
</ng-container>
7070
<core-empty-box *ngIf="timelineCourses.courses.length == 0" image="assets/img/icons/courses.svg"
7171
[message]="'addon.block_timeline.noevents' | translate"></core-empty-box>

src/addons/block/timeline/components/timeline/timeline.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ export class AddonBlockTimelineComponent extends CoreBlockBaseComponent implemen
5858

5959
dataFrom?: number;
6060
dataTo?: number;
61+
overdue = false;
6162

6263
searchEnabled = false;
6364
searchText = '';
@@ -200,6 +201,7 @@ export class AddonBlockTimelineComponent extends CoreBlockBaseComponent implemen
200201
switchFilter(filter: string): void {
201202
this.filter = filter;
202203
this.currentSite.setLocalSiteConfig('AddonBlockTimelineFilter', this.filter);
204+
this.overdue = this.filter === 'overdue';
203205

204206
switch (this.filter) {
205207
case 'overdue':

src/addons/calendar/services/calendar.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ import { CoreText } from '@singletons/text';
4545
const ROOT_CACHE_KEY = 'mmaCalendar:';
4646

4747
/**
48-
* Context levels enumeration.
48+
* Main calendar Event types enumeration.
4949
*/
5050
export enum AddonCalendarEventType {
5151
SITE = 'site',

0 commit comments

Comments
 (0)