From d15309a509b281b68e2c097dc9a2a942dcfd8b35 Mon Sep 17 00:00:00 2001 From: Marthyn Olthof Date: Tue, 3 Jan 2017 07:25:11 +0100 Subject: [PATCH 1/3] Bump to version 2.4.1 --- .../javascripts/angularjs-file-upload.js | 3409 +++++++++-------- 1 file changed, 1749 insertions(+), 1660 deletions(-) diff --git a/app/assets/javascripts/angularjs-file-upload.js b/app/assets/javascripts/angularjs-file-upload.js index 784e3a3..40ab8d4 100644 --- a/app/assets/javascripts/angularjs-file-upload.js +++ b/app/assets/javascripts/angularjs-file-upload.js @@ -1,5 +1,5 @@ /* - angular-file-upload v2.2.0 + angular-file-upload v2.4.0 https://github.com/nervgh/angular-file-upload */ @@ -59,35 +59,63 @@ return /******/ (function(modules) { // webpackBootstrap /* 0 */ /***/ function(module, exports, __webpack_require__) { - "use strict"; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; - - var CONFIG = _interopRequire(__webpack_require__(1)); - - var options = _interopRequire(__webpack_require__(2)); - - var serviceFileUploader = _interopRequire(__webpack_require__(3)); - - var serviceFileLikeObject = _interopRequire(__webpack_require__(4)); - - var serviceFileItem = _interopRequire(__webpack_require__(5)); - - var serviceFileDirective = _interopRequire(__webpack_require__(6)); - - var serviceFileSelect = _interopRequire(__webpack_require__(7)); - - var serviceFileDrop = _interopRequire(__webpack_require__(8)); - - var serviceFileOver = _interopRequire(__webpack_require__(9)); - - var directiveFileSelect = _interopRequire(__webpack_require__(10)); - - var directiveFileDrop = _interopRequire(__webpack_require__(11)); - - var directiveFileOver = _interopRequire(__webpack_require__(12)); - - angular.module(CONFIG.name, []).value("fileUploaderOptions", options).factory("FileUploader", serviceFileUploader).factory("FileLikeObject", serviceFileLikeObject).factory("FileItem", serviceFileItem).factory("FileDirective", serviceFileDirective).factory("FileSelect", serviceFileSelect).factory("FileDrop", serviceFileDrop).factory("FileOver", serviceFileOver).directive("nvFileSelect", directiveFileSelect).directive("nvFileDrop", directiveFileDrop).directive("nvFileOver", directiveFileOver).run(["FileUploader", "FileLikeObject", "FileItem", "FileDirective", "FileSelect", "FileDrop", "FileOver", function (FileUploader, FileLikeObject, FileItem, FileDirective, FileSelect, FileDrop, FileOver) { + 'use strict'; + + var _config = __webpack_require__(1); + + var _config2 = _interopRequireDefault(_config); + + var _options = __webpack_require__(2); + + var _options2 = _interopRequireDefault(_options); + + var _FileUploader = __webpack_require__(3); + + var _FileUploader2 = _interopRequireDefault(_FileUploader); + + var _FileLikeObject = __webpack_require__(4); + + var _FileLikeObject2 = _interopRequireDefault(_FileLikeObject); + + var _FileItem = __webpack_require__(5); + + var _FileItem2 = _interopRequireDefault(_FileItem); + + var _FileDirective = __webpack_require__(6); + + var _FileDirective2 = _interopRequireDefault(_FileDirective); + + var _FileSelect = __webpack_require__(7); + + var _FileSelect2 = _interopRequireDefault(_FileSelect); + + var _Pipeline = __webpack_require__(8); + + var _Pipeline2 = _interopRequireDefault(_Pipeline); + + var _FileDrop = __webpack_require__(9); + + var _FileDrop2 = _interopRequireDefault(_FileDrop); + + var _FileOver = __webpack_require__(10); + + var _FileOver2 = _interopRequireDefault(_FileOver); + + var _FileSelect3 = __webpack_require__(11); + + var _FileSelect4 = _interopRequireDefault(_FileSelect3); + + var _FileDrop3 = __webpack_require__(12); + + var _FileDrop4 = _interopRequireDefault(_FileDrop3); + + var _FileOver3 = __webpack_require__(13); + + var _FileOver4 = _interopRequireDefault(_FileOver3); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + angular.module(_config2.default.name, []).value('fileUploaderOptions', _options2.default).factory('FileUploader', _FileUploader2.default).factory('FileLikeObject', _FileLikeObject2.default).factory('FileItem', _FileItem2.default).factory('FileDirective', _FileDirective2.default).factory('FileSelect', _FileSelect2.default).factory('FileDrop', _FileDrop2.default).factory('FileOver', _FileOver2.default).factory('Pipeline', _Pipeline2.default).directive('nvFileSelect', _FileSelect4.default).directive('nvFileDrop', _FileDrop4.default).directive('nvFileOver', _FileOver4.default).run(['FileUploader', 'FileLikeObject', 'FileItem', 'FileDirective', 'FileSelect', 'FileDrop', 'FileOver', 'Pipeline', function (FileUploader, FileLikeObject, FileItem, FileDirective, FileSelect, FileDrop, FileOver, Pipeline) { // only for compatibility FileUploader.FileLikeObject = FileLikeObject; FileUploader.FileItem = FileItem; @@ -95,6 +123,7 @@ return /******/ (function(modules) { // webpackBootstrap FileUploader.FileSelect = FileSelect; FileUploader.FileDrop = FileDrop; FileUploader.FileOver = FileOver; + FileUploader.Pipeline = Pipeline; }]); /***/ }, @@ -109,51 +138,65 @@ return /******/ (function(modules) { // webpackBootstrap /* 2 */ /***/ function(module, exports) { - "use strict"; - - module.exports = { - url: "/", - alias: "file", + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + exports.default = { + url: '/', + alias: 'file', headers: {}, queue: [], progress: 0, autoUpload: false, removeAfterUpload: false, - method: "POST", + method: 'POST', filters: [], formData: [], queueLimit: Number.MAX_VALUE, - withCredentials: false + withCredentials: false, + disableMultipart: false }; /***/ }, /* 3 */ /***/ function(module, exports, __webpack_require__) { - "use strict"; - - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; - - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; - - var CONFIG = _interopRequire(__webpack_require__(1)); - - var copy = angular.copy; - var extend = angular.extend; - var forEach = angular.forEach; - var isObject = angular.isObject; - var isNumber = angular.isNumber; - var isDefined = angular.isDefined; - var isArray = angular.isArray; - var element = angular.element; - - module.exports = function (fileUploaderOptions, $rootScope, $http, $window, FileLikeObject, FileItem) { + 'use strict'; + + Object.defineProperty(exports, "__esModule", { + value: true + }); + + var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + + exports.default = __identity; + + var _config = __webpack_require__(1); + + var _config2 = _interopRequireDefault(_config); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + + var _angular = angular; + var bind = _angular.bind; + var copy = _angular.copy; + var extend = _angular.extend; + var forEach = _angular.forEach; + var isObject = _angular.isObject; + var isNumber = _angular.isNumber; + var isDefined = _angular.isDefined; + var isArray = _angular.isArray; + var isUndefined = _angular.isUndefined; + var element = _angular.element; + function __identity(fileUploaderOptions, $rootScope, $http, $window, $timeout, FileLikeObject, FileItem, Pipeline) { var File = $window.File; var FormData = $window.FormData; - - var FileUploader = (function () { + + var FileUploader = function () { /********************** * PUBLIC **********************/ @@ -162,856 +205,840 @@ return /******/ (function(modules) { // webpackBootstrap * @param {Object} [options] * @constructor */ - + function FileUploader(options) { _classCallCheck(this, FileUploader); - + var settings = copy(fileUploaderOptions); - + extend(this, settings, options, { isUploading: false, _nextIndex: 0, - _failFilterIndex: -1, _directives: { select: [], drop: [], over: [] } }); - + // add default filters - this.filters.unshift({ name: "queueLimit", fn: this._queueLimitFilter }); - this.filters.unshift({ name: "folder", fn: this._folderFilter }); + this.filters.unshift({ name: 'queueLimit', fn: this._queueLimitFilter }); + this.filters.unshift({ name: 'folder', fn: this._folderFilter }); } - - _createClass(FileUploader, { - addToQueue: { - /** - * Adds items to the queue - * @param {File|HTMLInputElement|Object|FileList|Array} files - * @param {Object} [options] - * @param {Array|String} filters - */ - - value: function addToQueue(files, options, filters) { - var _this = this; - - var list = this.isArrayLikeObject(files) ? files : [files]; - var arrayOfFilters = this._getFilters(filters); - var count = this.queue.length; - var addedFileItems = []; - - forEach(list, function (some /*{File|HTMLInputElement|Object}*/) { - var temp = new FileLikeObject(some); - - if (_this._isValidFile(temp, arrayOfFilters, options)) { - var fileItem = new FileItem(_this, some, options); - addedFileItems.push(fileItem); - _this.queue.push(fileItem); - _this._onAfterAddingFile(fileItem); - } else { - var filter = arrayOfFilters[_this._failFilterIndex]; - _this._onWhenAddingFileFailed(temp, filter, options); - } - }); - - if (this.queue.length !== count) { - this._onAfterAddingAll(addedFileItems); - this.progress = this._getTotalProgress(); - } - - this._render(); - if (this.autoUpload) this.uploadAll(); - } - }, - removeFromQueue: { - /** - * Remove items from the queue. Remove last: index = -1 - * @param {FileItem|Number} value - */ - - value: function removeFromQueue(value) { - var index = this.getIndexOfItem(value); - var item = this.queue[index]; - if (item.isUploading) item.cancel(); - this.queue.splice(index, 1); - item._destroy(); - this.progress = this._getTotalProgress(); - } - }, - clearQueue: { - /** - * Clears the queue - */ - - value: function clearQueue() { - while (this.queue.length) { - this.queue[0].remove(); - } - this.progress = 0; - } - }, - uploadItem: { - /** - * Uploads a item from the queue - * @param {FileItem|Number} value - */ - - value: function uploadItem(value) { - var index = this.getIndexOfItem(value); - var item = this.queue[index]; - var transport = this.isHTML5 ? "_xhrTransport" : "_iframeTransport"; - - item._prepareToUploading(); - if (this.isUploading) { - return; - }this.isUploading = true; - this[transport](item); - } - }, - cancelItem: { - /** - * Cancels uploading of item from the queue - * @param {FileItem|Number} value - */ - - value: function cancelItem(value) { - var index = this.getIndexOfItem(value); - var item = this.queue[index]; - var prop = this.isHTML5 ? "_xhr" : "_form"; - if (item && item.isUploading) item[prop].abort(); - } - }, - uploadAll: { - /** - * Uploads all not uploaded items of queue - */ - - value: function uploadAll() { - var items = this.getNotUploadedItems().filter(function (item) { - return !item.isUploading; - }); - if (!items.length) { - return; - }forEach(items, function (item) { - return item._prepareToUploading(); - }); - items[0].upload(); - } - }, - cancelAll: { - /** - * Cancels all uploads - */ - - value: function cancelAll() { - var items = this.getNotUploadedItems(); - forEach(items, function (item) { - return item.cancel(); - }); - } - }, - isFile: { - /** - * Returns "true" if value an instance of File - * @param {*} value - * @returns {Boolean} - * @private - */ - - value: function isFile(value) { - return this.constructor.isFile(value); - } - }, - isFileLikeObject: { - /** - * Returns "true" if value an instance of FileLikeObject - * @param {*} value - * @returns {Boolean} - * @private - */ - - value: function isFileLikeObject(value) { - return this.constructor.isFileLikeObject(value); - } - }, - isArrayLikeObject: { - /** - * Returns "true" if value is array like object - * @param {*} value - * @returns {Boolean} - */ - - value: function isArrayLikeObject(value) { - return this.constructor.isArrayLikeObject(value); - } - }, - getIndexOfItem: { - /** - * Returns a index of item from the queue - * @param {Item|Number} value - * @returns {Number} - */ - - value: function getIndexOfItem(value) { - return isNumber(value) ? value : this.queue.indexOf(value); - } - }, - getNotUploadedItems: { - /** - * Returns not uploaded items - * @returns {Array} - */ - - value: function getNotUploadedItems() { - return this.queue.filter(function (item) { - return !item.isUploaded; - }); - } - }, - getReadyItems: { - /** - * Returns items ready for upload - * @returns {Array} - */ - - value: function getReadyItems() { - return this.queue.filter(function (item) { - return item.isReady && !item.isUploading; - }).sort(function (item1, item2) { - return item1.index - item2.index; - }); - } - }, - destroy: { - /** - * Destroys instance of FileUploader - */ - - value: function destroy() { - var _this = this; - - forEach(this._directives, function (key) { - forEach(_this._directives[key], function (object) { - object.destroy(); - }); - }); - } - }, - onAfterAddingAll: { - /** - * Callback - * @param {Array} fileItems - */ - - value: function onAfterAddingAll(fileItems) {} - }, - onAfterAddingFile: { - /** - * Callback - * @param {FileItem} fileItem - */ - - value: function onAfterAddingFile(fileItem) {} - }, - onWhenAddingFileFailed: { - /** - * Callback - * @param {File|Object} item - * @param {Object} filter - * @param {Object} options - */ - - value: function onWhenAddingFileFailed(item, filter, options) {} - }, - onBeforeUploadItem: { - /** - * Callback - * @param {FileItem} fileItem - */ - - value: function onBeforeUploadItem(fileItem) {} - }, - onProgressItem: { - /** - * Callback - * @param {FileItem} fileItem - * @param {Number} progress - */ - - value: function onProgressItem(fileItem, progress) {} - }, - onProgressAll: { - /** - * Callback - * @param {Number} progress - */ - - value: function onProgressAll(progress) {} - }, - onSuccessItem: { - /** - * Callback - * @param {FileItem} item - * @param {*} response - * @param {Number} status - * @param {Object} headers - */ - - value: function onSuccessItem(item, response, status, headers) {} - }, - onErrorItem: { - /** - * Callback - * @param {FileItem} item - * @param {*} response - * @param {Number} status - * @param {Object} headers - */ - - value: function onErrorItem(item, response, status, headers) {} - }, - onCancelItem: { - /** - * Callback - * @param {FileItem} item - * @param {*} response - * @param {Number} status - * @param {Object} headers - */ - - value: function onCancelItem(item, response, status, headers) {} - }, - onCompleteItem: { - /** - * Callback - * @param {FileItem} item - * @param {*} response - * @param {Number} status - * @param {Object} headers - */ - - value: function onCompleteItem(item, response, status, headers) {} - }, - onCompleteAll: { - /** - * Callback - */ - - value: function onCompleteAll() {} - }, - _getTotalProgress: { - /********************** - * PRIVATE - **********************/ - /** - * Returns the total progress - * @param {Number} [value] - * @returns {Number} - * @private - */ - - value: function _getTotalProgress(value) { - if (this.removeAfterUpload) { - return value || 0; - }var notUploaded = this.getNotUploadedItems().length; - var uploaded = notUploaded ? this.queue.length - notUploaded : this.queue.length; - var ratio = 100 / this.queue.length; - var current = (value || 0) * ratio / 100; - - return Math.round(uploaded * ratio + current); - } - }, - _getFilters: { - /** - * Returns array of filters - * @param {Array|String} filters - * @returns {Array} - * @private - */ - - value: function _getFilters(filters) { - if (!filters) { - return this.filters; - }if (isArray(filters)) { - return filters; - }var names = filters.match(/[^\s,]+/g); - return this.filters.filter(function (filter) { - return names.indexOf(filter.name) !== -1; - }); - } - }, - _render: { - /** - * Updates html - * @private - */ - - value: function _render() { - if (!$rootScope.$$phase) $rootScope.$apply(); - } - }, - _folderFilter: { - /** - * Returns "true" if item is a file (not folder) - * @param {File|FileLikeObject} item - * @returns {Boolean} - * @private - */ - - value: function _folderFilter(item) { - return !!(item.size || item.type); - } - }, - _queueLimitFilter: { - /** - * Returns "true" if the limit has not been reached - * @returns {Boolean} - * @private - */ - - value: function _queueLimitFilter() { - return this.queue.length < this.queueLimit; - } - }, - _isValidFile: { - /** - * Returns "true" if file pass all filters - * @param {File|Object} file - * @param {Array} filters - * @param {Object} options - * @returns {Boolean} - * @private - */ - - value: function _isValidFile(file, filters, options) { - var _this = this; - - this._failFilterIndex = -1; - return !filters.length ? true : filters.every(function (filter) { - _this._failFilterIndex++; - return filter.fn.call(_this, file, options); - }); - } - }, - _isSuccessCode: { - /** - * Checks whether upload successful - * @param {Number} status - * @returns {Boolean} - * @private - */ - - value: function _isSuccessCode(status) { - return status >= 200 && status < 300 || status === 304; - } - }, - _transformResponse: { - /** - * Transforms the server response - * @param {*} response - * @param {Object} headers - * @returns {*} - * @private - */ - - value: function _transformResponse(response, headers) { - var headersGetter = this._headersGetter(headers); - forEach($http.defaults.transformResponse, function (transformFn) { - response = transformFn(response, headersGetter); - }); - return response; - } - }, - _parseHeaders: { - /** - * Parsed response headers - * @param headers - * @returns {Object} - * @see https://github.com/angular/angular.js/blob/master/src/ng/http.js - * @private - */ - - value: function _parseHeaders(headers) { - var parsed = {}, - key, - val, - i; - - if (!headers) { - return parsed; - }forEach(headers.split("\n"), function (line) { - i = line.indexOf(":"); - key = line.slice(0, i).trim().toLowerCase(); - val = line.slice(i + 1).trim(); - - if (key) { - parsed[key] = parsed[key] ? parsed[key] + ", " + val : val; - } - }); - - return parsed; - } - }, - _headersGetter: { - /** - * Returns function that returns headers - * @param {Object} parsedHeaders - * @returns {Function} - * @private - */ - - value: function _headersGetter(parsedHeaders) { - return function (name) { - if (name) { - return parsedHeaders[name.toLowerCase()] || null; - } - return parsedHeaders; - }; - } - }, - _xhrTransport: { - /** - * The XMLHttpRequest transport - * @param {FileItem} item - * @private - */ - - value: function _xhrTransport(item) { - var _this = this; - - var xhr = item._xhr = new XMLHttpRequest(); - var form = new FormData(); - - this._onBeforeUploadItem(item); - - forEach(item.formData, function (obj) { - forEach(obj, function (value, key) { - form.append(key, value); - }); - }); - - if (typeof item._file.size != "number") { - throw new TypeError("The file specified is no longer valid"); - } - - form.append(item.alias, item._file, item.file.name); - - xhr.upload.onprogress = function (event) { - var progress = Math.round(event.lengthComputable ? event.loaded * 100 / event.total : 0); - _this._onProgressItem(item, progress); - }; - - xhr.onload = function () { - var headers = _this._parseHeaders(xhr.getAllResponseHeaders()); - var response = _this._transformResponse(xhr.response, headers); - var gist = _this._isSuccessCode(xhr.status) ? "Success" : "Error"; - var method = "_on" + gist + "Item"; - _this[method](item, response, xhr.status, headers); - _this._onCompleteItem(item, response, xhr.status, headers); - }; - - xhr.onerror = function () { - var headers = _this._parseHeaders(xhr.getAllResponseHeaders()); - var response = _this._transformResponse(xhr.response, headers); - _this._onErrorItem(item, response, xhr.status, headers); - _this._onCompleteItem(item, response, xhr.status, headers); - }; - - xhr.onabort = function () { - var headers = _this._parseHeaders(xhr.getAllResponseHeaders()); - var response = _this._transformResponse(xhr.response, headers); - _this._onCancelItem(item, response, xhr.status, headers); - _this._onCompleteItem(item, response, xhr.status, headers); + /** + * Adds items to the queue + * @param {File|HTMLInputElement|Object|FileList|Array} files + * @param {Object} [options] + * @param {Array|String} filters + */ + + + FileUploader.prototype.addToQueue = function addToQueue(files, options, filters) { + var _this = this; + + var incomingQueue = this.isArrayLikeObject(files) ? Array.prototype.slice.call(files) : [files]; + var arrayOfFilters = this._getFilters(filters); + var count = this.queue.length; + var addedFileItems = []; + + var next = function next() { + var something = incomingQueue.shift(); + + if (isUndefined(something)) { + return done(); + } + + var fileLikeObject = _this.isFile(something) ? something : new FileLikeObject(something); + var pipes = _this._convertFiltersToPipes(arrayOfFilters); + var pipeline = new Pipeline(pipes); + var onThrown = function onThrown(err) { + var originalFilter = err.pipe.originalFilter; + + var _err$args = _slicedToArray(err.args, 2); + + var fileLikeObject = _err$args[0]; + var options = _err$args[1]; + + _this._onWhenAddingFileFailed(fileLikeObject, originalFilter, options); + next(); + }; + var onSuccessful = function onSuccessful(fileLikeObject, options) { + var fileItem = new FileItem(_this, fileLikeObject, options); + addedFileItems.push(fileItem); + _this.queue.push(fileItem); + _this._onAfterAddingFile(fileItem); + next(); + }; + pipeline.onThrown = onThrown; + pipeline.onSuccessful = onSuccessful; + pipeline.exec(fileLikeObject, options); + }; + + var done = function done() { + if (_this.queue.length !== count) { + _this._onAfterAddingAll(addedFileItems); + _this.progress = _this._getTotalProgress(); + } + + _this._render(); + if (_this.autoUpload) _this.uploadAll(); + }; + + next(); + }; + /** + * Remove items from the queue. Remove last: index = -1 + * @param {FileItem|Number} value + */ + + + FileUploader.prototype.removeFromQueue = function removeFromQueue(value) { + var index = this.getIndexOfItem(value); + var item = this.queue[index]; + if (item.isUploading) item.cancel(); + this.queue.splice(index, 1); + item._destroy(); + this.progress = this._getTotalProgress(); + }; + /** + * Clears the queue + */ + + + FileUploader.prototype.clearQueue = function clearQueue() { + while (this.queue.length) { + this.queue[0].remove(); + } + this.progress = 0; + }; + /** + * Uploads a item from the queue + * @param {FileItem|Number} value + */ + + + FileUploader.prototype.uploadItem = function uploadItem(value) { + var index = this.getIndexOfItem(value); + var item = this.queue[index]; + var transport = this.isHTML5 ? '_xhrTransport' : '_iframeTransport'; + + item._prepareToUploading(); + if (this.isUploading) return; + + this._onBeforeUploadItem(item); + if (item.isCancel) return; + + item.isUploading = true; + this.isUploading = true; + this[transport](item); + this._render(); + }; + /** + * Cancels uploading of item from the queue + * @param {FileItem|Number} value + */ + + + FileUploader.prototype.cancelItem = function cancelItem(value) { + var _this2 = this; + + var index = this.getIndexOfItem(value); + var item = this.queue[index]; + var prop = this.isHTML5 ? '_xhr' : '_form'; + if (!item) return; + item.isCancel = true; + if (item.isUploading) { + // It will call this._onCancelItem() & this._onCompleteItem() asynchronously + item[prop].abort(); + } else { + (function () { + var dummy = [undefined, 0, {}]; + var onNextTick = function onNextTick() { + _this2._onCancelItem.apply(_this2, [item].concat(dummy)); + _this2._onCompleteItem.apply(_this2, [item].concat(dummy)); }; - - xhr.open(item.method, item.url, true); - - xhr.withCredentials = item.withCredentials; - - forEach(item.headers, function (value, name) { - xhr.setRequestHeader(name, value); - }); - - xhr.send(form); - this._render(); + $timeout(onNextTick); // Trigger callbacks asynchronously (setImmediate emulation) + })(); + } + }; + /** + * Uploads all not uploaded items of queue + */ + + + FileUploader.prototype.uploadAll = function uploadAll() { + var items = this.getNotUploadedItems().filter(function (item) { + return !item.isUploading; + }); + if (!items.length) return; + + forEach(items, function (item) { + return item._prepareToUploading(); + }); + items[0].upload(); + }; + /** + * Cancels all uploads + */ + + + FileUploader.prototype.cancelAll = function cancelAll() { + var items = this.getNotUploadedItems(); + forEach(items, function (item) { + return item.cancel(); + }); + }; + /** + * Returns "true" if value an instance of File + * @param {*} value + * @returns {Boolean} + * @private + */ + + + FileUploader.prototype.isFile = function isFile(value) { + return this.constructor.isFile(value); + }; + /** + * Returns "true" if value an instance of FileLikeObject + * @param {*} value + * @returns {Boolean} + * @private + */ + + + FileUploader.prototype.isFileLikeObject = function isFileLikeObject(value) { + return this.constructor.isFileLikeObject(value); + }; + /** + * Returns "true" if value is array like object + * @param {*} value + * @returns {Boolean} + */ + + + FileUploader.prototype.isArrayLikeObject = function isArrayLikeObject(value) { + return this.constructor.isArrayLikeObject(value); + }; + /** + * Returns a index of item from the queue + * @param {Item|Number} value + * @returns {Number} + */ + + + FileUploader.prototype.getIndexOfItem = function getIndexOfItem(value) { + return isNumber(value) ? value : this.queue.indexOf(value); + }; + /** + * Returns not uploaded items + * @returns {Array} + */ + + + FileUploader.prototype.getNotUploadedItems = function getNotUploadedItems() { + return this.queue.filter(function (item) { + return !item.isUploaded; + }); + }; + /** + * Returns items ready for upload + * @returns {Array} + */ + + + FileUploader.prototype.getReadyItems = function getReadyItems() { + return this.queue.filter(function (item) { + return item.isReady && !item.isUploading; + }).sort(function (item1, item2) { + return item1.index - item2.index; + }); + }; + /** + * Destroys instance of FileUploader + */ + + + FileUploader.prototype.destroy = function destroy() { + var _this3 = this; + + forEach(this._directives, function (key) { + forEach(_this3._directives[key], function (object) { + object.destroy(); + }); + }); + }; + /** + * Callback + * @param {Array} fileItems + */ + + + FileUploader.prototype.onAfterAddingAll = function onAfterAddingAll(fileItems) {}; + /** + * Callback + * @param {FileItem} fileItem + */ + + + FileUploader.prototype.onAfterAddingFile = function onAfterAddingFile(fileItem) {}; + /** + * Callback + * @param {File|Object} item + * @param {Object} filter + * @param {Object} options + */ + + + FileUploader.prototype.onWhenAddingFileFailed = function onWhenAddingFileFailed(item, filter, options) {}; + /** + * Callback + * @param {FileItem} fileItem + */ + + + FileUploader.prototype.onBeforeUploadItem = function onBeforeUploadItem(fileItem) {}; + /** + * Callback + * @param {FileItem} fileItem + * @param {Number} progress + */ + + + FileUploader.prototype.onProgressItem = function onProgressItem(fileItem, progress) {}; + /** + * Callback + * @param {Number} progress + */ + + + FileUploader.prototype.onProgressAll = function onProgressAll(progress) {}; + /** + * Callback + * @param {FileItem} item + * @param {*} response + * @param {Number} status + * @param {Object} headers + */ + + + FileUploader.prototype.onSuccessItem = function onSuccessItem(item, response, status, headers) {}; + /** + * Callback + * @param {FileItem} item + * @param {*} response + * @param {Number} status + * @param {Object} headers + */ + + + FileUploader.prototype.onErrorItem = function onErrorItem(item, response, status, headers) {}; + /** + * Callback + * @param {FileItem} item + * @param {*} response + * @param {Number} status + * @param {Object} headers + */ + + + FileUploader.prototype.onCancelItem = function onCancelItem(item, response, status, headers) {}; + /** + * Callback + * @param {FileItem} item + * @param {*} response + * @param {Number} status + * @param {Object} headers + */ + + + FileUploader.prototype.onCompleteItem = function onCompleteItem(item, response, status, headers) {}; + /** + * Callback + */ + + + FileUploader.prototype.onCompleteAll = function onCompleteAll() {}; + /********************** + * PRIVATE + **********************/ + /** + * Returns the total progress + * @param {Number} [value] + * @returns {Number} + * @private + */ + + + FileUploader.prototype._getTotalProgress = function _getTotalProgress(value) { + if (this.removeAfterUpload) return value || 0; + + var notUploaded = this.getNotUploadedItems().length; + var uploaded = notUploaded ? this.queue.length - notUploaded : this.queue.length; + var ratio = 100 / this.queue.length; + var current = (value || 0) * ratio / 100; + + return Math.round(uploaded * ratio + current); + }; + /** + * Returns array of filters + * @param {Array|String} filters + * @returns {Array} + * @private + */ + + + FileUploader.prototype._getFilters = function _getFilters(filters) { + if (!filters) return this.filters; + if (isArray(filters)) return filters; + var names = filters.match(/[^\s,]+/g); + return this.filters.filter(function (filter) { + return names.indexOf(filter.name) !== -1; + }); + }; + /** + * @param {Array} filters + * @returns {Array} + * @private + */ + + + FileUploader.prototype._convertFiltersToPipes = function _convertFiltersToPipes(filters) { + var _this4 = this; + + return filters.map(function (filter) { + var fn = bind(_this4, filter.fn); + fn.isAsync = filter.fn.length === 3; + fn.originalFilter = filter; + return fn; + }); + }; + /** + * Updates html + * @private + */ + + + FileUploader.prototype._render = function _render() { + if (!$rootScope.$$phase) $rootScope.$apply(); + }; + /** + * Returns "true" if item is a file (not folder) + * @param {File|FileLikeObject} item + * @returns {Boolean} + * @private + */ + + + FileUploader.prototype._folderFilter = function _folderFilter(item) { + return !!(item.size || item.type); + }; + /** + * Returns "true" if the limit has not been reached + * @returns {Boolean} + * @private + */ + + + FileUploader.prototype._queueLimitFilter = function _queueLimitFilter() { + return this.queue.length < this.queueLimit; + }; + /** + * Checks whether upload successful + * @param {Number} status + * @returns {Boolean} + * @private + */ + + + FileUploader.prototype._isSuccessCode = function _isSuccessCode(status) { + return status >= 200 && status < 300 || status === 304; + }; + /** + * Transforms the server response + * @param {*} response + * @param {Object} headers + * @returns {*} + * @private + */ + + + FileUploader.prototype._transformResponse = function _transformResponse(response, headers) { + var headersGetter = this._headersGetter(headers); + forEach($http.defaults.transformResponse, function (transformFn) { + response = transformFn(response, headersGetter); + }); + return response; + }; + /** + * Parsed response headers + * @param headers + * @returns {Object} + * @see https://github.com/angular/angular.js/blob/master/src/ng/http.js + * @private + */ + + + FileUploader.prototype._parseHeaders = function _parseHeaders(headers) { + var parsed = {}, + key, + val, + i; + + if (!headers) return parsed; + + forEach(headers.split('\n'), function (line) { + i = line.indexOf(':'); + key = line.slice(0, i).trim().toLowerCase(); + val = line.slice(i + 1).trim(); + + if (key) { + parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val; } - }, - _iframeTransport: { - /** - * The IFrame transport - * @param {FileItem} item - * @private - */ - - value: function _iframeTransport(item) { - var _this = this; - - var form = element("
"); - var iframe = element("