192 lines
6.8 KiB
TypeScript

// (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, OnDestroy, Input, ViewChild } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
import { CoreTextUtilsProvider } from '@providers/utils/text';
import { CoreUtilsProvider } from '@providers/utils/utils';
import { CoreSitePluginsProvider } from '../../providers/siteplugins';
import { CoreCourseModuleDelegate, CoreCourseModuleMainComponent } from '@core/course/providers/module-delegate';
import { CoreCourseModulePrefetchDelegate } from '@core/course/providers/module-prefetch-delegate';
import { CoreCourseHelperProvider } from '@core/course/providers/helper';
import { CoreSitePluginsPluginContentComponent } from '../plugin-content/plugin-content';
/**
* Component that displays the index of a module site plugin.
*/
@Component({
selector: 'core-site-plugins-module-index',
templateUrl: 'core-siteplugins-module-index.html',
})
export class CoreSitePluginsModuleIndexComponent implements OnInit, OnDestroy, CoreCourseModuleMainComponent {
@Input() module: any; // The module.
@Input() courseId: number; // Course ID the module belongs to.
@Input() pageTitle: string; // Current page title. It can be used by the "new-content" directives.
@ViewChild(CoreSitePluginsPluginContentComponent) content: CoreSitePluginsPluginContentComponent;
component: string;
method: string;
args: any;
initResult: any;
// Data for context menu.
externalUrl: string;
description: string;
refreshIcon: string;
prefetchStatusIcon: string;
prefetchText: string;
size: string;
displayOpenInBrowser = true;
displayDescription = true;
displayRefresh = true;
displayPrefetch = true;
displaySize = true;
jsData: any; // Data to pass to the component.
protected isDestroyed = false;
protected statusObserver;
constructor(protected sitePluginsProvider: CoreSitePluginsProvider, protected courseHelper: CoreCourseHelperProvider,
protected prefetchDelegate: CoreCourseModulePrefetchDelegate, protected textUtils: CoreTextUtilsProvider,
protected translate: TranslateService, protected utils: CoreUtilsProvider,
protected moduleDelegate: CoreCourseModuleDelegate) { }
/**
* Component being initialized.
*/
ngOnInit(): void {
this.refreshIcon = 'spinner';
if (this.module) {
const handlerName = this.moduleDelegate.getHandlerName(this.module.modname),
handler = this.sitePluginsProvider.getSitePluginHandler(handlerName);
if (handler) {
this.component = handler.plugin.component;
this.method = handler.handlerSchema.method;
this.args = {
courseid: this.courseId,
cmid: this.module.id
};
this.initResult = handler.initResult;
this.jsData = {
module: this.module,
courseId: this.courseId
};
this.displayOpenInBrowser = !this.utils.isFalseOrZero(handler.handlerSchema.displayopeninbrowser);
this.displayDescription = !this.utils.isFalseOrZero(handler.handlerSchema.displaydescription);
this.displayRefresh = !this.utils.isFalseOrZero(handler.handlerSchema.displayrefresh);
this.displayPrefetch = !this.utils.isFalseOrZero(handler.handlerSchema.displayprefetch);
this.displaySize = !this.utils.isFalseOrZero(handler.handlerSchema.displaysize);
}
// Get the data for the context menu.
this.description = this.module.description;
this.externalUrl = this.module.url;
}
}
/**
* Refresh the data.
*
* @param refresher Refresher.
* @param done Function to call when done.
* @return Promise resolved when done.
*/
doRefresh(refresher?: any, done?: () => void): Promise<any> {
if (this.content) {
this.refreshIcon = 'spinner';
return Promise.resolve(this.content.refreshContent(false)).finally(() => {
refresher && refresher.complete();
done && done();
});
} else {
refresher && refresher.complete();
done && done();
return Promise.resolve();
}
}
/**
* Function called when the data of the site plugin content is loaded.
*/
contentLoaded(refresh: boolean): void {
this.refreshIcon = 'refresh';
// Check if there is a prefetch handler for this type of module.
if (this.prefetchDelegate.getPrefetchHandlerFor(this.module)) {
this.courseHelper.fillContextMenu(this, this.module, this.courseId, refresh, this.component);
}
}
/**
* Function called when starting to load the data of the site plugin content.
*/
contentLoading(refresh: boolean): void {
this.refreshIcon = 'spinner';
}
/**
* Expand the description.
*/
expandDescription(): void {
this.textUtils.viewText(this.translate.instant('core.description'), this.description, {
component: this.component,
componentId: this.module.id,
filter: true,
contextLevel: 'module',
instanceId: this.module.id,
courseId: this.courseId,
});
}
/**
* Prefetch the module.
*/
prefetch(): void {
this.courseHelper.contextMenuPrefetch(this, this.module, this.courseId);
}
/**
* Confirm and remove downloaded files.
*/
removeFiles(): void {
this.courseHelper.confirmAndRemoveFiles(this.module, this.courseId);
}
/**
* Component destroyed.
*/
ngOnDestroy(): void {
this.isDestroyed = true;
this.statusObserver && this.statusObserver.off();
}
/**
* Call a certain function on the component instance.
*
* @param name Name of the function to call.
* @param params List of params to send to the function.
* @return Result of the call. Undefined if no component instance or the function doesn't exist.
*/
callComponentFunction(name: string, params?: any[]): any {
return this.content.callComponentFunction(name, params);
}
}