MOBILE-2319 notes: PR fixes
parent
a6ea996778
commit
a0c57f46c0
|
@ -22,11 +22,7 @@ import { AddonNotesUserHandler } from './providers/user-handler';
|
|||
import { AddonNotesComponentsModule } from './components/components.module';
|
||||
import { CoreCourseOptionsDelegate } from '@core/course/providers/options-delegate';
|
||||
import { CoreCronDelegate } from '@providers/cron';
|
||||
import { CoreCoursesProvider } from '@core/courses/providers/courses';
|
||||
import { CoreEventsProvider } from '@providers/events';
|
||||
import { CoreSitesProvider } from '@providers/sites';
|
||||
import { CoreUserDelegate } from '@core/user/providers/user-delegate';
|
||||
import { CoreUserProvider } from '@core/user/providers/user';
|
||||
|
||||
@NgModule({
|
||||
declarations: [
|
||||
|
@ -45,23 +41,11 @@ import { CoreUserProvider } from '@core/user/providers/user';
|
|||
})
|
||||
export class AddonNotesModule {
|
||||
constructor(courseOptionsDelegate: CoreCourseOptionsDelegate, courseOptionHandler: AddonNotesCourseOptionHandler,
|
||||
userDelegate: CoreUserDelegate, userHandler: AddonNotesUserHandler, cronDelegate: CoreCronDelegate,
|
||||
syncHandler: AddonNotesSyncCronHandler, eventsProvider: CoreEventsProvider, sitesProvider: CoreSitesProvider) {
|
||||
userDelegate: CoreUserDelegate, userHandler: AddonNotesUserHandler,
|
||||
cronDelegate: CoreCronDelegate, syncHandler: AddonNotesSyncCronHandler) {
|
||||
// Register handlers.
|
||||
courseOptionsDelegate.registerHandler(courseOptionHandler);
|
||||
userDelegate.registerHandler(userHandler);
|
||||
cronDelegate.register(syncHandler);
|
||||
|
||||
eventsProvider.on(CoreEventsProvider.LOGOUT, () => {
|
||||
courseOptionHandler.clearCoursesNavCache();
|
||||
}, sitesProvider.getCurrentSiteId());
|
||||
|
||||
eventsProvider.on(CoreCoursesProvider.EVENT_MY_COURSES_REFRESHED, () => {
|
||||
courseOptionHandler.clearCoursesNavCache();
|
||||
}, sitesProvider.getCurrentSiteId());
|
||||
|
||||
eventsProvider.on(CoreUserProvider.PROFILE_REFRESHED, () => {
|
||||
userHandler.clearAddNoteCache();
|
||||
}, sitesProvider.getCurrentSiteId());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
<ion-item>
|
||||
<ion-textarea placeholder="{{ 'addon.notes.note' | translate }}" rows="5" [(ngModel)]="text" name="text" required="required"></ion-textarea>
|
||||
</ion-item>
|
||||
<button ion-button full margin-vertical type="submit" [disabled]="processing || text.length < 2">
|
||||
<button ion-button block margin-vertical type="submit" [disabled]="processing || text.length < 2">
|
||||
{{ 'addon.notes.addnewnote' | translate }}
|
||||
</button>
|
||||
</form>
|
||||
|
|
|
@ -17,9 +17,10 @@
|
|||
</ion-refresher>
|
||||
<core-loading [hideUntil]="notesLoaded" class="core-loading-center">
|
||||
|
||||
<p class="core-warning-card" *ngIf="hasOffline">
|
||||
<ion-icon name="alert" color="warning" padding-right></ion-icon> {{ 'core.thereisdatatosync' | translate:{$a: 'addon.notes.notes' | translate | lowercase } }}
|
||||
</p>
|
||||
<div class="core-warning-card" icon-start *ngIf="hasOffline">
|
||||
<ion-icon name="warning"></ion-icon>
|
||||
{{ 'core.thereisdatatosync' | translate:{$a: 'addon.notes.notes' | translate | lowercase } }}
|
||||
</div>
|
||||
|
||||
<core-empty-box *ngIf="notes && notes.length == 0" icon="list" [message]="'addon.notes.nonotes' | translate"></core-empty-box>
|
||||
|
||||
|
|
|
@ -76,10 +76,11 @@ export class AddonNotesListPage implements OnDestroy {
|
|||
}
|
||||
|
||||
/**
|
||||
* Fetch notes
|
||||
* Fetch notes.
|
||||
*
|
||||
* @param {boolean} sync When to resync notes.
|
||||
* @param {boolean} [showErrors] When to display errors or not.
|
||||
* @return {Promise<any>} Promise with the notes,
|
||||
* @return {Promise<any>} Promise with the notes.
|
||||
*/
|
||||
private fetchNotes(sync: boolean, showErrors?: boolean): Promise<any> {
|
||||
const promise = sync ? this.syncNotes(showErrors) : Promise.resolve();
|
||||
|
@ -90,7 +91,7 @@ export class AddonNotesListPage implements OnDestroy {
|
|||
return this.notesProvider.getNotes(this.courseId).then((notes) => {
|
||||
notes = notes[this.type + 'notes'] || [];
|
||||
|
||||
this.hasOffline = this.notesProvider.hasOfflineNote(notes);
|
||||
this.hasOffline = notes.some((note) => note.offline);
|
||||
|
||||
return this.notesProvider.getNotesUserData(notes, this.courseId).then((notes) => {
|
||||
this.notes = notes;
|
||||
|
@ -101,7 +102,7 @@ export class AddonNotesListPage implements OnDestroy {
|
|||
}).finally(() => {
|
||||
this.notesLoaded = true;
|
||||
this.refreshIcon = 'refresh';
|
||||
this.syncIcon = 'loop';
|
||||
this.syncIcon = 'sync';
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -124,7 +125,7 @@ export class AddonNotesListPage implements OnDestroy {
|
|||
}
|
||||
|
||||
/**
|
||||
* Tries to syncrhonize course notes.
|
||||
* Tries to synchronize course notes.
|
||||
*
|
||||
* @param {boolean} showErrors Whether to display errors or not.
|
||||
* @return {Promise<any>} Promise resolved if sync is successful, rejected otherwise.
|
||||
|
|
|
@ -25,24 +25,16 @@ import { AddonNotesTypesComponent } from '../components/types/types';
|
|||
export class AddonNotesCourseOptionHandler implements CoreCourseOptionsHandler {
|
||||
name = 'AddonNotes';
|
||||
priority = 200;
|
||||
protected coursesNavEnabledCache = {};
|
||||
|
||||
constructor(private notesProvider: AddonNotesProvider) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear courses nav cache.
|
||||
*/
|
||||
clearCoursesNavCache(): void {
|
||||
this.coursesNavEnabledCache = {};
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether or not the handler is enabled on a site level.
|
||||
* @return {boolean|Promise<boolean>} Whether or not the handler is enabled on a site level.
|
||||
*/
|
||||
isEnabled(): boolean | Promise<boolean> {
|
||||
return this.notesProvider.isPluginViewNotesEnabled();
|
||||
return this.notesProvider.isPluginEnabled();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -63,15 +55,7 @@ export class AddonNotesCourseOptionHandler implements CoreCourseOptionsHandler {
|
|||
return navOptions.notes;
|
||||
}
|
||||
|
||||
if (typeof this.coursesNavEnabledCache[courseId] != 'undefined') {
|
||||
return this.coursesNavEnabledCache[courseId];
|
||||
}
|
||||
|
||||
return this.notesProvider.isPluginViewNotesEnabledForCourse(courseId).then((enabled) => {
|
||||
this.coursesNavEnabledCache[courseId] = enabled;
|
||||
|
||||
return enabled;
|
||||
});
|
||||
return this.notesProvider.isPluginViewNotesEnabledForCourse(courseId);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -32,7 +32,7 @@ export class AddonNotesProvider {
|
|||
protected logger;
|
||||
|
||||
constructor(logger: CoreLoggerProvider, private sitesProvider: CoreSitesProvider, private appProvider: CoreAppProvider,
|
||||
private utilsProvider: CoreUtilsProvider, private translate: TranslateService, private userProvider: CoreUserProvider,
|
||||
private utils: CoreUtilsProvider, private translate: TranslateService, private userProvider: CoreUserProvider,
|
||||
private notesOffline: AddonNotesOfflineProvider) {
|
||||
this.logger = logger.getInstance('AddonNotesProvider');
|
||||
}
|
||||
|
@ -65,14 +65,14 @@ export class AddonNotesProvider {
|
|||
// Send note to server.
|
||||
return this.addNoteOnline(userId, courseId, publishState, noteText, siteId).then(() => {
|
||||
return true;
|
||||
}).catch((data) => {
|
||||
if (data.wserror) {
|
||||
// It's a WebService error, the user cannot add the note so don't store it.
|
||||
return Promise.reject(data.error);
|
||||
} else {
|
||||
// Error sending note, store it to retry later.
|
||||
return storeOffline();
|
||||
}).catch((error) => {
|
||||
if (this.utils.isWebServiceError(error)) {
|
||||
// It's a WebService error, the user cannot send the message so don't store it.
|
||||
return Promise.reject(error);
|
||||
}
|
||||
|
||||
// Error sending note, store it to retry later.
|
||||
return storeOffline();
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -84,9 +84,7 @@ export class AddonNotesProvider {
|
|||
* @param {string} publishState Personal, Site or Course.
|
||||
* @param {string} noteText The note text.
|
||||
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||
* @return {Promise<any>} Promise resolved when added, rejected otherwise. Reject param is an object with:
|
||||
* - error: The error message.
|
||||
* - wserror: True if it's an error returned by the WebService, false otherwise.
|
||||
* @return {Promise<any>} Promise resolved when added, rejected otherwise.
|
||||
*/
|
||||
addNoteOnline(userId: number, courseId: number, publishState: string, noteText: string, siteId?: string): Promise<any> {
|
||||
const notes = [
|
||||
|
@ -99,18 +97,10 @@ export class AddonNotesProvider {
|
|||
}
|
||||
];
|
||||
|
||||
return this.addNotesOnline(notes, siteId).catch((error) => {
|
||||
return Promise.reject({
|
||||
error: error,
|
||||
wserror: this.utilsProvider.isWebServiceError(error)
|
||||
});
|
||||
}).then((response) => {
|
||||
return this.addNotesOnline(notes, siteId).then((response) => {
|
||||
if (response && response[0] && response[0].noteid === -1) {
|
||||
// There was an error, and it should be translated already.
|
||||
return Promise.reject({
|
||||
error: response[0].errormessage,
|
||||
wserror: true
|
||||
});
|
||||
return Promise.reject(this.utils.createFakeWSError(response[0].errormessage));
|
||||
}
|
||||
|
||||
// A note was added, invalidate the course notes.
|
||||
|
@ -143,7 +133,7 @@ export class AddonNotesProvider {
|
|||
}
|
||||
|
||||
/**
|
||||
* Returns whether or not the add note plugin is enabled for a certain site.
|
||||
* Returns whether or not the notes plugin is enabled for a certain site.
|
||||
*
|
||||
* This method is called quite often and thus should only perform a quick
|
||||
* check, we should not be calling WS from here.
|
||||
|
@ -151,15 +141,9 @@ export class AddonNotesProvider {
|
|||
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||
* @return {Promise<boolean>} Promise resolved with true if enabled, resolved with false or rejected otherwise.
|
||||
*/
|
||||
isPluginAddNoteEnabled(siteId?: string): Promise<boolean> {
|
||||
isPluginEnabled(siteId?: string): Promise<boolean> {
|
||||
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||
if (!site.canUseAdvancedFeature('enablenotes')) {
|
||||
return false;
|
||||
} else if (!site.wsAvailable('core_notes_create_notes')) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
return site.canUseAdvancedFeature('enablenotes');
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -188,33 +172,7 @@ export class AddonNotesProvider {
|
|||
|
||||
/* Use .read to cache data and be able to check it in offline. This means that, if a user loses the capabilities
|
||||
to add notes, he'll still see the option in the app. */
|
||||
return site.read('core_notes_create_notes', data).then(() => {
|
||||
// User can add notes.
|
||||
return true;
|
||||
}).catch(() => {
|
||||
return false;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether or not the read notes plugin is enabled for the current site.
|
||||
*
|
||||
* This method is called quite often and thus should only perform a quick
|
||||
* check, we should not be calling WS from here.
|
||||
*
|
||||
* @param {string} [siteId] Site ID. If not defined, current site.
|
||||
* @return {Promise<boolean>} Promise resolved with true if enabled, resolved with false or rejected otherwise.
|
||||
*/
|
||||
isPluginViewNotesEnabled(siteId?: string): Promise<boolean> {
|
||||
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||
if (!site.canUseAdvancedFeature('enablenotes')) {
|
||||
return false;
|
||||
} else if (!site.wsAvailable('core_notes_get_course_notes')) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
return this.utils.promiseWorks(site.read('core_notes_create_notes', data));
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -226,11 +184,7 @@ export class AddonNotesProvider {
|
|||
* @return {Promise<boolean>} Promise resolved with true if enabled, resolved with false or rejected otherwise.
|
||||
*/
|
||||
isPluginViewNotesEnabledForCourse(courseId: number, siteId?: string): Promise<boolean> {
|
||||
return this.getNotes(courseId, false, true, siteId).then(() => {
|
||||
return true;
|
||||
}).catch(() => {
|
||||
return false;
|
||||
});
|
||||
return this.utils.promiseWorks(this.getNotes(courseId, false, true, siteId));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -314,26 +268,6 @@ export class AddonNotesProvider {
|
|||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a list of notes, check if any of them is an offline note.
|
||||
*
|
||||
* @param {any[]} notes List of notes.
|
||||
* @return {boolean} True if at least 1 note is offline, false otherwise.
|
||||
*/
|
||||
hasOfflineNote(notes: any[]): boolean {
|
||||
if (!notes || !notes.length) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (let i = 0, len = notes.length; i < len; i++) {
|
||||
if (notes[i].offline) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Invalidate get notes WS call.
|
||||
*
|
||||
|
|
|
@ -14,6 +14,8 @@
|
|||
|
||||
import { Injectable } from '@angular/core';
|
||||
import { ModalController } from 'ionic-angular';
|
||||
import { CoreEventsProvider } from '@providers/events';
|
||||
import { CoreUserProvider } from '@core/user/providers/user';
|
||||
import { CoreUserDelegate, CoreUserProfileHandler, CoreUserProfileHandlerData } from '@core/user/providers/user-delegate';
|
||||
import { CoreSitesProvider } from '@providers/sites';
|
||||
import { AddonNotesProvider } from './notes';
|
||||
|
@ -29,7 +31,11 @@ export class AddonNotesUserHandler implements CoreUserProfileHandler {
|
|||
addNoteEnabledCache = {};
|
||||
|
||||
constructor(private modalCtrl: ModalController, private sitesProvider: CoreSitesProvider,
|
||||
private notesProvider: AddonNotesProvider) {
|
||||
private notesProvider: AddonNotesProvider, eventsProvider: CoreEventsProvider) {
|
||||
eventsProvider.on(CoreEventsProvider.LOGOUT, this.clearAddNoteCache.bind(this));
|
||||
eventsProvider.on(CoreUserProvider.PROFILE_REFRESHED, (data) => {
|
||||
this.clearAddNoteCache(data.courseId);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -38,7 +44,7 @@ export class AddonNotesUserHandler implements CoreUserProfileHandler {
|
|||
*
|
||||
* @param {number} [courseId] Course ID.
|
||||
*/
|
||||
clearAddNoteCache(courseId?: number): void {
|
||||
private clearAddNoteCache(courseId?: number): void {
|
||||
if (courseId) {
|
||||
delete this.addNoteEnabledCache[courseId];
|
||||
} else {
|
||||
|
@ -51,7 +57,7 @@ export class AddonNotesUserHandler implements CoreUserProfileHandler {
|
|||
* @return {boolean|Promise<boolean>} Whether or not the handler is enabled on a site level.
|
||||
*/
|
||||
isEnabled(): boolean | Promise<boolean> {
|
||||
return this.notesProvider.isPluginAddNoteEnabled();
|
||||
return this.notesProvider.isPluginEnabled();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue