MOBILE-2921 lesson: Support lesson grade push clicks

main
Dani Palou 2019-04-01 14:42:26 +02:00
parent bb7e1217a9
commit 9e831bdf7a
5 changed files with 184 additions and 24 deletions

View File

@ -17,6 +17,7 @@ import { CoreCronDelegate } from '@providers/cron';
import { CoreCourseModuleDelegate } from '@core/course/providers/module-delegate';
import { CoreCourseModulePrefetchDelegate } from '@core/course/providers/module-prefetch-delegate';
import { CoreContentLinksDelegate } from '@core/contentlinks/providers/delegate';
import { CorePushNotificationsDelegate } from '@core/pushnotifications/providers/delegate';
import { AddonModLessonComponentsModule } from './components/components.module';
import { AddonModLessonProvider } from './providers/lesson';
import { AddonModLessonOfflineProvider } from './providers/lesson-offline';
@ -29,6 +30,7 @@ import { AddonModLessonIndexLinkHandler } from './providers/index-link-handler';
import { AddonModLessonGradeLinkHandler } from './providers/grade-link-handler';
import { AddonModLessonReportLinkHandler } from './providers/report-link-handler';
import { AddonModLessonListLinkHandler } from './providers/list-link-handler';
import { AddonModLessonPushClickHandler } from './providers/push-click-handler';
import { CoreUpdateManagerProvider } from '@providers/update-manager';
// List of providers (without handlers).
@ -56,7 +58,8 @@ export const ADDON_MOD_LESSON_PROVIDERS: any[] = [
AddonModLessonIndexLinkHandler,
AddonModLessonGradeLinkHandler,
AddonModLessonReportLinkHandler,
AddonModLessonListLinkHandler
AddonModLessonListLinkHandler,
AddonModLessonPushClickHandler
]
})
export class AddonModLessonModule {
@ -65,7 +68,8 @@ export class AddonModLessonModule {
cronDelegate: CoreCronDelegate, syncHandler: AddonModLessonSyncCronHandler, linksDelegate: CoreContentLinksDelegate,
indexHandler: AddonModLessonIndexLinkHandler, gradeHandler: AddonModLessonGradeLinkHandler,
reportHandler: AddonModLessonReportLinkHandler, updateManager: CoreUpdateManagerProvider,
listLinkHandler: AddonModLessonListLinkHandler) {
listLinkHandler: AddonModLessonListLinkHandler, pushNotificationsDelegate: CorePushNotificationsDelegate,
pushClickHandler: AddonModLessonPushClickHandler) {
moduleDelegate.registerHandler(moduleHandler);
prefetchDelegate.registerHandler(prefetchHandler);
@ -74,6 +78,7 @@ export class AddonModLessonModule {
linksDelegate.registerHandler(gradeHandler);
linksDelegate.registerHandler(reportHandler);
linksDelegate.registerHandler(listLinkHandler);
pushNotificationsDelegate.registerClickHandler(pushClickHandler);
// Allow migrating the tables from the old app to the new schema.
updateManager.registerSiteTablesMigration([

View File

@ -0,0 +1,117 @@
// (C) Copyright 2015 Martin Dougiamas
//
// 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.
import { Injectable } from '@angular/core';
import { CoreUtilsProvider } from '@providers/utils/utils';
import { CoreDomUtilsProvider } from '@providers/utils/dom';
import { CorePushNotificationsClickHandler } from '@core/pushnotifications/providers/delegate';
import { CoreLoginHelperProvider } from '@core/login/providers/helper';
import { CoreCourseHelperProvider } from '@core/course/providers/helper';
import { CoreGradesProvider } from '@core/grades/providers/grades';
import { AddonModLessonProvider } from './lesson';
/**
* Handler for lesson push notifications clicks.
*/
@Injectable()
export class AddonModLessonPushClickHandler implements CorePushNotificationsClickHandler {
name = 'AddonModLessonPushClickHandler';
priority = 200;
featureName = 'CoreCourseModuleDelegate_AddonModLesson';
constructor(private utils: CoreUtilsProvider, private lessonProvider: AddonModLessonProvider,
private loginHelper: CoreLoginHelperProvider, private domUtils: CoreDomUtilsProvider,
private courseHelper: CoreCourseHelperProvider, private gradesProvider: CoreGradesProvider) {}
/**
* Check if a notification click is handled by this handler.
*
* @param {any} notification The notification to check.
* @return {boolean} Whether the notification click is handled by this handler
*/
handles(notification: any): boolean | Promise<boolean> {
if (this.utils.isTrueOrOne(notification.notif) && notification.moodlecomponent == 'mod_lesson' &&
notification.name == 'graded_essay') {
return this.lessonProvider.isPluginEnabled(notification.site);
}
return false;
}
/**
* Handle the notification click.
*
* @param {any} notification The notification to check.
* @return {Promise<any>} Promise resolved when done.
*/
handleClick(notification: any): Promise<any> {
const data = notification.customdata || {},
courseId = Number(notification.courseid),
moduleId = Number(data.cmid),
modal = this.domUtils.showModalLoading();
let promise;
if (moduleId) {
// Try to open the module grade directly. Check if it's possible.
promise = this.gradesProvider.isGradeItemsAvalaible(notification.site).catch(() => {
return false;
});
} else {
promise = Promise.resolve(false);
}
return promise.then((getGrades) => {
if (getGrades) {
return this.gradesProvider.getGradeItems(courseId, undefined, undefined, notification.site).then((items) => {
// Find the item of th module.
const item = items.find((item) => {
return moduleId == item.cmid;
});
if (item) {
// Open the item directly.
const pageParams: any = {
courseId: courseId,
gradeId: item.id
};
this.loginHelper.redirect('CoreGradesGradePage', pageParams, notification.site);
}
return Promise.reject(null);
});
} else {
return Promise.reject(null);
}
}).catch(() => {
// Cannot get grade items or there's no need to. Open the course with the grades tab selected.
return this.courseHelper.getCourse(courseId, notification.site).then((result) => {
const pageParams: any = {
course: result.course,
selectedTab: 'CoreGrades'
};
this.loginHelper.redirect('CoreCourseSectionPage', pageParams, notification.site);
});
}).catch(() => {
// Cannot get course for some reason, just open the grades page.
return this.loginHelper.redirect('CoreGradesCoursePage', {course: {id: courseId}}, notification.site);
}).finally(() => {
modal.dismiss();
});
}
}

View File

@ -15,7 +15,10 @@
import { Injectable } from '@angular/core';
import { CoreContentLinksHandlerBase } from '@core/contentlinks/classes/base-handler';
import { CoreContentLinksAction } from '@core/contentlinks/providers/delegate';
import { CoreCourseHelperProvider } from '@core/course/providers/helper';
import { CoreContentLinksHelperProvider } from '@core/contentlinks/providers/helper';
import { CoreLoginHelperProvider } from '@core/login/providers/helper';
import { CoreDomUtilsProvider } from '@providers/utils/dom';
import { CoreGradesProvider } from './grades';
/**
@ -26,7 +29,9 @@ export class CoreGradesUserLinkHandler extends CoreContentLinksHandlerBase {
name = 'CoreGradesUserLinkHandler';
pattern = /\/grade\/report\/user\/index.php/;
constructor(private linkHelper: CoreContentLinksHelperProvider, private gradesProvider: CoreGradesProvider) {
constructor(private linkHelper: CoreContentLinksHelperProvider, private gradesProvider: CoreGradesProvider,
private domUtils: CoreDomUtilsProvider, private courseHelper: CoreCourseHelperProvider,
private loginHelper: CoreLoginHelperProvider) {
super();
}
@ -41,14 +46,39 @@ export class CoreGradesUserLinkHandler extends CoreContentLinksHandlerBase {
*/
getActions(siteIds: string[], url: string, params: any, courseId?: number):
CoreContentLinksAction[] | Promise<CoreContentLinksAction[]> {
courseId = courseId || params.id;
return [{
action: (siteId, navCtrl?): void => {
const pageParams = {
course: {id: courseId},
userId: params.userid ? parseInt(params.userid, 10) : false,
};
// Always use redirect to make it the new history root (to avoid "loops" in history).
this.linkHelper.goInSite(navCtrl, 'CoreGradesCoursePage', pageParams, siteId);
const userId = params.userid ? parseInt(params.userid, 10) : false;
if (userId) {
// Open the grades page directly.
const pageParams = {
course: {id: courseId},
userId: userId,
};
this.linkHelper.goInSite(navCtrl, 'CoreGradesCoursePage', pageParams, siteId);
} else {
// No userid, open the course with the grades tab selected.
const modal = this.domUtils.showModalLoading();
this.courseHelper.getCourse(courseId, siteId).then((result) => {
const pageParams: any = {
course: result.course,
selectedTab: 'CoreGrades'
};
// Use redirect to prevent loops in the navigation.
return this.loginHelper.redirect('CoreCourseSectionPage', pageParams, siteId);
}).catch(() => {
// Cannot get course for some reason, just open the grades page.
return this.linkHelper.goInSite(navCtrl, 'CoreGradesCoursePage', {course: {id: courseId}}, siteId);
}).finally(() => {
modal.dismiss();
});
}
}
}];
}
@ -64,10 +94,10 @@ export class CoreGradesUserLinkHandler extends CoreContentLinksHandlerBase {
* @return {boolean|Promise<boolean>} Whether the handler is enabled for the URL and site.
*/
isEnabled(siteId: string, url: string, params: any, courseId?: number): boolean | Promise<boolean> {
if (!courseId) {
if (!courseId && !params.id) {
return false;
}
return this.gradesProvider.isPluginEnabledForCourse(courseId, siteId);
return this.gradesProvider.isPluginEnabledForCourse(courseId || params.id, siteId);
}
}

View File

@ -591,26 +591,28 @@ export class CoreLoginHelperProvider {
* @param {string} page Name of the page to load.
* @param {any} params Params to pass to the page.
* @param {string} siteId Site to load.
* @return {Promise<any>} Promise resolved when done.
*/
protected loadSiteAndPage(page: string, params: any, siteId: string): void {
protected loadSiteAndPage(page: string, params: any, siteId: string): Promise<any> {
const navCtrl = this.appProvider.getRootNavController();
if (siteId == CoreConstants.NO_SITE_ID) {
// Page doesn't belong to a site, just load the page.
navCtrl.setRoot(page, params);
return navCtrl.setRoot(page, params);
} else {
const modal = this.domUtils.showModalLoading();
this.sitesProvider.loadSite(siteId, page, params).then((loggedIn) => {
return this.sitesProvider.loadSite(siteId, page, params).then((loggedIn) => {
if (loggedIn) {
// Due to DeepLinker, we need to remove the path from the URL before going to main menu.
// IonTabs checks the URL to determine which path to load for deep linking, so we clear the URL.
this.location.replaceState('');
navCtrl.setRoot('CoreMainMenuPage', { redirectPage: page, redirectParams: params });
return navCtrl.setRoot('CoreMainMenuPage', { redirectPage: page, redirectParams: params });
}
}).catch((error) => {
// Site doesn't exist.
navCtrl.setRoot('CoreLoginSitesPage');
return navCtrl.setRoot('CoreLoginSitesPage');
}).finally(() => {
modal.dismiss();
});
@ -794,8 +796,9 @@ export class CoreLoginHelperProvider {
* @param {string} page Name of the page to load.
* @param {any} params Params to pass to the page.
* @param {string} [siteId] Site to load. If not defined, current site.
* @return {Promise<any>} Promise resolved when done.
*/
redirect(page: string, params?: any, siteId?: string): void {
redirect(page: string, params?: any, siteId?: string): Promise<any> {
siteId = siteId || this.sitesProvider.getCurrentSiteId();
if (this.sitesProvider.isLoggedIn()) {
@ -804,10 +807,11 @@ export class CoreLoginHelperProvider {
if (this.sitePluginsProvider.hasSitePluginsLoaded) {
// The site has site plugins so the app will be restarted. Store the data and logout.
this.appProvider.storeRedirect(siteId, page, params);
this.sitesProvider.logout();
return this.sitesProvider.logout();
} else {
this.sitesProvider.logout().then(() => {
this.loadSiteAndPage(page, params, siteId);
return this.sitesProvider.logout().then(() => {
return this.loadSiteAndPage(page, params, siteId);
});
}
} else {
@ -815,11 +819,13 @@ export class CoreLoginHelperProvider {
}
} else {
if (siteId) {
this.loadSiteAndPage(page, params, siteId);
return this.loadSiteAndPage(page, params, siteId);
} else {
this.appProvider.getRootNavController().setRoot('CoreLoginSitesPage');
return this.appProvider.getRootNavController().setRoot('CoreLoginSitesPage');
}
}
return Promise.resolve();
}
/**

View File

@ -18,6 +18,7 @@ import { CoreContentLinksHandlerBase } from '@core/contentlinks/classes/base-han
import { CoreContentLinksAction } from '@core/contentlinks/providers/delegate';
import { CoreLoginHelperProvider } from '@core/login/providers/helper';
import { CoreCourseHelperProvider } from '@core/course/providers/helper';
import { CoreContentLinksHelperProvider } from '@core/contentlinks/providers/helper';
import { CoreUserProvider } from './user';
/**
@ -30,7 +31,8 @@ export class CoreUserParticipantsLinkHandler extends CoreContentLinksHandlerBase
pattern = /\/user\/index\.php/;
constructor(private userProvider: CoreUserProvider, private loginHelper: CoreLoginHelperProvider,
private courseHelper: CoreCourseHelperProvider, private domUtils: CoreDomUtilsProvider) {
private courseHelper: CoreCourseHelperProvider, private domUtils: CoreDomUtilsProvider,
private linkHelper: CoreContentLinksHelperProvider) {
super();
}
@ -61,7 +63,7 @@ export class CoreUserParticipantsLinkHandler extends CoreContentLinksHandlerBase
return this.loginHelper.redirect('CoreCourseSectionPage', params, siteId);
}).catch(() => {
// Cannot get course for some reason, just open the participants page.
this.loginHelper.redirect('CoreUserParticipantsPage', {courseId: courseId}, siteId);
return this.linkHelper.goInSite(navCtrl, 'CoreUserParticipantsPage', {courseId: courseId}, siteId);
}).finally(() => {
modal.dismiss();
});