// (C) Copyright 2015 Moodle Pty Ltd. // // 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 { Component, OnInit, Optional } from '@angular/core'; import { CoreCourseModuleMainResourceComponent } from '@features/course/classes/main-resource-component'; import { CoreCourseContentsPage } from '@features/course/pages/contents/contents'; import { CoreCourse } from '@features/course/services/course'; import { CoreTextUtils } from '@services/utils/text'; import { CoreUtils } from '@services/utils/utils'; import { AddonModPageProvider, AddonModPagePage, AddonModPage } from '../../services/page'; import { AddonModPageHelper } from '../../services/page-helper'; /** * Component that displays a page. */ @Component({ selector: 'addon-mod-page-index', templateUrl: 'addon-mod-page-index.html', styleUrls: ['index.scss'], }) export class AddonModPageIndexComponent extends CoreCourseModuleMainResourceComponent implements OnInit { component = AddonModPageProvider.COMPONENT; contents?: string; displayDescription = true; displayTimemodified = true; timemodified?: number; page?: AddonModPagePage; warning?: string; protected fetchContentDefaultError = 'addon.mod_page.errorwhileloadingthepage'; constructor(@Optional() courseContentsPage?: CoreCourseContentsPage) { super('AddonModPageIndexComponent', courseContentsPage); } /** * Component being initialized. */ async ngOnInit(): Promise { super.ngOnInit(); await this.loadContent(); try { await AddonModPage.logView(this.module.instance, this.module.name); CoreCourse.checkModuleCompletion(this.courseId, this.module.completiondata); } catch { // Ignore errors. } } /** * Perform the invalidate content function. * * @return Resolved when done. */ protected async invalidateContent(): Promise { await AddonModPage.invalidateContent(this.module.id, this.courseId); } /** * @inheritdoc */ protected async fetchContent(refresh?: boolean): Promise { // Download the resource if it needs to be downloaded. const downloadResult = await this.downloadResourceIfNeeded(refresh); // Get contents. No need to refresh, it has been done in downloadResourceIfNeeded. const contents = await CoreCourse.getModuleContents(this.module); const results = await Promise.all([ this.loadPageData(), AddonModPageHelper.getPageHtml(contents, this.module.id), ]); this.contents = results[1]; this.warning = downloadResult?.failed ? this.getErrorDownloadingSomeFilesMessage(downloadResult.error!) : ''; } /** * Load page data from WS. * * @return Promise resolved when done. */ protected async loadPageData(): Promise { // Get latest title, description and some extra data. Data should've been updated in download. this.page = await AddonModPage.getPageData(this.courseId, this.module.id); this.description = this.page.intro; this.dataRetrieved.emit(this.page); // Check if description and timemodified should be displayed. if (this.page.displayoptions) { const options: Record = CoreTextUtils.unserialize(this.page.displayoptions) || {}; this.displayDescription = options.printintro === undefined || CoreUtils.isTrueOrOne(options.printintro); this.displayTimemodified = options.printlastmodified === undefined || CoreUtils.isTrueOrOne(options.printlastmodified); } else { this.displayDescription = true; this.displayTimemodified = true; } this.timemodified = 'timemodified' in this.page ? this.page.timemodified : undefined; } }