Vmeda.Online/src/providers/file-session.ts

148 lines
5.5 KiB
TypeScript
Raw Normal View History

// (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 { Injectable } from '@angular/core';
import { CoreSitesProvider } from './sites';
/**
* Helper to store some temporary data for file submission.
*
* It uses siteId and component name to index the files.
* Every component can provide a File area identifier to indentify every file list on the session.
* This value can be the activity id or a mix of name and numbers.
*/
@Injectable()
export class CoreFileSessionProvider {
protected files = {};
constructor(private sitesProvider: CoreSitesProvider) {}
/**
* Add a file to the session.
*
* @param {string} component Component Name.
* @param {string|number} id File area identifier.
* @param {any} file File to add.
* @param {string} [siteId] Site ID. If not defined, current site.
*/
addFile(component: string, id: string|number, file: any, siteId?: string) : void {
siteId = siteId || this.sitesProvider.getCurrentSiteId();
this.initFileArea(component, id, siteId);
this.files[siteId][component][id].push(file);
}
/**
* Clear files stored in session.
*
* @param {string} component Component Name.
* @param {string|number} id File area identifier.
* @param {string} [siteId] Site ID. If not defined, current site.
*/
clearFiles(component: string, id: string|number, siteId?: string) : void {
siteId = siteId || this.sitesProvider.getCurrentSiteId();
if (this.files[siteId] && this.files[siteId][component] && this.files[siteId][component][id]) {
this.files[siteId][component][id] = [];
}
}
/**
* Get files stored in session.
*
* @param {string} component Component Name.
* @param {string|number} id File area identifier.
* @param {string} [siteId] Site ID. If not defined, current site.
* @return {any[]} Array of files in session.
*/
getFiles(component: string, id: string|number, siteId?: string) : any[] {
siteId = siteId || this.sitesProvider.getCurrentSiteId();
if (this.files[siteId] && this.files[siteId][component] && this.files[siteId][component][id]) {
return this.files[siteId][component][id];
}
return [];
}
/**
* Initializes the filearea to store the file.
*
* @param {string} component Component Name.
* @param {string|number} id File area identifier.
* @param {string} [siteId] Site ID. If not defined, current site.
*/
protected initFileArea(component: string, id: string|number, siteId?: string) : void {
if (!this.files[siteId]) {
this.files[siteId] = {};
}
if (!this.files[siteId][component]) {
this.files[siteId][component] = {};
}
if (!this.files[siteId][component][id]) {
this.files[siteId][component][id] = [];
}
}
/**
* Remove a file stored in session.
*
* @param {string} component Component Name.
* @param {string|number} id File area identifier.
* @param {any} file File to remove. The instance should be exactly the same as the one stored in session.
* @param {string} [siteId] Site ID. If not defined, current site.
*/
removeFile(component: string, id: string|number, file: any, siteId?: string) : void {
siteId = siteId || this.sitesProvider.getCurrentSiteId();
if (this.files[siteId] && this.files[siteId][component] && this.files[siteId][component][id]) {
const position = this.files[siteId][component][id].indexOf(file);
if (position != -1) {
this.files[siteId][component][id].splice(position, 1);
}
}
}
/**
* Remove a file stored in session.
*
* @param {string} component Component Name.
* @param {string|number} id File area identifier.
* @param {number} index Position of the file to remove.
* @param {string} [siteId] Site ID. If not defined, current site.
*/
removeFileByIndex(component: string, id: string|number, index: number, siteId?: string) : void {
siteId = siteId || this.sitesProvider.getCurrentSiteId();
if (this.files[siteId] && this.files[siteId][component] && this.files[siteId][component][id] && index >= 0 &&
index < this.files[siteId][component][id].length) {
this.files[siteId][component][id].splice(index, 1);
}
}
/**
* Set a group of files in the session.
*
* @param {string} component Component Name.
* @param {string|number} id File area identifier.
* @param {any[]} newFiles Files to set.
* @param {string} [siteId] Site ID. If not defined, current site.
*/
setFiles(component: string, id: string|number, newFiles: any[], siteId?: string) : void {
siteId = siteId || this.sitesProvider.getCurrentSiteId();
this.initFileArea(component, id, siteId);
this.files[siteId][component][id] = newFiles;
}
}