From 580f4a9f8a0f7d769140a45e0ba6f612e552f092 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Wed, 16 Mar 2022 08:16:19 +0100 Subject: [PATCH] MOBILE-3909 calendar: Sort reminders by time created and display date --- src/addons/calendar/pages/event/event.html | 3 +- .../calendar/services/calendar-helper.ts | 5 +++ src/addons/calendar/services/calendar.ts | 3 +- .../calendar/services/database/calendar.ts | 32 ++++++++++++++----- 4 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/addons/calendar/pages/event/event.html b/src/addons/calendar/pages/event/event.html index 0b21ac1f4..ab3c5bcb8 100644 --- a/src/addons/calendar/pages/event/event.html +++ b/src/addons/calendar/pages/event/event.html @@ -136,7 +136,8 @@ -

{{ reminder.label }}

+

{{ reminder.label }}

+

{{ reminder.sublabel }}

diff --git a/src/addons/calendar/services/calendar-helper.ts b/src/addons/calendar/services/calendar-helper.ts index a4f3a9479..dce3c6fc5 100644 --- a/src/addons/calendar/services/calendar-helper.ts +++ b/src/addons/calendar/services/calendar-helper.ts @@ -37,6 +37,7 @@ import { AddonCalendarSyncInvalidateEvent } from './calendar-sync'; import { AddonCalendarOfflineEventDBRecord } from './database/calendar-offline'; import { CoreCategoryData } from '@features/courses/services/courses'; import { AddonCalendarReminderDBRecord } from './database/calendar'; +import { CoreTimeUtils } from '@services/utils/time'; /** * Context levels enumeration. @@ -329,6 +330,9 @@ export class AddonCalendarHelperProvider { if (reminder.value && reminder.unit) { 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; @@ -796,4 +800,5 @@ export type AddonCalendarEventReminder = AddonCalendarReminderDBRecord & { unit?: AddonCalendarReminderUnits; // Units. timestamp?: number; // Timestamp (in seconds). label?: string; // Label to represent the reminder. + sublabel?: string; // Sub label. }; diff --git a/src/addons/calendar/services/calendar.ts b/src/addons/calendar/services/calendar.ts index 817b44ee1..d010a96d9 100644 --- a/src/addons/calendar/services/calendar.ts +++ b/src/addons/calendar/services/calendar.ts @@ -777,6 +777,7 @@ export class AddonCalendarProvider { const reminder: Partial = { eventid: event.id, time: time ?? null, + timecreated: Date.now(), }; const reminderId = await site.getDb().insertRecord(REMINDERS_TABLE, reminder); @@ -913,7 +914,7 @@ export class AddonCalendarProvider { async getEventReminders(id: number, siteId?: string): Promise { 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'); } /** diff --git a/src/addons/calendar/services/database/calendar.ts b/src/addons/calendar/services/database/calendar.ts index b21928140..1349eb9be 100644 --- a/src/addons/calendar/services/database/calendar.ts +++ b/src/addons/calendar/services/database/calendar.ts @@ -22,7 +22,7 @@ import { AddonCalendar, AddonCalendarEventType, AddonCalendarProvider } from '.. * Database variables for AddonCalendarProvider service. */ 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 = { name: 'AddonCalendarProvider', version: 4, @@ -195,6 +195,10 @@ export const CALENDAR_SITE_SCHEMA: CoreSiteSchema = { name: 'time', type: 'INTEGER', }, + { + name: 'timecreated', + type: 'INTEGER', + }, ], uniqueKeys: [ ['eventid', 'time'], @@ -228,7 +232,16 @@ export const CALENDAR_SITE_SCHEMA: CoreSiteSchema = { } // Migrate reminders. New format @since 4.0. - const records = await db.getAllRecords(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(oldTable); const events: Record = {}; await Promise.all(records.map(async (record) => { @@ -237,9 +250,7 @@ export const CALENDAR_SITE_SCHEMA: CoreSiteSchema = { try { events[record.eventid] = await db.getRecord(EVENTS_TABLE, { id: record.eventid }); } catch { - // Event not found in local DB, shouldn't happen. Delete the reminder. - await db.deleteRecords(REMINDERS_TABLE, { id: record.id }); - + // Event not found in local DB, shouldn't happen. Ignore the reminder. return; } } @@ -248,9 +259,7 @@ export const CALENDAR_SITE_SCHEMA: CoreSiteSchema = { // Default reminder. Use null now. record.time = null; } else if (record.time > events[record.eventid].timestart) { - // Reminder is after the event, delete it. - await db.deleteRecords(REMINDERS_TABLE, { id: record.id }); - + // Reminder is after the event, ignore it. return; } else { // 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); })); + + try { + await db.dropTable(oldTable); + } catch (error) { + // Error deleting old table, ignore. + } } }, }; @@ -308,4 +323,5 @@ export type AddonCalendarReminderDBRecord = { id: number; eventid: number; time: number | null; // Number of seconds before the event, null for default time. + timecreated?: number | null; };