MOBILE-3909 calendar: Sort reminders by time created and display date

main
Dani Palou 2022-03-16 08:16:19 +01:00
parent c0b170b5f0
commit 580f4a9f8a
4 changed files with 33 additions and 10 deletions

View File

@ -136,7 +136,8 @@
<ng-container *ngFor="let reminder of reminders"> <ng-container *ngFor="let reminder of reminders">
<ion-item *ngIf="reminder.timestamp > 0" class="ion-text-wrap" [class.item-dimmed]="reminder.timestamp <= currentTime"> <ion-item *ngIf="reminder.timestamp > 0" class="ion-text-wrap" [class.item-dimmed]="reminder.timestamp <= currentTime">
<ion-label> <ion-label>
<p>{{ reminder.label }}</p> <p class="item-heading">{{ reminder.label }}</p>
<p *ngIf="reminder.sublabel">{{ reminder.sublabel }}</p>
</ion-label> </ion-label>
<ion-button fill="clear" (click)="cancelNotification(reminder.id, $event)" [attr.aria-label]="'core.delete' | translate" <ion-button fill="clear" (click)="cancelNotification(reminder.id, $event)" [attr.aria-label]="'core.delete' | translate"
slot="end"> slot="end">

View File

@ -37,6 +37,7 @@ import { AddonCalendarSyncInvalidateEvent } from './calendar-sync';
import { AddonCalendarOfflineEventDBRecord } from './database/calendar-offline'; import { AddonCalendarOfflineEventDBRecord } from './database/calendar-offline';
import { CoreCategoryData } from '@features/courses/services/courses'; import { CoreCategoryData } from '@features/courses/services/courses';
import { AddonCalendarReminderDBRecord } from './database/calendar'; import { AddonCalendarReminderDBRecord } from './database/calendar';
import { CoreTimeUtils } from '@services/utils/time';
/** /**
* Context levels enumeration. * Context levels enumeration.
@ -329,6 +330,9 @@ export class AddonCalendarHelperProvider {
if (reminder.value && reminder.unit) { if (reminder.value && reminder.unit) {
reminder.label = AddonCalendar.getUnitValueLabel(reminder.value, reminder.unit, reminder.time === null); reminder.label = AddonCalendar.getUnitValueLabel(reminder.value, reminder.unit, reminder.time === null);
if (reminder.timestamp) {
reminder.sublabel = CoreTimeUtils.userDate(reminder.timestamp * 1000, 'core.strftimedatetime');
}
} }
return reminder; return reminder;
@ -796,4 +800,5 @@ export type AddonCalendarEventReminder = AddonCalendarReminderDBRecord & {
unit?: AddonCalendarReminderUnits; // Units. unit?: AddonCalendarReminderUnits; // Units.
timestamp?: number; // Timestamp (in seconds). timestamp?: number; // Timestamp (in seconds).
label?: string; // Label to represent the reminder. label?: string; // Label to represent the reminder.
sublabel?: string; // Sub label.
}; };

View File

@ -777,6 +777,7 @@ export class AddonCalendarProvider {
const reminder: Partial<AddonCalendarReminderDBRecord> = { const reminder: Partial<AddonCalendarReminderDBRecord> = {
eventid: event.id, eventid: event.id,
time: time ?? null, time: time ?? null,
timecreated: Date.now(),
}; };
const reminderId = await site.getDb().insertRecord(REMINDERS_TABLE, reminder); const reminderId = await site.getDb().insertRecord(REMINDERS_TABLE, reminder);
@ -913,7 +914,7 @@ export class AddonCalendarProvider {
async getEventReminders(id: number, siteId?: string): Promise<AddonCalendarReminderDBRecord[]> { async getEventReminders(id: number, siteId?: string): Promise<AddonCalendarReminderDBRecord[]> {
const site = await CoreSites.getSite(siteId); const site = await CoreSites.getSite(siteId);
return await site.getDb().getRecords(REMINDERS_TABLE, { eventid: id }, 'time ASC'); return await site.getDb().getRecords(REMINDERS_TABLE, { eventid: id }, 'timecreated ASC, time ASC');
} }
/** /**

View File

@ -22,7 +22,7 @@ import { AddonCalendar, AddonCalendarEventType, AddonCalendarProvider } from '..
* Database variables for AddonCalendarProvider service. * Database variables for AddonCalendarProvider service.
*/ */
export const EVENTS_TABLE = 'addon_calendar_events_3'; export const EVENTS_TABLE = 'addon_calendar_events_3';
export const REMINDERS_TABLE = 'addon_calendar_reminders'; export const REMINDERS_TABLE = 'addon_calendar_reminders_2';
export const CALENDAR_SITE_SCHEMA: CoreSiteSchema = { export const CALENDAR_SITE_SCHEMA: CoreSiteSchema = {
name: 'AddonCalendarProvider', name: 'AddonCalendarProvider',
version: 4, version: 4,
@ -195,6 +195,10 @@ export const CALENDAR_SITE_SCHEMA: CoreSiteSchema = {
name: 'time', name: 'time',
type: 'INTEGER', type: 'INTEGER',
}, },
{
name: 'timecreated',
type: 'INTEGER',
},
], ],
uniqueKeys: [ uniqueKeys: [
['eventid', 'time'], ['eventid', 'time'],
@ -228,7 +232,16 @@ export const CALENDAR_SITE_SCHEMA: CoreSiteSchema = {
} }
// Migrate reminders. New format @since 4.0. // Migrate reminders. New format @since 4.0.
const records = await db.getAllRecords<AddonCalendarReminderDBRecord>(REMINDERS_TABLE); const oldTable = 'addon_calendar_reminders';
try {
await db.tableExists(oldTable);
} catch (error) {
// Old table does not exist, ignore.
return;
}
const records = await db.getAllRecords<AddonCalendarReminderDBRecord>(oldTable);
const events: Record<number, AddonCalendarEventDBRecord> = {}; const events: Record<number, AddonCalendarEventDBRecord> = {};
await Promise.all(records.map(async (record) => { await Promise.all(records.map(async (record) => {
@ -237,9 +250,7 @@ export const CALENDAR_SITE_SCHEMA: CoreSiteSchema = {
try { try {
events[record.eventid] = await db.getRecord(EVENTS_TABLE, { id: record.eventid }); events[record.eventid] = await db.getRecord(EVENTS_TABLE, { id: record.eventid });
} catch { } catch {
// Event not found in local DB, shouldn't happen. Delete the reminder. // Event not found in local DB, shouldn't happen. Ignore the reminder.
await db.deleteRecords(REMINDERS_TABLE, { id: record.id });
return; return;
} }
} }
@ -248,9 +259,7 @@ export const CALENDAR_SITE_SCHEMA: CoreSiteSchema = {
// Default reminder. Use null now. // Default reminder. Use null now.
record.time = null; record.time = null;
} else if (record.time > events[record.eventid].timestart) { } else if (record.time > events[record.eventid].timestart) {
// Reminder is after the event, delete it. // Reminder is after the event, ignore it.
await db.deleteRecords(REMINDERS_TABLE, { id: record.id });
return; return;
} else { } else {
// Remove seconds from the old reminder, it could include seconds by mistake. // Remove seconds from the old reminder, it could include seconds by mistake.
@ -259,6 +268,12 @@ export const CALENDAR_SITE_SCHEMA: CoreSiteSchema = {
return db.insertRecord(REMINDERS_TABLE, record); return db.insertRecord(REMINDERS_TABLE, record);
})); }));
try {
await db.dropTable(oldTable);
} catch (error) {
// Error deleting old table, ignore.
}
} }
}, },
}; };
@ -308,4 +323,5 @@ export type AddonCalendarReminderDBRecord = {
id: number; id: number;
eventid: number; eventid: number;
time: number | null; // Number of seconds before the event, null for default time. time: number | null; // Number of seconds before the event, null for default time.
timecreated?: number | null;
}; };