From 10da720a4a7afb6ba2a4c57734aa7864ac209148 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Tue, 26 Jun 2018 09:36:40 +0200 Subject: [PATCH] MOBILE-2431 courses: Fix course options not available --- src/core/course/providers/options-delegate.ts | 4 +- .../courses/pages/my-courses/my-courses.ts | 14 +-- .../courses/pages/my-overview/my-overview.ts | 16 ++-- src/core/courses/providers/courses.ts | 10 +++ src/core/user/providers/user-delegate.ts | 89 +++++++++++-------- 5 files changed, 80 insertions(+), 53 deletions(-) diff --git a/src/core/course/providers/options-delegate.ts b/src/core/course/providers/options-delegate.ts index 32357a8da..29875d827 100644 --- a/src/core/course/providers/options-delegate.ts +++ b/src/core/course/providers/options-delegate.ts @@ -395,7 +395,9 @@ export class CoreCourseOptionsDelegate extends CoreDelegate { * @return {Promise} Promise resolved when done. */ protected loadCourseOptions(course: any, refresh?: boolean): Promise { - if (typeof course.navOptions == 'undefined' || typeof course.admOptions == 'undefined' || refresh) { + if (this.coursesProvider.canGetAdminAndNavOptions() && + (typeof course.navOptions == 'undefined' || typeof course.admOptions == 'undefined' || refresh)) { + return this.coursesProvider.getCoursesAdminAndNavOptions([course.id]).then((options) => { course.navOptions = options.navOptions[course.id]; course.admOptions = options.admOptions[course.id]; diff --git a/src/core/courses/pages/my-courses/my-courses.ts b/src/core/courses/pages/my-courses/my-courses.ts index f264cdbdb..72ba51a12 100644 --- a/src/core/courses/pages/my-courses/my-courses.ts +++ b/src/core/courses/pages/my-courses/my-courses.ts @@ -111,12 +111,14 @@ export class CoreCoursesMyCoursesPage implements OnDestroy { })); } - promises.push(this.coursesProvider.getCoursesAdminAndNavOptions(courseIds).then((options) => { - courses.forEach((course) => { - course.navOptions = options.navOptions[course.id]; - course.admOptions = options.admOptions[course.id]; - }); - })); + if (this.coursesProvider.canGetAdminAndNavOptions()) { + promises.push(this.coursesProvider.getCoursesAdminAndNavOptions(courseIds).then((options) => { + courses.forEach((course) => { + course.navOptions = options.navOptions[course.id]; + course.admOptions = options.admOptions[course.id]; + }); + })); + } return Promise.all(promises).then(() => { this.courses = courses; diff --git a/src/core/courses/pages/my-overview/my-overview.ts b/src/core/courses/pages/my-overview/my-overview.ts index da02b2b5d..7062b90e6 100644 --- a/src/core/courses/pages/my-overview/my-overview.ts +++ b/src/core/courses/pages/my-overview/my-overview.ts @@ -223,13 +223,15 @@ export class CoreCoursesMyOverviewPage implements OnDestroy { return course.id; }); - // Load course options of the course. - promises.push(this.coursesProvider.getCoursesAdminAndNavOptions(courseIds).then((options) => { - courses.forEach((course) => { - course.navOptions = options.navOptions[course.id]; - course.admOptions = options.admOptions[course.id]; - }); - })); + if (this.coursesProvider.canGetAdminAndNavOptions()) { + // Load course options of the course. + promises.push(this.coursesProvider.getCoursesAdminAndNavOptions(courseIds).then((options) => { + courses.forEach((course) => { + course.navOptions = options.navOptions[course.id]; + course.admOptions = options.admOptions[course.id]; + }); + })); + } this.courseIds = courseIds.join(','); diff --git a/src/core/courses/providers/courses.ts b/src/core/courses/providers/courses.ts index 797f0a5ee..05629e1f1 100644 --- a/src/core/courses/providers/courses.ts +++ b/src/core/courses/providers/courses.ts @@ -33,6 +33,16 @@ export class CoreCoursesProvider { this.logger = logger.getInstance('CoreCoursesProvider'); } + /** + * Whether current site supports getting course options. + * + * @return {boolean} Whether current site supports getting course options. + */ + canGetAdminAndNavOptions(): boolean { + return this.sitesProvider.wsAvailableInCurrentSite('core_course_get_user_navigation_options') && + this.sitesProvider.wsAvailableInCurrentSite('core_course_get_user_administration_options'); + } + /** * Get categories. They can be filtered by id. * diff --git a/src/core/user/providers/user-delegate.ts b/src/core/user/providers/user-delegate.ts index 9fd4632d4..0261ee2f3 100644 --- a/src/core/user/providers/user-delegate.ts +++ b/src/core/user/providers/user-delegate.ts @@ -213,51 +213,62 @@ export class CoreUserDelegate extends CoreDelegate { * @return {Subject} Resolved with the handlers. */ getProfileHandlersFor(user: any, courseId: number): Subject { - const promises = []; + let promise, + navOptions, + admOptions; + + if (this.coursesProvider.canGetAdminAndNavOptions()) { + // Get course options. + promise = this.coursesProvider.getUserCourses(true).then((courses) => { + const courseIds = courses.map((course) => { + return course.id; + }); + + return this.coursesProvider.getCoursesAdminAndNavOptions(courseIds).then((options) => { + // For backwards compatibility we don't modify the courseId. + const courseIdForOptions = courseId || this.sitesProvider.getCurrentSiteHomeId(); + + navOptions = options.navOptions[courseIdForOptions]; + admOptions = options.admOptions[courseIdForOptions]; + }); + }); + } else { + promise = Promise.resolve(); + } this.userHandlers = []; - // Retrieve course options forcing cache. - this.coursesProvider.getUserCourses(true).then((courses) => { - const courseIds = courses.map((course) => { - return course.id; - }); + promise.then(() => { + const promises = []; - return this.coursesProvider.getCoursesAdminAndNavOptions(courseIds).then((options) => { - // For backwards compatibility we don't modify the courseId. - const courseIdForOptions = courseId || this.sitesProvider.getCurrentSiteHomeId(), - navOptions = options.navOptions[courseIdForOptions], - admOptions = options.admOptions[courseIdForOptions]; - - for (const name in this.enabledHandlers) { - // Checks if the handler is enabled for the user. - const handler = this.handlers[name], - isEnabledForUser = handler.isEnabledForUser(user, courseId, navOptions, admOptions), - promise = Promise.resolve(isEnabledForUser).then((enabled) => { - if (enabled) { - this.userHandlers.push({ - name: name, - data: handler.getDisplayData(user, courseId), - priority: handler.priority, - type: handler.type || CoreUserDelegate.TYPE_NEW_PAGE - }); - } else { - return Promise.reject(null); - } - }).catch(() => { - // Nothing to do here, it is not enabled for this user. - }); - promises.push(promise); - } - - return Promise.all(promises).then(() => { - // Sort them by priority. - this.userHandlers.sort((a, b) => { - return b.priority - a.priority; + for (const name in this.enabledHandlers) { + // Checks if the handler is enabled for the user. + const handler = this.handlers[name], + isEnabledForUser = handler.isEnabledForUser(user, courseId, navOptions, admOptions), + promise = Promise.resolve(isEnabledForUser).then((enabled) => { + if (enabled) { + this.userHandlers.push({ + name: name, + data: handler.getDisplayData(user, courseId), + priority: handler.priority, + type: handler.type || CoreUserDelegate.TYPE_NEW_PAGE + }); + } else { + return Promise.reject(null); + } + }).catch(() => { + // Nothing to do here, it is not enabled for this user. }); - this.loaded = true; - this.observableHandlers.next(this.userHandlers); + promises.push(promise); + } + + return Promise.all(promises).then(() => { + // Sort them by priority. + this.userHandlers.sort((a, b) => { + return b.priority - a.priority; }); + this.loaded = true; + this.observableHandlers.next(this.userHandlers); }); }).catch(() => { // Never fails.