2019-07-01 09:22:58 +02:00

101 lines
3.1 KiB
TypeScript

// (C) Copyright 2015 Martin Dougiamas
//
// 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, ViewChildren, Input, OnInit, QueryList } from '@angular/core';
import { CoreDomUtilsProvider } from '@providers/utils/dom';
import { CoreBlockComponent } from '../block/block';
import { CoreBlockDelegate } from '../../providers/delegate';
import { CoreCourseProvider } from '@core/course/providers/course';
/**
* Component that displays the list of course blocks.
*/
@Component({
selector: 'core-block-course-blocks',
templateUrl: 'core-block-course-blocks.html',
})
export class CoreBlockCourseBlocksComponent implements OnInit {
@Input() courseId: number;
@ViewChildren(CoreBlockComponent) blocksComponents: QueryList<CoreBlockComponent>;
dataLoaded = false;
hasContent: boolean;
hasSupportedBlock: boolean;
blocks = [];
constructor(private domUtils: CoreDomUtilsProvider, private courseProvider: CoreCourseProvider,
private blockDelegate: CoreBlockDelegate) {
}
/**
* Component being initialized.
*/
ngOnInit(): void {
this.loadContent().finally(() => {
this.dataLoaded = true;
});
}
/**
* Refresh the data.
*
* @param {any} refresher Refresher.
*/
doRefresh(refresher: any): void {
const promises = [];
if (this.courseProvider.canGetCourseBlocks()) {
promises.push(this.courseProvider.invalidateCourseBlocks(this.courseId));
}
// Invalidate the blocks.
this.blocksComponents.forEach((blockComponent) => {
promises.push(blockComponent.invalidate().catch(() => {
// Ignore errors.
}));
});
Promise.all(promises).finally(() => {
this.loadContent().finally(() => {
refresher.complete();
});
});
}
/**
* Convenience function to fetch the data.
*
* @return {Promise<any>} Promise resolved when done.
*/
protected loadContent(): Promise<any> {
// Get site home blocks.
const canGetBlocks = this.courseProvider.canGetCourseBlocks(),
promise = canGetBlocks ? this.courseProvider.getCourseBlocks(this.courseId) : Promise.reject(null);
return promise.then((blocks) => {
this.blocks = blocks;
this.hasSupportedBlock = this.blockDelegate.hasSupportedBlock(blocks);
}).catch((error) => {
if (canGetBlocks) {
this.domUtils.showErrorModal(error);
}
this.blocks = [];
});
}
}