commit
84781a7658
|
@ -69,7 +69,7 @@ jobs:
|
|||
cat circular-dependencies
|
||||
lines=$(cat circular-dependencies | wc -l)
|
||||
echo "Total circular dependencies: $lines"
|
||||
test $lines -eq 130
|
||||
test $lines -eq 90
|
||||
- name: JavaScript code compatibility
|
||||
run: |
|
||||
npx check-es-compat www/*.js --polyfills="\{Array,String,TypedArray\}.prototype.at,Object.hasOwn"
|
||||
|
|
|
@ -30,4 +30,4 @@ const routes: Routes = [
|
|||
RouterModule.forChild(routes),
|
||||
],
|
||||
})
|
||||
export class AddonBadgeLazyModule {}
|
||||
export default class AddonBadgeLazyModule {}
|
||||
|
|
|
@ -33,4 +33,4 @@ const routes: Routes = [
|
|||
AddonBadgesBadgeClassPage,
|
||||
],
|
||||
})
|
||||
export class AddonBadgeClassLazyModule {}
|
||||
export default class AddonBadgeClassLazyModule {}
|
||||
|
|
|
@ -63,4 +63,4 @@ const routes: Routes = [
|
|||
AddonBadgesUserBadgesPage,
|
||||
],
|
||||
})
|
||||
export class AddonBadgesLazyModule {}
|
||||
export default class AddonBadgesLazyModule {}
|
||||
|
|
|
@ -43,15 +43,15 @@ export async function getBadgesServices(): Promise<Type<unknown>[]> {
|
|||
const mainMenuRoutes: Routes = [
|
||||
{
|
||||
path: 'badge',
|
||||
loadChildren: () => import('./badge-lazy.module').then(m => m.AddonBadgeLazyModule),
|
||||
loadChildren: () => import('./badge-lazy.module'),
|
||||
},
|
||||
{
|
||||
path: 'badges',
|
||||
loadChildren: () => import('./badges-lazy.module').then(m => m.AddonBadgesLazyModule),
|
||||
loadChildren: () => import('./badges-lazy.module'),
|
||||
},
|
||||
{
|
||||
path: 'badgeclass',
|
||||
loadChildren: () => import('./badgeclass-lazy.module').then(m => m.AddonBadgeClassLazyModule),
|
||||
loadChildren: () => import('./badgeclass-lazy.module'),
|
||||
},
|
||||
];
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { CoreDomUtils } from '@services/utils/dom';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
import { CoreNavigator } from '@services/navigator';
|
||||
import { ActivatedRoute } from '@angular/router';
|
||||
import { CoreAnalytics, CoreAnalyticsEventType } from '@services/analytics';
|
||||
|
@ -81,7 +81,7 @@ export class AddonBadgesBadgeClassPage implements OnInit {
|
|||
* @param refresher Refresher.
|
||||
*/
|
||||
async refreshBadgeClass(refresher?: HTMLIonRefresherElement): Promise<void> {
|
||||
await CoreUtils.ignoreErrors(AddonBadges.invalidateBadgeClass(this.badgeId));
|
||||
await CorePromiseUtils.ignoreErrors(AddonBadges.invalidateBadgeClass(this.badgeId));
|
||||
|
||||
await this.fetchBadgeClass();
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ import { CoreDomUtils } from '@services/utils/dom';
|
|||
import { CoreSites } from '@services/sites';
|
||||
import { CoreUser } from '@features/user/services/user';
|
||||
import { AddonBadges, AddonBadgesUserBadge } from '../../services/badges';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
import { CoreCourses } from '@features/courses/services/courses';
|
||||
import { CoreNavigator } from '@services/navigator';
|
||||
import { ActivatedRoute } from '@angular/router';
|
||||
|
@ -151,12 +151,12 @@ export class AddonBadgesIssuedBadgePage implements OnInit, OnDestroy {
|
|||
* @param refresher Refresher.
|
||||
*/
|
||||
async refreshBadges(refresher?: HTMLIonRefresherElement): Promise<void> {
|
||||
await CoreUtils.allPromisesIgnoringErrors([
|
||||
await CorePromiseUtils.allPromisesIgnoringErrors([
|
||||
AddonBadges.invalidateUserBadges(this.courseId, this.userId),
|
||||
AddonBadges.invalidateUserBadgeByHash(this.badgeHash),
|
||||
]);
|
||||
|
||||
await CoreUtils.ignoreErrors(Promise.all([
|
||||
await CorePromiseUtils.ignoreErrors(Promise.all([
|
||||
this.fetchIssuedBadge(),
|
||||
]));
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@ import { AddonBadges, AddonBadgesUserBadge } from '../../services/badges';
|
|||
import { CoreTimeUtils } from '@services/utils/time';
|
||||
import { CoreDomUtils } from '@services/utils/dom';
|
||||
import { CoreSites } from '@services/sites';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
import { CoreSplitViewComponent } from '@components/split-view/split-view';
|
||||
import { CoreNavigator } from '@services/navigator';
|
||||
import { CoreListItemsManager } from '@classes/items-management/list-items-manager';
|
||||
|
@ -90,13 +90,13 @@ export class AddonBadgesUserBadgesPage implements AfterViewInit, OnDestroy {
|
|||
* @param refresher Refresher.
|
||||
*/
|
||||
async refreshBadges(refresher?: HTMLIonRefresherElement): Promise<void> {
|
||||
await CoreUtils.ignoreErrors(
|
||||
await CorePromiseUtils.ignoreErrors(
|
||||
AddonBadges.invalidateUserBadges(
|
||||
this.badges.getSource().COURSE_ID,
|
||||
this.badges.getSource().USER_ID,
|
||||
),
|
||||
);
|
||||
await CoreUtils.ignoreErrors(this.badges.reload());
|
||||
await CorePromiseUtils.ignoreErrors(this.badges.reload());
|
||||
|
||||
refresher?.complete();
|
||||
}
|
||||
|
|
|
@ -15,9 +15,9 @@
|
|||
import { Injectable } from '@angular/core';
|
||||
import { CoreSites } from '@services/sites';
|
||||
import { CoreWSExternalWarning } from '@services/ws';
|
||||
import { CoreSite } from '@classes/sites/site';
|
||||
import { makeSingleton } from '@singletons';
|
||||
import { CoreError } from '@classes/errors/error';
|
||||
import { CoreCacheUpdateFrequency } from '@/core/constants';
|
||||
|
||||
const ROOT_CACHE_KEY = 'mmaBadges:';
|
||||
|
||||
|
@ -70,7 +70,7 @@ export class AddonBadgesProvider {
|
|||
};
|
||||
const preSets = {
|
||||
cacheKey: this.getBadgesCacheKey(courseId, userId),
|
||||
updateFrequency: CoreSite.FREQUENCY_RARELY,
|
||||
updateFrequency: CoreCacheUpdateFrequency.RARELY,
|
||||
};
|
||||
|
||||
const response = await site.read<AddonBadgesGetUserBadgesWSResponse>('core_badges_get_user_badges', data, preSets);
|
||||
|
@ -133,7 +133,7 @@ export class AddonBadgesProvider {
|
|||
};
|
||||
const preSets = {
|
||||
cacheKey: this.getUserBadgeByHashCacheKey(hash),
|
||||
updateFrequency: CoreSite.FREQUENCY_RARELY,
|
||||
updateFrequency: CoreCacheUpdateFrequency.RARELY,
|
||||
};
|
||||
|
||||
const response = await site.read<AddonBadgesGetUserBadgeByHashWSResponse>(
|
||||
|
@ -190,7 +190,7 @@ export class AddonBadgesProvider {
|
|||
};
|
||||
const preSets = {
|
||||
cacheKey: this.getBadgeClassCacheKey(id),
|
||||
updateFrequency: CoreSite.FREQUENCY_RARELY,
|
||||
updateFrequency: CoreCacheUpdateFrequency.RARELY,
|
||||
};
|
||||
|
||||
const response = await site.read<AddonBadgesGetBadgeClassWSResponse>(
|
||||
|
|
|
@ -14,13 +14,14 @@
|
|||
|
||||
import { Injectable } from '@angular/core';
|
||||
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreUtils } from '@singletons/utils';
|
||||
import { CorePushNotificationsClickHandler } from '@features/pushnotifications/services/push-delegate';
|
||||
import { AddonBadges } from '../badges';
|
||||
import { makeSingleton } from '@singletons';
|
||||
import { CorePushNotificationsNotificationBasicData } from '@features/pushnotifications/services/pushnotifications';
|
||||
import { CoreNavigator } from '@services/navigator';
|
||||
import { AddonBadgesHelper } from '../badges-helper';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
|
||||
/**
|
||||
* Handler for badges push notifications clicks.
|
||||
|
@ -72,7 +73,7 @@ export class AddonBadgesPushClickHandlerService implements CorePushNotifications
|
|||
}
|
||||
|
||||
// No hash, open the list of user badges.
|
||||
await CoreUtils.ignoreErrors(
|
||||
await CorePromiseUtils.ignoreErrors(
|
||||
AddonBadges.invalidateUserBadges(
|
||||
0,
|
||||
Number(notification.usertoid),
|
||||
|
|
|
@ -13,7 +13,6 @@
|
|||
// limitations under the License.
|
||||
|
||||
import { Injectable, Type } from '@angular/core';
|
||||
import { CoreTagFeedComponent } from '@features/tag/components/feed/feed';
|
||||
import { CoreTagAreaHandler } from '@features/tag/services/tag-area-delegate';
|
||||
import { CoreTagFeedElement, CoreTagHelper } from '@features/tag/services/tag-helper';
|
||||
import { makeSingleton } from '@singletons';
|
||||
|
@ -45,7 +44,9 @@ export class AddonBadgesTagAreaHandlerService implements CoreTagAreaHandler {
|
|||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
getComponent(): Type<unknown> | Promise<Type<unknown>> {
|
||||
async getComponent(): Promise<Type<unknown>> {
|
||||
const { CoreTagFeedComponent } = await import('@features/tag/components/feed/feed');
|
||||
|
||||
return CoreTagFeedComponent;
|
||||
}
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ import { CoreBlockBaseComponent } from '@features/block/classes/base-block-compo
|
|||
import { CoreSites } from '@services/sites';
|
||||
import { ContextLevel, CoreConstants } from '@/core/constants';
|
||||
import { Translate } from '@singletons';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreObject } from '@singletons/object';
|
||||
import { CoreNavigator } from '@services/navigator';
|
||||
import { CoreCourseHelper } from '@features/course/services/course-helper';
|
||||
import { CoreUrl } from '@singletons/url';
|
||||
|
@ -106,7 +106,7 @@ export class AddonBlockActivityModulesComponent extends CoreBlockBaseComponent i
|
|||
});
|
||||
|
||||
// Sort the modnames alphabetically.
|
||||
modFullNames = CoreUtils.sortValues(modFullNames);
|
||||
modFullNames = CoreObject.sortValues(modFullNames);
|
||||
for (const modName in modFullNames) {
|
||||
const iconModName = modName === 'resources' ? 'page' : modName;
|
||||
|
||||
|
|
|
@ -19,8 +19,8 @@ import { CoreBlockBaseHandler } from '@features/block/classes/base-block-handler
|
|||
import { CoreCourseBlock } from '@features/course/services/course';
|
||||
import { Params } from '@angular/router';
|
||||
import { makeSingleton } from '@singletons';
|
||||
import { AddonCalendarMainMenuHandlerService } from '@addons/calendar/services/handlers/mainmenu';
|
||||
import { ContextLevel } from '@/core/constants';
|
||||
import { ADDON_CALENDAR_PAGE_NAME } from '@addons/calendar/constants';
|
||||
|
||||
/**
|
||||
* Block handler.
|
||||
|
@ -46,7 +46,7 @@ export class AddonBlockCalendarMonthHandlerService extends CoreBlockBaseHandler
|
|||
title: 'addon.block_calendarmonth.pluginname',
|
||||
class: 'addon-block-calendar-month',
|
||||
component: CoreBlockOnlyTitleComponent,
|
||||
link: AddonCalendarMainMenuHandlerService.PAGE_NAME,
|
||||
link: ADDON_CALENDAR_PAGE_NAME,
|
||||
linkParams: linkParams,
|
||||
navOptions: {
|
||||
preferCurrentTab: false,
|
||||
|
|
|
@ -19,9 +19,9 @@ import { CoreBlockBaseHandler } from '@features/block/classes/base-block-handler
|
|||
import { CoreCourseBlock } from '@features/course/services/course';
|
||||
import { Params } from '@angular/router';
|
||||
import { makeSingleton } from '@singletons';
|
||||
import { AddonCalendarMainMenuHandlerService } from '@addons/calendar/services/handlers/mainmenu';
|
||||
import { CoreSites } from '@services/sites';
|
||||
import { ContextLevel } from '@/core/constants';
|
||||
import { ADDON_CALENDAR_PAGE_NAME } from '@addons/calendar/constants';
|
||||
|
||||
/**
|
||||
* Block handler.
|
||||
|
@ -51,7 +51,7 @@ export class AddonBlockCalendarUpcomingHandlerService extends CoreBlockBaseHandl
|
|||
title: 'addon.block_calendarupcoming.pluginname',
|
||||
class: 'addon-block-calendar-upcoming',
|
||||
component: CoreBlockOnlyTitleComponent,
|
||||
link: AddonCalendarMainMenuHandlerService.PAGE_NAME,
|
||||
link: ADDON_CALENDAR_PAGE_NAME,
|
||||
linkParams: linkParams,
|
||||
};
|
||||
}
|
||||
|
|
|
@ -17,7 +17,6 @@ import { CoreEventObserver, CoreEvents } from '@singletons/events';
|
|||
import { CoreTimeUtils } from '@services/utils/time';
|
||||
import { CoreSites, CoreSitesReadingStrategy } from '@services/sites';
|
||||
import {
|
||||
CoreCoursesProvider,
|
||||
CoreCourses,
|
||||
CoreCoursesMyCoursesUpdatedEventData,
|
||||
CoreCourseSummaryData,
|
||||
|
@ -27,7 +26,7 @@ import { CoreCourseHelper, CorePrefetchStatusInfo } from '@features/course/servi
|
|||
import { CoreCourseOptionsDelegate } from '@features/course/services/course-options-delegate';
|
||||
import { CoreBlockBaseComponent } from '@features/block/classes/base-block-component';
|
||||
import { CoreSite } from '@classes/sites/site';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
import { CoreDomUtils } from '@services/utils/dom';
|
||||
import { CoreText } from '@singletons/text';
|
||||
import { AddonCourseCompletion } from '@addons/coursecompletion/services/coursecompletion';
|
||||
|
@ -38,6 +37,12 @@ import { PageLoadsManager } from '@classes/page-loads-manager';
|
|||
import { DownloadStatus } from '@/core/constants';
|
||||
import { CoreSharedModule } from '@/core/shared.module';
|
||||
import { CoreCoursesComponentsModule } from '@features/courses/components/components.module';
|
||||
import {
|
||||
CORE_COURSES_MY_COURSES_UPDATED_EVENT,
|
||||
CoreCoursesMyCoursesUpdatedEventAction,
|
||||
CORE_COURSES_STATE_FAVOURITE,
|
||||
CORE_COURSES_STATE_HIDDEN,
|
||||
} from '@features/courses/constants';
|
||||
|
||||
const FILTER_PRIORITY: AddonBlockMyOverviewTimeFilters[] =
|
||||
['all', 'inprogress', 'future', 'past', 'favourite', 'allincludinghidden', 'hidden'];
|
||||
|
@ -137,7 +142,7 @@ export class AddonBlockMyOverviewComponent extends CoreBlockBaseComponent implem
|
|||
}, CoreSites.getCurrentSiteId());
|
||||
|
||||
this.coursesObserver = CoreEvents.on(
|
||||
CoreCoursesProvider.EVENT_MY_COURSES_UPDATED,
|
||||
CORE_COURSES_MY_COURSES_UPDATED_EVENT,
|
||||
(data) => {
|
||||
this.refreshCourseList(data);
|
||||
},
|
||||
|
@ -238,7 +243,7 @@ export class AddonBlockMyOverviewComponent extends CoreBlockBaseComponent implem
|
|||
|
||||
// Invalidate course completion data.
|
||||
promises.push(this.invalidateCourseList().finally(() =>
|
||||
CoreUtils.allPromises(courseIds.map((courseId) =>
|
||||
CorePromiseUtils.allPromises(courseIds.map((courseId) =>
|
||||
AddonCourseCompletion.invalidateCourseCompletion(courseId)))));
|
||||
|
||||
if (courseIds.length == 1) {
|
||||
|
@ -250,7 +255,7 @@ export class AddonBlockMyOverviewComponent extends CoreBlockBaseComponent implem
|
|||
promises.push(CoreCourses.invalidateCoursesByField('ids', courseIds.join(',')));
|
||||
}
|
||||
|
||||
await CoreUtils.allPromises(promises).finally(() => {
|
||||
await CorePromiseUtils.allPromises(promises).finally(() => {
|
||||
this.prefetchIconsInitialized = false;
|
||||
});
|
||||
}
|
||||
|
@ -428,29 +433,29 @@ export class AddonBlockMyOverviewComponent extends CoreBlockBaseComponent implem
|
|||
}
|
||||
|
||||
/**
|
||||
* Refresh course list based on a EVENT_MY_COURSES_UPDATED event.
|
||||
* Refresh course list based on a CORE_COURSES_MY_COURSES_UPDATED_EVENT event.
|
||||
*
|
||||
* @param data Event data.
|
||||
* @returns Promise resolved when done.
|
||||
*/
|
||||
protected async refreshCourseList(data: CoreCoursesMyCoursesUpdatedEventData): Promise<void> {
|
||||
if (data.action == CoreCoursesProvider.ACTION_ENROL) {
|
||||
if (data.action === CoreCoursesMyCoursesUpdatedEventAction.ENROL) {
|
||||
// Always update if user enrolled in a course.
|
||||
return this.refreshContent(true);
|
||||
}
|
||||
|
||||
const course = this.allCourses.find((course) => course.id == data.courseId);
|
||||
if (data.action == CoreCoursesProvider.ACTION_STATE_CHANGED) {
|
||||
if (data.action === CoreCoursesMyCoursesUpdatedEventAction.STATE_CHANGED) {
|
||||
if (!course) {
|
||||
// Not found, use WS update.
|
||||
return this.refreshContent(true);
|
||||
}
|
||||
|
||||
if (data.state == CoreCoursesProvider.STATE_FAVOURITE) {
|
||||
if (data.state === CORE_COURSES_STATE_FAVOURITE) {
|
||||
course.isfavourite = !!data.value;
|
||||
}
|
||||
|
||||
if (data.state == CoreCoursesProvider.STATE_HIDDEN) {
|
||||
if (data.state === CORE_COURSES_STATE_HIDDEN) {
|
||||
course.hidden = !!data.value;
|
||||
}
|
||||
|
||||
|
@ -458,7 +463,7 @@ export class AddonBlockMyOverviewComponent extends CoreBlockBaseComponent implem
|
|||
await this.filterCourses();
|
||||
}
|
||||
|
||||
if (data.action == CoreCoursesProvider.ACTION_VIEW && data.courseId != CoreSites.getCurrentSiteHomeId()) {
|
||||
if (data.action === CoreCoursesMyCoursesUpdatedEventAction.VIEW && data.courseId != CoreSites.getCurrentSiteHomeId()) {
|
||||
if (!course) {
|
||||
// Not found, use WS update.
|
||||
return this.refreshContent(true);
|
||||
|
|
|
@ -16,7 +16,6 @@ import { Component, OnInit, OnDestroy } from '@angular/core';
|
|||
import { CoreEventObserver, CoreEvents } from '@singletons/events';
|
||||
import { CoreSites } from '@services/sites';
|
||||
import {
|
||||
CoreCoursesProvider,
|
||||
CoreCoursesMyCoursesUpdatedEventData,
|
||||
CoreCourses,
|
||||
CoreCourseSummaryData,
|
||||
|
@ -29,10 +28,16 @@ import {
|
|||
import { CoreCourseOptionsDelegate } from '@features/course/services/course-options-delegate';
|
||||
import { AddonCourseCompletion } from '@addons/coursecompletion/services/coursecompletion';
|
||||
import { CoreBlockBaseComponent } from '@features/block/classes/base-block-component';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreUtils } from '@singletons/utils';
|
||||
import { CoreSite } from '@classes/sites/site';
|
||||
import { CoreSharedModule } from '@/core/shared.module';
|
||||
import { CoreCoursesComponentsModule } from '@features/courses/components/components.module';
|
||||
import {
|
||||
CORE_COURSES_MY_COURSES_UPDATED_EVENT,
|
||||
CoreCoursesMyCoursesUpdatedEventAction,
|
||||
CORE_COURSES_STATE_FAVOURITE,
|
||||
} from '@features/courses/constants';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
|
||||
/**
|
||||
* Component to render a recent courses block.
|
||||
|
@ -73,7 +78,7 @@ export class AddonBlockRecentlyAccessedCoursesComponent extends CoreBlockBaseCom
|
|||
this.scrollElementId = `addon-block-recentlyaccessedcourses-scroll-${scrollId}`;
|
||||
|
||||
this.coursesObserver = CoreEvents.on(
|
||||
CoreCoursesProvider.EVENT_MY_COURSES_UPDATED,
|
||||
CORE_COURSES_MY_COURSES_UPDATED_EVENT,
|
||||
(data) => {
|
||||
this.refreshCourseList(data);
|
||||
},
|
||||
|
@ -114,7 +119,7 @@ export class AddonBlockRecentlyAccessedCoursesComponent extends CoreBlockBaseCom
|
|||
|
||||
// Invalidate course completion data.
|
||||
promises.push(this.invalidateCourseList().finally(() =>
|
||||
CoreUtils.allPromises(courseIds.map((courseId) =>
|
||||
CorePromiseUtils.allPromises(courseIds.map((courseId) =>
|
||||
AddonCourseCompletion.invalidateCourseCompletion(courseId)))));
|
||||
|
||||
if (courseIds.length == 1) {
|
||||
|
@ -126,7 +131,7 @@ export class AddonBlockRecentlyAccessedCoursesComponent extends CoreBlockBaseCom
|
|||
promises.push(CoreCourses.invalidateCoursesByField('ids', courseIds.join(',')));
|
||||
}
|
||||
|
||||
await CoreUtils.allPromises(promises);
|
||||
await CorePromiseUtils.allPromises(promises);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -170,20 +175,20 @@ export class AddonBlockRecentlyAccessedCoursesComponent extends CoreBlockBaseCom
|
|||
}
|
||||
|
||||
/**
|
||||
* Refresh course list based on a EVENT_MY_COURSES_UPDATED event.
|
||||
* Refresh course list based on a CORE_COURSES_MY_COURSES_UPDATED_EVENT event.
|
||||
*
|
||||
* @param data Event data.
|
||||
* @returns Promise resolved when done.
|
||||
*/
|
||||
protected async refreshCourseList(data: CoreCoursesMyCoursesUpdatedEventData): Promise<void> {
|
||||
if (data.action == CoreCoursesProvider.ACTION_ENROL) {
|
||||
if (data.action === CoreCoursesMyCoursesUpdatedEventAction.ENROL) {
|
||||
// Always update if user enrolled in a course.
|
||||
return this.refreshContent();
|
||||
}
|
||||
|
||||
const courseIndex = this.courses.findIndex((course) => course.id == data.courseId);
|
||||
const course = this.courses[courseIndex];
|
||||
if (data.action == CoreCoursesProvider.ACTION_VIEW && data.courseId != CoreSites.getCurrentSiteHomeId()) {
|
||||
if (data.action === CoreCoursesMyCoursesUpdatedEventAction.VIEW && data.courseId != CoreSites.getCurrentSiteHomeId()) {
|
||||
if (!course) {
|
||||
// Not found, use WS update.
|
||||
return this.refreshContent();
|
||||
|
@ -196,8 +201,8 @@ export class AddonBlockRecentlyAccessedCoursesComponent extends CoreBlockBaseCom
|
|||
await this.invalidateCourseList();
|
||||
}
|
||||
|
||||
if (data.action == CoreCoursesProvider.ACTION_STATE_CHANGED &&
|
||||
data.state == CoreCoursesProvider.STATE_FAVOURITE && course) {
|
||||
if (data.action === CoreCoursesMyCoursesUpdatedEventAction.STATE_CHANGED &&
|
||||
data.state === CORE_COURSES_STATE_FAVOURITE && course) {
|
||||
course.isfavourite = !!data.value;
|
||||
await this.invalidateCourseList();
|
||||
}
|
||||
|
|
|
@ -21,7 +21,7 @@ import {
|
|||
} from '../../services/recentlyaccesseditems';
|
||||
import { CoreText } from '@singletons/text';
|
||||
import { CoreLoadings } from '@services/loadings';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreUtils } from '@singletons/utils';
|
||||
import { CoreSharedModule } from '@/core/shared.module';
|
||||
|
||||
/**
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
import { Component, OnInit, OnDestroy } from '@angular/core';
|
||||
import { CoreEventObserver, CoreEvents } from '@singletons/events';
|
||||
import { CoreSites } from '@services/sites';
|
||||
import { CoreCoursesProvider, CoreCoursesMyCoursesUpdatedEventData, CoreCourses } from '@features/courses/services/courses';
|
||||
import { CoreCoursesMyCoursesUpdatedEventData, CoreCourses } from '@features/courses/services/courses';
|
||||
import {
|
||||
CoreCourseSearchedDataWithExtraInfoAndOptions,
|
||||
CoreEnrolledCourseDataWithOptions,
|
||||
|
@ -23,11 +23,17 @@ import {
|
|||
import { CoreCourseOptionsDelegate } from '@features/course/services/course-options-delegate';
|
||||
import { AddonCourseCompletion } from '@addons/coursecompletion/services/coursecompletion';
|
||||
import { CoreBlockBaseComponent } from '@features/block/classes/base-block-component';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreUtils } from '@singletons/utils';
|
||||
import { CoreSite } from '@classes/sites/site';
|
||||
import { AddonBlockStarredCourse, AddonBlockStarredCourses } from '../../services/starredcourses';
|
||||
import { CoreSharedModule } from '@/core/shared.module';
|
||||
import { CoreCoursesComponentsModule } from '@features/courses/components/components.module';
|
||||
import {
|
||||
CORE_COURSES_MY_COURSES_UPDATED_EVENT,
|
||||
CoreCoursesMyCoursesUpdatedEventAction,
|
||||
CORE_COURSES_STATE_FAVOURITE,
|
||||
} from '@features/courses/constants';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
|
||||
/**
|
||||
* Component to render a starred courses block.
|
||||
|
@ -68,7 +74,7 @@ export class AddonBlockStarredCoursesComponent extends CoreBlockBaseComponent im
|
|||
this.scrollElementId = `addon-block-starredcourses-scroll-${scrollId}`;
|
||||
|
||||
this.coursesObserver = CoreEvents.on(
|
||||
CoreCoursesProvider.EVENT_MY_COURSES_UPDATED,
|
||||
CORE_COURSES_MY_COURSES_UPDATED_EVENT,
|
||||
(data) => {
|
||||
this.refreshCourseList(data);
|
||||
},
|
||||
|
@ -108,7 +114,7 @@ export class AddonBlockStarredCoursesComponent extends CoreBlockBaseComponent im
|
|||
|
||||
// Invalidate course completion data.
|
||||
promises.push(this.invalidateCourseList().finally(() =>
|
||||
CoreUtils.allPromises(courseIds.map((courseId) =>
|
||||
CorePromiseUtils.allPromises(courseIds.map((courseId) =>
|
||||
AddonCourseCompletion.invalidateCourseCompletion(courseId)))));
|
||||
|
||||
if (courseIds.length == 1) {
|
||||
|
@ -120,7 +126,7 @@ export class AddonBlockStarredCoursesComponent extends CoreBlockBaseComponent im
|
|||
promises.push(CoreCourses.invalidateCoursesByField('ids', courseIds.join(',')));
|
||||
}
|
||||
|
||||
await CoreUtils.allPromises(promises);
|
||||
await CorePromiseUtils.allPromises(promises);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -157,19 +163,19 @@ export class AddonBlockStarredCoursesComponent extends CoreBlockBaseComponent im
|
|||
}
|
||||
|
||||
/**
|
||||
* Refresh course list based on a EVENT_MY_COURSES_UPDATED event.
|
||||
* Refresh course list based on a CORE_COURSES_MY_COURSES_UPDATED_EVENT event.
|
||||
*
|
||||
* @param data Event data.
|
||||
* @returns Promise resolved when done.
|
||||
*/
|
||||
protected async refreshCourseList(data: CoreCoursesMyCoursesUpdatedEventData): Promise<void> {
|
||||
if (data.action == CoreCoursesProvider.ACTION_ENROL) {
|
||||
if (data.action === CoreCoursesMyCoursesUpdatedEventAction.ENROL) {
|
||||
// Always update if user enrolled in a course.
|
||||
// New courses shouldn't be favourite by default, but just in case.
|
||||
return this.refreshContent();
|
||||
}
|
||||
|
||||
if (data.action == CoreCoursesProvider.ACTION_STATE_CHANGED && data.state == CoreCoursesProvider.STATE_FAVOURITE) {
|
||||
if (data.action === CoreCoursesMyCoursesUpdatedEventAction.STATE_CHANGED && data.state == CORE_COURSES_STATE_FAVOURITE) {
|
||||
const courseIndex = this.courses.findIndex((course) => course.id == data.courseId);
|
||||
if (courseIndex < 0) {
|
||||
// Not found, use WS update. Usually new favourite.
|
||||
|
|
|
@ -16,7 +16,7 @@ import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
|
|||
import { CoreSites } from '@services/sites';
|
||||
import { ICoreBlockComponent } from '@features/block/classes/base-block-component';
|
||||
import { AddonBlockTimeline } from '../../services/timeline';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
import { CoreDomUtils } from '@services/utils/dom';
|
||||
import { CoreCoursesHelper, CoreEnrolledCourseDataWithOptions } from '@features/courses/services/courses-helper';
|
||||
import { CoreCourses } from '@features/courses/services/courses';
|
||||
|
@ -122,7 +122,7 @@ export class AddonBlockTimelineComponent implements OnInit, ICoreBlockComponent
|
|||
* @inheritdoc
|
||||
*/
|
||||
async invalidateContent(): Promise<void> {
|
||||
await CoreUtils.allPromises([
|
||||
await CorePromiseUtils.allPromises([
|
||||
AddonBlockTimeline.invalidateActionEventsByTimesort(),
|
||||
AddonBlockTimeline.invalidateActionEventsByCourses(),
|
||||
CoreCourses.invalidateUserCourses(),
|
||||
|
|
|
@ -42,7 +42,7 @@ import { canLeaveGuard } from '@guards/can-leave';
|
|||
},
|
||||
{
|
||||
path: 'edit/:id',
|
||||
loadComponent: () => import('./pages/edit-entry/edit-entry').then(c => c.AddonBlogEditEntryPage),
|
||||
loadComponent: () => import('./pages/edit-entry/edit-entry'),
|
||||
canDeactivate: [canLeaveGuard],
|
||||
},
|
||||
...buildTabMainRoutes(injector, {
|
||||
|
@ -71,4 +71,4 @@ import { canLeaveGuard } from '@guards/can-leave';
|
|||
},
|
||||
],
|
||||
})
|
||||
export class AddonBlogLazyModule {}
|
||||
export default class AddonBlogLazyModule {}
|
||||
|
|
|
@ -37,7 +37,7 @@ import { AddonBlogSyncCronHandler } from './services/handlers/sync-cron';
|
|||
const routes: Routes = [
|
||||
{
|
||||
path: ADDON_BLOG_MAINMENU_PAGE_NAME,
|
||||
loadChildren: () => import('@addons/blog/blog-lazy.module').then(m => m.AddonBlogLazyModule),
|
||||
loadChildren: () => import('@addons/blog/blog-lazy.module'),
|
||||
},
|
||||
];
|
||||
|
||||
|
|
|
@ -41,12 +41,13 @@ import { CoreNetwork } from '@services/network';
|
|||
import { CoreSites, CoreSitesReadingStrategy } from '@services/sites';
|
||||
import { CoreSync } from '@services/sync';
|
||||
import { CoreDomUtils } from '@services/utils/dom';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreWSError } from '@classes/errors/wserror';
|
||||
import { Translate } from '@singletons';
|
||||
import { CoreEvents } from '@singletons/events';
|
||||
import { CoreForms } from '@singletons/form';
|
||||
import { CoreFileEntry } from '@services/file-helper';
|
||||
import { CoreTimeUtils } from '@services/utils/time';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
|
||||
@Component({
|
||||
selector: 'addon-blog-edit-entry',
|
||||
|
@ -59,7 +60,7 @@ import { CoreTimeUtils } from '@services/utils/time';
|
|||
CoreTagComponentsModule,
|
||||
],
|
||||
})
|
||||
export class AddonBlogEditEntryPage implements CanLeave, OnInit, OnDestroy {
|
||||
export default class AddonBlogEditEntryPage implements CanLeave, OnInit, OnDestroy {
|
||||
|
||||
@ViewChild('editEntryForm') formElement!: ElementRef;
|
||||
|
||||
|
@ -257,7 +258,7 @@ export class AddonBlogEditEntryPage implements CanLeave, OnInit, OnDestroy {
|
|||
|
||||
return selectedEntry;
|
||||
} catch (error) {
|
||||
if (!params.filters || CoreUtils.isWebServiceError(error)) {
|
||||
if (!params.filters || CoreWSError.isWebServiceError(error)) {
|
||||
// Cannot get the entry, reject.
|
||||
throw error;
|
||||
}
|
||||
|
@ -323,7 +324,7 @@ export class AddonBlogEditEntryPage implements CanLeave, OnInit, OnDestroy {
|
|||
const filters: AddonBlogFilter | undefined = CoreNavigator.getRouteParam('filters');
|
||||
const entry = this.entry && 'attachment' in this.entry
|
||||
? this.entry
|
||||
: await CoreUtils.ignoreErrors(this.getEntry({ filters, lastModified, entryId: this.entry.id }));
|
||||
: await CorePromiseUtils.ignoreErrors(this.getEntry({ filters, lastModified, entryId: this.entry.id }));
|
||||
|
||||
const removedFiles = CoreFileUploader.getFilesToDelete(entry?.attachmentfiles ?? [], this.files);
|
||||
|
||||
|
@ -335,7 +336,7 @@ export class AddonBlogEditEntryPage implements CanLeave, OnInit, OnDestroy {
|
|||
|
||||
return await this.saveEntry({ attachmentsId: attachmentsid });
|
||||
} catch (error) {
|
||||
if (CoreUtils.isWebServiceError(error)) {
|
||||
if (CoreWSError.isWebServiceError(error)) {
|
||||
// It's a WebService error, the user cannot send the message so don't store it.
|
||||
CoreDomUtils.showErrorModalDefault(error, 'Error updating entry.');
|
||||
|
||||
|
@ -360,7 +361,7 @@ export class AddonBlogEditEntryPage implements CanLeave, OnInit, OnDestroy {
|
|||
const attachmentsId = await this.uploadOrStoreFiles({ created });
|
||||
await this.saveEntry({ created, attachmentsId });
|
||||
} catch (error) {
|
||||
if (CoreUtils.isWebServiceError(error)) {
|
||||
if (CoreWSError.isWebServiceError(error)) {
|
||||
// It's a WebService error, the user cannot send the message so don't store it.
|
||||
CoreDomUtils.showErrorModalDefault(error, 'Error creating entry.');
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ import { CoreNetwork } from '@services/network';
|
|||
import { CoreSites, CoreSitesReadingStrategy } from '@services/sites';
|
||||
import { CoreDomUtils } from '@services/utils/dom';
|
||||
import { CoreUrl } from '@singletons/url';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
import { CoreArray } from '@singletons/array';
|
||||
import { CoreEventObserver, CoreEvents } from '@singletons/events';
|
||||
import { CoreTime } from '@singletons/time';
|
||||
|
@ -93,7 +93,7 @@ export class AddonBlogIndexPage implements OnInit, OnDestroy {
|
|||
this.isOnline.set(CoreNetwork.isOnline());
|
||||
|
||||
this.logView = CoreTime.once(async () => {
|
||||
await CoreUtils.ignoreErrors(AddonBlog.logView(this.filter));
|
||||
await CorePromiseUtils.ignoreErrors(AddonBlog.logView(this.filter));
|
||||
|
||||
CoreAnalytics.logEvent({
|
||||
type: CoreAnalyticsEventType.VIEW_ITEM_LIST,
|
||||
|
@ -113,7 +113,7 @@ export class AddonBlogIndexPage implements OnInit, OnDestroy {
|
|||
|
||||
this.entryUpdateObserver = CoreEvents.on(ADDON_BLOG_ENTRY_UPDATED, async () => {
|
||||
this.loaded.set(false);
|
||||
await CoreUtils.ignoreErrors(this.refresh());
|
||||
await CorePromiseUtils.ignoreErrors(this.refresh());
|
||||
this.loaded.set(true);
|
||||
});
|
||||
|
||||
|
@ -123,7 +123,7 @@ export class AddonBlogIndexPage implements OnInit, OnDestroy {
|
|||
}
|
||||
|
||||
this.loaded.set(false);
|
||||
await CoreUtils.ignoreErrors(this.refresh(false));
|
||||
await CorePromiseUtils.ignoreErrors(this.refresh(false));
|
||||
this.loaded.set(true);
|
||||
});
|
||||
|
||||
|
@ -375,7 +375,7 @@ export class AddonBlogIndexPage implements OnInit, OnDestroy {
|
|||
* @param refresher Refresher instance.
|
||||
*/
|
||||
async refresh(sync = true, refresher?: HTMLIonRefresherElement): Promise<void> {
|
||||
const promises = this.entries.map((entry) => {
|
||||
const promises = this.entries.map(async (entry) => {
|
||||
if (this.isOnlineEntry(entry)) {
|
||||
return CoreComments.invalidateCommentsData(
|
||||
ContextLevel.USER,
|
||||
|
@ -399,7 +399,7 @@ export class AddonBlogIndexPage implements OnInit, OnDestroy {
|
|||
|
||||
}
|
||||
|
||||
await CoreUtils.allPromises(promises);
|
||||
await CorePromiseUtils.allPromises(promises);
|
||||
await this.fetchEntries(true, false, sync);
|
||||
refresher?.complete();
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@ import { CoreFileUploader } from '@features/fileuploader/services/fileuploader';
|
|||
import { CoreFile } from '@services/file';
|
||||
import { CoreFileEntry } from '@services/file-helper';
|
||||
import { CoreSites } from '@services/sites';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
import { makeSingleton } from '@singletons';
|
||||
import { CoreObject } from '@singletons/object';
|
||||
import { CorePath } from '@singletons/path';
|
||||
|
@ -108,7 +108,7 @@ export class AddonBlogOfflineService {
|
|||
*/
|
||||
async getOfflineEntry(filter: { id?: number; created?: number }, siteId?: string): Promise<AddonBlogOfflineEntry | undefined> {
|
||||
const site = await CoreSites.getSite(siteId);
|
||||
const record = await CoreUtils.ignoreErrors(
|
||||
const record = await CorePromiseUtils.ignoreErrors(
|
||||
site.getDb().getRecord<AddonBlogOfflineEntry>(OFFLINE_BLOG_ENTRIES_TABLE_NAME, filter),
|
||||
);
|
||||
|
||||
|
|
|
@ -17,7 +17,7 @@ import { CoreSyncBaseProvider, CoreSyncBlockedError } from '@classes/base-sync';
|
|||
import { CoreFileUploader } from '@features/fileuploader/services/fileuploader';
|
||||
import { CoreSites, CoreSitesReadingStrategy } from '@services/sites';
|
||||
import { CoreSync, CoreSyncResult } from '@services/sync';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreWSError } from '@classes/errors/wserror';
|
||||
import { makeSingleton, Translate } from '@singletons';
|
||||
import { CoreEvents } from '@singletons/events';
|
||||
import { ADDON_BLOG_AUTO_SYNCED, ADDON_BLOG_SYNC_ID } from '../constants';
|
||||
|
@ -129,7 +129,7 @@ import { AddonBlogOfflineEntryDBRecord } from './database/blog';
|
|||
await AddonBlogOffline.deleteOfflineEntryRecord({ created: entry.created }, siteId);
|
||||
result.updated = true;
|
||||
} catch (error) {
|
||||
if (!error || !CoreUtils.isWebServiceError(error)) {
|
||||
if (!CoreWSError.isWebServiceError(error)) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
|
@ -223,7 +223,7 @@ import { AddonBlogOfflineEntryDBRecord } from './database/blog';
|
|||
entriesToSync = entriesPendingToSync;
|
||||
}
|
||||
} catch (error) {
|
||||
if (!CoreUtils.isWebServiceError(error)) {
|
||||
if (!CoreWSError.isWebServiceError(error)) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
|
|
|
@ -12,10 +12,9 @@
|
|||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
import { ContextLevel } from '@/core/constants';
|
||||
import { ContextLevel, CoreCacheUpdateFrequency } from '@/core/constants';
|
||||
import { Injectable } from '@angular/core';
|
||||
import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site';
|
||||
import { CoreSite } from '@classes/sites/site';
|
||||
import { CoreFileUploaderStoreFilesResult } from '@features/fileuploader/services/fileuploader';
|
||||
import { CoreTagItem } from '@features/tag/services/tag';
|
||||
import { CoreUser, CoreUserProfile } from '@features/user/services/user';
|
||||
|
@ -23,10 +22,12 @@ import { CoreFileEntry, CoreFileHelper } from '@services/file-helper';
|
|||
import { CoreNetwork } from '@services/network';
|
||||
import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites';
|
||||
import { CoreTimeUtils } from '@services/utils/time';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreObject } from '@singletons/object';
|
||||
import { CoreStatusWithWarningsWSResponse, CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws';
|
||||
import { makeSingleton } from '@singletons';
|
||||
import { AddonBlogOffline, AddonBlogOfflineEntry } from './blog-offline';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
import { CoreWSError } from '@classes/errors/wserror';
|
||||
|
||||
const ROOT_CACHE_KEY = 'addonBlog:';
|
||||
|
||||
|
@ -62,7 +63,7 @@ export class AddonBlogProvider {
|
|||
* @returns Cache key.
|
||||
*/
|
||||
getEntriesCacheKey(filter: AddonBlogFilter = {}): string {
|
||||
return ROOT_CACHE_KEY + CoreUtils.sortAndStringify(filter);
|
||||
return ROOT_CACHE_KEY + CoreObject.sortAndStringify(filter);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -76,14 +77,14 @@ export class AddonBlogProvider {
|
|||
const site = await CoreSites.getSite(options?.siteId);
|
||||
|
||||
const data: CoreBlogGetEntriesWSParams = {
|
||||
filters: CoreUtils.objectToArrayOfObjects(filter, 'name', 'value'),
|
||||
filters: CoreObject.toArrayOfObjects(filter, 'name', 'value'),
|
||||
page: options?.page ?? 0,
|
||||
perpage: AddonBlogProvider.ENTRIES_PER_PAGE,
|
||||
};
|
||||
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.getEntriesCacheKey(filter),
|
||||
updateFrequency: CoreSite.FREQUENCY_SOMETIMES,
|
||||
updateFrequency: CoreCacheUpdateFrequency.SOMETIMES,
|
||||
...CoreSites.getReadingStrategyPreSets(options?.readingStrategy),
|
||||
};
|
||||
|
||||
|
@ -121,7 +122,7 @@ export class AddonBlogProvider {
|
|||
try {
|
||||
await this.addEntryOnline(params, siteId);
|
||||
} catch (error) {
|
||||
if (!CoreUtils.isWebServiceError(error)) {
|
||||
if (!CoreWSError.isWebServiceError(error)) {
|
||||
// Couldn't connect to server, store in offline.
|
||||
return await storeOffline();
|
||||
}
|
||||
|
@ -177,7 +178,7 @@ export class AddonBlogProvider {
|
|||
try {
|
||||
await this.updateEntryOnline(params, siteId);
|
||||
} catch (error) {
|
||||
if (!CoreUtils.isWebServiceError(error)) {
|
||||
if (!CoreWSError.isWebServiceError(error)) {
|
||||
// Couldn't connect to server, store in offline.
|
||||
return await storeOffline();
|
||||
}
|
||||
|
@ -230,9 +231,9 @@ export class AddonBlogProvider {
|
|||
}
|
||||
|
||||
await this.deleteEntryOnline(params, siteId);
|
||||
await CoreUtils.ignoreErrors(AddonBlogOffline.unmarkEntryAsRemoved(params.entryid));
|
||||
await CorePromiseUtils.ignoreErrors(AddonBlogOffline.unmarkEntryAsRemoved(params.entryid));
|
||||
} catch (error) {
|
||||
if (!CoreUtils.isWebServiceError(error)) {
|
||||
if (!CoreWSError.isWebServiceError(error)) {
|
||||
// Couldn't connect to server, store in offline.
|
||||
return await AddonBlogOffline.markEntryAsRemoved({ id: params.entryid, subject }, siteId);
|
||||
}
|
||||
|
@ -289,7 +290,7 @@ export class AddonBlogProvider {
|
|||
const site = await CoreSites.getSite(siteId);
|
||||
|
||||
const data: AddonBlogViewEntriesWSParams = {
|
||||
filters: CoreUtils.objectToArrayOfObjects(filter, 'name', 'value'),
|
||||
filters: CoreObject.toArrayOfObjects(filter, 'name', 'value'),
|
||||
};
|
||||
|
||||
return site.write('core_blog_view_entries', data);
|
||||
|
@ -312,7 +313,7 @@ export class AddonBlogProvider {
|
|||
const tags = options?.find(option => option.name === 'tags')?.value as string | undefined;
|
||||
const publishState = options?.find(option => option.name === 'publishstate')?.value as AddonBlogPublishState
|
||||
?? AddonBlogPublishState.draft;
|
||||
const user = await CoreUtils.ignoreErrors(CoreUser.getProfile(offlineEntry.userid, courseId, true));
|
||||
const user = await CorePromiseUtils.ignoreErrors(CoreUser.getProfile(offlineEntry.userid, courseId, true));
|
||||
const folder = 'id' in offlineEntry && offlineEntry.id ? { id: offlineEntry.id } : { created: offlineEntry.created };
|
||||
const offlineFiles = await AddonBlogOffline.getOfflineFiles(folder);
|
||||
const optionsFiles = this.getAttachmentFilesFromOptions(options);
|
||||
|
@ -376,7 +377,7 @@ export class AddonBlogProvider {
|
|||
}
|
||||
|
||||
entry.summary = CoreFileHelper.replacePluginfileUrls(entry.summary, entry.summaryfiles || []);
|
||||
entry.user = await CoreUtils.ignoreErrors(CoreUser.getProfile(entry.userid, entry.courseid, true));
|
||||
entry.user = await CorePromiseUtils.ignoreErrors(CoreUser.getProfile(entry.userid, entry.courseid, true));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -13,7 +13,6 @@
|
|||
// limitations under the License.
|
||||
|
||||
import { Injectable, Type } from '@angular/core';
|
||||
import { CoreTagFeedComponent } from '@features/tag/components/feed/feed';
|
||||
import { CoreTagAreaHandler } from '@features/tag/services/tag-area-delegate';
|
||||
import { CoreTagFeedElement, CoreTagHelper } from '@features/tag/services/tag-helper';
|
||||
import { makeSingleton } from '@singletons';
|
||||
|
@ -45,9 +44,11 @@ export class AddonBlogTagAreaHandlerService implements CoreTagAreaHandler {
|
|||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
getComponent(): Type<unknown> | Promise<Type<unknown>> {
|
||||
return CoreTagFeedComponent;
|
||||
}
|
||||
async getComponent(): Promise<Type<unknown>> {
|
||||
const { CoreTagFeedComponent } = await import('@features/tag/components/feed/feed');
|
||||
|
||||
return CoreTagFeedComponent;
|
||||
}
|
||||
|
||||
}
|
||||
export const AddonBlogTagAreaHandler = makeSingleton(AddonBlogTagAreaHandlerService);
|
||||
|
|
|
@ -25,7 +25,7 @@ import { CoreEditorComponentsModule } from '@features/editor/components/componen
|
|||
import { CoreMainMenuComponentsModule } from '@features/mainmenu/components/components.module';
|
||||
|
||||
import { buildTabMainRoutes } from '@features/mainmenu/mainmenu-tab-routing.module';
|
||||
import { AddonCalendarMainMenuHandlerService } from './services/handlers/mainmenu';
|
||||
import { ADDON_CALENDAR_PAGE_NAME } from './constants';
|
||||
|
||||
/**
|
||||
* Build module routes.
|
||||
|
@ -37,7 +37,7 @@ function buildRoutes(injector: Injector): Routes {
|
|||
return [
|
||||
{
|
||||
path: 'index',
|
||||
data: { mainMenuTabRoot: AddonCalendarMainMenuHandlerService.PAGE_NAME },
|
||||
data: { mainMenuTabRoot: ADDON_CALENDAR_PAGE_NAME },
|
||||
component: AddonCalendarIndexPage,
|
||||
},
|
||||
{
|
||||
|
@ -86,4 +86,4 @@ function buildRoutes(injector: Injector): Routes {
|
|||
},
|
||||
],
|
||||
})
|
||||
export class AddonCalendarLazyModule {}
|
||||
export default class AddonCalendarLazyModule {}
|
||||
|
|
|
@ -20,7 +20,7 @@ import { CoreMainMenuDelegate } from '@features/mainmenu/services/mainmenu-deleg
|
|||
import { CoreCronDelegate } from '@services/cron';
|
||||
import { CoreContentLinksDelegate } from '@features/contentlinks/services/contentlinks-delegate';
|
||||
import { AddonCalendarViewLinkHandler } from './services/handlers/view-link';
|
||||
import { AddonCalendarMainMenuHandler, AddonCalendarMainMenuHandlerService } from './services/handlers/mainmenu';
|
||||
import { AddonCalendarMainMenuHandler } from './services/handlers/mainmenu';
|
||||
import { AddonCalendarSyncCronHandler } from './services/handlers/sync-cron';
|
||||
|
||||
import { CORE_SITE_SCHEMAS } from '@services/sites';
|
||||
|
@ -29,6 +29,7 @@ import { CALENDAR_OFFLINE_SITE_SCHEMA } from './services/database/calendar-offli
|
|||
import { AddonCalendarComponentsModule } from './components/components.module';
|
||||
import { AddonCalendar } from './services/calendar';
|
||||
import { CoreMainMenuTabRoutingModule } from '@features/mainmenu/mainmenu-tab-routing.module';
|
||||
import { ADDON_CALENDAR_PAGE_NAME } from './constants';
|
||||
|
||||
/**
|
||||
* Get calendar services.
|
||||
|
@ -51,8 +52,8 @@ export async function getCalendarServices(): Promise<Type<unknown>[]> {
|
|||
|
||||
const mainMenuChildrenRoutes: Routes = [
|
||||
{
|
||||
path: AddonCalendarMainMenuHandlerService.PAGE_NAME,
|
||||
loadChildren: () => import('./calendar-lazy.module').then(m => m.AddonCalendarLazyModule),
|
||||
path: ADDON_CALENDAR_PAGE_NAME,
|
||||
loadChildren: () => import('./calendar-lazy.module'),
|
||||
},
|
||||
];
|
||||
|
||||
|
|
|
@ -29,10 +29,9 @@ import { CoreEventObserver, CoreEvents } from '@singletons/events';
|
|||
import { CoreSites } from '@services/sites';
|
||||
import { CoreDomUtils } from '@services/utils/dom';
|
||||
import { CoreTimeUtils } from '@services/utils/time';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreArray } from '@singletons/array';
|
||||
import {
|
||||
AddonCalendar,
|
||||
AddonCalendarProvider,
|
||||
AddonCalendarWeek,
|
||||
AddonCalendarWeekDaysTranslationKeys,
|
||||
AddonCalendarEventToDisplay,
|
||||
|
@ -54,6 +53,7 @@ import { CoreUrl } from '@singletons/url';
|
|||
import { CoreTime } from '@singletons/time';
|
||||
import { Translate } from '@singletons';
|
||||
import { toBoolean } from '@/core/transforms/boolean';
|
||||
import { ADDON_CALENDAR_UNDELETED_EVENT_EVENT } from '@addons/calendar/constants';
|
||||
|
||||
/**
|
||||
* Component that displays a calendar.
|
||||
|
@ -61,7 +61,7 @@ import { toBoolean } from '@/core/transforms/boolean';
|
|||
@Component({
|
||||
selector: 'addon-calendar-calendar',
|
||||
templateUrl: 'addon-calendar-calendar.html',
|
||||
styleUrls: ['calendar.scss'],
|
||||
styleUrl: 'calendar.scss',
|
||||
})
|
||||
export class AddonCalendarCalendarComponent implements OnInit, DoCheck, OnDestroy {
|
||||
|
||||
|
@ -93,7 +93,7 @@ export class AddonCalendarCalendarComponent implements OnInit, DoCheck, OnDestro
|
|||
|
||||
// Listen for events "undeleted" (offline).
|
||||
this.undeleteEventObserver = CoreEvents.on(
|
||||
AddonCalendarProvider.UNDELETED_EVENT_EVENT,
|
||||
ADDON_CALENDAR_UNDELETED_EVENT_EVENT,
|
||||
(data) => {
|
||||
if (!data || !data.eventId) {
|
||||
return;
|
||||
|
@ -464,7 +464,7 @@ class AddonCalendarMonthSlidesItemsManagerSource extends CoreSwipeSlidesDynamicI
|
|||
const categories = await CoreCourses.getCategories(0, true);
|
||||
|
||||
// Index categories by ID.
|
||||
this.categories = CoreUtils.arrayToObject(categories, 'id');
|
||||
this.categories = CoreArray.toObject(categories, 'id');
|
||||
} catch {
|
||||
// Ignore errors.
|
||||
}
|
||||
|
|
|
@ -14,13 +14,13 @@
|
|||
|
||||
import { Component, Input, OnInit } from '@angular/core';
|
||||
import { CoreEnrolledCourseData } from '@features/courses/services/courses';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreObject } from '@singletons/object';
|
||||
import { ModalController } from '@singletons';
|
||||
import { CoreEvents } from '@singletons/events';
|
||||
import { AddonCalendarEventType, AddonCalendarProvider } from '../../services/calendar';
|
||||
import { AddonCalendarFilter, AddonCalendarEventIcons } from '../../services/calendar-helper';
|
||||
import { AddonCalendarFilter } from '@addons/calendar/services/calendar-helper';
|
||||
import { ALL_COURSES_ID } from '@features/courses/services/courses-helper';
|
||||
import { CoreSharedModule } from '@/core/shared.module';
|
||||
import { ADDON_CALENDAR_FILTER_CHANGED_EVENT, AddonCalendarEventIcons, AddonCalendarEventType } from '@addons/calendar/constants';
|
||||
|
||||
/**
|
||||
* Component to display the events filter that includes events types and a list of courses.
|
||||
|
@ -54,7 +54,7 @@ export class AddonCalendarFilterComponent implements OnInit {
|
|||
sortedCourses: CoreEnrolledCourseData[] = [];
|
||||
|
||||
constructor() {
|
||||
CoreUtils.enumKeys(AddonCalendarEventType).forEach((name) => {
|
||||
CoreObject.enumKeys(AddonCalendarEventType).forEach((name) => {
|
||||
const value = AddonCalendarEventType[name];
|
||||
this.typeIcons[value] = AddonCalendarEventIcons[name];
|
||||
this.types.push(value);
|
||||
|
@ -95,7 +95,7 @@ export class AddonCalendarFilterComponent implements OnInit {
|
|||
|
||||
this.filter.filtered = !!this.filter.courseId || this.types.some((name) => !this.filter[name]);
|
||||
|
||||
CoreEvents.trigger(AddonCalendarProvider.FILTER_CHANGED_EVENT, this.filter);
|
||||
CoreEvents.trigger(ADDON_CALENDAR_FILTER_CHANGED_EVENT, this.filter);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -17,7 +17,6 @@ import { CoreEventObserver, CoreEvents } from '@singletons/events';
|
|||
import { CoreSites } from '@services/sites';
|
||||
import { CoreDomUtils } from '@services/utils/dom';
|
||||
import {
|
||||
AddonCalendarProvider,
|
||||
AddonCalendarEventToDisplay,
|
||||
AddonCalendar,
|
||||
} from '../../services/calendar';
|
||||
|
@ -29,6 +28,7 @@ import { CoreAnalytics, CoreAnalyticsEventType } from '@services/analytics';
|
|||
import { CoreUrl } from '@singletons/url';
|
||||
import { CoreTime } from '@singletons/time';
|
||||
import { Translate } from '@singletons';
|
||||
import { ADDON_CALENDAR_UNDELETED_EVENT_EVENT } from '@addons/calendar/constants';
|
||||
|
||||
/**
|
||||
* Component that displays upcoming events.
|
||||
|
@ -36,7 +36,7 @@ import { Translate } from '@singletons';
|
|||
@Component({
|
||||
selector: 'addon-calendar-upcoming-events',
|
||||
templateUrl: 'addon-calendar-upcoming-events.html',
|
||||
styleUrls: ['../../calendar-common.scss'],
|
||||
styleUrl: '../../calendar-common.scss',
|
||||
})
|
||||
export class AddonCalendarUpcomingEventsComponent implements OnInit, DoCheck, OnDestroy {
|
||||
|
||||
|
@ -70,7 +70,7 @@ export class AddonCalendarUpcomingEventsComponent implements OnInit, DoCheck, On
|
|||
|
||||
// Listen for events "undeleted" (offline).
|
||||
this.undeleteEventObserver = CoreEvents.on(
|
||||
AddonCalendarProvider.UNDELETED_EVENT_EVENT,
|
||||
ADDON_CALENDAR_UNDELETED_EVENT_EVENT,
|
||||
(data) => {
|
||||
if (!data || !data.eventId) {
|
||||
return;
|
||||
|
|
|
@ -13,3 +13,46 @@
|
|||
// limitations under the License.
|
||||
|
||||
export const ADDON_CALENDAR_COMPONENT = 'AddonCalendarEvents';
|
||||
|
||||
export const ADDON_CALENDAR_PAGE_NAME = 'calendar';
|
||||
|
||||
export const ADDON_CALENDAR_EVENTS_TABLE = 'addon_calendar_events_3';
|
||||
|
||||
export const ADDON_CALENDAR_AUTO_SYNCED = 'addon_calendar_autom_synced';
|
||||
export const ADDON_CALENDAR_MANUAL_SYNCED = 'addon_calendar_manual_synced';
|
||||
export const ADDON_CALENDAR_SYNC_ID = 'calendar';
|
||||
|
||||
export const ADDON_CALENDAR_DAYS_INTERVAL = 30;
|
||||
|
||||
export const ADDON_CALENDAR_STARTING_WEEK_DAY = 'addon_calendar_starting_week_day';
|
||||
export const ADDON_CALENDAR_TF_24 = '%H:%M'; // Calendar time in 24 hours format.
|
||||
export const ADDON_CALENDAR_TF_12 = '%I:%M %p'; // Calendar time in 12 hours format.
|
||||
|
||||
export const ADDON_CALENDAR_NEW_EVENT_EVENT = 'addon_calendar_new_event';
|
||||
export const ADDON_CALENDAR_NEW_EVENT_DISCARDED_EVENT = 'addon_calendar_new_event_discarded';
|
||||
export const ADDON_CALENDAR_EDIT_EVENT_EVENT = 'addon_calendar_edit_event';
|
||||
export const ADDON_CALENDAR_DELETED_EVENT_EVENT = 'addon_calendar_deleted_event';
|
||||
export const ADDON_CALENDAR_UNDELETED_EVENT_EVENT = 'addon_calendar_undeleted_event';
|
||||
export const ADDON_CALENDAR_FILTER_CHANGED_EVENT = 'addon_calendar_filter_changed_event';
|
||||
|
||||
/**
|
||||
* Context levels enumeration.
|
||||
*/
|
||||
export enum AddonCalendarEventIcons {
|
||||
SITE = 'fas-globe',
|
||||
CATEGORY = 'fas-cubes',
|
||||
COURSE = 'fas-graduation-cap',
|
||||
GROUP = 'fas-users',
|
||||
USER = 'fas-user',
|
||||
}
|
||||
|
||||
/**
|
||||
* Main calendar Event types enumeration.
|
||||
*/
|
||||
export enum AddonCalendarEventType {
|
||||
SITE = 'site',
|
||||
CATEGORY = 'category',
|
||||
COURSE = 'course',
|
||||
GROUP = 'group',
|
||||
USER = 'user',
|
||||
}
|
||||
|
|
|
@ -19,15 +19,13 @@ import { CoreSites } from '@services/sites';
|
|||
import { CoreDomUtils } from '@services/utils/dom';
|
||||
import { CoreTimeUtils } from '@services/utils/time';
|
||||
import {
|
||||
AddonCalendarProvider,
|
||||
AddonCalendar,
|
||||
AddonCalendarEventToDisplay,
|
||||
AddonCalendarCalendarDay,
|
||||
AddonCalendarEventType,
|
||||
} from '../../services/calendar';
|
||||
import { AddonCalendarOffline } from '../../services/calendar-offline';
|
||||
import { AddonCalendarFilter, AddonCalendarHelper } from '../../services/calendar-helper';
|
||||
import { AddonCalendarSync, AddonCalendarSyncProvider } from '../../services/calendar-sync';
|
||||
import { AddonCalendarSync } from '../../services/calendar-sync';
|
||||
import { CoreCategoryData, CoreCourses, CoreEnrolledCourseData } from '@features/courses/services/courses';
|
||||
import { CoreCoursesHelper } from '@features/courses/services/courses-helper';
|
||||
import moment from 'moment-timezone';
|
||||
|
@ -35,7 +33,7 @@ import { NgZone, Translate } from '@singletons';
|
|||
import { CoreNavigator } from '@services/navigator';
|
||||
import { Params } from '@angular/router';
|
||||
import { Subscription } from 'rxjs';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreArray } from '@singletons/array';
|
||||
import { CoreConstants } from '@/core/constants';
|
||||
import { CoreSwipeSlidesDynamicItemsManager } from '@classes/items-management/swipe-slides-dynamic-items-manager';
|
||||
import { CoreSwipeSlidesComponent } from '@components/swipe-slides/swipe-slides';
|
||||
|
@ -49,6 +47,18 @@ import { CoreAnalytics, CoreAnalyticsEventType } from '@services/analytics';
|
|||
import { CoreUrl } from '@singletons/url';
|
||||
import { CoreTime } from '@singletons/time';
|
||||
import { CoreModals } from '@services/modals';
|
||||
import {
|
||||
ADDON_CALENDAR_AUTO_SYNCED,
|
||||
ADDON_CALENDAR_DELETED_EVENT_EVENT,
|
||||
ADDON_CALENDAR_EDIT_EVENT_EVENT,
|
||||
ADDON_CALENDAR_FILTER_CHANGED_EVENT,
|
||||
ADDON_CALENDAR_MANUAL_SYNCED,
|
||||
ADDON_CALENDAR_NEW_EVENT_DISCARDED_EVENT,
|
||||
ADDON_CALENDAR_NEW_EVENT_EVENT,
|
||||
ADDON_CALENDAR_UNDELETED_EVENT_EVENT,
|
||||
AddonCalendarEventType,
|
||||
} from '@addons/calendar/constants';
|
||||
import { CoreObject } from '@singletons/object';
|
||||
|
||||
/**
|
||||
* Page that displays the calendar events for a certain day.
|
||||
|
@ -91,7 +101,7 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy {
|
|||
|
||||
// Listen for events added. When an event is added, reload the data.
|
||||
this.eventObservers.push(CoreEvents.on(
|
||||
AddonCalendarProvider.NEW_EVENT_EVENT,
|
||||
ADDON_CALENDAR_NEW_EVENT_EVENT,
|
||||
(data) => {
|
||||
if (data && data.eventId) {
|
||||
this.manager?.getSource().markAllItemsUnloaded();
|
||||
|
@ -102,14 +112,14 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy {
|
|||
));
|
||||
|
||||
// Listen for new event discarded event. When it does, reload the data.
|
||||
this.eventObservers.push(CoreEvents.on(AddonCalendarProvider.NEW_EVENT_DISCARDED_EVENT, () => {
|
||||
this.eventObservers.push(CoreEvents.on(ADDON_CALENDAR_NEW_EVENT_DISCARDED_EVENT, () => {
|
||||
this.manager?.getSource().markAllItemsUnloaded();
|
||||
this.refreshData(true, true);
|
||||
}, this.currentSiteId));
|
||||
|
||||
// Listen for events edited. When an event is edited, reload the data.
|
||||
this.eventObservers.push(CoreEvents.on(
|
||||
AddonCalendarProvider.EDIT_EVENT_EVENT,
|
||||
ADDON_CALENDAR_EDIT_EVENT_EVENT,
|
||||
(data) => {
|
||||
if (data && data.eventId) {
|
||||
this.manager?.getSource().markAllItemsUnloaded();
|
||||
|
@ -120,13 +130,13 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy {
|
|||
));
|
||||
|
||||
// Refresh data if calendar events are synchronized automatically.
|
||||
this.eventObservers.push(CoreEvents.on(AddonCalendarSyncProvider.AUTO_SYNCED, () => {
|
||||
this.eventObservers.push(CoreEvents.on(ADDON_CALENDAR_AUTO_SYNCED, () => {
|
||||
this.manager?.getSource().markAllItemsUnloaded();
|
||||
this.refreshData(false, true);
|
||||
}, this.currentSiteId));
|
||||
|
||||
// Refresh data if calendar events are synchronized manually but not by this page.
|
||||
this.eventObservers.push(CoreEvents.on(AddonCalendarSyncProvider.MANUAL_SYNCED, (data) => {
|
||||
this.eventObservers.push(CoreEvents.on(ADDON_CALENDAR_MANUAL_SYNCED, (data) => {
|
||||
const selectedDay = this.manager?.getSelectedItem();
|
||||
if (data && (data.source != 'day' || !selectedDay || !data.moment || !selectedDay.moment.isSame(data.moment, 'day'))) {
|
||||
this.manager?.getSource().markAllItemsUnloaded();
|
||||
|
@ -136,7 +146,7 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy {
|
|||
|
||||
// Update the events when an event is deleted.
|
||||
this.eventObservers.push(CoreEvents.on(
|
||||
AddonCalendarProvider.DELETED_EVENT_EVENT,
|
||||
ADDON_CALENDAR_DELETED_EVENT_EVENT,
|
||||
(data) => {
|
||||
if (data && !data.sent) {
|
||||
// Event was deleted in offline. Just mark it as deleted, no need to refresh.
|
||||
|
@ -151,7 +161,7 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy {
|
|||
|
||||
// Listen for events "undeleted" (offline).
|
||||
this.eventObservers.push(CoreEvents.on(
|
||||
AddonCalendarProvider.UNDELETED_EVENT_EVENT,
|
||||
ADDON_CALENDAR_UNDELETED_EVENT_EVENT,
|
||||
(data) => {
|
||||
if (!data || !data.eventId) {
|
||||
return;
|
||||
|
@ -164,7 +174,7 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy {
|
|||
));
|
||||
|
||||
this.eventObservers.push(CoreEvents.on(
|
||||
AddonCalendarProvider.FILTER_CHANGED_EVENT,
|
||||
ADDON_CALENDAR_FILTER_CHANGED_EVENT,
|
||||
async (data) => {
|
||||
this.filter = data;
|
||||
|
||||
|
@ -212,7 +222,7 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy {
|
|||
ngOnInit(): void {
|
||||
const types: string[] = [];
|
||||
|
||||
CoreUtils.enumKeys(AddonCalendarEventType).forEach((name) => {
|
||||
CoreObject.enumKeys(AddonCalendarEventType).forEach((name) => {
|
||||
const value = AddonCalendarEventType[name];
|
||||
this.filter[name] = CoreNavigator.getRouteBooleanParam(name) ?? true;
|
||||
types.push(value);
|
||||
|
@ -343,7 +353,7 @@ export class AddonCalendarDayPage implements OnInit, OnDestroy {
|
|||
result.moment = selectedDay?.moment;
|
||||
|
||||
this.manager?.getSource().markAllItemsUnloaded();
|
||||
CoreEvents.trigger(AddonCalendarSyncProvider.MANUAL_SYNCED, result, this.currentSiteId);
|
||||
CoreEvents.trigger(ADDON_CALENDAR_MANUAL_SYNCED, result, this.currentSiteId);
|
||||
}
|
||||
} catch (error) {
|
||||
if (showErrors) {
|
||||
|
@ -597,7 +607,7 @@ class AddonCalendarDaySlidesItemsManagerSource extends CoreSwipeSlidesDynamicIte
|
|||
const categories = await CoreCourses.getCategories(0, true);
|
||||
|
||||
// Index categories by ID.
|
||||
this.categories = CoreUtils.arrayToObject(categories, 'id');
|
||||
this.categories = CoreArray.toObject(categories, 'id');
|
||||
} catch {
|
||||
// Ignore errors.
|
||||
}
|
||||
|
|
|
@ -20,20 +20,18 @@ import { CoreSites } from '@services/sites';
|
|||
import { CoreSync } from '@services/sync';
|
||||
import { CoreDomUtils } from '@services/utils/dom';
|
||||
import { CoreTimeUtils } from '@services/utils/time';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreUtils } from '@singletons/utils';
|
||||
import { CoreCategoryData, CoreCourses, CoreCourseSearchedData, CoreEnrolledCourseData } from '@features/courses/services/courses';
|
||||
import { CoreEditorRichTextEditorComponent } from '@features/editor/components/rich-text-editor/rich-text-editor';
|
||||
import {
|
||||
AddonCalendarProvider,
|
||||
AddonCalendarGetCalendarAccessInformationWSResponse,
|
||||
AddonCalendarEvent,
|
||||
AddonCalendarEventType,
|
||||
AddonCalendar,
|
||||
AddonCalendarSubmitCreateUpdateFormDataWSParams,
|
||||
} from '../../services/calendar';
|
||||
import { AddonCalendarOffline } from '../../services/calendar-offline';
|
||||
import { AddonCalendarEventTypeOption, AddonCalendarHelper } from '../../services/calendar-helper';
|
||||
import { AddonCalendarSync, AddonCalendarSyncProvider } from '../../services/calendar-sync';
|
||||
import { AddonCalendarSync } from '../../services/calendar-sync';
|
||||
import { CoreSite } from '@classes/sites/site';
|
||||
import { Translate } from '@singletons';
|
||||
import { CoreFilterHelper } from '@features/filter/services/filter-helper';
|
||||
|
@ -42,12 +40,20 @@ import { CoreError } from '@classes/errors/error';
|
|||
import { CoreNavigator } from '@services/navigator';
|
||||
import { CanLeave } from '@guards/can-leave';
|
||||
import { CoreForms } from '@singletons/form';
|
||||
import { CoreReminders, CoreRemindersService, CoreRemindersUnits } from '@features/reminders/services/reminders';
|
||||
import { CoreReminders, CoreRemindersService } from '@features/reminders/services/reminders';
|
||||
import moment from 'moment-timezone';
|
||||
import { ADDON_CALENDAR_COMPONENT } from '@addons/calendar/constants';
|
||||
import {
|
||||
ADDON_CALENDAR_COMPONENT,
|
||||
ADDON_CALENDAR_EDIT_EVENT_EVENT,
|
||||
ADDON_CALENDAR_NEW_EVENT_EVENT,
|
||||
ADDON_CALENDAR_SYNC_ID,
|
||||
AddonCalendarEventType,
|
||||
} from '@addons/calendar/constants';
|
||||
import { ContextLevel } from '@/core/constants';
|
||||
import { CorePopovers } from '@services/popovers';
|
||||
import { CoreLoadings } from '@services/loadings';
|
||||
import { REMINDERS_DISABLED, CoreRemindersUnits } from '@features/reminders/constants';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
|
||||
/**
|
||||
* Page that displays a form to create/edit an event.
|
||||
|
@ -55,7 +61,7 @@ import { CoreLoadings } from '@services/loadings';
|
|||
@Component({
|
||||
selector: 'page-addon-calendar-edit-event',
|
||||
templateUrl: 'edit-event.html',
|
||||
styleUrls: ['edit-event.scss'],
|
||||
styleUrl: 'edit-event.scss',
|
||||
})
|
||||
export class AddonCalendarEditEventPage implements OnInit, OnDestroy, CanLeave {
|
||||
|
||||
|
@ -159,7 +165,7 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy, CanLeave {
|
|||
try {
|
||||
const [types, accessInfo] = await Promise.all([
|
||||
AddonCalendar.getAllowedEventTypes(this.courseId),
|
||||
CoreUtils.ignoreErrors(AddonCalendar.getAccessInformation(this.courseId), {
|
||||
CorePromiseUtils.ignoreErrors(AddonCalendar.getAccessInformation(this.courseId), {
|
||||
canmanageentries: false,
|
||||
canmanageownentries: false,
|
||||
canmanagegroupentries: false,
|
||||
|
@ -179,7 +185,7 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy, CanLeave {
|
|||
// Editing an event, get the event data. Wait for sync first.
|
||||
const eventId = this.eventId;
|
||||
|
||||
promises.push(AddonCalendarSync.waitForSync(AddonCalendarSyncProvider.SYNC_ID).then(async () => {
|
||||
promises.push(AddonCalendarSync.waitForSync(ADDON_CALENDAR_SYNC_ID).then(async () => {
|
||||
// Do not block if the scope is already destroyed.
|
||||
if (!this.isDestroyed && this.eventId) {
|
||||
CoreSync.blockOperation(ADDON_CALENDAR_COMPONENT, eventId);
|
||||
|
@ -363,7 +369,7 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy, CanLeave {
|
|||
this.form.controls.repeateditall.setValue(1);
|
||||
}
|
||||
|
||||
if (event.eventtype == AddonCalendarEventType.GROUP && courseId) {
|
||||
if (event.eventtype === AddonCalendarEventType.GROUP && courseId) {
|
||||
await this.loadGroups(courseId);
|
||||
}
|
||||
}
|
||||
|
@ -489,12 +495,12 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy, CanLeave {
|
|||
repeat: formData.repeat,
|
||||
};
|
||||
|
||||
if (formData.eventtype == AddonCalendarEventType.COURSE) {
|
||||
if (formData.eventtype === AddonCalendarEventType.COURSE) {
|
||||
data.courseid = formData.courseid;
|
||||
} else if (formData.eventtype == AddonCalendarEventType.GROUP) {
|
||||
} else if (formData.eventtype === AddonCalendarEventType.GROUP) {
|
||||
data.groupcourseid = formData.groupcourseid;
|
||||
data.groupid = formData.groupid;
|
||||
} else if (formData.eventtype == AddonCalendarEventType.CATEGORY) {
|
||||
} else if (formData.eventtype === AddonCalendarEventType.CATEGORY) {
|
||||
data.categoryid = formData.categoryid;
|
||||
}
|
||||
|
||||
|
@ -560,13 +566,13 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy, CanLeave {
|
|||
if (this.eventId && this.eventId > 0) {
|
||||
// Editing an event.
|
||||
CoreEvents.trigger(
|
||||
AddonCalendarProvider.EDIT_EVENT_EVENT,
|
||||
ADDON_CALENDAR_EDIT_EVENT_EVENT,
|
||||
{ eventId: this.eventId },
|
||||
this.currentSite.getId(),
|
||||
);
|
||||
} else {
|
||||
CoreEvents.trigger(
|
||||
AddonCalendarProvider.NEW_EVENT_EVENT,
|
||||
ADDON_CALENDAR_NEW_EVENT_EVENT,
|
||||
{
|
||||
eventId: event.id,
|
||||
oldEventId: this.eventId,
|
||||
|
@ -617,7 +623,7 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy, CanLeave {
|
|||
|
||||
// Check if default reminders are enabled.
|
||||
const defaultTime = await CoreReminders.getDefaultNotificationTime(this.currentSite.getId());
|
||||
if (defaultTime === CoreRemindersService.DISABLED) {
|
||||
if (defaultTime === REMINDERS_DISABLED) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -17,11 +17,10 @@ import { AlertOptions } from '@ionic/core';
|
|||
import {
|
||||
AddonCalendar,
|
||||
AddonCalendarEventToDisplay,
|
||||
AddonCalendarProvider,
|
||||
} from '../../services/calendar';
|
||||
import { AddonCalendarEventReminder, AddonCalendarHelper } from '../../services/calendar-helper';
|
||||
import { AddonCalendarOffline } from '../../services/calendar-offline';
|
||||
import { AddonCalendarSync, AddonCalendarSyncEvents, AddonCalendarSyncProvider } from '../../services/calendar-sync';
|
||||
import { AddonCalendarSync, AddonCalendarSyncEvents } from '../../services/calendar-sync';
|
||||
import { CoreNetwork } from '@services/network';
|
||||
import { CoreEventObserver, CoreEvents } from '@singletons/events';
|
||||
import { CoreDomUtils } from '@services/utils/dom';
|
||||
|
@ -32,13 +31,13 @@ import { CoreTimeUtils } from '@services/utils/time';
|
|||
import { NgZone, Translate } from '@singletons';
|
||||
import { Subscription } from 'rxjs';
|
||||
import { CoreNavigator } from '@services/navigator';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
import { ActivatedRoute, ActivatedRouteSnapshot } from '@angular/router';
|
||||
import { CoreConstants } from '@/core/constants';
|
||||
import { CoreRoutedItemsManagerSourcesTracker } from '@classes/items-management/routed-items-manager-sources-tracker';
|
||||
import { AddonCalendarEventsSource } from '@addons/calendar/classes/events-source';
|
||||
import { CoreSwipeNavigationItemsManager } from '@classes/items-management/swipe-navigation-items-manager';
|
||||
import { CoreReminders, CoreRemindersService } from '@features/reminders/services/reminders';
|
||||
import { CoreReminders } from '@features/reminders/services/reminders';
|
||||
import { CoreLocalNotifications } from '@services/local-notifications';
|
||||
import { CorePlatform } from '@services/platform';
|
||||
import { CoreConfig } from '@services/config';
|
||||
|
@ -46,6 +45,16 @@ import { CoreToasts, ToastDuration } from '@services/toasts';
|
|||
import { CorePopovers } from '@services/popovers';
|
||||
import { CoreLoadings } from '@services/loadings';
|
||||
import { CoreUrl } from '@singletons/url';
|
||||
import {
|
||||
ADDON_CALENDAR_AUTO_SYNCED,
|
||||
ADDON_CALENDAR_DELETED_EVENT_EVENT,
|
||||
ADDON_CALENDAR_EDIT_EVENT_EVENT,
|
||||
ADDON_CALENDAR_MANUAL_SYNCED,
|
||||
ADDON_CALENDAR_NEW_EVENT_DISCARDED_EVENT,
|
||||
ADDON_CALENDAR_NEW_EVENT_EVENT,
|
||||
ADDON_CALENDAR_UNDELETED_EVENT_EVENT,
|
||||
} from '@addons/calendar/constants';
|
||||
import { REMINDERS_DEFAULT_NOTIFICATION_TIME_CHANGED } from '@features/reminders/constants';
|
||||
|
||||
/**
|
||||
* Page that displays a single calendar event.
|
||||
|
@ -99,7 +108,7 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy {
|
|||
this.canEdit = AddonCalendar.canEditEventsInSite();
|
||||
|
||||
// Listen for event edited. If current event is edited, reload the data.
|
||||
this.editEventObserver = CoreEvents.on(AddonCalendarProvider.EDIT_EVENT_EVENT, (data) => {
|
||||
this.editEventObserver = CoreEvents.on(ADDON_CALENDAR_EDIT_EVENT_EVENT, (data) => {
|
||||
if (data && data.eventId === this.eventId) {
|
||||
this.eventLoaded = false;
|
||||
this.refreshEvent(true, false);
|
||||
|
@ -107,7 +116,7 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy {
|
|||
}, this.currentSiteId);
|
||||
|
||||
// Listen for event created. If user edits the data of a new offline event or it's sent to server, this event is triggered.
|
||||
this.newEventObserver = CoreEvents.on(AddonCalendarProvider.NEW_EVENT_EVENT, (data) => {
|
||||
this.newEventObserver = CoreEvents.on(ADDON_CALENDAR_NEW_EVENT_EVENT, (data) => {
|
||||
if (this.eventId < 0 && data && (data.eventId === this.eventId || data.oldEventId === this.eventId)) {
|
||||
this.eventId = data.eventId;
|
||||
this.eventLoaded = false;
|
||||
|
@ -117,14 +126,14 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy {
|
|||
|
||||
// Refresh data if this calendar event is synchronized automatically.
|
||||
this.syncObserver = CoreEvents.on(
|
||||
AddonCalendarSyncProvider.AUTO_SYNCED,
|
||||
ADDON_CALENDAR_AUTO_SYNCED,
|
||||
(data) => this.checkSyncResult(false, data),
|
||||
this.currentSiteId,
|
||||
);
|
||||
|
||||
// Refresh data if calendar events are synchronized manually but not by this page.
|
||||
this.manualSyncObserver = CoreEvents.on(
|
||||
AddonCalendarSyncProvider.MANUAL_SYNCED,
|
||||
ADDON_CALENDAR_MANUAL_SYNCED,
|
||||
(data) => this.checkSyncResult(true, data),
|
||||
this.currentSiteId,
|
||||
);
|
||||
|
@ -138,7 +147,7 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy {
|
|||
});
|
||||
|
||||
// Reload reminders if default notification time changes.
|
||||
this.defaultTimeChangedObserver = CoreEvents.on(CoreRemindersService.DEFAULT_NOTIFICATION_TIME_CHANGED, () => {
|
||||
this.defaultTimeChangedObserver = CoreEvents.on(REMINDERS_DEFAULT_NOTIFICATION_TIME_CHANGED, () => {
|
||||
this.loadReminders();
|
||||
}, this.currentSiteId);
|
||||
|
||||
|
@ -364,7 +373,7 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy {
|
|||
result.source = 'event';
|
||||
|
||||
CoreEvents.trigger(
|
||||
AddonCalendarSyncProvider.MANUAL_SYNCED,
|
||||
ADDON_CALENDAR_MANUAL_SYNCED,
|
||||
result,
|
||||
this.currentSiteId,
|
||||
);
|
||||
|
@ -471,7 +480,7 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy {
|
|||
}
|
||||
promises.push(AddonCalendar.invalidateTimeFormat());
|
||||
|
||||
await CoreUtils.allPromisesIgnoringErrors(promises);
|
||||
await CorePromiseUtils.allPromisesIgnoringErrors(promises);
|
||||
|
||||
await this.fetchEvent(sync, showErrors);
|
||||
}
|
||||
|
@ -552,9 +561,9 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy {
|
|||
|
||||
// Trigger an event.
|
||||
if (this.event.id < 0) {
|
||||
CoreEvents.trigger(AddonCalendarProvider.NEW_EVENT_DISCARDED_EVENT, {}, CoreSites.getCurrentSiteId());
|
||||
CoreEvents.trigger(ADDON_CALENDAR_NEW_EVENT_DISCARDED_EVENT, {}, CoreSites.getCurrentSiteId());
|
||||
} else {
|
||||
CoreEvents.trigger(AddonCalendarProvider.DELETED_EVENT_EVENT, {
|
||||
CoreEvents.trigger(ADDON_CALENDAR_DELETED_EVENT_EVENT, {
|
||||
eventId: this.eventId,
|
||||
sent: onlineEventDeleted,
|
||||
}, CoreSites.getCurrentSiteId());
|
||||
|
@ -595,7 +604,7 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy {
|
|||
await AddonCalendarOffline.unmarkDeleted(this.event.id);
|
||||
|
||||
// Trigger an event.
|
||||
CoreEvents.trigger(AddonCalendarProvider.UNDELETED_EVENT_EVENT, {
|
||||
CoreEvents.trigger(ADDON_CALENDAR_UNDELETED_EVENT_EVENT, {
|
||||
eventId: this.eventId,
|
||||
}, CoreSites.getCurrentSiteId());
|
||||
|
||||
|
|
|
@ -18,9 +18,9 @@ import { CoreEventObserver, CoreEvents } from '@singletons/events';
|
|||
import { CoreSites } from '@services/sites';
|
||||
import { CoreDomUtils } from '@services/utils/dom';
|
||||
import { CoreCoursesHelper } from '@features/courses/services/courses-helper';
|
||||
import { AddonCalendar, AddonCalendarProvider } from '../../services/calendar';
|
||||
import { AddonCalendar } from '../../services/calendar';
|
||||
import { AddonCalendarOffline } from '../../services/calendar-offline';
|
||||
import { AddonCalendarSync, AddonCalendarSyncProvider } from '../../services/calendar-sync';
|
||||
import { AddonCalendarSync } from '../../services/calendar-sync';
|
||||
import { AddonCalendarFilter, AddonCalendarHelper } from '../../services/calendar-helper';
|
||||
import { NgZone } from '@singletons';
|
||||
import { Subscription } from 'rxjs';
|
||||
|
@ -31,6 +31,16 @@ import { AddonCalendarUpcomingEventsComponent } from '../../components/upcoming-
|
|||
import { CoreNavigator } from '@services/navigator';
|
||||
import { CoreConstants } from '@/core/constants';
|
||||
import { CoreModals } from '@services/modals';
|
||||
import {
|
||||
ADDON_CALENDAR_AUTO_SYNCED,
|
||||
ADDON_CALENDAR_DELETED_EVENT_EVENT,
|
||||
ADDON_CALENDAR_EDIT_EVENT_EVENT,
|
||||
ADDON_CALENDAR_FILTER_CHANGED_EVENT,
|
||||
ADDON_CALENDAR_MANUAL_SYNCED,
|
||||
ADDON_CALENDAR_NEW_EVENT_DISCARDED_EVENT,
|
||||
ADDON_CALENDAR_NEW_EVENT_EVENT,
|
||||
ADDON_CALENDAR_UNDELETED_EVENT_EVENT,
|
||||
} from '@addons/calendar/constants';
|
||||
|
||||
/**
|
||||
* Page that displays the calendar events.
|
||||
|
@ -85,7 +95,7 @@ export class AddonCalendarIndexPage implements OnInit, OnDestroy {
|
|||
|
||||
// Listen for events added. When an event is added, reload the data.
|
||||
this.newEventObserver = CoreEvents.on(
|
||||
AddonCalendarProvider.NEW_EVENT_EVENT,
|
||||
ADDON_CALENDAR_NEW_EVENT_EVENT,
|
||||
(data) => {
|
||||
if (data && data.eventId) {
|
||||
this.loaded = false;
|
||||
|
@ -96,14 +106,14 @@ export class AddonCalendarIndexPage implements OnInit, OnDestroy {
|
|||
);
|
||||
|
||||
// Listen for new event discarded event. When it does, reload the data.
|
||||
this.discardedObserver = CoreEvents.on(AddonCalendarProvider.NEW_EVENT_DISCARDED_EVENT, () => {
|
||||
this.discardedObserver = CoreEvents.on(ADDON_CALENDAR_NEW_EVENT_DISCARDED_EVENT, () => {
|
||||
this.loaded = false;
|
||||
this.refreshData(true, false, true);
|
||||
}, this.currentSiteId);
|
||||
|
||||
// Listen for events edited. When an event is edited, reload the data.
|
||||
this.editEventObserver = CoreEvents.on(
|
||||
AddonCalendarProvider.EDIT_EVENT_EVENT,
|
||||
ADDON_CALENDAR_EDIT_EVENT_EVENT,
|
||||
(data) => {
|
||||
if (data && data.eventId) {
|
||||
this.loaded = false;
|
||||
|
@ -114,13 +124,13 @@ export class AddonCalendarIndexPage implements OnInit, OnDestroy {
|
|||
);
|
||||
|
||||
// Refresh data if calendar events are synchronized automatically.
|
||||
this.syncObserver = CoreEvents.on(AddonCalendarSyncProvider.AUTO_SYNCED, () => {
|
||||
this.syncObserver = CoreEvents.on(ADDON_CALENDAR_AUTO_SYNCED, () => {
|
||||
this.loaded = false;
|
||||
this.refreshData(false, false, true);
|
||||
}, this.currentSiteId);
|
||||
|
||||
// Refresh data if calendar events are synchronized manually but not by this page.
|
||||
this.manualSyncObserver = CoreEvents.on(AddonCalendarSyncProvider.MANUAL_SYNCED, (data) => {
|
||||
this.manualSyncObserver = CoreEvents.on(ADDON_CALENDAR_MANUAL_SYNCED, (data) => {
|
||||
if (data && data.source != 'index') {
|
||||
this.loaded = false;
|
||||
this.refreshData(false, false, true);
|
||||
|
@ -128,18 +138,18 @@ export class AddonCalendarIndexPage implements OnInit, OnDestroy {
|
|||
}, this.currentSiteId);
|
||||
|
||||
// Update the events when an event is deleted.
|
||||
this.deleteEventObserver = CoreEvents.on(AddonCalendarProvider.DELETED_EVENT_EVENT, () => {
|
||||
this.deleteEventObserver = CoreEvents.on(ADDON_CALENDAR_DELETED_EVENT_EVENT, () => {
|
||||
this.loaded = false;
|
||||
this.refreshData(false, false, true);
|
||||
}, this.currentSiteId);
|
||||
|
||||
// Update the "hasOffline" property if an event deleted in offline is restored.
|
||||
this.undeleteEventObserver = CoreEvents.on(AddonCalendarProvider.UNDELETED_EVENT_EVENT, async () => {
|
||||
this.undeleteEventObserver = CoreEvents.on(ADDON_CALENDAR_UNDELETED_EVENT_EVENT, async () => {
|
||||
this.hasOffline = await AddonCalendarOffline.hasOfflineData();
|
||||
}, this.currentSiteId);
|
||||
|
||||
this.filterChangedObserver = CoreEvents.on(
|
||||
AddonCalendarProvider.FILTER_CHANGED_EVENT,
|
||||
ADDON_CALENDAR_FILTER_CHANGED_EVENT,
|
||||
async (filterData) => {
|
||||
this.filter = filterData;
|
||||
|
||||
|
@ -205,7 +215,7 @@ export class AddonCalendarIndexPage implements OnInit, OnDestroy {
|
|||
result.source = 'index';
|
||||
|
||||
CoreEvents.trigger(
|
||||
AddonCalendarSyncProvider.MANUAL_SYNCED,
|
||||
ADDON_CALENDAR_MANUAL_SYNCED,
|
||||
result,
|
||||
this.currentSiteId,
|
||||
);
|
||||
|
|
|
@ -18,6 +18,7 @@ import {
|
|||
CoreReminders,
|
||||
CoreRemindersService,
|
||||
} from '@features/reminders/services/reminders';
|
||||
import { REMINDERS_DISABLED } from '@features/reminders/constants';
|
||||
|
||||
/**
|
||||
* Page that displays the calendar settings.
|
||||
|
@ -67,7 +68,7 @@ export class AddonCalendarSettingsPage implements OnInit {
|
|||
return;
|
||||
}
|
||||
|
||||
await CoreReminders.setDefaultNotificationTime(reminderTime.timeBefore ?? CoreRemindersService.DISABLED);
|
||||
await CoreReminders.setDefaultNotificationTime(reminderTime.timeBefore ?? REMINDERS_DISABLED);
|
||||
this.updateDefaultTimeLabel();
|
||||
}
|
||||
|
||||
|
|
|
@ -20,36 +20,30 @@ import {
|
|||
AddonCalendarEvent,
|
||||
AddonCalendarEventBase,
|
||||
AddonCalendarEventToDisplay,
|
||||
AddonCalendarEventType,
|
||||
AddonCalendarGetEventsEvent,
|
||||
AddonCalendarProvider,
|
||||
AddonCalendarWeek,
|
||||
AddonCalendarWeekDay,
|
||||
} from './calendar';
|
||||
import { CoreConfig } from '@services/config';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreObject } from '@singletons/object';
|
||||
import { CoreCourse } from '@features/course/services/course';
|
||||
import { ContextLevel, CoreConstants } from '@/core/constants';
|
||||
import moment from 'moment-timezone';
|
||||
import { makeSingleton } from '@singletons';
|
||||
import { AddonCalendarSyncInvalidateEvent } from './calendar-sync';
|
||||
import { AddonCalendarOfflineEventDBRecord } from './database/calendar-offline';
|
||||
import { CoreCategoryData } from '@features/courses/services/courses';
|
||||
import { CoreTimeUtils } from '@services/utils/time';
|
||||
import { CoreReminders, CoreRemindersService } from '@features/reminders/services/reminders';
|
||||
import { CoreCourseModuleDelegate } from '@features/course/services/module-delegate';
|
||||
import { ADDON_CALENDAR_COMPONENT } from '../constants';
|
||||
|
||||
/**
|
||||
* Context levels enumeration.
|
||||
*/
|
||||
export enum AddonCalendarEventIcons {
|
||||
SITE = 'fas-globe',
|
||||
CATEGORY = 'fas-cubes',
|
||||
COURSE = 'fas-graduation-cap',
|
||||
GROUP = 'fas-users',
|
||||
USER = 'fas-user',
|
||||
}
|
||||
import {
|
||||
ADDON_CALENDAR_COMPONENT,
|
||||
ADDON_CALENDAR_STARTING_WEEK_DAY,
|
||||
AddonCalendarEventIcons,
|
||||
AddonCalendarEventType,
|
||||
} from '../constants';
|
||||
import { AddonCalendarSyncInvalidateEvent } from './calendar-sync';
|
||||
import { REMINDERS_DISABLED, REMINDERS_DEFAULT_REMINDER_TIMEBEFORE } from '@features/reminders/constants';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
|
||||
/**
|
||||
* Service that provides some features regarding lists of courses and categories.
|
||||
|
@ -67,7 +61,7 @@ export class AddonCalendarHelperProvider {
|
|||
*/
|
||||
getEventIcon(eventType: AddonCalendarEventType | string): string {
|
||||
if (this.eventTypeIcons.length == 0) {
|
||||
CoreUtils.enumKeys(AddonCalendarEventType).forEach((name) => {
|
||||
CoreObject.enumKeys(AddonCalendarEventType).forEach((name) => {
|
||||
const value = AddonCalendarEventType[name];
|
||||
this.eventTypeIcons[value] = AddonCalendarEventIcons[name];
|
||||
});
|
||||
|
@ -322,7 +316,7 @@ export class AddonCalendarHelperProvider {
|
|||
const defaultTime = await CoreReminders.getDefaultNotificationTime(siteId);
|
||||
let defaultLabel: string | undefined;
|
||||
|
||||
if (defaultTime > CoreRemindersService.DISABLED) {
|
||||
if (defaultTime > REMINDERS_DISABLED) {
|
||||
const data = CoreRemindersService.convertSecondsToValueAndUnit(defaultTime);
|
||||
defaultLabel = CoreReminders.getUnitValueLabel(data.value, data.unit, true);
|
||||
}
|
||||
|
@ -332,7 +326,7 @@ export class AddonCalendarHelperProvider {
|
|||
id: reminder.id,
|
||||
};
|
||||
|
||||
if (reminder.timebefore === CoreRemindersService.DEFAULT_REMINDER_TIMEBEFORE) {
|
||||
if (reminder.timebefore === REMINDERS_DEFAULT_REMINDER_TIMEBEFORE) {
|
||||
// Default time. Check if default notifications are disabled.
|
||||
if (defaultLabel !== undefined) {
|
||||
formatted.label = defaultLabel;
|
||||
|
@ -418,7 +412,7 @@ export class AddonCalendarHelperProvider {
|
|||
const site = await CoreSites.getSite(siteId);
|
||||
// Get starting week day user preference, fallback to site configuration.
|
||||
let startWeekDayStr = site.getStoredConfig('calendar_startwday') || '1';
|
||||
startWeekDayStr = await CoreConfig.get(AddonCalendarProvider.STARTING_WEEK_DAY, startWeekDayStr);
|
||||
startWeekDayStr = await CoreConfig.get(ADDON_CALENDAR_STARTING_WEEK_DAY, startWeekDayStr);
|
||||
const startWeekDay = parseInt(startWeekDayStr, 10);
|
||||
|
||||
const today = moment();
|
||||
|
@ -645,7 +639,7 @@ export class AddonCalendarHelperProvider {
|
|||
const repeatedEvents =
|
||||
await AddonCalendar.getLocalEventsByRepeatIdFromLocalDb(eventData.repeatid, site.id);
|
||||
|
||||
await CoreUtils.allPromises(repeatedEvents.map((event) =>
|
||||
await CorePromiseUtils.allPromises(repeatedEvents.map((event) =>
|
||||
AddonCalendar.invalidateEvent(event.id)));
|
||||
|
||||
return;
|
||||
|
@ -666,7 +660,7 @@ export class AddonCalendarHelperProvider {
|
|||
}));
|
||||
|
||||
try {
|
||||
await CoreUtils.allPromisesIgnoringErrors(promises);
|
||||
await CorePromiseUtils.allPromisesIgnoringErrors(promises);
|
||||
} finally {
|
||||
const treatedMonths = {};
|
||||
const treatedDays = {};
|
||||
|
@ -734,7 +728,7 @@ export class AddonCalendarHelperProvider {
|
|||
}
|
||||
});
|
||||
|
||||
await CoreUtils.allPromisesIgnoringErrors(finalPromises);
|
||||
await CorePromiseUtils.allPromisesIgnoringErrors(finalPromises);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -784,7 +778,6 @@ export class AddonCalendarHelperProvider {
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
export const AddonCalendarHelper = makeSingleton(AddonCalendarHelperProvider);
|
||||
|
||||
/**
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
import { Injectable } from '@angular/core';
|
||||
import { SQLiteDBRecordValues } from '@classes/sqlitedb';
|
||||
import { CoreSites } from '@services/sites';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreArray } from '@singletons/array';
|
||||
import { makeSingleton } from '@singletons';
|
||||
import { AddonCalendarSubmitCreateUpdateFormDataWSParams } from './calendar';
|
||||
import {
|
||||
|
@ -62,7 +62,7 @@ export class AddonCalendarOfflineProvider {
|
|||
|
||||
const result = await Promise.all(promises);
|
||||
|
||||
return CoreUtils.mergeArraysWithoutDuplicates(result[0], result[1]);
|
||||
return CoreArray.mergeWithoutDuplicates(result[0], result[1]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -17,7 +17,7 @@ import { CoreSyncBaseProvider, CoreSyncBlockedError } from '@classes/base-sync';
|
|||
import { CoreNetwork } from '@services/network';
|
||||
import { CoreEvents } from '@singletons/events';
|
||||
import { CoreSites } from '@services/sites';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreUtils } from '@singletons/utils';
|
||||
import {
|
||||
AddonCalendar,
|
||||
AddonCalendarEvent,
|
||||
|
@ -29,7 +29,14 @@ import { makeSingleton, Translate } from '@singletons';
|
|||
import { CoreSync, CoreSyncResult } from '@services/sync';
|
||||
import { CoreNetworkError } from '@classes/errors/network-error';
|
||||
import moment from 'moment-timezone';
|
||||
import { ADDON_CALENDAR_COMPONENT } from '../constants';
|
||||
import {
|
||||
ADDON_CALENDAR_AUTO_SYNCED,
|
||||
ADDON_CALENDAR_COMPONENT,
|
||||
ADDON_CALENDAR_MANUAL_SYNCED,
|
||||
ADDON_CALENDAR_SYNC_ID,
|
||||
} from '../constants';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
import { CoreWSError } from '@classes/errors/wserror';
|
||||
|
||||
/**
|
||||
* Service to sync calendar.
|
||||
|
@ -37,10 +44,6 @@ import { ADDON_CALENDAR_COMPONENT } from '../constants';
|
|||
@Injectable({ providedIn: 'root' })
|
||||
export class AddonCalendarSyncProvider extends CoreSyncBaseProvider<AddonCalendarSyncEvents> {
|
||||
|
||||
static readonly AUTO_SYNCED = 'addon_calendar_autom_synced';
|
||||
static readonly MANUAL_SYNCED = 'addon_calendar_manual_synced';
|
||||
static readonly SYNC_ID = 'calendar';
|
||||
|
||||
protected componentTranslatableString = 'addon.calendar.calendarevent';
|
||||
|
||||
constructor() {
|
||||
|
@ -72,7 +75,7 @@ export class AddonCalendarSyncProvider extends CoreSyncBaseProvider<AddonCalenda
|
|||
|
||||
if (result?.updated) {
|
||||
// Sync successful, send event.
|
||||
CoreEvents.trigger(AddonCalendarSyncProvider.AUTO_SYNCED, result, siteId);
|
||||
CoreEvents.trigger(ADDON_CALENDAR_AUTO_SYNCED, result, siteId);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -85,7 +88,7 @@ export class AddonCalendarSyncProvider extends CoreSyncBaseProvider<AddonCalenda
|
|||
async syncEventsIfNeeded(siteId?: string): Promise<AddonCalendarSyncEvents | undefined> {
|
||||
siteId = siteId || CoreSites.getCurrentSiteId();
|
||||
|
||||
const needed = await this.isSyncNeeded(AddonCalendarSyncProvider.SYNC_ID, siteId);
|
||||
const needed = await this.isSyncNeeded(ADDON_CALENDAR_SYNC_ID, siteId);
|
||||
|
||||
if (needed) {
|
||||
return this.syncEvents(siteId);
|
||||
|
@ -101,7 +104,7 @@ export class AddonCalendarSyncProvider extends CoreSyncBaseProvider<AddonCalenda
|
|||
async syncEvents(siteId?: string): Promise<AddonCalendarSyncEvents> {
|
||||
siteId = siteId || CoreSites.getCurrentSiteId();
|
||||
|
||||
const currentSyncPromise = this.getOngoingSync(AddonCalendarSyncProvider.SYNC_ID, siteId);
|
||||
const currentSyncPromise = this.getOngoingSync(ADDON_CALENDAR_SYNC_ID, siteId);
|
||||
if (currentSyncPromise) {
|
||||
// There's already a sync ongoing for this site, return the promise.
|
||||
return currentSyncPromise;
|
||||
|
@ -112,7 +115,7 @@ export class AddonCalendarSyncProvider extends CoreSyncBaseProvider<AddonCalenda
|
|||
// Get offline events.
|
||||
const syncPromise = this.performSyncEvents(siteId);
|
||||
|
||||
return this.addOngoingSync(AddonCalendarSyncProvider.SYNC_ID, syncPromise, siteId);
|
||||
return this.addOngoingSync(ADDON_CALENDAR_SYNC_ID, syncPromise, siteId);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -131,7 +134,7 @@ export class AddonCalendarSyncProvider extends CoreSyncBaseProvider<AddonCalenda
|
|||
updated: false,
|
||||
};
|
||||
|
||||
const eventIds: number[] = await CoreUtils.ignoreErrors(AddonCalendarOffline.getAllEventsIds(siteId), []);
|
||||
const eventIds: number[] = await CorePromiseUtils.ignoreErrors(AddonCalendarOffline.getAllEventsIds(siteId), []);
|
||||
|
||||
if (eventIds.length > 0) {
|
||||
if (!CoreNetwork.isOnline()) {
|
||||
|
@ -141,7 +144,7 @@ export class AddonCalendarSyncProvider extends CoreSyncBaseProvider<AddonCalenda
|
|||
|
||||
const promises = eventIds.map((eventId) => this.syncOfflineEvent(eventId, result, siteId));
|
||||
|
||||
await CoreUtils.allPromises(promises);
|
||||
await CorePromiseUtils.allPromises(promises);
|
||||
|
||||
if (result.updated) {
|
||||
|
||||
|
@ -151,12 +154,12 @@ export class AddonCalendarSyncProvider extends CoreSyncBaseProvider<AddonCalenda
|
|||
AddonCalendarHelper.refreshAfterChangeEvents(result.toinvalidate, siteId),
|
||||
];
|
||||
|
||||
await CoreUtils.ignoreErrors(Promise.all(promises));
|
||||
await CorePromiseUtils.ignoreErrors(Promise.all(promises));
|
||||
}
|
||||
}
|
||||
|
||||
// Sync finished, set sync time.
|
||||
await CoreUtils.ignoreErrors(this.setSyncTime(AddonCalendarSyncProvider.SYNC_ID, siteId));
|
||||
await CorePromiseUtils.ignoreErrors(this.setSyncTime(ADDON_CALENDAR_SYNC_ID, siteId));
|
||||
|
||||
// All done, return the result.
|
||||
return result;
|
||||
|
@ -217,7 +220,7 @@ export class AddonCalendarSyncProvider extends CoreSyncBaseProvider<AddonCalenda
|
|||
await Promise.all(promises);
|
||||
} catch (error) {
|
||||
|
||||
if (!CoreUtils.isWebServiceError(error)) {
|
||||
if (!CoreWSError.isWebServiceError(error)) {
|
||||
// Local error, reject.
|
||||
throw error;
|
||||
}
|
||||
|
@ -282,7 +285,7 @@ export class AddonCalendarSyncProvider extends CoreSyncBaseProvider<AddonCalenda
|
|||
return AddonCalendarOffline.deleteEvent(event.id, siteId);
|
||||
|
||||
} catch (error) {
|
||||
if (!CoreUtils.isWebServiceError(error)) {
|
||||
if (!CoreWSError.isWebServiceError(error)) {
|
||||
// Local error, reject.
|
||||
throw error;
|
||||
}
|
||||
|
@ -298,7 +301,6 @@ export class AddonCalendarSyncProvider extends CoreSyncBaseProvider<AddonCalenda
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
export const AddonCalendarSync = makeSingleton(AddonCalendarSyncProvider);
|
||||
|
||||
export type AddonCalendarSyncEvents = CoreSyncResult & {
|
||||
|
@ -316,3 +318,17 @@ export type AddonCalendarSyncInvalidateEvent = {
|
|||
timestart: number;
|
||||
repeated: number;
|
||||
};
|
||||
|
||||
declare module '@singletons/events' {
|
||||
|
||||
/**
|
||||
* Augment CoreEventsData interface with events specific to this service.
|
||||
*
|
||||
* @see https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation
|
||||
*/
|
||||
export interface CoreEventsData {
|
||||
[ADDON_CALENDAR_MANUAL_SYNCED]: AddonCalendarSyncEvents;
|
||||
[ADDON_CALENDAR_AUTO_SYNCED]: AddonCalendarSyncEvents;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@ import { CoreNetwork } from '@services/network';
|
|||
import { CoreText } from '@singletons/text';
|
||||
import { CoreTimeUtils } from '@services/utils/time';
|
||||
import { CoreUrl } from '@singletons/url';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreObject } from '@singletons/object';
|
||||
import { CoreGroups } from '@services/groups';
|
||||
import { CoreLocalNotifications } from '@services/local-notifications';
|
||||
import { CoreConfig } from '@services/config';
|
||||
|
@ -27,41 +27,41 @@ import { AddonCalendarOffline } from './calendar-offline';
|
|||
import { CoreUser } from '@features/user/services/user';
|
||||
import { CoreWSExternalWarning, CoreWSDate } from '@services/ws';
|
||||
import moment from 'moment-timezone';
|
||||
import { AddonCalendarEventDBRecord, EVENTS_TABLE } from './database/calendar';
|
||||
import { AddonCalendarEventDBRecord } from './database/calendar';
|
||||
import { CoreCourses } from '@features/courses/services/courses';
|
||||
import { ContextLevel, CoreConstants } from '@/core/constants';
|
||||
import { ContextLevel, CoreCacheUpdateFrequency, CoreConstants } from '@/core/constants';
|
||||
import { CoreWSError } from '@classes/errors/wserror';
|
||||
import { ApplicationInit, makeSingleton, Translate } from '@singletons';
|
||||
import { AddonCalendarOfflineEventDBRecord } from './database/calendar-offline';
|
||||
import { AddonCalendarMainMenuHandlerService } from './handlers/mainmenu';
|
||||
import { SafeUrl } from '@angular/platform-browser';
|
||||
import { CoreNavigator } from '@services/navigator';
|
||||
import { AddonCalendarFilter } from './calendar-helper';
|
||||
import { AddonCalendarSyncEvents, AddonCalendarSyncProvider } from './calendar-sync';
|
||||
import { CorePath } from '@singletons/path';
|
||||
import { CorePlatform } from '@services/platform';
|
||||
import {
|
||||
CoreReminderData,
|
||||
CoreReminders,
|
||||
CoreRemindersPushNotificationData,
|
||||
CoreRemindersService,
|
||||
} from '@features/reminders/services/reminders';
|
||||
import { CoreEvents } from '@singletons/events';
|
||||
import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site';
|
||||
import { ADDON_CALENDAR_COMPONENT } from '../constants';
|
||||
|
||||
const ROOT_CACHE_KEY = 'mmaCalendar:';
|
||||
|
||||
/**
|
||||
* Main calendar Event types enumeration.
|
||||
*/
|
||||
export enum AddonCalendarEventType {
|
||||
SITE = 'site',
|
||||
CATEGORY = 'category',
|
||||
COURSE = 'course',
|
||||
GROUP = 'group',
|
||||
USER = 'user',
|
||||
}
|
||||
import {
|
||||
ADDON_CALENDAR_COMPONENT,
|
||||
ADDON_CALENDAR_DAYS_INTERVAL,
|
||||
ADDON_CALENDAR_DELETED_EVENT_EVENT,
|
||||
ADDON_CALENDAR_EDIT_EVENT_EVENT,
|
||||
ADDON_CALENDAR_EVENTS_TABLE,
|
||||
ADDON_CALENDAR_FILTER_CHANGED_EVENT,
|
||||
ADDON_CALENDAR_NEW_EVENT_EVENT,
|
||||
ADDON_CALENDAR_PAGE_NAME,
|
||||
ADDON_CALENDAR_STARTING_WEEK_DAY,
|
||||
ADDON_CALENDAR_TF_12,
|
||||
ADDON_CALENDAR_TF_24,
|
||||
ADDON_CALENDAR_UNDELETED_EVENT_EVENT,
|
||||
AddonCalendarEventType,
|
||||
} from '../constants';
|
||||
import { REMINDERS_DEFAULT_REMINDER_TIMEBEFORE } from '@features/reminders/constants';
|
||||
import { AddonCalendarFilter } from './calendar-helper';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
|
||||
declare module '@singletons/events' {
|
||||
|
||||
|
@ -71,13 +71,11 @@ declare module '@singletons/events' {
|
|||
* @see https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation
|
||||
*/
|
||||
export interface CoreEventsData {
|
||||
[AddonCalendarProvider.NEW_EVENT_EVENT]: AddonCalendarUpdatedEventEvent;
|
||||
[AddonCalendarProvider.EDIT_EVENT_EVENT]: AddonCalendarUpdatedEventEvent;
|
||||
[AddonCalendarProvider.DELETED_EVENT_EVENT]: AddonCalendarUpdatedEventEvent;
|
||||
[AddonCalendarProvider.UNDELETED_EVENT_EVENT]: AddonCalendarUpdatedEventEvent;
|
||||
[AddonCalendarProvider.FILTER_CHANGED_EVENT]: AddonCalendarFilter;
|
||||
[AddonCalendarSyncProvider.MANUAL_SYNCED]: AddonCalendarSyncEvents;
|
||||
[AddonCalendarSyncProvider.AUTO_SYNCED]: AddonCalendarSyncEvents;
|
||||
[ADDON_CALENDAR_NEW_EVENT_EVENT]: AddonCalendarUpdatedEvent;
|
||||
[ADDON_CALENDAR_EDIT_EVENT_EVENT]: AddonCalendarUpdatedEvent;
|
||||
[ADDON_CALENDAR_DELETED_EVENT_EVENT]: AddonCalendarUpdatedEvent;
|
||||
[ADDON_CALENDAR_UNDELETED_EVENT_EVENT]: AddonCalendarUpdatedEvent;
|
||||
[ADDON_CALENDAR_FILTER_CHANGED_EVENT]: AddonCalendarFilter;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -88,20 +86,7 @@ declare module '@singletons/events' {
|
|||
@Injectable({ providedIn: 'root' })
|
||||
export class AddonCalendarProvider {
|
||||
|
||||
static readonly DAYS_INTERVAL = 30;
|
||||
|
||||
static readonly STARTING_WEEK_DAY = 'addon_calendar_starting_week_day';
|
||||
static readonly NEW_EVENT_EVENT = 'addon_calendar_new_event';
|
||||
static readonly NEW_EVENT_DISCARDED_EVENT = 'addon_calendar_new_event_discarded';
|
||||
static readonly EDIT_EVENT_EVENT = 'addon_calendar_edit_event';
|
||||
static readonly DELETED_EVENT_EVENT = 'addon_calendar_deleted_event';
|
||||
static readonly UNDELETED_EVENT_EVENT = 'addon_calendar_undeleted_event';
|
||||
static readonly FILTER_CHANGED_EVENT = 'addon_calendar_filter_changed_event';
|
||||
|
||||
static readonly CALENDAR_TF_24 = '%H:%M'; // Calendar time in 24 hours format.
|
||||
static readonly CALENDAR_TF_12 = '%I:%M %p'; // Calendar time in 12 hours format.
|
||||
|
||||
protected weekDays: AddonCalendarWeekDaysTranslationKeys[] = [
|
||||
protected static weekDays: AddonCalendarWeekDaysTranslationKeys[] = [
|
||||
{
|
||||
shortname: 'addon.calendar.sun',
|
||||
fullname: 'addon.calendar.sunday',
|
||||
|
@ -132,6 +117,8 @@ export class AddonCalendarProvider {
|
|||
},
|
||||
];
|
||||
|
||||
protected static readonly ROOT_CACHE_KEY = 'mmaCalendar:';
|
||||
|
||||
/**
|
||||
* Check if a certain site allows creating and editing events.
|
||||
*
|
||||
|
@ -199,7 +186,7 @@ export class AddonCalendarProvider {
|
|||
|
||||
return true;
|
||||
} catch (error) {
|
||||
if (error && !CoreUtils.isWebServiceError(error)) {
|
||||
if (error && !CoreWSError.isWebServiceError(error)) {
|
||||
// Couldn't connect to server, store in offline.
|
||||
return storeOffline();
|
||||
} else {
|
||||
|
@ -248,7 +235,7 @@ export class AddonCalendarProvider {
|
|||
const promises: Promise<unknown>[] = [];
|
||||
|
||||
promises.push(site.getDb().deleteRecords(
|
||||
EVENTS_TABLE,
|
||||
ADDON_CALENDAR_EVENTS_TABLE,
|
||||
{ id: eventId },
|
||||
));
|
||||
promises.push(CoreReminders.removeReminders({
|
||||
|
@ -256,7 +243,7 @@ export class AddonCalendarProvider {
|
|||
component: ADDON_CALENDAR_COMPONENT,
|
||||
} , siteId));
|
||||
|
||||
await CoreUtils.ignoreErrors(Promise.all(promises));
|
||||
await CorePromiseUtils.ignoreErrors(Promise.all(promises));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -297,7 +284,7 @@ export class AddonCalendarProvider {
|
|||
}
|
||||
|
||||
CoreNavigator.navigateToSitePath(
|
||||
AddonCalendarMainMenuHandlerService.PAGE_NAME,
|
||||
ADDON_CALENDAR_PAGE_NAME,
|
||||
{
|
||||
siteId: notification.siteId,
|
||||
preferCurrentTab: false,
|
||||
|
@ -429,7 +416,7 @@ export class AddonCalendarProvider {
|
|||
* @returns Cache key.
|
||||
*/
|
||||
protected getAccessInformationCacheKey(courseId?: number): string {
|
||||
return ROOT_CACHE_KEY + 'accessInformation:' + (courseId || 0);
|
||||
return AddonCalendarProvider.ROOT_CACHE_KEY + 'accessInformation:' + (courseId || 0);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -441,7 +428,7 @@ export class AddonCalendarProvider {
|
|||
async getAllEventsFromLocalDb(siteId?: string): Promise<AddonCalendarEventDBRecord[]> {
|
||||
const site = await CoreSites.getSite(siteId);
|
||||
|
||||
return site.getDb().getAllRecords(EVENTS_TABLE);
|
||||
return site.getDb().getAllRecords(ADDON_CALENDAR_EVENTS_TABLE);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -482,7 +469,7 @@ export class AddonCalendarProvider {
|
|||
* @returns Cache key.
|
||||
*/
|
||||
protected getAllowedEventTypesCacheKey(courseId?: number): string {
|
||||
return ROOT_CACHE_KEY + 'allowedEventTypes:' + (courseId || 0);
|
||||
return AddonCalendarProvider.ROOT_CACHE_KEY + 'allowedEventTypes:' + (courseId || 0);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -527,9 +514,9 @@ export class AddonCalendarProvider {
|
|||
format = site.getStoredConfig('calendar_site_timeformat');
|
||||
}
|
||||
|
||||
if (format === AddonCalendarProvider.CALENDAR_TF_12) {
|
||||
if (format === ADDON_CALENDAR_TF_12) {
|
||||
format = Translate.instant('core.strftimetime12');
|
||||
} else if (format === AddonCalendarProvider.CALENDAR_TF_24) {
|
||||
} else if (format === ADDON_CALENDAR_TF_24) {
|
||||
format = Translate.instant('core.strftimetime24');
|
||||
}
|
||||
|
||||
|
@ -577,7 +564,7 @@ export class AddonCalendarProvider {
|
|||
const site = await CoreSites.getSite(siteId);
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.getEventCacheKey(id),
|
||||
updateFrequency: CoreSite.FREQUENCY_RARELY,
|
||||
updateFrequency: CoreCacheUpdateFrequency.RARELY,
|
||||
};
|
||||
const params: AddonCalendarGetCalendarEventsWSParams = {
|
||||
options: {
|
||||
|
@ -613,7 +600,7 @@ export class AddonCalendarProvider {
|
|||
const site = await CoreSites.getSite(siteId);
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.getEventCacheKey(id),
|
||||
updateFrequency: CoreSite.FREQUENCY_RARELY,
|
||||
updateFrequency: CoreCacheUpdateFrequency.RARELY,
|
||||
};
|
||||
const params: AddonCalendarGetCalendarEventByIdWSParams = {
|
||||
eventid: id,
|
||||
|
@ -641,7 +628,7 @@ export class AddonCalendarProvider {
|
|||
* @returns Cache key.
|
||||
*/
|
||||
protected getEventCacheKey(id: number): string {
|
||||
return ROOT_CACHE_KEY + 'events:' + id;
|
||||
return AddonCalendarProvider.ROOT_CACHE_KEY + 'events:' + id;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -654,7 +641,7 @@ export class AddonCalendarProvider {
|
|||
async getEventFromLocalDb(id: number, siteId?: string): Promise<AddonCalendarGetEventsEvent | AddonCalendarEvent> {
|
||||
const site = await CoreSites.getSite(siteId);
|
||||
const record: AddonCalendarGetEventsEvent | AddonCalendarEvent | AddonCalendarEventDBRecord =
|
||||
await site.getDb().getRecord(EVENTS_TABLE, { id: id });
|
||||
await site.getDb().getRecord(ADDON_CALENDAR_EVENTS_TABLE, { id: id });
|
||||
|
||||
const eventConverted = record as AddonCalendarEvent;
|
||||
const originalEvent = record as AddonCalendarGetEventsEvent;
|
||||
|
@ -662,8 +649,8 @@ export class AddonCalendarProvider {
|
|||
|
||||
// Calculate data to match the new WS.
|
||||
eventConverted.descriptionformat = originalEvent.format;
|
||||
eventConverted.iscourseevent = originalEvent.eventtype == AddonCalendarEventType.COURSE;
|
||||
eventConverted.iscategoryevent = originalEvent.eventtype == AddonCalendarEventType.CATEGORY;
|
||||
eventConverted.iscourseevent = originalEvent.eventtype === AddonCalendarEventType.COURSE;
|
||||
eventConverted.iscategoryevent = originalEvent.eventtype === AddonCalendarEventType.CATEGORY;
|
||||
eventConverted.normalisedeventtype = this.getEventType(recordAsRecord);
|
||||
try {
|
||||
eventConverted.category = CoreText.parseJSON(recordAsRecord.category || '');
|
||||
|
@ -699,7 +686,7 @@ export class AddonCalendarProvider {
|
|||
siteId?: string,
|
||||
): Promise<void> {
|
||||
|
||||
timebefore = timebefore ?? CoreRemindersService.DEFAULT_REMINDER_TIMEBEFORE;
|
||||
timebefore = timebefore ?? REMINDERS_DEFAULT_REMINDER_TIMEBEFORE;
|
||||
|
||||
const previousReminders = await CoreReminders.getReminders({
|
||||
instanceId: event.id,
|
||||
|
@ -779,7 +766,7 @@ export class AddonCalendarProvider {
|
|||
}
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.getDayEventsCacheKey(year, month, day, courseId, categoryId),
|
||||
updateFrequency: CoreSite.FREQUENCY_SOMETIMES,
|
||||
updateFrequency: CoreCacheUpdateFrequency.SOMETIMES,
|
||||
};
|
||||
if (ignoreCache) {
|
||||
preSets.getFromCache = false;
|
||||
|
@ -797,7 +784,7 @@ export class AddonCalendarProvider {
|
|||
* @returns Prefix Cache key.
|
||||
*/
|
||||
protected getDayEventsPrefixCacheKey(): string {
|
||||
return ROOT_CACHE_KEY + 'day:';
|
||||
return AddonCalendarProvider.ROOT_CACHE_KEY + 'day:';
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -843,7 +830,7 @@ export class AddonCalendarProvider {
|
|||
async getEventsList(
|
||||
initialTime?: number,
|
||||
daysToStart: number = 0,
|
||||
daysInterval: number = AddonCalendarProvider.DAYS_INTERVAL,
|
||||
daysInterval: number = ADDON_CALENDAR_DAYS_INTERVAL,
|
||||
siteId?: string,
|
||||
): Promise<AddonCalendarGetEventsEvent[]> {
|
||||
|
||||
|
@ -891,7 +878,7 @@ export class AddonCalendarProvider {
|
|||
cacheKey: this.getEventsListCacheKey(daysToStart, daysInterval),
|
||||
getCacheUsingCacheKey: true,
|
||||
uniqueCacheKey: true,
|
||||
updateFrequency: CoreSite.FREQUENCY_SOMETIMES,
|
||||
updateFrequency: CoreCacheUpdateFrequency.SOMETIMES,
|
||||
};
|
||||
const response =
|
||||
await site.read<AddonCalendarGetCalendarEventsWSResponse>('core_calendar_get_calendar_events', params, preSets);
|
||||
|
@ -907,7 +894,7 @@ export class AddonCalendarProvider {
|
|||
* @returns Prefix Cache key.
|
||||
*/
|
||||
protected getEventsListPrefixCacheKey(): string {
|
||||
return ROOT_CACHE_KEY + 'events:';
|
||||
return AddonCalendarProvider.ROOT_CACHE_KEY + 'events:';
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -931,7 +918,7 @@ export class AddonCalendarProvider {
|
|||
async getLocalEventsByRepeatIdFromLocalDb(repeatId: number, siteId?: string): Promise<AddonCalendarEventDBRecord[]> {
|
||||
const site = await CoreSites.getSite(siteId);
|
||||
|
||||
return site.getDb().getRecords(EVENTS_TABLE, { repeatid: repeatId });
|
||||
return site.getDb().getRecords(ADDON_CALENDAR_EVENTS_TABLE, { repeatid: repeatId });
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -969,7 +956,7 @@ export class AddonCalendarProvider {
|
|||
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.getMonthlyEventsCacheKey(year, month, courseId, categoryId),
|
||||
updateFrequency: CoreSite.FREQUENCY_SOMETIMES,
|
||||
updateFrequency: CoreCacheUpdateFrequency.SOMETIMES,
|
||||
};
|
||||
if (ignoreCache) {
|
||||
preSets.getFromCache = false;
|
||||
|
@ -985,7 +972,7 @@ export class AddonCalendarProvider {
|
|||
|
||||
// Store starting week day preference, we need it in offline to show months that are not in cache.
|
||||
if (CoreNetwork.isOnline()) {
|
||||
CoreConfig.set(AddonCalendarProvider.STARTING_WEEK_DAY, response.daynames[0].dayno);
|
||||
CoreConfig.set(ADDON_CALENDAR_STARTING_WEEK_DAY, response.daynames[0].dayno);
|
||||
}
|
||||
|
||||
return response;
|
||||
|
@ -997,7 +984,7 @@ export class AddonCalendarProvider {
|
|||
* @returns Prefix Cache key.
|
||||
*/
|
||||
protected getMonthlyEventsPrefixCacheKey(): string {
|
||||
return ROOT_CACHE_KEY + 'monthly:';
|
||||
return AddonCalendarProvider.ROOT_CACHE_KEY + 'monthly:';
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1054,7 +1041,7 @@ export class AddonCalendarProvider {
|
|||
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.getUpcomingEventsCacheKey(courseId, categoryId),
|
||||
updateFrequency: CoreSite.FREQUENCY_SOMETIMES,
|
||||
updateFrequency: CoreCacheUpdateFrequency.SOMETIMES,
|
||||
};
|
||||
|
||||
if (ignoreCache) {
|
||||
|
@ -1074,7 +1061,7 @@ export class AddonCalendarProvider {
|
|||
* @returns Prefix Cache key.
|
||||
*/
|
||||
protected getUpcomingEventsPrefixCacheKey(): string {
|
||||
return ROOT_CACHE_KEY + 'upcoming:';
|
||||
return AddonCalendarProvider.ROOT_CACHE_KEY + 'upcoming:';
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1120,7 +1107,7 @@ export class AddonCalendarProvider {
|
|||
getWeekDays(startingDay?: number): AddonCalendarWeekDaysTranslationKeys[] {
|
||||
startingDay = startingDay || 0;
|
||||
|
||||
return this.weekDays.slice(startingDay).concat(this.weekDays.slice(0, startingDay));
|
||||
return AddonCalendarProvider.weekDays.slice(startingDay).concat(AddonCalendarProvider.weekDays.slice(0, startingDay));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1440,7 +1427,7 @@ export class AddonCalendarProvider {
|
|||
await this.addDefaultEventReminder(eventRecord, site.getId());
|
||||
}
|
||||
|
||||
await site.getDb().insertRecord(EVENTS_TABLE, eventRecord);
|
||||
await site.getDb().insertRecord(ADDON_CALENDAR_EVENTS_TABLE, eventRecord);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1451,7 +1438,7 @@ export class AddonCalendarProvider {
|
|||
*/
|
||||
protected async addDefaultEventReminder(event: AddonCalendarEventDBRecord, siteId?: string): Promise<void> {
|
||||
// Add default reminder if the event isn't stored already and doesn't have any reminder.
|
||||
const eventExist = await CoreUtils.promiseWorks(this.getEventFromLocalDb(event.id, siteId));
|
||||
const eventExist = await CorePromiseUtils.promiseWorks(this.getEventFromLocalDb(event.id, siteId));
|
||||
if (eventExist) {
|
||||
return;
|
||||
}
|
||||
|
@ -1522,7 +1509,7 @@ export class AddonCalendarProvider {
|
|||
|
||||
// Now save the reminders if any.
|
||||
if (options.reminders?.length) {
|
||||
await CoreUtils.ignoreErrors(
|
||||
await CorePromiseUtils.ignoreErrors(
|
||||
Promise.all(options.reminders.map((reminder) =>
|
||||
this.addEventReminder(event, reminder.time, siteId))),
|
||||
);
|
||||
|
@ -1545,7 +1532,7 @@ export class AddonCalendarProvider {
|
|||
|
||||
// Now save the reminders if any.
|
||||
if (options.reminders?.length) {
|
||||
await CoreUtils.ignoreErrors(
|
||||
await CorePromiseUtils.ignoreErrors(
|
||||
Promise.all(options.reminders.map((reminder) =>
|
||||
this.addEventReminder(event, reminder.time, siteId))),
|
||||
);
|
||||
|
@ -1553,7 +1540,7 @@ export class AddonCalendarProvider {
|
|||
|
||||
return ({ sent: true, event });
|
||||
} catch (error) {
|
||||
if (error && !CoreUtils.isWebServiceError(error)) {
|
||||
if (error && !CoreWSError.isWebServiceError(error)) {
|
||||
// Couldn't connect to server, store in offline.
|
||||
return storeOffline();
|
||||
} else {
|
||||
|
@ -1591,7 +1578,7 @@ export class AddonCalendarProvider {
|
|||
}
|
||||
|
||||
const params: AddonCalendarSubmitCreateUpdateFormWSParams = {
|
||||
formdata: CoreUtils.objectToGetParams(formData),
|
||||
formdata: CoreObject.toGetParams(formData),
|
||||
};
|
||||
const result =
|
||||
await site.write<AddonCalendarSubmitCreateUpdateFormWSResponse>('core_calendar_submit_create_update_form', params);
|
||||
|
@ -1606,7 +1593,7 @@ export class AddonCalendarProvider {
|
|||
|
||||
if (eventId < 0) {
|
||||
// Offline event has been sent. Change reminders instanceId if any.
|
||||
await CoreUtils.ignoreErrors(
|
||||
await CorePromiseUtils.ignoreErrors(
|
||||
CoreReminders.updateReminders(
|
||||
{ instanceId: result.event.id },
|
||||
{
|
||||
|
@ -1620,7 +1607,7 @@ export class AddonCalendarProvider {
|
|||
|
||||
if (formData.id === 0) {
|
||||
// Store the new event in local DB.
|
||||
await CoreUtils.ignoreErrors(this.storeEventInLocalDb(result.event, { addDefaultReminder: false, siteId }));
|
||||
await CorePromiseUtils.ignoreErrors(this.storeEventInLocalDb(result.event, { addDefaultReminder: false, siteId }));
|
||||
}
|
||||
|
||||
return result.event;
|
||||
|
@ -2081,9 +2068,9 @@ export type AddonCalendarEventToDisplay = Partial<AddonCalendarCalendarEvent> &
|
|||
|
||||
/**
|
||||
* Event triggered when an event is modified with event types:
|
||||
* NEW_EVENT_EVENT, EDIT_EVENT_EVENT, DELETED_EVENT_EVENT, UNDELETED_EVENT_EVENT.
|
||||
* NEW_EVENT, EDIT_EVENT, DELETED_EVENT, UNDELETED_EVENT.
|
||||
*/
|
||||
export type AddonCalendarUpdatedEventEvent = {
|
||||
export type AddonCalendarUpdatedEvent = {
|
||||
eventId: number;
|
||||
oldEventId?: number; // Old event ID. Used when an offline event is sent.
|
||||
sent?: boolean;
|
||||
|
|
|
@ -13,7 +13,8 @@
|
|||
// limitations under the License.
|
||||
|
||||
import { CoreSiteSchema } from '@services/sites';
|
||||
import { AddonCalendarEventType } from '../calendar';
|
||||
import { AddonCalendarEventType } from '@addons/calendar/constants';
|
||||
|
||||
/**
|
||||
* Database variables for AddonDatabaseOffline service.
|
||||
*/
|
||||
|
|
|
@ -12,24 +12,24 @@
|
|||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
import { ADDON_CALENDAR_EVENTS_TABLE, AddonCalendarEventType } from '@addons/calendar/constants';
|
||||
import { SQLiteDB } from '@classes/sqlitedb';
|
||||
import { CoreRemindersService, CoreReminders } from '@features/reminders/services/reminders';
|
||||
import { REMINDERS_DISABLED } from '@features/reminders/constants';
|
||||
import { CoreReminders } from '@features/reminders/services/reminders';
|
||||
import { CoreConfig } from '@services/config';
|
||||
import { CoreSiteSchema } from '@services/sites';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { AddonCalendarEventType } from '../calendar';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
|
||||
/**
|
||||
* Database variables for AddonCalendarProvider service.
|
||||
*/
|
||||
export const EVENTS_TABLE = 'addon_calendar_events_3';
|
||||
export const CALENDAR_SITE_SCHEMA: CoreSiteSchema = {
|
||||
name: 'AddonCalendarProvider',
|
||||
version: 5,
|
||||
canBeCleared: [EVENTS_TABLE],
|
||||
canBeCleared: [ADDON_CALENDAR_EVENTS_TABLE],
|
||||
tables: [
|
||||
{
|
||||
name: EVENTS_TABLE,
|
||||
name: ADDON_CALENDAR_EVENTS_TABLE,
|
||||
columns: [
|
||||
{
|
||||
name: 'id',
|
||||
|
@ -199,10 +199,10 @@ const migrateDefaultTime = async (siteId: string, convertToSeconds = false): Pro
|
|||
const key = 'mmaCalendarDefaultNotifTime#' + siteId;
|
||||
try {
|
||||
let defaultTime = await CoreConfig.get<number>(key);
|
||||
await CoreUtils.ignoreErrors(CoreConfig.delete(key));
|
||||
await CorePromiseUtils.ignoreErrors(CoreConfig.delete(key));
|
||||
|
||||
if (defaultTime <= 0) {
|
||||
defaultTime = CoreRemindersService.DISABLED;
|
||||
defaultTime = REMINDERS_DISABLED;
|
||||
} else if (convertToSeconds) {
|
||||
// Convert from minutes to seconds.
|
||||
defaultTime = defaultTime * 60;
|
||||
|
|
|
@ -16,6 +16,7 @@ import { Injectable } from '@angular/core';
|
|||
import { AddonCalendar } from '../calendar';
|
||||
import { makeSingleton } from '@singletons';
|
||||
import { CoreMainMenuHandler, CoreMainMenuHandlerData } from '@features/mainmenu/services/mainmenu-delegate';
|
||||
import { ADDON_CALENDAR_PAGE_NAME } from '@addons/calendar/constants';
|
||||
|
||||
/**
|
||||
* Handler to inject an option into main menu.
|
||||
|
@ -23,8 +24,6 @@ import { CoreMainMenuHandler, CoreMainMenuHandlerData } from '@features/mainmenu
|
|||
@Injectable({ providedIn: 'root' })
|
||||
export class AddonCalendarMainMenuHandlerService implements CoreMainMenuHandler {
|
||||
|
||||
static readonly PAGE_NAME = 'calendar';
|
||||
|
||||
name = 'AddonCalendar';
|
||||
priority = 550;
|
||||
|
||||
|
@ -46,7 +45,7 @@ export class AddonCalendarMainMenuHandlerService implements CoreMainMenuHandler
|
|||
return {
|
||||
icon: 'far-calendar',
|
||||
title: 'addon.calendar.calendar',
|
||||
page: AddonCalendarMainMenuHandlerService.PAGE_NAME,
|
||||
page: ADDON_CALENDAR_PAGE_NAME,
|
||||
class: 'addon-calendar-handler',
|
||||
};
|
||||
}
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
import { CoreRoutedItemsManagerSource } from '@classes/items-management/routed-items-manager-source';
|
||||
import { CoreUserProfile } from '@features/user/services/user';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
import {
|
||||
AddonCompetency,
|
||||
AddonCompetencyDataForCourseCompetenciesPageCompetency,
|
||||
|
@ -70,7 +70,7 @@ export class AddonCompetencyCourseCompetenciesSource
|
|||
* Invalidate course cache.
|
||||
*/
|
||||
async invalidateCache(): Promise<void> {
|
||||
await CoreUtils.ignoreErrors(AddonCompetency.invalidateCourseCompetencies(this.COURSE_ID, this.USER_ID));
|
||||
await CorePromiseUtils.ignoreErrors(AddonCompetency.invalidateCourseCompetencies(this.COURSE_ID, this.USER_ID));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
import { CoreRoutedItemsManagerSource } from '@classes/items-management/routed-items-manager-source';
|
||||
import { CoreUserProfile } from '@features/user/services/user';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
import {
|
||||
AddonCompetency,
|
||||
AddonCompetencyDataForPlanPageCompetency,
|
||||
|
@ -60,7 +60,7 @@ export class AddonCompetencyPlanCompetenciesSource extends CoreRoutedItemsManage
|
|||
* Invalidate plan cache.
|
||||
*/
|
||||
async invalidateCache(): Promise<void> {
|
||||
await CoreUtils.ignoreErrors(AddonCompetency.invalidateLearningPlan(this.PLAN_ID));
|
||||
await CorePromiseUtils.ignoreErrors(AddonCompetency.invalidateLearningPlan(this.PLAN_ID));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -31,4 +31,4 @@ const routes: Routes = [
|
|||
AddonCompetencyCourseCompetenciesPageModule,
|
||||
],
|
||||
})
|
||||
export class AddonCompetencyCourseContentsLazyModule {}
|
||||
export default class AddonCompetencyCourseContentsLazyModule {}
|
||||
|
|
|
@ -69,4 +69,4 @@ const routes: Routes = [
|
|||
AddonCompetencyCompetencySummaryPageModule,
|
||||
],
|
||||
})
|
||||
export class AddonCompetencyCourseDetailsLazyModule {}
|
||||
export default class AddonCompetencyCourseDetailsLazyModule {}
|
||||
|
|
|
@ -89,4 +89,4 @@ const routes: Routes = [
|
|||
AddonCompetencyPlanListPage,
|
||||
],
|
||||
})
|
||||
export class AddonCompetencyLearningPlansLazyModule {}
|
||||
export default class AddonCompetencyLearningPlansLazyModule {}
|
||||
|
|
|
@ -28,7 +28,7 @@ import { Routes } from '@angular/router';
|
|||
import { CoreMainMenuTabRoutingModule } from '@features/mainmenu/mainmenu-tab-routing.module';
|
||||
import { CoreCourseIndexRoutingModule } from '@features/course/course-routing.module';
|
||||
import { PARTICIPANTS_PAGE_NAME } from '@features/user/constants';
|
||||
import { COURSE_PAGE_NAME } from '@features/course/constants';
|
||||
import { CORE_COURSE_PAGE_NAME } from '@features/course/constants';
|
||||
import { ADDON_COMPETENCY_LEARNING_PLANS_PAGE, ADDON_COMPETENCY_COMPETENCIES_PAGE } from './constants';
|
||||
|
||||
/**
|
||||
|
@ -49,22 +49,22 @@ export async function getCompetencyServices(): Promise<Type<unknown>[]> {
|
|||
const mainMenuChildrenRoutes: Routes = [
|
||||
{
|
||||
path: ADDON_COMPETENCY_LEARNING_PLANS_PAGE,
|
||||
loadChildren: () => import('./competency-learning-plans-lazy.module').then(m => m.AddonCompetencyLearningPlansLazyModule),
|
||||
loadChildren: () => import('./competency-learning-plans-lazy.module'),
|
||||
},
|
||||
{
|
||||
path: `${COURSE_PAGE_NAME}/:courseId/${ADDON_COMPETENCY_COMPETENCIES_PAGE}`,
|
||||
loadChildren: () => import('./competency-course-details-lazy.module').then(m => m.AddonCompetencyCourseDetailsLazyModule),
|
||||
path: `${CORE_COURSE_PAGE_NAME}/:courseId/${ADDON_COMPETENCY_COMPETENCIES_PAGE}`,
|
||||
loadChildren: () => import('./competency-course-details-lazy.module'),
|
||||
},
|
||||
{
|
||||
path: `${COURSE_PAGE_NAME}/:courseId/${PARTICIPANTS_PAGE_NAME}/:userId/${ADDON_COMPETENCY_COMPETENCIES_PAGE}`,
|
||||
loadChildren: () => import('./competency-course-details-lazy.module').then(m => m.AddonCompetencyCourseDetailsLazyModule),
|
||||
path: `${CORE_COURSE_PAGE_NAME}/:courseId/${PARTICIPANTS_PAGE_NAME}/:userId/${ADDON_COMPETENCY_COMPETENCIES_PAGE}`,
|
||||
loadChildren: () => import('./competency-course-details-lazy.module'),
|
||||
},
|
||||
];
|
||||
|
||||
const courseIndexRoutes: Routes = [
|
||||
{
|
||||
path: ADDON_COMPETENCY_COMPETENCIES_PAGE,
|
||||
loadChildren: () => import('./competency-course-contents-lazy.module').then(m => m.AddonCompetencyCourseContentsLazyModule),
|
||||
loadChildren: () => import('./competency-course-contents-lazy.module'),
|
||||
},
|
||||
];
|
||||
|
||||
|
|
|
@ -31,7 +31,7 @@ import {
|
|||
} from '@addons/competency/services/competency';
|
||||
import { CoreNavigator } from '@services/navigator';
|
||||
import { ContextLevel } from '@/core/constants';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
import { ADDON_COMPETENCY_SUMMARY_PAGE } from '@addons/competency/constants';
|
||||
import { CoreSwipeNavigationItemsManager } from '@classes/items-management/swipe-navigation-items-manager';
|
||||
import { CoreRoutedItemsManagerSourcesTracker } from '@classes/items-management/routed-items-manager-sources-tracker';
|
||||
|
@ -175,7 +175,7 @@ export class AddonCompetencyCompetencyPage implements OnInit, OnDestroy {
|
|||
async refreshCompetency(refresher: HTMLIonRefresherElement): Promise<void> {
|
||||
const source = this.competencies.getSource();
|
||||
|
||||
await CoreUtils.ignoreErrors(
|
||||
await CorePromiseUtils.ignoreErrors(
|
||||
source instanceof AddonCompetencyPlanCompetenciesSource
|
||||
? AddonCompetency.invalidateCompetencyInPlan(source.PLAN_ID, this.requireCompetencyId())
|
||||
: AddonCompetency.invalidateCompetencyInCourse(source.COURSE_ID, this.requireCompetencyId(), source.USER_ID),
|
||||
|
@ -287,7 +287,7 @@ export class AddonCompetencyCompetencyPage implements OnInit, OnDestroy {
|
|||
return;
|
||||
}
|
||||
|
||||
await CoreUtils.ignoreErrors(
|
||||
await CorePromiseUtils.ignoreErrors(
|
||||
AddonCompetency.logCompetencyInPlanView(source.PLAN_ID, compId, this.planStatus, name, userId),
|
||||
);
|
||||
|
||||
|
@ -316,7 +316,9 @@ export class AddonCompetencyCompetencyPage implements OnInit, OnDestroy {
|
|||
return;
|
||||
}
|
||||
|
||||
await CoreUtils.ignoreErrors(AddonCompetency.logCompetencyInCourseView(source.COURSE_ID, compId, name, source.USER_ID));
|
||||
await CorePromiseUtils.ignoreErrors(
|
||||
AddonCompetency.logCompetencyInCourseView(source.COURSE_ID, compId, name, source.USER_ID),
|
||||
);
|
||||
|
||||
CoreAnalytics.logEvent({
|
||||
type: CoreAnalyticsEventType.VIEW_ITEM,
|
||||
|
|
|
@ -17,7 +17,7 @@ import { ContextLevel } from '@/core/constants';
|
|||
import { AddonCompetencySummary, AddonCompetency } from '@addons/competency/services/competency';
|
||||
import { CoreNavigator } from '@services/navigator';
|
||||
import { CoreDomUtils } from '@services/utils/dom';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
import { ADDON_COMPETENCY_SUMMARY_PAGE } from '@addons/competency/constants';
|
||||
import { CoreTime } from '@singletons/time';
|
||||
import { CoreAnalytics, CoreAnalyticsEventType } from '@services/analytics';
|
||||
|
@ -45,7 +45,7 @@ export class AddonCompetencyCompetencySummaryPage implements OnInit {
|
|||
return;
|
||||
}
|
||||
|
||||
await CoreUtils.ignoreErrors(
|
||||
await CorePromiseUtils.ignoreErrors(
|
||||
AddonCompetency.logCompetencyView(this.competencyId, this.competency.competency.shortname),
|
||||
);
|
||||
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
import { CoreCacheUpdateFrequency } from '@/core/constants';
|
||||
import { Injectable } from '@angular/core';
|
||||
import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site';
|
||||
import { CoreSite } from '@classes/sites/site';
|
||||
|
@ -19,7 +20,7 @@ import { CoreCommentsArea } from '@features/comments/services/comments';
|
|||
import { CoreCourseSummary } from '@features/course/services/course';
|
||||
import { CoreUserSummary } from '@features/user/services/user';
|
||||
import { CoreSites } from '@services/sites';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
import { makeSingleton } from '@singletons';
|
||||
|
||||
const ROOT_CACHE_KEY = 'mmaCompetency:';
|
||||
|
@ -188,7 +189,7 @@ export class AddonCompetencyProvider {
|
|||
return false;
|
||||
}
|
||||
|
||||
return CoreUtils.promiseWorks(this.getCourseCompetencies(courseId, undefined, siteId));
|
||||
return CorePromiseUtils.promiseWorks(this.getCourseCompetencies(courseId, undefined, siteId));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -208,7 +209,7 @@ export class AddonCompetencyProvider {
|
|||
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.getLearningPlansCacheKey(userId),
|
||||
updateFrequency: CoreSite.FREQUENCY_RARELY,
|
||||
updateFrequency: CoreCacheUpdateFrequency.RARELY,
|
||||
};
|
||||
|
||||
const response = await site.read<AddonCompetencyDataForPlansPageWSResponse>('tool_lp_data_for_plans_page', params, preSets);
|
||||
|
@ -232,7 +233,7 @@ export class AddonCompetencyProvider {
|
|||
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.getLearningPlanCacheKey(planId),
|
||||
updateFrequency: CoreSite.FREQUENCY_RARELY,
|
||||
updateFrequency: CoreCacheUpdateFrequency.RARELY,
|
||||
};
|
||||
|
||||
return site.read('tool_lp_data_for_plan_page', params, preSets);
|
||||
|
@ -260,7 +261,7 @@ export class AddonCompetencyProvider {
|
|||
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.getCompetencyInPlanCacheKey(planId, competencyId),
|
||||
updateFrequency: CoreSite.FREQUENCY_SOMETIMES,
|
||||
updateFrequency: CoreCacheUpdateFrequency.SOMETIMES,
|
||||
};
|
||||
|
||||
return site.read(
|
||||
|
@ -298,7 +299,7 @@ export class AddonCompetencyProvider {
|
|||
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.getCompetencyInCourseCacheKey(courseId, competencyId, userId),
|
||||
updateFrequency: CoreSite.FREQUENCY_SOMETIMES,
|
||||
updateFrequency: CoreCacheUpdateFrequency.SOMETIMES,
|
||||
};
|
||||
|
||||
if (ignoreCache) {
|
||||
|
@ -334,7 +335,7 @@ export class AddonCompetencyProvider {
|
|||
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.getCompetencySummaryCacheKey(competencyId, userId),
|
||||
updateFrequency: CoreSite.FREQUENCY_SOMETIMES,
|
||||
updateFrequency: CoreCacheUpdateFrequency.SOMETIMES,
|
||||
};
|
||||
|
||||
if (ignoreCache) {
|
||||
|
@ -400,7 +401,7 @@ export class AddonCompetencyProvider {
|
|||
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.getCourseCompetenciesCacheKey(courseId),
|
||||
updateFrequency: CoreSite.FREQUENCY_SOMETIMES,
|
||||
updateFrequency: CoreCacheUpdateFrequency.SOMETIMES,
|
||||
};
|
||||
|
||||
if (ignoreCache) {
|
||||
|
|
|
@ -16,7 +16,7 @@ import { ADDON_COMPETENCY_COMPETENCIES_PAGE, ADDON_COMPETENCY_LEARNING_PLANS_PAG
|
|||
import { Injectable } from '@angular/core';
|
||||
import { CoreContentLinksHandlerBase } from '@features/contentlinks/classes/base-handler';
|
||||
import { CoreContentLinksAction } from '@features/contentlinks/services/contentlinks-delegate';
|
||||
import { COURSE_PAGE_NAME } from '@features/course/constants';
|
||||
import { CORE_COURSE_PAGE_NAME } from '@features/course/constants';
|
||||
import { CoreNavigator } from '@services/navigator';
|
||||
import { makeSingleton } from '@singletons';
|
||||
import { AddonCompetency } from '../competency';
|
||||
|
@ -41,7 +41,7 @@ export class AddonCompetencyCompetencyLinkHandlerService extends CoreContentLink
|
|||
action: async (siteId: string): Promise<void> => {
|
||||
if (courseId) {
|
||||
await CoreNavigator.navigateToSitePath(
|
||||
`${COURSE_PAGE_NAME}/${courseId}/${ADDON_COMPETENCY_COMPETENCIES_PAGE}`,
|
||||
`${CORE_COURSE_PAGE_NAME}/${courseId}/${ADDON_COMPETENCY_COMPETENCIES_PAGE}`,
|
||||
{
|
||||
params: { userId: params.userid },
|
||||
siteId,
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
// limitations under the License.
|
||||
|
||||
import { Injectable } from '@angular/core';
|
||||
import { CoreCourseAccessDataType } from '@features/course/services/course';
|
||||
import { CoreCourseAccessDataType } from '@features/course/constants';
|
||||
import {
|
||||
CoreCourseAccess,
|
||||
CoreCourseOptionsHandler,
|
||||
|
|
|
@ -14,14 +14,15 @@
|
|||
|
||||
import { ADDON_COMPETENCY_COMPETENCIES_PAGE, ADDON_COMPETENCY_LEARNING_PLANS_PAGE } from '@addons/competency/constants';
|
||||
import { Injectable } from '@angular/core';
|
||||
import { COURSE_PAGE_NAME } from '@features/course/constants';
|
||||
import { CORE_COURSE_PAGE_NAME } from '@features/course/constants';
|
||||
import { CorePushNotificationsClickHandler } from '@features/pushnotifications/services/push-delegate';
|
||||
import { CorePushNotificationsNotificationBasicData } from '@features/pushnotifications/services/pushnotifications';
|
||||
import { CoreNavigator } from '@services/navigator';
|
||||
import { CoreUrl } from '@singletons/url';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreUtils } from '@singletons/utils';
|
||||
import { makeSingleton } from '@singletons';
|
||||
import { AddonCompetency } from '../competency';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
|
||||
/**
|
||||
* Handler for competencies push notifications clicks.
|
||||
|
@ -55,7 +56,7 @@ export class AddonCompetencyPushClickHandlerService implements CorePushNotificat
|
|||
// Open the learning plan.
|
||||
const planId = Number(contextUrlParams.id);
|
||||
|
||||
await CoreUtils.ignoreErrors(AddonCompetency.invalidateLearningPlan(planId, notification.site));
|
||||
await CorePromiseUtils.ignoreErrors(AddonCompetency.invalidateLearningPlan(planId, notification.site));
|
||||
|
||||
await CoreNavigator.navigateToSitePath(`${ADDON_COMPETENCY_LEARNING_PLANS_PAGE}/${planId}`, {
|
||||
siteId: notification.site,
|
||||
|
@ -71,11 +72,13 @@ export class AddonCompetencyPushClickHandlerService implements CorePushNotificat
|
|||
const planId = Number(contextUrlParams.planid);
|
||||
const userId = Number(contextUrlParams.userid);
|
||||
|
||||
await CoreUtils.ignoreErrors(AddonCompetency.invalidateCompetencyInPlan(planId, competencyId, notification.site));
|
||||
await CorePromiseUtils.ignoreErrors(
|
||||
AddonCompetency.invalidateCompetencyInPlan(planId, competencyId, notification.site),
|
||||
);
|
||||
|
||||
if (courseId) {
|
||||
await CoreNavigator.navigateToSitePath(
|
||||
`${COURSE_PAGE_NAME}/${courseId}/${ADDON_COMPETENCY_COMPETENCIES_PAGE}/${competencyId}`,
|
||||
`${CORE_COURSE_PAGE_NAME}/${courseId}/${ADDON_COMPETENCY_COMPETENCIES_PAGE}/${competencyId}`,
|
||||
{
|
||||
params: { userId },
|
||||
siteId: notification.site,
|
||||
|
@ -101,7 +104,7 @@ export class AddonCompetencyPushClickHandlerService implements CorePushNotificat
|
|||
// Open the list of plans.
|
||||
const userId = Number(contextUrlParams.userid);
|
||||
|
||||
await CoreUtils.ignoreErrors(AddonCompetency.invalidateLearningPlans(userId, notification.site));
|
||||
await CorePromiseUtils.ignoreErrors(AddonCompetency.invalidateLearningPlans(userId, notification.site));
|
||||
|
||||
await CoreNavigator.navigateToSitePath(ADDON_COMPETENCY_LEARNING_PLANS_PAGE, {
|
||||
params: { userId },
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
import { ADDON_COMPETENCY_COMPETENCIES_PAGE, ADDON_COMPETENCY_LEARNING_PLANS_PAGE } from '@addons/competency/constants';
|
||||
import { Injectable } from '@angular/core';
|
||||
import { COURSE_PAGE_NAME } from '@features/course/constants';
|
||||
import { CORE_COURSE_PAGE_NAME } from '@features/course/constants';
|
||||
import { CoreUserProfile } from '@features/user/services/user';
|
||||
import {
|
||||
CoreUserProfileHandler,
|
||||
|
@ -112,9 +112,13 @@ export class AddonCompetencyUserHandlerService implements CoreUserProfileHandler
|
|||
action: (event, user, context, contextId): void => {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
CoreNavigator.navigateToSitePath(
|
||||
[COURSE_PAGE_NAME, contextId, PARTICIPANTS_PAGE_NAME, user.id, ADDON_COMPETENCY_COMPETENCIES_PAGE].join('/'),
|
||||
);
|
||||
CoreNavigator.navigateToSitePath([
|
||||
CORE_COURSE_PAGE_NAME,
|
||||
contextId,
|
||||
PARTICIPANTS_PAGE_NAME,
|
||||
user.id,
|
||||
ADDON_COMPETENCY_COMPETENCIES_PAGE,
|
||||
].join('/'));
|
||||
},
|
||||
};
|
||||
}
|
||||
|
|
|
@ -37,4 +37,4 @@ const routes: Routes = [
|
|||
AddonCourseCompletionReportPage,
|
||||
],
|
||||
})
|
||||
export class AddonCourseCompletionLazyModule {}
|
||||
export default class AddonCourseCompletionLazyModule {}
|
||||
|
|
|
@ -39,7 +39,7 @@ export async function getCourseCompletionServices(): Promise<Type<unknown>[]> {
|
|||
const routes: Routes = [
|
||||
{
|
||||
path: 'coursecompletion',
|
||||
loadChildren: () => import('./coursecompletion-lazy.module').then(m => m.AddonCourseCompletionLazyModule),
|
||||
loadChildren: () => import('./coursecompletion-lazy.module'),
|
||||
},
|
||||
];
|
||||
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
import { Injectable } from '@angular/core';
|
||||
import { CoreLogger } from '@singletons/logger';
|
||||
import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreWSError } from '@classes/errors/wserror';
|
||||
import { CoreCourseAnyCourseData, CoreCourses } from '@features/courses/services/courses';
|
||||
import { CoreSite } from '@classes/sites/site';
|
||||
import { CoreStatusWithWarningsWSResponse, CoreWSExternalWarning } from '@services/ws';
|
||||
|
@ -25,6 +25,7 @@ import { asyncObservable } from '@/core/utils/rxjs';
|
|||
import { map } from 'rxjs/operators';
|
||||
import { CoreSiteWSPreSets, WSObservable } from '@classes/sites/authenticated-site';
|
||||
import { firstValueFrom } from 'rxjs';
|
||||
import { CoreCacheUpdateFrequency } from '@/core/constants';
|
||||
|
||||
const ROOT_CACHE_KEY = 'mmaCourseCompletion:';
|
||||
|
||||
|
@ -173,7 +174,7 @@ export class AddonCourseCompletionProvider {
|
|||
const preSets = {
|
||||
...(options.preSets ?? {}),
|
||||
cacheKey: this.getCompletionCacheKey(courseId, userId),
|
||||
updateFrequency: CoreSite.FREQUENCY_SOMETIMES,
|
||||
updateFrequency: CoreCacheUpdateFrequency.SOMETIMES,
|
||||
cacheErrors: ['notenroled'],
|
||||
...CoreSites.getReadingStrategyPreSets(options.readingStrategy),
|
||||
};
|
||||
|
@ -283,7 +284,7 @@ export class AddonCourseCompletionProvider {
|
|||
|
||||
return true;
|
||||
} catch (error) {
|
||||
if (CoreUtils.isWebServiceError(error)) {
|
||||
if (CoreWSError.isWebServiceError(error)) {
|
||||
// The WS returned an error, plugin is not enabled.
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
// limitations under the License.
|
||||
|
||||
import { Injectable } from '@angular/core';
|
||||
import { CoreCourseAccessDataType } from '@features/course/services/course';
|
||||
import { CoreCourseAccessDataType } from '@features/course/constants';
|
||||
import {
|
||||
CoreCourseAccess,
|
||||
CoreCourseOptionsHandler,
|
||||
|
|
|
@ -12,9 +12,9 @@
|
|||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
import { CoreCacheUpdateFrequency } from '@/core/constants';
|
||||
import { Injectable } from '@angular/core';
|
||||
import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site';
|
||||
import { CoreSite } from '@classes/sites/site';
|
||||
import { CoreEnrolEnrolmentInfo } from '@features/enrol/services/enrol';
|
||||
import { CoreSites } from '@services/sites';
|
||||
import { CoreWSExternalWarning } from '@services/ws';
|
||||
|
@ -44,7 +44,7 @@ export class AddonEnrolGuestService {
|
|||
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.getGuestEnrolmentInfoCacheKey(instanceId),
|
||||
updateFrequency: CoreSite.FREQUENCY_RARELY,
|
||||
updateFrequency: CoreCacheUpdateFrequency.RARELY,
|
||||
};
|
||||
|
||||
const response =
|
||||
|
@ -68,15 +68,11 @@ export class AddonEnrolGuestService {
|
|||
*
|
||||
* @param instanceId Guest instance ID.
|
||||
* @param siteId Site Id. If not defined, use current site.
|
||||
* @returns Promise resolved when the data is invalidated.
|
||||
*/
|
||||
async invalidateGuestEnrolmentInfo(instanceId: number, siteId?: string): Promise<void> {
|
||||
const site = await CoreSites.getSite(siteId);
|
||||
|
||||
await Promise.all([
|
||||
site.invalidateWsCacheForKey(this.getGuestEnrolmentInfoCacheKey(instanceId)),
|
||||
site.invalidateWsCacheForKey(`mmCourses:guestinfo:${instanceId}`), // @todo Remove after 4.3 release.
|
||||
]);
|
||||
await site.invalidateWsCacheForKey(this.getGuestEnrolmentInfoCacheKey(instanceId));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -17,11 +17,11 @@ import { CoreEnrolAction, CoreEnrolSelfHandler, CoreEnrolInfoIcon } from '@featu
|
|||
import { Translate, makeSingleton } from '@singletons';
|
||||
import { AddonEnrolSelf } from './self';
|
||||
import { CorePasswordModalResponse } from '@components/password-modal/password-modal';
|
||||
import { CoreCoursesProvider } from '@features/courses/services/courses';
|
||||
import { CoreDomUtils } from '@services/utils/dom';
|
||||
import { CoreEnrol, CoreEnrolEnrolmentMethod } from '@features/enrol/services/enrol';
|
||||
import { CoreModals } from '@services/modals';
|
||||
import { CoreLoadings } from '@services/loadings';
|
||||
import { CORE_COURSES_ENROL_INVALID_KEY } from '@features/courses/constants';
|
||||
|
||||
/**
|
||||
* Enrol handler.
|
||||
|
@ -122,7 +122,7 @@ export class AddonEnrolSelfHandlerService implements CoreEnrolSelfHandler {
|
|||
try {
|
||||
response.validated = await AddonEnrolSelf.selfEnrol(method.courseid, password, method.id);
|
||||
} catch (error) {
|
||||
if (error && error.errorcode === CoreCoursesProvider.ENROL_INVALID_KEY) {
|
||||
if (error && error.errorcode === CORE_COURSES_ENROL_INVALID_KEY) {
|
||||
response.validated = false;
|
||||
response.error = error.message;
|
||||
} else {
|
||||
|
|
|
@ -12,11 +12,11 @@
|
|||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
import { CoreCacheUpdateFrequency } from '@/core/constants';
|
||||
import { Injectable } from '@angular/core';
|
||||
import { CoreWSError } from '@classes/errors/wserror';
|
||||
import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site';
|
||||
import { CoreSite } from '@classes/sites/site';
|
||||
import { CoreCoursesProvider } from '@features/courses/services/courses';
|
||||
import { CORE_COURSES_ENROL_INVALID_KEY } from '@features/courses/constants';
|
||||
import { CoreSites } from '@services/sites';
|
||||
import { CoreStatusWithWarningsWSResponse } from '@services/ws';
|
||||
import { makeSingleton } from '@singletons';
|
||||
|
@ -45,7 +45,7 @@ export class AddonEnrolSelfService {
|
|||
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.getSelfEnrolmentInfoCacheKey(instanceId),
|
||||
updateFrequency: CoreSite.FREQUENCY_RARELY,
|
||||
updateFrequency: CoreCacheUpdateFrequency.RARELY,
|
||||
};
|
||||
|
||||
return await site.read<AddonEnrolSelfGetInstanceInfoWSResponse>('enrol_self_get_instance_info', params, preSets);
|
||||
|
@ -82,7 +82,7 @@ export class AddonEnrolSelfService {
|
|||
* @param instanceId Enrol instance ID.
|
||||
* @param siteId Site ID. If not defined, use current site.
|
||||
* @returns Promise resolved if the user is enrolled. If the password is invalid, the promise is rejected
|
||||
* with an object with errorcode = CoreCoursesProvider.ENROL_INVALID_KEY.
|
||||
* with an object with errorcode = CORE_COURSES_ENROL_INVALID_KEY.
|
||||
*/
|
||||
async selfEnrol(courseId: number, password: string = '', instanceId?: number, siteId?: string): Promise<boolean> {
|
||||
|
||||
|
@ -112,7 +112,7 @@ export class AddonEnrolSelfService {
|
|||
warning.warningcode == '2' || warning.warningcode == '3' || warning.warningcode == '4');
|
||||
|
||||
if (warning) {
|
||||
throw new CoreWSError({ errorcode: CoreCoursesProvider.ENROL_INVALID_KEY, message: warning.message });
|
||||
throw new CoreWSError({ errorcode: CORE_COURSES_ENROL_INVALID_KEY, message: warning.message });
|
||||
} else {
|
||||
throw new CoreWSError(response.warnings[0]);
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@ import { CoreFilterFilter, CoreFilterFormatTextOptions } from '@features/filter/
|
|||
import { CoreLang } from '@services/lang';
|
||||
import { CoreSites } from '@services/sites';
|
||||
import { CoreText } from '@singletons/text';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
import { CoreEvents } from '@singletons/events';
|
||||
import { CoreSite } from '@classes/sites/site';
|
||||
import { makeSingleton } from '@singletons';
|
||||
|
@ -180,7 +180,7 @@ export class AddonFilterMathJaxLoaderHandlerService extends CoreFilterDefaultHan
|
|||
|
||||
// Make sure the element is in DOM, otherwise some equations don't work.
|
||||
// Automatically timeout the promise after a certain time, we don't want to wait forever.
|
||||
await CoreUtils.ignoreErrors(CoreUtils.timeoutPromise(CoreDom.waitToBeInDOM(container), 15000));
|
||||
await CorePromiseUtils.ignoreErrors(CorePromiseUtils.timeoutPromise(CoreDom.waitToBeInDOM(container), 15000));
|
||||
|
||||
await this.window.M!.filter_mathjaxloader!.typeset(container);
|
||||
}
|
||||
|
@ -336,7 +336,7 @@ export class AddonFilterMathJaxLoaderHandlerService extends CoreFilterDefaultHan
|
|||
}
|
||||
|
||||
await CoreWait.wait(250);
|
||||
await CoreUtils.ignoreErrors(this.waitForReady(retries + 1));
|
||||
await CorePromiseUtils.ignoreErrors(this.waitForReady(retries + 1));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -17,7 +17,7 @@ import { Component, OnDestroy, OnInit } from '@angular/core';
|
|||
import { CoreDomUtils } from '@services/utils/dom';
|
||||
import { CorePushNotifications } from '@features/pushnotifications/services/pushnotifications';
|
||||
import { AddonMessageOutputAirnotifier, AddonMessageOutputAirnotifierDevice } from '../../services/airnotifier';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
|
||||
/**
|
||||
* Page that displays the list of devices.
|
||||
|
@ -112,7 +112,7 @@ export class AddonMessageOutputAirnotifierDevicesPage implements OnInit, OnDestr
|
|||
* Fetch devices. The purpose is to store the updated data, it won't be reflected in the view.
|
||||
*/
|
||||
protected async updateDevices(): Promise<void> {
|
||||
await CoreUtils.ignoreErrors(AddonMessageOutputAirnotifier.invalidateUserDevices());
|
||||
await CorePromiseUtils.ignoreErrors(AddonMessageOutputAirnotifier.invalidateUserDevices());
|
||||
|
||||
await AddonMessageOutputAirnotifier.getUserDevices();
|
||||
}
|
||||
|
@ -124,7 +124,7 @@ export class AddonMessageOutputAirnotifierDevicesPage implements OnInit, OnDestr
|
|||
*/
|
||||
async refreshDevices(refresher: HTMLIonRefresherElement): Promise<void> {
|
||||
try {
|
||||
await CoreUtils.ignoreErrors(AddonMessageOutputAirnotifier.invalidateUserDevices());
|
||||
await CorePromiseUtils.ignoreErrors(AddonMessageOutputAirnotifier.invalidateUserDevices());
|
||||
|
||||
await this.fetchDevices();
|
||||
} finally {
|
||||
|
|
|
@ -16,14 +16,13 @@ import { Injectable } from '@angular/core';
|
|||
|
||||
import { CoreSites, CoreSitesCommonWSOptions, CoreSitesReadingStrategy } from '@services/sites';
|
||||
import { CoreWSExternalWarning } from '@services/ws';
|
||||
import { CoreConstants } from '@/core/constants';
|
||||
import { CoreSite } from '@classes/sites/site';
|
||||
import { CoreCacheUpdateFrequency, CoreConstants } from '@/core/constants';
|
||||
import { CoreError } from '@classes/errors/error';
|
||||
import { CoreWSError } from '@classes/errors/wserror';
|
||||
import { makeSingleton, Translate } from '@singletons';
|
||||
import { CoreEvents, CoreEventSiteData } from '@singletons/events';
|
||||
import { CoreDomUtils } from '@services/utils/dom';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreOpener } from '@singletons/opener';
|
||||
import { CorePath } from '@singletons/path';
|
||||
import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site';
|
||||
|
||||
|
@ -102,7 +101,7 @@ export class AddonMessageOutputAirnotifierProvider {
|
|||
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.getSystemConfiguredCacheKey(),
|
||||
updateFrequency: CoreSite.FREQUENCY_RARELY,
|
||||
updateFrequency: CoreCacheUpdateFrequency.RARELY,
|
||||
...CoreSites.getReadingStrategyPreSets(options.readingStrategy), // Include reading strategy preSets.
|
||||
};
|
||||
|
||||
|
@ -136,7 +135,7 @@ export class AddonMessageOutputAirnotifierProvider {
|
|||
};
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.getUserDevicesCacheKey(),
|
||||
updateFrequency: CoreSite.FREQUENCY_RARELY,
|
||||
updateFrequency: CoreCacheUpdateFrequency.RARELY,
|
||||
};
|
||||
|
||||
if (ignoreCache) {
|
||||
|
@ -223,7 +222,7 @@ export class AddonMessageOutputAirnotifierProvider {
|
|||
);
|
||||
|
||||
// Don't try auto-login, admins cannot use it.
|
||||
CoreUtils.openInBrowser(url, {
|
||||
CoreOpener.openInBrowser(url, {
|
||||
showBrowserWarning: false,
|
||||
});
|
||||
},
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
// (C) Copyright 2015 Moodle Pty Ltd.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
export const ADDON_MESSAGES_NEW_MESSAGE_EVENT = 'addon_messages_new_message_event';
|
||||
export const ADDON_MESSAGES_READ_CHANGED_EVENT = 'addon_messages_read_changed_event';
|
||||
// Notify a conversation should be opened.
|
||||
export const ADDON_MESSAGES_OPEN_CONVERSATION_EVENT = 'addon_messages_open_conversation_event';
|
||||
export const ADDON_MESSAGES_UPDATE_CONVERSATION_LIST_EVENT = 'addon_messages_update_conversation_list_event';
|
||||
export const ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT = 'addon_messages_member_changed_event';
|
||||
export const ADDON_MESSAGES_UNREAD_CONVERSATION_COUNTS_EVENT = 'addon_messages_unread_conversation_counts_event';
|
||||
export const ADDON_MESSAGES_CONTACT_REQUESTS_COUNT_EVENT = 'addon_messages_contact_requests_count_event';
|
||||
|
||||
export const ADDON_MESSAGES_POLL_INTERVAL = 10000;
|
||||
export const ADDON_MESSAGES_PUSH_SIMULATION_COMPONENT = 'AddonMessagesPushSimulation';
|
||||
|
||||
export const enum AddonMessagesMessagePrivacy {
|
||||
COURSEMEMBER = 0, // Privacy setting for being messaged by anyone within courses user is member.
|
||||
ONLYCONTACTS = 1, // Privacy setting for being messaged only by contacts.
|
||||
SITE = 2, // Privacy setting for being messaged by anyone on the site.
|
||||
}
|
||||
|
||||
export const enum AddonMessagesMessageConversationType {
|
||||
INDIVIDUAL = 1, // An individual conversation.
|
||||
GROUP = 2, // A group conversation.
|
||||
SELF = 3, // A self conversation.
|
||||
}
|
||||
|
||||
export const ADDON_MESSAGES_LIMIT_CONTACTS = 50;
|
||||
export const ADDON_MESSAGES_LIMIT_MESSAGES = 50;
|
||||
export const ADDON_MESSAGES_LIMIT_INITIAL_USER_SEARCH = 3;
|
||||
export const ADDON_MESSAGES_LIMIT_SEARCH = 50;
|
||||
|
||||
export const ADDON_MESSAGES_NOTIFICATION_PREFERENCES_KEY = 'message_provider_moodle_instantmessage';
|
||||
|
||||
export const ADDON_MESSAGES_AUTO_SYNCED = 'addon_messages_autom_synced';
|
||||
|
||||
export const enum AddonMessagesUpdateConversationAction {
|
||||
MUTE = 'mute',
|
||||
FAVOURITE = 'favourite',
|
||||
DELETE = 'delete',
|
||||
}
|
|
@ -117,7 +117,7 @@ function buildRoutes(injector: Injector): Routes {
|
|||
...discussionRoutes,
|
||||
{
|
||||
path: 'message-settings',
|
||||
loadChildren: () => import('./messages-settings-lazy.module').then(m => m.AddonMessagesSettingsLazyModule),
|
||||
loadChildren: () => import('./messages-settings-lazy.module'),
|
||||
},
|
||||
...buildTabMainRoutes(injector, {
|
||||
canActivate: [messagesIndexGuard],
|
||||
|
@ -148,4 +148,4 @@ function buildRoutes(injector: Injector): Routes {
|
|||
},
|
||||
],
|
||||
})
|
||||
export class AddonMessagesLazyModule {}
|
||||
export default class AddonMessagesLazyModule {}
|
||||
|
|
|
@ -34,4 +34,4 @@ const routes: Routes = [
|
|||
AddonMessagesSettingsPage,
|
||||
],
|
||||
})
|
||||
export class AddonMessagesSettingsLazyModule {}
|
||||
export default class AddonMessagesSettingsLazyModule {}
|
||||
|
|
|
@ -58,13 +58,13 @@ export async function getMessagesServices(): Promise<Type<unknown>[]> {
|
|||
const mainMenuChildrenRoutes: Routes = [
|
||||
{
|
||||
path: AddonMessagesMainMenuHandlerService.PAGE_NAME,
|
||||
loadChildren: () => import('./messages-lazy.module').then(m => m.AddonMessagesLazyModule),
|
||||
loadChildren: () => import('./messages-lazy.module'),
|
||||
},
|
||||
];
|
||||
const preferencesRoutes: Routes = [
|
||||
{
|
||||
path: AddonMessagesSettingsHandlerService.PAGE_NAME,
|
||||
loadChildren: () => import('./messages-settings-lazy.module').then(m => m.AddonMessagesSettingsLazyModule),
|
||||
loadChildren: () => import('./messages-settings-lazy.module'),
|
||||
},
|
||||
];
|
||||
|
||||
|
|
|
@ -15,7 +15,6 @@
|
|||
import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core';
|
||||
import { CoreSites } from '@services/sites';
|
||||
import {
|
||||
AddonMessagesProvider,
|
||||
AddonMessagesGetContactsWSResponse,
|
||||
AddonMessagesSearchContactsContact,
|
||||
AddonMessagesGetContactsContact,
|
||||
|
@ -29,6 +28,7 @@ import { CoreScreen } from '@services/screen';
|
|||
import { CoreNavigator } from '@services/navigator';
|
||||
import { CoreSplitViewComponent } from '@components/split-view/split-view';
|
||||
import { CoreKeyboard } from '@singletons/keyboard';
|
||||
import { ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT } from '@addons/messages/constants';
|
||||
|
||||
/**
|
||||
* Page that displays the list of contacts.
|
||||
|
@ -36,7 +36,7 @@ import { CoreKeyboard } from '@singletons/keyboard';
|
|||
@Component({
|
||||
selector: 'addon-messages-contacts',
|
||||
templateUrl: 'contacts.html',
|
||||
styleUrls: ['../../messages-common.scss'],
|
||||
styleUrl: '../../messages-common.scss',
|
||||
})
|
||||
export class AddonMessagesContacts35Page implements OnInit, OnDestroy {
|
||||
|
||||
|
@ -73,7 +73,7 @@ export class AddonMessagesContacts35Page implements OnInit, OnDestroy {
|
|||
|
||||
// Refresh the list when a contact request is confirmed.
|
||||
this.memberInfoObserver = CoreEvents.on(
|
||||
AddonMessagesProvider.MEMBER_INFO_CHANGED_EVENT,
|
||||
ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT,
|
||||
(data) => {
|
||||
if (data.contactRequestConfirmed) {
|
||||
this.refreshData();
|
||||
|
|
|
@ -18,12 +18,12 @@ import { CoreSites } from '@services/sites';
|
|||
import {
|
||||
AddonMessages,
|
||||
AddonMessagesConversationMember,
|
||||
AddonMessagesProvider,
|
||||
} from '../../services/messages';
|
||||
import { CoreNavigator } from '@services/navigator';
|
||||
import { CoreScreen } from '@services/screen';
|
||||
import { CoreDomUtils } from '@services/utils/dom';
|
||||
import { CoreSplitViewComponent } from '@components/split-view/split-view';
|
||||
import { ADDON_MESSAGES_CONTACT_REQUESTS_COUNT_EVENT, ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT } from '@addons/messages/constants';
|
||||
|
||||
/**
|
||||
* Page that displays contacts and contact requests.
|
||||
|
@ -31,9 +31,7 @@ import { CoreSplitViewComponent } from '@components/split-view/split-view';
|
|||
@Component({
|
||||
selector: 'page-addon-messages-contacts',
|
||||
templateUrl: 'contacts.html',
|
||||
styleUrls: [
|
||||
'../../messages-common.scss',
|
||||
],
|
||||
styleUrl: '../../messages-common.scss',
|
||||
})
|
||||
export class AddonMessagesContactsPage implements OnInit, OnDestroy {
|
||||
|
||||
|
@ -65,7 +63,7 @@ export class AddonMessagesContactsPage implements OnInit, OnDestroy {
|
|||
|
||||
// Update the contact requests badge.
|
||||
this.contactRequestsCountObserver = CoreEvents.on(
|
||||
AddonMessagesProvider.CONTACT_REQUESTS_COUNT_EVENT,
|
||||
ADDON_MESSAGES_CONTACT_REQUESTS_COUNT_EVENT,
|
||||
(data) => {
|
||||
this.requestsBadge = data.count > 0 ? String(data.count) : '';
|
||||
},
|
||||
|
@ -74,7 +72,7 @@ export class AddonMessagesContactsPage implements OnInit, OnDestroy {
|
|||
|
||||
// Update block status of a user.
|
||||
this.memberInfoObserver = CoreEvents.on(
|
||||
AddonMessagesProvider.MEMBER_INFO_CHANGED_EVENT,
|
||||
ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT,
|
||||
(data) => {
|
||||
if (data.userBlocked || data.userUnblocked) {
|
||||
const user = this.confirmedContacts.find((user) => user.id == data.userId);
|
||||
|
|
|
@ -18,20 +18,18 @@ import { AlertOptions } from '@ionic/core';
|
|||
import { CoreEventObserver, CoreEvents } from '@singletons/events';
|
||||
import { CoreSites } from '@services/sites';
|
||||
import {
|
||||
AddonMessagesProvider,
|
||||
AddonMessagesConversationFormatted,
|
||||
AddonMessagesConversationMember,
|
||||
AddonMessagesGetMessagesMessage,
|
||||
AddonMessages,
|
||||
AddonMessagesConversationMessageFormatted,
|
||||
AddonMessagesSendMessageResults,
|
||||
AddonMessagesUpdateConversationAction,
|
||||
} from '../../services/messages';
|
||||
import { AddonMessagesOffline, AddonMessagesOfflineMessagesDBRecordFormatted } from '../../services/messages-offline';
|
||||
import { AddonMessagesSync, AddonMessagesSyncProvider } from '../../services/messages-sync';
|
||||
import { AddonMessagesSync } from '../../services/messages-sync';
|
||||
import { CoreUser } from '@features/user/services/user';
|
||||
import { CoreDomUtils } from '@services/utils/dom';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
import { CoreLogger } from '@singletons/logger';
|
||||
import { CoreInfiniteLoadingComponent } from '@components/infinite-loading/infinite-loading';
|
||||
import { Md5 } from 'ts-md5/dist/md5';
|
||||
|
@ -48,6 +46,18 @@ import { CoreText } from '@singletons/text';
|
|||
import { CoreWait } from '@singletons/wait';
|
||||
import { CoreModals } from '@services/modals';
|
||||
import { CoreLoadings } from '@services/loadings';
|
||||
import {
|
||||
ADDON_MESSAGES_AUTO_SYNCED,
|
||||
ADDON_MESSAGES_LIMIT_MESSAGES,
|
||||
ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT,
|
||||
ADDON_MESSAGES_NEW_MESSAGE_EVENT,
|
||||
ADDON_MESSAGES_OPEN_CONVERSATION_EVENT,
|
||||
ADDON_MESSAGES_POLL_INTERVAL,
|
||||
ADDON_MESSAGES_READ_CHANGED_EVENT,
|
||||
ADDON_MESSAGES_UPDATE_CONVERSATION_LIST_EVENT,
|
||||
AddonMessagesMessageConversationType,
|
||||
AddonMessagesUpdateConversationAction,
|
||||
} from '@addons/messages/constants';
|
||||
|
||||
/**
|
||||
* Page that displays a message discussion page.
|
||||
|
@ -125,7 +135,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView
|
|||
this.logger = CoreLogger.getInstance('AddonMessagesDiscussionPage');
|
||||
|
||||
// Refresh data if this discussion is synchronized automatically.
|
||||
this.syncObserver = CoreEvents.on(AddonMessagesSyncProvider.AUTO_SYNCED, (data) => {
|
||||
this.syncObserver = CoreEvents.on(ADDON_MESSAGES_AUTO_SYNCED, (data) => {
|
||||
if ((data.userId && data.userId == this.userId) ||
|
||||
(data.conversationId && data.conversationId == this.conversationId)) {
|
||||
// Fetch messages.
|
||||
|
@ -140,7 +150,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView
|
|||
|
||||
// Refresh data if info of a mamber of the conversation have changed.
|
||||
this.memberInfoObserver = CoreEvents.on(
|
||||
AddonMessagesProvider.MEMBER_INFO_CHANGED_EVENT,
|
||||
ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT,
|
||||
(data) => {
|
||||
if (data.userId && (this.members[data.userId] || this.otherMember && data.userId == this.otherMember.id)) {
|
||||
this.fetchData();
|
||||
|
@ -595,13 +605,13 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView
|
|||
this.conversationId = this.conversation.id;
|
||||
this.title = this.conversation.name;
|
||||
this.conversationImage = this.conversation.imageurl;
|
||||
this.isGroup = this.conversation.type == AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_GROUP;
|
||||
this.isGroup = this.conversation.type === AddonMessagesMessageConversationType.GROUP;
|
||||
this.favouriteIcon = 'fas-star';
|
||||
this.muteIcon = this.conversation.ismuted ? 'fas-bell' : 'fas-bell-slash';
|
||||
if (!this.isGroup) {
|
||||
this.userId = this.conversation.userid;
|
||||
}
|
||||
this.isSelf = this.conversation.type == AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_SELF;
|
||||
this.isSelf = this.conversation.type === AddonMessagesMessageConversationType.SELF;
|
||||
|
||||
return true;
|
||||
} else {
|
||||
|
@ -645,7 +655,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView
|
|||
const messages: AddonMessagesConversationMessageFormatted[] = result.messages;
|
||||
|
||||
if (pagesToLoad > 0 && result.canLoadMore) {
|
||||
offset += AddonMessagesProvider.LIMIT_MESSAGES;
|
||||
offset += ADDON_MESSAGES_LIMIT_MESSAGES;
|
||||
|
||||
// Get more messages.
|
||||
const nextMessages = await this.getConversationMessages(pagesToLoad, offset);
|
||||
|
@ -764,7 +774,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView
|
|||
}
|
||||
|
||||
if (readChanged) {
|
||||
CoreEvents.trigger(AddonMessagesProvider.READ_CHANGED_EVENT, {
|
||||
CoreEvents.trigger(ADDON_MESSAGES_READ_CHANGED_EVENT, {
|
||||
conversationId: this.conversationId,
|
||||
userId: this.userId,
|
||||
}, this.siteId);
|
||||
|
@ -789,7 +799,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView
|
|||
|
||||
if (trigger) {
|
||||
// Update discussions last message.
|
||||
CoreEvents.trigger(AddonMessagesProvider.NEW_MESSAGE_EVENT, {
|
||||
CoreEvents.trigger(ADDON_MESSAGES_NEW_MESSAGE_EVENT, {
|
||||
conversationId: this.conversationId,
|
||||
userId: this.userId,
|
||||
message: this.lastMessage?.text,
|
||||
|
@ -887,7 +897,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView
|
|||
}
|
||||
|
||||
await CoreWait.wait(400);
|
||||
await CoreUtils.ignoreErrors(this.waitForFetch());
|
||||
await CorePromiseUtils.ignoreErrors(this.waitForFetch());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -905,7 +915,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView
|
|||
this.fetchMessages().catch(() => {
|
||||
// Ignore errors.
|
||||
});
|
||||
}, AddonMessagesProvider.POLL_INTERVAL);
|
||||
}, ADDON_MESSAGES_POLL_INTERVAL);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1265,7 +1275,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView
|
|||
if (splitViewLoaded) {
|
||||
// Notify the left pane to load it, this way the right conversation will be highlighted.
|
||||
CoreEvents.trigger(
|
||||
AddonMessagesProvider.OPEN_CONVERSATION_EVENT,
|
||||
ADDON_MESSAGES_OPEN_CONVERSATION_EVENT,
|
||||
{ userId },
|
||||
this.siteId,
|
||||
);
|
||||
|
@ -1300,7 +1310,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView
|
|||
// Get the conversation data so it's cached. Don't block the user for this.
|
||||
AddonMessages.getConversation(this.conversation.id, undefined, true);
|
||||
|
||||
CoreEvents.trigger(AddonMessagesProvider.UPDATE_CONVERSATION_LIST_EVENT, {
|
||||
CoreEvents.trigger(ADDON_MESSAGES_UPDATE_CONVERSATION_LIST_EVENT, {
|
||||
conversationId: this.conversation.id,
|
||||
action: AddonMessagesUpdateConversationAction.FAVOURITE,
|
||||
value: this.conversation.isfavourite,
|
||||
|
@ -1332,7 +1342,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView
|
|||
// Get the conversation data so it's cached. Don't block the user for this.
|
||||
AddonMessages.getConversation(this.conversation.id, undefined, true);
|
||||
|
||||
CoreEvents.trigger(AddonMessagesProvider.UPDATE_CONVERSATION_LIST_EVENT, {
|
||||
CoreEvents.trigger(ADDON_MESSAGES_UPDATE_CONVERSATION_LIST_EVENT, {
|
||||
conversationId: this.conversation.id,
|
||||
action: AddonMessagesUpdateConversationAction.MUTE,
|
||||
value: this.conversation.ismuted,
|
||||
|
@ -1447,7 +1457,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView
|
|||
await AddonMessages.deleteConversation(this.conversation.id);
|
||||
|
||||
CoreEvents.trigger(
|
||||
AddonMessagesProvider.UPDATE_CONVERSATION_LIST_EVENT,
|
||||
ADDON_MESSAGES_UPDATE_CONVERSATION_LIST_EVENT,
|
||||
{
|
||||
conversationId: this.conversation.id,
|
||||
action: AddonMessagesUpdateConversationAction.DELETE,
|
||||
|
|
|
@ -19,10 +19,9 @@ import {
|
|||
AddonMessages,
|
||||
AddonMessagesDiscussion,
|
||||
AddonMessagesMessageAreaContact,
|
||||
AddonMessagesProvider,
|
||||
} from '../../services/messages';
|
||||
import { CoreDomUtils } from '@services/utils/dom';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreUtils } from '@singletons/utils';
|
||||
import { ActivatedRoute, Params } from '@angular/router';
|
||||
import { CorePushNotificationsNotificationBasicData } from '@features/pushnotifications/services/pushnotifications';
|
||||
import { CorePushNotificationsDelegate } from '@features/pushnotifications/services/push-delegate';
|
||||
|
@ -33,6 +32,8 @@ import { CoreScreen } from '@services/screen';
|
|||
import { CorePlatform } from '@services/platform';
|
||||
import { CoreSplitViewComponent } from '@components/split-view/split-view';
|
||||
import { CoreKeyboard } from '@singletons/keyboard';
|
||||
import { ADDON_MESSAGES_NEW_MESSAGE_EVENT, ADDON_MESSAGES_READ_CHANGED_EVENT } from '@addons/messages/constants';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
|
||||
/**
|
||||
* Page that displays the list of discussions.
|
||||
|
@ -40,7 +41,7 @@ import { CoreKeyboard } from '@singletons/keyboard';
|
|||
@Component({
|
||||
selector: 'addon-messages-discussions',
|
||||
templateUrl: 'discussions.html',
|
||||
styleUrls: ['../../messages-common.scss'],
|
||||
styleUrl: '../../messages-common.scss',
|
||||
})
|
||||
export class AddonMessagesDiscussions35Page implements OnInit, OnDestroy {
|
||||
|
||||
|
@ -75,7 +76,7 @@ export class AddonMessagesDiscussions35Page implements OnInit, OnDestroy {
|
|||
|
||||
// Update discussions when new message is received.
|
||||
this.newMessagesObserver = CoreEvents.on(
|
||||
AddonMessagesProvider.NEW_MESSAGE_EVENT,
|
||||
ADDON_MESSAGES_NEW_MESSAGE_EVENT,
|
||||
(data) => {
|
||||
if (data.userId && this.discussions) {
|
||||
const discussion = this.discussions.find((disc) => disc.message?.user === data.userId);
|
||||
|
@ -97,7 +98,7 @@ export class AddonMessagesDiscussions35Page implements OnInit, OnDestroy {
|
|||
|
||||
// Update discussions when a message is read.
|
||||
this.readChangedObserver = CoreEvents.on(
|
||||
AddonMessagesProvider.READ_CHANGED_EVENT,
|
||||
ADDON_MESSAGES_READ_CHANGED_EVENT,
|
||||
(data) => {
|
||||
if (data.userId && this.discussions) {
|
||||
const discussion = this.discussions.find((disc) => disc.message?.user === data.userId);
|
||||
|
@ -170,7 +171,7 @@ export class AddonMessagesDiscussions35Page implements OnInit, OnDestroy {
|
|||
promises.push(AddonMessages.invalidateUnreadConversationCounts(this.siteId));
|
||||
}
|
||||
|
||||
await CoreUtils.allPromises(promises).finally(() => this.fetchData().finally(() => {
|
||||
await CorePromiseUtils.allPromises(promises).finally(() => this.fetchData().finally(() => {
|
||||
if (refresher) {
|
||||
refresher?.complete();
|
||||
}
|
||||
|
|
|
@ -17,12 +17,10 @@ import { AccordionGroupChangeEventDetail, IonAccordionGroup, IonContent } from '
|
|||
import { CoreEventObserver, CoreEvents } from '@singletons/events';
|
||||
import { CoreSites } from '@services/sites';
|
||||
import {
|
||||
AddonMessagesProvider,
|
||||
AddonMessagesConversationFormatted,
|
||||
AddonMessages,
|
||||
AddonMessagesNewMessagedEventData,
|
||||
AddonMessagesUnreadConversationCountsEventData,
|
||||
AddonMessagesUpdateConversationAction,
|
||||
} from '../../services/messages';
|
||||
import {
|
||||
AddonMessagesOffline,
|
||||
|
@ -35,11 +33,22 @@ import { Translate } from '@singletons';
|
|||
import { Subscription } from 'rxjs';
|
||||
import { CorePushNotificationsNotificationBasicData } from '@features/pushnotifications/services/pushnotifications';
|
||||
import { ActivatedRoute, Params } from '@angular/router';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreUtils } from '@singletons/utils';
|
||||
import { CoreNavigator } from '@services/navigator';
|
||||
import { CoreScreen } from '@services/screen';
|
||||
import { CorePlatform } from '@services/platform';
|
||||
import { CoreSplitViewComponent } from '@components/split-view/split-view';
|
||||
import {
|
||||
ADDON_MESSAGES_CONTACT_REQUESTS_COUNT_EVENT,
|
||||
ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT,
|
||||
ADDON_MESSAGES_NEW_MESSAGE_EVENT,
|
||||
ADDON_MESSAGES_OPEN_CONVERSATION_EVENT,
|
||||
ADDON_MESSAGES_READ_CHANGED_EVENT,
|
||||
ADDON_MESSAGES_UNREAD_CONVERSATION_COUNTS_EVENT,
|
||||
ADDON_MESSAGES_UPDATE_CONVERSATION_LIST_EVENT,
|
||||
AddonMessagesMessageConversationType,
|
||||
AddonMessagesUpdateConversationAction,
|
||||
} from '@addons/messages/constants';
|
||||
|
||||
const enum AddonMessagesGroupConversationOptionNames {
|
||||
FAVOURITES = 'favourites',
|
||||
|
@ -53,7 +62,7 @@ const enum AddonMessagesGroupConversationOptionNames {
|
|||
@Component({
|
||||
selector: 'page-addon-messages-group-conversations',
|
||||
templateUrl: 'group-conversations.html',
|
||||
styleUrls: ['../../messages-common.scss'],
|
||||
styleUrl: '../../messages-common.scss',
|
||||
})
|
||||
export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
|
||||
|
||||
|
@ -82,7 +91,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
|
|||
optionName: AddonMessagesGroupConversationOptionNames.GROUP,
|
||||
titleString: 'addon.messages.groupconversations',
|
||||
emptyString: 'addon.messages.nogroupconversations',
|
||||
type: AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_GROUP,
|
||||
type: AddonMessagesMessageConversationType.GROUP,
|
||||
favourites: false,
|
||||
count: 0,
|
||||
unread: 0,
|
||||
|
@ -92,7 +101,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
|
|||
optionName: AddonMessagesGroupConversationOptionNames.INDIVIDUAL,
|
||||
titleString: 'addon.messages.individualconversations',
|
||||
emptyString: 'addon.messages.noindividualconversations',
|
||||
type: AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_INDIVIDUAL,
|
||||
type: AddonMessagesMessageConversationType.INDIVIDUAL,
|
||||
favourites: false,
|
||||
count: 0,
|
||||
unread: 0,
|
||||
|
@ -100,7 +109,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
|
|||
},
|
||||
];
|
||||
|
||||
typeGroup = AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_GROUP;
|
||||
typeGroup = AddonMessagesMessageConversationType.GROUP;
|
||||
|
||||
protected siteId: string;
|
||||
protected currentUserId: number;
|
||||
|
@ -124,7 +133,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
|
|||
|
||||
// Update conversations when new message is received.
|
||||
this.newMessagesObserver = CoreEvents.on(
|
||||
AddonMessagesProvider.NEW_MESSAGE_EVENT,
|
||||
ADDON_MESSAGES_NEW_MESSAGE_EVENT,
|
||||
(data) => {
|
||||
// Check if the new message belongs to the option that is currently expanded.
|
||||
const expandedOption = this.getExpandedOption();
|
||||
|
@ -163,7 +172,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
|
|||
conversation.lastmessagedate = data.timecreated / 1000;
|
||||
if (data.userFrom) {
|
||||
conversation.sentfromcurrentuser = data.userFrom.id === this.currentUserId;
|
||||
if (conversation.type === AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_GROUP) {
|
||||
if (conversation.type === AddonMessagesMessageConversationType.GROUP) {
|
||||
conversation.members[0] = data.userFrom;
|
||||
}
|
||||
}
|
||||
|
@ -183,7 +192,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
|
|||
);
|
||||
|
||||
// Update conversations when a message is read.
|
||||
this.readChangedObserver = CoreEvents.on(AddonMessagesProvider.READ_CHANGED_EVENT, (data) => {
|
||||
this.readChangedObserver = CoreEvents.on(ADDON_MESSAGES_READ_CHANGED_EVENT, (data) => {
|
||||
if (data.conversationId) {
|
||||
const conversation = this.findConversation(data.conversationId);
|
||||
|
||||
|
@ -200,7 +209,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
|
|||
|
||||
// Load a discussion if we receive an event to do so.
|
||||
this.openConversationObserver = CoreEvents.on(
|
||||
AddonMessagesProvider.OPEN_CONVERSATION_EVENT,
|
||||
ADDON_MESSAGES_OPEN_CONVERSATION_EVENT,
|
||||
(data) => {
|
||||
if (data.conversationId || data.userId) {
|
||||
this.gotoConversation(data.conversationId, data.userId);
|
||||
|
@ -222,7 +231,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
|
|||
|
||||
// Update conversations if we receive an event to do so.
|
||||
this.updateConversationListObserver = CoreEvents.on(
|
||||
AddonMessagesProvider.UPDATE_CONVERSATION_LIST_EVENT,
|
||||
ADDON_MESSAGES_UPDATE_CONVERSATION_LIST_EVENT,
|
||||
(data) => {
|
||||
if (data?.action === AddonMessagesUpdateConversationAction.MUTE) {
|
||||
// If the conversation is displayed, change its muted value.
|
||||
|
@ -256,7 +265,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
|
|||
|
||||
// Update unread conversation counts.
|
||||
this.cronObserver = CoreEvents.on(
|
||||
AddonMessagesProvider.UNREAD_CONVERSATION_COUNTS_EVENT,
|
||||
ADDON_MESSAGES_UNREAD_CONVERSATION_COUNTS_EVENT,
|
||||
(data) => {
|
||||
this.setCounts(data, 'unread');
|
||||
},
|
||||
|
@ -265,7 +274,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
|
|||
|
||||
// Update the contact requests badge.
|
||||
this.contactRequestsCountObserver = CoreEvents.on(
|
||||
AddonMessagesProvider.CONTACT_REQUESTS_COUNT_EVENT,
|
||||
ADDON_MESSAGES_CONTACT_REQUESTS_COUNT_EVENT,
|
||||
(data) => {
|
||||
this.contactRequestsCount = data.count;
|
||||
},
|
||||
|
@ -274,7 +283,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
|
|||
|
||||
// Update block status of a user.
|
||||
this.memberInfoObserver = CoreEvents.on(
|
||||
AddonMessagesProvider.MEMBER_INFO_CHANGED_EVENT,
|
||||
ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT,
|
||||
(data) => {
|
||||
if (!data.userBlocked && !data.userUnblocked) {
|
||||
// The block status has not changed, ignore.
|
||||
|
@ -638,7 +647,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
|
|||
// Conversation not found, it could be an old one or the message could belong to another option.
|
||||
conversation = {
|
||||
id: message.conversationid,
|
||||
type: message.conversation?.type || AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_INDIVIDUAL,
|
||||
type: message.conversation?.type || AddonMessagesMessageConversationType.INDIVIDUAL,
|
||||
membercount: message.conversation?.membercount || 0,
|
||||
ismuted: message.conversation?.ismuted || false,
|
||||
isfavourite: message.conversation?.isfavourite || false,
|
||||
|
@ -657,7 +666,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
|
|||
this.addOfflineConversation(conversation, option);
|
||||
}
|
||||
}
|
||||
} else if (option.type === AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_INDIVIDUAL) {
|
||||
} else if (option.type === AddonMessagesMessageConversationType.INDIVIDUAL) {
|
||||
// It's a new conversation. Check if we already created it (there is more than one message for the same user).
|
||||
const conversation = this.findConversation(undefined, message.touserid, option);
|
||||
|
||||
|
@ -675,7 +684,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
|
|||
}).then((user) => {
|
||||
const conversation: AddonMessagesConversationForList = {
|
||||
id: 0,
|
||||
type: AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_INDIVIDUAL,
|
||||
type: AddonMessagesMessageConversationType.INDIVIDUAL,
|
||||
membercount: 0, // Faked data.
|
||||
ismuted: false, // Faked data.
|
||||
isfavourite: false, // Faked data.
|
||||
|
@ -742,7 +751,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
|
|||
return AddonMessagesGroupConversationOptionNames.FAVOURITES;
|
||||
}
|
||||
|
||||
if (conversation.type === AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_GROUP) {
|
||||
if (conversation.type === AddonMessagesMessageConversationType.GROUP) {
|
||||
return AddonMessagesGroupConversationOptionNames.GROUP;
|
||||
}
|
||||
|
||||
|
|
|
@ -16,7 +16,6 @@ import { Component, OnDestroy, ViewChild } from '@angular/core';
|
|||
import { CoreEventObserver, CoreEvents } from '@singletons/events';
|
||||
import { CoreSites } from '@services/sites';
|
||||
import {
|
||||
AddonMessagesProvider,
|
||||
AddonMessagesConversationMember,
|
||||
AddonMessagesMessageAreaContact,
|
||||
AddonMessages,
|
||||
|
@ -26,6 +25,11 @@ import { CoreNavigator } from '@services/navigator';
|
|||
import { CoreScreen } from '@services/screen';
|
||||
import { CoreSplitViewComponent } from '@components/split-view/split-view';
|
||||
import { CoreKeyboard } from '@singletons/keyboard';
|
||||
import {
|
||||
ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT,
|
||||
ADDON_MESSAGES_LIMIT_SEARCH,
|
||||
ADDON_MESSAGES_LIMIT_INITIAL_USER_SEARCH,
|
||||
} from '@addons/messages/constants';
|
||||
|
||||
/**
|
||||
* Page for searching users.
|
||||
|
@ -74,7 +78,7 @@ export class AddonMessagesSearchPage implements OnDestroy {
|
|||
constructor() {
|
||||
// Update block status of a user.
|
||||
this.memberInfoObserver = CoreEvents.on(
|
||||
AddonMessagesProvider.MEMBER_INFO_CHANGED_EVENT,
|
||||
ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT,
|
||||
(data) => {
|
||||
if (!data.userBlocked && !data.userUnblocked) {
|
||||
// The block status has not changed, ignore.
|
||||
|
@ -139,7 +143,7 @@ export class AddonMessagesSearchPage implements OnDestroy {
|
|||
let canLoadMoreMessages = false;
|
||||
|
||||
if (!loadMore || loadMore == 'contacts' || loadMore == 'noncontacts') {
|
||||
const limitNum = loadMore ? AddonMessagesProvider.LIMIT_SEARCH : AddonMessagesProvider.LIMIT_INITIAL_USER_SEARCH;
|
||||
const limitNum = loadMore ? ADDON_MESSAGES_LIMIT_SEARCH : ADDON_MESSAGES_LIMIT_INITIAL_USER_SEARCH;
|
||||
let limitFrom = 0;
|
||||
if (loadMore == 'contacts') {
|
||||
limitFrom = this.contacts.results.length;
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
import { Component, OnDestroy, OnInit, signal } from '@angular/core';
|
||||
import {
|
||||
AddonMessagesProvider, AddonMessagesMessagePreferences,
|
||||
AddonMessagesMessagePreferences,
|
||||
AddonMessagesMessagePreferencesNotification,
|
||||
AddonMessagesMessagePreferencesNotificationProcessor,
|
||||
AddonMessages,
|
||||
|
@ -29,6 +29,7 @@ import { AddonNotificationsPreferencesNotificationProcessorState } from '@addons
|
|||
import { CorePlatform } from '@services/platform';
|
||||
import { CoreErrorHelper } from '@services/error-helper';
|
||||
import { CoreLoadings } from '@services/loadings';
|
||||
import { ADDON_MESSAGES_NOTIFICATION_PREFERENCES_KEY, AddonMessagesMessagePrivacy } from '@addons/messages/constants';
|
||||
|
||||
/**
|
||||
* Page that displays the messages settings page.
|
||||
|
@ -46,9 +47,9 @@ export class AddonMessagesSettingsPage implements OnInit, OnDestroy {
|
|||
contactablePrivacy?: number | boolean;
|
||||
advancedContactable = false; // Whether the site supports "advanced" contactable privacy.
|
||||
allowSiteMessaging = false;
|
||||
onlyContactsValue = AddonMessagesProvider.MESSAGE_PRIVACY_ONLYCONTACTS;
|
||||
courseMemberValue = AddonMessagesProvider.MESSAGE_PRIVACY_COURSEMEMBER;
|
||||
siteValue = AddonMessagesProvider.MESSAGE_PRIVACY_SITE;
|
||||
onlyContactsValue = AddonMessagesMessagePrivacy.ONLYCONTACTS;
|
||||
courseMemberValue = AddonMessagesMessagePrivacy.COURSEMEMBER;
|
||||
siteValue = AddonMessagesMessagePrivacy.SITE;
|
||||
groupMessagingEnabled = false;
|
||||
sendOnEnter = false;
|
||||
warningMessage = signal<string | undefined>(undefined);
|
||||
|
@ -91,7 +92,7 @@ export class AddonMessagesSettingsPage implements OnInit, OnDestroy {
|
|||
for (const component of preferences.components) {
|
||||
// Only display get the notification preferences.
|
||||
component.notifications = component.notifications.filter((notification) =>
|
||||
notification.preferencekey == AddonMessagesProvider.NOTIFICATION_PREFERENCES_KEY);
|
||||
notification.preferencekey === ADDON_MESSAGES_NOTIFICATION_PREFERENCES_KEY);
|
||||
|
||||
if (this.loggedInOffLegacyMode) {
|
||||
// Load enabled from loggedin / loggedoff values.
|
||||
|
|
|
@ -14,20 +14,23 @@
|
|||
|
||||
import { Injectable } from '@angular/core';
|
||||
import {
|
||||
AddonMessagesProvider,
|
||||
AddonMessages,
|
||||
} from '../messages';
|
||||
import { CoreMainMenuHandler, CoreMainMenuHandlerToDisplay } from '@features/mainmenu/services/mainmenu-delegate';
|
||||
import { CoreCronHandler } from '@services/cron';
|
||||
import { CoreSites } from '@services/sites';
|
||||
import { CoreEvents } from '@singletons/events';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreUtils } from '@singletons/utils';
|
||||
import {
|
||||
CorePushNotificationsNotificationBasicData,
|
||||
} from '@features/pushnotifications/services/pushnotifications';
|
||||
import { CorePushNotificationsDelegate } from '@features/pushnotifications/services/push-delegate';
|
||||
import { makeSingleton } from '@singletons';
|
||||
import { CoreMainMenuProvider } from '@features/mainmenu/services/mainmenu';
|
||||
import {
|
||||
ADDON_MESSAGES_UNREAD_CONVERSATION_COUNTS_EVENT,
|
||||
ADDON_MESSAGES_CONTACT_REQUESTS_COUNT_EVENT,
|
||||
} from '@addons/messages/constants';
|
||||
import { MAIN_MENU_HANDLER_BADGE_UPDATED_EVENT } from '@features/mainmenu/constants';
|
||||
|
||||
/**
|
||||
* Handler to inject an option into main menu.
|
||||
|
@ -58,14 +61,14 @@ export class AddonMessagesMainMenuHandlerService implements CoreMainMenuHandler,
|
|||
|
||||
constructor() {
|
||||
|
||||
CoreEvents.on(AddonMessagesProvider.UNREAD_CONVERSATION_COUNTS_EVENT, (data) => {
|
||||
CoreEvents.on(ADDON_MESSAGES_UNREAD_CONVERSATION_COUNTS_EVENT, (data) => {
|
||||
this.unreadCount = data.favourites + data.individual + data.group + data.self;
|
||||
this.orMore = !!data.orMore;
|
||||
|
||||
data.siteId && this.updateBadge(data.siteId);
|
||||
});
|
||||
|
||||
CoreEvents.on(AddonMessagesProvider.CONTACT_REQUESTS_COUNT_EVENT, (data) => {
|
||||
CoreEvents.on(ADDON_MESSAGES_CONTACT_REQUESTS_COUNT_EVENT, (data) => {
|
||||
this.contactRequestsCount = data.count;
|
||||
|
||||
data.siteId && this.updateBadge(data.siteId);
|
||||
|
@ -174,7 +177,7 @@ export class AddonMessagesMainMenuHandlerService implements CoreMainMenuHandler,
|
|||
|
||||
// Update push notifications badge.
|
||||
CoreEvents.trigger(
|
||||
CoreMainMenuProvider.MAIN_MENU_HANDLER_BADGE_UPDATED,
|
||||
MAIN_MENU_HANDLER_BADGE_UPDATED_EVENT,
|
||||
{
|
||||
handler: AddonMessagesMainMenuHandlerService.name,
|
||||
value: totalCount,
|
||||
|
|
|
@ -16,7 +16,7 @@ import { Injectable } from '@angular/core';
|
|||
import { CorePushNotificationsClickHandler } from '@features/pushnotifications/services/push-delegate';
|
||||
import { CorePushNotificationsNotificationBasicData } from '@features/pushnotifications/services/pushnotifications';
|
||||
import { CoreNavigator } from '@services/navigator';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreUtils } from '@singletons/utils';
|
||||
import { makeSingleton } from '@singletons';
|
||||
import { AddonMessages } from '../messages';
|
||||
import { AddonMessagesMainMenuHandlerService } from './mainmenu';
|
||||
|
|
|
@ -18,12 +18,11 @@ import {
|
|||
AddonMessagesOffline, AddonMessagesOfflineAnyMessagesFormatted,
|
||||
} from './messages-offline';
|
||||
import {
|
||||
AddonMessagesProvider,
|
||||
AddonMessages,
|
||||
AddonMessagesGetMessagesWSParams,
|
||||
} from './messages';
|
||||
import { CoreEvents } from '@singletons/events';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreWSError } from '@classes/errors/wserror';
|
||||
import { makeSingleton, Translate } from '@singletons';
|
||||
import { CoreSites } from '@services/sites';
|
||||
import { CoreNetwork } from '@services/network';
|
||||
|
@ -33,6 +32,20 @@ import { CoreError } from '@classes/errors/error';
|
|||
import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site';
|
||||
import { CoreWait } from '@singletons/wait';
|
||||
import { CoreErrorHelper, CoreErrorObject } from '@services/error-helper';
|
||||
import { ADDON_MESSAGES_AUTO_SYNCED, ADDON_MESSAGES_LIMIT_MESSAGES } from '../constants';
|
||||
|
||||
declare module '@singletons/events' {
|
||||
|
||||
/**
|
||||
* Augment CoreEventsData interface with events specific to this service.
|
||||
*
|
||||
* @see https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation
|
||||
*/
|
||||
export interface CoreEventsData {
|
||||
[ADDON_MESSAGES_AUTO_SYNCED]: AddonMessagesSyncEvents;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Service to sync messages.
|
||||
|
@ -40,8 +53,6 @@ import { CoreErrorHelper, CoreErrorObject } from '@services/error-helper';
|
|||
@Injectable({ providedIn: 'root' })
|
||||
export class AddonMessagesSyncProvider extends CoreSyncBaseProvider<AddonMessagesSyncEvents> {
|
||||
|
||||
static readonly AUTO_SYNCED = 'addon_messages_autom_synced';
|
||||
|
||||
constructor() {
|
||||
super('AddonMessagesSync');
|
||||
}
|
||||
|
@ -113,7 +124,7 @@ export class AddonMessagesSyncProvider extends CoreSyncBaseProvider<AddonMessage
|
|||
}
|
||||
|
||||
// Sync successful, send event.
|
||||
CoreEvents.trigger(AddonMessagesSyncProvider.AUTO_SYNCED, result, siteId);
|
||||
CoreEvents.trigger(ADDON_MESSAGES_AUTO_SYNCED, result, siteId);
|
||||
|
||||
return;
|
||||
}));
|
||||
|
@ -126,7 +137,7 @@ export class AddonMessagesSyncProvider extends CoreSyncBaseProvider<AddonMessage
|
|||
}
|
||||
|
||||
// Sync successful, send event.
|
||||
CoreEvents.trigger(AddonMessagesSyncProvider.AUTO_SYNCED, result, siteId);
|
||||
CoreEvents.trigger(ADDON_MESSAGES_AUTO_SYNCED, result, siteId);
|
||||
|
||||
return;
|
||||
}));
|
||||
|
@ -227,7 +238,7 @@ export class AddonMessagesSyncProvider extends CoreSyncBaseProvider<AddonMessage
|
|||
await AddonMessages.sendMessageOnline(userId, text, siteId);
|
||||
}
|
||||
} catch (error) {
|
||||
if (!CoreUtils.isWebServiceError(error)) {
|
||||
if (!CoreWSError.isWebServiceError(error)) {
|
||||
// Error sending, stop execution.
|
||||
if (CoreNetwork.isOnline()) {
|
||||
// App is online, unmark deviceoffline if marked.
|
||||
|
@ -305,7 +316,7 @@ export class AddonMessagesSyncProvider extends CoreSyncBaseProvider<AddonMessage
|
|||
const params: AddonMessagesGetMessagesWSParams = {
|
||||
useridto: userId,
|
||||
useridfrom: siteCurrentUserId,
|
||||
limitnum: AddonMessagesProvider.LIMIT_MESSAGES,
|
||||
limitnum: ADDON_MESSAGES_LIMIT_MESSAGES,
|
||||
};
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: AddonMessages.getCacheKeyForDiscussion(userId),
|
||||
|
|
|
@ -23,17 +23,35 @@ import {
|
|||
AddonMessagesOfflineConversationMessagesDBRecordFormatted,
|
||||
AddonMessagesOfflineMessagesDBRecordFormatted,
|
||||
} from './messages-offline';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreTimeUtils } from '@services/utils/time';
|
||||
import { CoreEvents } from '@singletons/events';
|
||||
import { CoreSite } from '@classes/sites/site';
|
||||
import { CoreWSExternalWarning } from '@services/ws';
|
||||
import { makeSingleton } from '@singletons';
|
||||
import { CoreError } from '@classes/errors/error';
|
||||
import { AddonMessagesSyncEvents, AddonMessagesSyncProvider } from './messages-sync';
|
||||
import { CoreWSError } from '@classes/errors/wserror';
|
||||
import { AddonNotificationsPreferencesNotificationProcessorState } from '@addons/notifications/services/notifications';
|
||||
import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site';
|
||||
import { CoreCacheUpdateFrequency } from '@/core/constants';
|
||||
import {
|
||||
ADDON_MESSAGES_CONTACT_REQUESTS_COUNT_EVENT,
|
||||
ADDON_MESSAGES_LIMIT_CONTACTS,
|
||||
ADDON_MESSAGES_LIMIT_INITIAL_USER_SEARCH,
|
||||
ADDON_MESSAGES_LIMIT_MESSAGES,
|
||||
ADDON_MESSAGES_LIMIT_SEARCH,
|
||||
ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT,
|
||||
ADDON_MESSAGES_NEW_MESSAGE_EVENT,
|
||||
ADDON_MESSAGES_OPEN_CONVERSATION_EVENT,
|
||||
ADDON_MESSAGES_POLL_INTERVAL,
|
||||
ADDON_MESSAGES_PUSH_SIMULATION_COMPONENT,
|
||||
ADDON_MESSAGES_READ_CHANGED_EVENT,
|
||||
ADDON_MESSAGES_UNREAD_CONVERSATION_COUNTS_EVENT,
|
||||
ADDON_MESSAGES_UPDATE_CONVERSATION_LIST_EVENT,
|
||||
AddonMessagesMessageConversationType,
|
||||
AddonMessagesMessagePrivacy,
|
||||
AddonMessagesUpdateConversationAction,
|
||||
} from '../constants';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
|
||||
declare module '@singletons/events' {
|
||||
|
||||
|
@ -43,24 +61,17 @@ declare module '@singletons/events' {
|
|||
* @see https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation
|
||||
*/
|
||||
export interface CoreEventsData {
|
||||
[AddonMessagesProvider.NEW_MESSAGE_EVENT]: AddonMessagesNewMessagedEventData;
|
||||
[AddonMessagesProvider.READ_CHANGED_EVENT]: AddonMessagesReadChangedEventData;
|
||||
[AddonMessagesProvider.OPEN_CONVERSATION_EVENT]: AddonMessagesOpenConversationEventData;
|
||||
[AddonMessagesProvider.UPDATE_CONVERSATION_LIST_EVENT]: AddonMessagesUpdateConversationListEventData;
|
||||
[AddonMessagesProvider.MEMBER_INFO_CHANGED_EVENT]: AddonMessagesMemberInfoChangedEventData;
|
||||
[AddonMessagesProvider.UNREAD_CONVERSATION_COUNTS_EVENT]: AddonMessagesUnreadConversationCountsEventData;
|
||||
[AddonMessagesProvider.CONTACT_REQUESTS_COUNT_EVENT]: AddonMessagesContactRequestCountEventData;
|
||||
[AddonMessagesSyncProvider.AUTO_SYNCED]: AddonMessagesSyncEvents;
|
||||
[ADDON_MESSAGES_NEW_MESSAGE_EVENT]: AddonMessagesNewMessagedEventData;
|
||||
[ADDON_MESSAGES_READ_CHANGED_EVENT]: AddonMessagesReadChangedEventData;
|
||||
[ADDON_MESSAGES_OPEN_CONVERSATION_EVENT]: AddonMessagesOpenConversationEventData;
|
||||
[ADDON_MESSAGES_UPDATE_CONVERSATION_LIST_EVENT]: AddonMessagesUpdateConversationListEventData;
|
||||
[ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT]: AddonMessagesMemberInfoChangedEventData;
|
||||
[ADDON_MESSAGES_UNREAD_CONVERSATION_COUNTS_EVENT]: AddonMessagesUnreadConversationCountsEventData;
|
||||
[ADDON_MESSAGES_CONTACT_REQUESTS_COUNT_EVENT]: AddonMessagesContactRequestCountEventData;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export const enum AddonMessagesUpdateConversationAction {
|
||||
MUTE = 'mute',
|
||||
FAVOURITE = 'favourite',
|
||||
DELETE = 'delete',
|
||||
}
|
||||
|
||||
/**
|
||||
* Service to handle messages.
|
||||
*/
|
||||
|
@ -69,27 +80,87 @@ export class AddonMessagesProvider {
|
|||
|
||||
protected static readonly ROOT_CACHE_KEY = 'mmaMessages:';
|
||||
|
||||
static readonly NEW_MESSAGE_EVENT = 'addon_messages_new_message_event';
|
||||
static readonly READ_CHANGED_EVENT = 'addon_messages_read_changed_event';
|
||||
static readonly OPEN_CONVERSATION_EVENT = 'addon_messages_open_conversation_event'; // Notify a conversation should be opened.
|
||||
static readonly UPDATE_CONVERSATION_LIST_EVENT = 'addon_messages_update_conversation_list_event';
|
||||
static readonly MEMBER_INFO_CHANGED_EVENT = 'addon_messages_member_changed_event';
|
||||
static readonly UNREAD_CONVERSATION_COUNTS_EVENT = 'addon_messages_unread_conversation_counts_event';
|
||||
static readonly CONTACT_REQUESTS_COUNT_EVENT = 'addon_messages_contact_requests_count_event';
|
||||
static readonly POLL_INTERVAL = 10000;
|
||||
static readonly PUSH_SIMULATION_COMPONENT = 'AddonMessagesPushSimulation';
|
||||
/**
|
||||
* @deprecated since 5.0. Use ADDON_MESSAGES_NEW_MESSAGE_EVENT instead.
|
||||
*/
|
||||
static readonly NEW_MESSAGE_EVENT = ADDON_MESSAGES_NEW_MESSAGE_EVENT;
|
||||
/**
|
||||
* @deprecated since 5.0. Use ADDON_MESSAGES_READ_CHANGED_EVENT instead.
|
||||
*/
|
||||
static readonly READ_CHANGED_EVENT = ADDON_MESSAGES_READ_CHANGED_EVENT;
|
||||
/**
|
||||
* @deprecated since 5.0. Use ADDON_MESSAGES_OPEN_CONVERSATION_EVENT instead.
|
||||
*/
|
||||
static readonly OPEN_CONVERSATION_EVENT = ADDON_MESSAGES_OPEN_CONVERSATION_EVENT;
|
||||
/**
|
||||
* @deprecated since 5.0. Use ADDON_MESSAGES_UPDATE_CONVERSATION_LIST_EVENT instead.
|
||||
*/
|
||||
static readonly UPDATE_CONVERSATION_LIST_EVENT = ADDON_MESSAGES_UPDATE_CONVERSATION_LIST_EVENT;
|
||||
/**
|
||||
* @deprecated since 5.0. Use ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT instead.
|
||||
*/
|
||||
static readonly MEMBER_INFO_CHANGED_EVENT = ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT;
|
||||
/**
|
||||
* @deprecated since 5.0. Use ADDON_MESSAGES_UNREAD_CONVERSATION_COUNTS_EVENT instead.
|
||||
*/
|
||||
static readonly UNREAD_CONVERSATION_COUNTS_EVENT = ADDON_MESSAGES_UNREAD_CONVERSATION_COUNTS_EVENT;
|
||||
/**
|
||||
* @deprecated since 5.0. Use ADDON_MESSAGES_CONTACT_REQUESTS_COUNT_EVENT instead.
|
||||
*/
|
||||
static readonly CONTACT_REQUESTS_COUNT_EVENT = ADDON_MESSAGES_CONTACT_REQUESTS_COUNT_EVENT;
|
||||
/**
|
||||
* @deprecated since 5.0. Use ADDON_MESSAGES_POLL_INTERVAL instead.
|
||||
*/
|
||||
static readonly POLL_INTERVAL = ADDON_MESSAGES_POLL_INTERVAL;
|
||||
/**
|
||||
* @deprecated since 5.0. Use ADDON_MESSAGES_PUSH_SIMULATION_COMPONENT instead.
|
||||
*/
|
||||
static readonly PUSH_SIMULATION_COMPONENT = ADDON_MESSAGES_PUSH_SIMULATION_COMPONENT;
|
||||
|
||||
static readonly MESSAGE_PRIVACY_COURSEMEMBER = 0; // Privacy setting for being messaged by anyone within courses user is member.
|
||||
static readonly MESSAGE_PRIVACY_ONLYCONTACTS = 1; // Privacy setting for being messaged only by contacts.
|
||||
static readonly MESSAGE_PRIVACY_SITE = 2; // Privacy setting for being messaged by anyone on the site.
|
||||
static readonly MESSAGE_CONVERSATION_TYPE_INDIVIDUAL = 1; // An individual conversation.
|
||||
static readonly MESSAGE_CONVERSATION_TYPE_GROUP = 2; // A group conversation.
|
||||
static readonly MESSAGE_CONVERSATION_TYPE_SELF = 3; // A self conversation.
|
||||
static readonly LIMIT_CONTACTS = 50;
|
||||
static readonly LIMIT_MESSAGES = 50;
|
||||
static readonly LIMIT_INITIAL_USER_SEARCH = 3;
|
||||
static readonly LIMIT_SEARCH = 50;
|
||||
/**
|
||||
* @deprecated since 5.0. Use AddonMessagesMessagePrivacy.COURSEMEMBER instead.
|
||||
*/
|
||||
static readonly MESSAGE_PRIVACY_COURSEMEMBER = AddonMessagesMessagePrivacy.COURSEMEMBER;
|
||||
/**
|
||||
* @deprecated since 5.0. Use AddonMessagesMessagePrivacy.ONLYCONTACTS instead.
|
||||
*/
|
||||
static readonly MESSAGE_PRIVACY_ONLYCONTACTS = AddonMessagesMessagePrivacy.ONLYCONTACTS;
|
||||
/**
|
||||
* @deprecated since 5.0. Use AddonMessagesMessagePrivacy.SITE instead.
|
||||
*/
|
||||
static readonly MESSAGE_PRIVACY_SITE = AddonMessagesMessagePrivacy.SITE;
|
||||
/**
|
||||
* @deprecated since 5.0. Use AddonMessagesMessageConversationType.INDIVIDUAL instead.
|
||||
*/
|
||||
static readonly MESSAGE_CONVERSATION_TYPE_INDIVIDUAL = AddonMessagesMessageConversationType.INDIVIDUAL;
|
||||
/**
|
||||
* @deprecated since 5.0. Use AddonMessagesMessageConversationType.GROUP instead.
|
||||
*/
|
||||
static readonly MESSAGE_CONVERSATION_TYPE_GROUP = AddonMessagesMessageConversationType.GROUP;
|
||||
/**
|
||||
* @deprecated since 5.0. Use AddonMessagesMessageConversationType.SELF instead.
|
||||
*/
|
||||
static readonly MESSAGE_CONVERSATION_TYPE_SELF = AddonMessagesMessageConversationType.SELF;
|
||||
/**
|
||||
* @deprecated since 5.0. Use ADDON_MESSAGES_LIMIT_CONTACTS instead.
|
||||
*/
|
||||
static readonly LIMIT_CONTACTS = ADDON_MESSAGES_LIMIT_CONTACTS;
|
||||
/**
|
||||
* @deprecated since 5.0. Use ADDON_MESSAGES_LIMIT_MESSAGES instead.
|
||||
*/
|
||||
static readonly LIMIT_MESSAGES = ADDON_MESSAGES_LIMIT_MESSAGES;
|
||||
/**
|
||||
* @deprecated since 5.0. Use ADDON_MESSAGES_LIMIT_INITIAL_USER_SEARCH instead.
|
||||
*/
|
||||
static readonly LIMIT_INITIAL_USER_SEARCH = ADDON_MESSAGES_LIMIT_INITIAL_USER_SEARCH;
|
||||
/**
|
||||
* @deprecated since 5.0. Use ADDON_MESSAGES_LIMIT_SEARCH instead.
|
||||
*/
|
||||
static readonly LIMIT_SEARCH = ADDON_MESSAGES_LIMIT_SEARCH;
|
||||
|
||||
/**
|
||||
* @deprecated since 5.0. Use ADDON_MESSAGES_NEW_MESSAGE_EVENT instead.
|
||||
*/
|
||||
static readonly NOTIFICATION_PREFERENCES_KEY = 'message_provider_moodle_instantmessage';
|
||||
|
||||
protected logger: CoreLogger;
|
||||
|
@ -147,7 +218,7 @@ export class AddonMessagesProvider {
|
|||
} finally {
|
||||
const data: AddonMessagesMemberInfoChangedEventData = { userId, userBlocked: true };
|
||||
|
||||
CoreEvents.trigger(AddonMessagesProvider.MEMBER_INFO_CHANGED_EVENT, data, site.id);
|
||||
CoreEvents.trigger(ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT, data, site.id);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -169,14 +240,14 @@ export class AddonMessagesProvider {
|
|||
|
||||
await site.write('core_message_confirm_contact_request', params);
|
||||
|
||||
await CoreUtils.allPromises([
|
||||
await CorePromiseUtils.allPromises([
|
||||
this.invalidateAllMemberInfo(userId, site),
|
||||
this.invalidateContactsCache(site.id),
|
||||
this.invalidateUserContacts(site.id),
|
||||
this.refreshContactRequestsCount(site.id),
|
||||
]).finally(() => {
|
||||
const data: AddonMessagesMemberInfoChangedEventData = { userId, contactRequestConfirmed: true };
|
||||
CoreEvents.trigger(AddonMessagesProvider.MEMBER_INFO_CHANGED_EVENT, data, site.id);
|
||||
CoreEvents.trigger(ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT, data, site.id);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -212,7 +283,7 @@ export class AddonMessagesProvider {
|
|||
|
||||
await this.invalidateAllMemberInfo(userId, site).finally(() => {
|
||||
const data: AddonMessagesMemberInfoChangedEventData = { userId, contactRequestCreated: true };
|
||||
CoreEvents.trigger(AddonMessagesProvider.MEMBER_INFO_CHANGED_EVENT, data, site.id);
|
||||
CoreEvents.trigger(ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT, data, site.id);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -234,12 +305,12 @@ export class AddonMessagesProvider {
|
|||
|
||||
await site.write('core_message_decline_contact_request', params);
|
||||
|
||||
await CoreUtils.allPromises([
|
||||
await CorePromiseUtils.allPromises([
|
||||
this.invalidateAllMemberInfo(userId, site),
|
||||
this.refreshContactRequestsCount(site.id),
|
||||
]).finally(() => {
|
||||
const data: AddonMessagesMemberInfoChangedEventData = { userId, contactRequestDeclined: true };
|
||||
CoreEvents.trigger(AddonMessagesProvider.MEMBER_INFO_CHANGED_EVENT, data, site.id);
|
||||
CoreEvents.trigger(ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT, data, site.id);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -373,8 +444,8 @@ export class AddonMessagesProvider {
|
|||
conversation.lastmessagedate = lastMessage ? lastMessage.timecreated : undefined;
|
||||
conversation.sentfromcurrentuser = lastMessage ? lastMessage.useridfrom == userId : undefined;
|
||||
|
||||
if (conversation.type != AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_GROUP) {
|
||||
const isIndividual = conversation.type == AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_INDIVIDUAL;
|
||||
if (conversation.type != AddonMessagesMessageConversationType.GROUP) {
|
||||
const isIndividual = conversation.type == AddonMessagesMessageConversationType.INDIVIDUAL;
|
||||
|
||||
const otherUser = conversation.members.find((member) =>
|
||||
(isIndividual && member.id != userId) || (!isIndividual && member.id == userId));
|
||||
|
@ -628,7 +699,7 @@ export class AddonMessagesProvider {
|
|||
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.getCacheKeyForBlockedContacts(userId),
|
||||
updateFrequency: CoreSite.FREQUENCY_OFTEN,
|
||||
updateFrequency: CoreCacheUpdateFrequency.OFTEN,
|
||||
};
|
||||
|
||||
return site.read('core_message_get_blocked_users', params, preSets);
|
||||
|
@ -648,7 +719,7 @@ export class AddonMessagesProvider {
|
|||
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.getCacheKeyForContacts(),
|
||||
updateFrequency: CoreSite.FREQUENCY_OFTEN,
|
||||
updateFrequency: CoreCacheUpdateFrequency.OFTEN,
|
||||
};
|
||||
|
||||
const contacts = await site.read<AddonMessagesGetContactsWSResponse>('core_message_get_contacts', undefined, preSets);
|
||||
|
@ -679,14 +750,14 @@ export class AddonMessagesProvider {
|
|||
* Get the list of user contacts.
|
||||
*
|
||||
* @param limitFrom Position of the first contact to fetch.
|
||||
* @param limitNum Number of contacts to fetch. Default is AddonMessagesProvider.LIMIT_CONTACTS.
|
||||
* @param limitNum Number of contacts to fetch. Default is ADDON_MESSAGES_LIMIT_CONTACTS.
|
||||
* @param siteId Site ID. If not defined, use current site.
|
||||
* @returns Promise resolved with the list of user contacts.
|
||||
* @since 3.6
|
||||
*/
|
||||
async getUserContacts(
|
||||
limitFrom: number = 0,
|
||||
limitNum: number = AddonMessagesProvider.LIMIT_CONTACTS,
|
||||
limitNum: number = ADDON_MESSAGES_LIMIT_CONTACTS,
|
||||
siteId?: string,
|
||||
): Promise<{contacts: AddonMessagesConversationMember[]; canLoadMore: boolean}> {
|
||||
const site = await CoreSites.getSite(siteId);
|
||||
|
@ -699,7 +770,7 @@ export class AddonMessagesProvider {
|
|||
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.getCacheKeyForUserContacts(),
|
||||
updateFrequency: CoreSite.FREQUENCY_OFTEN,
|
||||
updateFrequency: CoreCacheUpdateFrequency.OFTEN,
|
||||
};
|
||||
|
||||
const contacts = await site.read<AddonMessagesGetUserContactsWSResponse>('core_message_get_user_contacts', params, preSets);
|
||||
|
@ -723,14 +794,14 @@ export class AddonMessagesProvider {
|
|||
* Get the contact request sent to the current user.
|
||||
*
|
||||
* @param limitFrom Position of the first contact request to fetch.
|
||||
* @param limitNum Number of contact requests to fetch. Default is AddonMessagesProvider.LIMIT_CONTACTS.
|
||||
* @param limitNum Number of contact requests to fetch. Default is ADDON_MESSAGES_LIMIT_CONTACTS.
|
||||
* @param siteId Site ID. If not defined, use current site.
|
||||
* @returns Promise resolved with the list of contact requests.
|
||||
* @since 3.6
|
||||
*/
|
||||
async getContactRequests(
|
||||
limitFrom: number = 0,
|
||||
limitNum: number = AddonMessagesProvider.LIMIT_CONTACTS,
|
||||
limitNum: number = ADDON_MESSAGES_LIMIT_CONTACTS,
|
||||
siteId?: string,
|
||||
): Promise<{requests: AddonMessagesConversationMember[]; canLoadMore: boolean}> {
|
||||
const site = await CoreSites.getSite(siteId);
|
||||
|
@ -743,7 +814,7 @@ export class AddonMessagesProvider {
|
|||
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.getCacheKeyForContactRequests(),
|
||||
updateFrequency: CoreSite.FREQUENCY_OFTEN,
|
||||
updateFrequency: CoreCacheUpdateFrequency.OFTEN,
|
||||
};
|
||||
|
||||
const requests = await site.read<AddonMessagesGetContactRequestsWSResponse>(
|
||||
|
@ -791,7 +862,7 @@ export class AddonMessagesProvider {
|
|||
};
|
||||
|
||||
// Notify the new count so all badges are updated.
|
||||
CoreEvents.trigger(AddonMessagesProvider.CONTACT_REQUESTS_COUNT_EVENT, data , site.id);
|
||||
CoreEvents.trigger(ADDON_MESSAGES_CONTACT_REQUESTS_COUNT_EVENT, data , site.id);
|
||||
|
||||
return data.count;
|
||||
|
||||
|
@ -935,11 +1006,11 @@ export class AddonMessagesProvider {
|
|||
): Promise<{members: AddonMessagesConversationMember[]; canLoadMore: boolean}> {
|
||||
const site = await CoreSites.getSite(siteId);
|
||||
userId = userId || site.getUserId();
|
||||
limitTo = limitTo ?? AddonMessagesProvider.LIMIT_MESSAGES;
|
||||
limitTo = limitTo ?? ADDON_MESSAGES_LIMIT_MESSAGES;
|
||||
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.getCacheKeyForConversationMembers(userId, conversationId),
|
||||
updateFrequency: CoreSite.FREQUENCY_SOMETIMES,
|
||||
updateFrequency: CoreCacheUpdateFrequency.SOMETIMES,
|
||||
};
|
||||
|
||||
const params: AddonMessagesGetConversationMembersWSParams = {
|
||||
|
@ -983,7 +1054,7 @@ export class AddonMessagesProvider {
|
|||
|
||||
options.userId = options.userId || site.getUserId();
|
||||
options.limitFrom = options.limitFrom || 0;
|
||||
options.limitTo = options.limitTo ?? AddonMessagesProvider.LIMIT_MESSAGES;
|
||||
options.limitTo = options.limitTo ?? ADDON_MESSAGES_LIMIT_MESSAGES;
|
||||
options.timeFrom = options.timeFrom || 0;
|
||||
options.newestFirst = options.newestFirst ?? true;
|
||||
|
||||
|
@ -1076,7 +1147,7 @@ export class AddonMessagesProvider {
|
|||
const params: AddonMessagesGetConversationsWSParams = {
|
||||
userid: userId,
|
||||
limitfrom: limitFrom,
|
||||
limitnum: AddonMessagesProvider.LIMIT_MESSAGES + 1,
|
||||
limitnum: ADDON_MESSAGES_LIMIT_MESSAGES + 1,
|
||||
};
|
||||
|
||||
if (forceCache) {
|
||||
|
@ -1091,7 +1162,7 @@ export class AddonMessagesProvider {
|
|||
if (favourites !== undefined && favourites != null) {
|
||||
params.favourites = !!favourites;
|
||||
}
|
||||
if (site.isVersionGreaterEqualThan('3.7') && type != AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_GROUP) {
|
||||
if (site.isVersionGreaterEqualThan('3.7') && type != AddonMessagesMessageConversationType.GROUP) {
|
||||
// Add self conversation to the list.
|
||||
params.mergeself = true;
|
||||
}
|
||||
|
@ -1112,12 +1183,12 @@ export class AddonMessagesProvider {
|
|||
|
||||
// Format the conversations, adding some calculated fields.
|
||||
const conversations = response.conversations
|
||||
.slice(0, AddonMessagesProvider.LIMIT_MESSAGES)
|
||||
.slice(0, ADDON_MESSAGES_LIMIT_MESSAGES)
|
||||
.map((conversation) => this.formatConversation(conversation, userId!));
|
||||
|
||||
return {
|
||||
conversations,
|
||||
canLoadMore: response.conversations.length > AddonMessagesProvider.LIMIT_MESSAGES,
|
||||
canLoadMore: response.conversations.length > ADDON_MESSAGES_LIMIT_MESSAGES,
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -1144,9 +1215,9 @@ export class AddonMessagesProvider {
|
|||
|
||||
const counts = {
|
||||
favourites: result.favourites,
|
||||
individual: result.types[AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_INDIVIDUAL],
|
||||
group: result.types[AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_GROUP],
|
||||
self: result.types[AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_SELF] || 0,
|
||||
individual: result.types[AddonMessagesMessageConversationType.INDIVIDUAL],
|
||||
group: result.types[AddonMessagesMessageConversationType.GROUP],
|
||||
self: result.types[AddonMessagesMessageConversationType.SELF] || 0,
|
||||
};
|
||||
|
||||
return counts;
|
||||
|
@ -1189,7 +1260,7 @@ export class AddonMessagesProvider {
|
|||
const params: AddonMessagesGetMessagesWSParams = {
|
||||
useridto: site.getUserId(),
|
||||
useridfrom: userId,
|
||||
limitnum: AddonMessagesProvider.LIMIT_MESSAGES,
|
||||
limitnum: ADDON_MESSAGES_LIMIT_MESSAGES,
|
||||
};
|
||||
|
||||
if (lfReceivedUnread > 0 || lfReceivedRead > 0 || lfSentUnread > 0 || lfSentRead > 0) {
|
||||
|
@ -1212,13 +1283,13 @@ export class AddonMessagesProvider {
|
|||
result.messages = result.messages.concat(sent);
|
||||
const hasSent = sent.length > 0;
|
||||
|
||||
if (result.messages.length > AddonMessagesProvider.LIMIT_MESSAGES) {
|
||||
if (result.messages.length > ADDON_MESSAGES_LIMIT_MESSAGES) {
|
||||
// Sort messages and get the more recent ones.
|
||||
result.canLoadMore = true;
|
||||
result.messages = this.sortMessages(result['messages']);
|
||||
result.messages = result.messages.slice(-AddonMessagesProvider.LIMIT_MESSAGES);
|
||||
result.messages = result.messages.slice(-ADDON_MESSAGES_LIMIT_MESSAGES);
|
||||
} else {
|
||||
result.canLoadMore = result.messages.length == AddonMessagesProvider.LIMIT_MESSAGES && (!hasReceived || !hasSent);
|
||||
result.canLoadMore = result.messages.length == ADDON_MESSAGES_LIMIT_MESSAGES && (!hasReceived || !hasSent);
|
||||
}
|
||||
|
||||
if (excludePending) {
|
||||
|
@ -1289,7 +1360,7 @@ export class AddonMessagesProvider {
|
|||
const params: AddonMessagesGetMessagesWSParams = {
|
||||
useridto: currentUserId,
|
||||
useridfrom: 0,
|
||||
limitnum: AddonMessagesProvider.LIMIT_MESSAGES,
|
||||
limitnum: ADDON_MESSAGES_LIMIT_MESSAGES,
|
||||
};
|
||||
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
|
@ -1371,7 +1442,7 @@ export class AddonMessagesProvider {
|
|||
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.getCacheKeyForMemberInfo(userId, otherUserId),
|
||||
updateFrequency: CoreSite.FREQUENCY_OFTEN,
|
||||
updateFrequency: CoreCacheUpdateFrequency.OFTEN,
|
||||
};
|
||||
const params: AddonMessagesGetMemberInfoWSParams = {
|
||||
referenceuserid: userId,
|
||||
|
@ -1410,7 +1481,7 @@ export class AddonMessagesProvider {
|
|||
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.getMessagePreferencesCacheKey(),
|
||||
updateFrequency: CoreSite.FREQUENCY_SOMETIMES,
|
||||
updateFrequency: CoreCacheUpdateFrequency.SOMETIMES,
|
||||
};
|
||||
|
||||
const data = await site.read<AddonMessagesGetUserMessagePreferencesWSResponse>(
|
||||
|
@ -1572,9 +1643,9 @@ export class AddonMessagesProvider {
|
|||
|
||||
counts = {
|
||||
favourites: result.favourites,
|
||||
individual: result.types[AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_INDIVIDUAL],
|
||||
group: result.types[AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_GROUP],
|
||||
self: result.types[AddonMessagesProvider.MESSAGE_CONVERSATION_TYPE_SELF] || 0,
|
||||
individual: result.types[AddonMessagesMessageConversationType.INDIVIDUAL],
|
||||
group: result.types[AddonMessagesMessageConversationType.GROUP],
|
||||
self: result.types[AddonMessagesMessageConversationType.SELF] || 0,
|
||||
};
|
||||
|
||||
} else {
|
||||
|
@ -1592,7 +1663,7 @@ export class AddonMessagesProvider {
|
|||
}
|
||||
|
||||
// Notify the new counts so all views are updated.
|
||||
CoreEvents.trigger(AddonMessagesProvider.UNREAD_CONVERSATION_COUNTS_EVENT, counts, site.id);
|
||||
CoreEvents.trigger(ADDON_MESSAGES_UNREAD_CONVERSATION_COUNTS_EVENT, counts, site.id);
|
||||
|
||||
return counts;
|
||||
}
|
||||
|
@ -1617,7 +1688,7 @@ export class AddonMessagesProvider {
|
|||
const params: AddonMessagesGetMessagesWSParams = {
|
||||
read: false,
|
||||
limitfrom: 0,
|
||||
limitnum: AddonMessagesProvider.LIMIT_MESSAGES,
|
||||
limitnum: ADDON_MESSAGES_LIMIT_MESSAGES,
|
||||
useridto: site.getUserId(),
|
||||
useridfrom: 0,
|
||||
};
|
||||
|
@ -1863,7 +1934,7 @@ export class AddonMessagesProvider {
|
|||
* @returns Promise resolved when done.
|
||||
*/
|
||||
protected async invalidateAllMemberInfo(userId: number, site: CoreSite): Promise<void> {
|
||||
await CoreUtils.allPromises([
|
||||
await CorePromiseUtils.allPromises([
|
||||
this.invalidateMemberInfo(userId, site.id),
|
||||
this.invalidateUserContacts(site.id),
|
||||
this.invalidateBlockedContactsCache(site.id),
|
||||
|
@ -1881,7 +1952,7 @@ export class AddonMessagesProvider {
|
|||
site.id,
|
||||
undefined,
|
||||
true,
|
||||
).then((conversation) => CoreUtils.allPromises([
|
||||
).then((conversation) => CorePromiseUtils.allPromises([
|
||||
this.invalidateConversation(conversation.id),
|
||||
this.invalidateConversationMembers(conversation.id, site.id),
|
||||
])).catch(() => {
|
||||
|
@ -2243,13 +2314,13 @@ export class AddonMessagesProvider {
|
|||
|
||||
await site.write('core_message_delete_contacts', params, preSets);
|
||||
|
||||
return CoreUtils.allPromises([
|
||||
return CorePromiseUtils.allPromises([
|
||||
this.invalidateUserContacts(site.id),
|
||||
this.invalidateAllMemberInfo(userId, site),
|
||||
this.invalidateContactsCache(site.id),
|
||||
]).then(() => {
|
||||
const data: AddonMessagesMemberInfoChangedEventData = { userId, contactRemoved: true };
|
||||
CoreEvents.trigger(AddonMessagesProvider.MEMBER_INFO_CHANGED_EVENT, data, site.id);
|
||||
CoreEvents.trigger(ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT, data, site.id);
|
||||
|
||||
return;
|
||||
});
|
||||
|
@ -2296,7 +2367,7 @@ export class AddonMessagesProvider {
|
|||
* @param query The query string.
|
||||
* @param userId The user ID. If not defined, current user.
|
||||
* @param limitFrom Position of the first result to get. Defaults to 0.
|
||||
* @param limitNum Number of results to get. Defaults to AddonMessagesProvider.LIMIT_SEARCH.
|
||||
* @param limitNum Number of results to get. Defaults to ADDON_MESSAGES_LIMIT_SEARCH.
|
||||
* @param siteId Site ID. If not defined, current site.
|
||||
* @returns Promise resolved with the results.
|
||||
*/
|
||||
|
@ -2304,7 +2375,7 @@ export class AddonMessagesProvider {
|
|||
query: string,
|
||||
userId?: number,
|
||||
limitFrom: number = 0,
|
||||
limitNum: number = AddonMessagesProvider.LIMIT_SEARCH,
|
||||
limitNum: number = ADDON_MESSAGES_LIMIT_SEARCH,
|
||||
siteId?: string,
|
||||
): Promise<{messages: AddonMessagesMessageAreaContact[]; canLoadMore: boolean}> {
|
||||
const site = await CoreSites.getSite(siteId);
|
||||
|
@ -2349,7 +2420,7 @@ export class AddonMessagesProvider {
|
|||
*
|
||||
* @param query Text to search for.
|
||||
* @param limitFrom Position of the first found user to fetch.
|
||||
* @param limitNum Number of found users to fetch. Defaults to AddonMessagesProvider.LIMIT_SEARCH.
|
||||
* @param limitNum Number of found users to fetch. Defaults to ADDON_MESSAGES_LIMIT_SEARCH.
|
||||
* @param siteId Site ID. If not defined, use current site.
|
||||
* @returns Resolved with two lists of found users: contacts and non-contacts.
|
||||
* @since 3.6
|
||||
|
@ -2357,7 +2428,7 @@ export class AddonMessagesProvider {
|
|||
async searchUsers(
|
||||
query: string,
|
||||
limitFrom: number = 0,
|
||||
limitNum: number = AddonMessagesProvider.LIMIT_SEARCH,
|
||||
limitNum: number = ADDON_MESSAGES_LIMIT_SEARCH,
|
||||
siteId?: string,
|
||||
): Promise<{
|
||||
contacts: AddonMessagesConversationMember[];
|
||||
|
@ -2459,7 +2530,7 @@ export class AddonMessagesProvider {
|
|||
message: result,
|
||||
};
|
||||
} catch (error) {
|
||||
if (CoreUtils.isWebServiceError(error)) {
|
||||
if (CoreWSError.isWebServiceError(error)) {
|
||||
// It's a WebService error, the user cannot send the message so don't store it.
|
||||
throw error;
|
||||
}
|
||||
|
@ -2590,7 +2661,7 @@ export class AddonMessagesProvider {
|
|||
message: result,
|
||||
};
|
||||
} catch (error) {
|
||||
if (CoreUtils.isWebServiceError(error)) {
|
||||
if (CoreWSError.isWebServiceError(error)) {
|
||||
// It's a WebService error, the user cannot send the message so don't store it.
|
||||
throw error;
|
||||
}
|
||||
|
@ -2827,7 +2898,7 @@ export class AddonMessagesProvider {
|
|||
} finally {
|
||||
const data: AddonMessagesMemberInfoChangedEventData = { userId, userUnblocked: true };
|
||||
|
||||
CoreEvents.trigger(AddonMessagesProvider.MEMBER_INFO_CHANGED_EVENT, data, site.id);
|
||||
CoreEvents.trigger(ADDON_MESSAGES_MEMBER_INFO_CHANGED_EVENT, data, site.id);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ import { Params } from '@angular/router';
|
|||
import { CoreRoutedItemsManagerSource } from '@classes/items-management/routed-items-manager-source';
|
||||
import { CoreGroupInfo, CoreGroups } from '@services/groups';
|
||||
import { CoreSites } from '@services/sites';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
import { Translate } from '@singletons';
|
||||
import { CoreIonicColorNames } from '@singletons/colors';
|
||||
import { CoreEvents } from '@singletons/events';
|
||||
|
@ -194,7 +194,7 @@ export class AddonModAssignSubmissionsSource extends CoreRoutedItemsManagerSourc
|
|||
const showSubmissions: AddonModAssignSubmissionForList[] = await Promise.all(
|
||||
submissions.map(async (submission: AddonModAssignSubmissionForList) => {
|
||||
const gradeData =
|
||||
await CoreUtils.ignoreErrors(AddonModAssignOffline.getSubmissionGrade(assign.id, submission.userid));
|
||||
await CorePromiseUtils.ignoreErrors(AddonModAssignOffline.getSubmissionGrade(assign.id, submission.userid));
|
||||
|
||||
// Load offline grades.
|
||||
const notSynced = !!gradeData && submission.timemodified < gradeData.timemodified;
|
||||
|
|
|
@ -16,7 +16,7 @@ import { Component, Input, ViewChild, ElementRef } from '@angular/core';
|
|||
import { CoreSites } from '@services/sites';
|
||||
import { CoreDomUtils } from '@services/utils/dom';
|
||||
import { CoreFormFields, CoreForms } from '@singletons/form';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
import { ModalController, Translate } from '@singletons';
|
||||
import { AddonModAssignAssign, AddonModAssignPlugin, AddonModAssignSubmission } from '../../services/assign';
|
||||
import { AddonModAssignFeedbackDelegate } from '../../services/feedback-delegate';
|
||||
|
@ -88,7 +88,7 @@ export class AddonModAssignEditFeedbackModalComponent {
|
|||
* @returns Promise resolved with boolean: whether the data has changed.
|
||||
*/
|
||||
protected async hasDataChanged(): Promise<boolean> {
|
||||
const changed = await CoreUtils.ignoreErrors(
|
||||
const changed = await CorePromiseUtils.ignoreErrors(
|
||||
AddonModAssignFeedbackDelegate.hasPluginDataChanged(
|
||||
this.assign,
|
||||
this.submission,
|
||||
|
|
|
@ -24,7 +24,7 @@ import { CoreNavigator } from '@services/navigator';
|
|||
import { CoreSites } from '@services/sites';
|
||||
import { CoreDomUtils } from '@services/utils/dom';
|
||||
import { CoreTimeUtils } from '@services/utils/time';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
import { Translate } from '@singletons';
|
||||
import { CoreEventObserver, CoreEvents } from '@singletons/events';
|
||||
import { CoreTime } from '@singletons/time';
|
||||
|
@ -182,7 +182,7 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo
|
|||
|
||||
if (sync) {
|
||||
// Try to synchronize the assign.
|
||||
await CoreUtils.ignoreErrors(this.syncActivity(showErrors));
|
||||
await CorePromiseUtils.ignoreErrors(this.syncActivity(showErrors));
|
||||
}
|
||||
|
||||
// Check if there's any offline data for this assign.
|
||||
|
@ -250,18 +250,18 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo
|
|||
return; // Shouldn't happen.
|
||||
}
|
||||
|
||||
await CoreUtils.ignoreErrors(AddonModAssign.logView(this.assign.id));
|
||||
await CorePromiseUtils.ignoreErrors(AddonModAssign.logView(this.assign.id));
|
||||
|
||||
this.analyticsLogEvent('mod_assign_view_assign');
|
||||
|
||||
if (this.canViewAllSubmissions) {
|
||||
// User can see all submissions, log grading view.
|
||||
await CoreUtils.ignoreErrors(AddonModAssign.logGradingView(this.assign.id));
|
||||
await CorePromiseUtils.ignoreErrors(AddonModAssign.logGradingView(this.assign.id));
|
||||
|
||||
this.analyticsLogEvent('mod_assign_view_grading_table', { sendUrl: false });
|
||||
} else if (this.canViewOwnSubmission) {
|
||||
// User can only see their own submission, log view the user submission.
|
||||
await CoreUtils.ignoreErrors(AddonModAssign.logSubmissionView(this.assign.id));
|
||||
await CorePromiseUtils.ignoreErrors(AddonModAssign.logSubmissionView(this.assign.id));
|
||||
|
||||
this.analyticsLogEvent('mod_assign_view_submission_status', { sendUrl: false });
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@ import { CoreTabsComponent } from '@components/tabs/tabs';
|
|||
import { CoreTabComponent } from '@components/tabs/tab';
|
||||
import { CoreSplitViewComponent } from '@components/split-view/split-view';
|
||||
import { CoreGradesFormattedItem, CoreGradesHelper } from '@features/grades/services/grades-helper';
|
||||
import { CoreMenuItem, CoreUtils } from '@services/utils/utils';
|
||||
import { CoreMenuItem, CoreUtils } from '@singletons/utils';
|
||||
import { AddonModAssignHelper, AddonModAssignSubmissionFormatted } from '../../services/assign-helper';
|
||||
import { CoreDomUtils } from '@services/utils/dom';
|
||||
import { Translate } from '@singletons';
|
||||
|
@ -70,6 +70,7 @@ import {
|
|||
} from '../../constants';
|
||||
import { CoreViewer } from '@features/viewer/services/viewer';
|
||||
import { CoreLoadings } from '@services/loadings';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
|
||||
/**
|
||||
* Component that displays an assignment submission.
|
||||
|
@ -77,7 +78,7 @@ import { CoreLoadings } from '@services/loadings';
|
|||
@Component({
|
||||
selector: 'addon-mod-assign-submission',
|
||||
templateUrl: 'addon-mod-assign-submission.html',
|
||||
styleUrls: ['submission.scss'],
|
||||
styleUrl: 'submission.scss',
|
||||
})
|
||||
export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, CanLeave {
|
||||
|
||||
|
@ -327,7 +328,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can
|
|||
const previousSubmission = this.previousAttempt.submission;
|
||||
let modal = await CoreLoadings.show();
|
||||
|
||||
const size = await CoreUtils.ignoreErrors(
|
||||
const size = await CorePromiseUtils.ignoreErrors(
|
||||
AddonModAssignHelper.getSubmissionSizeForCopy(this.assign, previousSubmission),
|
||||
-1,
|
||||
); // Error calculating size, return -1.
|
||||
|
@ -548,7 +549,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can
|
|||
});
|
||||
}
|
||||
|
||||
await CoreUtils.ignoreErrors(Promise.all(promises));
|
||||
await CorePromiseUtils.ignoreErrors(Promise.all(promises));
|
||||
|
||||
await this.loadData(sync);
|
||||
}
|
||||
|
@ -716,7 +717,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can
|
|||
|
||||
// If we have data about the grader, get its profile.
|
||||
if (feedback.grade && feedback.grade.grader > 0) {
|
||||
this.grader = await CoreUtils.ignoreErrors(CoreUser.getProfile(feedback.grade.grader, this.courseId));
|
||||
this.grader = await CorePromiseUtils.ignoreErrors(CoreUser.getProfile(feedback.grade.grader, this.courseId));
|
||||
} else {
|
||||
delete this.grader;
|
||||
}
|
||||
|
@ -803,7 +804,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can
|
|||
|
||||
// Submission grades aren't identified by attempt number so it can retrieve the feedback for a previous attempt.
|
||||
// The app will not treat that as an special case.
|
||||
const submissionGrade = await CoreUtils.ignoreErrors(
|
||||
const submissionGrade = await CorePromiseUtils.ignoreErrors(
|
||||
AddonModAssignOffline.getSubmissionGrade(assign.id, this.submitId),
|
||||
);
|
||||
|
||||
|
@ -1075,7 +1076,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can
|
|||
const [gradebookGrades, assignGrades] = await Promise.all([
|
||||
CoreGradesHelper.getGradeModuleItems(this.courseId, this.moduleId, this.submitId),
|
||||
gradeNotReleased ?
|
||||
CoreUtils.ignoreErrors(AddonModAssign.getAssignmentGrades(assign.id, { cmId: assign.cmid })) :
|
||||
CorePromiseUtils.ignoreErrors(AddonModAssign.getAssignmentGrades(assign.id, { cmId: assign.cmid })) :
|
||||
undefined,
|
||||
]);
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ import {
|
|||
} from '../services/handler';
|
||||
import { AddonModAssignFeedbackDelegate } from '@addons/mod/assign/services/feedback-delegate';
|
||||
import { AddonModAssignOffline } from '@addons/mod/assign/services/assign-offline';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
import { AddonModAssignFeedbackPluginBaseComponent } from '@addons/mod/assign/classes/base-feedback-plugin-component';
|
||||
import { ContextLevel } from '@/core/constants';
|
||||
import { ADDON_MOD_ASSIGN_COMPONENT } from '@addons/mod/assign/constants';
|
||||
|
@ -124,7 +124,7 @@ export class AddonModAssignFeedbackCommentsComponent extends AddonModAssignFeedb
|
|||
}
|
||||
|
||||
// There is no draft saved. Check if we have anything offline.
|
||||
const offlineData = await CoreUtils.ignoreErrors(
|
||||
const offlineData = await CorePromiseUtils.ignoreErrors(
|
||||
AddonModAssignOffline.getSubmissionGrade(this.assign.id, this.userId),
|
||||
undefined,
|
||||
);
|
||||
|
|
|
@ -25,10 +25,9 @@ import { AddonModAssignFeedbackHandler } from '@addons/mod/assign/services/feedb
|
|||
import { Injectable, Type } from '@angular/core';
|
||||
import { CoreSites } from '@services/sites';
|
||||
import { CoreText } from '@singletons/text';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
import { CoreWSFile } from '@services/ws';
|
||||
import { makeSingleton } from '@singletons';
|
||||
import { AddonModAssignFeedbackCommentsComponent } from '../component/comments';
|
||||
import { CoreFileHelper } from '@services/file-helper';
|
||||
|
||||
/**
|
||||
|
@ -73,7 +72,9 @@ export class AddonModAssignFeedbackCommentsHandlerService implements AddonModAss
|
|||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
getComponent(): Type<IAddonModAssignFeedbackPluginComponent> {
|
||||
async getComponent(): Promise<Type<IAddonModAssignFeedbackPluginComponent>> {
|
||||
const { AddonModAssignFeedbackCommentsComponent } = await import('../component/comments');
|
||||
|
||||
return AddonModAssignFeedbackCommentsComponent;
|
||||
}
|
||||
|
||||
|
@ -124,7 +125,7 @@ export class AddonModAssignFeedbackCommentsHandlerService implements AddonModAss
|
|||
userId: number,
|
||||
): Promise<boolean> {
|
||||
// Get it from plugin or offline.
|
||||
const offlineData = await CoreUtils.ignoreErrors(
|
||||
const offlineData = await CorePromiseUtils.ignoreErrors(
|
||||
AddonModAssignOffline.getSubmissionGrade(assign.id, userId),
|
||||
undefined,
|
||||
);
|
||||
|
|
|
@ -22,7 +22,6 @@ import { AddonModAssignFeedbackHandler } from '@addons/mod/assign/services/feedb
|
|||
import { Injectable, Type } from '@angular/core';
|
||||
import { CoreWSFile } from '@services/ws';
|
||||
import { makeSingleton } from '@singletons';
|
||||
import { AddonModAssignFeedbackEditPdfComponent } from '../component/editpdf';
|
||||
import type { IAddonModAssignFeedbackPluginComponent } from '@addons/mod/assign/classes/base-feedback-plugin-component';
|
||||
|
||||
/**
|
||||
|
@ -37,7 +36,9 @@ export class AddonModAssignFeedbackEditPdfHandlerService implements AddonModAssi
|
|||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
getComponent(): Type<IAddonModAssignFeedbackPluginComponent> {
|
||||
async getComponent(): Promise<Type<IAddonModAssignFeedbackPluginComponent>> {
|
||||
const { AddonModAssignFeedbackEditPdfComponent } = await import('../component/editpdf');
|
||||
|
||||
return AddonModAssignFeedbackEditPdfComponent;
|
||||
}
|
||||
|
||||
|
|
|
@ -23,7 +23,6 @@ import { AddonModAssignFeedbackHandler } from '@addons/mod/assign/services/feedb
|
|||
import { Injectable, Type } from '@angular/core';
|
||||
import { CoreWSFile } from '@services/ws';
|
||||
import { makeSingleton } from '@singletons';
|
||||
import { AddonModAssignFeedbackFileComponent } from '../component/file';
|
||||
|
||||
/**
|
||||
* Handler for file feedback plugin.
|
||||
|
@ -37,7 +36,9 @@ export class AddonModAssignFeedbackFileHandlerService implements AddonModAssignF
|
|||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
getComponent(): Type<IAddonModAssignFeedbackPluginComponent> {
|
||||
async getComponent(): Promise<Type<IAddonModAssignFeedbackPluginComponent>> {
|
||||
const { AddonModAssignFeedbackFileComponent } = await import('../component/file');
|
||||
|
||||
return AddonModAssignFeedbackFileComponent;
|
||||
}
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ import {
|
|||
import { AddonModAssignHelper } from '../../services/assign-helper';
|
||||
import { AddonModAssignOffline } from '../../services/assign-offline';
|
||||
import { AddonModAssignSync } from '../../services/assign-sync';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreWSError } from '@classes/errors/wserror';
|
||||
import { CoreWSExternalFile } from '@services/ws';
|
||||
import { CoreAnalytics, CoreAnalyticsEventType } from '@services/analytics';
|
||||
import {
|
||||
|
@ -47,6 +47,7 @@ import {
|
|||
} from '../../constants';
|
||||
import { CoreToasts, ToastDuration } from '@services/toasts';
|
||||
import { CoreLoadings } from '@services/loadings';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
|
||||
/**
|
||||
* Page that allows adding or editing an assigment submission.
|
||||
|
@ -54,7 +55,7 @@ import { CoreLoadings } from '@services/loadings';
|
|||
@Component({
|
||||
selector: 'page-addon-mod-assign-edit',
|
||||
templateUrl: 'edit.html',
|
||||
styleUrls: ['edit.scss'],
|
||||
styleUrl: 'edit.scss',
|
||||
})
|
||||
export class AddonModAssignEditPage implements OnInit, OnDestroy, CanLeave {
|
||||
|
||||
|
@ -232,7 +233,7 @@ export class AddonModAssignEditPage implements OnInit, OnDestroy, CanLeave {
|
|||
}
|
||||
|
||||
// Check if there's any offline data for this submission.
|
||||
this.hasOffline = await CoreUtils.promiseWorks(AddonModAssignOffline.getSubmission(this.assign.id, this.userId));
|
||||
this.hasOffline = await CorePromiseUtils.promiseWorks(AddonModAssignOffline.getSubmission(this.assign.id, this.userId));
|
||||
|
||||
CoreAnalytics.logEvent({
|
||||
type: CoreAnalyticsEventType.VIEW_ITEM,
|
||||
|
@ -343,7 +344,7 @@ export class AddonModAssignEditPage implements OnInit, OnDestroy, CanLeave {
|
|||
this.hasOffline,
|
||||
);
|
||||
} catch (error) {
|
||||
if (this.allowOffline && !this.saveOffline && !CoreUtils.isWebServiceError(error)) {
|
||||
if (this.allowOffline && !this.saveOffline && !CoreWSError.isWebServiceError(error)) {
|
||||
// Cannot submit in online, prepare for offline usage.
|
||||
this.saveOffline = true;
|
||||
|
||||
|
|
|
@ -27,7 +27,7 @@ import {
|
|||
AddonModAssignSubmissionStatusValues,
|
||||
} from './assign';
|
||||
import { AddonModAssignOffline } from './assign-offline';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreObject } from '@singletons/object';
|
||||
import { CoreFile } from '@services/file';
|
||||
import { CoreCourseCommonModWSOptions } from '@features/course/services/course';
|
||||
import { CoreGroups } from '@services/groups';
|
||||
|
@ -37,6 +37,7 @@ import { makeSingleton } from '@singletons';
|
|||
import { CoreFormFields } from '@singletons/form';
|
||||
import { CoreFileEntry } from '@services/file-helper';
|
||||
import { ADDON_MOD_ASSIGN_COMPONENT } from '../constants';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
|
||||
/**
|
||||
* Service that provides some helper functions for assign.
|
||||
|
@ -81,7 +82,7 @@ export class AddonModAssignHelperProvider {
|
|||
return true;
|
||||
}
|
||||
|
||||
if (await CoreUtils.promiseWorks(AddonModAssignOffline.getSubmission(assign.id, submission.userid))) {
|
||||
if (await CorePromiseUtils.promiseWorks(AddonModAssignOffline.getSubmission(assign.id, submission.userid))) {
|
||||
// Submission was saved or deleted offline, allow editing it or creating a new one.
|
||||
return true;
|
||||
}
|
||||
|
@ -313,7 +314,7 @@ export class AddonModAssignHelperProvider {
|
|||
|
||||
await Promise.all(promises);
|
||||
|
||||
return CoreUtils.objectToArray(participantsIndexed);
|
||||
return CoreObject.toArray(participantsIndexed);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -530,7 +531,7 @@ export class AddonModAssignHelperProvider {
|
|||
|
||||
const promises = feedback.plugins.map((plugin) =>
|
||||
this.prepareFeedbackPluginData(assign.id, userId, feedback).then(async (inputData) => {
|
||||
const changed = await CoreUtils.ignoreErrors(
|
||||
const changed = await CorePromiseUtils.ignoreErrors(
|
||||
AddonModAssignFeedbackDelegate.hasPluginDataChanged(assign, submission, plugin, inputData, userId),
|
||||
false,
|
||||
);
|
||||
|
@ -541,7 +542,7 @@ export class AddonModAssignHelperProvider {
|
|||
return;
|
||||
}));
|
||||
|
||||
await CoreUtils.allPromises(promises);
|
||||
await CorePromiseUtils.allPromises(promises);
|
||||
|
||||
return hasChanged;
|
||||
}
|
||||
|
@ -579,7 +580,7 @@ export class AddonModAssignHelperProvider {
|
|||
}))
|
||||
: [];
|
||||
|
||||
await CoreUtils.allPromises(promises);
|
||||
await CorePromiseUtils.allPromises(promises);
|
||||
|
||||
return hasChanged;
|
||||
}
|
||||
|
|
|
@ -33,13 +33,14 @@ import {
|
|||
} from './assign-offline';
|
||||
import { CoreSync, CoreSyncResult } from '@services/sync';
|
||||
import { CoreCourseLogHelper } from '@features/course/services/log-helper';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreWSError } from '@classes/errors/wserror';
|
||||
import { CoreNetwork } from '@services/network';
|
||||
import { CoreNetworkError } from '@classes/errors/network-error';
|
||||
import { CoreGradesFormattedItem, CoreGradesHelper } from '@features/grades/services/grades-helper';
|
||||
import { AddonModAssignSubmissionDelegate } from './submission-delegate';
|
||||
import { AddonModAssignFeedbackDelegate } from './feedback-delegate';
|
||||
import { ADDON_MOD_ASSIGN_AUTO_SYNCED, ADDON_MOD_ASSIGN_COMPONENT } from '../constants';
|
||||
import { ADDON_MOD_ASSIGN_AUTO_SYNCED, ADDON_MOD_ASSIGN_COMPONENT, ADDON_MOD_ASSIGN_MANUAL_SYNCED } from '../constants';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
|
||||
/**
|
||||
* Service to sync assigns.
|
||||
|
@ -189,7 +190,7 @@ export class AddonModAssignSyncProvider extends CoreCourseActivitySyncBaseProvid
|
|||
*/
|
||||
protected async performSyncAssign(assignId: number, siteId: string): Promise<AddonModAssignSyncResult> {
|
||||
// Sync offline logs.
|
||||
await CoreUtils.ignoreErrors(
|
||||
await CorePromiseUtils.ignoreErrors(
|
||||
CoreCourseLogHelper.syncActivity(ADDON_MOD_ASSIGN_COMPONENT, assignId, siteId),
|
||||
);
|
||||
|
||||
|
@ -207,7 +208,7 @@ export class AddonModAssignSyncProvider extends CoreCourseActivitySyncBaseProvid
|
|||
|
||||
if (!submissions.length && !grades.length) {
|
||||
// Nothing to sync.
|
||||
await CoreUtils.ignoreErrors(this.setSyncTime(assignId, siteId));
|
||||
await CorePromiseUtils.ignoreErrors(this.setSyncTime(assignId, siteId));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
@ -246,15 +247,15 @@ export class AddonModAssignSyncProvider extends CoreCourseActivitySyncBaseProvid
|
|||
}
|
||||
}));
|
||||
|
||||
await CoreUtils.allPromises(promises);
|
||||
await CorePromiseUtils.allPromises(promises);
|
||||
|
||||
if (result.updated) {
|
||||
// Data has been sent to server. Now invalidate the WS calls.
|
||||
await CoreUtils.ignoreErrors(AddonModAssign.invalidateContent(assign.cmid, courseId, siteId));
|
||||
await CorePromiseUtils.ignoreErrors(AddonModAssign.invalidateContent(assign.cmid, courseId, siteId));
|
||||
}
|
||||
|
||||
// Sync finished, set sync time.
|
||||
await CoreUtils.ignoreErrors(this.setSyncTime(assignId, siteId));
|
||||
await CorePromiseUtils.ignoreErrors(this.setSyncTime(assignId, siteId));
|
||||
|
||||
// All done, return the result.
|
||||
return result;
|
||||
|
@ -272,7 +273,7 @@ export class AddonModAssignSyncProvider extends CoreCourseActivitySyncBaseProvid
|
|||
siteId: string,
|
||||
): Promise<AddonModAssignSubmissionsGradingDBRecordFormatted[]> {
|
||||
// If no offline data found, return empty array.
|
||||
return CoreUtils.ignoreErrors(AddonModAssignOffline.getAssignSubmissionsGrade(assignId, siteId), []);
|
||||
return CorePromiseUtils.ignoreErrors(AddonModAssignOffline.getAssignSubmissionsGrade(assignId, siteId), []);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -287,7 +288,7 @@ export class AddonModAssignSyncProvider extends CoreCourseActivitySyncBaseProvid
|
|||
siteId: string,
|
||||
): Promise<AddonModAssignSubmissionsDBRecordFormatted[]> {
|
||||
// If no offline data found, return empty array.
|
||||
return CoreUtils.ignoreErrors(AddonModAssignOffline.getAssignSubmissions(assignId, siteId), []);
|
||||
return CorePromiseUtils.ignoreErrors(AddonModAssignOffline.getAssignSubmissions(assignId, siteId), []);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -359,7 +360,7 @@ export class AddonModAssignSyncProvider extends CoreCourseActivitySyncBaseProvid
|
|||
// Submission data sent, update cached data. No need to block the user for this.
|
||||
AddonModAssign.getSubmissionStatus(assign.id, options);
|
||||
} catch (error) {
|
||||
if (!error || !CoreUtils.isWebServiceError(error)) {
|
||||
if (!CoreWSError.isWebServiceError(error)) {
|
||||
// Local error, reject.
|
||||
throw error;
|
||||
}
|
||||
|
@ -508,9 +509,9 @@ export class AddonModAssignSyncProvider extends CoreCourseActivitySyncBaseProvid
|
|||
// Update cached data.
|
||||
promises.push(AddonModAssign.getSubmissionStatus(assign.id, options));
|
||||
|
||||
await CoreUtils.allPromises(promises);
|
||||
await CorePromiseUtils.allPromises(promises);
|
||||
} catch (error) {
|
||||
if (!error || !CoreUtils.isWebServiceError(error)) {
|
||||
if (!CoreWSError.isWebServiceError(error)) {
|
||||
// Local error, reject.
|
||||
throw error;
|
||||
}
|
||||
|
@ -535,7 +536,7 @@ export type AddonModAssignSyncResult = CoreSyncResult & {
|
|||
};
|
||||
|
||||
/**
|
||||
* Data passed to AUTO_SYNCED event.
|
||||
* Data passed to ADDON_MOD_ASSIGN_AUTO_SYNCED event.
|
||||
*/
|
||||
export type AddonModAssignAutoSyncData = {
|
||||
assignId: number;
|
||||
|
@ -544,9 +545,23 @@ export type AddonModAssignAutoSyncData = {
|
|||
};
|
||||
|
||||
/**
|
||||
* Data passed to MANUAL_SYNCED event.
|
||||
* Data passed to ADDON_MOD_ASSIGN_MANUAL_SYNCED event.
|
||||
*/
|
||||
export type AddonModAssignManualSyncData = AddonModAssignAutoSyncData & {
|
||||
context: string;
|
||||
submitId?: number;
|
||||
};
|
||||
|
||||
declare module '@singletons/events' {
|
||||
|
||||
/**
|
||||
* Augment CoreEventsData interface with events specific to this service.
|
||||
*
|
||||
* @see https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation
|
||||
*/
|
||||
export interface CoreEventsData {
|
||||
[ADDON_MOD_ASSIGN_MANUAL_SYNCED]: AddonModAssignManualSyncData;
|
||||
[ADDON_MOD_ASSIGN_AUTO_SYNCED]: AddonModAssignAutoSyncData;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -24,23 +24,19 @@ import { CoreTimeUtils } from '@services/utils/time';
|
|||
import { CoreCourseLogHelper } from '@features/course/services/log-helper';
|
||||
import { CoreError } from '@classes/errors/error';
|
||||
import { CoreNetwork } from '@services/network';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { AddonModAssignOffline } from './assign-offline';
|
||||
import { AddonModAssignSubmissionDelegate } from './submission-delegate';
|
||||
import { CoreComments } from '@features/comments/services/comments';
|
||||
import { AddonModAssignSubmissionFormatted } from './assign-helper';
|
||||
import { CoreWSError } from '@classes/errors/wserror';
|
||||
import { AddonModAssignAutoSyncData, AddonModAssignManualSyncData } from './assign-sync';
|
||||
import { CoreFormFields } from '@singletons/form';
|
||||
import { CoreFileHelper } from '@services/file-helper';
|
||||
import { CoreIonicColorNames } from '@singletons/colors';
|
||||
import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site';
|
||||
import { ContextLevel } from '@/core/constants';
|
||||
import { ContextLevel, CoreCacheUpdateFrequency } from '@/core/constants';
|
||||
import {
|
||||
ADDON_MOD_ASSIGN_AUTO_SYNCED,
|
||||
ADDON_MOD_ASSIGN_COMPONENT,
|
||||
ADDON_MOD_ASSIGN_GRADED_EVENT,
|
||||
ADDON_MOD_ASSIGN_MANUAL_SYNCED,
|
||||
ADDON_MOD_ASSIGN_STARTED_EVENT,
|
||||
ADDON_MOD_ASSIGN_SUBMISSION_REMOVED_EVENT,
|
||||
ADDON_MOD_ASSIGN_SUBMISSION_SAVED_EVENT,
|
||||
|
@ -60,8 +56,6 @@ declare module '@singletons/events' {
|
|||
[ADDON_MOD_ASSIGN_SUBMITTED_FOR_GRADING_EVENT]: AddonModAssignSubmittedForGradingEventData;
|
||||
[ADDON_MOD_ASSIGN_GRADED_EVENT]: AddonModAssignGradedEventData;
|
||||
[ADDON_MOD_ASSIGN_STARTED_EVENT]: AddonModAssignStartedEventData;
|
||||
[ADDON_MOD_ASSIGN_MANUAL_SYNCED]: AddonModAssignManualSyncData;
|
||||
[ADDON_MOD_ASSIGN_AUTO_SYNCED]: AddonModAssignAutoSyncData;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -174,7 +168,7 @@ export class AddonModAssignProvider {
|
|||
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.getAssignmentCacheKey(courseId),
|
||||
updateFrequency: CoreSite.FREQUENCY_RARELY,
|
||||
updateFrequency: CoreCacheUpdateFrequency.RARELY,
|
||||
component: ADDON_MOD_ASSIGN_COMPONENT,
|
||||
...CoreSites.getReadingStrategyPreSets(options.readingStrategy), // Include reading strategy preSets.
|
||||
};
|
||||
|
@ -246,7 +240,7 @@ export class AddonModAssignProvider {
|
|||
};
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.getAssignmentUserMappingsCacheKey(assignId),
|
||||
updateFrequency: CoreSite.FREQUENCY_OFTEN,
|
||||
updateFrequency: CoreCacheUpdateFrequency.OFTEN,
|
||||
component: ADDON_MOD_ASSIGN_COMPONENT,
|
||||
componentId: options.cmId,
|
||||
...CoreSites.getReadingStrategyPreSets(options.readingStrategy),
|
||||
|
@ -456,7 +450,7 @@ export class AddonModAssignProvider {
|
|||
};
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.getSubmissionsCacheKey(assignId),
|
||||
updateFrequency: CoreSite.FREQUENCY_OFTEN,
|
||||
updateFrequency: CoreCacheUpdateFrequency.OFTEN,
|
||||
component: ADDON_MOD_ASSIGN_COMPONENT,
|
||||
componentId: options.cmId,
|
||||
...CoreSites.getReadingStrategyPreSets(options.readingStrategy),
|
||||
|
@ -654,7 +648,7 @@ export class AddonModAssignProvider {
|
|||
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.listParticipantsCacheKey(assignId, groupId),
|
||||
updateFrequency: CoreSite.FREQUENCY_OFTEN,
|
||||
updateFrequency: CoreCacheUpdateFrequency.OFTEN,
|
||||
component: ADDON_MOD_ASSIGN_COMPONENT,
|
||||
componentId: options.cmId,
|
||||
...CoreSites.getReadingStrategyPreSets(options.readingStrategy),
|
||||
|
@ -1025,7 +1019,7 @@ export class AddonModAssignProvider {
|
|||
|
||||
return true;
|
||||
} catch (error) {
|
||||
if (allowOffline && error && !CoreUtils.isWebServiceError(error)) {
|
||||
if (allowOffline && error && !CoreWSError.isWebServiceError(error)) {
|
||||
// Couldn't connect to server, store in offline.
|
||||
return storeOffline();
|
||||
} else {
|
||||
|
@ -1135,7 +1129,7 @@ export class AddonModAssignProvider {
|
|||
|
||||
return true;
|
||||
} catch (error) {
|
||||
if (error && !CoreUtils.isWebServiceError(error)) {
|
||||
if (error && !CoreWSError.isWebServiceError(error)) {
|
||||
// Couldn't connect to server, store in offline.
|
||||
return storeOffline();
|
||||
} else {
|
||||
|
@ -1243,7 +1237,7 @@ export class AddonModAssignProvider {
|
|||
|
||||
return true;
|
||||
} catch (error) {
|
||||
if (error && !CoreUtils.isWebServiceError(error)) {
|
||||
if (error && !CoreWSError.isWebServiceError(error)) {
|
||||
// Couldn't connect to server, store in offline.
|
||||
return storeOffline();
|
||||
} else {
|
||||
|
@ -1384,7 +1378,7 @@ export class AddonModAssignProvider {
|
|||
|
||||
return true;
|
||||
} catch (error) {
|
||||
if (error && !CoreUtils.isWebServiceError(error)) {
|
||||
if (error && !CoreWSError.isWebServiceError(error)) {
|
||||
// Couldn't connect to server, store in offline.
|
||||
return storeOffline();
|
||||
} else {
|
||||
|
|
|
@ -27,7 +27,7 @@ import { CoreCourseActivityPrefetchHandlerBase } from '@features/course/classes/
|
|||
import { CoreCourse, CoreCourseAnyModuleData, CoreCourseCommonModWSOptions } from '@features/course/services/course';
|
||||
import { CoreWSFile } from '@services/ws';
|
||||
import { AddonModAssignHelper, AddonModAssignSubmissionFormatted } from '../assign-helper';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
import { CoreFilepool } from '@services/filepool';
|
||||
import { CoreGroups } from '@services/groups';
|
||||
import { AddonModAssignSync, AddonModAssignSyncResult } from '../assign-sync';
|
||||
|
@ -252,7 +252,7 @@ export class AddonModAssignPrefetchHandlerService extends CoreCourseActivityPref
|
|||
|
||||
if (blindMarking) {
|
||||
promises.push(
|
||||
CoreUtils.ignoreErrors(AddonModAssign.getAssignmentUserMappings(assign.id, -1, modOptions)),
|
||||
CorePromiseUtils.ignoreErrors(AddonModAssign.getAssignmentUserMappings(assign.id, -1, modOptions)),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -260,7 +260,7 @@ export class AddonModAssignPrefetchHandlerService extends CoreCourseActivityPref
|
|||
|
||||
promises.push(CoreCourse.getModuleBasicInfoByInstance(assign.id, 'assign', { siteId }));
|
||||
// Get course data, needed to determine upload max size if it's configured to be course limit.
|
||||
promises.push(CoreUtils.ignoreErrors(CoreCourses.getCourseByField('id', courseId, siteId)));
|
||||
promises.push(CorePromiseUtils.ignoreErrors(CoreCourses.getCourseByField('id', courseId, siteId)));
|
||||
|
||||
// Download intro files and attachments. Do not call getFiles because it'd call some WS twice.
|
||||
let files: CoreWSFile[] = assign.introattachments || [];
|
||||
|
|
|
@ -17,10 +17,11 @@ import { CoreCourseHelper } from '@features/course/services/course-helper';
|
|||
import { CorePushNotificationsClickHandler } from '@features/pushnotifications/services/push-delegate';
|
||||
import { CorePushNotificationsNotificationBasicData } from '@features/pushnotifications/services/pushnotifications';
|
||||
import { CoreUrl } from '@singletons/url';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreUtils } from '@singletons/utils';
|
||||
import { makeSingleton } from '@singletons';
|
||||
import { AddonModAssign } from '../assign';
|
||||
import { ADDON_MOD_ASSIGN_FEATURE_NAME } from '../../constants';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
|
||||
/**
|
||||
* Handler for assign push notifications clicks.
|
||||
|
@ -54,7 +55,7 @@ export class AddonModAssignPushClickHandlerService implements CorePushNotificati
|
|||
const courseId = Number(notification.courseid);
|
||||
const moduleId = Number(contextUrlParams.id);
|
||||
|
||||
await CoreUtils.ignoreErrors(AddonModAssign.invalidateContent(moduleId, courseId, notification.site));
|
||||
await CorePromiseUtils.ignoreErrors(AddonModAssign.invalidateContent(moduleId, courseId, notification.site));
|
||||
await CoreCourseHelper.navigateToModule(moduleId, {
|
||||
courseId,
|
||||
siteId: notification.site,
|
||||
|
|
|
@ -18,7 +18,7 @@ import { AddonModAssignOffline } from '@addons/mod/assign/services/assign-offlin
|
|||
import { Component, OnInit } from '@angular/core';
|
||||
import { CoreFileUploaderStoreFilesResult } from '@features/fileuploader/services/fileuploader';
|
||||
import { CoreFileSession } from '@services/file-session';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
import { AddonModAssignSubmissionFileHandlerService } from '../services/handler';
|
||||
import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
|
||||
import { AddonModAssignSubmissionPluginBaseComponent } from '@addons/mod/assign/classes/base-submission-plugin-component';
|
||||
|
@ -54,7 +54,7 @@ export class AddonModAssignSubmissionFileComponent extends AddonModAssignSubmiss
|
|||
: undefined;
|
||||
|
||||
// Get the offline data.
|
||||
const offlineData = await CoreUtils.ignoreErrors(
|
||||
const offlineData = await CorePromiseUtils.ignoreErrors(
|
||||
AddonModAssignOffline.getSubmission(this.assign.id),
|
||||
undefined,
|
||||
);
|
||||
|
@ -67,7 +67,7 @@ export class AddonModAssignSubmissionFileComponent extends AddonModAssignSubmiss
|
|||
// It has offline data.
|
||||
let offlineFiles: FileEntry[] = [];
|
||||
if (offlineDataFiles.offline) {
|
||||
offlineFiles = <FileEntry[]>await CoreUtils.ignoreErrors(
|
||||
offlineFiles = <FileEntry[]>await CorePromiseUtils.ignoreErrors(
|
||||
AddonModAssignHelper.getStoredSubmissionFiles(
|
||||
this.assign.id,
|
||||
AddonModAssignSubmissionFileHandlerService.FOLDER_NAME,
|
||||
|
|
|
@ -25,13 +25,13 @@ import { Injectable, Type } from '@angular/core';
|
|||
import { CoreFileUploader, CoreFileUploaderStoreFilesResult } from '@features/fileuploader/services/fileuploader';
|
||||
import { CoreFileEntry, CoreFileHelper } from '@services/file-helper';
|
||||
import { CoreFileSession } from '@services/file-session';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CoreFileUtils } from '@singletons/file-utils';
|
||||
import { CoreWSFile } from '@services/ws';
|
||||
import { makeSingleton } from '@singletons';
|
||||
import { AddonModAssignSubmissionFileComponent } from '../component/file';
|
||||
import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
|
||||
import type { AddonModAssignSubmissionPluginBaseComponent } from '@addons/mod/assign/classes/base-submission-plugin-component';
|
||||
import { ADDON_MOD_ASSIGN_COMPONENT } from '@addons/mod/assign/constants';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
|
||||
/**
|
||||
* Handler for file submission plugin.
|
||||
|
@ -101,7 +101,9 @@ export class AddonModAssignSubmissionFileHandlerService implements AddonModAssig
|
|||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
getComponent(): Type<AddonModAssignSubmissionPluginBaseComponent> {
|
||||
async getComponent(): Promise<Type<AddonModAssignSubmissionPluginBaseComponent>> {
|
||||
const { AddonModAssignSubmissionFileComponent } = await import('../component/file');
|
||||
|
||||
return AddonModAssignSubmissionFileComponent;
|
||||
}
|
||||
|
||||
|
@ -116,7 +118,7 @@ export class AddonModAssignSubmissionFileHandlerService implements AddonModAssig
|
|||
siteId?: string,
|
||||
): Promise<void> {
|
||||
|
||||
await CoreUtils.ignoreErrors(
|
||||
await CorePromiseUtils.ignoreErrors(
|
||||
AddonModAssignHelper.deleteStoredSubmissionFiles(
|
||||
assign.id,
|
||||
AddonModAssignSubmissionFileHandlerService.FOLDER_NAME,
|
||||
|
@ -174,7 +176,7 @@ export class AddonModAssignSubmissionFileHandlerService implements AddonModAssig
|
|||
submission: AddonModAssignSubmission,
|
||||
plugin: AddonModAssignPlugin,
|
||||
): Promise<boolean> {
|
||||
const offlineData = await CoreUtils.ignoreErrors(
|
||||
const offlineData = await CorePromiseUtils.ignoreErrors(
|
||||
// Check if there's any offline data.
|
||||
AddonModAssignOffline.getSubmission(assign.id, submission.userid),
|
||||
undefined,
|
||||
|
@ -240,7 +242,7 @@ export class AddonModAssignSubmissionFileHandlerService implements AddonModAssig
|
|||
|
||||
// Data has changed, we need to upload new files and re-upload all the existing files.
|
||||
const currentFiles = CoreFileSession.getFiles(ADDON_MOD_ASSIGN_COMPONENT, assign.id);
|
||||
const error = CoreUtils.hasRepeatedFilenames(currentFiles);
|
||||
const error = CoreFileUtils.hasRepeatedFilenames(currentFiles);
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
|
@ -302,7 +304,7 @@ export class AddonModAssignSubmissionFileHandlerService implements AddonModAssig
|
|||
|
||||
if (filesData.offline) {
|
||||
// Has offline files, get them and add them to the list.
|
||||
const storedFiles = <FileEntry[]> await CoreUtils.ignoreErrors(
|
||||
const storedFiles = <FileEntry[]> await CorePromiseUtils.ignoreErrors(
|
||||
AddonModAssignHelper.getStoredSubmissionFiles(
|
||||
assign.id,
|
||||
AddonModAssignSubmissionFileHandlerService.FOLDER_NAME,
|
||||
|
|
|
@ -19,7 +19,7 @@ import { Component, OnInit, ElementRef } from '@angular/core';
|
|||
import { FormBuilder, FormControl } from '@angular/forms';
|
||||
import { CoreSites } from '@services/sites';
|
||||
import { CoreText } from '@singletons/text';
|
||||
import { CoreUtils } from '@services/utils/utils';
|
||||
import { CorePromiseUtils } from '@singletons/promise-utils';
|
||||
import { AddonModAssignSubmissionOnlineTextPluginData } from '../services/handler';
|
||||
import { ContextLevel } from '@/core/constants';
|
||||
import { ADDON_MOD_ASSIGN_COMPONENT } from '@addons/mod/assign/constants';
|
||||
|
@ -60,7 +60,7 @@ export class AddonModAssignSubmissionOnlineTextComponent extends AddonModAssignS
|
|||
*/
|
||||
async ngOnInit(): Promise<void> {
|
||||
// Get the text. Check if we have anything offline.
|
||||
const offlineData = await CoreUtils.ignoreErrors(
|
||||
const offlineData = await CorePromiseUtils.ignoreErrors(
|
||||
AddonModAssignOffline.getSubmission(this.assign.id),
|
||||
undefined,
|
||||
);
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue