MOBILE-2333 siteplugins: Rename bootstrap to init & treat exceptions

main
Dani Palou 2018-05-02 12:15:17 +02:00
parent bec35e3c98
commit 28dc1232ad
18 changed files with 90 additions and 67 deletions

View File

@ -78,6 +78,12 @@ export interface CoreSiteWSPreSets {
*/ */
getEmergencyCacheUsingCacheKey?: boolean; getEmergencyCacheUsingCacheKey?: boolean;
/**
* If true, the cache entry will be deleted if the WS call returns an exception.
* @type {boolean}
*/
deleteCacheIfWSError?: boolean;
/** /**
* Whether it should only be 1 entry for this cache key (all entries with same key will be deleted). * Whether it should only be 1 entry for this cache key (all entries with same key will be deleted).
* @type {boolean} * @type {boolean}
@ -633,6 +639,15 @@ export class CoreSite {
return Promise.reject(error); return Promise.reject(error);
} }
if (preSets.deleteCacheIfWSError && this.utils.isWebServiceError(error)) {
// Delete the cache entry and return the entry. Don't block the user with the delete.
this.deleteFromCache(method, data, preSets).catch(() => {
// Ignore errors.
});
return Promise.reject(error);
}
this.logger.debug(`WS call '${method}' failed. Trying to use the emergency cache.`); this.logger.debug(`WS call '${method}' failed. Trying to use the emergency cache.`);
preSets.omitExpires = true; preSets.omitExpires = true;
preSets.getFromCache = true; preSets.getFromCache = true;

View File

@ -25,7 +25,7 @@ export class CoreSitePluginsCourseOptionHandler extends CoreSitePluginsBaseHandl
priority: number; priority: number;
constructor(name: string, protected title: string, protected plugin: any, protected handlerSchema: any, constructor(name: string, protected title: string, protected plugin: any, protected handlerSchema: any,
protected bootstrapResult: any, protected sitePluginsProvider: CoreSitePluginsProvider) { protected initResult: any, protected sitePluginsProvider: CoreSitePluginsProvider) {
super(name); super(name);
this.priority = handlerSchema.priority; this.priority = handlerSchema.priority;
@ -42,7 +42,7 @@ export class CoreSitePluginsCourseOptionHandler extends CoreSitePluginsBaseHandl
*/ */
isEnabledForCourse(courseId: number, accessData: any, navOptions?: any, admOptions?: any): boolean | Promise<boolean> { isEnabledForCourse(courseId: number, accessData: any, navOptions?: any, admOptions?: any): boolean | Promise<boolean> {
return this.sitePluginsProvider.isHandlerEnabledForCourse( return this.sitePluginsProvider.isHandlerEnabledForCourse(
courseId, this.handlerSchema.restricttoenrolledcourses, this.bootstrapResult.restrict); courseId, this.handlerSchema.restricttoenrolledcourses, this.initResult.restrict);
} }
/** /**

View File

@ -22,7 +22,7 @@ export class CoreSitePluginsMainMenuHandler extends CoreSitePluginsBaseHandler i
priority: number; priority: number;
constructor(name: string, protected title: string, protected plugin: any, protected handlerSchema: any, constructor(name: string, protected title: string, protected plugin: any, protected handlerSchema: any,
protected bootstrapResult: any) { protected initResult: any) {
super(name); super(name);
this.priority = handlerSchema.priority; this.priority = handlerSchema.priority;
@ -43,7 +43,7 @@ export class CoreSitePluginsMainMenuHandler extends CoreSitePluginsBaseHandler i
title: this.title, title: this.title,
component: this.plugin.component, component: this.plugin.component,
method: this.handlerSchema.method, method: this.handlerSchema.method,
bootstrapResult: this.bootstrapResult initResult: this.initResult
} }
}; };
} }

View File

@ -38,7 +38,7 @@ export class CoreSitePluginsUserProfileHandler extends CoreSitePluginsBaseHandle
type: string; type: string;
constructor(name: string, protected title: string, protected plugin: any, protected handlerSchema: any, constructor(name: string, protected title: string, protected plugin: any, protected handlerSchema: any,
protected bootstrapResult: any, protected sitePluginsProvider: CoreSitePluginsProvider) { protected initResult: any, protected sitePluginsProvider: CoreSitePluginsProvider) {
super(name); super(name);
this.priority = handlerSchema.priority; this.priority = handlerSchema.priority;
@ -59,14 +59,14 @@ export class CoreSitePluginsUserProfileHandler extends CoreSitePluginsBaseHandle
isEnabledForUser(user: any, courseId: number, navOptions?: any, admOptions?: any): boolean | Promise<boolean> { isEnabledForUser(user: any, courseId: number, navOptions?: any, admOptions?: any): boolean | Promise<boolean> {
// First check if it's enabled for the user. // First check if it's enabled for the user.
const enabledForUser = this.sitePluginsProvider.isHandlerEnabledForUser(user.id, this.handlerSchema.restricttocurrentuser, const enabledForUser = this.sitePluginsProvider.isHandlerEnabledForUser(user.id, this.handlerSchema.restricttocurrentuser,
this.bootstrapResult.restrict); this.initResult.restrict);
if (!enabledForUser) { if (!enabledForUser) {
return false; return false;
} }
// Enabled for user, check if it's enabled for the course. // Enabled for user, check if it's enabled for the course.
return this.sitePluginsProvider.isHandlerEnabledForCourse( return this.sitePluginsProvider.isHandlerEnabledForCourse(
courseId, this.handlerSchema.restricttoenrolledcourses, this.bootstrapResult.restrict); courseId, this.handlerSchema.restricttoenrolledcourses, this.initResult.restrict);
} }
/** /**
@ -92,7 +92,7 @@ export class CoreSitePluginsUserProfileHandler extends CoreSitePluginsBaseHandle
courseid: courseId, courseid: courseId,
userid: user.id userid: user.id
}, },
bootstrapResult: this.bootstrapResult initResult: this.initResult
}); });
} }
}; };

View File

@ -1 +1 @@
<core-site-plugins-plugin-content *ngIf="component && method" [component]="component" [method]="method" [args]="args" [bootstrapResult]="bootstrapResult"></core-site-plugins-plugin-content> <core-site-plugins-plugin-content *ngIf="component && method" [component]="component" [method]="method" [args]="args" [initResult]="initResult"></core-site-plugins-plugin-content>

View File

@ -33,7 +33,7 @@ export class CoreSitePluginsCourseFormatComponent implements OnInit {
component: string; component: string;
method: string; method: string;
args: any; args: any;
bootstrapResult: any; initResult: any;
constructor(protected sitePluginsProvider: CoreSitePluginsProvider) { } constructor(protected sitePluginsProvider: CoreSitePluginsProvider) { }
@ -50,7 +50,7 @@ export class CoreSitePluginsCourseFormatComponent implements OnInit {
courseid: this.course.id, courseid: this.course.id,
downloadenabled: this.downloadEnabled downloadenabled: this.downloadEnabled
}; };
this.bootstrapResult = handler.bootstrapResult; this.initResult = handler.initResult;
} }
} }
} }

View File

@ -2,5 +2,5 @@
<ion-refresher [enabled]="content && content.dataLoaded" (ionRefresh)="refreshData($event)"> <ion-refresher [enabled]="content && content.dataLoaded" (ionRefresh)="refreshData($event)">
<ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content>
</ion-refresher> </ion-refresher>
<core-site-plugins-plugin-content *ngIf="component && method" [component]="component" [method]="method" [args]="args" [bootstrapResult]="bootstrapResult"></core-site-plugins-plugin-content> <core-site-plugins-plugin-content *ngIf="component && method" [component]="component" [method]="method" [args]="args" [initResult]="initResult"></core-site-plugins-plugin-content>
</ion-content> </ion-content>

View File

@ -32,7 +32,7 @@ export class CoreSitePluginsCourseOptionComponent implements OnInit {
component: string; component: string;
method: string; method: string;
args: any; args: any;
bootstrapResult: any; initResult: any;
constructor(protected sitePluginsProvider: CoreSitePluginsProvider) { } constructor(protected sitePluginsProvider: CoreSitePluginsProvider) { }
@ -48,7 +48,7 @@ export class CoreSitePluginsCourseOptionComponent implements OnInit {
this.args = { this.args = {
courseid: this.courseId, courseid: this.courseId,
}; };
this.bootstrapResult = handler.bootstrapResult; this.initResult = handler.initResult;
} }
} }
} }

View File

@ -9,4 +9,4 @@
</core-context-menu> </core-context-menu>
</core-navbar-buttons> </core-navbar-buttons>
<core-site-plugins-plugin-content *ngIf="component && method" [component]="component" [method]="method" [args]="args" [bootstrapResult]="bootstrapResult" (onContentLoaded)="contentLoaded($event)" (onLoadingContent)="contentLoading($event)"></core-site-plugins-plugin-content> <core-site-plugins-plugin-content *ngIf="component && method" [component]="component" [method]="method" [args]="args" [initResult]="initResult" (onContentLoaded)="contentLoaded($event)" (onLoadingContent)="contentLoading($event)"></core-site-plugins-plugin-content>

View File

@ -37,7 +37,7 @@ export class CoreSitePluginsModuleIndexComponent implements OnInit, OnDestroy, C
component: string; component: string;
method: string; method: string;
args: any; args: any;
bootstrapResult: any; initResult: any;
// Data for context menu. // Data for context menu.
externalUrl: string; externalUrl: string;
@ -69,7 +69,7 @@ export class CoreSitePluginsModuleIndexComponent implements OnInit, OnDestroy, C
courseid: this.courseId, courseid: this.courseId,
cmid: this.module.id cmid: this.module.id
}; };
this.bootstrapResult = handler.bootstrapResult; this.initResult = handler.initResult;
} }
// Get the data for the context menu. // Get the data for the context menu.

View File

@ -28,7 +28,7 @@ export class CoreSitePluginsPluginContentComponent implements OnInit {
@Input() component: string; @Input() component: string;
@Input() method: string; @Input() method: string;
@Input() args: any; @Input() args: any;
@Input() bootstrapResult: any; // Result of the bootstrap WS call of the handler. @Input() initResult: any; // Result of the init WS call of the handler.
@Output() onContentLoaded?: EventEmitter<boolean>; // Emits an event when the content is loaded. @Output() onContentLoaded?: EventEmitter<boolean>; // Emits an event when the content is loaded.
@Output() onLoadingContent?: EventEmitter<boolean>; // Emits an event when starts to load the content. @Output() onLoadingContent?: EventEmitter<boolean>; // Emits an event when starts to load the content.
@ -65,7 +65,7 @@ export class CoreSitePluginsPluginContentComponent implements OnInit {
this.content = result.templates.length ? result.templates[0].html : ''; // Load first template. this.content = result.templates.length ? result.templates[0].html : ''; // Load first template.
this.javascript = result.javascript; this.javascript = result.javascript;
this.otherData = result.otherdata; this.otherData = result.otherdata;
this.jsData = this.sitePluginsProvider.createDataForJS(this.bootstrapResult, result); this.jsData = this.sitePluginsProvider.createDataForJS(this.initResult, result);
this.onContentLoaded.emit(refresh); this.onContentLoaded.emit(refresh);
}).catch((error) => { }).catch((error) => {

View File

@ -92,7 +92,7 @@ export class CoreSitePluginsCallWSNewContentDirective extends CoreSitePluginsCal
component: this.component, component: this.component,
method: this.method, method: this.method,
args: args, args: args,
bootstrapResult: this.parentContent && this.parentContent.bootstrapResult initResult: this.parentContent && this.parentContent.initResult
}); });
} }
} }

View File

@ -89,7 +89,7 @@ export class CoreSitePluginsNewContentDirective implements OnInit {
component: this.component, component: this.component,
method: this.method, method: this.method,
args: args, args: args,
bootstrapResult: this.parentContent && this.parentContent.bootstrapResult initResult: this.parentContent && this.parentContent.initResult
}); });
} }
}); });

View File

@ -11,5 +11,5 @@
<ion-refresher [enabled]="content && content.dataLoaded" (ionRefresh)="refreshData($event)"> <ion-refresher [enabled]="content && content.dataLoaded" (ionRefresh)="refreshData($event)">
<ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content>
</ion-refresher> </ion-refresher>
<core-site-plugins-plugin-content [component]="component" [method]="method" [args]="args" [bootstrapResult]="bootstrapResult"></core-site-plugins-plugin-content> <core-site-plugins-plugin-content [component]="component" [method]="method" [args]="args" [initResult]="initResult"></core-site-plugins-plugin-content>
</ion-content> </ion-content>

View File

@ -32,14 +32,14 @@ export class CoreSitePluginsPluginPage {
component: string; component: string;
method: string; method: string;
args: any; args: any;
bootstrapResult: any; initResult: any;
constructor(params: NavParams) { constructor(params: NavParams) {
this.title = params.get('title'); this.title = params.get('title');
this.component = params.get('component'); this.component = params.get('component');
this.method = params.get('method'); this.method = params.get('method');
this.args = params.get('args'); this.args = params.get('args');
this.bootstrapResult = params.get('bootstrapResult'); this.initResult = params.get('initResult');
} }
/** /**

View File

@ -89,19 +89,19 @@ export class CoreSitePluginsHelperProvider {
} }
/** /**
* Bootstrap a handler if it has some bootstrap method. * Execute a handler's init method if it has any.
* *
* @param {any} plugin Data of the plugin. * @param {any} plugin Data of the plugin.
* @param {any} handlerSchema Data about the handler. * @param {any} handlerSchema Data about the handler.
* @return {Promise<any>} Promise resolved when done. It returns the results of the getContent call and the data returned by * @return {Promise<any>} Promise resolved when done. It returns the results of the getContent call and the data returned by
* the bootstrap JS (if any). * the init JS (if any).
*/ */
protected bootstrapHandler(plugin: any, handlerSchema: any): Promise<any> { protected executeHandlerInit(plugin: any, handlerSchema: any): Promise<any> {
if (!handlerSchema.bootstrap) { if (!handlerSchema.init) {
return Promise.resolve({}); return Promise.resolve({});
} }
return this.executeMethodAndJS(plugin, handlerSchema.bootstrap); return this.executeMethodAndJS(plugin, handlerSchema.init, true);
} }
/** /**
@ -109,12 +109,16 @@ export class CoreSitePluginsHelperProvider {
* *
* @param {any} plugin Data of the plugin. * @param {any} plugin Data of the plugin.
* @param {string} method The method to call. * @param {string} method The method to call.
* @param {boolean} [isInit] Whether it's the init method.
* @return {Promise<any>} Promise resolved when done. It returns the results of the getContent call and the data returned by * @return {Promise<any>} Promise resolved when done. It returns the results of the getContent call and the data returned by
* the JS (if any). * the JS (if any).
*/ */
protected executeMethodAndJS(plugin: any, method: string): Promise<any> { protected executeMethodAndJS(plugin: any, method: string, isInit?: boolean): Promise<any> {
const siteId = this.sitesProvider.getCurrentSiteId(), const siteId = this.sitesProvider.getCurrentSiteId(),
preSets = {getFromCache: false}; // Try to ignore cache. preSets = {
getFromCache: false, // Try to ignore cache.
deleteCacheIfWSError: isInit // If the init WS call returns an exception we won't use cached data.
};
return this.sitePluginsProvider.getContent(plugin.component, method, {}, preSets).then((result) => { return this.sitePluginsProvider.getContent(plugin.component, method, {}, preSets).then((result) => {
if (!result.javascript || this.sitesProvider.getCurrentSiteId() != siteId) { if (!result.javascript || this.sitesProvider.getCurrentSiteId() != siteId) {
@ -290,8 +294,8 @@ export class CoreSitePluginsHelperProvider {
*/ */
registerHandler(plugin: any, handlerName: string, handlerSchema: any): Promise<any> { registerHandler(plugin: any, handlerName: string, handlerSchema: any): Promise<any> {
// Wait for the bootstrap JS to be executed. // Wait for the init JS to be executed.
return this.bootstrapHandler(plugin, handlerSchema).then((result) => { return this.executeHandlerInit(plugin, handlerSchema).then((result) => {
let promise; let promise;
switch (handlerSchema.delegate) { switch (handlerSchema.delegate) {
@ -331,12 +335,12 @@ export class CoreSitePluginsHelperProvider {
plugin: plugin, plugin: plugin,
handlerName: handlerName, handlerName: handlerName,
handlerSchema: handlerSchema, handlerSchema: handlerSchema,
bootstrapResult: result initResult: result
}); });
} }
}); });
}).catch((err) => { }).catch((err) => {
this.logger.error('Error executing bootstrap method', handlerSchema.bootstrap, err); this.logger.error('Error executing init method', handlerSchema.init, err);
}); });
} }
@ -346,11 +350,11 @@ export class CoreSitePluginsHelperProvider {
* @param {any} plugin Data of the plugin. * @param {any} plugin Data of the plugin.
* @param {string} handlerName Name of the handler in the plugin. * @param {string} handlerName Name of the handler in the plugin.
* @param {any} handlerSchema Data about the handler. * @param {any} handlerSchema Data about the handler.
* @param {any} bootstrapResult Result of the bootstrap WS call. * @param {any} initResult Result of the init WS call.
* @return {string} A string to identify the handler. * @return {string} A string to identify the handler.
*/ */
protected registerCourseFormatHandler(plugin: any, handlerName: string, handlerSchema: any, bootstrapResult: any): string { protected registerCourseFormatHandler(plugin: any, handlerName: string, handlerSchema: any, initResult: any): string {
this.logger.debug('Register site plugin in course format delegate:', plugin, handlerSchema, bootstrapResult); this.logger.debug('Register site plugin in course format delegate:', plugin, handlerSchema, initResult);
// Create and register the handler. // Create and register the handler.
const uniqueName = this.sitePluginsProvider.getHandlerUniqueName(plugin, handlerName), const uniqueName = this.sitePluginsProvider.getHandlerUniqueName(plugin, handlerName),
@ -366,10 +370,10 @@ export class CoreSitePluginsHelperProvider {
* @param {any} plugin Data of the plugin. * @param {any} plugin Data of the plugin.
* @param {string} handlerName Name of the handler in the plugin. * @param {string} handlerName Name of the handler in the plugin.
* @param {any} handlerSchema Data about the handler. * @param {any} handlerSchema Data about the handler.
* @param {any} bootstrapResult Result of the bootstrap WS call. * @param {any} initResult Result of the init WS call.
* @return {string} A string to identify the handler. * @return {string} A string to identify the handler.
*/ */
protected registerCourseOptionHandler(plugin: any, handlerName: string, handlerSchema: any, bootstrapResult: any): string { protected registerCourseOptionHandler(plugin: any, handlerName: string, handlerSchema: any, initResult: any): string {
if (!handlerSchema.displaydata) { if (!handlerSchema.displaydata) {
// Required data not provided, stop. // Required data not provided, stop.
this.logger.warn('Ignore site plugin because it doesn\'t provide displaydata', plugin, handlerSchema); this.logger.warn('Ignore site plugin because it doesn\'t provide displaydata', plugin, handlerSchema);
@ -377,14 +381,14 @@ export class CoreSitePluginsHelperProvider {
return; return;
} }
this.logger.debug('Register site plugin in course option delegate:', plugin, handlerSchema, bootstrapResult); this.logger.debug('Register site plugin in course option delegate:', plugin, handlerSchema, initResult);
// Create and register the handler. // Create and register the handler.
const uniqueName = this.sitePluginsProvider.getHandlerUniqueName(plugin, handlerName), const uniqueName = this.sitePluginsProvider.getHandlerUniqueName(plugin, handlerName),
prefixedTitle = this.getPrefixedString(plugin.addon, handlerSchema.displaydata.title); prefixedTitle = this.getPrefixedString(plugin.addon, handlerSchema.displaydata.title);
this.courseOptionsDelegate.registerHandler(new CoreSitePluginsCourseOptionHandler(uniqueName, prefixedTitle, plugin, this.courseOptionsDelegate.registerHandler(new CoreSitePluginsCourseOptionHandler(uniqueName, prefixedTitle, plugin,
handlerSchema, bootstrapResult, this.sitePluginsProvider)); handlerSchema, initResult, this.sitePluginsProvider));
return uniqueName; return uniqueName;
} }
@ -395,10 +399,10 @@ export class CoreSitePluginsHelperProvider {
* @param {any} plugin Data of the plugin. * @param {any} plugin Data of the plugin.
* @param {string} handlerName Name of the handler in the plugin. * @param {string} handlerName Name of the handler in the plugin.
* @param {any} handlerSchema Data about the handler. * @param {any} handlerSchema Data about the handler.
* @param {any} bootstrapResult Result of the bootstrap WS call. * @param {any} initResult Result of the init WS call.
* @return {string} A string to identify the handler. * @return {string} A string to identify the handler.
*/ */
protected registerMainMenuHandler(plugin: any, handlerName: string, handlerSchema: any, bootstrapResult: any): string { protected registerMainMenuHandler(plugin: any, handlerName: string, handlerSchema: any, initResult: any): string {
if (!handlerSchema.displaydata) { if (!handlerSchema.displaydata) {
// Required data not provided, stop. // Required data not provided, stop.
this.logger.warn('Ignore site plugin because it doesn\'t provide displaydata', plugin, handlerSchema); this.logger.warn('Ignore site plugin because it doesn\'t provide displaydata', plugin, handlerSchema);
@ -406,14 +410,14 @@ export class CoreSitePluginsHelperProvider {
return; return;
} }
this.logger.debug('Register site plugin in main menu delegate:', plugin, handlerSchema, bootstrapResult); this.logger.debug('Register site plugin in main menu delegate:', plugin, handlerSchema, initResult);
// Create and register the handler. // Create and register the handler.
const uniqueName = this.sitePluginsProvider.getHandlerUniqueName(plugin, handlerName), const uniqueName = this.sitePluginsProvider.getHandlerUniqueName(plugin, handlerName),
prefixedTitle = this.getPrefixedString(plugin.addon, handlerSchema.displaydata.title); prefixedTitle = this.getPrefixedString(plugin.addon, handlerSchema.displaydata.title);
this.mainMenuDelegate.registerHandler( this.mainMenuDelegate.registerHandler(
new CoreSitePluginsMainMenuHandler(uniqueName, prefixedTitle, plugin, handlerSchema, bootstrapResult)); new CoreSitePluginsMainMenuHandler(uniqueName, prefixedTitle, plugin, handlerSchema, initResult));
return uniqueName; return uniqueName;
} }
@ -424,10 +428,10 @@ export class CoreSitePluginsHelperProvider {
* @param {any} plugin Data of the plugin. * @param {any} plugin Data of the plugin.
* @param {string} handlerName Name of the handler in the plugin. * @param {string} handlerName Name of the handler in the plugin.
* @param {any} handlerSchema Data about the handler. * @param {any} handlerSchema Data about the handler.
* @param {any} bootstrapResult Result of the bootstrap WS call. * @param {any} initResult Result of the init WS call.
* @return {string} A string to identify the handler. * @return {string} A string to identify the handler.
*/ */
protected registerModuleHandler(plugin: any, handlerName: string, handlerSchema: any, bootstrapResult: any): string { protected registerModuleHandler(plugin: any, handlerName: string, handlerSchema: any, initResult: any): string {
if (!handlerSchema.displaydata) { if (!handlerSchema.displaydata) {
// Required data not provided, stop. // Required data not provided, stop.
this.logger.warn('Ignore site plugin because it doesn\'t provide displaydata', plugin, handlerSchema); this.logger.warn('Ignore site plugin because it doesn\'t provide displaydata', plugin, handlerSchema);
@ -435,7 +439,7 @@ export class CoreSitePluginsHelperProvider {
return; return;
} }
this.logger.debug('Register site plugin in module delegate:', plugin, handlerSchema, bootstrapResult); this.logger.debug('Register site plugin in module delegate:', plugin, handlerSchema, initResult);
// Create and register the handler. // Create and register the handler.
const uniqueName = this.sitePluginsProvider.getHandlerUniqueName(plugin, handlerName), const uniqueName = this.sitePluginsProvider.getHandlerUniqueName(plugin, handlerName),
@ -458,10 +462,10 @@ export class CoreSitePluginsHelperProvider {
* @param {any} plugin Data of the plugin. * @param {any} plugin Data of the plugin.
* @param {string} handlerName Name of the handler in the plugin. * @param {string} handlerName Name of the handler in the plugin.
* @param {any} handlerSchema Data about the handler. * @param {any} handlerSchema Data about the handler.
* @param {any} bootstrapResult Result of the bootstrap WS call. * @param {any} initResult Result of the init WS call.
* @return {string} A string to identify the handler. * @return {string} A string to identify the handler.
*/ */
protected registerUserProfileHandler(plugin: any, handlerName: string, handlerSchema: any, bootstrapResult: any): string { protected registerUserProfileHandler(plugin: any, handlerName: string, handlerSchema: any, initResult: any): string {
if (!handlerSchema.displaydata) { if (!handlerSchema.displaydata) {
// Required data not provided, stop. // Required data not provided, stop.
this.logger.warn('Ignore site plugin because it doesn\'t provide displaydata', plugin, handlerSchema); this.logger.warn('Ignore site plugin because it doesn\'t provide displaydata', plugin, handlerSchema);
@ -469,14 +473,14 @@ export class CoreSitePluginsHelperProvider {
return; return;
} }
this.logger.debug('Register site plugin in user profile delegate:', plugin, handlerSchema, bootstrapResult); this.logger.debug('Register site plugin in user profile delegate:', plugin, handlerSchema, initResult);
// Create and register the handler. // Create and register the handler.
const uniqueName = this.sitePluginsProvider.getHandlerUniqueName(plugin, handlerName), const uniqueName = this.sitePluginsProvider.getHandlerUniqueName(plugin, handlerName),
prefixedTitle = this.getPrefixedString(plugin.addon, handlerSchema.displaydata.title); prefixedTitle = this.getPrefixedString(plugin.addon, handlerSchema.displaydata.title);
this.userDelegate.registerHandler(new CoreSitePluginsUserProfileHandler(uniqueName, prefixedTitle, plugin, handlerSchema, this.userDelegate.registerHandler(new CoreSitePluginsUserProfileHandler(uniqueName, prefixedTitle, plugin, handlerSchema,
bootstrapResult, this.sitePluginsProvider)); initResult, this.sitePluginsProvider));
return uniqueName; return uniqueName;
} }
@ -487,10 +491,10 @@ export class CoreSitePluginsHelperProvider {
* @param {any} plugin Data of the plugin. * @param {any} plugin Data of the plugin.
* @param {string} handlerName Name of the handler in the plugin. * @param {string} handlerName Name of the handler in the plugin.
* @param {any} handlerSchema Data about the handler. * @param {any} handlerSchema Data about the handler.
* @param {any} bootstrapResult Result of the bootstrap WS call. * @param {any} initResult Result of the init WS call.
* @return {string|Promise<string>} A string (or a promise resolved with a string) to identify the handler. * @return {string|Promise<string>} A string (or a promise resolved with a string) to identify the handler.
*/ */
protected registerUserProfileFieldHandler(plugin: any, handlerName: string, handlerSchema: any, bootstrapResult: any) protected registerUserProfileFieldHandler(plugin: any, handlerName: string, handlerSchema: any, initResult: any)
: string | Promise<string> { : string | Promise<string> {
if (!handlerSchema.method) { if (!handlerSchema.method) {
// Required data not provided, stop. // Required data not provided, stop.
@ -499,7 +503,7 @@ export class CoreSitePluginsHelperProvider {
return; return;
} }
this.logger.debug('Register site plugin in user profile field delegate:', plugin, handlerSchema, bootstrapResult); this.logger.debug('Register site plugin in user profile field delegate:', plugin, handlerSchema, initResult);
// Execute the main method and its JS. The template returned will be used in the profile field component. // Execute the main method and its JS. The template returned will be used in the profile field component.
return this.executeMethodAndJS(plugin, handlerSchema.method).then((result) => { return this.executeMethodAndJS(plugin, handlerSchema.method).then((result) => {

View File

@ -47,10 +47,10 @@ export interface CoreSitePluginsHandler {
handlerSchema: any; handlerSchema: any;
/** /**
* Result of the bootstrap WS call. * Result of the init WS call.
* @type {any} * @type {any}
*/ */
bootstrapResult?: any; initResult?: any;
} }
/** /**
@ -137,23 +137,23 @@ export class CoreSitePluginsProvider {
} }
/** /**
* Given the result of a bootstrap get_content and, optionally, the result of another get_content, * Given the result of a init get_content and, optionally, the result of another get_content,
* build an object with the data to pass to the JS of the get_content. * build an object with the data to pass to the JS of the get_content.
* *
* @param {any} bootstrapResult Result of the bootstrap WS call. * @param {any} initResult Result of the init WS call.
* @param {any} [contentResult] Result of the content WS call (if any). * @param {any} [contentResult] Result of the content WS call (if any).
* @return {any} An object with the data to pass to the JS. * @return {any} An object with the data to pass to the JS.
*/ */
createDataForJS(bootstrapResult: any, contentResult?: any): any { createDataForJS(initResult: any, contentResult?: any): any {
// First of all, add the data returned by the bootstrap JS (if any). // First of all, add the data returned by the init JS (if any).
let data = this.utils.clone(bootstrapResult.jsResult || {}); let data = this.utils.clone(initResult.jsResult || {});
if (typeof data == 'boolean') { if (typeof data == 'boolean') {
data = {}; data = {};
} }
// Now add some data returned by the bootstrap WS call. // Now add some data returned by the init WS call.
data.BOOTSTRAP_TEMPLATES = this.utils.objectToKeyValueMap(bootstrapResult.templates, 'id', 'html'); data.INIT_TEMPLATES = this.utils.objectToKeyValueMap(initResult.templates, 'id', 'html');
data.BOOTSTRAP_OTHERDATA = bootstrapResult.otherdata; data.INIT_OTHERDATA = initResult.otherdata;
if (contentResult) { if (contentResult) {
// Now add the data returned by the content WS call. // Now add the data returned by the content WS call.

View File

@ -626,7 +626,11 @@ export class CoreUtilsProvider {
* @return {boolean} Whether the error was returned by the WebService. * @return {boolean} Whether the error was returned by the WebService.
*/ */
isWebServiceError(error: any): boolean { isWebServiceError(error: any): boolean {
return typeof error.errorcode == 'undefined' && typeof error.warningcode == 'undefined'; return typeof error.warningcode != 'undefined' || (typeof error.errorcode != 'undefined' &&
error.errorcode != 'invalidtoken' && error.errorcode != 'userdeleted' && error.errorcode != 'upgraderunning' &&
error.errorcode != 'forcepasswordchangenotice' && error.errorcode != 'usernotfullysetup' &&
error.errorcode != 'sitepolicynotagreed' && error.errorcode != 'sitemaintenance' &&
(error.errorcode != 'accessexception' || error.message.indexOf('Invalid token - token expired') == -1));
} }
/** /**