From 61ab280b2d97368bbcde19ea06a4dbfbd29ddff1 Mon Sep 17 00:00:00 2001 From: Albert Gasset Date: Fri, 9 Mar 2018 15:21:18 +0100 Subject: [PATCH 1/3] MOBILE-2323 learning plans: Migrate learning plans --- src/addon/competency/competency.module.ts | 68 +++ .../components/components.module.ts | 45 ++ .../competency/components/course/course.html | 73 +++ .../competency/components/course/course.ts | 112 ++++ src/addon/competency/lang/en.json | 47 ++ .../pages/competencies/competencies.html | 21 + .../pages/competencies/competencies.module.ts | 35 ++ .../pages/competencies/competencies.ts | 143 +++++ .../pages/competency/competency.html | 95 +++ .../pages/competency/competency.module.ts | 35 ++ .../competency/pages/competency/competency.ts | 184 ++++++ .../competencysummary/competencysummary.html | 24 + .../competencysummary.module.ts | 35 ++ .../competencysummary/competencysummary.ts | 94 +++ .../coursecompetencies.html | 6 + .../coursecompetencies.module.ts | 37 ++ .../coursecompetencies/coursecompetencies.ts | 42 ++ src/addon/competency/pages/plan/plan.html | 56 ++ .../competency/pages/plan/plan.module.ts | 35 ++ src/addon/competency/pages/plan/plan.ts | 132 ++++ .../competency/pages/planlist/planlist.html | 22 + .../pages/planlist/planlist.module.ts | 35 ++ .../competency/pages/planlist/planlist.ts | 103 ++++ src/addon/competency/providers/competency.ts | 572 ++++++++++++++++++ .../providers/course-option-handler.ts | 109 ++++ src/addon/competency/providers/helper.ts | 46 ++ .../competency/providers/mainmenu-handler.ts | 60 ++ .../competency/providers/user-handler.ts | 128 ++++ src/app/app.module.ts | 2 + 29 files changed, 2396 insertions(+) create mode 100644 src/addon/competency/competency.module.ts create mode 100644 src/addon/competency/components/components.module.ts create mode 100644 src/addon/competency/components/course/course.html create mode 100644 src/addon/competency/components/course/course.ts create mode 100644 src/addon/competency/lang/en.json create mode 100644 src/addon/competency/pages/competencies/competencies.html create mode 100644 src/addon/competency/pages/competencies/competencies.module.ts create mode 100644 src/addon/competency/pages/competencies/competencies.ts create mode 100644 src/addon/competency/pages/competency/competency.html create mode 100644 src/addon/competency/pages/competency/competency.module.ts create mode 100644 src/addon/competency/pages/competency/competency.ts create mode 100644 src/addon/competency/pages/competencysummary/competencysummary.html create mode 100644 src/addon/competency/pages/competencysummary/competencysummary.module.ts create mode 100644 src/addon/competency/pages/competencysummary/competencysummary.ts create mode 100644 src/addon/competency/pages/coursecompetencies/coursecompetencies.html create mode 100644 src/addon/competency/pages/coursecompetencies/coursecompetencies.module.ts create mode 100644 src/addon/competency/pages/coursecompetencies/coursecompetencies.ts create mode 100644 src/addon/competency/pages/plan/plan.html create mode 100644 src/addon/competency/pages/plan/plan.module.ts create mode 100644 src/addon/competency/pages/plan/plan.ts create mode 100644 src/addon/competency/pages/planlist/planlist.html create mode 100644 src/addon/competency/pages/planlist/planlist.module.ts create mode 100644 src/addon/competency/pages/planlist/planlist.ts create mode 100644 src/addon/competency/providers/competency.ts create mode 100644 src/addon/competency/providers/course-option-handler.ts create mode 100644 src/addon/competency/providers/helper.ts create mode 100644 src/addon/competency/providers/mainmenu-handler.ts create mode 100644 src/addon/competency/providers/user-handler.ts diff --git a/src/addon/competency/competency.module.ts b/src/addon/competency/competency.module.ts new file mode 100644 index 000000000..a2a7b5dac --- /dev/null +++ b/src/addon/competency/competency.module.ts @@ -0,0 +1,68 @@ +// (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 { NgModule } from '@angular/core'; +import { AddonCompetencyProvider } from './providers/competency'; +import { AddonCompetencyHelperProvider } from './providers/helper'; +import { AddonCompetencyCourseOptionHandler } from './providers/course-option-handler'; +import { AddonCompetencyMainMenuHandler } from './providers/mainmenu-handler'; +import { AddonCompetencyUserHandler } from './providers/user-handler'; +import { AddonCompetencyComponentsModule } from './components/components.module'; +import { CoreCourseProvider } from '../../core/course/providers/course'; +import { CoreCourseOptionsDelegate } from '../../core/course/providers/options-delegate'; +import { CoreMainMenuDelegate } from '../../core/mainmenu/providers/delegate'; +import { CoreUserDelegate } from '../../core/user/providers/user-delegate'; +import { CoreUserProvider } from '../../core/user/providers/user'; +import { CoreEventsProvider } from '../../providers/events'; +import { CoreSitesProvider } from '../../providers/sites'; +import { CoreCoursesProvider } from '../../core/courses/providers/courses'; + +@NgModule({ + declarations: [ + ], + imports: [ + AddonCompetencyComponentsModule + ], + providers: [ + AddonCompetencyProvider, + AddonCompetencyHelperProvider, + AddonCompetencyCourseOptionHandler, + AddonCompetencyMainMenuHandler, + AddonCompetencyUserHandler + ] +}) +export class AddonCompetencyModule { + constructor(mainMenuDelegate: CoreMainMenuDelegate, mainMenuHandler: AddonCompetencyMainMenuHandler, + courseOptionsDelegate: CoreCourseOptionsDelegate, courseOptionHandler: AddonCompetencyCourseOptionHandler, + userDelegate: CoreUserDelegate, userHandler: AddonCompetencyUserHandler, + eventsProvider: CoreEventsProvider, sitesProvider: CoreSitesProvider) { + + mainMenuDelegate.registerHandler(mainMenuHandler); + courseOptionsDelegate.registerHandler(courseOptionHandler); + userDelegate.registerHandler(userHandler); + + eventsProvider.on(CoreEventsProvider.LOGOUT, () => { + courseOptionHandler.clearCoursesNavCache(); + userHandler.clearUsersNavCache(); + }, sitesProvider.getCurrentSiteId()); + + eventsProvider.on(CoreCoursesProvider.EVENT_MY_COURSES_REFRESHED, () => { + courseOptionHandler.clearCoursesNavCache(); + }, sitesProvider.getCurrentSiteId()); + + eventsProvider.on(CoreUserProvider.PROFILE_REFRESHED, () => { + userHandler.clearUsersNavCache(); + }, sitesProvider.getCurrentSiteId()); + } +} diff --git a/src/addon/competency/components/components.module.ts b/src/addon/competency/components/components.module.ts new file mode 100644 index 000000000..651b2a9aa --- /dev/null +++ b/src/addon/competency/components/components.module.ts @@ -0,0 +1,45 @@ +// (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 { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { IonicModule } from 'ionic-angular'; +import { TranslateModule } from '@ngx-translate/core'; +import { CoreComponentsModule } from '../../../components/components.module'; +import { CoreDirectivesModule } from '../../../directives/directives.module'; +import { CorePipesModule } from '../../../pipes/pipes.module'; +import { AddonCompetencyCourseComponent } from './course/course'; + +@NgModule({ + declarations: [ + AddonCompetencyCourseComponent + ], + imports: [ + CommonModule, + IonicModule, + TranslateModule.forChild(), + CoreComponentsModule, + CoreDirectivesModule, + CorePipesModule + ], + providers: [ + ], + exports: [ + AddonCompetencyCourseComponent + ], + entryComponents: [ + AddonCompetencyCourseComponent + ] +}) +export class AddonCompetencyComponentsModule {} diff --git a/src/addon/competency/components/course/course.html b/src/addon/competency/components/course/course.html new file mode 100644 index 000000000..c1344b369 --- /dev/null +++ b/src/addon/competency/components/course/course.html @@ -0,0 +1,73 @@ + + + + + + + + {{ 'addon.competency.coursecompetencyratingsarepushedtouserplans' | translate }} + + + {{ 'addon.competency.coursecompetencyratingsarenotpushedtouserplans' | translate }} + + + {{ 'addon.competency.progress' | translate }}: + {{ 'addon.competency.xcompetenciesproficientoutofyincourse' | translate:{$a: {x: competencies.statistics.proficientcompetencycount, y: competencies.statistics.competencycount} } }} ({{ competencies.statistics.proficientcompetencypercentageformatted }}%) + + + + {{ 'addon.competency.competenciesmostoftennotproficientincourse' | translate }}: +

+ + {{ comp.shortname }} - {{ comp.idnumber }} + +

+
+
+ +

{{ 'addon.competency.competencies' | translate }}

+ + + + + + + + +

+
+
+ + +
+ + + {{competency.competency.shortname}} {{competency.competency.idnumber}} + {{ competency.usercompetencycourse.gradename }}
+
+ +
+ +
+
+ {{ 'addon.competency.path' | translate }}: + {{ competency.comppath.framework.name }} + +  / {{ ancestor.name }} + +
+
+ {{ 'addon.competency.activities' | translate }}: + + {{ 'addon.competency.noactivities' | translate }} + + + + + +
+
+
+
+
+
diff --git a/src/addon/competency/components/course/course.ts b/src/addon/competency/components/course/course.ts new file mode 100644 index 000000000..955462760 --- /dev/null +++ b/src/addon/competency/components/course/course.ts @@ -0,0 +1,112 @@ +// (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 { Component, ViewChild, Input, Optional } from '@angular/core'; +import { Content, NavController } from 'ionic-angular'; +import { TranslateService } from '@ngx-translate/core'; +import { CoreAppProvider } from '../../../../providers/app'; +import { CoreDomUtilsProvider } from '../../../../providers/utils/dom'; +import { AddonCompetencyProvider } from '../../providers/competency'; +import { AddonCompetencyHelperProvider } from '../../providers/helper'; + +/** + * Component that displays the competencies of a course. + */ +@Component({ + selector: 'addon-competency-course', + templateUrl: 'course.html', +}) +export class AddonCompetencyCourseComponent { + @ViewChild(Content) content: Content; + + @Input() courseId: number; + @Input() userId: number; + + competenciesLoaded = false; + competencies: any; + user: any; + + constructor(private navCtrl: NavController, private translate: TranslateService, + private appProvider: CoreAppProvider, private domUtils: CoreDomUtilsProvider, + private competencyProvider: AddonCompetencyProvider, private helperProvider: AddonCompetencyHelperProvider) { + } + + /** + * View loaded. + */ + ngOnInit(): void { + this.fetchCourseCompetencies().finally(() => { + this.competenciesLoaded = true; + }); + } + + /** + * Fetches the competencies and updates the view. + * + * @return {Promise} Promise resolved when done. + */ + protected fetchCourseCompetencies(): Promise { + return this.competencyProvider.getCourseCompetencies(this.courseId, this.userId).then((competencies) => { + this.competencies = competencies; + + // Get the user profile image. + this.helperProvider.getProfile(this.userId).then((user) => { + this.user = user; + }); + }, (message) => { + if (message) { + this.domUtils.showErrorModal(message); + } else { + this.domUtils.showErrorModal('Error getting course competencies data.'); + } + + return Promise.reject(null); + }); + } + + /** + * Opens a competency. + * + * @param {number} competencyId + */ + openCompetency(competencyId: number): void { + if (this.appProvider.isWide()) { + this.navCtrl.push('AddonCompetencyCompetenciesPage', {competencyId, courseId: this.courseId, userId: this.userId}); + } else { + this.navCtrl.push('AddonCompetencyCompetencyPage', {competencyId, courseId: this.courseId, userId: this.userId}); + } + } + + /** + * Opens the summary of a competency. + * + * @param {number} competencyId + */ + openCompetencySummary(competencyId: number): void { + this.navCtrl.push('AddonCompetencyCompetencySummaryPage', {competencyId}); + } + + /** + * Refreshes the competencies. + * + * @param {any} refresher Refresher. + */ + refreshCourseCompetencies(refresher: any): void { + this.competencyProvider.invalidateCourseCompetencies(this.courseId, this.userId).finally(() => { + this.fetchCourseCompetencies().finally(() => { + refresher.complete(); + }); + }); + } +} diff --git a/src/addon/competency/lang/en.json b/src/addon/competency/lang/en.json new file mode 100644 index 000000000..a36bacbd7 --- /dev/null +++ b/src/addon/competency/lang/en.json @@ -0,0 +1,47 @@ +{ + "activities": "Activities", + "competencies": "Competencies", + "competenciesmostoftennotproficientincourse": "Competencies most often not proficient in this course", + "coursecompetencies": "Course competencies", + "coursecompetencyratingsarenotpushedtouserplans": "Competency ratings in this course do not affect learning plans.", + "coursecompetencyratingsarepushedtouserplans": "Competency ratings in this course are updated immediately in learning plans.", + "crossreferencedcompetencies": "Cross-referenced competencies", + "duedate": "Due date", + "errornocompetenciesfound": "No competencies found", + "evidence": "Evidence", + "evidence_competencyrule": "The rule of the competency was met.", + "evidence_coursecompleted": "The course '{{$a}}' was completed.", + "evidence_coursemodulecompleted": "The activity '{{$a}}' was completed.", + "evidence_courserestored": "The rating was restored along with the course '{{$a}}'.", + "evidence_evidenceofpriorlearninglinked": "The evidence of prior learning '{{$a}}' was linked.", + "evidence_evidenceofpriorlearningunlinked": "The evidence of prior learning '{{$a}}' was unlinked.", + "evidence_manualoverride": "The competency rating was manually set.", + "evidence_manualoverrideincourse": "The competency rating was manually set in the course '{{$a}}'.", + "evidence_manualoverrideinplan": "The competency rating was manually set in the learning plan '{{$a}}'.", + "learningplancompetencies": "Learning plan competencies", + "learningplans": "Learning plans", + "myplans": "My learning plans", + "noactivities": "No activities", + "nocompetencies": "No competencies", + "nocrossreferencedcompetencies": "No other competencies have been cross-referenced to this competency.", + "noevidence": "No evidence", + "noplanswerecreated": "No learning plans were created.", + "path": "Path:", + "planstatusactive": "Active", + "planstatuscomplete": "Complete", + "planstatusdraft": "Draft", + "planstatusinreview": "In review", + "planstatuswaitingforreview": "Waiting for review", + "proficient": "Proficient", + "progress": "Progress", + "rating": "Rating", + "reviewstatus": "Review status", + "status": "Status", + "template": "Learning plan template", + "usercompetencystatus_idle": "Idle", + "usercompetencystatus_inreview": "In review", + "usercompetencystatus_waitingforreview": "Waiting for review", + "userplans": "Learning plans", + "xcompetenciesproficientoutofy": "{{$a.x}} out of {{$a.y}} competencies are proficient", + "xcompetenciesproficientoutofyincourse": "You are proficient in {{$a.x}} out of {{$a.y}} competencies in this course." +} \ No newline at end of file diff --git a/src/addon/competency/pages/competencies/competencies.html b/src/addon/competency/pages/competencies/competencies.html new file mode 100644 index 000000000..158f421c1 --- /dev/null +++ b/src/addon/competency/pages/competencies/competencies.html @@ -0,0 +1,21 @@ + + + {{ title }} + + + + + + + + + + + {{ competency.competency.shortname }} {{competency.competency.idnumber}} + {{ competency.usercompetency.gradename }} + {{ competency.usercompetencycourse.gradename }} + + + + + \ No newline at end of file diff --git a/src/addon/competency/pages/competencies/competencies.module.ts b/src/addon/competency/pages/competencies/competencies.module.ts new file mode 100644 index 000000000..6effd59fd --- /dev/null +++ b/src/addon/competency/pages/competencies/competencies.module.ts @@ -0,0 +1,35 @@ +// (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 { NgModule } from '@angular/core'; +import { IonicPageModule } from 'ionic-angular'; +import { TranslateModule } from '@ngx-translate/core'; +import { CoreComponentsModule } from '../../../../components/components.module'; +import { CoreDirectivesModule } from '../../../../directives/directives.module'; +import { CorePipesModule } from '../../../../pipes/pipes.module'; +import { AddonCompetencyCompetenciesPage } from './competencies'; + +@NgModule({ + declarations: [ + AddonCompetencyCompetenciesPage, + ], + imports: [ + CoreComponentsModule, + CoreDirectivesModule, + CorePipesModule, + IonicPageModule.forChild(AddonCompetencyCompetenciesPage), + TranslateModule.forChild() + ], +}) +export class AddonCompetencyCompetenciesPageModule {} diff --git a/src/addon/competency/pages/competencies/competencies.ts b/src/addon/competency/pages/competencies/competencies.ts new file mode 100644 index 000000000..b016b349f --- /dev/null +++ b/src/addon/competency/pages/competencies/competencies.ts @@ -0,0 +1,143 @@ +// (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 { Component, ViewChild } from '@angular/core'; +import { IonicPage, NavController, NavParams } from 'ionic-angular'; +import { TranslateService } from '@ngx-translate/core'; +import { CoreDomUtilsProvider } from '../../../../providers/utils/dom'; +import { CoreSplitViewComponent } from '../../../../components/split-view/split-view'; +import { AddonCompetencyProvider } from '../../providers/competency'; + +/** + * Page that displays the list of competencies of a learning plan. + */ +@IonicPage({ segment: 'addon-competency-competencies' }) +@Component({ + selector: 'page-addon-competency-competencies', + templateUrl: 'competencies.html', +}) +export class AddonCompetencyCompetenciesPage { + @ViewChild(CoreSplitViewComponent) splitviewCtrl: CoreSplitViewComponent; + + protected planId: number; + protected courseId: number; + protected competencyId: number; + protected userId: number; + + competenciesLoaded = false; + competencies = []; + title: string; + + constructor(private navCtrl: NavController, navParams: NavParams, private translate: TranslateService, + private domUtils: CoreDomUtilsProvider, private competencyProvider: AddonCompetencyProvider) { + this.planId = navParams.get('planId'); + this.courseId = navParams.get('courseId'); + this.competencyId = navParams.get('competencyId'); + this.userId = navParams.get('userId'); + } + + /** + * View loaded. + */ + ionViewDidLoad(): void { + if (this.competencyId) { + // There is a competency to load. + this.openCompetency(this.competencyId); + } + + this.fetchCompetencies().then(() => { + if (!this.competencyId && this.splitviewCtrl.isOn() && this.competencies.length > 0) { + // Take first and load it. + this.openCompetency(this.competencies[0].id); + } + }).finally(() => { + this.competenciesLoaded = true; + }); + } + + /** + * Fetches the competencies and updates the view. + * + * @return {Promise} Promise resolved when done. + */ + protected fetchCompetencies(): Promise { + let promise; + + if (this.planId) { + promise = this.competencyProvider.getLearningPlan(this.planId); + } else if (this.courseId) { + promise = this.competencyProvider.getCourseCompetencies(this.courseId, this.userId); + } else { + promise = Promise.reject(null); + } + + return promise.then((response) => { + if (response.competencycount <= 0) { + return Promise.reject(this.translate.instant('addon.competency.errornocompetenciesfound')); + } + + if (this.planId) { + this.title = response.plan.name; + this.userId = response.plan.userid; + } else { + this.title = this.translate.instant('addon.competency.coursecompetencies'); + } + this.competencies = response.competencies; + }).catch((message) => { + if (message) { + this.domUtils.showErrorModal(message); + } else { + this.domUtils.showErrorModal('Error getting competencies data.'); + } + + return Promise.reject(null); + }); + } + + /** + * Opens a competency. + * + * @param {number} competencyId + */ + openCompetency(competencyId: number): void { + this.competencyId = competencyId; + let params; + if (this.planId) { + params = {competencyId, planId: this.planId}; + } else { + params = {competencyId, courseId: this.courseId, userId: this.userId}; + } + this.splitviewCtrl.push('AddonCompetencyCompetencyPage', params); + } + + /** + * Refreshes the competencies. + * + * @param {any} refresher Refresher. + */ + refreshCompetencies(refresher: any): void { + let promise; + if (this.planId) { + promise = this.competencyProvider.invalidateLearningPlan(this.planId); + } else { + promise = this.competencyProvider.invalidateCourseCompetencies(this.courseId, this.userId); + } + + return promise.finally(() => { + this.fetchCompetencies().finally(() => { + refresher.complete(); + }); + }); + } +} diff --git a/src/addon/competency/pages/competency/competency.html b/src/addon/competency/pages/competency/competency.html new file mode 100644 index 000000000..0e01be423 --- /dev/null +++ b/src/addon/competency/pages/competency/competency.html @@ -0,0 +1,95 @@ + + + {{ competency.competency.competency.shortname }} {{ competency.competency.competency.idnumber }} + + + + + + + + + + + + + + + +

