MOBILE-3109 mod: Add return types to resources

main
Dani Palou 2019-09-06 13:08:36 +02:00
parent 7fc1c96b03
commit 334b28bda2
13 changed files with 310 additions and 74 deletions

View File

@ -121,7 +121,7 @@ export class AddonModBookIndexComponent extends CoreCourseModuleMainResourceComp
// Try to get the book data.
promises.push(this.bookProvider.getBook(this.courseId, this.module.id).then((book) => {
this.dataRetrieved.emit(book);
this.description = book.intro || this.description;
this.description = book.intro;
}).catch(() => {
// Ignore errors since this WS isn't available in some Moodle versions.
}));

View File

@ -25,38 +25,7 @@ import { CoreCourseProvider } from '@core/course/providers/course';
import { CoreCourseLogHelperProvider } from '@core/course/providers/log-helper';
import { CoreSite } from '@classes/site';
import { CoreTagItem } from '@core/tag/providers/tag';
/**
* A book chapter inside the toc list.
*/
export interface AddonModBookTocChapter {
/**
* ID to identify the chapter.
*/
id: string;
/**
* Chapter's title.
*/
title: string;
/**
* The chapter's level.
*/
level: number;
}
/**
* Map of book contents. For each chapter it has its index URL and the list of paths of the files the chapter has. Each path
* is identified by the relative path in the book, and the value is the URL of the file.
*/
export type AddonModBookContentsMap = {
[chapter: string]: {
indexUrl?: string,
paths: {[path: string]: string},
tags?: CoreTagItem[]
}
};
import { CoreWSExternalWarning, CoreWSExternalFile } from '@providers/ws';
/**
* Service that provides some features for books.
@ -83,7 +52,7 @@ export class AddonModBookProvider {
* @param siteId Site ID. If not defined, current site.
* @return Promise resolved when the book is retrieved.
*/
getBook(courseId: number, cmId: number, siteId?: string): Promise<any> {
getBook(courseId: number, cmId: number, siteId?: string): Promise<AddonModBookBook> {
return this.getBookByField(courseId, 'coursemodule', cmId, siteId);
}
@ -96,7 +65,7 @@ export class AddonModBookProvider {
* @param siteId Site ID. If not defined, current site.
* @return Promise resolved when the book is retrieved.
*/
protected getBookByField(courseId: number, key: string, value: any, siteId?: string): Promise<any> {
protected getBookByField(courseId: number, key: string, value: any, siteId?: string): Promise<AddonModBookBook> {
return this.sitesProvider.getSite(siteId).then((site) => {
const params = {
courseids: [courseId]
@ -106,7 +75,9 @@ export class AddonModBookProvider {
updateFrequency: CoreSite.FREQUENCY_RARELY
};
return site.read('mod_book_get_books_by_courses', params, preSets).then((response) => {
return site.read('mod_book_get_books_by_courses', params, preSets)
.then((response: AddonModBookGetBooksByCoursesResult): any => {
// Search the book.
if (response && response.books) {
for (const i in response.books) {
@ -401,3 +372,66 @@ export class AddonModBookProvider {
{chapterid: chapterId}, siteId);
}
}
/**
* A book chapter inside the toc list.
*/
export type AddonModBookTocChapter = {
/**
* ID to identify the chapter.
*/
id: string;
/**
* Chapter's title.
*/
title: string;
/**
* The chapter's level.
*/
level: number;
};
/**
* Map of book contents. For each chapter it has its index URL and the list of paths of the files the chapter has. Each path
* is identified by the relative path in the book, and the value is the URL of the file.
*/
export type AddonModBookContentsMap = {
[chapter: string]: {
indexUrl?: string,
paths: {[path: string]: string},
tags?: CoreTagItem[]
}
};
/**
* Book returned by mod_book_get_books_by_courses.
*/
export type AddonModBookBook = {
id: number; // Book id.
coursemodule: number; // Course module id.
course: number; // Course id.
name: string; // Book name.
intro: string; // The Book intro.
introformat: number; // Intro format (1 = HTML, 0 = MOODLE, 2 = PLAIN or 4 = MARKDOWN).
introfiles?: CoreWSExternalFile[]; // @since 3.2.
numbering: number; // Book numbering configuration.
navstyle: number; // Book navigation style configuration.
customtitles: number; // Book custom titles type.
revision?: number; // Book revision.
timecreated?: number; // Time of creation.
timemodified?: number; // Time of last modification.
section?: number; // Course section id.
visible?: boolean; // Visible.
groupmode?: number; // Group mode.
groupingid?: number; // Group id.
};
/**
* Result of WS mod_book_get_books_by_courses.
*/
export type AddonModBookGetBooksByCoursesResult = {
books: AddonModBookBook[];
warnings?: CoreWSExternalWarning[];
};

View File

@ -34,6 +34,7 @@ export class AddonModFolderIndexComponent extends CoreCourseModuleMainResourceCo
component = AddonModFolderProvider.COMPONENT;
canGetFolder: boolean;
contents: any;
moduleContents: any;
constructor(injector: Injector, private folderProvider: AddonModFolderProvider, private courseProvider: CoreCourseProvider,
private appProvider: CoreAppProvider, private folderHelper: AddonModFolderHelperProvider) {
@ -87,9 +88,9 @@ export class AddonModFolderIndexComponent extends CoreCourseModuleMainResourceCo
if (this.path) {
// Subfolder.
this.contents = module.contents;
this.contents = this.moduleContents;
} else {
this.contents = this.folderHelper.formatContents(module.contents);
this.contents = this.folderHelper.formatContents(this.moduleContents);
}
}
@ -105,7 +106,7 @@ export class AddonModFolderIndexComponent extends CoreCourseModuleMainResourceCo
if (this.canGetFolder) {
promise = this.folderProvider.getFolder(this.courseId, this.module.id).then((folder) => {
return this.courseProvider.loadModuleContents(this.module, this.courseId).then(() => {
folder.contents = this.module.contents;
this.moduleContents = this.module.contents;
return folder;
});
@ -117,17 +118,13 @@ export class AddonModFolderIndexComponent extends CoreCourseModuleMainResourceCo
folder.contents = this.module.contents;
}
this.module = folder;
this.moduleContents = folder.contents;
return folder;
});
}
return promise.then((folder) => {
if (folder) {
this.description = folder.intro || folder.description;
this.dataRetrieved.emit(folder);
}
this.showModuleData(folder);
// All data obtained, now fill the context menu.

View File

@ -19,6 +19,7 @@ import { CoreUtilsProvider } from '@providers/utils/utils';
import { CoreCourseProvider } from '@core/course/providers/course';
import { CoreCourseLogHelperProvider } from '@core/course/providers/log-helper';
import { CoreSite } from '@classes/site';
import { CoreWSExternalWarning, CoreWSExternalFile } from '@providers/ws';
/**
* Service that provides some features for folder.
@ -43,7 +44,7 @@ export class AddonModFolderProvider {
* @param siteId Site ID. If not defined, current site.
* @return Promise resolved when the book is retrieved.
*/
getFolder(courseId: number, cmId: number, siteId?: string): Promise<any> {
getFolder(courseId: number, cmId: number, siteId?: string): Promise<AddonModFolderFolder> {
return this.getFolderByKey(courseId, 'coursemodule', cmId, siteId);
}
@ -56,7 +57,7 @@ export class AddonModFolderProvider {
* @param siteId Site ID. If not defined, current site.
* @return Promise resolved when the book is retrieved.
*/
protected getFolderByKey(courseId: number, key: string, value: any, siteId?: string): Promise<any> {
protected getFolderByKey(courseId: number, key: string, value: any, siteId?: string): Promise<AddonModFolderFolder> {
return this.sitesProvider.getSite(siteId).then((site) => {
const params = {
courseids: [courseId]
@ -66,7 +67,9 @@ export class AddonModFolderProvider {
updateFrequency: CoreSite.FREQUENCY_RARELY
};
return site.read('mod_folder_get_folders_by_courses', params, preSets).then((response) => {
return site.read('mod_folder_get_folders_by_courses', params, preSets)
.then((response: AddonModFolderGetFoldersByCoursesResult): any => {
if (response && response.folders) {
const currentFolder = response.folders.find((folder) => {
return folder[key] == value;
@ -147,3 +150,33 @@ export class AddonModFolderProvider {
{}, siteId);
}
}
/**
* Folder returned by mod_folder_get_folders_by_courses.
*/
export type AddonModFolderFolder = {
id: number; // Module id.
coursemodule: number; // Course module id.
course: number; // Course id.
name: string; // Page name.
intro: string; // Summary.
introformat: number; // Intro format (1 = HTML, 0 = MOODLE, 2 = PLAIN or 4 = MARKDOWN).
introfiles: CoreWSExternalFile[];
revision: number; // Incremented when after each file changes, to avoid cache.
timemodified: number; // Last time the folder was modified.
display: number; // Display type of folder contents on a separate page or inline.
showexpanded: number; // 1 = expanded, 0 = collapsed for sub-folders.
showdownloadfolder: number; // Whether to show the download folder button.
section: number; // Course section id.
visible: number; // Module visibility.
groupmode: number; // Group mode.
groupingid: number; // Grouping id.
};
/**
* Result of WS mod_folder_get_folders_by_courses.
*/
export type AddonModFolderGetFoldersByCoursesResult = {
folders: AddonModFolderFolder[];
warnings?: CoreWSExternalWarning[];
};

View File

@ -79,7 +79,7 @@ export class AddonModImscpIndexComponent extends CoreCourseModuleMainResourceCom
const promises = [];
promises.push(this.imscpProvider.getImscp(this.courseId, this.module.id).then((imscp) => {
this.description = imscp.intro || imscp.description;
this.description = imscp.intro;
this.dataRetrieved.emit(imscp);
}));

View File

@ -21,6 +21,7 @@ import { CoreUtilsProvider } from '@providers/utils/utils';
import { CoreCourseProvider } from '@core/course/providers/course';
import { CoreCourseLogHelperProvider } from '@core/course/providers/log-helper';
import { CoreSite } from '@classes/site';
import { CoreWSExternalWarning, CoreWSExternalFile } from '@providers/ws';
/**
* Service that provides some features for IMSCP.
@ -157,7 +158,7 @@ export class AddonModImscpProvider {
* @param siteId Site ID. If not defined, current site.
* @return Promise resolved when the imscp is retrieved.
*/
protected getImscpByKey(courseId: number, key: string, value: any, siteId?: string): Promise<any> {
protected getImscpByKey(courseId: number, key: string, value: any, siteId?: string): Promise<AddonModImscpImscp> {
return this.sitesProvider.getSite(siteId).then((site) => {
const params = {
courseids: [courseId]
@ -167,7 +168,9 @@ export class AddonModImscpProvider {
updateFrequency: CoreSite.FREQUENCY_RARELY
};
return site.read('mod_imscp_get_imscps_by_courses', params, preSets).then((response) => {
return site.read('mod_imscp_get_imscps_by_courses', params, preSets)
.then((response: AddonModImscpGetImscpsByCoursesResult): any => {
if (response && response.imscps) {
const currentImscp = response.imscps.find((imscp) => imscp[key] == value);
if (currentImscp) {
@ -188,7 +191,7 @@ export class AddonModImscpProvider {
* @param siteId Site ID. If not defined, current site.
* @return Promise resolved when the imscp is retrieved.
*/
getImscp(courseId: number, cmId: number, siteId?: string): Promise<any> {
getImscp(courseId: number, cmId: number, siteId?: string): Promise<AddonModImscpImscp> {
return this.getImscpByKey(courseId, 'coursemodule', cmId, siteId);
}
@ -324,3 +327,32 @@ export class AddonModImscpProvider {
siteId);
}
}
/**
* IMSCP returned by mod_imscp_get_imscps_by_courses.
*/
export type AddonModImscpImscp = {
id: number; // IMSCP id.
coursemodule: number; // Course module id.
course: number; // Course id.
name: string; // Activity name.
intro?: string; // The IMSCP intro.
introformat?: number; // Intro format (1 = HTML, 0 = MOODLE, 2 = PLAIN or 4 = MARKDOWN).
introfiles?: CoreWSExternalFile[]; // @since 3.2.
revision?: number; // Revision.
keepold?: number; // Number of old IMSCP to keep.
structure?: string; // IMSCP structure.
timemodified?: string; // Time of last modification.
section?: number; // Course section id.
visible?: boolean; // If visible.
groupmode?: number; // Group mode.
groupingid?: number; // Group id.
};
/**
* Result of WS mod_imscp_get_imscps_by_courses.
*/
export type AddonModImscpGetImscpsByCoursesResult = {
imscps: AddonModImscpImscp[];
warnings?: CoreWSExternalWarning[];
};

View File

@ -17,6 +17,7 @@ import { CoreSitesProvider } from '@providers/sites';
import { CoreUtilsProvider } from '@providers/utils/utils';
import { CoreFilepoolProvider } from '@providers/filepool';
import { CoreSite, CoreSiteWSPreSets } from '@classes/site';
import { CoreWSExternalWarning, CoreWSExternalFile } from '@providers/ws';
/**
* Service that provides some features for labels.
@ -52,7 +53,7 @@ export class AddonModLabelProvider {
* @return Promise resolved when the label is retrieved.
*/
protected getLabelByField(courseId: number, key: string, value: any, forceCache?: boolean, ignoreCache?: boolean,
siteId?: string): Promise<any> {
siteId?: string): Promise<AddonModLabelLabel> {
return this.sitesProvider.getSite(siteId).then((site) => {
const params = {
@ -70,7 +71,9 @@ export class AddonModLabelProvider {
preSets.emergencyCache = false;
}
return site.read('mod_label_get_labels_by_courses', params, preSets).then((response) => {
return site.read('mod_label_get_labels_by_courses', params, preSets)
.then((response: AddonModLabelGetLabelsByCoursesResult): any => {
if (response && response.labels) {
const currentLabel = response.labels.find((label) => label[key] == value);
if (currentLabel) {
@ -93,7 +96,8 @@ export class AddonModLabelProvider {
* @param siteId Site ID. If not defined, current site.
* @return Promise resolved when the label is retrieved.
*/
getLabel(courseId: number, cmId: number, forceCache?: boolean, ignoreCache?: boolean, siteId?: string): Promise<any> {
getLabel(courseId: number, cmId: number, forceCache?: boolean, ignoreCache?: boolean, siteId?: string)
: Promise<AddonModLabelLabel> {
return this.getLabelByField(courseId, 'coursemodule', cmId, forceCache, ignoreCache, siteId);
}
@ -107,7 +111,8 @@ export class AddonModLabelProvider {
* @param siteId Site ID. If not defined, current site.
* @return Promise resolved when the label is retrieved.
*/
getLabelById(courseId: number, labelId: number, forceCache?: boolean, ignoreCache?: boolean, siteId?: string): Promise<any> {
getLabelById(courseId: number, labelId: number, forceCache?: boolean, ignoreCache?: boolean, siteId?: string)
: Promise<AddonModLabelLabel> {
return this.getLabelByField(courseId, 'id', labelId, forceCache, ignoreCache, siteId);
}
@ -170,3 +175,29 @@ export class AddonModLabelProvider {
return site.wsAvailable('mod_label_get_labels_by_courses');
}
}
/**
* Label returned by mod_label_get_labels_by_courses.
*/
export type AddonModLabelLabel = {
id: number; // Module id.
coursemodule: number; // Course module id.
course: number; // Course id.
name: string; // Label name.
intro: string; // Label contents.
introformat: number; // Intro format (1 = HTML, 0 = MOODLE, 2 = PLAIN or 4 = MARKDOWN).
introfiles: CoreWSExternalFile[];
timemodified: number; // Last time the label was modified.
section: number; // Course section id.
visible: number; // Module visibility.
groupmode: number; // Group mode.
groupingid: number; // Grouping id.
};
/**
* Result of WS mod_label_get_labels_by_courses.
*/
export type AddonModLabelGetLabelsByCoursesResult = {
labels: AddonModLabelLabel[];
warnings?: CoreWSExternalWarning[];
};

View File

@ -17,7 +17,7 @@ import { CoreAppProvider } from '@providers/app';
import { CoreUtilsProvider } from '@providers/utils/utils';
import { CoreCourseProvider } from '@core/course/providers/course';
import { CoreCourseModuleMainResourceComponent } from '@core/course/classes/main-resource-component';
import { AddonModPageProvider } from '../../providers/page';
import { AddonModPageProvider, AddonModPagePage } from '../../providers/page';
import { AddonModPageHelperProvider } from '../../providers/helper';
import { AddonModPagePrefetchHandler } from '../../providers/prefetch-handler';
@ -34,7 +34,7 @@ export class AddonModPageIndexComponent extends CoreCourseModuleMainResourceComp
contents: any;
displayDescription = true;
displayTimemodified = true;
page: any;
page: AddonModPagePage;
protected fetchContentDefaultError = 'addon.mod_page.errorwhileloadingthepage';
@ -109,8 +109,8 @@ export class AddonModPageIndexComponent extends CoreCourseModuleMainResourceComp
this.page = page;
// Check if description and timemodified should be displayed.
if (page.displayoptions) {
const options = this.textUtils.unserialize(page.displayoptions) || {};
if (this.page.displayoptions) {
const options = this.textUtils.unserialize(this.page.displayoptions) || {};
this.displayDescription = typeof options.printintro == 'undefined' ||
this.utils.isTrueOrOne(options.printintro);
this.displayTimemodified = typeof options.printlastmodified == 'undefined' ||

View File

@ -20,6 +20,7 @@ import { CoreCourseProvider } from '@core/course/providers/course';
import { CoreCourseLogHelperProvider } from '@core/course/providers/log-helper';
import { CoreFilepoolProvider } from '@providers/filepool';
import { CoreSite } from '@classes/site';
import { CoreWSExternalWarning, CoreWSExternalFile } from '@providers/ws';
/**
* Service that provides some features for page.
@ -43,9 +44,9 @@ export class AddonModPageProvider {
* @param courseId Course ID.
* @param cmId Course module ID.
* @param siteId Site ID. If not defined, current site.
* @return Promise resolved when the book is retrieved.
* @return Promise resolved when the page is retrieved.
*/
getPageData(courseId: number, cmId: number, siteId?: string): Promise<any> {
getPageData(courseId: number, cmId: number, siteId?: string): Promise<AddonModPagePage> {
return this.getPageByKey(courseId, 'coursemodule', cmId, siteId);
}
@ -56,9 +57,9 @@ export class AddonModPageProvider {
* @param key Name of the property to check.
* @param value Value to search.
* @param siteId Site ID. If not defined, current site.
* @return Promise resolved when the book is retrieved.
* @return Promise resolved when the page is retrieved.
*/
protected getPageByKey(courseId: number, key: string, value: any, siteId?: string): Promise<any> {
protected getPageByKey(courseId: number, key: string, value: any, siteId?: string): Promise<AddonModPagePage> {
return this.sitesProvider.getSite(siteId).then((site) => {
const params = {
courseids: [courseId]
@ -68,7 +69,9 @@ export class AddonModPageProvider {
updateFrequency: CoreSite.FREQUENCY_RARELY
};
return site.read('mod_page_get_pages_by_courses', params, preSets).then((response) => {
return site.read('mod_page_get_pages_by_courses', params, preSets)
.then((response: AddonModPageGetPagesByCoursesResult): any => {
if (response && response.pages) {
const currentPage = response.pages.find((page) => {
return page[key] == value;
@ -161,3 +164,37 @@ export class AddonModPageProvider {
return this.logHelper.logSingle('mod_page_view_page', params, AddonModPageProvider.COMPONENT, id, name, 'page', {}, siteId);
}
}
/**
* Page returned by mod_page_get_pages_by_courses.
*/
export type AddonModPagePage = {
id: number; // Module id.
coursemodule: number; // Course module id.
course: number; // Course id.
name: string; // Page name.
intro: string; // Summary.
introformat: number; // Intro format (1 = HTML, 0 = MOODLE, 2 = PLAIN or 4 = MARKDOWN).
introfiles: CoreWSExternalFile[];
content: string; // Page content.
contentformat: number; // Content format (1 = HTML, 0 = MOODLE, 2 = PLAIN or 4 = MARKDOWN).
contentfiles: CoreWSExternalFile[];
legacyfiles: number; // Legacy files flag.
legacyfileslast: number; // Legacy files last control flag.
display: number; // How to display the page.
displayoptions: string; // Display options (width, height).
revision: number; // Incremented when after each file changes, to avoid cache.
timemodified: number; // Last time the page was modified.
section: number; // Course section id.
visible: number; // Module visibility.
groupmode: number; // Group mode.
groupingid: number; // Grouping id.
};
/**
* Result of WS mod_page_get_pages_by_courses.
*/
export type AddonModPageGetPagesByCoursesResult = {
pages: AddonModPagePage[];
warnings?: CoreWSExternalWarning[];
};

View File

@ -25,6 +25,7 @@ import { CoreTextUtilsProvider } from '@providers/utils/text';
import { CoreTimeUtilsProvider } from '@providers/utils/time';
import { CoreCourseModulePrefetchDelegate } from '@core/course/providers/module-prefetch-delegate';
import { CoreConstants } from '@core/constants';
import { CoreWSExternalFile } from '@providers/ws';
/**
* Handler to support resource modules.
@ -146,7 +147,7 @@ export class AddonModResourceModuleHandler implements CoreCourseModuleHandler {
*/
protected getResourceData(module: any, courseId: number, handlerData: CoreCourseModuleHandlerData): Promise<any> {
const promises = [];
let infoFiles = [],
let infoFiles: CoreWSExternalFile[] = [],
options: any = {};
// Check if the button needs to be shown or not.

View File

@ -20,6 +20,7 @@ import { CoreCourseProvider } from '@core/course/providers/course';
import { CoreCourseLogHelperProvider } from '@core/course/providers/log-helper';
import { CoreFilepoolProvider } from '@providers/filepool';
import { CoreSite } from '@classes/site';
import { CoreWSExternalWarning, CoreWSExternalFile } from '@providers/ws';
/**
* Service that provides some features for resources.
@ -56,7 +57,7 @@ export class AddonModResourceProvider {
* @param siteId Site ID. If not defined, current site.
* @return Promise resolved when the resource is retrieved.
*/
protected getResourceDataByKey(courseId: number, key: string, value: any, siteId?: string): Promise<any> {
protected getResourceDataByKey(courseId: number, key: string, value: any, siteId?: string): Promise<AddonModResourceResource> {
return this.sitesProvider.getSite(siteId).then((site) => {
const params = {
courseids: [courseId]
@ -66,7 +67,9 @@ export class AddonModResourceProvider {
updateFrequency: CoreSite.FREQUENCY_RARELY
};
return site.read('mod_resource_get_resources_by_courses', params, preSets).then((response) => {
return site.read('mod_resource_get_resources_by_courses', params, preSets)
.then((response: AddonModResourceGetResourcesByCoursesResult): any => {
if (response && response.resources) {
const currentResource = response.resources.find((resource) => {
return resource[key] == value;
@ -89,7 +92,7 @@ export class AddonModResourceProvider {
* @param siteId Site ID. If not defined, current site.
* @return Promise resolved when the resource is retrieved.
*/
getResourceData(courseId: number, cmId: number, siteId?: string): Promise<any> {
getResourceData(courseId: number, cmId: number, siteId?: string): Promise<AddonModResourceResource> {
return this.getResourceDataByKey(courseId, 'coursemodule', cmId, siteId);
}
@ -165,3 +168,37 @@ export class AddonModResourceProvider {
'resource', {}, siteId);
}
}
/**
* Resource returned by mod_resource_get_resources_by_courses.
*/
export type AddonModResourceResource = {
id: number; // Module id.
coursemodule: number; // Course module id.
course: number; // Course id.
name: string; // Page name.
intro: string; // Summary.
introformat: number; // Intro format (1 = HTML, 0 = MOODLE, 2 = PLAIN or 4 = MARKDOWN).
introfiles: CoreWSExternalFile[];
contentfiles: CoreWSExternalFile[];
tobemigrated: number; // Whether this resource was migrated.
legacyfiles: number; // Legacy files flag.
legacyfileslast: number; // Legacy files last control flag.
display: number; // How to display the resource.
displayoptions: string; // Display options (width, height).
filterfiles: number; // If filters should be applied to the resource content.
revision: number; // Incremented when after each file changes, to avoid cache.
timemodified: number; // Last time the resource was modified.
section: number; // Course section id.
visible: number; // Module visibility.
groupmode: number; // Group mode.
groupingid: number; // Grouping id.
};
/**
* Result of WS mod_resource_get_resources_by_courses.
*/
export type AddonModResourceGetResourcesByCoursesResult = {
resources: AddonModResourceResource[];
warnings?: CoreWSExternalWarning[];
};

View File

@ -19,7 +19,7 @@ import { AddonModUrlIndexComponent } from '../components/index/index';
import { CoreCourseModuleHandler, CoreCourseModuleHandlerData } from '@core/course/providers/module-delegate';
import { CoreCourseProvider } from '@core/course/providers/course';
import { CoreContentLinksHelperProvider } from '@core/contentlinks/providers/helper';
import { AddonModUrlProvider } from './url';
import { AddonModUrlProvider, AddonModUrlUrl } from './url';
import { AddonModUrlHelperProvider } from './helper';
import { CoreConstants } from '@core/constants';
@ -90,7 +90,8 @@ export class AddonModUrlModuleHandler implements CoreCourseModuleHandler {
if (handler.urlProvider.isGetUrlWSAvailable()) {
return handler.urlProvider.getUrl(courseId, module.id).catch(() => {
// Ignore errors.
}).then((url) => {
return undefined;
}).then((url: AddonModUrlUrl) => {
const displayType = handler.urlProvider.getFinalDisplayType(url);
return displayType == CoreConstants.RESOURCELIB_DISPLAY_OPEN ||

View File

@ -21,6 +21,7 @@ import { CoreCourseProvider } from '@core/course/providers/course';
import { CoreCourseLogHelperProvider } from '@core/course/providers/log-helper';
import { CoreConstants } from '@core/constants';
import { CoreSite } from '@classes/site';
import { CoreWSExternalWarning, CoreWSExternalFile } from '@providers/ws';
/**
* Service that provides some features for urls.
@ -44,7 +45,7 @@ export class AddonModUrlProvider {
* @param url URL data.
* @return Final display type.
*/
getFinalDisplayType(url: any): number {
getFinalDisplayType(url: AddonModUrlUrl): number {
if (!url) {
return -1;
}
@ -109,7 +110,7 @@ export class AddonModUrlProvider {
* @param siteId Site ID. If not defined, current site.
* @return Promise resolved when the url is retrieved.
*/
protected getUrlDataByKey(courseId: number, key: string, value: any, siteId?: string): Promise<any> {
protected getUrlDataByKey(courseId: number, key: string, value: any, siteId?: string): Promise<AddonModUrlUrl> {
return this.sitesProvider.getSite(siteId).then((site) => {
const params = {
courseids: [courseId]
@ -119,7 +120,9 @@ export class AddonModUrlProvider {
updateFrequency: CoreSite.FREQUENCY_RARELY
};
return site.read('mod_url_get_urls_by_courses', params, preSets).then((response) => {
return site.read('mod_url_get_urls_by_courses', params, preSets)
.then((response: AddonModUrlGetUrlsByCoursesResult): any => {
if (response && response.urls) {
const currentUrl = response.urls.find((url) => {
return url[key] == value;
@ -142,7 +145,7 @@ export class AddonModUrlProvider {
* @param siteId Site ID. If not defined, current site.
* @return Promise resolved when the url is retrieved.
*/
getUrl(courseId: number, cmId: number, siteId?: string): Promise<any> {
getUrl(courseId: number, cmId: number, siteId?: string): Promise<AddonModUrlUrl> {
return this.getUrlDataByKey(courseId, 'coursemodule', cmId, siteId);
}
@ -231,3 +234,33 @@ export class AddonModUrlProvider {
return this.logHelper.logSingle('mod_url_view_url', params, AddonModUrlProvider.COMPONENT, id, name, 'url', {}, siteId);
}
}
/**
* URL returnd by mod_url_get_urls_by_courses.
*/
export type AddonModUrlUrl = {
id: number; // Module id.
coursemodule: number; // Course module id.
course: number; // Course id.
name: string; // URL name.
intro: string; // Summary.
introformat: number; // Intro format (1 = HTML, 0 = MOODLE, 2 = PLAIN or 4 = MARKDOWN).
introfiles: CoreWSExternalFile[];
externalurl: string; // External URL.
display: number; // How to display the url.
displayoptions: string; // Display options (width, height).
parameters: string; // Parameters to append to the URL.
timemodified: number; // Last time the url was modified.
section: number; // Course section id.
visible: number; // Module visibility.
groupmode: number; // Group mode.
groupingid: number; // Grouping id.
};
/**
* Result of WS mod_url_get_urls_by_courses.
*/
export type AddonModUrlGetUrlsByCoursesResult = {
urls: AddonModUrlUrl[];
warnings?: CoreWSExternalWarning[];
};