Merge pull request #1282 from dpalou/MOBILE-2391

Mobile 2391
main
Juan Leyva 2018-04-06 13:46:51 +01:00 committed by GitHub
commit a5e8b63fec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
79 changed files with 415 additions and 255 deletions

View File

@ -24,7 +24,7 @@ import { AddonBadgesProvider } from './badges';
@Injectable()
export class AddonBadgesMyBadgesLinkHandler extends CoreContentLinksHandlerBase {
name = 'AddonBadgesMyBadgesLinkHandler';
featureName = '$mmUserDelegate_mmaBadges';
featureName = 'CoreUserDelegate_AddonBadges';
pattern = /\/badges\/mybadges\.php/;
constructor(private badgesProvider: AddonBadgesProvider, private loginHelper: CoreLoginHelperProvider) {

View File

@ -21,7 +21,7 @@ import { AddonBadgesProvider } from './badges';
*/
@Injectable()
export class AddonBadgesUserHandler implements CoreUserProfileHandler {
name = 'mmaBadges';
name = 'AddonBadges';
priority = 50;
type = CoreUserDelegate.TYPE_NEW_PAGE;

View File

@ -343,7 +343,7 @@ export class AddonCalendarProvider {
isCalendarDisabledInSite(site?: CoreSite): boolean {
site = site || this.sitesProvider.getCurrentSite();
return site.isFeatureDisabled('$mmSideMenuDelegate_mmaCalendar');
return site.isFeatureDisabled('CoreMainMenuDelegate_AddonCalendar');
}
/**

View File

@ -25,7 +25,7 @@ import { AddonCompetencyProvider } from './competency';
*/
@Injectable()
export class AddonCompetencyUserHandler implements CoreUserProfileHandler {
name = 'AddonCompetency';
name = 'AddonCompetency:learningPlan';
priority = 900;
type = CoreUserDelegate.TYPE_NEW_PAGE;
participantsNavEnabledCache = {};
@ -58,8 +58,8 @@ export class AddonCompetencyUserHandler implements CoreUserProfileHandler {
*
* @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.
* @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<boolean>} Promise resolved with true if enabled, resolved with false otherwise.
*/
isEnabledForUser(user: any, courseId: number, navOptions?: any, admOptions?: any): boolean | Promise<boolean> {

View File

@ -295,7 +295,7 @@ export class AddonFilesProvider {
isDisabledInSite(site: CoreSite): boolean {
site = site || this.sitesProvider.getCurrentSite();
return site.isFeatureDisabled('$mmSideMenuDelegate_mmaFiles');
return site.isFeatureDisabled('CoreMainMenuDelegate_AddonFiles');
}
/**
@ -328,7 +328,7 @@ export class AddonFilesProvider {
isPrivateFilesDisabledInSite(site?: CoreSite): boolean {
site = site || this.sitesProvider.getCurrentSite();
return site.isFeatureDisabled('files_privatefiles');
return site.isFeatureDisabled('AddonFilesPrivateFiles');
}
/**
@ -352,7 +352,7 @@ export class AddonFilesProvider {
isSiteFilesDisabledInSite(site?: CoreSite): boolean {
site = site || this.sitesProvider.getCurrentSite();
return site.isFeatureDisabled('files_sitefiles');
return site.isFeatureDisabled('AddonFilesSiteFiles');
}
/**
@ -376,7 +376,7 @@ export class AddonFilesProvider {
isUploadDisabledInSite(site?: CoreSite): boolean {
site = site || this.sitesProvider.getCurrentSite();
return site.isFeatureDisabled('files_upload');
return site.isFeatureDisabled('AddonFilesUpload');
}
/**

View File

@ -85,7 +85,7 @@ export class AddonMessagesModule {
const notificationClicked = (notification: any): void => {
messagesProvider.isMessagingEnabledForSite(notification.site).then(() => {
sitesProvider.isFeatureDisabled('$mmSideMenuDelegate_mmaMessages', notification.site).then((disabled) => {
sitesProvider.isFeatureDisabled('CoreMainMenuDelegate_AddonMessages', notification.site).then((disabled) => {
if (disabled) {
// Messages are disabled, stop.
return;

View File

@ -62,8 +62,8 @@ export class AddonMessagesAddContactUserHandler implements CoreUserProfileHandle
*
* @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.
* @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<boolean>} Promise resolved with true if enabled, resolved with false otherwise.
*/
isEnabledForUser(user: any, courseId: number, navOptions?: any, admOptions?: any): boolean | Promise<boolean> {

View File

@ -62,8 +62,8 @@ export class AddonMessagesBlockContactUserHandler implements CoreUserProfileHand
*
* @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.
* @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<boolean>} Promise resolved with true if enabled, resolved with false otherwise.
*/
isEnabledForUser(user: any, courseId: number, navOptions?: any, admOptions?: any): boolean | Promise<boolean> {

View File

@ -44,8 +44,8 @@ export class AddonMessagesSendMessageUserHandler implements CoreUserProfileHandl
*
* @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.
* @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<boolean>} Promise resolved with true if enabled, resolved with false otherwise.
*/
isEnabledForUser(user: any, courseId: number, navOptions?: any, admOptions?: any): boolean | Promise<boolean> {

View File

@ -15,7 +15,6 @@
import { Injectable } from '@angular/core';
import { CoreContentLinksModuleIndexHandler } from '@core/contentlinks/classes/module-index-handler';
import { CoreCourseHelperProvider } from '@core/course/providers/helper';
import { AddonModBookProvider } from './book';
/**
* Handler to treat links to book.
@ -25,6 +24,6 @@ export class AddonModBookLinkHandler extends CoreContentLinksModuleIndexHandler
name = 'AddonModBookLinkHandler';
constructor(courseHelper: CoreCourseHelperProvider) {
super(courseHelper, AddonModBookProvider.COMPONENT, 'book');
super(courseHelper, 'AddonModBook', 'book');
}
}

View File

@ -24,7 +24,8 @@ import { CoreCourseProvider } from '@core/course/providers/course';
*/
@Injectable()
export class AddonModBookModuleHandler implements CoreCourseModuleHandler {
name = 'book';
name = 'AddonModBook';
modName = 'book';
constructor(protected bookProvider: AddonModBookProvider, private courseProvider: CoreCourseProvider) { }

View File

@ -21,7 +21,8 @@ import { AddonModBookProvider } from './book';
*/
@Injectable()
export class AddonModBookPrefetchHandler extends CoreCourseModulePrefetchHandlerBase {
name = 'book';
name = 'AddonModBook';
modName = 'book';
component = AddonModBookProvider.COMPONENT;
updatesNames = /^configuration$|^.*files$|^entries$/;
isResource = true;

View File

@ -30,7 +30,7 @@ export class AddonModFolderProvider {
constructor(logger: CoreLoggerProvider, private sitesProvider: CoreSitesProvider, private courseProvider: CoreCourseProvider,
private utils: CoreUtilsProvider) {
this.logger = logger.getInstance('mmaModFolderProvider');
this.logger = logger.getInstance('AddonModFolderProvider');
}
/**

View File

@ -15,7 +15,6 @@
import { Injectable } from '@angular/core';
import { CoreContentLinksModuleIndexHandler } from '@core/contentlinks/classes/module-index-handler';
import { CoreCourseHelperProvider } from '@core/course/providers/helper';
import { AddonModFolderProvider } from './folder';
/**
* Handler to treat links to resource.
@ -25,6 +24,6 @@ export class AddonModFolderLinkHandler extends CoreContentLinksModuleIndexHandle
name = 'AddonModFolderLinkHandler';
constructor(courseHelper: CoreCourseHelperProvider) {
super(courseHelper, AddonModFolderProvider.COMPONENT, 'folder');
super(courseHelper, 'AddonModFolder', 'folder');
}
}

View File

@ -23,7 +23,8 @@ import { CoreCourseProvider } from '@core/course/providers/course';
*/
@Injectable()
export class AddonModFolderModuleHandler implements CoreCourseModuleHandler {
name = 'folder';
name = 'AddonModFolder';
modName = 'folder';
constructor(private courseProvider: CoreCourseProvider) { }

View File

@ -21,7 +21,8 @@ import { AddonModFolderProvider } from './folder';
*/
@Injectable()
export class AddonModFolderPrefetchHandler extends CoreCourseModulePrefetchHandlerBase {
name = 'folder';
name = 'AddonModFolder';
modName = 'folder';
component = AddonModFolderProvider.COMPONENT;
isResource = true;

View File

@ -24,6 +24,6 @@ export class AddonModLabelLinkHandler extends CoreContentLinksModuleIndexHandler
name = 'AddonModLabelLinkHandler';
constructor(courseHelper: CoreCourseHelperProvider) {
super(courseHelper, 'mmaModLabel', 'label');
super(courseHelper, 'AddonModLabel', 'label');
}
}

View File

@ -20,7 +20,8 @@ import { CoreCourseModuleHandler, CoreCourseModuleHandlerData } from '@core/cour
*/
@Injectable()
export class AddonModLabelModuleHandler implements CoreCourseModuleHandler {
name = 'label';
name = 'AddonModLabel';
modName = 'label';
constructor() {
// Nothing to do.

View File

@ -15,7 +15,6 @@
import { Injectable } from '@angular/core';
import { CoreContentLinksModuleIndexHandler } from '@core/contentlinks/classes/module-index-handler';
import { CoreCourseHelperProvider } from '@core/course/providers/helper';
import { AddonModPageProvider } from './page';
/**
* Handler to treat links to resource.
@ -25,6 +24,6 @@ export class AddonModPageLinkHandler extends CoreContentLinksModuleIndexHandler
name = 'AddonModPageLinkHandler';
constructor(courseHelper: CoreCourseHelperProvider) {
super(courseHelper, AddonModPageProvider.COMPONENT, 'page');
super(courseHelper, 'AddonModPage', 'page');
}
}

View File

@ -24,7 +24,8 @@ import { CoreCourseProvider } from '@core/course/providers/course';
*/
@Injectable()
export class AddonModPageModuleHandler implements CoreCourseModuleHandler {
name = 'page';
name = 'AddonModPage';
modName = 'page';
constructor(private courseProvider: CoreCourseProvider, protected pageProvider: AddonModPageProvider) { }

View File

@ -31,7 +31,7 @@ export class AddonModPageProvider {
constructor(logger: CoreLoggerProvider, private sitesProvider: CoreSitesProvider, private courseProvider: CoreCourseProvider,
private utils: CoreUtilsProvider, private filepoolProvider: CoreFilepoolProvider) {
this.logger = logger.getInstance('mmaModPageProvider');
this.logger = logger.getInstance('AddonModPageProvider');
}
/**

View File

@ -23,7 +23,8 @@ import { AddonModPageHelperProvider } from './helper';
*/
@Injectable()
export class AddonModPagePrefetchHandler extends CoreCourseModulePrefetchHandlerBase {
name = 'page';
name = 'AddonModPage';
modName = 'page';
component = AddonModPageProvider.COMPONENT;
updatesNames = /^configuration$|^.*files$/;
isResource = true;

View File

@ -15,7 +15,6 @@
import { Injectable } from '@angular/core';
import { CoreContentLinksModuleIndexHandler } from '@core/contentlinks/classes/module-index-handler';
import { CoreCourseHelperProvider } from '@core/course/providers/helper';
import { AddonModResourceProvider } from './resource';
/**
* Handler to treat links to resource.
@ -25,6 +24,6 @@ export class AddonModResourceLinkHandler extends CoreContentLinksModuleIndexHand
name = 'AddonModResourceLinkHandler';
constructor(courseHelper: CoreCourseHelperProvider) {
super(courseHelper, AddonModResourceProvider.COMPONENT, 'resource');
super(courseHelper, 'AddonModResource', 'resource');
}
}

View File

@ -26,7 +26,8 @@ import { CoreMimetypeUtilsProvider } from '@providers/utils/mimetype';
*/
@Injectable()
export class AddonModResourceModuleHandler implements CoreCourseModuleHandler {
name = 'resource';
name = 'AddonModResource';
modName = 'resource';
constructor(protected resourceProvider: AddonModResourceProvider, private courseProvider: CoreCourseProvider,
protected mimetypeUtils: CoreMimetypeUtilsProvider, private resourceHelper: AddonModResourceHelperProvider) { }

View File

@ -23,7 +23,8 @@ import { CoreFilepoolProvider } from '@providers/filepool';
*/
@Injectable()
export class AddonModResourcePrefetchHandler extends CoreCourseModulePrefetchHandlerBase {
name = 'resource';
name = 'AddonModResource';
modName = 'resource';
component = AddonModResourceProvider.COMPONENT;
isResource = true;

View File

@ -15,7 +15,6 @@
import { Injectable } from '@angular/core';
import { CoreContentLinksModuleIndexHandler } from '@core/contentlinks/classes/module-index-handler';
import { CoreCourseHelperProvider } from '@core/course/providers/helper';
import { AddonModSurveyProvider } from './survey';
/**
* Handler to treat links to survey.
@ -25,6 +24,6 @@ export class AddonModSurveyLinkHandler extends CoreContentLinksModuleIndexHandle
name = 'AddonModSurveyLinkHandler';
constructor(courseHelper: CoreCourseHelperProvider) {
super(courseHelper, AddonModSurveyProvider.COMPONENT, 'survey');
super(courseHelper, 'AddonModSurvey', 'survey');
}
}

View File

@ -23,7 +23,8 @@ import { CoreCourseProvider } from '@core/course/providers/course';
*/
@Injectable()
export class AddonModSurveyModuleHandler implements CoreCourseModuleHandler {
name = 'survey';
name = 'AddonModSurvey';
modName = 'survey';
constructor(private courseProvider: CoreCourseProvider) { }

View File

@ -22,7 +22,8 @@ import { AddonModSurveyHelperProvider } from './helper';
*/
@Injectable()
export class AddonModSurveyPrefetchHandler extends CoreCourseModulePrefetchHandlerBase {
name = 'survey';
name = 'AddonModSurvey';
modName = 'survey';
component = AddonModSurveyProvider.COMPONENT;
updatesNames = /^configuration$|^.*files$|^answers$/;

View File

@ -15,7 +15,6 @@
import { Injectable } from '@angular/core';
import { CoreContentLinksModuleIndexHandler } from '@core/contentlinks/classes/module-index-handler';
import { CoreCourseHelperProvider } from '@core/course/providers/helper';
import { AddonModUrlProvider } from './url';
/**
* Handler to treat links to url.
@ -25,6 +24,6 @@ export class AddonModUrlLinkHandler extends CoreContentLinksModuleIndexHandler {
name = 'AddonModUrlLinkHandler';
constructor(courseHelper: CoreCourseHelperProvider) {
super(courseHelper, AddonModUrlProvider.COMPONENT, 'url');
super(courseHelper, 'AddonModUrl', 'url');
}
}

View File

@ -25,7 +25,8 @@ import { AddonModUrlHelperProvider } from './helper';
*/
@Injectable()
export class AddonModUrlModuleHandler implements CoreCourseModuleHandler {
name = 'url';
name = 'AddonModUrl';
modName = 'url';
constructor(private courseProvider: CoreCourseProvider, private urlProvider: AddonModUrlProvider,
private urlHelper: AddonModUrlHelperProvider) { }

View File

@ -25,7 +25,7 @@ import { AddonNotesProvider } from './notes';
*/
@Injectable()
export class AddonNotesUserHandler implements CoreUserProfileHandler {
name = 'AddonNotes';
name = 'AddonNotes:addNote';
priority = 200;
type = CoreUserDelegate.TYPE_COMMUNICATION;
addNoteEnabledCache = {};
@ -65,8 +65,8 @@ export class AddonNotesUserHandler implements CoreUserProfileHandler {
*
* @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.
* @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<boolean>} Promise resolved with true if enabled, resolved with false otherwise.
*/
isEnabledForUser(user: any, courseId: number, navOptions?: any, admOptions?: any): boolean | Promise<boolean> {

View File

@ -21,7 +21,8 @@ import { AddonUserProfileFieldCheckboxComponent } from '../component/checkbox';
*/
@Injectable()
export class AddonUserProfileFieldCheckboxHandler implements CoreUserProfileFieldHandler {
name = 'checkbox';
name = 'AddonUserProfileFieldCheckbox';
type = 'checkbox';
constructor() {
// Nothing to do.

View File

@ -21,7 +21,8 @@ import { AddonUserProfileFieldDatetimeComponent } from '../component/datetime';
*/
@Injectable()
export class AddonUserProfileFieldDatetimeHandler implements CoreUserProfileFieldHandler {
name = 'datetime';
name = 'AddonUserProfileFieldDatetime';
type = 'datetime';
constructor() {
// Nothing to do.

View File

@ -21,7 +21,8 @@ import { AddonUserProfileFieldMenuComponent } from '../component/menu';
*/
@Injectable()
export class AddonUserProfileFieldMenuHandler implements CoreUserProfileFieldHandler {
name = 'menu';
name = 'AddonUserProfileFieldMenu';
type = 'menu';
constructor() {
// Nothing to do.

View File

@ -22,7 +22,8 @@ import { CoreTextUtilsProvider } from '@providers/utils/text';
*/
@Injectable()
export class AddonUserProfileFieldTextHandler implements CoreUserProfileFieldHandler {
name = 'text';
name = 'AddonUserProfileFieldText';
type = 'text';
constructor(private textUtils: CoreTextUtilsProvider) { }

View File

@ -22,7 +22,8 @@ import { CoreTextUtilsProvider } from '@providers/utils/text';
*/
@Injectable()
export class AddonUserProfileFieldTextareaHandler implements CoreUserProfileFieldHandler {
name = 'textarea';
name = 'AddonUserProfileFieldTextarea';
type = 'textarea';
constructor(private textUtils: CoreTextUtilsProvider) { }

View File

@ -20,6 +20,7 @@ import { CoreEventsProvider } from '@providers/events';
export interface CoreDelegateHandler {
/**
* Name of the handler, or name and sub context (AddonMessages, AddonMessages:blockContact, ...).
* This name will be used to check if the feature is disabled.
* @type {string}
*/
name: string;
@ -74,6 +75,14 @@ export class CoreDelegate {
*/
protected featurePrefix: string;
/**
* Name of the property to be used to index the handlers. By default, the handler's name will be used.
* If your delegate uses a Moodle component name to identify the handlers, please override this property.
* E.g. CoreCourseModuleDelegate uses 'modName' to index the handlers.
* @type {string}
*/
protected handlerNameProperty = 'name';
/**
* Constructor of the Delegate.
*
@ -182,14 +191,14 @@ export class CoreDelegate {
* @return {boolean} True when registered, false if already registered.
*/
registerHandler(handler: CoreDelegateHandler): boolean {
if (typeof this.handlers[handler.name] !== 'undefined') {
this.logger.log(`Addon '${handler.name}' already registered`);
if (typeof this.handlers[handler[this.handlerNameProperty]] !== 'undefined') {
this.logger.log(`Handler '${handler[this.handlerNameProperty]}' already registered`);
return false;
}
this.logger.log(`Registered addon '${handler.name}'`);
this.handlers[handler.name] = handler;
this.logger.log(`Registered handler '${handler[this.handlerNameProperty]}'`);
this.handlers[handler[this.handlerNameProperty]] = handler;
return true;
}
@ -222,9 +231,9 @@ export class CoreDelegate {
// Check that site hasn't changed since the check started.
if (this.isLastUpdateCall(time) && this.sitesProvider.getCurrentSiteId() === siteId) {
if (enabled) {
this.enabledHandlers[handler.name] = handler;
this.enabledHandlers[handler[this.handlerNameProperty]] = handler;
} else {
delete this.enabledHandlers[handler.name];
delete this.enabledHandlers[handler[this.handlerNameProperty]];
}
}
});

View File

@ -146,18 +146,18 @@ export interface LocalMobileResponse {
*/
export class CoreSite {
// List of injected services. This class isn't injectable, so it cannot use DI.
protected appProvider;
protected dbProvider;
protected domUtils;
protected eventsProvider;
protected fileProvider;
protected http;
protected textUtils;
protected timeUtils;
protected translate;
protected utils;
protected urlUtils;
protected wsProvider;
protected appProvider: CoreAppProvider;
protected dbProvider: CoreDbProvider;
protected domUtils: CoreDomUtilsProvider;
protected eventsProvider: CoreEventsProvider;
protected fileProvider: CoreFileProvider;
protected http: HttpClient;
protected textUtils: CoreTextUtilsProvider;
protected timeUtils: CoreTimeUtilsProvider;
protected translate: TranslateService;
protected utils: CoreUtilsProvider;
protected urlUtils: CoreUrlUtilsProvider;
protected wsProvider: CoreWSProvider;
// Variables for the database.
protected WS_CACHE_TABLE = 'wscache';
@ -184,18 +184,20 @@ export class CoreSite {
]
};
// Rest of variables.
protected logger;
protected db: SQLiteDB;
protected cleanUnicode = false;
protected lastAutoLogin = 0;
protected moodleReleases = {
// Versions of Moodle releases.
protected MOODLE_RELEASES = {
3.1: 2016052300,
3.2: 2016120500,
3.3: 2017051503,
3.4: 2017111300
};
// Rest of variables.
protected logger;
protected db: SQLiteDB;
protected cleanUnicode = false;
protected lastAutoLogin = 0;
/**
* Create a site.
*
@ -366,6 +368,7 @@ export class CoreSite {
* @param {any} Config.
*/
setConfig(config: any): void {
config.tool_mobile_disabledfeatures = this.textUtils.treatDisabledFeatures(config.tool_mobile_disabledfeatures);
this.config = config;
}
@ -935,7 +938,7 @@ export class CoreSite {
const siteFolder = this.fileProvider.getSiteFolder(this.id);
return this.fileProvider.removeDir(siteFolder).catch(() => {
// Ignore any errors, $mmFS.removeDir fails if folder doesn't exists.
// Ignore any errors, CoreFileProvider.removeDir fails if folder doesn't exists.
});
} else {
return Promise.resolve();
@ -1133,9 +1136,9 @@ export class CoreSite {
* @param {string} url The URL to open.
* @param {any} [options] Override default options passed to InAppBrowser.
* @param {string} [alertMessage] If defined, an alert will be shown before opening the inappbrowser.
* @return {Promise<InAppBrowserObject>} Promise resolved when done.
* @return {Promise<InAppBrowserObject|void>} Promise resolved when done.
*/
openInAppWithAutoLogin(url: string, options?: any, alertMessage?: string): Promise<InAppBrowserObject> {
openInAppWithAutoLogin(url: string, options?: any, alertMessage?: string): Promise<InAppBrowserObject | void> {
return this.openWithAutoLogin(true, url, options, alertMessage);
}
@ -1145,9 +1148,9 @@ export class CoreSite {
* @param {string} url The URL to open.
* @param {object} [options] Override default options passed to inappbrowser.
* @param {string} [alertMessage] If defined, an alert will be shown before opening the inappbrowser.
* @return {Promise<InAppBrowserObject>} Promise resolved when done.
* @return {Promise<InAppBrowserObject|void>} Promise resolved when done.
*/
openInAppWithAutoLoginIfSameSite(url: string, options?: any, alertMessage?: string): Promise<InAppBrowserObject> {
openInAppWithAutoLoginIfSameSite(url: string, options?: any, alertMessage?: string): Promise<InAppBrowserObject | void> {
return this.openWithAutoLoginIfSameSite(true, url, options, alertMessage);
}
@ -1158,12 +1161,12 @@ export class CoreSite {
* @param {string} url The URL to open.
* @param {object} [options] Override default options passed to $cordovaInAppBrowser#open.
* @param {string} [alertMessage] If defined, an alert will be shown before opening the browser/inappbrowser.
* @return {Promise<InAppBrowserObject>} Promise resolved when done. Resolve param is returned only if inApp=true.
* @return {Promise<InAppBrowserObject|void>} Promise resolved when done. Resolve param is returned only if inApp=true.
*/
openWithAutoLogin(inApp: boolean, url: string, options?: any, alertMessage?: string): Promise<InAppBrowserObject> {
openWithAutoLogin(inApp: boolean, url: string, options?: any, alertMessage?: string): Promise<InAppBrowserObject | void> {
// Convenience function to open the URL.
const open = (url): Promise<any> => {
return new Promise<InAppBrowserObject>((resolve, reject): void => {
return new Promise<InAppBrowserObject | void>((resolve, reject): void => {
if (modal) {
modal.dismiss();
}
@ -1223,9 +1226,10 @@ export class CoreSite {
* @param {string} url The URL to open.
* @param {object} [options] Override default options passed to inappbrowser.
* @param {string} [alertMessage] If defined, an alert will be shown before opening the browser/inappbrowser.
* @return {Promise<InAppBrowserObject>} Promise resolved when done. Resolve param is returned only if inApp=true.
* @return {Promise<InAppBrowserObject|void>} Promise resolved when done. Resolve param is returned only if inApp=true.
*/
openWithAutoLoginIfSameSite(inApp: boolean, url: string, options?: any, alertMessage?: string): Promise<InAppBrowserObject> {
openWithAutoLoginIfSameSite(inApp: boolean, url: string, options?: any, alertMessage?: string)
: Promise<InAppBrowserObject | void> {
if (this.containsUrl(url)) {
return this.openWithAutoLogin(inApp, url, options, alertMessage);
} else {
@ -1396,12 +1400,12 @@ export class CoreSite {
return 0;
}
if (typeof this.moodleReleases[data.major] == 'undefined') {
if (typeof this.MOODLE_RELEASES[data.major] == 'undefined') {
// Major version not found. Use the last one.
data.major = Object.keys(this.moodleReleases).slice(-1);
data.major = Object.keys(this.MOODLE_RELEASES).slice(-1);
}
return this.moodleReleases[data.major] + data.minor;
return this.MOODLE_RELEASES[data.major] + data.minor;
}
/**
@ -1431,7 +1435,7 @@ export class CoreSite {
*/
protected getNextMajorVersionNumber(version: string): number {
const data = this.getMajorAndMinor(version),
releases = Object.keys(this.moodleReleases);
releases = Object.keys(this.MOODLE_RELEASES);
let position;
if (!data) {
@ -1443,9 +1447,9 @@ export class CoreSite {
if (position == -1 || position == releases.length - 1) {
// Major version not found or it's the last one. Use the last one.
return this.moodleReleases[releases[position]];
return this.MOODLE_RELEASES[releases[position]];
}
return this.moodleReleases[releases[position + 1]];
return this.MOODLE_RELEASES[releases[position + 1]];
}
}

View File

@ -45,7 +45,7 @@ export class CoreContentLinksModuleGradeHandler extends CoreContentLinksHandlerB
// Match the grade.php URL with an id param.
this.pattern = new RegExp('\/mod\/' + modName + '\/grade\.php.*([\&\?]id=\\d+)');
this.featureName = '$mmCourseDelegate_' + addon;
this.featureName = 'CoreCourseModuleDelegate_' + addon;
}
/**

View File

@ -33,7 +33,7 @@ export class CoreContentLinksModuleIndexHandler extends CoreContentLinksHandlerB
// Match the view.php URL with an id param.
this.pattern = new RegExp('\/mod\/' + modName + '\/view\.php.*([\&\?]id=\\d+)');
this.featureName = '$mmCourseDelegate_' + addon;
this.featureName = 'CoreCourseModuleDelegate_' + addon;
}
/**

View File

@ -53,11 +53,17 @@ export type prefetchFunction = (module: any, courseId: number, single: boolean,
* recommended to call the prefetchPackage function since it'll handle changing the status of the module.
*/
export class CoreCourseModulePrefetchHandlerBase implements CoreCourseModulePrefetchHandler {
/**
* Name of the handler.
* @type {string}
*/
name = 'CoreCourseModulePrefetchHandler';
/**
* Name of the module. It should match the "modname" of the module returned in core_course_get_contents.
* @type {string}
*/
name = '';
modName = 'default';
/**
* The handler's component.

View File

@ -20,6 +20,7 @@ import { CoreCourseModuleDelegate } from './providers/module-delegate';
import { CoreCourseModulePrefetchDelegate } from './providers/module-prefetch-delegate';
import { CoreCourseOptionsDelegate } from './providers/options-delegate';
import { CoreCourseFormatDefaultHandler } from './providers/default-format';
import { CoreCourseModuleDefaultHandler } from './providers/default-module';
import { CoreCourseFormatSingleActivityModule } from './formats/singleactivity/singleactivity.module';
import { CoreCourseFormatSocialModule } from './formats/social/social.module';
import { CoreCourseFormatTopicsModule } from './formats/topics/topics.module';
@ -44,7 +45,8 @@ export const CORE_COURSE_PROVIDERS: any[] = [
CoreCourseFormatSocialModule
],
providers: CORE_COURSE_PROVIDERS.concat([
CoreCourseFormatDefaultHandler
CoreCourseFormatDefaultHandler,
CoreCourseModuleDefaultHandler
]),
exports: []
})

View File

@ -21,7 +21,8 @@ import { CoreCourseFormatSingleActivityComponent } from '../components/singleact
*/
@Injectable()
export class CoreCourseFormatSingleActivityHandler implements CoreCourseFormatHandler {
name = 'singleactivity';
name = 'CoreCourseFormatSingleActivity';
format = 'singleactivity';
constructor() {
// Nothing to do.

View File

@ -21,5 +21,6 @@ import { CoreCourseFormatSingleActivityHandler } from '../../singleactivity/prov
*/
@Injectable()
export class CoreCourseFormatSocialHandler extends CoreCourseFormatSingleActivityHandler {
name = 'social';
name = 'CoreCourseFormatSocial';
format = 'social';
}

View File

@ -20,7 +20,8 @@ import { CoreCourseFormatHandler } from '../../../providers/format-delegate';
*/
@Injectable()
export class CoreCourseFormatTopicsHandler implements CoreCourseFormatHandler {
name = 'topics';
name = 'CoreCourseFormatTopics';
format = 'topics';
constructor() {
// Nothing to do.

View File

@ -22,7 +22,8 @@ import { CoreConstants } from '../../../../constants';
*/
@Injectable()
export class CoreCourseFormatWeeksHandler implements CoreCourseFormatHandler {
name = 'weeks';
name = 'CoreCourseFormatWeeks';
format = 'weeks';
constructor(private timeUtils: CoreTimeUtilsProvider) { }

View File

@ -23,7 +23,8 @@ import { CoreCourseProvider } from './course';
*/
@Injectable()
export class CoreCourseFormatDefaultHandler implements CoreCourseFormatHandler {
name = 'default';
name = 'CoreCourseFormatDefault';
format = 'default';
constructor(private coursesProvider: CoreCoursesProvider) { }

View File

@ -0,0 +1,92 @@
// (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, Injector } from '@angular/core';
import { NavController, NavOptions } from 'ionic-angular';
import { CoreSitesProvider } from '@providers/sites';
import { CoreCourseModuleHandler, CoreCourseModuleHandlerData } from './module-delegate';
import { CoreCourseProvider } from './course';
/**
* Default handler used when the module doesn't have a specific implementation.
*/
@Injectable()
export class CoreCourseModuleDefaultHandler implements CoreCourseModuleHandler {
name = 'CoreCourseModuleDefault';
modName = 'default';
constructor(private sitesProvider: CoreSitesProvider, private courseProvider: CoreCourseProvider) { }
/**
* Whether or not the handler is enabled on a site level.
*
* @return {boolean|Promise<boolean>} True or promise resolved with true if enabled.
*/
isEnabled(): boolean | Promise<boolean> {
return true;
}
/**
* Get the data required to display the module in the course contents view.
*
* @param {any} module The module object.
* @param {number} courseId The course ID.
* @param {number} sectionId The section ID.
* @return {CoreCourseModuleHandlerData} Data to render the module.
*/
getData(module: any, courseId: number, sectionId: number): CoreCourseModuleHandlerData {
// Return the default data.
const defaultData: CoreCourseModuleHandlerData = {
icon: this.courseProvider.getModuleIconSrc(module.modname),
title: module.name,
class: 'core-course-default-handler core-course-module-' + module.modname + '-handler',
action: (event: Event, navCtrl: NavController, module: any, courseId: number, options?: NavOptions): void => {
event.preventDefault();
event.stopPropagation();
navCtrl.push('CoreCourseUnsupportedModulePage', { module: module }, options);
}
};
if (module.url) {
defaultData.buttons = [{
icon: 'open',
label: 'core.openinbrowser',
action: (e: Event): void => {
e.preventDefault();
e.stopPropagation();
this.sitesProvider.getCurrentSite().openInBrowserWithAutoLoginIfSameSite(module.url);
}
}];
}
return defaultData;
}
/**
* Get the component to render the module. This is needed to support singleactivity course format.
* The component returned must implement CoreCourseModuleMainComponent.
* It's recommended to return the class of the component, but you can also return an instance of the component.
*
* @param {Injector} injector Injector.
* @param {any} course The course object.
* @param {any} module The module object.
* @return {any|Promise<any>} The component (or promise resolved with component) to use, undefined if not found.
*/
getMainComponent(injector: Injector, course: any, module: any): any | Promise<any> {
// We can't inject CoreCourseUnsupportedModuleComponent here due to circular dependencies.
// Don't return anything, by default it will use CoreCourseUnsupportedModuleComponent.
}
}

View File

@ -25,6 +25,12 @@ import { CoreDelegate, CoreDelegateHandler } from '@classes/delegate';
* Interface that all course format handlers must implement.
*/
export interface CoreCourseFormatHandler extends CoreDelegateHandler {
/**
* Name of the format the handler supports. E.g. 'singleactivity'.
* @type {string}
*/
format: string;
/**
* Get the title to use in course page. If not defined, course fullname.
* This function will be called without sections first, and then call it again when the sections are retrieved.
@ -149,9 +155,8 @@ export interface CoreCourseFormatHandler extends CoreDelegateHandler {
*/
@Injectable()
export class CoreCourseFormatDelegate extends CoreDelegate {
protected handlers: { [s: string]: CoreCourseFormatHandler } = {}; // All registered handlers.
protected enabledHandlers: { [s: string]: CoreCourseFormatHandler } = {}; // Handlers enabled for the current site.
protected featurePrefix = 'CoreCourseFormatHandler_';
protected featurePrefix = 'CoreCourseFormatDelegate_';
protected handlerNameProperty = 'format';
constructor(loggerProvider: CoreLoggerProvider, protected sitesProvider: CoreSitesProvider, eventsProvider: CoreEventsProvider,
protected defaultHandler: CoreCourseFormatDefaultHandler) {
@ -165,7 +170,7 @@ export class CoreCourseFormatDelegate extends CoreDelegate {
* @return {boolean} Whether it allows seeing all sections at the same time.
*/
canViewAllSections(course: any): boolean {
return this.executeFunction(course.format, 'canViewAllSections', [course]);
return this.executeFunctionOnEnabled(course.format, 'canViewAllSections', [course]);
}
/**
@ -175,7 +180,7 @@ export class CoreCourseFormatDelegate extends CoreDelegate {
* @return {boolean} Whether the option to enable section/module download should be displayed
*/
displayEnableDownload(course: any): boolean {
return this.executeFunction(course.format, 'displayEnableDownload', [course]);
return this.executeFunctionOnEnabled(course.format, 'displayEnableDownload', [course]);
}
/**
@ -185,25 +190,7 @@ export class CoreCourseFormatDelegate extends CoreDelegate {
* @return {boolean} Whether the section selector should be displayed.
*/
displaySectionSelector(course: any): boolean {
return this.executeFunction(course.format, 'displaySectionSelector', [course]);
}
/**
* Execute a certain function in a course format handler.
* If the handler isn't found or function isn't defined, call the same function in the default handler.
*
* @param {string} format The format name.
* @param {string} fnName Name of the function to execute.
* @param {any[]} params Parameters to pass to the function.
* @return {any} Function returned value or default value.
*/
protected executeFunction(format: string, fnName: string, params?: any[]): any {
const handler = this.enabledHandlers[format];
if (handler && handler[fnName]) {
return handler[fnName].apply(handler, params);
} else if (this.defaultHandler[fnName]) {
return this.defaultHandler[fnName].apply(this.defaultHandler, params);
}
return this.executeFunctionOnEnabled(course.format, 'displaySectionSelector', [course]);
}
/**
@ -214,7 +201,8 @@ export class CoreCourseFormatDelegate extends CoreDelegate {
* @return {Promise<any>} Promise resolved with component to use, undefined if not found.
*/
getAllSectionsComponent(injector: Injector, course: any): Promise<any> {
return Promise.resolve(this.executeFunction(course.format, 'getAllSectionsComponent', [injector, course])).catch((e) => {
return Promise.resolve(this.executeFunctionOnEnabled(course.format, 'getAllSectionsComponent', [injector, course]))
.catch((e) => {
this.logger.error('Error getting all sections component', e);
});
}
@ -227,7 +215,8 @@ export class CoreCourseFormatDelegate extends CoreDelegate {
* @return {Promise<any>} Promise resolved with component to use, undefined if not found.
*/
getCourseFormatComponent(injector: Injector, course: any): Promise<any> {
return Promise.resolve(this.executeFunction(course.format, 'getCourseFormatComponent', [injector, course])).catch((e) => {
return Promise.resolve(this.executeFunctionOnEnabled(course.format, 'getCourseFormatComponent', [injector, course]))
.catch((e) => {
this.logger.error('Error getting course format component', e);
});
}
@ -240,7 +229,8 @@ export class CoreCourseFormatDelegate extends CoreDelegate {
* @return {Promise<any>} Promise resolved with component to use, undefined if not found.
*/
getCourseSummaryComponent(injector: Injector, course: any): Promise<any> {
return Promise.resolve(this.executeFunction(course.format, 'getCourseSummaryComponent', [injector, course])).catch((e) => {
return Promise.resolve(this.executeFunctionOnEnabled(course.format, 'getCourseSummaryComponent', [injector, course]))
.catch((e) => {
this.logger.error('Error getting course summary component', e);
});
}
@ -253,7 +243,7 @@ export class CoreCourseFormatDelegate extends CoreDelegate {
* @return {string} Course title.
*/
getCourseTitle(course: any, sections?: any[]): string {
return this.executeFunction(course.format, 'getCourseTitle', [course, sections]);
return this.executeFunctionOnEnabled(course.format, 'getCourseTitle', [course, sections]);
}
/**
@ -265,7 +255,7 @@ export class CoreCourseFormatDelegate extends CoreDelegate {
*/
getCurrentSection(course: any, sections: any[]): Promise<any> {
// Convert the result to a Promise if it isn't.
return Promise.resolve(this.executeFunction(course.format, 'getCurrentSection', [course, sections])).catch(() => {
return Promise.resolve(this.executeFunctionOnEnabled(course.format, 'getCurrentSection', [course, sections])).catch(() => {
// This function should never fail. Just return the first section.
if (sections[0].id != CoreCourseProvider.ALL_SECTIONS_ID) {
return sections[0];
@ -283,7 +273,7 @@ export class CoreCourseFormatDelegate extends CoreDelegate {
* @return {Promise<any>} Promise resolved with component to use, undefined if not found.
*/
getSectionSelectorComponent(injector: Injector, course: any): Promise<any> {
return Promise.resolve(this.executeFunction(course.format, 'getSectionSelectorComponent', [injector, course]))
return Promise.resolve(this.executeFunctionOnEnabled(course.format, 'getSectionSelectorComponent', [injector, course]))
.catch((e) => {
this.logger.error('Error getting section selector component', e);
});
@ -298,7 +288,8 @@ export class CoreCourseFormatDelegate extends CoreDelegate {
* @return {Promise<any>} Promise resolved with component to use, undefined if not found.
*/
getSingleSectionComponent(injector: Injector, course: any): Promise<any> {
return Promise.resolve(this.executeFunction(course.format, 'getSingleSectionComponent', [injector, course])).catch((e) => {
return Promise.resolve(this.executeFunctionOnEnabled(course.format, 'getSingleSectionComponent', [injector, course]))
.catch((e) => {
this.logger.error('Error getting single section component', e);
});
}
@ -311,7 +302,7 @@ export class CoreCourseFormatDelegate extends CoreDelegate {
* @return {Promise<any>} Promise resolved when the data is invalidated.
*/
invalidateData(course: any, sections: any[]): Promise<any> {
return this.executeFunction(course.format, 'invalidateData', [course, sections]);
return this.executeFunctionOnEnabled(course.format, 'invalidateData', [course, sections]);
}
/**
@ -322,10 +313,6 @@ export class CoreCourseFormatDelegate extends CoreDelegate {
* @return {Promise<any>} Promise resolved when done.
*/
openCourse(navCtrl: NavController, course: any): Promise<any> {
if (this.enabledHandlers[course.format] && this.enabledHandlers[course.format].openCourse) {
return this.enabledHandlers[course.format].openCourse(navCtrl, course);
}
return navCtrl.push('CoreCourseSectionPage', { course: course });
return this.executeFunctionOnEnabled(course.format, 'openCourse', [navCtrl, course]);
}
}

View File

@ -758,11 +758,8 @@ export class CoreCourseHelperProvider {
/**
* Get a course status icon from status.
*
* @module mm.core.course
* @ngdoc method
* @name $mmCourseHelper#getCourseStatusIconFromStatus
* @param {String} status Course status.
* @return {String} Icon name.
* @param {string} status Course status.
* @return {string} Icon name.
*/
getCourseStatusIconFromStatus(status: string): string {
if (status == CoreConstants.DOWNLOADED) {

View File

@ -19,12 +19,19 @@ import { CoreLoggerProvider } from '@providers/logger';
import { CoreSitesProvider } from '@providers/sites';
import { CoreCourseProvider } from './course';
import { CoreSite } from '@classes/site';
import { CoreCourseModuleDefaultHandler } from './default-module';
import { CoreDelegate, CoreDelegateHandler } from '@classes/delegate';
/**
* Interface that all course module handlers must implement.
*/
export interface CoreCourseModuleHandler extends CoreDelegateHandler {
/**
* Name of the module. It should match the "modname" of the module returned in core_course_get_contents.
* @type {string}
*/
modName: string;
/**
* Get the data required to display the module in the course contents view.
*
@ -166,12 +173,11 @@ export interface CoreCourseModuleHandlerButton {
*/
@Injectable()
export class CoreCourseModuleDelegate extends CoreDelegate {
protected handlers: { [s: string]: CoreCourseModuleHandler } = {}; // All registered handlers.
protected enabledHandlers: { [s: string]: CoreCourseModuleHandler } = {}; // Handlers enabled for the current site.
protected featurePrefix = '$mmCourseDelegate_';
protected featurePrefix = 'CoreCourseModuleDelegate_';
protected handlerNameProperty = 'modName';
constructor(loggerProvider: CoreLoggerProvider, protected sitesProvider: CoreSitesProvider, eventsProvider: CoreEventsProvider,
protected courseProvider: CoreCourseProvider) {
protected courseProvider: CoreCourseProvider, protected defaultHandler: CoreCourseModuleDefaultHandler) {
super('CoreCourseModuleDelegate', loggerProvider, sitesProvider, eventsProvider);
}
@ -184,12 +190,10 @@ export class CoreCourseModuleDelegate extends CoreDelegate {
* @return {Promise<any>} Promise resolved with component to use, undefined if not found.
*/
getMainComponent(injector: Injector, course: any, module: any): Promise<any> {
const handler = this.enabledHandlers[module.modname];
if (handler && handler.getMainComponent) {
return Promise.resolve(handler.getMainComponent(injector, course, module)).catch((err) => {
this.logger.error('Error getting main component', err);
});
}
return Promise.resolve(this.executeFunctionOnEnabled(module.modname, 'getMainComponent', [injector, course, module]))
.catch((err) => {
this.logger.error('Error getting main component', err);
});
}
/**
@ -202,36 +206,7 @@ export class CoreCourseModuleDelegate extends CoreDelegate {
* @return {CoreCourseModuleHandlerData} Data to render the module.
*/
getModuleDataFor(modname: string, module: any, courseId: number, sectionId: number): CoreCourseModuleHandlerData {
if (typeof this.enabledHandlers[modname] != 'undefined') {
return this.enabledHandlers[modname].getData(module, courseId, sectionId);
}
// Return the default data.
const defaultData: CoreCourseModuleHandlerData = {
icon: this.courseProvider.getModuleIconSrc(module.modname),
title: module.name,
class: 'core-course-default-handler core-course-module-' + module.modname + '-handler',
action: (event: Event, navCtrl: NavController, module: any, courseId: number, options?: NavOptions): void => {
event.preventDefault();
event.stopPropagation();
navCtrl.push('CoreCourseUnsupportedModulePage', { module: module }, options);
}
};
if (module.url) {
defaultData.buttons = [{
icon: 'open',
label: 'core.openinbrowser',
action: (e: Event): void => {
e.preventDefault();
e.stopPropagation();
this.sitesProvider.getCurrentSite().openInBrowserWithAutoLoginIfSameSite(module.url);
}
}];
}
return defaultData;
return this.executeFunctionOnEnabled(modname, 'getData', [module, courseId, sectionId]);
}
/**
@ -255,10 +230,12 @@ export class CoreCourseModuleDelegate extends CoreDelegate {
* @return {boolean} Whether module is disabled.
*/
isModuleDisabledInSite(modname: string, site?: CoreSite): boolean {
if (typeof this.handlers[modname] != 'undefined') {
const handler = this.getHandler(modname, true);
if (handler) {
site = site || this.sitesProvider.getCurrentSite();
return this.isFeatureDisabled(this.handlers[modname], site);
return this.isFeatureDisabled(handler, site);
}
return false;

View File

@ -56,6 +56,12 @@ export type CoreCourseModulesProgressFunction = (data: CoreCourseModulesProgress
* Interface that all course prefetch handlers must implement.
*/
export interface CoreCourseModulePrefetchHandler extends CoreDelegateHandler {
/**
* Name of the module. It should match the "modname" of the module returned in core_course_get_contents.
* @type {string}
*/
modName: string;
/**
* The handler's component.
* @type {string}
@ -214,6 +220,7 @@ export class CoreCourseModulePrefetchDelegate extends CoreDelegate {
protected ROOT_CACHE_KEY = 'mmCourse:';
protected statusCache = new CoreCache();
protected handlerNameProperty = 'modName';
// Promises for check updates, to prevent performing the same request twice at the same time.
protected courseUpdatesPromises: { [s: string]: { [s: string]: Promise<any> } } = {};

View File

@ -129,8 +129,6 @@ export interface CoreCourseOptionsHandlerToDisplay {
*/
@Injectable()
export class CoreCourseOptionsDelegate extends CoreDelegate {
protected handlers: { [s: string]: CoreCourseOptionsHandler } = {}; // All registered handlers.
protected enabledHandlers: { [s: string]: CoreCourseOptionsHandler } = {}; // Handlers enabled for the current site.
protected loaded: { [courseId: number]: boolean } = {};
protected lastUpdateHandlersForCoursesStart: any = {};
protected coursesHandlers: {
@ -139,7 +137,7 @@ export class CoreCourseOptionsDelegate extends CoreDelegate {
}
} = {};
protected featurePrefix = '$mmCoursesDelegate_';
protected featurePrefix = 'CoreCourseOptionsDelegate_';
constructor(loggerProvider: CoreLoggerProvider, protected sitesProvider: CoreSitesProvider, private utils: CoreUtilsProvider,
protected eventsProvider: CoreEventsProvider, private coursesProvider: CoreCoursesProvider) {
@ -440,7 +438,7 @@ export class CoreCourseOptionsDelegate extends CoreDelegate {
this.lastUpdateHandlersForCoursesStart[courseId] = now;
for (const name in this.enabledHandlers) {
const handler = this.enabledHandlers[name];
const handler = <CoreCourseOptionsHandler> this.enabledHandlers[name];
// Checks if the handler is enabled for the user.
promises.push(Promise.resolve(handler.isEnabledForCourse(courseId, accessData, navOptions, admOptions))

View File

@ -24,7 +24,7 @@ import { CoreCoursesProvider } from './courses';
@Injectable()
export class CoreCoursesIndexLinkHandler extends CoreContentLinksHandlerBase {
name = 'CoreCoursesIndexLinkHandler';
featureName = '$mmSideMenuDelegate_mmCourses';
featureName = 'CoreMainMenuDelegate_CoreCourses';
pattern = /\/course\/?(index\.php.*)?$/;
constructor(private coursesProvider: CoreCoursesProvider, private loginHelper: CoreLoginHelperProvider) {

View File

@ -141,7 +141,7 @@ export class CoreCoursesProvider {
isMyCoursesDisabledInSite(site?: CoreSite): boolean {
site = site || this.sitesProvider.getCurrentSite();
return site.isFeatureDisabled('$mmSideMenuDelegate_mmCourses');
return site.isFeatureDisabled('CoreMainMenuDelegate_CoreCourses');
}
/**
@ -165,7 +165,7 @@ export class CoreCoursesProvider {
isSearchCoursesDisabledInSite(site?: CoreSite): boolean {
site = site || this.sitesProvider.getCurrentSite();
return site.isFeatureDisabled('$mmCoursesDelegate_search');
return site.isFeatureDisabled('CoreCourseOptionsDelegate_search');
}
/**

View File

@ -23,7 +23,7 @@ import { CoreLoginHelperProvider } from '@core/login/providers/helper';
@Injectable()
export class CoreCoursesMyOverviewLinkHandler extends CoreContentLinksHandlerBase {
name = 'CoreCoursesMyOverviewLinkHandler';
featureName = '$mmSideMenuDelegate_mmCourses';
featureName = 'CoreMainMenuDelegate_CoreCourses';
pattern = /\/my\/?$/;
constructor(private loginHelper: CoreLoginHelperProvider) {

View File

@ -231,7 +231,7 @@ export class CoreCoursesMyOverviewProvider {
isDisabledInSite(site?: CoreSite): boolean {
site = site || this.sitesProvider.getCurrentSite();
return site.isFeatureDisabled('$mmSideMenuDelegate_mmaMyOverview');
return site.isFeatureDisabled('CoreMainMenuDelegate_CoreCourses');
}
/**

View File

@ -146,9 +146,6 @@ export interface CoreFileUploaderHandlerDataToReturn extends CoreFileUploaderHan
*/
@Injectable()
export class CoreFileUploaderDelegate extends CoreDelegate {
protected handlers: { [s: string]: CoreFileUploaderHandler } = {}; // All registered handlers.
protected enabledHandlers: { [s: string]: CoreFileUploaderHandler } = {}; // Handlers enabled for the current site.
constructor(loggerProvider: CoreLoggerProvider, protected sitesProvider: CoreSitesProvider,
protected eventsProvider: CoreEventsProvider) {
super('CoreFileUploaderDelegate', loggerProvider, sitesProvider, eventsProvider);
@ -173,7 +170,7 @@ export class CoreFileUploaderDelegate extends CoreDelegate {
const handlers = [];
for (const name in this.enabledHandlers) {
const handler = this.enabledHandlers[name];
const handler = <CoreFileUploaderHandler> this.enabledHandlers[name];
let supportedMimetypes;
if (mimetypes) {

View File

@ -23,7 +23,7 @@ import { CoreGradesProvider } from './grades';
*/
@Injectable()
export class CoreGradesUserHandler implements CoreUserProfileHandler {
name = 'mmGrades';
name = 'CoreGrades:viewGrades';
priority = 400;
type = CoreUserDelegate.TYPE_NEW_PAGE;
viewGradesEnabledCache = {};
@ -71,8 +71,8 @@ export class CoreGradesUserHandler implements CoreUserProfileHandler {
*
* @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.
* @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<boolean>} Promise resolved with true if enabled, resolved with false otherwise.
*/
isEnabledForUser(user: any, courseId: number, navOptions?: any, admOptions?: any): boolean | Promise<boolean> {

View File

@ -489,12 +489,14 @@ export class CoreLoginHelperProvider {
* @return {boolean} Whether email signup is disabled.
*/
isEmailSignupDisabled(config: any): boolean {
const disabledFeatures = config && config.tool_mobile_disabledfeatures;
let disabledFeatures = config && config.tool_mobile_disabledfeatures;
if (!disabledFeatures) {
return false;
}
const regEx = new RegExp('(,|^)\\$mmLoginEmailSignup(,|$)', 'g');
disabledFeatures = this.textUtils.treatDisabledFeatures(disabledFeatures);
const regEx = new RegExp('(,|^)CoreLoginEmailSignup(,|$)', 'g');
return !!disabledFeatures.match(regEx);
}
@ -744,8 +746,8 @@ export class CoreLoginHelperProvider {
loginUrl += '&passport=' + passport;
loginUrl += '&urlscheme=' + CoreConfigConstants.customurlscheme;
// Store the siteurl and passport in $mmConfig for persistence.
// We are "configuring" the app to wait for an SSO. $mmConfig shouldn't be used as a temporary storage.
// Store the siteurl and passport in CoreConfigProvider for persistence.
// We are "configuring" the app to wait for an SSO. CoreConfigProvider shouldn't be used as a temporary storage.
this.configProvider.set(CoreConstants.LOGIN_LAUNCH_DATA, JSON.stringify({
siteUrl: siteUrl,
passport: passport,

View File

@ -80,8 +80,8 @@ export class CoreMainMenuMorePage implements OnDestroy {
this.siteInfo = currentSite.getInfo();
this.logoutLabel = 'core.mainmenu.' + (config && config.tool_mobile_forcelogout == '1' ? 'logout' : 'changesite');
this.showWeb = !currentSite.isFeatureDisabled('$mmSideMenuDelegate_website');
this.showHelp = !currentSite.isFeatureDisabled('$mmSideMenuDelegate_help');
this.showWeb = !currentSite.isFeatureDisabled('CoreMainMenuDelegate_website');
this.showHelp = !currentSite.isFeatureDisabled('CoreMainMenuDelegate_help');
currentSite.getDocsUrl().then((docsUrl) => {
this.docsUrl = docsUrl;

View File

@ -107,11 +107,9 @@ export interface CoreMainMenuHandlerToDisplay extends CoreMainMenuHandlerData {
*/
@Injectable()
export class CoreMainMenuDelegate extends CoreDelegate {
protected handlers: { [s: string]: CoreMainMenuHandler } = {};
protected enabledHandlers: { [s: string]: CoreMainMenuHandler } = {};
protected loaded = false;
protected siteHandlers: Subject<CoreMainMenuHandlerToDisplay[]> = new BehaviorSubject<CoreMainMenuHandlerToDisplay[]>([]);
protected featurePrefix = '$mmSideMenuDelegate_';
protected featurePrefix = 'CoreMainMenuDelegate_';
constructor(protected loggerProvider: CoreLoggerProvider, protected sitesProvider: CoreSitesProvider,
protected eventsProvider: CoreEventsProvider) {
@ -153,7 +151,7 @@ export class CoreMainMenuDelegate extends CoreDelegate {
const handlersData: any[] = [];
for (const name in this.enabledHandlers) {
const handler = this.enabledHandlers[name],
const handler = <CoreMainMenuHandler> this.enabledHandlers[name],
data = handler.getDisplayData();
handlersData.push({

View File

@ -79,8 +79,6 @@ export interface CoreSettingsHandlerData {
@Injectable()
export class CoreSettingsDelegate extends CoreDelegate {
protected handlers: { [s: string]: CoreSettingsHandler } = {};
protected enabledHandlers: { [s: string]: CoreSettingsHandler } = {};
protected siteHandlers: CoreSettingsHandlerData[] = []; // Handlers to return.
constructor(protected loggerProvider: CoreLoggerProvider, protected sitesProvider: CoreSitesProvider,
@ -113,7 +111,7 @@ export class CoreSettingsDelegate extends CoreDelegate {
const handlersData: any[] = [];
for (const name in this.enabledHandlers) {
const handler = this.enabledHandlers[name],
const handler = <CoreSettingsHandler> this.enabledHandlers[name],
data = handler.getDisplayData();
handlersData.push({

View File

@ -25,7 +25,7 @@ import { CoreSiteHomeProvider } from './sitehome';
@Injectable()
export class CoreSiteHomeIndexLinkHandler extends CoreContentLinksHandlerBase {
name = 'CoreSiteHomeIndexLinkHandler';
featureName = '$mmSideMenuDelegate_mmaFrontpage';
featureName = 'CoreMainMenuDelegate_CoreSiteHome';
pattern = /\/course\/view\.php.*([\?\&]id=\d+)/;
constructor(private sitesProvider: CoreSitesProvider, private siteHomeProvider: CoreSiteHomeProvider,

View File

@ -100,6 +100,6 @@ export class CoreSiteHomeProvider {
isDisabledInSite(site: CoreSite): boolean {
site = site || this.sitesProvider.getCurrentSite();
return site.isFeatureDisabled('$mmSideMenuDelegate_mmaFrontpage');
return site.isFeatureDisabled('CoreMainMenuDelegate_CoreSiteHome');
}
}

View File

@ -22,7 +22,7 @@ import { CoreSitePluginsCourseFormatComponent } from '../components/course-forma
*/
export class CoreSitePluginsCourseFormatHandler extends CoreSitePluginsBaseHandler implements CoreCourseFormatHandler {
constructor(name: string, protected handlerSchema: any) {
constructor(name: string, public format: string, protected handlerSchema: any) {
super(name);
}

View File

@ -24,7 +24,7 @@ import { CoreSitePluginsModuleIndexComponent } from '../components/module-index/
export class CoreSitePluginsModuleHandler extends CoreSitePluginsBaseHandler implements CoreCourseModuleHandler {
priority: number;
constructor(name: string, protected handlerSchema: any) {
constructor(name: string, public modName: string, protected handlerSchema: any) {
super(name);
}

View File

@ -22,12 +22,13 @@ import { CoreCourseModulePrefetchHandlerBase } from '@core/course/classes/module
export class CoreSitePluginsModulePrefetchHandler extends CoreCourseModulePrefetchHandlerBase {
protected ROOT_CACHE_KEY = 'CoreSitePluginsModulePrefetchHandler:';
constructor(injector: Injector, protected sitePluginsProvider: CoreSitePluginsProvider, component: string, modName: string,
protected handlerSchema: any) {
constructor(injector: Injector, protected sitePluginsProvider: CoreSitePluginsProvider, component: string, name: string,
modName: string, protected handlerSchema: any) {
super(injector);
this.component = component;
this.name = modName;
this.name = name;
this.modName = modName;
this.isResource = handlerSchema.isresource;
if (handlerSchema.updatesnames) {

View File

@ -22,7 +22,7 @@ import { CoreSitePluginsUserProfileFieldComponent } from '../components/user-pro
*/
export class CoreSitePluginsUserProfileFieldHandler extends CoreSitePluginsBaseHandler implements CoreUserProfileFieldHandler {
constructor(name: string) {
constructor(name: string, public type: string) {
super(name);
}

View File

@ -353,8 +353,9 @@ export class CoreSitePluginsHelperProvider {
this.logger.debug('Register site plugin in course format delegate:', plugin, handlerSchema, bootstrapResult);
// Create and register the handler.
const formatName = plugin.component.replace('format_', '');
this.courseFormatDelegate.registerHandler(new CoreSitePluginsCourseFormatHandler(formatName, handlerSchema));
const uniqueName = this.sitePluginsProvider.getHandlerUniqueName(plugin, handlerName),
formatName = plugin.component.replace('format_', '');
this.courseFormatDelegate.registerHandler(new CoreSitePluginsCourseFormatHandler(uniqueName, formatName, handlerSchema));
return formatName;
}
@ -437,14 +438,15 @@ export class CoreSitePluginsHelperProvider {
this.logger.debug('Register site plugin in module delegate:', plugin, handlerSchema, bootstrapResult);
// Create and register the handler.
const modName = plugin.component.replace('mod_', '');
const uniqueName = this.sitePluginsProvider.getHandlerUniqueName(plugin, handlerName),
modName = plugin.component.replace('mod_', '');
this.moduleDelegate.registerHandler(new CoreSitePluginsModuleHandler(modName, handlerSchema));
this.moduleDelegate.registerHandler(new CoreSitePluginsModuleHandler(uniqueName, modName, handlerSchema));
if (handlerSchema.offlinefunctions && Object.keys(handlerSchema.offlinefunctions).length) {
// Register the prefetch handler.
this.prefetchDelegate.registerHandler(new CoreSitePluginsModulePrefetchHandler(
this.injector, this.sitePluginsProvider, plugin.component, modName, handlerSchema));
this.injector, this.sitePluginsProvider, plugin.component, uniqueName, modName, handlerSchema));
}
return modName;
@ -502,8 +504,9 @@ export class CoreSitePluginsHelperProvider {
// 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) => {
// Create and register the handler.
const fieldType = plugin.component.replace('profilefield_', ''),
fieldHandler = new CoreSitePluginsUserProfileFieldHandler(fieldType);
const uniqueName = this.sitePluginsProvider.getHandlerUniqueName(plugin, handlerName),
fieldType = plugin.component.replace('profilefield_', ''),
fieldHandler = new CoreSitePluginsUserProfileFieldHandler(uniqueName, fieldType);
// Store in handlerSchema some data required by the component.
handlerSchema.methodTemplates = result.templates;

View File

@ -24,7 +24,7 @@ import { CoreUserProvider } from './user';
@Injectable()
export class CoreUserParticipantsLinkHandler extends CoreContentLinksHandlerBase {
name = 'CoreUserParticipants';
featureName = '$mmCoursesDelegate_mmaParticipants';
featureName = 'CoreCourseOptionsDelegate_CoreUserParticipants';
pattern = /\/user\/index\.php/;
constructor(private userProvider: CoreUserProvider, private loginHelper: CoreLoginHelperProvider) {

View File

@ -162,12 +162,10 @@ export class CoreUserDelegate extends CoreDelegate {
*/
static UPDATE_HANDLER_EVENT = 'CoreUserDelegate_update_handler_event';
protected handlers: { [s: string]: CoreUserProfileHandler } = {};
protected enabledHandlers: { [s: string]: CoreUserProfileHandler } = {};
protected observableHandlers: Subject<CoreUserProfileHandlerToDisplay[]> =
new BehaviorSubject<CoreUserProfileHandlerToDisplay[]>([]);
protected userHandlers: CoreUserProfileHandlerToDisplay[] = [];
protected featurePrefix = '$mmUserDelegate_';
protected featurePrefix = 'CoreUserDelegate_';
protected loaded = false;
constructor(protected loggerProvider: CoreLoggerProvider, protected sitesProvider: CoreSitesProvider,
@ -233,7 +231,7 @@ export class CoreUserDelegate extends CoreDelegate {
for (const name in this.enabledHandlers) {
// Checks if the handler is enabled for the user.
const handler = this.handlers[name],
const handler = <CoreUserProfileHandler> this.handlers[name],
isEnabledForUser = handler.isEnabledForUser(user, courseId, navOptions, admOptions),
promise = Promise.resolve(isEnabledForUser).then((enabled) => {
if (enabled) {

View File

@ -21,7 +21,7 @@ import { CoreSitesProvider } from '@providers/sites';
*/
@Injectable()
export class CoreUserProfileMailHandler implements CoreUserProfileHandler {
name = 'mmUser';
name = 'CoreUserProfileMail';
priority = 700;
type = CoreUserDelegate.TYPE_COMMUNICATION;

View File

@ -19,6 +19,11 @@ import { CoreSitesProvider } from '@providers/sites';
import { CoreEventsProvider } from '@providers/events';
export interface CoreUserProfileFieldHandler extends CoreDelegateHandler {
/**
* Type of the field the handler supports. E.g. 'checkbox'.
* @type {string}
*/
type: string;
/**
* Return the Component to use to display the user profile field.
@ -66,8 +71,7 @@ export interface CoreUserProfileFieldHandlerData {
*/
@Injectable()
export class CoreUserProfileFieldDelegate extends CoreDelegate {
protected handlers: { [s: string]: CoreUserProfileFieldHandler } = {};
protected enabledHandlers: { [s: string]: CoreUserProfileFieldHandler } = {};
protected handlerNameProperty = 'type';
constructor(protected loggerProvider: CoreLoggerProvider, protected sitesProvider: CoreSitesProvider,
protected eventsProvider: CoreEventsProvider) {

View File

@ -306,7 +306,7 @@ export class CoreUserProvider {
isParticipantsDisabledInSite(site?: any): boolean {
site = site || this.sitesProvider.getCurrentSite();
return site.isFeatureDisabled('$mmCoursesDelegate_mmaParticipants');
return site.isFeatureDisabled('CoreCourseOptionsDelegate_CoreUserParticipants');
}
/**
@ -334,7 +334,7 @@ export class CoreUserProvider {
isUpdatePictureDisabledInSite(site?: CoreSite): boolean {
site = site || this.sitesProvider.getCurrentSite();
return site.isFeatureDisabled('$mmUserDelegate_picture');
return site.isFeatureDisabled('CoreUserDelegate_picture');
}
/**

View File

@ -323,10 +323,10 @@ export class CoreAppProvider {
if (localStorage && localStorage.getItem) {
try {
const data: CoreRedirectData = {
siteId: localStorage.getItem('mmCoreRedirectSiteId'),
page: localStorage.getItem('mmCoreRedirectState'),
params: localStorage.getItem('mmCoreRedirectParams'),
timemodified: parseInt(localStorage.getItem('mmCoreRedirectTime'), 10)
siteId: localStorage.getItem('CoreRedirectSiteId'),
page: localStorage.getItem('CoreRedirectState'),
params: localStorage.getItem('CoreRedirectParams'),
timemodified: parseInt(localStorage.getItem('CoreRedirectTime'), 10)
};
if (data.params) {
@ -352,10 +352,10 @@ export class CoreAppProvider {
storeRedirect(siteId: string, page: string, params: any): void {
if (localStorage && localStorage.setItem) {
try {
localStorage.setItem('mmCoreRedirectSiteId', siteId);
localStorage.setItem('mmCoreRedirectState', page);
localStorage.setItem('mmCoreRedirectParams', JSON.stringify(params));
localStorage.setItem('mmCoreRedirectTime', String(Date.now()));
localStorage.setItem('CoreRedirectSiteId', siteId);
localStorage.setItem('CoreRedirectState', page);
localStorage.setItem('CoreRedirectParams', JSON.stringify(params));
localStorage.setItem('CoreRedirectTime', String(Date.now()));
} catch (ex) {
// Ignore errors.
}

View File

@ -242,11 +242,11 @@ export class CoreFilepoolProvider {
protected FOLDER = 'filepool';
protected WIFI_DOWNLOAD_THRESHOLD = 20971520; // 20MB.
protected DOWNLOAD_THRESHOLD = 2097152; // 2MB.
protected QUEUE_RUNNING = 'mmFilepool:QUEUE_RUNNING';
protected QUEUE_PAUSED = 'mmFilepool:QUEUE_PAUSED';
protected ERR_QUEUE_IS_EMPTY = 'mmFilepoolError:ERR_QUEUE_IS_EMPTY';
protected ERR_FS_OR_NETWORK_UNAVAILABLE = 'mmFilepoolError:ERR_FS_OR_NETWORK_UNAVAILABLE';
protected ERR_QUEUE_ON_PAUSE = 'mmFilepoolError:ERR_QUEUE_ON_PAUSE';
protected QUEUE_RUNNING = 'CoreFilepool:QUEUE_RUNNING';
protected QUEUE_PAUSED = 'CoreFilepool:QUEUE_PAUSED';
protected ERR_QUEUE_IS_EMPTY = 'CoreFilepoolError:ERR_QUEUE_IS_EMPTY';
protected ERR_FS_OR_NETWORK_UNAVAILABLE = 'CoreFilepoolError:ERR_FS_OR_NETWORK_UNAVAILABLE';
protected ERR_QUEUE_ON_PAUSE = 'CoreFilepoolError:ERR_QUEUE_ON_PAUSE';
// Variables for database.
protected QUEUE_TABLE = 'filepool_files_queue'; // Queue of files to download.
@ -1369,7 +1369,7 @@ export class CoreFilepoolProvider {
* @return {string} Event name.
*/
protected getFileEventName(siteId: string, fileId: string): string {
return 'mmFilepoolFile:' + siteId + ':' + fileId;
return 'CoreFilepoolFile:' + siteId + ':' + fileId;
}
/**

View File

@ -107,8 +107,6 @@ export class CoreInitDelegate {
/**
* Instantly returns if the app is ready.
*
* To be notified when the app is ready, refer to {@link $mmApp#ready}.
*
* @return {boolean} Whether it's ready.
*/
isReady(): boolean {

View File

@ -22,6 +22,52 @@ import { CoreLangProvider } from '../lang';
*/
@Injectable()
export class CoreTextUtilsProvider {
// List of regular expressions to convert the old nomenclature to new nomenclature for disabled features.
protected DISABLED_FEATURES_COMPAT_REGEXPS = [
{old: /\$mmLoginEmailSignup/g, new: 'CoreLoginEmailSignup'},
{old: /\$mmSideMenuDelegate/g, new: 'CoreMainMenuDelegate'},
{old: /\$mmCoursesDelegate/g, new: 'CoreCourseOptionsDelegate'},
{old: /\$mmUserDelegate/g, new: 'CoreUserDelegate'},
{old: /\$mmCourseDelegate/g, new: 'CoreCourseModuleDelegate'},
{old: /_mmCourses/g, new: '_CoreCourses'},
{old: /_mmaFrontpage/g, new: '_CoreSiteHome'},
{old: /_mmaGrades/g, new: '_CoreGrades'},
{old: /_mmaCompetency/g, new: '_AddonCompetency'},
{old: /_mmaNotifications/g, new: '_AddonNotifications'},
{old: /_mmaMessages/g, new: '_AddonMessages'},
{old: /_mmaCalendar/g, new: '_AddonCalendar'},
{old: /_mmaFiles/g, new: '_AddonFiles'},
{old: /_mmaParticipants/g, new: '_CoreUserParticipants'},
{old: /_mmaCourseCompletion/g, new: '_AddonCourseCompletion'},
{old: /_mmaNotes/g, new: '_AddonNotes'},
{old: /_mmaBadges/g, new: '_AddonBadges'},
{old: /files_privatefiles/g, new: 'AddonFilesPrivateFiles'},
{old: /files_sitefiles/g, new: 'AddonFilesSiteFiles'},
{old: /files_upload/g, new: 'AddonFilesUpload'},
{old: /_mmaModAssign/g, new: '_AddonModAssign'},
{old: /_mmaModBook/g, new: '_AddonModBook'},
{old: /_mmaModChat/g, new: '_AddonModChat'},
{old: /_mmaModChoice/g, new: '_AddonModChoice'},
{old: /_mmaModData/g, new: '_AddonModData'},
{old: /_mmaModFeedback/g, new: '_AddonModFeedback'},
{old: /_mmaModFolder/g, new: '_AddonModFolder'},
{old: /_mmaModForum/g, new: '_AddonModForum'},
{old: /_mmaModGlossary/g, new: '_AddonModGlossary'},
{old: /_mmaModImscp/g, new: '_AddonModImscp'},
{old: /_mmaModLabel/g, new: '_AddonModLabel'},
{old: /_mmaModLesson/g, new: '_AddonModLesson'},
{old: /_mmaModLti/g, new: '_AddonModLti'},
{old: /_mmaModPage/g, new: '_AddonModPage'},
{old: /_mmaModQuiz/g, new: '_AddonModQuiz'},
{old: /_mmaModResource/g, new: '_AddonModResource'},
{old: /_mmaModScorm/g, new: '_AddonModScorm'},
{old: /_mmaModSurvey/g, new: '_AddonModSurvey'},
{old: /_mmaModUrl/g, new: '_AddonModUrl'},
{old: /_mmaModWiki/g, new: '_AddonModWiki'},
{old: /_mmaModWorkshop/g, new: '_AddonModWorkshop'},
];
protected element = document.createElement('div'); // Fake element to use in some functions, to prevent creating it each time.
constructor(private translate: TranslateService, private langProvider: CoreLangProvider, private modalCtrl: ModalController) { }
@ -534,6 +580,26 @@ export class CoreTextUtilsProvider {
return stripped;
}
/**
* Treat the list of disabled features, replacing old nomenclature with the new one.
*
* @param {string} features List of disabled features.
* @return {string} Treated list.
*/
treatDisabledFeatures(features: string): string {
if (!features) {
return '';
}
for (let i = 0; i < this.DISABLED_FEATURES_COMPAT_REGEXPS.length; i++) {
const entry = this.DISABLED_FEATURES_COMPAT_REGEXPS[i];
features = features.replace(entry.old, entry.new);
}
return features;
}
/**
* Treat the multilang tags from a HTML code, leaving only the current language.
*