+
+
+ + + + + + + {{ 'addon.competency.path' | translate }}: + {{ competency.competency.comppath.framework.name }} + +  / {{ ancestor.name }} + + + + {{ 'addon.competency.crossreferencedcompetencies' | translate }}: +
{{ 'addon.competency.nocrossreferencedcompetencies' | translate }}
+ +
+ + {{ 'addon.competency.activities' | translate }}: + + {{ 'addon.competency.noactivities' | translate }} + + + + + + + + {{ 'addon.competency.reviewstatus' | translate }}: + {{ competency.usercompetency.statusname }} + + + {{ 'addon.competency.proficient' | translate }}: + + {{ 'core.yes' | translate }} + + + {{ 'core.no' | translate }} + + + + {{ 'addon.competency.rating' | translate }}: + {{ competency.usercompetency.gradename }} + +
+ +
+

{{ 'addon.competency.evidence' | translate }}

+

+ {{ 'addon.competency.noevidence' | translate }} +

+ + + + + +

{{ evidence.actionuser.fullname }}

+

{{ evidence.timemodified | coreToLocaleString }}

+
+ +

{{ evidence.gradename }}

+

{{ evidence.description }}

+
+
+
+
+
+
diff --git a/src/addon/competency/pages/competency/competency.module.ts b/src/addon/competency/pages/competency/competency.module.ts new file mode 100644 index 000000000..e188fc222 --- /dev/null +++ b/src/addon/competency/pages/competency/competency.module.ts @@ -0,0 +1,35 @@ +// (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 { NgModule } from '@angular/core'; +import { IonicPageModule } from 'ionic-angular'; +import { TranslateModule } from '@ngx-translate/core'; +import { CoreComponentsModule } from '../../../../components/components.module'; +import { CoreDirectivesModule } from '../../../../directives/directives.module'; +import { CorePipesModule } from '../../../../pipes/pipes.module'; +import { AddonCompetencyCompetencyPage } from './competency'; + +@NgModule({ + declarations: [ + AddonCompetencyCompetencyPage, + ], + imports: [ + CoreComponentsModule, + CoreDirectivesModule, + CorePipesModule, + IonicPageModule.forChild(AddonCompetencyCompetencyPage), + TranslateModule.forChild() + ], +}) +export class AddonCompetencyCompetencyPageModule {} diff --git a/src/addon/competency/pages/competency/competency.ts b/src/addon/competency/pages/competency/competency.ts new file mode 100644 index 000000000..e8b2ff2f0 --- /dev/null +++ b/src/addon/competency/pages/competency/competency.ts @@ -0,0 +1,184 @@ +// (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 { Component, Optional } from '@angular/core'; +import { IonicPage, NavController, NavParams } from 'ionic-angular'; +import { TranslateService } from '@ngx-translate/core'; +import { CoreSitesProvider } from '../../../../providers/sites'; +import { CoreDomUtilsProvider } from '../../../../providers/utils/dom'; +import { CoreSplitViewComponent } from '../../../../components/split-view/split-view'; +import { AddonCompetencyProvider } from '../../providers/competency'; + +/** + * Page that displays a learning plan. + */ +@IonicPage({ segment: 'addon-competency-competency' }) +@Component({ + selector: 'page-addon-competency-competency', + templateUrl: 'competency.html', +}) +export class AddonCompetencyCompetencyPage { + competencyLoaded = false; + competencyId: number; + planId: number; + courseId: number; + userId: number; + planStatus: number; + coursemodules: any; + user: any; + competency: any; + + constructor(private navCtrl: NavController, navParams: NavParams, private translate: TranslateService, + private sitesProvider: CoreSitesProvider, private domUtils: CoreDomUtilsProvider, + @Optional() private svComponent: CoreSplitViewComponent, private competencyProvider: AddonCompetencyProvider) { + this.competencyId = navParams.get('competencyId'); + this.planId = navParams.get('planId'); + this.courseId = navParams.get('courseId'); + this.userId = navParams.get('userId'); + } + + /** + * View loaded. + */ + ionViewDidLoad(): void { + this.fetchCompetency().then(() => { + if (this.planId) { + this.competencyProvider.logCompetencyInPlanView(this.planId, this.competencyId, this.planStatus, this.userId); + } else { + this.competencyProvider.logCompetencyInCourseView(this.courseId, this.competencyId, this.userId); + } + }).finally(() => { + this.competencyLoaded = true; + }); + } + + /** + * Fetches the competency and updates the view. + * + * @return {Promise} Promise resolved when done. + */ + protected fetchCompetency(): Promise { + let promise; + if (this.planId) { + this.planStatus = null; + promise = this.competencyProvider.getCompetencyInPlan(this.planId, this.competencyId); + } else if (this.courseId) { + promise = this.competencyProvider.getCompetencyInCourse(this.courseId, this.competencyId, this.userId); + } else { + promise = Promise.reject(null); + } + + return promise.then((competency) => { + this.competency = competency.usercompetencysummary; + + if (this.planId) { + this.planStatus = competency.plan.status; + this.competency.usercompetency.statusname = this.getStatusName(this.competency.usercompetency.status); + } else { + this.competency.usercompetency = this.competency.usercompetencycourse; + this.coursemodules = competency.coursemodules; + } + + if (this.competency.user.id != this.sitesProvider.getCurrentSiteUserId()) { + this.competency.user.profileimageurl = this.competency.user.profileimageurl || true; + + // Get the user profile image from the returned object. + this.user = this.competency.user; + } + + this.competency.evidence.forEach((evidence) => { + if (evidence.descidentifier) { + const key = 'addon.competency.' + evidence.descidentifier; + evidence.description = this.translate.instant(key, {$a: evidence.desca}); + } + }); + }, (message) => { + if (message) { + this.domUtils.showErrorModal(message); + } else { + this.domUtils.showErrorModal('Error getting competency data.'); + } + + return Promise.reject(null); + }); + } + + /** + * Convenience function to get the review status name translated. + * + * @param {number} status + * @return {any} + */ + protected getStatusName(status: number): any { + let statusTranslateName; + switch (status) { + case AddonCompetencyProvider.REVIEW_STATUS_IDLE: + statusTranslateName = 'idle'; + break; + case AddonCompetencyProvider.REVIEW_STATUS_IN_REVIEW: + statusTranslateName = 'inreview'; + break; + case AddonCompetencyProvider.REVIEW_STATUS_WAITING_FOR_REVIEW: + statusTranslateName = 'waitingforreview'; + break; + default: + // We can use the current status name. + return status; + } + + return this.translate.instant('addon.competency.usercompetencystatus_' + statusTranslateName); + } + + /** + * Refreshes the competency. + * + * @param {any} refresher Refresher. + */ + refreshCompetency(refresher: any): void { + let promise; + if (this.planId) { + promise = this.competencyProvider.invalidateCompetencyInPlan(this.planId, this.competencyId); + } else { + promise = this.competencyProvider.invalidateCompetencyInCourse(this.courseId, this.competencyId); + } + + return promise.finally(() => { + this.fetchCompetency().finally(() => { + refresher.complete(); + }); + }); + } + + /** + * Opens the summary of a competency. + * + * @param {number} competencyId + */ + openCompetencySummary(competencyId: number): void { + // Decide which navCtrl to use. If this page is inside a split view, use the split view's master nav. + const navCtrl = this.svComponent ? this.svComponent.getMasterNav() : this.navCtrl; + navCtrl.push('AddonCompetencyCompetencySummaryPage', {competencyId}); + } + + /** + * Opens the profile of a user. + * + * @param {number} userId + */ + openUserProfile(userId: number): void { + // Decide which navCtrl to use. If this page is inside a split view, use the split view's master nav. + const navCtrl = this.svComponent ? this.svComponent.getMasterNav() : this.navCtrl; + navCtrl.push('CoreUserProfilePage', {userId, courseId: this.courseId}); + } +} diff --git a/src/addon/competency/pages/competencysummary/competencysummary.html b/src/addon/competency/pages/competencysummary/competencysummary.html new file mode 100644 index 000000000..5e93f372d --- /dev/null +++ b/src/addon/competency/pages/competencysummary/competencysummary.html @@ -0,0 +1,24 @@ + + + {{ competency.competency.shortname }} {{ competency.competency.idnumber }} + + + + + + + + + + + + + {{ 'addon.competency.path' | translate }}: + {{ competency.comppath.framework.name }} + +  / {{ ancestor.name }} + + + + + diff --git a/src/addon/competency/pages/competencysummary/competencysummary.module.ts b/src/addon/competency/pages/competencysummary/competencysummary.module.ts new file mode 100644 index 000000000..59563b5ff --- /dev/null +++ b/src/addon/competency/pages/competencysummary/competencysummary.module.ts @@ -0,0 +1,35 @@ +// (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 { NgModule } from '@angular/core'; +import { IonicPageModule } from 'ionic-angular'; +import { TranslateModule } from '@ngx-translate/core'; +import { CoreComponentsModule } from '../../../../components/components.module'; +import { CoreDirectivesModule } from '../../../../directives/directives.module'; +import { CorePipesModule } from '../../../../pipes/pipes.module'; +import { AddonCompetencyCompetencySummaryPage } from './competencysummary'; + +@NgModule({ + declarations: [ + AddonCompetencyCompetencySummaryPage, + ], + imports: [ + CoreComponentsModule, + CoreDirectivesModule, + CorePipesModule, + IonicPageModule.forChild(AddonCompetencyCompetencySummaryPage), + TranslateModule.forChild() + ], +}) +export class AddonCompetencyCompetencySummaryPageModule {} diff --git a/src/addon/competency/pages/competencysummary/competencysummary.ts b/src/addon/competency/pages/competencysummary/competencysummary.ts new file mode 100644 index 000000000..f75247f31 --- /dev/null +++ b/src/addon/competency/pages/competencysummary/competencysummary.ts @@ -0,0 +1,94 @@ +// (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 { Component, Optional } from '@angular/core'; +import { IonicPage, NavController, NavParams } from 'ionic-angular'; +import { TranslateService } from '@ngx-translate/core'; +import { CoreDomUtilsProvider } from '../../../../providers/utils/dom'; +import { CoreSplitViewComponent } from '../../../../components/split-view/split-view'; +import { AddonCompetencyProvider } from '../../providers/competency'; + +/** + * Page that displays a learning plan. + */ +@IonicPage({ segment: 'addon-competency-competency-summary' }) +@Component({ + selector: 'page-addon-competency-competency-summary', + templateUrl: 'competencysummary.html', +}) +export class AddonCompetencyCompetencySummaryPage { + competencyLoaded = false; + competencyId: number; + competency: any; + + constructor(private navCtrl: NavController, navParams: NavParams, private translate: TranslateService, + private domUtils: CoreDomUtilsProvider, @Optional() private svComponent: CoreSplitViewComponent, + private competencyProvider: AddonCompetencyProvider) { + this.competencyId = navParams.get('competencyId'); + } + + /** + * View loaded. + */ + ionViewDidLoad(): void { + this.fetchCompetency().then(() => { + this.competencyProvider.logCompetencyView(this.competencyId); + }).finally(() => { + this.competencyLoaded = true; + }); + } + + /** + * Fetches the competency summary and updates the view. + * + * @return {Promise} Promise resolved when done. + */ + protected fetchCompetency(): Promise { + return this.competencyProvider.getCompetencySummary(this.competencyId).then((competency) => { + this.competency = competency; + }, (message) => { + if (message) { + this.domUtils.showErrorModal(message); + } else { + this.domUtils.showErrorModal('Error getting competency summary data.'); + } + + return Promise.reject(null); + }); + } + + /** + * Refreshes the competency summary. + * + * @param {any} refresher Refresher. + */ + refreshCompetency(refresher: any): void { + this.competencyProvider.invalidateCompetencySummary(this.competencyId).finally(() => { + this.fetchCompetency().finally(() => { + refresher.complete(); + }); + }); + } + + /** + * Opens the summary of a competency. + * + * @param {number} competencyId + */ + openCompetencySummary(competencyId: number): void { + // Decide which navCtrl to use. If this page is inside a split view, use the split view's master nav. + const navCtrl = this.svComponent ? this.svComponent.getMasterNav() : this.navCtrl; + navCtrl.push('AddonCompetencyCompetencySummaryPage', {competencyId}); + } +} diff --git a/src/addon/competency/pages/coursecompetencies/coursecompetencies.html b/src/addon/competency/pages/coursecompetencies/coursecompetencies.html new file mode 100644 index 000000000..e20ac1987 --- /dev/null +++ b/src/addon/competency/pages/coursecompetencies/coursecompetencies.html @@ -0,0 +1,6 @@ + + + {{ 'addon.competency.coursecompetencies' | translate }} + + + \ No newline at end of file diff --git a/src/addon/competency/pages/coursecompetencies/coursecompetencies.module.ts b/src/addon/competency/pages/coursecompetencies/coursecompetencies.module.ts new file mode 100644 index 000000000..277d005bf --- /dev/null +++ b/src/addon/competency/pages/coursecompetencies/coursecompetencies.module.ts @@ -0,0 +1,37 @@ +// (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 { NgModule } from '@angular/core'; +import { IonicPageModule } from 'ionic-angular'; +import { TranslateModule } from '@ngx-translate/core'; +import { CoreComponentsModule } from '../../../../components/components.module'; +import { CoreDirectivesModule } from '../../../../directives/directives.module'; +import { CorePipesModule } from '../../../../pipes/pipes.module'; +import { AddonCompetencyComponentsModule } from '../../components/components.module'; +import { AddonCompetencyCourseCompetenciesPage } from './coursecompetencies'; + +@NgModule({ + declarations: [ + AddonCompetencyCourseCompetenciesPage, + ], + imports: [ + CoreComponentsModule, + CoreDirectivesModule, + CorePipesModule, + IonicPageModule.forChild(AddonCompetencyCourseCompetenciesPage), + TranslateModule.forChild(), + AddonCompetencyComponentsModule + ], +}) +export class AddonCompetencyCourseCompetenciesPageModule {} diff --git a/src/addon/competency/pages/coursecompetencies/coursecompetencies.ts b/src/addon/competency/pages/coursecompetencies/coursecompetencies.ts new file mode 100644 index 000000000..b93dd5577 --- /dev/null +++ b/src/addon/competency/pages/coursecompetencies/coursecompetencies.ts @@ -0,0 +1,42 @@ +// (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 { Component, ViewChild } from '@angular/core'; +import { IonicPage, NavController, NavParams } from 'ionic-angular'; +import { TranslateService } from '@ngx-translate/core'; +import { CoreAppProvider } from '../../../../providers/app'; +import { CoreDomUtilsProvider } from '../../../../providers/utils/dom'; +import { AddonCompetencyProvider } from '../../providers/competency'; +import { AddonCompetencyHelperProvider } from '../../providers/helper'; + +/** + * Page that displays the list of competencies of a course. + */ +@IonicPage({ segment: 'addon-competency-coursecompetencies' }) +@Component({ + selector: 'page-addon-competency-coursecompetencies', + templateUrl: 'coursecompetencies.html', +}) +export class AddonCompetencyCourseCompetenciesPage { + + protected courseId: number; + protected userId: number; + + constructor(private navCtrl: NavController, navParams: NavParams, private translate: TranslateService, + private appProvider: CoreAppProvider, private domUtils: CoreDomUtilsProvider, + private competencyProvider: AddonCompetencyProvider, private helperProvider: AddonCompetencyHelperProvider) { + this.courseId = navParams.get('courseId'); + this.userId = navParams.get('userId'); + } +} diff --git a/src/addon/competency/pages/plan/plan.html b/src/addon/competency/pages/plan/plan.html new file mode 100644 index 000000000..74b7756c1 --- /dev/null +++ b/src/addon/competency/pages/plan/plan.html @@ -0,0 +1,56 @@ + + + {{plan.plan.name}} + + + + + + + + + + + + + + + +

+
+
+ + + + {{ 'addon.competency.status' | translate }}: + {{ plan.plan.statusname }} + + + {{ 'addon.competency.duedate' | translate }}: + {{ plan.plan.duedate | coreToLocaleString }} + + + {{ 'addon.competency.template' | translate }}: + {{ plan.plan.template.shortname }} + + + {{ 'addon.competency.progress' | translate }}: + {{ 'addon.competency.xcompetenciesproficientoutofy' | translate: {$a: {x: plan.proficientcompetencycount, y: plan.competencycount} } }} + + + + + + {{ 'addon.competency.learningplancompetencies' | translate }} + + + {{ 'addon.competency.nocompetencies' | translate }} + + + {{competency.competency.shortname}} {{competency.competency.idnumber}} + {{ competency.usercompetency.gradename }} + + + +
+
diff --git a/src/addon/competency/pages/plan/plan.module.ts b/src/addon/competency/pages/plan/plan.module.ts new file mode 100644 index 000000000..cf22ce9b7 --- /dev/null +++ b/src/addon/competency/pages/plan/plan.module.ts @@ -0,0 +1,35 @@ +// (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 { NgModule } from '@angular/core'; +import { IonicPageModule } from 'ionic-angular'; +import { TranslateModule } from '@ngx-translate/core'; +import { CoreComponentsModule } from '../../../../components/components.module'; +import { CoreDirectivesModule } from '../../../../directives/directives.module'; +import { CorePipesModule } from '../../../../pipes/pipes.module'; +import { AddonCompetencyPlanPage } from './plan'; + +@NgModule({ + declarations: [ + AddonCompetencyPlanPage, + ], + imports: [ + CoreComponentsModule, + CoreDirectivesModule, + CorePipesModule, + IonicPageModule.forChild(AddonCompetencyPlanPage), + TranslateModule.forChild() + ], +}) +export class AddonCompetencyPlanPageModule {} diff --git a/src/addon/competency/pages/plan/plan.ts b/src/addon/competency/pages/plan/plan.ts new file mode 100644 index 000000000..20fd55fa9 --- /dev/null +++ b/src/addon/competency/pages/plan/plan.ts @@ -0,0 +1,132 @@ +// (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 { Component, Optional } from '@angular/core'; +import { IonicPage, NavController, NavParams } from 'ionic-angular'; +import { TranslateService } from '@ngx-translate/core'; +import { CoreAppProvider } from '../../../../providers/app'; +import { CoreDomUtilsProvider } from '../../../../providers/utils/dom'; +import { CoreSplitViewComponent } from '../../../../components/split-view/split-view'; +import { AddonCompetencyProvider } from '../../providers/competency'; +import { AddonCompetencyHelperProvider } from '../../providers/helper'; + +/** + * Page that displays a learning plan. + */ +@IonicPage({ segment: 'addon-competency-plan' }) +@Component({ + selector: 'page-addon-competency-plan', + templateUrl: 'plan.html', +}) +export class AddonCompetencyPlanPage { + protected planId: number; + planLoaded = false; + plan: any; + user: any; + + constructor(private navCtrl: NavController, navParams: NavParams, private translate: TranslateService, + private appProvider: CoreAppProvider, private domUtils: CoreDomUtilsProvider, + @Optional() private svComponent: CoreSplitViewComponent, private competencyProvider: AddonCompetencyProvider, + private competencyHelperProvider: AddonCompetencyHelperProvider) { + this.planId = navParams.get('planId'); + } + + /** + * View loaded. + */ + ionViewDidLoad(): void { + this.fetchLearningPlan().finally(() => { + this.planLoaded = true; + }); + } + + /** + * Fetches the learning plan and updates the view. + * + * @return {Promise} Promise resolved when done. + */ + protected fetchLearningPlan(): Promise { + return this.competencyProvider.getLearningPlan(this.planId).then((plan) => { + plan.plan.statusname = this.getStatusName(plan.plan.status); + // Get the user profile image. + this.competencyHelperProvider.getProfile(plan.plan.userid).then((user) => { + this.user = user; + }); + this.plan = plan; + }, (message) => { + if (message) { + this.domUtils.showErrorModal(message); + } else { + this.domUtils.showErrorModal('Error getting learning plan data.'); + } + + return Promise.reject(null); + }); + } + + /** + * Navigates to a particular competency. + * + * @param {number} competencyId + */ + openCompetency(competencyId: number): void { + const navCtrl = this.svComponent ? this.svComponent.getMasterNav() : this.navCtrl; + navCtrl.push('AddonCompetencyCompetenciesPage', {competencyId, planId: this.planId}); + } + + /** + * Convenience function to get the status name translated. + * + * @param {number} status + * @return {any} + */ + protected getStatusName(status: number): any { + let statusTranslateName; + switch (status) { + case AddonCompetencyProvider.STATUS_DRAFT: + statusTranslateName = 'draft'; + break; + case AddonCompetencyProvider.REVIEW_STATUS_IN_REVIEW: + statusTranslateName = 'inreview'; + break; + case AddonCompetencyProvider.REVIEW_STATUS_WAITING_FOR_REVIEW: + statusTranslateName = 'waitingforreview'; + break; + case AddonCompetencyProvider.STATUS_ACTIVE: + statusTranslateName = 'active'; + break; + case AddonCompetencyProvider.STATUS_COMPLETE: + statusTranslateName = 'complete'; + break; + default: + // We can use the current status name. + return status; + } + + return this.translate.instant('addon.competency.planstatus' + statusTranslateName); + } + + /** + * Refreshes the learning plan. + * + * @param {any} refresher Refresher. + */ + refreshLearningPlan(refresher: any): void { + this.competencyProvider.invalidateLearningPlan(this.planId).finally(() => { + this.fetchLearningPlan().finally(() => { + refresher.complete(); + }); + }); + } +} diff --git a/src/addon/competency/pages/planlist/planlist.html b/src/addon/competency/pages/planlist/planlist.html new file mode 100644 index 000000000..120b15ad2 --- /dev/null +++ b/src/addon/competency/pages/planlist/planlist.html @@ -0,0 +1,22 @@ + + + {{ 'addon.competency.userplans' | translate }} + + + + + + + + + + + + +

{{ plan.name }}

+

{{ 'addon.competency.duedate' | translate }}: {{ plan.duedate | coreToLocaleString }}

+
+
+
+
+
\ No newline at end of file diff --git a/src/addon/competency/pages/planlist/planlist.module.ts b/src/addon/competency/pages/planlist/planlist.module.ts new file mode 100644 index 000000000..637461ae8 --- /dev/null +++ b/src/addon/competency/pages/planlist/planlist.module.ts @@ -0,0 +1,35 @@ +// (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 { NgModule } from '@angular/core'; +import { IonicPageModule } from 'ionic-angular'; +import { TranslateModule } from '@ngx-translate/core'; +import { CoreComponentsModule } from '../../../../components/components.module'; +import { CoreDirectivesModule } from '../../../../directives/directives.module'; +import { CorePipesModule } from '../../../../pipes/pipes.module'; +import { AddonCompetencyPlanListPage } from './planlist'; + +@NgModule({ + declarations: [ + AddonCompetencyPlanListPage, + ], + imports: [ + CoreComponentsModule, + CoreDirectivesModule, + CorePipesModule, + IonicPageModule.forChild(AddonCompetencyPlanListPage), + TranslateModule.forChild() + ], +}) +export class AddonCompetencyPlanListPageModule {} diff --git a/src/addon/competency/pages/planlist/planlist.ts b/src/addon/competency/pages/planlist/planlist.ts new file mode 100644 index 000000000..bc77fd229 --- /dev/null +++ b/src/addon/competency/pages/planlist/planlist.ts @@ -0,0 +1,103 @@ +// (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 { Component, ViewChild } from '@angular/core'; +import { IonicPage, NavParams } from 'ionic-angular'; +import { TranslateService } from '@ngx-translate/core'; +import { CoreDomUtilsProvider } from '../../../../providers/utils/dom'; +import { CoreSplitViewComponent } from '../../../../components/split-view/split-view'; +import { AddonCompetencyProvider } from '../../providers/competency'; + +/** + * Page that displays the list of learning plans. + */ +@IonicPage({ segment: 'addon-competency-planlist' }) +@Component({ + selector: 'page-addon-competency-planlist', + templateUrl: 'planlist.html', +}) +export class AddonCompetencyPlanListPage { + @ViewChild(CoreSplitViewComponent) splitviewCtrl: CoreSplitViewComponent; + + protected userId: number; + protected planId: number; + plansLoaded = false; + plans = []; + + constructor(navParams: NavParams, private translate: TranslateService, private domUtils: CoreDomUtilsProvider, + private competencyProvider: AddonCompetencyProvider) { + this.userId = navParams.get('userId'); + } + + /** + * View loaded. + */ + ionViewDidLoad(): void { + if (this.planId) { + // There is a learning plan to load. + this.openPlan(this.planId); + } + + this.fetchLearningPlans().then(() => { + if (!this.planId && this.splitviewCtrl.isOn() && this.plans.length > 0) { + // Take first and load it. + this.openPlan(this.plans[0].id); + } + }).finally(() => { + this.plansLoaded = true; + }); + } + + /** + * Fetches the learning plans and updates the view. + * + * @return {Promise} Promise resolved when done. + */ + protected fetchLearningPlans(): Promise { + return this.competencyProvider.getLearningPlans(this.userId).then((plans) => { + this.plans = plans; + }).catch((message) => { + if (message) { + this.domUtils.showErrorModal(message); + } else { + this.domUtils.showErrorModal('Error getting learning plans data.'); + } + + return Promise.reject(null); + }); + } + + /** + * Refreshes the learning plans. + * + * @param {any} refresher Refresher. + */ + refreshLearningPlans(refresher: any): void { + this.competencyProvider.invalidateLearningPlans(this.userId).finally(() => { + this.fetchLearningPlans().finally(() => { + refresher.complete(); + }); + }); + } + + /** + * Opens a learning plan. + * + * @param {number} planId Learning plan to load. + */ + openPlan(planId: number): void { + this.planId = planId; + this.splitviewCtrl.push('AddonCompetencyPlanPage', { planId }); + } +} diff --git a/src/addon/competency/providers/competency.ts b/src/addon/competency/providers/competency.ts new file mode 100644 index 000000000..c8112b79a --- /dev/null +++ b/src/addon/competency/providers/competency.ts @@ -0,0 +1,572 @@ +// (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 { CoreLoggerProvider } from '../../../providers/logger'; +import { CoreSitesProvider } from '../../../providers/sites'; +import { CoreUserProvider } from '../../../core/user/providers/user'; + +/** + * Service to handle caompetency learning plans. + */ +@Injectable() +export class AddonCompetencyProvider { + + static STATUS_DRAFT = 0; + static STATUS_ACTIVE = 1; + static STATUS_COMPLETE = 2; + static STATUS_WAITIN_GFOR_REVIEW = 3; + static STATUS_IN_REVIEW = 4; + static REVIEW_STATUS_IDLE = 0; + static REVIEW_STATUS_WAITING_FOR_REVIEW = 1; + static REVIEW_STATUS_IN_REVIEW = 2; + protected ROOT_CACHE_KEY = 'mmaCompetency:'; + + protected logger; + + constructor(loggerProvider: CoreLoggerProvider, private sitesProvider: CoreSitesProvider) { + this.logger = loggerProvider.getInstance('AddonCompetencyProvider'); + } + + /** + * Get cache key for user learning plans data WS calls. + * + * @param {number} userId User ID. + * @return {string} Cache key. + */ + protected getLearningPlansCacheKey(userId: number): string { + return this.ROOT_CACHE_KEY + 'userplans:' + userId; + } + + /** + * Get cache key for learning plan data WS calls. + * + * @param {number} planId Plan ID. + * @return {string} Cache key. + */ + protected getLearningPlanCacheKey(planId: number): string { + return this.ROOT_CACHE_KEY + 'learningplan:' + planId; + } + + /** + * Get cache key for competency in plan data WS calls. + * + * @param {number} planId Plan ID. + * @param {number} competencyId Competency ID. + * @return {string} Cache key. + */ + protected getCompetencyInPlanCacheKey(planId: number, competencyId: number): string { + return this.ROOT_CACHE_KEY + 'plancompetency:' + planId + ':' + competencyId; + } + + /** + * Get cache key for competency in course data WS calls. + * + * @param {number} courseId Course ID. + * @param {number} competencyId Competency ID. + * @param {number} userId User ID. + * @return {string} Cache key. + */ + protected getCompetencyInCourseCacheKey(courseId: number, competencyId: number, userId: number): string { + return this.ROOT_CACHE_KEY + 'coursecompetency:' + userId + ':' + courseId + ':' + competencyId; + } + + /** + * Get cache key for competency summary data WS calls. + * + * @param {number} competencyId Competency ID. + * @param {number} userId User ID. + * @return {string} Cache key. + */ + protected getCompetencySummaryCacheKey(competencyId: number, userId: number): string { + return this.ROOT_CACHE_KEY + 'competencysummary:' + userId + ':' + competencyId; + } + + /** + * Get cache key for course competencies data WS calls. + * + * @param {number} courseId Course ID. + * @return {string} Cache key. + */ + protected getCourseCompetenciesCacheKey(courseId: number): string { + return this.ROOT_CACHE_KEY + 'coursecompetencies:' + courseId; + } + + /** + * Check if competency learning plans WS is available. + * + * @param {string} [siteId] Site ID. If not defined, current site. + * @return {Promise} True if competency learning plans WS is available, false otherwise. + */ + isPluginEnabled(siteId?: string): Promise { + siteId = siteId || this.sitesProvider.getCurrentSiteId(); + + return this.sitesProvider.getSite(siteId).then((site) => { + if (site.wsAvailable('core_competency_list_course_competencies') && site.wsAvailable('tool_lp_data_for_plans_page')) { + return this.getLearningPlans(0, siteId); + } + + return false; + }); + } + + /** + * Returns whether competencies are enabled. + * + * @param {number} courseId Course ID. + * @param {string} [siteId] Site ID. If not defined, current site. + * @return {Promise} competencies if enabled for the given course, false otherwise. + */ + isPluginForCourseEnabled(courseId: number, siteId?: string): Promise { + if (!this.sitesProvider.isLoggedIn()) { + return Promise.resolve(false); + } + + if (!this.isPluginEnabled(siteId)) { + return Promise.resolve(false); + } + + return this.getCourseCompetencies(courseId, 0, siteId).catch(() => { + return false; + }); + } + + /** + * Get plans for a certain user. + * + * @param {number} [userId] ID of the user. If not defined, current user. + * @param {string} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise to be resolved when the plans are retrieved. + */ + getLearningPlans(userId?: number, siteId?: string): Promise { + siteId = siteId || this.sitesProvider.getCurrentSiteId(); + + return this.sitesProvider.getSite(siteId).then((site) => { + userId = userId || site.getUserId(); + + this.logger.debug('Get plans for user ' + userId); + + const params = { + userid: userId + }, + preSets = { + cacheKey: this.getLearningPlansCacheKey(userId) + }; + + return site.read('tool_lp_data_for_plans_page', params, preSets).then((response) => { + if (response.plans) { + return response.plans; + } + + return Promise.reject(null); + }); + }); + } + + /** + * Get a certain plan. + * + * @param {number} planId ID of the plan. + * @param {string} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise to be resolved when the plans are retrieved. + */ + getLearningPlan(planId: number, siteId?: string): Promise { + siteId = siteId || this.sitesProvider.getCurrentSiteId(); + + return this.sitesProvider.getSite(siteId).then((site) => { + + this.logger.debug('Get plan ' + planId); + + const params = { + planid: planId + }, + preSets = { + cacheKey: this.getLearningPlanCacheKey(planId) + }; + + return site.read('tool_lp_data_for_plan_page', params, preSets).then((response) => { + if (response.plan) { + return response; + } + + return Promise.reject(null); + }); + }); + } + + /** + * Get a certain competency in a plan. + * + * @param {number} planId ID of the plan. + * @param {number} competencyId ID of the competency. + * @param {string} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise to be resolved when the plans are retrieved. + */ + getCompetencyInPlan(planId: number, competencyId: number, siteId?: string): Promise { + siteId = siteId || this.sitesProvider.getCurrentSiteId(); + + return this.sitesProvider.getSite(siteId).then((site) => { + + this.logger.debug('Get competency ' + competencyId + ' in plan ' + planId); + + const params = { + planid: planId, + competencyid: competencyId + }, + preSets = { + cacheKey: this.getCompetencyInPlanCacheKey(planId, competencyId) + }; + + return site.read('tool_lp_data_for_user_competency_summary_in_plan', params, preSets).then((response) => { + if (response.usercompetencysummary) { + return response; + } + + return Promise.reject(null); + }); + }); + } + + /** + * Get a certain competency in a course. + * + * @param {number} courseId ID of the course. + * @param {number} competencyId ID of the competency. + * @param {number} [userId] ID of the user. If not defined, current user. + * @param {string} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise to be resolved when the plans are retrieved. + */ + getCompetencyInCourse(courseId: number, competencyId: number, userId?: number, siteId?: string): Promise { + siteId = siteId || this.sitesProvider.getCurrentSiteId(); + + return this.sitesProvider.getSite(siteId).then((site) => { + userId = userId || site.getUserId(); + + this.logger.debug('Get competency ' + competencyId + ' in course ' + courseId); + + const params = { + courseid: courseId, + competencyid: competencyId, + userid: userId + }, + preSets = { + cacheKey: this.getCompetencyInCourseCacheKey(courseId, competencyId, userId) + }; + + return site.read('tool_lp_data_for_user_competency_summary_in_course', params, preSets).then((response) => { + if (response.usercompetencysummary) { + return response; + } + + return Promise.reject(null); + }); + }); + } + + /** + * Get a certain competency summary. + * + * @param {number} competencyId ID of the competency. + * @param {number} [userId] ID of the user. If not defined, current user. + * @param {string} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise to be resolved when the plans are retrieved. + */ + getCompetencySummary(competencyId: number, userId?: number, siteId?: string): Promise { + siteId = siteId || this.sitesProvider.getCurrentSiteId(); + + return this.sitesProvider.getSite(siteId).then((site) => { + userId = userId || site.getUserId(); + + this.logger.debug('Get competency ' + competencyId + ' summary for user' + userId); + + const params = { + competencyid: competencyId, + userid: userId + }, + preSets = { + cacheKey: this.getCompetencySummaryCacheKey(competencyId, userId) + }; + + return site.read('tool_lp_data_for_user_competency_summary', params, preSets).then((response) => { + if (response.competency) { + return response.competency; + } + + return Promise.reject(null); + }); + }); + } + + /** + * Get an specific competency summary. + * + * @param {number} courseId ID of the course. + * @param {number} [userId] ID of the user. + * @param {string} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise to be resolved when the course competencies are retrieved. + */ + getCourseCompetencies(courseId: number, userId?: number, siteId?: string): Promise { + siteId = siteId || this.sitesProvider.getCurrentSiteId(); + + return this.sitesProvider.getSite(siteId).then((site) => { + + this.logger.debug('Get course competencies for course ' + courseId); + + const params = { + courseid: courseId + }, + preSets = { + cacheKey: this.getCourseCompetenciesCacheKey(courseId) + }; + + return site.read('tool_lp_data_for_course_competencies_page', params, preSets).then((response) => { + if (response.competencies) { + return response; + } + + return Promise.reject(null); + }); + + }).then((response) => { + + if (!userId || userId == this.sitesProvider.getCurrentSiteUserId()) { + return response; + } + + const promises = response.competencies.map((competency) => + this.getCompetencyInCourse(courseId, competency.competency.id, userId, siteId) + ); + + return Promise.all(promises).then((responses: any[]) => { + responses.forEach((resp, index) => { + response.competencies[index].usercompetencycourse = resp.usercompetencysummary.usercompetencycourse; + }); + + return response; + }); + }); + } + + /** + * Invalidates User Learning Plans data. + * + * @param {number} [userId] ID of the user. If not defined, current user. + * @param {string} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the data is invalidated. + */ + invalidateLearningPlans(userId?: number, siteId?: string): Promise { + siteId = siteId || this.sitesProvider.getCurrentSiteId(); + + return this.sitesProvider.getSite(siteId).then((site) => { + userId = userId || site.getUserId(); + + return site.invalidateWsCacheForKey(this.getLearningPlansCacheKey(userId)); + }); + } + + /** + * Invalidates Learning Plan data. + * + * @param {number} planId ID of the plan. + * @param {string} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the data is invalidated. + */ + invalidateLearningPlan(planId: number, siteId?: string): Promise { + siteId = siteId || this.sitesProvider.getCurrentSiteId(); + + return this.sitesProvider.getSite(siteId).then((site) => { + return site.invalidateWsCacheForKey(this.getLearningPlanCacheKey(planId)); + }); + } + + /** + * Invalidates Competency in Plan data. + * + * @param {number} planId ID of the plan. + * @param {number} competencyId ID of the competency. + * @param {string} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the data is invalidated. + */ + invalidateCompetencyInPlan(planId: number, competencyId: number, siteId?: string): Promise { + siteId = siteId || this.sitesProvider.getCurrentSiteId(); + + return this.sitesProvider.getSite(siteId).then((site) => { + return site.invalidateWsCacheForKey(this.getCompetencyInPlanCacheKey(planId, competencyId)); + }); + } + + /** + * Invalidates Competency in Course data. + * + * @param {number} courseId ID of the course. + * @param {number} competencyId ID of the competency. + * @param {number} [userId] ID of the user. If not defined, current user. + * @param {string} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the data is invalidated. + */ + invalidateCompetencyInCourse(courseId: number, competencyId: number, userId?: number, siteId?: string): Promise { + siteId = siteId || this.sitesProvider.getCurrentSiteId(); + + return this.sitesProvider.getSite(siteId).then((site) => { + userId = userId || site.getUserId(); + + return site.invalidateWsCacheForKey(this.getCompetencyInCourseCacheKey(courseId, competencyId, userId)); + }); + } + + /** + * Invalidates Competency Summary data. + * + * @param {number} competencyId ID of the competency. + * @param {number} [userId] ID of the user. If not defined, current user. + * @param {string} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the data is invalidated. + */ + invalidateCompetencySummary(competencyId: number, userId?: number, siteId?: string): Promise { + siteId = siteId || this.sitesProvider.getCurrentSiteId(); + + return this.sitesProvider.getSite(siteId).then((site) => { + userId = userId || site.getUserId(); + + return site.invalidateWsCacheForKey(this.getCompetencySummaryCacheKey(competencyId, userId)); + }); + } + + /** + * Invalidates Course Competencies data. + * + * @param {number} courseId ID of the course. + * @param {number} [userId] ID of the user. + * @param {string} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the data is invalidated. + */ + invalidateCourseCompetencies(courseId: number, userId?: number, siteId?: string): Promise { + siteId = siteId || this.sitesProvider.getCurrentSiteId(); + + return this.sitesProvider.getSite(siteId).then((site) => { + return site.invalidateWsCacheForKey(this.getCourseCompetenciesCacheKey(courseId)); + }).then((response) => { + if (!userId || userId == this.sitesProvider.getCurrentSiteUserId()) { + return; + } + + /* Competencies for other users are fetched with getCompetencyInCourse (and saved in their own cache). + We need to fecth the list of competencies to know which ones to invalidate. We can pass 0 as userId + to getCourseCompetencies, we just need the competency IDs and this way we avid extra WS calls. */ + return this.getCourseCompetencies(courseId, 0, siteId).then((competencies) => { + const promises = competencies.competencies.map((competency) => { + return this.invalidateCompetencyInCourse(courseId, competency.competency.id, userId, siteId); + }); + + return Promise.all(promises); + }); + }); + } + + /** + * Report the competency as being viewed in plan. + * + * @param {number} planId ID of the plan. + * @param {number} competencyId ID of the competency. + * @param {number} planStatus Current plan Status to decide what action should be logged. + * @param {number} [userId] User ID. If not defined, current user. + * @param {string} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the WS call is successful. + */ + logCompetencyInPlanView(planId: number, competencyId: number, planStatus: number, userId?: number, siteId?: string) + : Promise { + if (planId && competencyId) { + siteId = siteId || this.sitesProvider.getCurrentSiteId(); + + return this.sitesProvider.getSite(siteId).then((site) => { + userId = userId || site.getUserId(); + + const params = { + planid: planId, + competencyid: competencyId, + userid: userId + }, + preSets = { + typeExpected: 'boolean' + }; + + if (planStatus == AddonCompetencyProvider.STATUS_COMPLETE) { + return site.write('core_competency_user_competency_plan_viewed', params, preSets); + } else { + return site.write('core_competency_user_competency_viewed_in_plan', params, preSets); + } + }); + } + + return Promise.reject(null); + } + + /** + * Report the competency as being viewed in course. + * + * @param {number} courseId ID of the course. + * @param {number} competencyId ID of the competency. + * @param {number} [userId] User ID. If not defined, current user. + * @param {string} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the WS call is successful. + */ + logCompetencyInCourseView(courseId: number, competencyId: number, userId?: number, siteId?: string): Promise { + if (courseId && competencyId) { + siteId = siteId || this.sitesProvider.getCurrentSiteId(); + + return this.sitesProvider.getSite(siteId).then((site) => { + userId = userId || site.getUserId(); + + const params = { + courseid: courseId, + competencyid: competencyId, + userid: userId + }; + const preSets = { + typeExpected: 'boolean' + }; + + return site.write('core_competency_user_competency_viewed_in_course', params, preSets); + }); + } + + return Promise.reject(null); + } + + /** + * Report the competency as being viewed. + * + * @param {number} competencyId ID of the competency. + * @param {string} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the WS call is successful. + */ + logCompetencyView(competencyId: number, siteId?: string): Promise { + if (competencyId) { + siteId = siteId || this.sitesProvider.getCurrentSiteId(); + + return this.sitesProvider.getSite(siteId).then((site) => { + const params = { + id: competencyId, + }; + const preSets = { + typeExpected: 'boolean' + }; + + return site.write('core_competency_competency_viewed', params, preSets); + }); + } + + return Promise.reject(null); + } +} diff --git a/src/addon/competency/providers/course-option-handler.ts b/src/addon/competency/providers/course-option-handler.ts new file mode 100644 index 000000000..74a37f6d9 --- /dev/null +++ b/src/addon/competency/providers/course-option-handler.ts @@ -0,0 +1,109 @@ +// (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 { NavController } from 'ionic-angular'; +import { CoreCourseOptionsHandler, CoreCourseOptionsHandlerData } from '../../../core/course/providers/options-delegate'; +import { CoreCourseProvider } from '../../../core/course/providers/course'; +import { AddonCompetencyCourseComponent } from '../components/course/course'; +import { AddonCompetencyProvider } from '../providers/competency'; + +/** + * Course nav handler. + */ +@Injectable() +export class AddonCompetencyCourseOptionHandler implements CoreCourseOptionsHandler { + name = 'AddonCompetency'; + priority = 700; + + protected coursesNavEnabledCache = {}; + + constructor(private competencyProvider: AddonCompetencyProvider) {} + + /** + * Clear courses nav cache. + */ + clearCoursesNavCache(): void { + this.coursesNavEnabledCache = {}; + } + + /** + * Whether or not the handler is enabled ona site level. + * @return {boolean|Promise} Whether or not the handler is enabled on a site level. + */ + isEnabled(): boolean | Promise { + return this.competencyProvider.isPluginEnabled(); + } + + /** + * Whether or not the handler is enabled for a certain course. + * + * @param {number} courseId The course ID. + * @param {any} accessData Access type and data. Default, guest, ... + * @param {any} [navOptions] Course navigation options for current user. See CoreCoursesProvider.getUserNavigationOptions. + * @param {any} [admOptions] Course admin options for current user. See CoreCoursesProvider.getUserAdministrationOptions. + * @return {boolean|Promise} True or promise resolved with true if enabled. + */ + isEnabledForCourse(courseId: number, accessData: any, navOptions?: any, admOptions?: any): boolean | Promise { + if (accessData && accessData.type == CoreCourseProvider.ACCESS_GUEST) { + return false; // Not enabled for guests. + } + + if (navOptions && typeof navOptions.competencies != 'undefined') { + return navOptions.competencies; + } + + if (typeof this.coursesNavEnabledCache[courseId] != 'undefined') { + return this.coursesNavEnabledCache[courseId]; + } + + return this.competencyProvider.isPluginForCourseEnabled(courseId).then((competencies) => { + const enabled = competencies ? !competencies.canmanagecoursecompetencies : false; + this.coursesNavEnabledCache[courseId] = enabled; + + return enabled; + }); + } + + /** + * Returns the data needed to render the handler. + * + * @param {number} courseId The course ID. + * @return {CoreCourseOptionsHandlerData} Data. + */ + getDisplayData(courseId: number): CoreCourseOptionsHandlerData { + return { + title: 'addon.competency.competencies', + class: 'addon-competency-course-handler', + component: AddonCompetencyCourseComponent + }; + } + + /** + * Should invalidate the data to determine if the handler is enabled for a certain course. + * + * @param {number} courseId The course ID. + * @param {any} [navOptions] Course navigation options for current user. See CoreCoursesProvider.getUserNavigationOptions. + * @param {any} [admOptions] Course admin options for current user. See CoreCoursesProvider.getUserAdministrationOptions. + * @return {Promise} Promise resolved when done. + */ + invalidateEnabledForCourse(courseId: number, navOptions?: any, admOptions?: any): Promise { + if (navOptions && typeof navOptions.competencies != 'undefined') { + // No need to invalidate anything. + return Promise.resolve(); + } + + return this.competencyProvider.invalidateCourseCompetencies(courseId); + } +} diff --git a/src/addon/competency/providers/helper.ts b/src/addon/competency/providers/helper.ts new file mode 100644 index 000000000..494958140 --- /dev/null +++ b/src/addon/competency/providers/helper.ts @@ -0,0 +1,46 @@ +// (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 { CoreSitesProvider } from '../../../providers/sites'; +import { CoreUserProvider } from '../../../core/user/providers/user'; + +/** + * Service that provides some features regarding the user profile. + */ +@Injectable() +export class AddonCompetencyHelperProvider { + + constructor(private sitesProvider: CoreSitesProvider, private userProvider: CoreUserProvider) { + } + + /** + * Convenient helper to get the user profile image. + * + * @param {number} userId User Id + * @return {Promise} User profile Image URL or true if default icon. + */ + getProfile(userId: number): Promise { + if (!userId || userId == this.sitesProvider.getCurrentSiteUserId()) { + return Promise.resolve(false); + } + + // Get the user profile to retrieve the user image. + return this.userProvider.getProfile(userId, null, true).then((user) => { + user.profileimageurl = user.profileimageurl || true; + + return user; + }); + } +} diff --git a/src/addon/competency/providers/mainmenu-handler.ts b/src/addon/competency/providers/mainmenu-handler.ts new file mode 100644 index 000000000..d17ad43c9 --- /dev/null +++ b/src/addon/competency/providers/mainmenu-handler.ts @@ -0,0 +1,60 @@ +// (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 { AddonCompetencyProvider } from './competency'; +import { CoreMainMenuHandler, CoreMainMenuHandlerData } from '../../../core/mainmenu/providers/delegate'; + +/** + * Handler to inject an option into main menu. + */ +@Injectable() +export class AddonCompetencyMainMenuHandler implements CoreMainMenuHandler { + name = 'AddonCompetency'; + priority = 900; + + constructor(private competencyProvider: AddonCompetencyProvider) { } + + /** + * Check if the handler is enabled on a site level. + * + * @return {boolean} Whether or not the handler is enabled on a site level. + */ + isEnabled(): boolean | Promise { + return this.competencyProvider.isPluginEnabled().then((enabled) => { + if (!enabled) { + return false; + } + + // Check the user has at least one learn plan available. + return this.competencyProvider.getLearningPlans().then((plans) => { + return plans.length > 0; + }); + }); + } + + /** + * Returns the data needed to render the handler. + * + * @return {CoreMainMenuHandlerData} Data needed to render the handler. + */ + getDisplayData(): CoreMainMenuHandlerData { + return { + icon: 'map', + title: 'addon.competency.myplans', + page: 'AddonCompetencyPlanListPage', + class: 'addon-competency-handler' + }; + } +} diff --git a/src/addon/competency/providers/user-handler.ts b/src/addon/competency/providers/user-handler.ts new file mode 100644 index 000000000..fa7f24f2c --- /dev/null +++ b/src/addon/competency/providers/user-handler.ts @@ -0,0 +1,128 @@ +// (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 { CoreUserDelegate, CoreUserProfileHandler, CoreUserProfileHandlerData } from '../../../core/user/providers/user-delegate'; +import { CoreSitesProvider } from '../../../providers/sites'; +import { CoreContentLinksHelperProvider } from '../../../core/contentlinks/providers/helper'; +import { AddonCompetencyProvider } from './competency'; + +/** + * Profile competencies handler. + */ +@Injectable() +export class AddonCompetencyUserHandler implements CoreUserProfileHandler { + name = 'AddonCompetency'; + priority = 900; + type = CoreUserDelegate.TYPE_NEW_PAGE; + participantsNavEnabledCache = {}; + usersNavEnabledCache = {}; + + constructor(private linkHelper: CoreContentLinksHelperProvider, protected sitesProvider: CoreSitesProvider, + private competencyProvider: AddonCompetencyProvider) { + } + + /** + * Clear users nav cache. + */ + clearUsersNavCache(): void { + this.participantsNavEnabledCache = {}; + this.usersNavEnabledCache = {}; + } + + /** + * Whether or not the handler is enabled on a site level. + * @return {boolean|Promise} Whether or not the handler is enabled on a site level. + */ + isEnabled(): boolean | Promise { + return this.competencyProvider.isPluginEnabled(); + } + + /** + * Check if handler is enabled for this user in this context. + * + * @param {any} user User to check. + * @param {number} courseId Course ID. + * @param {any} [navOptions] Course navigation options for current user. See $mmCourses#getUserNavigationOptions. + * @param {any} [admOptions] Course admin options for current user. See $mmCourses#getUserAdministrationOptions. + * @return {boolean|Promise} Promise resolved with true if enabled, resolved with false otherwise. + */ + isEnabledForUser(user: any, courseId: number, navOptions?: any, admOptions?: any): boolean | Promise { + if (courseId) { + const cacheKey = courseId + '.' + user.id; + + // Link on a user course profile. + if (typeof this.participantsNavEnabledCache[cacheKey] != 'undefined') { + return this.participantsNavEnabledCache[cacheKey]; + } + + return this.competencyProvider.getCourseCompetencies(courseId, user.id).then((response) => { + const enabled = response.competencies.length > 0; + this.participantsNavEnabledCache[cacheKey] = enabled; + + return enabled; + }).catch((message) => { + this.participantsNavEnabledCache[cacheKey] = false; + + return false; + }); + } else { + // Link on a user site profile. + if (typeof this.usersNavEnabledCache[user.id] != 'undefined') { + return this.usersNavEnabledCache[user.id]; + } + + return this.competencyProvider.getLearningPlans(user.id).then((plans) => { + // Check the user has at least one learn plan available. + const enabled = plans.length > 0; + this.usersNavEnabledCache[user.id] = enabled; + + return enabled; + }); + } + } + + /** + * Returns the data needed to render the handler. + * + * @return {CoreUserProfileHandlerData} Data needed to render the handler. + */ + getDisplayData(user: any, courseId: number): CoreUserProfileHandlerData { + if (courseId) { + return { + icon: 'ribbon', + title: 'addon.competency.competencies', + class: 'addon-competency-handler', + action: ($event, navCtrl, user, courseId): void => { + event.preventDefault(); + event.stopPropagation(); + // Always use redirect to make it the new history root (to avoid "loops" in history). + this.linkHelper.goInSite(navCtrl, 'AddonCompetencyCourseCompetenciesPage', {courseId, userId: user.id}); + } + }; + } else { + return { + icon: 'map', + title: 'addon.competency.learningplans', + class: 'addon-competency-handler', + action: ($event, navCtrl, user, courseId): void => { + event.preventDefault(); + event.stopPropagation(); + // Always use redirect to make it the new history root (to avoid "loops" in history). + this.linkHelper.goInSite(navCtrl, 'AddonCompetencyPlanListPage', {userId: user.id}); + } + }; + } + } +} diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 406450a66..3e79d8f56 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -70,6 +70,7 @@ import { CoreCompileModule } from '@core/compile/compile.module'; // Addon modules. import { AddonCalendarModule } from '@addon/calendar/calendar.module'; +import { AddonCompetencyModule } from '../addon/competency/competency.module'; import { AddonUserProfileFieldModule } from '@addon/userprofilefield/userprofilefield.module'; import { AddonFilesModule } from '@addon/files/files.module'; import { AddonModBookModule } from '@addon/mod/book/book.module'; @@ -147,6 +148,7 @@ export const CORE_PROVIDERS: any[] = [ CoreSitePluginsModule, CoreCompileModule, AddonCalendarModule, + AddonCompetencyModule, AddonUserProfileFieldModule, AddonFilesModule, AddonModBookModule, From 92085c4889893ea085d8e441cd02dcaaed23e135 Mon Sep 17 00:00:00 2001 From: Albert Gasset Date: Tue, 13 Mar 2018 10:21:43 +0100 Subject: [PATCH 2/3] MOBILE-2323 learning plans: PR fixes --- package.json | 3 +- src/addon/competency/competency.module.ts | 15 +++-- .../components/components.module.ts | 6 +- .../competency/components/course/course.html | 4 +- .../competency/components/course/course.ts | 16 ++--- .../pages/competencies/competencies.module.ts | 6 +- .../pages/competencies/competencies.ts | 18 ++---- .../pages/competency/competency.module.ts | 6 +- .../competency/pages/competency/competency.ts | 22 +++---- .../competencysummary.module.ts | 6 +- .../competencysummary/competencysummary.ts | 14 ++--- .../coursecompetencies.module.ts | 6 -- .../coursecompetencies/coursecompetencies.ts | 13 +--- .../competency/pages/plan/plan.module.ts | 6 +- src/addon/competency/pages/plan/plan.ts | 28 ++++----- .../competency/pages/planlist/planlist.html | 4 +- .../pages/planlist/planlist.module.ts | 6 +- .../competency/pages/planlist/planlist.ts | 12 +--- src/addon/competency/providers/competency.ts | 63 ++----------------- .../providers/course-option-handler.ts | 14 ++--- src/addon/competency/providers/helper.ts | 6 +- .../competency/providers/mainmenu-handler.ts | 16 ++--- .../competency/providers/user-handler.ts | 12 ++-- 23 files changed, 95 insertions(+), 207 deletions(-) diff --git a/package.json b/package.json index 8154175bd..0342fe4bb 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,8 @@ "lint": "ionic-app-scripts lint", "ionic:build": "ionic-app-scripts build", "ionic:serve": "gulp watch | ionic-app-scripts serve", - "ionic:build:before": "gulp" + "ionic:build:before": "gulp", + "ionic:watch:before": "gulp" }, "dependencies": { "@angular/animations": "^5.2.5", diff --git a/src/addon/competency/competency.module.ts b/src/addon/competency/competency.module.ts index a2a7b5dac..83ae4bd28 100644 --- a/src/addon/competency/competency.module.ts +++ b/src/addon/competency/competency.module.ts @@ -19,14 +19,13 @@ import { AddonCompetencyCourseOptionHandler } from './providers/course-option-ha import { AddonCompetencyMainMenuHandler } from './providers/mainmenu-handler'; import { AddonCompetencyUserHandler } from './providers/user-handler'; import { AddonCompetencyComponentsModule } from './components/components.module'; -import { CoreCourseProvider } from '../../core/course/providers/course'; -import { CoreCourseOptionsDelegate } from '../../core/course/providers/options-delegate'; -import { CoreMainMenuDelegate } from '../../core/mainmenu/providers/delegate'; -import { CoreUserDelegate } from '../../core/user/providers/user-delegate'; -import { CoreUserProvider } from '../../core/user/providers/user'; -import { CoreEventsProvider } from '../../providers/events'; -import { CoreSitesProvider } from '../../providers/sites'; -import { CoreCoursesProvider } from '../../core/courses/providers/courses'; +import { CoreCourseOptionsDelegate } from '@core/course/providers/options-delegate'; +import { CoreMainMenuDelegate } from '@core/mainmenu/providers/delegate'; +import { CoreUserDelegate } from '@core/user/providers/user-delegate'; +import { CoreUserProvider } from '@core/user/providers/user'; +import { CoreEventsProvider } from '@providers/events'; +import { CoreSitesProvider } from '@providers/sites'; +import { CoreCoursesProvider } from '@core/courses/providers/courses'; @NgModule({ declarations: [ diff --git a/src/addon/competency/components/components.module.ts b/src/addon/competency/components/components.module.ts index 651b2a9aa..670d33720 100644 --- a/src/addon/competency/components/components.module.ts +++ b/src/addon/competency/components/components.module.ts @@ -16,9 +16,9 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { IonicModule } from 'ionic-angular'; import { TranslateModule } from '@ngx-translate/core'; -import { CoreComponentsModule } from '../../../components/components.module'; -import { CoreDirectivesModule } from '../../../directives/directives.module'; -import { CorePipesModule } from '../../../pipes/pipes.module'; +import { CoreComponentsModule } from '@components/components.module'; +import { CoreDirectivesModule } from '@directives/directives.module'; +import { CorePipesModule } from '@pipes/pipes.module'; import { AddonCompetencyCourseComponent } from './course/course'; @NgModule({ diff --git a/src/addon/competency/components/course/course.html b/src/addon/competency/components/course/course.html index c1344b369..04584daae 100644 --- a/src/addon/competency/components/course/course.html +++ b/src/addon/competency/components/course/course.html @@ -18,7 +18,7 @@ {{ 'addon.competency.competenciesmostoftennotproficientincourse' | translate }}:

- + {{ comp.shortname }} - {{ comp.idnumber }}

@@ -43,7 +43,7 @@ {{competency.competency.shortname}} {{competency.competency.idnumber}} - {{ competency.usercompetencycourse.gradename }}
+ {{ competency.usercompetencycourse.gradename }}
diff --git a/src/addon/competency/components/course/course.ts b/src/addon/competency/components/course/course.ts index 955462760..d4e9373d1 100644 --- a/src/addon/competency/components/course/course.ts +++ b/src/addon/competency/components/course/course.ts @@ -12,11 +12,11 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Component, ViewChild, Input, Optional } from '@angular/core'; +import { Component, ViewChild, Input } from '@angular/core'; import { Content, NavController } from 'ionic-angular'; import { TranslateService } from '@ngx-translate/core'; -import { CoreAppProvider } from '../../../../providers/app'; -import { CoreDomUtilsProvider } from '../../../../providers/utils/dom'; +import { CoreAppProvider } from '@providers/app'; +import { CoreDomUtilsProvider } from '@providers/utils/dom'; import { AddonCompetencyProvider } from '../../providers/competency'; import { AddonCompetencyHelperProvider } from '../../providers/helper'; @@ -64,14 +64,8 @@ export class AddonCompetencyCourseComponent { this.helperProvider.getProfile(this.userId).then((user) => { this.user = user; }); - }, (message) => { - if (message) { - this.domUtils.showErrorModal(message); - } else { - this.domUtils.showErrorModal('Error getting course competencies data.'); - } - - return Promise.reject(null); + }).catch((message) => { + this.domUtils.showErrorModalDefault(message, 'Error getting course competencies data.'); }); } diff --git a/src/addon/competency/pages/competencies/competencies.module.ts b/src/addon/competency/pages/competencies/competencies.module.ts index 6effd59fd..e53b32ba1 100644 --- a/src/addon/competency/pages/competencies/competencies.module.ts +++ b/src/addon/competency/pages/competencies/competencies.module.ts @@ -15,9 +15,7 @@ import { NgModule } from '@angular/core'; import { IonicPageModule } from 'ionic-angular'; import { TranslateModule } from '@ngx-translate/core'; -import { CoreComponentsModule } from '../../../../components/components.module'; -import { CoreDirectivesModule } from '../../../../directives/directives.module'; -import { CorePipesModule } from '../../../../pipes/pipes.module'; +import { CoreComponentsModule } from '@components/components.module'; import { AddonCompetencyCompetenciesPage } from './competencies'; @NgModule({ @@ -26,8 +24,6 @@ import { AddonCompetencyCompetenciesPage } from './competencies'; ], imports: [ CoreComponentsModule, - CoreDirectivesModule, - CorePipesModule, IonicPageModule.forChild(AddonCompetencyCompetenciesPage), TranslateModule.forChild() ], diff --git a/src/addon/competency/pages/competencies/competencies.ts b/src/addon/competency/pages/competencies/competencies.ts index b016b349f..1278e318f 100644 --- a/src/addon/competency/pages/competencies/competencies.ts +++ b/src/addon/competency/pages/competencies/competencies.ts @@ -13,10 +13,10 @@ // limitations under the License. import { Component, ViewChild } from '@angular/core'; -import { IonicPage, NavController, NavParams } from 'ionic-angular'; +import { IonicPage, NavParams } from 'ionic-angular'; import { TranslateService } from '@ngx-translate/core'; -import { CoreDomUtilsProvider } from '../../../../providers/utils/dom'; -import { CoreSplitViewComponent } from '../../../../components/split-view/split-view'; +import { CoreDomUtilsProvider } from '@providers/utils/dom'; +import { CoreSplitViewComponent } from '@components/split-view/split-view'; import { AddonCompetencyProvider } from '../../providers/competency'; /** @@ -39,8 +39,8 @@ export class AddonCompetencyCompetenciesPage { competencies = []; title: string; - constructor(private navCtrl: NavController, navParams: NavParams, private translate: TranslateService, - private domUtils: CoreDomUtilsProvider, private competencyProvider: AddonCompetencyProvider) { + constructor(navParams: NavParams, private translate: TranslateService, private domUtils: CoreDomUtilsProvider, + private competencyProvider: AddonCompetencyProvider) { this.planId = navParams.get('planId'); this.courseId = navParams.get('courseId'); this.competencyId = navParams.get('competencyId'); @@ -95,13 +95,7 @@ export class AddonCompetencyCompetenciesPage { } this.competencies = response.competencies; }).catch((message) => { - if (message) { - this.domUtils.showErrorModal(message); - } else { - this.domUtils.showErrorModal('Error getting competencies data.'); - } - - return Promise.reject(null); + this.domUtils.showErrorModalDefault(message, 'Error getting competencies data.'); }); } diff --git a/src/addon/competency/pages/competency/competency.module.ts b/src/addon/competency/pages/competency/competency.module.ts index e188fc222..028abfa2d 100644 --- a/src/addon/competency/pages/competency/competency.module.ts +++ b/src/addon/competency/pages/competency/competency.module.ts @@ -15,9 +15,9 @@ import { NgModule } from '@angular/core'; import { IonicPageModule } from 'ionic-angular'; import { TranslateModule } from '@ngx-translate/core'; -import { CoreComponentsModule } from '../../../../components/components.module'; -import { CoreDirectivesModule } from '../../../../directives/directives.module'; -import { CorePipesModule } from '../../../../pipes/pipes.module'; +import { CoreComponentsModule } from '@components/components.module'; +import { CoreDirectivesModule } from '@directives/directives.module'; +import { CorePipesModule } from '@pipes/pipes.module'; import { AddonCompetencyCompetencyPage } from './competency'; @NgModule({ diff --git a/src/addon/competency/pages/competency/competency.ts b/src/addon/competency/pages/competency/competency.ts index e8b2ff2f0..0443a66d8 100644 --- a/src/addon/competency/pages/competency/competency.ts +++ b/src/addon/competency/pages/competency/competency.ts @@ -15,9 +15,9 @@ import { Component, Optional } from '@angular/core'; import { IonicPage, NavController, NavParams } from 'ionic-angular'; import { TranslateService } from '@ngx-translate/core'; -import { CoreSitesProvider } from '../../../../providers/sites'; -import { CoreDomUtilsProvider } from '../../../../providers/utils/dom'; -import { CoreSplitViewComponent } from '../../../../components/split-view/split-view'; +import { CoreSitesProvider } from '@providers/sites'; +import { CoreDomUtilsProvider } from '@providers/utils/dom'; +import { CoreSplitViewComponent } from '@components/split-view/split-view'; import { AddonCompetencyProvider } from '../../providers/competency'; /** @@ -103,14 +103,8 @@ export class AddonCompetencyCompetencyPage { evidence.description = this.translate.instant(key, {$a: evidence.desca}); } }); - }, (message) => { - if (message) { - this.domUtils.showErrorModal(message); - } else { - this.domUtils.showErrorModal('Error getting competency data.'); - } - - return Promise.reject(null); + }).catch((message) => { + this.domUtils.showErrorModalDefault(message, 'Error getting competency data.'); }); } @@ -118,9 +112,9 @@ export class AddonCompetencyCompetencyPage { * Convenience function to get the review status name translated. * * @param {number} status - * @return {any} + * @return {string} */ - protected getStatusName(status: number): any { + protected getStatusName(status: number): string { let statusTranslateName; switch (status) { case AddonCompetencyProvider.REVIEW_STATUS_IDLE: @@ -134,7 +128,7 @@ export class AddonCompetencyCompetencyPage { break; default: // We can use the current status name. - return status; + return String(status); } return this.translate.instant('addon.competency.usercompetencystatus_' + statusTranslateName); diff --git a/src/addon/competency/pages/competencysummary/competencysummary.module.ts b/src/addon/competency/pages/competencysummary/competencysummary.module.ts index 59563b5ff..855095dbf 100644 --- a/src/addon/competency/pages/competencysummary/competencysummary.module.ts +++ b/src/addon/competency/pages/competencysummary/competencysummary.module.ts @@ -15,9 +15,8 @@ import { NgModule } from '@angular/core'; import { IonicPageModule } from 'ionic-angular'; import { TranslateModule } from '@ngx-translate/core'; -import { CoreComponentsModule } from '../../../../components/components.module'; -import { CoreDirectivesModule } from '../../../../directives/directives.module'; -import { CorePipesModule } from '../../../../pipes/pipes.module'; +import { CoreComponentsModule } from '@components/components.module'; +import { CoreDirectivesModule } from '@directives/directives.module'; import { AddonCompetencyCompetencySummaryPage } from './competencysummary'; @NgModule({ @@ -27,7 +26,6 @@ import { AddonCompetencyCompetencySummaryPage } from './competencysummary'; imports: [ CoreComponentsModule, CoreDirectivesModule, - CorePipesModule, IonicPageModule.forChild(AddonCompetencyCompetencySummaryPage), TranslateModule.forChild() ], diff --git a/src/addon/competency/pages/competencysummary/competencysummary.ts b/src/addon/competency/pages/competencysummary/competencysummary.ts index f75247f31..6002b5688 100644 --- a/src/addon/competency/pages/competencysummary/competencysummary.ts +++ b/src/addon/competency/pages/competencysummary/competencysummary.ts @@ -15,8 +15,8 @@ import { Component, Optional } from '@angular/core'; import { IonicPage, NavController, NavParams } from 'ionic-angular'; import { TranslateService } from '@ngx-translate/core'; -import { CoreDomUtilsProvider } from '../../../../providers/utils/dom'; -import { CoreSplitViewComponent } from '../../../../components/split-view/split-view'; +import { CoreDomUtilsProvider } from '@providers/utils/dom'; +import { CoreSplitViewComponent } from '@components/split-view/split-view'; import { AddonCompetencyProvider } from '../../providers/competency'; /** @@ -57,14 +57,8 @@ export class AddonCompetencyCompetencySummaryPage { protected fetchCompetency(): Promise { return this.competencyProvider.getCompetencySummary(this.competencyId).then((competency) => { this.competency = competency; - }, (message) => { - if (message) { - this.domUtils.showErrorModal(message); - } else { - this.domUtils.showErrorModal('Error getting competency summary data.'); - } - - return Promise.reject(null); + }).catch((message) => { + this.domUtils.showErrorModalDefault(message, 'Error getting competency summary data.'); }); } diff --git a/src/addon/competency/pages/coursecompetencies/coursecompetencies.module.ts b/src/addon/competency/pages/coursecompetencies/coursecompetencies.module.ts index 277d005bf..f5a2298a7 100644 --- a/src/addon/competency/pages/coursecompetencies/coursecompetencies.module.ts +++ b/src/addon/competency/pages/coursecompetencies/coursecompetencies.module.ts @@ -15,9 +15,6 @@ import { NgModule } from '@angular/core'; import { IonicPageModule } from 'ionic-angular'; import { TranslateModule } from '@ngx-translate/core'; -import { CoreComponentsModule } from '../../../../components/components.module'; -import { CoreDirectivesModule } from '../../../../directives/directives.module'; -import { CorePipesModule } from '../../../../pipes/pipes.module'; import { AddonCompetencyComponentsModule } from '../../components/components.module'; import { AddonCompetencyCourseCompetenciesPage } from './coursecompetencies'; @@ -26,9 +23,6 @@ import { AddonCompetencyCourseCompetenciesPage } from './coursecompetencies'; AddonCompetencyCourseCompetenciesPage, ], imports: [ - CoreComponentsModule, - CoreDirectivesModule, - CorePipesModule, IonicPageModule.forChild(AddonCompetencyCourseCompetenciesPage), TranslateModule.forChild(), AddonCompetencyComponentsModule diff --git a/src/addon/competency/pages/coursecompetencies/coursecompetencies.ts b/src/addon/competency/pages/coursecompetencies/coursecompetencies.ts index b93dd5577..42bb83f71 100644 --- a/src/addon/competency/pages/coursecompetencies/coursecompetencies.ts +++ b/src/addon/competency/pages/coursecompetencies/coursecompetencies.ts @@ -12,13 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Component, ViewChild } from '@angular/core'; -import { IonicPage, NavController, NavParams } from 'ionic-angular'; -import { TranslateService } from '@ngx-translate/core'; -import { CoreAppProvider } from '../../../../providers/app'; -import { CoreDomUtilsProvider } from '../../../../providers/utils/dom'; -import { AddonCompetencyProvider } from '../../providers/competency'; -import { AddonCompetencyHelperProvider } from '../../providers/helper'; +import { Component } from '@angular/core'; +import { IonicPage, NavParams } from 'ionic-angular'; /** * Page that displays the list of competencies of a course. @@ -33,9 +28,7 @@ export class AddonCompetencyCourseCompetenciesPage { protected courseId: number; protected userId: number; - constructor(private navCtrl: NavController, navParams: NavParams, private translate: TranslateService, - private appProvider: CoreAppProvider, private domUtils: CoreDomUtilsProvider, - private competencyProvider: AddonCompetencyProvider, private helperProvider: AddonCompetencyHelperProvider) { + constructor(navParams: NavParams) { this.courseId = navParams.get('courseId'); this.userId = navParams.get('userId'); } diff --git a/src/addon/competency/pages/plan/plan.module.ts b/src/addon/competency/pages/plan/plan.module.ts index cf22ce9b7..bb7f48038 100644 --- a/src/addon/competency/pages/plan/plan.module.ts +++ b/src/addon/competency/pages/plan/plan.module.ts @@ -15,9 +15,9 @@ import { NgModule } from '@angular/core'; import { IonicPageModule } from 'ionic-angular'; import { TranslateModule } from '@ngx-translate/core'; -import { CoreComponentsModule } from '../../../../components/components.module'; -import { CoreDirectivesModule } from '../../../../directives/directives.module'; -import { CorePipesModule } from '../../../../pipes/pipes.module'; +import { CoreComponentsModule } from '@components/components.module'; +import { CoreDirectivesModule } from '@directives/directives.module'; +import { CorePipesModule } from '@pipes/pipes.module'; import { AddonCompetencyPlanPage } from './plan'; @NgModule({ diff --git a/src/addon/competency/pages/plan/plan.ts b/src/addon/competency/pages/plan/plan.ts index 20fd55fa9..d82c46dcd 100644 --- a/src/addon/competency/pages/plan/plan.ts +++ b/src/addon/competency/pages/plan/plan.ts @@ -15,9 +15,9 @@ import { Component, Optional } from '@angular/core'; import { IonicPage, NavController, NavParams } from 'ionic-angular'; import { TranslateService } from '@ngx-translate/core'; -import { CoreAppProvider } from '../../../../providers/app'; -import { CoreDomUtilsProvider } from '../../../../providers/utils/dom'; -import { CoreSplitViewComponent } from '../../../../components/split-view/split-view'; +import { CoreAppProvider } from '@providers/app'; +import { CoreDomUtilsProvider } from '@providers/utils/dom'; +import { CoreSplitViewComponent } from '@components/split-view/split-view'; import { AddonCompetencyProvider } from '../../providers/competency'; import { AddonCompetencyHelperProvider } from '../../providers/helper'; @@ -64,14 +64,8 @@ export class AddonCompetencyPlanPage { this.user = user; }); this.plan = plan; - }, (message) => { - if (message) { - this.domUtils.showErrorModal(message); - } else { - this.domUtils.showErrorModal('Error getting learning plan data.'); - } - - return Promise.reject(null); + }).catch((message) => { + this.domUtils.showErrorModalDefault(message, 'Error getting learning plan data.'); }); } @@ -82,16 +76,20 @@ export class AddonCompetencyPlanPage { */ openCompetency(competencyId: number): void { const navCtrl = this.svComponent ? this.svComponent.getMasterNav() : this.navCtrl; - navCtrl.push('AddonCompetencyCompetenciesPage', {competencyId, planId: this.planId}); + if (this.appProvider.isWide()) { + navCtrl.push('AddonCompetencyCompetenciesPage', {competencyId, planId: this.planId}); + } else { + navCtrl.push('AddonCompetencyCompetencyPage', {competencyId, planId: this.planId}); + } } /** * Convenience function to get the status name translated. * * @param {number} status - * @return {any} + * @return {string} */ - protected getStatusName(status: number): any { + protected getStatusName(status: number): string { let statusTranslateName; switch (status) { case AddonCompetencyProvider.STATUS_DRAFT: @@ -111,7 +109,7 @@ export class AddonCompetencyPlanPage { break; default: // We can use the current status name. - return status; + return String(status); } return this.translate.instant('addon.competency.planstatus' + statusTranslateName); diff --git a/src/addon/competency/pages/planlist/planlist.html b/src/addon/competency/pages/planlist/planlist.html index 120b15ad2..446aff30c 100644 --- a/src/addon/competency/pages/planlist/planlist.html +++ b/src/addon/competency/pages/planlist/planlist.html @@ -9,7 +9,7 @@ - + @@ -19,4 +19,4 @@ - \ No newline at end of file + diff --git a/src/addon/competency/pages/planlist/planlist.module.ts b/src/addon/competency/pages/planlist/planlist.module.ts index 637461ae8..92037f778 100644 --- a/src/addon/competency/pages/planlist/planlist.module.ts +++ b/src/addon/competency/pages/planlist/planlist.module.ts @@ -15,9 +15,8 @@ import { NgModule } from '@angular/core'; import { IonicPageModule } from 'ionic-angular'; import { TranslateModule } from '@ngx-translate/core'; -import { CoreComponentsModule } from '../../../../components/components.module'; -import { CoreDirectivesModule } from '../../../../directives/directives.module'; -import { CorePipesModule } from '../../../../pipes/pipes.module'; +import { CoreComponentsModule } from '@components/components.module'; +import { CorePipesModule } from '@pipes/pipes.module'; import { AddonCompetencyPlanListPage } from './planlist'; @NgModule({ @@ -26,7 +25,6 @@ import { AddonCompetencyPlanListPage } from './planlist'; ], imports: [ CoreComponentsModule, - CoreDirectivesModule, CorePipesModule, IonicPageModule.forChild(AddonCompetencyPlanListPage), TranslateModule.forChild() diff --git a/src/addon/competency/pages/planlist/planlist.ts b/src/addon/competency/pages/planlist/planlist.ts index bc77fd229..f4e1762e2 100644 --- a/src/addon/competency/pages/planlist/planlist.ts +++ b/src/addon/competency/pages/planlist/planlist.ts @@ -15,8 +15,8 @@ import { Component, ViewChild } from '@angular/core'; import { IonicPage, NavParams } from 'ionic-angular'; import { TranslateService } from '@ngx-translate/core'; -import { CoreDomUtilsProvider } from '../../../../providers/utils/dom'; -import { CoreSplitViewComponent } from '../../../../components/split-view/split-view'; +import { CoreDomUtilsProvider } from '@providers/utils/dom'; +import { CoreSplitViewComponent } from '@components/split-view/split-view'; import { AddonCompetencyProvider } from '../../providers/competency'; /** @@ -68,13 +68,7 @@ export class AddonCompetencyPlanListPage { return this.competencyProvider.getLearningPlans(this.userId).then((plans) => { this.plans = plans; }).catch((message) => { - if (message) { - this.domUtils.showErrorModal(message); - } else { - this.domUtils.showErrorModal('Error getting learning plans data.'); - } - - return Promise.reject(null); + this.domUtils.showErrorModalDefault(message, 'Error getting learning plans data.'); }); } diff --git a/src/addon/competency/providers/competency.ts b/src/addon/competency/providers/competency.ts index c8112b79a..611f8b492 100644 --- a/src/addon/competency/providers/competency.ts +++ b/src/addon/competency/providers/competency.ts @@ -13,9 +13,8 @@ // limitations under the License. import { Injectable } from '@angular/core'; -import { CoreLoggerProvider } from '../../../providers/logger'; -import { CoreSitesProvider } from '../../../providers/sites'; -import { CoreUserProvider } from '../../../core/user/providers/user'; +import { CoreLoggerProvider } from '@providers/logger'; +import { CoreSitesProvider } from '@providers/sites'; /** * Service to handle caompetency learning plans. @@ -103,24 +102,6 @@ export class AddonCompetencyProvider { return this.ROOT_CACHE_KEY + 'coursecompetencies:' + courseId; } - /** - * Check if competency learning plans WS is available. - * - * @param {string} [siteId] Site ID. If not defined, current site. - * @return {Promise} True if competency learning plans WS is available, false otherwise. - */ - isPluginEnabled(siteId?: string): Promise { - siteId = siteId || this.sitesProvider.getCurrentSiteId(); - - return this.sitesProvider.getSite(siteId).then((site) => { - if (site.wsAvailable('core_competency_list_course_competencies') && site.wsAvailable('tool_lp_data_for_plans_page')) { - return this.getLearningPlans(0, siteId); - } - - return false; - }); - } - /** * Returns whether competencies are enabled. * @@ -133,10 +114,6 @@ export class AddonCompetencyProvider { return Promise.resolve(false); } - if (!this.isPluginEnabled(siteId)) { - return Promise.resolve(false); - } - return this.getCourseCompetencies(courseId, 0, siteId).catch(() => { return false; }); @@ -150,8 +127,6 @@ export class AddonCompetencyProvider { * @return {Promise} Promise to be resolved when the plans are retrieved. */ getLearningPlans(userId?: number, siteId?: string): Promise { - siteId = siteId || this.sitesProvider.getCurrentSiteId(); - return this.sitesProvider.getSite(siteId).then((site) => { userId = userId || site.getUserId(); @@ -182,8 +157,6 @@ export class AddonCompetencyProvider { * @return {Promise} Promise to be resolved when the plans are retrieved. */ getLearningPlan(planId: number, siteId?: string): Promise { - siteId = siteId || this.sitesProvider.getCurrentSiteId(); - return this.sitesProvider.getSite(siteId).then((site) => { this.logger.debug('Get plan ' + planId); @@ -214,8 +187,6 @@ export class AddonCompetencyProvider { * @return {Promise} Promise to be resolved when the plans are retrieved. */ getCompetencyInPlan(planId: number, competencyId: number, siteId?: string): Promise { - siteId = siteId || this.sitesProvider.getCurrentSiteId(); - return this.sitesProvider.getSite(siteId).then((site) => { this.logger.debug('Get competency ' + competencyId + ' in plan ' + planId); @@ -248,8 +219,6 @@ export class AddonCompetencyProvider { * @return {Promise} Promise to be resolved when the plans are retrieved. */ getCompetencyInCourse(courseId: number, competencyId: number, userId?: number, siteId?: string): Promise { - siteId = siteId || this.sitesProvider.getCurrentSiteId(); - return this.sitesProvider.getSite(siteId).then((site) => { userId = userId || site.getUserId(); @@ -283,8 +252,6 @@ export class AddonCompetencyProvider { * @return {Promise} Promise to be resolved when the plans are retrieved. */ getCompetencySummary(competencyId: number, userId?: number, siteId?: string): Promise { - siteId = siteId || this.sitesProvider.getCurrentSiteId(); - return this.sitesProvider.getSite(siteId).then((site) => { userId = userId || site.getUserId(); @@ -309,7 +276,7 @@ export class AddonCompetencyProvider { } /** - * Get an specific competency summary. + * Get all competencies in a course. * * @param {number} courseId ID of the course. * @param {number} [userId] ID of the user. @@ -317,8 +284,6 @@ export class AddonCompetencyProvider { * @return {Promise} Promise to be resolved when the course competencies are retrieved. */ getCourseCompetencies(courseId: number, userId?: number, siteId?: string): Promise { - siteId = siteId || this.sitesProvider.getCurrentSiteId(); - return this.sitesProvider.getSite(siteId).then((site) => { this.logger.debug('Get course competencies for course ' + courseId); @@ -366,8 +331,6 @@ export class AddonCompetencyProvider { * @return {Promise} Promise resolved when the data is invalidated. */ invalidateLearningPlans(userId?: number, siteId?: string): Promise { - siteId = siteId || this.sitesProvider.getCurrentSiteId(); - return this.sitesProvider.getSite(siteId).then((site) => { userId = userId || site.getUserId(); @@ -383,8 +346,6 @@ export class AddonCompetencyProvider { * @return {Promise} Promise resolved when the data is invalidated. */ invalidateLearningPlan(planId: number, siteId?: string): Promise { - siteId = siteId || this.sitesProvider.getCurrentSiteId(); - return this.sitesProvider.getSite(siteId).then((site) => { return site.invalidateWsCacheForKey(this.getLearningPlanCacheKey(planId)); }); @@ -399,8 +360,6 @@ export class AddonCompetencyProvider { * @return {Promise} Promise resolved when the data is invalidated. */ invalidateCompetencyInPlan(planId: number, competencyId: number, siteId?: string): Promise { - siteId = siteId || this.sitesProvider.getCurrentSiteId(); - return this.sitesProvider.getSite(siteId).then((site) => { return site.invalidateWsCacheForKey(this.getCompetencyInPlanCacheKey(planId, competencyId)); }); @@ -416,8 +375,6 @@ export class AddonCompetencyProvider { * @return {Promise} Promise resolved when the data is invalidated. */ invalidateCompetencyInCourse(courseId: number, competencyId: number, userId?: number, siteId?: string): Promise { - siteId = siteId || this.sitesProvider.getCurrentSiteId(); - return this.sitesProvider.getSite(siteId).then((site) => { userId = userId || site.getUserId(); @@ -434,8 +391,6 @@ export class AddonCompetencyProvider { * @return {Promise} Promise resolved when the data is invalidated. */ invalidateCompetencySummary(competencyId: number, userId?: number, siteId?: string): Promise { - siteId = siteId || this.sitesProvider.getCurrentSiteId(); - return this.sitesProvider.getSite(siteId).then((site) => { userId = userId || site.getUserId(); @@ -452,11 +407,9 @@ export class AddonCompetencyProvider { * @return {Promise} Promise resolved when the data is invalidated. */ invalidateCourseCompetencies(courseId: number, userId?: number, siteId?: string): Promise { - siteId = siteId || this.sitesProvider.getCurrentSiteId(); - return this.sitesProvider.getSite(siteId).then((site) => { return site.invalidateWsCacheForKey(this.getCourseCompetenciesCacheKey(courseId)); - }).then((response) => { + }).then(() => { if (!userId || userId == this.sitesProvider.getCurrentSiteUserId()) { return; } @@ -487,8 +440,6 @@ export class AddonCompetencyProvider { logCompetencyInPlanView(planId: number, competencyId: number, planStatus: number, userId?: number, siteId?: string) : Promise { if (planId && competencyId) { - siteId = siteId || this.sitesProvider.getCurrentSiteId(); - return this.sitesProvider.getSite(siteId).then((site) => { userId = userId || site.getUserId(); @@ -498,7 +449,7 @@ export class AddonCompetencyProvider { userid: userId }, preSets = { - typeExpected: 'boolean' + typeExpected: 'boolean' }; if (planStatus == AddonCompetencyProvider.STATUS_COMPLETE) { @@ -523,8 +474,6 @@ export class AddonCompetencyProvider { */ logCompetencyInCourseView(courseId: number, competencyId: number, userId?: number, siteId?: string): Promise { if (courseId && competencyId) { - siteId = siteId || this.sitesProvider.getCurrentSiteId(); - return this.sitesProvider.getSite(siteId).then((site) => { userId = userId || site.getUserId(); @@ -553,8 +502,6 @@ export class AddonCompetencyProvider { */ logCompetencyView(competencyId: number, siteId?: string): Promise { if (competencyId) { - siteId = siteId || this.sitesProvider.getCurrentSiteId(); - return this.sitesProvider.getSite(siteId).then((site) => { const params = { id: competencyId, diff --git a/src/addon/competency/providers/course-option-handler.ts b/src/addon/competency/providers/course-option-handler.ts index 74a37f6d9..fe7bdd9d8 100644 --- a/src/addon/competency/providers/course-option-handler.ts +++ b/src/addon/competency/providers/course-option-handler.ts @@ -12,10 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Injectable } from '@angular/core'; -import { NavController } from 'ionic-angular'; -import { CoreCourseOptionsHandler, CoreCourseOptionsHandlerData } from '../../../core/course/providers/options-delegate'; -import { CoreCourseProvider } from '../../../core/course/providers/course'; +import { Injectable, Injector } from '@angular/core'; +import { CoreCourseOptionsHandler, CoreCourseOptionsHandlerData } from '@core/course/providers/options-delegate'; +import { CoreCourseProvider } from '@core/course/providers/course'; import { AddonCompetencyCourseComponent } from '../components/course/course'; import { AddonCompetencyProvider } from '../providers/competency'; @@ -43,7 +42,7 @@ export class AddonCompetencyCourseOptionHandler implements CoreCourseOptionsHand * @return {boolean|Promise} Whether or not the handler is enabled on a site level. */ isEnabled(): boolean | Promise { - return this.competencyProvider.isPluginEnabled(); + return true; } /** @@ -79,10 +78,11 @@ export class AddonCompetencyCourseOptionHandler implements CoreCourseOptionsHand /** * Returns the data needed to render the handler. * + * @param {Injector} injector Injector. * @param {number} courseId The course ID. - * @return {CoreCourseOptionsHandlerData} Data. + * @return {CoreCourseOptionsHandlerData|Promise} Data or promise resolved with the data. */ - getDisplayData(courseId: number): CoreCourseOptionsHandlerData { + getDisplayData?(injector: Injector, courseId: number): CoreCourseOptionsHandlerData | Promise { return { title: 'addon.competency.competencies', class: 'addon-competency-course-handler', diff --git a/src/addon/competency/providers/helper.ts b/src/addon/competency/providers/helper.ts index 494958140..a742218eb 100644 --- a/src/addon/competency/providers/helper.ts +++ b/src/addon/competency/providers/helper.ts @@ -13,11 +13,11 @@ // limitations under the License. import { Injectable } from '@angular/core'; -import { CoreSitesProvider } from '../../../providers/sites'; -import { CoreUserProvider } from '../../../core/user/providers/user'; +import { CoreSitesProvider } from '@providers/sites'; +import { CoreUserProvider } from '@core/user/providers/user'; /** - * Service that provides some features regarding the user profile. + * Service that provides some features regarding learning plans. */ @Injectable() export class AddonCompetencyHelperProvider { diff --git a/src/addon/competency/providers/mainmenu-handler.ts b/src/addon/competency/providers/mainmenu-handler.ts index d17ad43c9..b45e84459 100644 --- a/src/addon/competency/providers/mainmenu-handler.ts +++ b/src/addon/competency/providers/mainmenu-handler.ts @@ -14,7 +14,7 @@ import { Injectable } from '@angular/core'; import { AddonCompetencyProvider } from './competency'; -import { CoreMainMenuHandler, CoreMainMenuHandlerData } from '../../../core/mainmenu/providers/delegate'; +import { CoreMainMenuHandler, CoreMainMenuHandlerData } from '@core/mainmenu/providers/delegate'; /** * Handler to inject an option into main menu. @@ -22,7 +22,7 @@ import { CoreMainMenuHandler, CoreMainMenuHandlerData } from '../../../core/main @Injectable() export class AddonCompetencyMainMenuHandler implements CoreMainMenuHandler { name = 'AddonCompetency'; - priority = 900; + priority = 500; constructor(private competencyProvider: AddonCompetencyProvider) { } @@ -32,15 +32,9 @@ export class AddonCompetencyMainMenuHandler implements CoreMainMenuHandler { * @return {boolean} Whether or not the handler is enabled on a site level. */ isEnabled(): boolean | Promise { - return this.competencyProvider.isPluginEnabled().then((enabled) => { - if (!enabled) { - return false; - } - - // Check the user has at least one learn plan available. - return this.competencyProvider.getLearningPlans().then((plans) => { - return plans.length > 0; - }); + // Check the user has at least one learn plan available. + return this.competencyProvider.getLearningPlans().then((plans) => { + return plans.length > 0; }); } diff --git a/src/addon/competency/providers/user-handler.ts b/src/addon/competency/providers/user-handler.ts index fa7f24f2c..a80b6fa57 100644 --- a/src/addon/competency/providers/user-handler.ts +++ b/src/addon/competency/providers/user-handler.ts @@ -13,9 +13,9 @@ // limitations under the License. import { Injectable } from '@angular/core'; -import { CoreUserDelegate, CoreUserProfileHandler, CoreUserProfileHandlerData } from '../../../core/user/providers/user-delegate'; -import { CoreSitesProvider } from '../../../providers/sites'; -import { CoreContentLinksHelperProvider } from '../../../core/contentlinks/providers/helper'; +import { CoreUserDelegate, CoreUserProfileHandler, CoreUserProfileHandlerData } from '@core/user/providers/user-delegate'; +import { CoreSitesProvider } from '@providers/sites'; +import { CoreContentLinksHelperProvider } from '@core/contentlinks/providers/helper'; import { AddonCompetencyProvider } from './competency'; /** @@ -46,7 +46,7 @@ export class AddonCompetencyUserHandler implements CoreUserProfileHandler { * @return {boolean|Promise} Whether or not the handler is enabled on a site level. */ isEnabled(): boolean | Promise { - return this.competencyProvider.isPluginEnabled(); + return true; } /** @@ -104,7 +104,7 @@ export class AddonCompetencyUserHandler implements CoreUserProfileHandler { icon: 'ribbon', title: 'addon.competency.competencies', class: 'addon-competency-handler', - action: ($event, navCtrl, user, courseId): void => { + action: (event, navCtrl, user, courseId): void => { event.preventDefault(); event.stopPropagation(); // Always use redirect to make it the new history root (to avoid "loops" in history). @@ -116,7 +116,7 @@ export class AddonCompetencyUserHandler implements CoreUserProfileHandler { icon: 'map', title: 'addon.competency.learningplans', class: 'addon-competency-handler', - action: ($event, navCtrl, user, courseId): void => { + action: (event, navCtrl, user, courseId): void => { event.preventDefault(); event.stopPropagation(); // Always use redirect to make it the new history root (to avoid "loops" in history). From 5faa1cf5e691a6ed0881d93073d39a720d01e045 Mon Sep 17 00:00:00 2001 From: Albert Gasset Date: Wed, 14 Mar 2018 10:32:05 +0100 Subject: [PATCH 3/3] MOBILE-2323 core: Add tslint rule no-unused-variable and fix warnings --- src/addon/competency/components/course/course.ts | 4 +--- .../pages/competencysummary/competencysummary.ts | 6 ++---- src/addon/competency/pages/planlist/planlist.ts | 4 +--- src/addon/files/pages/list/list.ts | 4 ++-- src/addon/files/providers/files.ts | 1 - src/addon/messages/components/contacts/contacts.ts | 1 - src/addon/messages/messages.module.ts | 1 - src/addon/messages/pages/index/index.ts | 3 +-- src/addon/messages/providers/mainmenu-handler.ts | 2 +- src/addon/messages/providers/settings-handler.ts | 5 ++--- src/addon/messages/providers/sync-cron-handler.ts | 3 +-- src/addon/messages/providers/user-add-contact-handler.ts | 3 +-- src/addon/messages/providers/user-block-contact-handler.ts | 7 +++---- src/components/context-menu/context-menu.ts | 2 +- src/core/grades/components/course/course.ts | 6 ++---- src/core/grades/providers/course-option-handler.ts | 1 - src/core/grades/providers/grades.ts | 1 - src/core/grades/providers/helper.ts | 4 +--- src/core/settings/pages/list/list.ts | 5 ++--- src/core/siteplugins/directives/call-ws-on-load.ts | 3 +-- src/core/siteplugins/providers/siteplugins.ts | 4 +--- src/core/user/components/participants/participants.ts | 2 +- src/core/user/providers/course-option-handler.ts | 1 - src/directives/download-file.ts | 1 - src/providers/lang.ts | 1 - tslint.json | 1 + 26 files changed, 25 insertions(+), 51 deletions(-) diff --git a/src/addon/competency/components/course/course.ts b/src/addon/competency/components/course/course.ts index d4e9373d1..66617b0e3 100644 --- a/src/addon/competency/components/course/course.ts +++ b/src/addon/competency/components/course/course.ts @@ -14,7 +14,6 @@ import { Component, ViewChild, Input } from '@angular/core'; import { Content, NavController } from 'ionic-angular'; -import { TranslateService } from '@ngx-translate/core'; import { CoreAppProvider } from '@providers/app'; import { CoreDomUtilsProvider } from '@providers/utils/dom'; import { AddonCompetencyProvider } from '../../providers/competency'; @@ -37,8 +36,7 @@ export class AddonCompetencyCourseComponent { competencies: any; user: any; - constructor(private navCtrl: NavController, private translate: TranslateService, - private appProvider: CoreAppProvider, private domUtils: CoreDomUtilsProvider, + constructor(private navCtrl: NavController, private appProvider: CoreAppProvider, private domUtils: CoreDomUtilsProvider, private competencyProvider: AddonCompetencyProvider, private helperProvider: AddonCompetencyHelperProvider) { } diff --git a/src/addon/competency/pages/competencysummary/competencysummary.ts b/src/addon/competency/pages/competencysummary/competencysummary.ts index 6002b5688..8464d4312 100644 --- a/src/addon/competency/pages/competencysummary/competencysummary.ts +++ b/src/addon/competency/pages/competencysummary/competencysummary.ts @@ -14,7 +14,6 @@ import { Component, Optional } from '@angular/core'; import { IonicPage, NavController, NavParams } from 'ionic-angular'; -import { TranslateService } from '@ngx-translate/core'; import { CoreDomUtilsProvider } from '@providers/utils/dom'; import { CoreSplitViewComponent } from '@components/split-view/split-view'; import { AddonCompetencyProvider } from '../../providers/competency'; @@ -32,9 +31,8 @@ export class AddonCompetencyCompetencySummaryPage { competencyId: number; competency: any; - constructor(private navCtrl: NavController, navParams: NavParams, private translate: TranslateService, - private domUtils: CoreDomUtilsProvider, @Optional() private svComponent: CoreSplitViewComponent, - private competencyProvider: AddonCompetencyProvider) { + constructor(private navCtrl: NavController, navParams: NavParams, private domUtils: CoreDomUtilsProvider, + @Optional() private svComponent: CoreSplitViewComponent, private competencyProvider: AddonCompetencyProvider) { this.competencyId = navParams.get('competencyId'); } diff --git a/src/addon/competency/pages/planlist/planlist.ts b/src/addon/competency/pages/planlist/planlist.ts index f4e1762e2..52168e7b5 100644 --- a/src/addon/competency/pages/planlist/planlist.ts +++ b/src/addon/competency/pages/planlist/planlist.ts @@ -14,7 +14,6 @@ import { Component, ViewChild } from '@angular/core'; import { IonicPage, NavParams } from 'ionic-angular'; -import { TranslateService } from '@ngx-translate/core'; import { CoreDomUtilsProvider } from '@providers/utils/dom'; import { CoreSplitViewComponent } from '@components/split-view/split-view'; import { AddonCompetencyProvider } from '../../providers/competency'; @@ -35,8 +34,7 @@ export class AddonCompetencyPlanListPage { plansLoaded = false; plans = []; - constructor(navParams: NavParams, private translate: TranslateService, private domUtils: CoreDomUtilsProvider, - private competencyProvider: AddonCompetencyProvider) { + constructor(navParams: NavParams, private domUtils: CoreDomUtilsProvider, private competencyProvider: AddonCompetencyProvider) { this.userId = navParams.get('userId'); } diff --git a/src/addon/files/pages/list/list.ts b/src/addon/files/pages/list/list.ts index f2491f52f..2867acb5c 100644 --- a/src/addon/files/pages/list/list.ts +++ b/src/addon/files/pages/list/list.ts @@ -12,8 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Component, ViewChild, OnDestroy } from '@angular/core'; -import { IonicPage, NavParams, NavController } from 'ionic-angular'; +import { Component, OnDestroy } from '@angular/core'; +import { IonicPage, NavParams } from 'ionic-angular'; import { TranslateService } from '@ngx-translate/core'; import { CoreAppProvider } from '@providers/app'; import { CoreEventsProvider } from '@providers/events'; diff --git a/src/addon/files/providers/files.ts b/src/addon/files/providers/files.ts index a44a08d9c..039241412 100644 --- a/src/addon/files/providers/files.ts +++ b/src/addon/files/providers/files.ts @@ -16,7 +16,6 @@ import { Injectable } from '@angular/core'; import { CoreSitesProvider } from '@providers/sites'; import { CoreMimetypeUtilsProvider } from '@providers/utils/mimetype'; import { CoreSite } from '@classes/site'; -import { Md5 } from 'ts-md5/dist/md5'; /** * Service to handle my files and site files. diff --git a/src/addon/messages/components/contacts/contacts.ts b/src/addon/messages/components/contacts/contacts.ts index a6cd49adf..273fa80a6 100644 --- a/src/addon/messages/components/contacts/contacts.ts +++ b/src/addon/messages/components/contacts/contacts.ts @@ -18,7 +18,6 @@ import { TranslateService } from '@ngx-translate/core'; import { CoreSitesProvider } from '@providers/sites'; import { AddonMessagesProvider } from '../../providers/messages'; import { CoreDomUtilsProvider } from '@providers/utils/dom'; -import { CoreUtilsProvider } from '@providers/utils/utils'; import { CoreAppProvider } from '@providers/app'; import { CoreEventsProvider } from '@providers/events'; diff --git a/src/addon/messages/messages.module.ts b/src/addon/messages/messages.module.ts index 2878f5fed..c05d03a90 100644 --- a/src/addon/messages/messages.module.ts +++ b/src/addon/messages/messages.module.ts @@ -28,7 +28,6 @@ import { AddonMessagesBlockContactUserHandler } from './providers/user-block-con import { AddonMessagesDiscussionLinkHandler } from './providers/discussion-link-handler'; import { AddonMessagesIndexLinkHandler } from './providers/index-link-handler'; import { AddonMessagesSyncCronHandler } from './providers/sync-cron-handler'; -import { CoreEventsProvider } from '@providers/events'; import { CoreAppProvider } from '@providers/app'; import { CoreSitesProvider } from '@providers/sites'; import { CoreLocalNotificationsProvider } from '@providers/local-notifications'; diff --git a/src/addon/messages/pages/index/index.ts b/src/addon/messages/pages/index/index.ts index e3b2975d2..c02d0691e 100644 --- a/src/addon/messages/pages/index/index.ts +++ b/src/addon/messages/pages/index/index.ts @@ -33,8 +33,7 @@ export class AddonMessagesIndexPage implements OnDestroy { protected loadSplitViewObserver: any; protected siteId: string; - constructor(private eventsProvider: CoreEventsProvider, sitesProvider: CoreSitesProvider, - private messagesProvider: AddonMessagesProvider) { + constructor(eventsProvider: CoreEventsProvider, sitesProvider: CoreSitesProvider) { this.siteId = sitesProvider.getCurrentSiteId(); diff --git a/src/addon/messages/providers/mainmenu-handler.ts b/src/addon/messages/providers/mainmenu-handler.ts index f49660b56..270386112 100644 --- a/src/addon/messages/providers/mainmenu-handler.ts +++ b/src/addon/messages/providers/mainmenu-handler.ts @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Injectable, Inject } from '@angular/core'; +import { Injectable } from '@angular/core'; import { AddonMessagesProvider } from './messages'; import { CoreMainMenuDelegate, CoreMainMenuHandler, CoreMainMenuHandlerToDisplay } from '@core/mainmenu/providers/delegate'; import { CoreCronHandler } from '@providers/cron'; diff --git a/src/addon/messages/providers/settings-handler.ts b/src/addon/messages/providers/settings-handler.ts index 4f479f018..06a8cdbc3 100644 --- a/src/addon/messages/providers/settings-handler.ts +++ b/src/addon/messages/providers/settings-handler.ts @@ -12,10 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Injectable, Inject } from '@angular/core'; +import { Injectable } from '@angular/core'; import { AddonMessagesProvider } from './messages'; import { CoreSettingsHandler, CoreSettingsHandlerData } from '@core/settings/providers/delegate'; -import { CoreSitesProvider } from '@providers/sites'; /** * Message settings handler. @@ -25,7 +24,7 @@ export class AddonMessagesSettingsHandler implements CoreSettingsHandler { name = 'AddonMessages'; priority = 600; - constructor(private messagesProvider: AddonMessagesProvider, private sitesProvider: CoreSitesProvider) { + constructor(private messagesProvider: AddonMessagesProvider) { } /** diff --git a/src/addon/messages/providers/sync-cron-handler.ts b/src/addon/messages/providers/sync-cron-handler.ts index 4c643df83..79dc464a3 100644 --- a/src/addon/messages/providers/sync-cron-handler.ts +++ b/src/addon/messages/providers/sync-cron-handler.ts @@ -14,7 +14,6 @@ import { Injectable } from '@angular/core'; import { CoreCronHandler } from '@providers/cron'; -import { CoreSitesProvider } from '@providers/sites'; import { AddonMessagesSyncProvider } from './sync'; /** @@ -24,7 +23,7 @@ import { AddonMessagesSyncProvider } from './sync'; export class AddonMessagesSyncCronHandler implements CoreCronHandler { name = 'AddonMessagesSyncCronHandler'; - constructor(private sitesProvider: CoreSitesProvider, private messagesSync: AddonMessagesSyncProvider) {} + constructor(private messagesSync: AddonMessagesSyncProvider) {} /** * Execute the process. diff --git a/src/addon/messages/providers/user-add-contact-handler.ts b/src/addon/messages/providers/user-add-contact-handler.ts index bae34daff..85a3f75ae 100644 --- a/src/addon/messages/providers/user-add-contact-handler.ts +++ b/src/addon/messages/providers/user-add-contact-handler.ts @@ -15,7 +15,6 @@ import { Injectable, OnDestroy } from '@angular/core'; import { CoreUserDelegate, CoreUserProfileHandler, CoreUserProfileHandlerData } from '@core/user/providers/user-delegate'; import { CoreSitesProvider } from '@providers/sites'; -import { CoreContentLinksHelperProvider } from '@core/contentlinks/providers/helper'; import { AddonMessagesProvider } from './messages'; import { AddonMessagesBlockContactUserHandler } from './user-block-contact-handler'; import { CoreEventsProvider } from '@providers/events'; @@ -40,7 +39,7 @@ export class AddonMessagesAddContactUserHandler implements CoreUserProfileHandle protected disabled = false; protected updateObs: any; - constructor(private linkHelper: CoreContentLinksHelperProvider, protected sitesProvider: CoreSitesProvider, + constructor(protected sitesProvider: CoreSitesProvider, private messagesProvider: AddonMessagesProvider, protected eventsProvider: CoreEventsProvider, private domUtils: CoreDomUtilsProvider, private translate: TranslateService) { diff --git a/src/addon/messages/providers/user-block-contact-handler.ts b/src/addon/messages/providers/user-block-contact-handler.ts index ead588acd..2af38b44f 100644 --- a/src/addon/messages/providers/user-block-contact-handler.ts +++ b/src/addon/messages/providers/user-block-contact-handler.ts @@ -15,7 +15,6 @@ import { Injectable, OnDestroy } from '@angular/core'; import { CoreUserDelegate, CoreUserProfileHandler, CoreUserProfileHandlerData } from '@core/user/providers/user-delegate'; import { CoreSitesProvider } from '@providers/sites'; -import { CoreContentLinksHelperProvider } from '@core/contentlinks/providers/helper'; import { AddonMessagesProvider } from './messages'; import { AddonMessagesAddContactUserHandler } from './user-add-contact-handler'; import { CoreEventsProvider } from '@providers/events'; @@ -40,9 +39,9 @@ export class AddonMessagesBlockContactUserHandler implements CoreUserProfileHand protected disabled = false; protected updateObs: any; - constructor(private linkHelper: CoreContentLinksHelperProvider, protected sitesProvider: CoreSitesProvider, - private messagesProvider: AddonMessagesProvider, protected eventsProvider: CoreEventsProvider, - private domUtils: CoreDomUtilsProvider, private translate: TranslateService) { + constructor(protected sitesProvider: CoreSitesProvider, private messagesProvider: AddonMessagesProvider, + protected eventsProvider: CoreEventsProvider, private domUtils: CoreDomUtilsProvider, + private translate: TranslateService) { this.updateObs = eventsProvider.on(AddonMessagesAddContactUserHandler.UPDATED_EVENT, (data) => { this.checkButton(data.userId); diff --git a/src/components/context-menu/context-menu.ts b/src/components/context-menu/context-menu.ts index 335aa2932..630b44f4c 100644 --- a/src/components/context-menu/context-menu.ts +++ b/src/components/context-menu/context-menu.ts @@ -39,7 +39,7 @@ export class CoreContextMenuComponent implements OnInit, OnDestroy { protected instanceId: string; protected parentContextMenu: CoreContextMenuComponent; - constructor(private translate: TranslateService, private popoverCtrl: PopoverController, private elementRef: ElementRef, + constructor(private translate: TranslateService, private popoverCtrl: PopoverController, elementRef: ElementRef, private domUtils: CoreDomUtilsProvider) { // Create the stream and subscribe to it. We ignore successive changes during 250ms. this.itemsChangedStream = new Subject(); diff --git a/src/core/grades/components/course/course.ts b/src/core/grades/components/course/course.ts index 4dc6e1ba3..734bbdaf2 100644 --- a/src/core/grades/components/course/course.ts +++ b/src/core/grades/components/course/course.ts @@ -15,7 +15,6 @@ import { Component, ViewChild, Input, Optional } from '@angular/core'; import { Content, NavParams, NavController } from 'ionic-angular'; import { CoreGradesProvider } from '../../providers/grades'; -import { CoreSitesProvider } from '@providers/sites'; import { CoreDomUtilsProvider } from '@providers/utils/dom'; import { CoreGradesHelperProvider } from '../../providers/helper'; import { CoreSplitViewComponent } from '@components/split-view/split-view'; @@ -39,9 +38,8 @@ export class CoreGradesCourseComponent { gradesTable: any; constructor(private gradesProvider: CoreGradesProvider, private domUtils: CoreDomUtilsProvider, navParams: NavParams, - private gradesHelper: CoreGradesHelperProvider, private sitesProvider: CoreSitesProvider, - @Optional() private navCtrl: NavController, private appProvider: CoreAppProvider, - @Optional() private svComponent: CoreSplitViewComponent) { + private gradesHelper: CoreGradesHelperProvider, @Optional() private navCtrl: NavController, + private appProvider: CoreAppProvider, @Optional() private svComponent: CoreSplitViewComponent) { } /** diff --git a/src/core/grades/providers/course-option-handler.ts b/src/core/grades/providers/course-option-handler.ts index 2a13d0bfe..b4b062b93 100644 --- a/src/core/grades/providers/course-option-handler.ts +++ b/src/core/grades/providers/course-option-handler.ts @@ -13,7 +13,6 @@ // limitations under the License. import { Injectable, Injector } from '@angular/core'; -import { NavController } from 'ionic-angular'; import { CoreCourseOptionsHandler, CoreCourseOptionsHandlerData } from '@core/course/providers/options-delegate'; import { CoreCourseProvider } from '@core/course/providers/course'; import { CoreGradesProvider } from './grades'; diff --git a/src/core/grades/providers/grades.ts b/src/core/grades/providers/grades.ts index 241ca14fb..922788f53 100644 --- a/src/core/grades/providers/grades.ts +++ b/src/core/grades/providers/grades.ts @@ -14,7 +14,6 @@ import { Injectable } from '@angular/core'; import { CoreLoggerProvider } from '@providers/logger'; -import { CoreSite } from '@classes/site'; import { CoreSitesProvider } from '@providers/sites'; import { CoreCoursesProvider } from '@core/courses/providers/courses'; diff --git a/src/core/grades/providers/helper.ts b/src/core/grades/providers/helper.ts index ef98334ed..a91a9d8bc 100644 --- a/src/core/grades/providers/helper.ts +++ b/src/core/grades/providers/helper.ts @@ -15,7 +15,6 @@ import { Injectable } from '@angular/core'; import { CoreLoggerProvider } from '@providers/logger'; import { CoreSitesProvider } from '@providers/sites'; -import { TranslateService } from '@ngx-translate/core'; import { CoreCoursesProvider } from '@core/courses/providers/courses'; import { CoreCourseProvider } from '@core/course/providers/course'; import { CoreGradesProvider } from './grades'; @@ -33,8 +32,7 @@ export class CoreGradesHelperProvider { constructor(logger: CoreLoggerProvider, private coursesProvider: CoreCoursesProvider, private gradesProvider: CoreGradesProvider, private sitesProvider: CoreSitesProvider, private textUtils: CoreTextUtilsProvider, private courseProvider: CoreCourseProvider, - private domUtils: CoreDomUtilsProvider, private translate: TranslateService, - private urlUtils: CoreUrlUtilsProvider) { + private domUtils: CoreDomUtilsProvider, private urlUtils: CoreUrlUtilsProvider) { this.logger = logger.getInstance('CoreGradesHelperProvider'); } diff --git a/src/core/settings/pages/list/list.ts b/src/core/settings/pages/list/list.ts index 28803a351..8e6c4b944 100644 --- a/src/core/settings/pages/list/list.ts +++ b/src/core/settings/pages/list/list.ts @@ -13,7 +13,7 @@ // limitations under the License. import { Component, ViewChild } from '@angular/core'; -import { IonicPage, NavController, NavParams, Platform } from 'ionic-angular'; +import { IonicPage, NavParams, Platform } from 'ionic-angular'; import { CoreSettingsDelegate, CoreSettingsHandlerData } from '../../providers/delegate'; import { CoreSplitViewComponent } from '@components/split-view/split-view'; @@ -32,8 +32,7 @@ export class CoreSettingsListPage { isIOS: boolean; selectedPage: string; - constructor(private settingsDelegate: CoreSettingsDelegate, private navCtrl: NavController, platorm: Platform, - navParams: NavParams) { + constructor(private settingsDelegate: CoreSettingsDelegate, platorm: Platform, navParams: NavParams) { this.isIOS = platorm.is('ios'); this.selectedPage = navParams.get('page') || false; diff --git a/src/core/siteplugins/directives/call-ws-on-load.ts b/src/core/siteplugins/directives/call-ws-on-load.ts index 14290e22a..ecbe9a12d 100644 --- a/src/core/siteplugins/directives/call-ws-on-load.ts +++ b/src/core/siteplugins/directives/call-ws-on-load.ts @@ -12,10 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Directive, Input, OnInit, ElementRef, Optional } from '@angular/core'; +import { Directive, OnInit, ElementRef, Optional } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; import { CoreDomUtilsProvider } from '@providers/utils/dom'; -import { CoreUtilsProvider } from '@providers/utils/utils'; import { CoreSitePluginsProvider } from '../providers/siteplugins'; import { CoreSitePluginsCallWSBaseDirective } from '../classes/call-ws-directive'; import { CoreSitePluginsPluginContentComponent } from '../components/plugin-content/plugin-content'; diff --git a/src/core/siteplugins/providers/siteplugins.ts b/src/core/siteplugins/providers/siteplugins.ts index b21100ba3..dd3eb2ad5 100644 --- a/src/core/siteplugins/providers/siteplugins.ts +++ b/src/core/siteplugins/providers/siteplugins.ts @@ -20,7 +20,6 @@ import { CoreLangProvider } from '@providers/lang'; import { CoreLoggerProvider } from '@providers/logger'; import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; import { CoreSitesProvider } from '@providers/sites'; -import { CoreTextUtilsProvider } from '@providers/utils/text'; import { CoreUtilsProvider } from '@providers/utils/utils'; import { CoreConfigConstants } from '../../../configconstants'; import { CoreCoursesProvider } from '@core/courses/providers/courses'; @@ -67,8 +66,7 @@ export class CoreSitePluginsProvider { constructor(logger: CoreLoggerProvider, private sitesProvider: CoreSitesProvider, private utils: CoreUtilsProvider, private langProvider: CoreLangProvider, private appProvider: CoreAppProvider, private platform: Platform, - private filepoolProvider: CoreFilepoolProvider, private coursesProvider: CoreCoursesProvider, - private textUtils: CoreTextUtilsProvider) { + private filepoolProvider: CoreFilepoolProvider, private coursesProvider: CoreCoursesProvider) { this.logger = logger.getInstance('CoreUserProvider'); } diff --git a/src/core/user/components/participants/participants.ts b/src/core/user/components/participants/participants.ts index ccc807479..6f3d39158 100644 --- a/src/core/user/components/participants/participants.ts +++ b/src/core/user/components/participants/participants.ts @@ -13,7 +13,7 @@ // limitations under the License. import { Component, ViewChild, Input, OnInit } from '@angular/core'; -import { Content, NavParams } from 'ionic-angular'; +import { Content } from 'ionic-angular'; import { CoreUserProvider } from '../../providers/user'; import { CoreDomUtilsProvider } from '@providers/utils/dom'; import { CoreSplitViewComponent } from '@components/split-view/split-view'; diff --git a/src/core/user/providers/course-option-handler.ts b/src/core/user/providers/course-option-handler.ts index 7de414c9e..9eb0230c9 100644 --- a/src/core/user/providers/course-option-handler.ts +++ b/src/core/user/providers/course-option-handler.ts @@ -13,7 +13,6 @@ // limitations under the License. import { Injectable, Injector } from '@angular/core'; -import { NavController } from 'ionic-angular'; import { CoreCourseOptionsHandler, CoreCourseOptionsHandlerData } from '@core/course/providers/options-delegate'; import { CoreCourseProvider } from '@core/course/providers/course'; import { CoreUserProvider } from './user'; diff --git a/src/directives/download-file.ts b/src/directives/download-file.ts index d4c4e311a..c8ecebc23 100644 --- a/src/directives/download-file.ts +++ b/src/directives/download-file.ts @@ -15,7 +15,6 @@ import { Directive, Input, OnInit, ElementRef } from '@angular/core'; import { CoreFileHelperProvider } from '@providers/file-helper'; import { CoreDomUtilsProvider } from '@providers/utils/dom'; -import { CoreUtilsProvider } from '@providers/utils/utils'; /** * Directive to allow downloading and open a file. When the item with this directive is clicked, the file will be diff --git a/src/providers/lang.ts b/src/providers/lang.ts index 9f4dfd699..1d7439a94 100644 --- a/src/providers/lang.ts +++ b/src/providers/lang.ts @@ -19,7 +19,6 @@ import { Globalization } from '@ionic-native/globalization'; import { Platform } from 'ionic-angular'; import { CoreConfigProvider } from './config'; import { CoreConfigConstants } from '../configconstants'; -import { Observable } from 'rxjs'; /* * Service to handle language features, like changing the current language. diff --git a/tslint.json b/tslint.json index 7149be671..54d006b00 100644 --- a/tslint.json +++ b/tslint.json @@ -55,6 +55,7 @@ "no-eval": true, "no-invalid-this": true, "no-this-assignment": true, + "no-unused-variable": true, "no-var-keyword": true, "switch-default": true, "typeof-compare": true,