diff --git a/src/addon/mod/book/components/index/index.ts b/src/addon/mod/book/components/index/index.ts index 794d4970c..267c0343a 100644 --- a/src/addon/mod/book/components/index/index.ts +++ b/src/addon/mod/book/components/index/index.ts @@ -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. })); diff --git a/src/addon/mod/book/providers/book.ts b/src/addon/mod/book/providers/book.ts index 1e97a6749..d1061ef65 100644 --- a/src/addon/mod/book/providers/book.ts +++ b/src/addon/mod/book/providers/book.ts @@ -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 { + getBook(courseId: number, cmId: number, siteId?: string): Promise { 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 { + protected getBookByField(courseId: number, key: string, value: any, siteId?: string): Promise { 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[]; +}; diff --git a/src/addon/mod/folder/components/index/index.ts b/src/addon/mod/folder/components/index/index.ts index d23b70e38..dc9b246dd 100644 --- a/src/addon/mod/folder/components/index/index.ts +++ b/src/addon/mod/folder/components/index/index.ts @@ -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. diff --git a/src/addon/mod/folder/providers/folder.ts b/src/addon/mod/folder/providers/folder.ts index 989a0c69a..c472ce0f6 100644 --- a/src/addon/mod/folder/providers/folder.ts +++ b/src/addon/mod/folder/providers/folder.ts @@ -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 { + getFolder(courseId: number, cmId: number, siteId?: string): Promise { 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 { + protected getFolderByKey(courseId: number, key: string, value: any, siteId?: string): Promise { 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[]; +}; diff --git a/src/addon/mod/imscp/components/index/index.ts b/src/addon/mod/imscp/components/index/index.ts index 37edb9b87..6940db0d8 100644 --- a/src/addon/mod/imscp/components/index/index.ts +++ b/src/addon/mod/imscp/components/index/index.ts @@ -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); })); diff --git a/src/addon/mod/imscp/providers/imscp.ts b/src/addon/mod/imscp/providers/imscp.ts index 366cb7bf6..45adb57f1 100644 --- a/src/addon/mod/imscp/providers/imscp.ts +++ b/src/addon/mod/imscp/providers/imscp.ts @@ -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 { + protected getImscpByKey(courseId: number, key: string, value: any, siteId?: string): Promise { 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 { + getImscp(courseId: number, cmId: number, siteId?: string): Promise { 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[]; +}; diff --git a/src/addon/mod/label/providers/label.ts b/src/addon/mod/label/providers/label.ts index ec75856b6..64e3d5c31 100644 --- a/src/addon/mod/label/providers/label.ts +++ b/src/addon/mod/label/providers/label.ts @@ -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 { + siteId?: string): Promise { 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 { + getLabel(courseId: number, cmId: number, forceCache?: boolean, ignoreCache?: boolean, siteId?: string) + : Promise { 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 { + getLabelById(courseId: number, labelId: number, forceCache?: boolean, ignoreCache?: boolean, siteId?: string) + : Promise { 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[]; +}; diff --git a/src/addon/mod/page/components/index/index.ts b/src/addon/mod/page/components/index/index.ts index bc6b76671..a4297216c 100644 --- a/src/addon/mod/page/components/index/index.ts +++ b/src/addon/mod/page/components/index/index.ts @@ -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' || diff --git a/src/addon/mod/page/providers/page.ts b/src/addon/mod/page/providers/page.ts index ba42a2412..f41739e9a 100644 --- a/src/addon/mod/page/providers/page.ts +++ b/src/addon/mod/page/providers/page.ts @@ -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 { + getPageData(courseId: number, cmId: number, siteId?: string): Promise { 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 { + protected getPageByKey(courseId: number, key: string, value: any, siteId?: string): Promise { 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[]; +}; diff --git a/src/addon/mod/resource/providers/module-handler.ts b/src/addon/mod/resource/providers/module-handler.ts index f4a9888bf..b4c6b1b32 100644 --- a/src/addon/mod/resource/providers/module-handler.ts +++ b/src/addon/mod/resource/providers/module-handler.ts @@ -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 { const promises = []; - let infoFiles = [], + let infoFiles: CoreWSExternalFile[] = [], options: any = {}; // Check if the button needs to be shown or not. diff --git a/src/addon/mod/resource/providers/resource.ts b/src/addon/mod/resource/providers/resource.ts index 05c8e4620..19305d71d 100644 --- a/src/addon/mod/resource/providers/resource.ts +++ b/src/addon/mod/resource/providers/resource.ts @@ -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 { + protected getResourceDataByKey(courseId: number, key: string, value: any, siteId?: string): Promise { 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 { + getResourceData(courseId: number, cmId: number, siteId?: string): Promise { 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[]; +}; diff --git a/src/addon/mod/url/providers/module-handler.ts b/src/addon/mod/url/providers/module-handler.ts index 05f475d59..d1ef86acd 100644 --- a/src/addon/mod/url/providers/module-handler.ts +++ b/src/addon/mod/url/providers/module-handler.ts @@ -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 || diff --git a/src/addon/mod/url/providers/url.ts b/src/addon/mod/url/providers/url.ts index 28ffe8da8..cd8f9e1fe 100644 --- a/src/addon/mod/url/providers/url.ts +++ b/src/addon/mod/url/providers/url.ts @@ -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 { + protected getUrlDataByKey(courseId: number, key: string, value: any, siteId?: string): Promise { 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 { + getUrl(courseId: number, cmId: number, siteId?: string): Promise { 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[]; +};