UNPKG

infusion

Version:

Infusion is an application framework for developing flexible stuff with JavaScript

191 lines (171 loc) 6.35 kB
/* Copyright The Infusion copyright holders See the AUTHORS.md file at the top-level directory of this distribution and at https://github.com/fluid-project/infusion/raw/main/AUTHORS.md. Licensed under the Educational Community License (ECL), Version 2.0 or the New BSD license. You may not use this file except in compliance with one these Licenses. You may obtain a copy of the ECL 2.0 License and BSD License at https://github.com/fluid-project/infusion/raw/main/Infusion-LICENSE.txt */ "use strict"; fluid.registerNamespace("fluid.uploader"); fluid.defaults("fluid.uploader.fileQueue", { gradeNames: ["fluid.component"], members: { files: [], isUploading: false }, invokers: { /******************** * Queue Operations * ********************/ start: { funcName: "fluid.uploader.fileQueue.start", args: "{that}" }, startFile: { funcName: "fluid.uploader.fileQueue.startFile", args: "{that}.currentBatch" }, finishFile: { funcName: "fluid.uploader.fileQueue.finishFile", args: "{that}.currentBatch" }, shouldUploadNextFile: { funcName: "fluid.uploader.fileQueue.shouldUploadNextFile", args: "{that}" }, /***************************** * File manipulation methods * *****************************/ addFile: { funcName: "fluid.uploader.fileQueue.addFile", args: ["{that}.files", "{arguments}.0"] }, removeFile: { funcName: "fluid.uploader.fileQueue.removeFile", args: ["{that}.files", "{arguments}.0"] }, /********************** * Queue Info Methods * **********************/ totalBytes: { funcName: "fluid.uploader.fileQueue.sizeOfFiles", args: "{that}.files" }, getReadyFiles: { funcName: "fluid.uploader.fileQueue.filesByStatus", args: ["{that}.files", ["QUEUED", "CANCELLED"]] }, getErroredFiles: { funcName: "fluid.uploader.fileQueue.filesByStatus", args: ["{that}.files", "ERROR"] }, getUploadedFiles: { funcName: "fluid.uploader.fileQueue.filesByStatus", args: ["{that}.files", "COMPLETE"] }, sizeOfReadyFiles: { funcName: "fluid.uploader.fileQueue.sizeOfFilesByStatus", args: ["{that}.files", ["QUEUED", "CANCELLED"]] }, sizeOfUploadedFiles: { funcName: "fluid.uploader.fileQueue.sizeOfFilesByStatus", args: ["{that}.files", "COMPLETE"] }, /***************** * Batch Methods * *****************/ setupCurrentBatch: { funcName: "fluid.uploader.fileQueue.setupCurrentBatch", args: "{that}" }, clearCurrentBatch: { funcName: "fluid.uploader.fileQueue.clearCurrentBatch", args: "{that}" }, updateCurrentBatch: { funcName: "fluid.uploader.fileQueue.updateCurrentBatch", args: [{expander: {func: "{that}.getReadyFiles"}}, "{that}.currentBatch"] }, updateBatchStatus: { funcName: "fluid.uploader.fileQueue.updateBatchStatus", args: ["{arguments}.0", "{that}.currentBatch"] } } }); fluid.uploader.fileQueue.start = function (that) { that.setupCurrentBatch(); that.isUploading = true; that.shouldStop = false; }; fluid.uploader.fileQueue.startFile = function (currentBatch) { currentBatch.fileIdx++; currentBatch.bytesUploadedForFile = 0; currentBatch.previousBytesUploadedForFile = 0; }; fluid.uploader.fileQueue.finishFile = function (currentBatch) { currentBatch.numFilesCompleted++; }; fluid.uploader.fileQueue.shouldUploadNextFile = function (that) { return !that.shouldStop && that.isUploading && (that.currentBatch.numFilesCompleted + that.currentBatch.numFilesErrored) < that.currentBatch.files.length; }; fluid.uploader.fileQueue.addFile = function (files, file) { files.push(file); }; fluid.uploader.fileQueue.removeFile = function (files, file) { fluid.remove_if(files, function (thisFile) { return file === thisFile; }); }; fluid.uploader.fileQueue.sizeOfFiles = function (files) { return files.reduce(function (totalBytes, file) { return totalBytes + file.size; }, 0); }; fluid.uploader.fileQueue.filterFiles = function (files, filterFn) { var filteredFiles = []; // filterFn returns TRUE for the files we want return fluid.remove_if(fluid.makeArray(files), filterFn, filteredFiles); }; fluid.uploader.fileQueue.filesByStatus = function (files, statuses) { statuses = fluid.makeArray(statuses); return fluid.uploader.fileQueue.filterFiles(files, function (file) { return fluid.find_if(statuses, function (status) { return file.filestatus === fluid.uploader.fileStatusConstants[status]; }); }); }; fluid.uploader.fileQueue.sizeOfFilesByStatus = function (files, statuses) { files = fluid.uploader.fileQueue.filesByStatus(files, statuses); return fluid.uploader.fileQueue.sizeOfFiles(files); }; fluid.uploader.fileQueue.setupCurrentBatch = function (that) { that.clearCurrentBatch(); that.updateCurrentBatch(); }; fluid.uploader.fileQueue.clearCurrentBatch = function (that) { that.currentBatch = { fileIdx: 0, files: [], totalBytes: 0, numFilesCompleted: 0, numFilesErrored: 0, bytesUploadedForFile: 0, previousBytesUploadedForFile: 0, totalBytesUploaded: 0 }; }; fluid.uploader.fileQueue.updateCurrentBatch = function (readyFiles, currentBatch) { currentBatch.files = readyFiles; currentBatch.totalBytes = fluid.uploader.fileQueue.sizeOfFiles(readyFiles); }; fluid.uploader.fileQueue.updateBatchStatus = function (currentBytes, currentBatch) { var byteIncrement = currentBytes - currentBatch.previousBytesUploadedForFile; currentBatch.totalBytesUploaded += byteIncrement; currentBatch.bytesUploadedForFile += byteIncrement; currentBatch.previousBytesUploadedForFile = currentBytes; };