forked from EVOgeek/Vmeda.Online
Adds a 'Manage storage' page on the course menu. This page allows users to see how much file storage is being used by each activity, section, and the whole course, and delete the files if required.
164 lines
5.9 KiB
TypeScript
164 lines
5.9 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, ViewChild } from '@angular/core';
|
|
import { IonicPage, Content, NavParams } from 'ionic-angular';
|
|
import { CoreCourseProvider } from '@core/course/providers/course';
|
|
import { CoreCourseModulePrefetchDelegate } from '@core/course/providers/module-prefetch-delegate';
|
|
import { CoreCourseHelperProvider } from '@core/course/providers/helper';
|
|
import { CoreDomUtilsProvider } from '@providers/utils/dom';
|
|
import { TranslateService } from '@ngx-translate/core';
|
|
|
|
/**
|
|
* Page that displays the amount of file storage used by each activity on the course, and allows
|
|
* the user to delete these files.
|
|
*/
|
|
@IonicPage({ segment: 'addon-storagemanager-course-storage' })
|
|
@Component({
|
|
selector: 'page-addon-storagemanager-course-storage',
|
|
templateUrl: 'course-storage.html',
|
|
})
|
|
export class AddonStorageManagerCourseStoragePage {
|
|
@ViewChild(Content) content: Content;
|
|
|
|
course: any;
|
|
loaded: boolean;
|
|
sections: any;
|
|
totalSize: number;
|
|
|
|
constructor(navParams: NavParams,
|
|
private courseProvider: CoreCourseProvider,
|
|
private prefetchDelegate: CoreCourseModulePrefetchDelegate,
|
|
private courseHelperProvider: CoreCourseHelperProvider,
|
|
private domUtils: CoreDomUtilsProvider,
|
|
private translate: TranslateService) {
|
|
|
|
this.course = navParams.get('course');
|
|
}
|
|
|
|
/**
|
|
* View loaded.
|
|
*/
|
|
ionViewDidLoad(): void {
|
|
this.courseProvider.getSections(this.course.id, false, true).then((sections) => {
|
|
this.courseHelperProvider.addHandlerDataForModules(sections, this.course.id);
|
|
this.sections = sections;
|
|
this.totalSize = 0;
|
|
|
|
const allPromises = [];
|
|
this.sections.forEach((section) => {
|
|
section.totalSize = 0;
|
|
section.modules.forEach((module) => {
|
|
module.parentSection = section;
|
|
// Note: This function only gets the size for modules which are downloadable.
|
|
// For other modules it always returns 0, even if they have downloaded some files.
|
|
// However there is no 100% reliable way to actually track the files in this case.
|
|
// You can maybe guess it based on the component and componentid.
|
|
// But these aren't necessarily consistent, for example mod_frog vs mmaModFrog.
|
|
// There is nothing enforcing correct values.
|
|
// Most modules which have large files are downloadable, so I think this is sufficient.
|
|
const promise = this.prefetchDelegate.getModuleDownloadedSize(module, this.course.id).
|
|
then((size) => {
|
|
module.totalSize = size;
|
|
section.totalSize += size;
|
|
this.totalSize += size;
|
|
});
|
|
allPromises.push(promise);
|
|
});
|
|
});
|
|
|
|
Promise.all(allPromises).then(() => {
|
|
this.loaded = true;
|
|
});
|
|
});
|
|
}
|
|
|
|
/**
|
|
* The user has requested a delete for the whole course data.
|
|
*
|
|
* (This works by deleting data for each module on the course that has data.)
|
|
*/
|
|
deleteForCourse(): void {
|
|
const modules = [];
|
|
this.sections.forEach((section) => {
|
|
section.modules.forEach((module) => {
|
|
if (module.totalSize > 0) {
|
|
modules.push(module);
|
|
}
|
|
});
|
|
});
|
|
|
|
this.deleteModules(modules);
|
|
}
|
|
|
|
/**
|
|
* The user has requested a delete for a section's data.
|
|
*
|
|
* (This works by deleting data for each module in the section that has data.)
|
|
*
|
|
* @param {any} section Section object with information about section and modules
|
|
*/
|
|
deleteForSection(section: any): void {
|
|
const modules = [];
|
|
section.modules.forEach((module) => {
|
|
if (module.totalSize > 0) {
|
|
modules.push(module);
|
|
}
|
|
});
|
|
|
|
this.deleteModules(modules);
|
|
}
|
|
|
|
/**
|
|
* The user has requested a delete for a module's data
|
|
*
|
|
* @param {any} module Module details
|
|
*/
|
|
deleteForModule(module: any): void {
|
|
if (module.totalSize > 0) {
|
|
this.deleteModules([module]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Deletes the specified modules, showing the loading overlay while it happens.
|
|
*
|
|
* @param {any[]} modules Modules to delete
|
|
* @return Promise<void> Once deleting has finished
|
|
*/
|
|
protected deleteModules(modules: any[]): Promise<void> {
|
|
const modal = this.domUtils.showModalLoading();
|
|
|
|
const promises = [];
|
|
modules.forEach((module) => {
|
|
// Remove the files.
|
|
const promise = this.prefetchDelegate.removeModuleFiles(module, this.course.id).then(() => {
|
|
// When the files are removed, update the size.
|
|
module.parentSection.totalSize -= module.totalSize;
|
|
this.totalSize -= module.totalSize;
|
|
module.totalSize = 0;
|
|
});
|
|
promises.push(promise);
|
|
});
|
|
|
|
return Promise.all(promises).then(() => {
|
|
modal.dismiss();
|
|
}).catch((error) => {
|
|
modal.dismiss();
|
|
|
|
this.domUtils.showErrorModalDefault(error, this.translate.instant('core.errordeletefile'));
|
|
});
|
|
}
|
|
}
|