MOBILE-3909 calendar: Sort reminders by time created and display date
parent
c0b170b5f0
commit
580f4a9f8a
|
@ -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">
|
||||||
|
|
|
@ -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.
|
||||||
};
|
};
|
||||||
|
|
|
@ -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');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue