// (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 { Injectable, Injector } from '@angular/core'; import { CoreSitesProvider } from '@providers/sites'; import { CoreFilepoolProvider } from '@providers/filepool'; import { CoreCourseOptionsHandler, CoreCourseOptionsHandlerData } from '@core/course/providers/options-delegate'; import { CoreCoursesProvider } from '@core/courses/providers/courses'; import { CoreCourseProvider } from '@core/course/providers/course'; import { CoreCourseHelperProvider } from '@core/course/providers/helper'; import { AddonBlogEntriesComponent } from '../components/entries/entries'; import { AddonBlogProvider } from './blog'; import { CoreWSExternalFile } from '@providers/ws'; /** * Course nav handler. */ @Injectable() export class AddonBlogCourseOptionHandler implements CoreCourseOptionsHandler { name = 'AddonBlog'; priority = 100; constructor(protected coursesProvider: CoreCoursesProvider, protected blogProvider: AddonBlogProvider, protected courseHelper: CoreCourseHelperProvider, protected courseProvider: CoreCourseProvider, protected sitesProvider: CoreSitesProvider, protected filepoolProvider: CoreFilepoolProvider) {} /** * Should invalidate the data to determine if the handler is enabled for a certain course. * * @param courseId The course ID. * @param navOptions Course navigation options for current user. See CoreCoursesProvider.getUserNavigationOptions. * @param admOptions Course admin options for current user. See CoreCoursesProvider.getUserAdministrationOptions. * @return Promise resolved when done. */ invalidateEnabledForCourse(courseId: number, navOptions?: any, admOptions?: any): Promise { return this.courseProvider.invalidateCourseBlocks(courseId); } /** * Check if the handler is enabled on a site level. * * @return Whether or not the handler is enabled on a site level. */ isEnabled(): boolean | Promise { return this.blogProvider.isPluginEnabled(); } /** * Whether or not the handler is enabled for a certain course. * * @param courseId The course ID. * @param accessData Access type and data. Default, guest, ... * @param navOptions Course navigation options for current user. See CoreCoursesProvider.getUserNavigationOptions. * @param admOptions Course admin options for current user. See CoreCoursesProvider.getUserAdministrationOptions. * @return True or promise resolved with true if enabled. */ isEnabledForCourse(courseId: number, accessData: any, navOptions?: any, admOptions?: any): boolean | Promise { return this.courseHelper.hasABlockNamed(courseId, 'blog_menu').then((enabled) => { if (enabled && navOptions && typeof navOptions.blogs != 'undefined') { return navOptions.blogs; } return enabled; }); } /** * Returns the data needed to render the handler. * * @param injector Injector. * @param course The course. * @return Data or promise resolved with the data. */ getDisplayData(injector: Injector, course: any): CoreCourseOptionsHandlerData | Promise { return { title: 'addon.blog.blog', class: 'addon-blog-handler', component: AddonBlogEntriesComponent }; } /** * Called when a course is downloaded. It should prefetch all the data to be able to see the addon in offline. * * @param course The course. * @return Promise resolved when done. */ prefetch(course: any): Promise { const siteId = this.sitesProvider.getCurrentSiteId(); return this.blogProvider.getEntries({courseid: course.id}).then((result) => { return result.entries.map((entry) => { let files: CoreWSExternalFile[] = []; if (entry.attachmentfiles && entry.attachmentfiles.length) { files = entry.attachmentfiles; } if (entry.summaryfiles && entry.summaryfiles.length) { files = files.concat(entry.summaryfiles); } if (files.length > 0) { return this.filepoolProvider.addFilesToQueue(siteId, files, entry.module, entry.id); } return Promise.resolve(); }); }); } }