From 2261dfb296ecd9f4b71d11991ae2676b3a0b6b9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Tue, 12 Mar 2024 12:17:04 +0100 Subject: [PATCH 1/2] MOBILE-4530 calendar: Add branded type to caledar and sort WS types --- .../recentlyaccesseditems.ts | 6 +- .../services/recentlyaccesseditems.ts | 34 ++++-- .../block/timeline/services/timeline.ts | 103 +++++++++++++++--- src/addons/calendar/pages/event/event.html | 3 +- src/addons/calendar/services/calendar.ts | 69 +----------- 5 files changed, 117 insertions(+), 98 deletions(-) diff --git a/src/addons/block/recentlyaccesseditems/components/recentlyaccesseditems/recentlyaccesseditems.ts b/src/addons/block/recentlyaccesseditems/components/recentlyaccesseditems/recentlyaccesseditems.ts index 1194ca25e78..b832e75528f 100644 --- a/src/addons/block/recentlyaccesseditems/components/recentlyaccesseditems/recentlyaccesseditems.ts +++ b/src/addons/block/recentlyaccesseditems/components/recentlyaccesseditems/recentlyaccesseditems.ts @@ -17,7 +17,7 @@ import { CoreSites } from '@services/sites'; import { CoreBlockBaseComponent } from '@features/block/classes/base-block-component'; import { AddonBlockRecentlyAccessedItems, - AddonBlockRecentlyAccessedItemsItem, + AddonBlockRecentlyAccessedItemsItemCalculatedData, } from '../../services/recentlyaccesseditems'; import { CoreTextUtils } from '@services/utils/text'; import { CoreDomUtils } from '@services/utils/dom'; @@ -33,7 +33,7 @@ import { CoreUtils } from '@services/utils/utils'; }) export class AddonBlockRecentlyAccessedItemsComponent extends CoreBlockBaseComponent implements OnInit { - items: AddonBlockRecentlyAccessedItemsItem[] = []; + items: AddonBlockRecentlyAccessedItemsItemCalculatedData[] = []; scrollElementId!: string; protected fetchContentDefaultError = 'Error getting recently accessed items data.'; @@ -79,7 +79,7 @@ export class AddonBlockRecentlyAccessedItemsComponent extends CoreBlockBaseCompo * @param item Activity item info. * @returns Promise resolved when done. */ - async action(e: Event, item: AddonBlockRecentlyAccessedItemsItem): Promise { + async action(e: Event, item: AddonBlockRecentlyAccessedItemsItemCalculatedData): Promise { e.preventDefault(); e.stopPropagation(); diff --git a/src/addons/block/recentlyaccesseditems/services/recentlyaccesseditems.ts b/src/addons/block/recentlyaccesseditems/services/recentlyaccesseditems.ts index 13ca419b700..e049881e99d 100644 --- a/src/addons/block/recentlyaccesseditems/services/recentlyaccesseditems.ts +++ b/src/addons/block/recentlyaccesseditems/services/recentlyaccesseditems.ts @@ -38,24 +38,35 @@ export class AddonBlockRecentlyAccessedItemsProvider { } /** - * Get last accessed items. + * Get last accessed items from WS. * * @param siteId Site ID. If not defined, use current site. * @returns Promise resolved when the info is retrieved. */ - async getRecentItems(siteId?: string): Promise { + protected async getRecentItemsWS(siteId?: string): Promise { const site = await CoreSites.getSite(siteId); const preSets: CoreSiteWSPreSets = { cacheKey: this.getRecentItemsCacheKey(), }; - let items: AddonBlockRecentlyAccessedItemsItem[] = - await site.read('block_recentlyaccesseditems_get_recent_items', undefined, preSets); + return await site.read('block_recentlyaccesseditems_get_recent_items', undefined, preSets); + } + + /** + * Get last accessed items. + * + * @param siteId Site ID. If not defined, use current site. + * @returns Promise resolved when the info is retrieved with some calculated data. + */ + async getRecentItems(siteId?: string): Promise { + const site = await CoreSites.getSite(siteId); + + const items = await this.getRecentItemsWS(site.getId()); const cmIds: number[] = []; - items = await Promise.all(items.map(async (item) => { + const itemsToDisplay = await Promise.all(items.map(async (item: AddonBlockRecentlyAccessedItemsItemCalculatedData) => { const modicon = item.icon && CoreDomUtils.getHTMLElementAttribute(item.icon, 'src'); item.iconUrl = await CoreCourseModuleDelegate.getModuleIconSrc(item.modname, modicon || undefined); @@ -68,7 +79,7 @@ export class AddonBlockRecentlyAccessedItemsProvider { // Check if the viewed module should be updated for each activity. const lastViewedMap = await CoreCourse.getCertainModulesViewed(cmIds, site.getId()); - items.forEach((recentItem) => { + itemsToDisplay.forEach((recentItem) => { const timeAccess = recentItem.timeaccess * 1000; const lastViewed = lastViewedMap[recentItem.cmid]; @@ -84,7 +95,7 @@ export class AddonBlockRecentlyAccessedItemsProvider { }); }); - return items; + return itemsToDisplay; } /** @@ -103,11 +114,11 @@ export class AddonBlockRecentlyAccessedItemsProvider { export const AddonBlockRecentlyAccessedItems = makeSingleton(AddonBlockRecentlyAccessedItemsProvider); /** - * Result of WS block_recentlyaccesseditems_get_recent_items. + * Data returned by block_recentlyaccesseditems_get_recent_items WS. * * The most recently accessed activities/resources by the logged user. */ -export type AddonBlockRecentlyAccessedItemsItem = { +type AddonBlockRecentlyaccesseditemsGetRecentItemsWSResponse = { id: number; // Id. courseid: number; // Courseid. cmid: number; // Cmid. @@ -120,12 +131,13 @@ export type AddonBlockRecentlyAccessedItemsItem = { courseviewurl: string; // Courseviewurl. icon: string; // Icon. purpose?: string; // Purpose. @since 4.0 -} & AddonBlockRecentlyAccessedItemsItemCalculatedData; + branded?: boolean; // Branded. @since 4.4 +}; /** * Calculated data for recently accessed item. */ -export type AddonBlockRecentlyAccessedItemsItemCalculatedData = { +export type AddonBlockRecentlyAccessedItemsItemCalculatedData = AddonBlockRecentlyaccesseditemsGetRecentItemsWSResponse & { iconUrl: string; // Icon URL. Calculated by the app. iconTitle?: string | null; // Icon title. }; diff --git a/src/addons/block/timeline/services/timeline.ts b/src/addons/block/timeline/services/timeline.ts index 84cb541117a..1397940f903 100644 --- a/src/addons/block/timeline/services/timeline.ts +++ b/src/addons/block/timeline/services/timeline.ts @@ -15,26 +15,21 @@ import { Injectable } from '@angular/core'; import { CoreSites } from '@services/sites'; import { - AddonCalendarEvents, - AddonCalendarEventsGroupedByCourse, AddonCalendarEvent, - AddonCalendarGetActionEventsByCourseWSParams, - AddonCalendarGetActionEventsByTimesortWSParams, - AddonCalendarGetActionEventsByCoursesWSParams, } from '@addons/calendar/services/calendar'; import moment from 'moment-timezone'; import { makeSingleton } from '@singletons'; import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; -// Cache key was maintained from block myoverview when blocks were splitted. -const ROOT_CACHE_KEY = 'myoverview:'; - /** * Service that provides some features regarding course overview. */ @Injectable({ providedIn: 'root' }) export class AddonBlockTimelineProvider { + // Cache key was maintained from block myoverview when blocks were splitted. + protected static readonly ROOT_CACHE_KEY = 'myoverview:'; + static readonly EVENTS_LIMIT = 20; static readonly EVENTS_LIMIT_PER_COURSE = 10; @@ -57,7 +52,7 @@ export class AddonBlockTimelineProvider { const time = this.getDayStart(-14); // Check two weeks ago. - const data: AddonCalendarGetActionEventsByCourseWSParams = { + const data: AddonBlockTimelineGetActionEventsByCourseWSParams = { timesortfrom: time, courseid: courseId, limitnum: AddonBlockTimelineProvider.EVENTS_LIMIT_PER_COURSE, @@ -75,7 +70,7 @@ export class AddonBlockTimelineProvider { preSets.getFromCache = false; } - const courseEvents = await site.read( + const courseEvents = await site.read( 'core_calendar_get_action_events_by_course', data, preSets, @@ -115,7 +110,7 @@ export class AddonBlockTimelineProvider { const time = this.getDayStart(-14); // Check two weeks ago. - const data: AddonCalendarGetActionEventsByCoursesWSParams = { + const data: AddonBlockTimelineGetActionEventsByCoursesWSParams = { timesortfrom: time, courseids: courseIds, limitnum: AddonBlockTimelineProvider.EVENTS_LIMIT_PER_COURSE, @@ -129,7 +124,7 @@ export class AddonBlockTimelineProvider { preSets.getFromCache = false; } - const events = await site.read( + const events = await site.read( 'core_calendar_get_action_events_by_courses', data, preSets, @@ -150,7 +145,7 @@ export class AddonBlockTimelineProvider { * @returns Cache key. */ protected getActionEventsByCoursesCacheKey(): string { - return ROOT_CACHE_KEY + 'bycourse'; + return AddonBlockTimelineProvider.ROOT_CACHE_KEY + 'bycourse'; } /** @@ -171,7 +166,7 @@ export class AddonBlockTimelineProvider { const timesortfrom = this.getDayStart(-14); // Check two weeks ago. const limitnum = AddonBlockTimelineProvider.EVENTS_LIMIT; - const data: AddonCalendarGetActionEventsByTimesortWSParams = { + const data: AddonBlockTimelineGetActionEventsByTimesortWSParams = { timesortfrom, limitnum, limittononsuspendedevents: true, @@ -192,7 +187,7 @@ export class AddonBlockTimelineProvider { preSets.cacheKey += ':' + searchValue; } - const result = await site.read( + const result = await site.read( 'core_calendar_get_action_events_by_timesort', data, preSets, @@ -215,7 +210,7 @@ export class AddonBlockTimelineProvider { * @returns Cache key. */ protected getActionEventsByTimesortPrefixCacheKey(): string { - return ROOT_CACHE_KEY + 'bytimesort:'; + return AddonBlockTimelineProvider.ROOT_CACHE_KEY + 'bytimesort:'; } /** @@ -264,7 +259,7 @@ export class AddonBlockTimelineProvider { * @returns Object with course events and last loaded event id if more can be loaded. */ protected treatCourseEvents( - course: AddonCalendarEvents, + course: AddonBlockTimelineEvents, timeFrom: number, ): { events: AddonCalendarEvent[]; canLoadMore?: number } { @@ -293,3 +288,77 @@ export class AddonBlockTimelineProvider { } export const AddonBlockTimeline = makeSingleton(AddonBlockTimelineProvider); + +/** + * Params of core_calendar_get_action_events_by_timesort WS. + */ +type AddonBlockTimelineGetActionEventsByTimesortWSParams = { + timesortfrom?: number; // Time sort from. + timesortto?: number; // Time sort to. + aftereventid?: number; // The last seen event id. + limitnum?: number; // Limit number. + limittononsuspendedevents?: boolean; // Limit the events to courses the user is not suspended in. + userid?: number; // The user id. + searchvalue?: string; // The value a user wishes to search against. +}; + +/** + * Data returned by core_calendar_get_action_events_by_timesort WS. + * + * WS Description: Get calendar action events by tiemsort + */ +type AddonBlockTimelineGetActionEventsByTimesortWSResponse = AddonBlockTimelineEvents; + +/** + * Params of core_calendar_get_action_events_by_course WS. + */ +type AddonBlockTimelineGetActionEventsByCourseWSParams = { + courseid: number; // Course id. + timesortfrom?: number; // Time sort from. + timesortto?: number; // Time sort to. + aftereventid?: number; // The last seen event id. + limitnum?: number; // Limit number. + searchvalue?: string; // The value a user wishes to search against. +}; + +/** + * Params of core_calendar_get_action_events_by_courses WS. + */ +type AddonBlockTimelineGetActionEventsByCoursesWSParams = { + courseids: number[]; + timesortfrom?: number; // Time sort from. + timesortto?: number; // Time sort to. + limitnum?: number; // Limit number. + searchvalue?: string; // The value a user wishes to search against. +}; + +/** + * Data returned by calendar's events_grouped_by_course_exporter. + * Data returned by core_calendar_get_action_events_by_courses WS. + */ +type AddonBlockTimelineGetActionEventsByCoursesWSResponse = { + groupedbycourse: AddonBlockTimelineEventsSameCourse[]; // Groupped by course. +}; + +/** + * Data returned by calendar's events_same_course_exporter. + */ +type AddonBlockTimelineEventsSameCourse = AddonBlockTimelineEvents & { + courseid: number; // Courseid. +}; + +/** + * Data returned by core_calendar_get_action_events_by_course WS. + * + * WS Description: Get calendar action events by course + */ +type AddonBlockTimelineGetActionEventsByCourseWSResponse = AddonBlockTimelineEvents; + +/** + * Data returned by calendar's events_exporter. + */ +export type AddonBlockTimelineEvents = { + events: AddonCalendarEvent[]; // Events. + firstid: number; // Firstid. + lastid: number; // Lastid. +}; diff --git a/src/addons/calendar/pages/event/event.html b/src/addons/calendar/pages/event/event.html index cdd04845f3f..92128273fe0 100644 --- a/src/addons/calendar/pages/event/event.html +++ b/src/addons/calendar/pages/event/event.html @@ -31,8 +31,7 @@

- + [componentId]="event.instance" slot="start" [purpose]="event.purpose" [isBranded]="event.branded" />