cherryext/orun/extjs/static/extjs-upload-widget/lib/upload/Queue.js

279 lines
5.9 KiB
JavaScript

/**
* Data structure managing the upload file queue.
*
*/
Ext.define('Ext.ux.upload.Queue', {
extend : 'Ext.util.MixedCollection',
requires : [
'Ext.ux.upload.Item'
],
/**
* Constructor.
*
* @param {Object} config
*/
constructor : function(config) {
this.callParent(arguments);
this.on('clear', function() {
this.fireEvent('queuechange', this);
}, this);
},
/**
* Adds files to the queue.
*
* @param {FileList} fileList
*/
addFiles : function(fileList) {
var i;
var items = [];
var num = fileList.length;
if (!num) {
return;
}
for (i = 0; i < num; i++) {
items.push(this.createItem(fileList[i]));
}
this.addAll(items);
this.fireEvent('multiadd', this, items);
this.fireEvent('queuechange', this);
},
/**
* Uploaded files are removed, the rest are set as ready.
*/
reset : function() {
this.clearUploadedItems();
this.each(function(item) {
item.reset();
}, this);
},
/**
* Returns all queued items.
*
* @return {Ext.ux.upload.Item[]}
*/
getItems : function() {
return this.getRange();
},
/**
* Returns an array of items by the specified status.
*
* @param {String/Array}
* @return {Ext.ux.upload.Item[]}
*/
getItemsByStatus : function(status) {
var itemsByStatus = [];
this.each(function(item, index, items) {
if (item.hasStatus(status)) {
itemsByStatus.push(item);
}
});
return itemsByStatus;
},
/**
* Returns an array of items, that have already been uploaded.
*
* @return {Ext.ux.upload.Item[]}
*/
getUploadedItems : function() {
return this.getItemsByStatus('uploaded');
},
/**
* Returns an array of items, that have not been uploaded yet.
*
* @return {Ext.ux.upload.Item[]}
*/
getUploadingItems : function() {
return this.getItemsByStatus([
'ready', 'uploading'
]);
},
/**
* Returns true, if there are items, that are currently being uploaded.
*
* @return {Boolean}
*/
existUploadingItems : function() {
return (this.getUploadingItems().length > 0);
},
/**
* Returns the first "ready" item in the queue (with status STATUS_READY).
*
* @return {Ext.ux.upload.Item/null}
*/
getFirstReadyItem : function() {
var items = this.getRange();
var num = this.getCount();
var i;
for (i = 0; i < num; i++) {
if (items[i].isReady()) {
return items[i];
}
}
return null;
},
/**
* Clears all items from the queue.
*/
clearItems : function() {
this.clear();
},
/**
* Removes the items, which have been already uploaded, from the queue.
*/
clearUploadedItems : function() {
this.removeItems(this.getUploadedItems());
},
/**
* Removes items from the queue.
*
* @param {Ext.ux.upload.Item[]} items
*/
removeItems : function(items) {
var num = items.length;
var i;
if (!num) {
return;
}
for (i = 0; i < num; i++) {
this.remove(items[i]);
}
this.fireEvent('queuechange', this);
},
/**
* Removes the items identified by the supplied array of keys.
*
* @param {Array} itemKeys
*/
removeItemsByKey : function(itemKeys) {
var i;
var num = itemKeys.length;
if (!num) {
return;
}
for (i = 0; i < num; i++) {
this.removeItemByKey(itemKeys[i]);
}
this.fireEvent('multiremove', this, itemKeys);
this.fireEvent('queuechange', this);
},
/**
* Removes a single item by its key.
*
* @param {String} key
*/
removeItemByKey : function(key) {
this.removeAtKey(key);
},
/**
* Perform cleanup, after the upload has been aborted.
*/
recoverAfterAbort : function() {
this.each(function(item) {
if (!item.isUploaded() && !item.isReady()) {
item.reset();
}
});
},
/**
* @private
*
* Initialize and return a new queue item for the corresponding File object.
*
* @param {File} file
* @return {Ext.ux.upload.Item}
*/
createItem : function(file) {
var item = Ext.create('Ext.ux.upload.Item', {
fileApiObject : file
});
item.on('changestatus', this.onItemChangeStatus, this);
item.on('progressupdate', this.onItemProgressUpdate, this);
return item;
},
/**
* A getKey() implementation to determine the key of an item in the collection.
*
* @param {Ext.ux.upload.Item} item
* @return {String}
*/
getKey : function(item) {
return item.getId();
},
onItemChangeStatus : function(item, status) {
this.fireEvent('itemchangestatus', this, item, status);
},
onItemProgressUpdate : function(item) {
this.fireEvent('itemprogressupdate', this, item);
},
/**
* Returns true, if the item is the last item in the queue.
*
* @param {Ext.ux.upload.Item} item
* @return {boolean}
*/
isLast : function(item) {
var lastItem = this.last();
if (lastItem && item.getId() == lastItem.getId()) {
return true;
}
return false;
},
/**
* Returns total bytes of all files in the queue.
*
* @return {number}
*/
getTotalBytes : function() {
var bytes = 0;
this.each(function(item, index, length) {
bytes += item.getSize();
}, this);
return bytes;
}
});