279 lines
5.9 KiB
JavaScript
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;
|
||
|
}
|
||
|
});
|