diff --git a/README.md b/README.md index 4f655c0..b4dbb54 100644 --- a/README.md +++ b/README.md @@ -13,3 +13,7 @@ storage services including: - Azure > Please see the [Storage Service Documenation](http://docs.strongloop.com/display/public/LB/Storage+component). + +## Examples + +See https://github.com/strongloop/loopback-example-storage. diff --git a/example-2.0/.editorconfig b/example-2.0/.editorconfig deleted file mode 100644 index 3ee22e5..0000000 --- a/example-2.0/.editorconfig +++ /dev/null @@ -1,13 +0,0 @@ -# EditorConfig helps developers define and maintain consistent -# coding styles between different editors and IDEs -# http://editorconfig.org - -root = true - -[*] -indent_style = space -indent_size = 2 -end_of_line = lf -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true diff --git a/example-2.0/.jshintignore b/example-2.0/.jshintignore deleted file mode 100644 index ee8c771..0000000 --- a/example-2.0/.jshintignore +++ /dev/null @@ -1,2 +0,0 @@ -/client/ -/node_modules/ diff --git a/example-2.0/.jshintrc b/example-2.0/.jshintrc deleted file mode 100644 index feb0928..0000000 --- a/example-2.0/.jshintrc +++ /dev/null @@ -1,21 +0,0 @@ -{ - "node": true, - "esnext": true, - "bitwise": true, - "camelcase": true, - "eqeqeq": true, - "eqnull": true, - "immed": true, - "indent": 2, - "latedef": "nofunc", - "newcap": true, - "nonew": true, - "noarg": true, - "quotmark": "single", - "regexp": true, - "undef": true, - "unused": false, - "trailing": true, - "sub": true, - "maxlen": 80 -} diff --git a/example-2.0/.npmignore b/example-2.0/.npmignore deleted file mode 100644 index 7ec7473..0000000 --- a/example-2.0/.npmignore +++ /dev/null @@ -1,16 +0,0 @@ -.idea -.project -*.sublime-* -.DS_Store -*.seed -*.log -*.csv -*.dat -*.out -*.pid -*.swp -*.swo -node_modules -coverage -*.tgz -*.xml diff --git a/example-2.0/client/README.md b/example-2.0/client/README.md deleted file mode 100644 index dd00c9e..0000000 --- a/example-2.0/client/README.md +++ /dev/null @@ -1,3 +0,0 @@ -## Client - -This is the place for your application front-end files. diff --git a/example-2.0/client/angular-file-upload.js b/example-2.0/client/angular-file-upload.js deleted file mode 100644 index a73fd4c..0000000 --- a/example-2.0/client/angular-file-upload.js +++ /dev/null @@ -1,685 +0,0 @@ -/* - Angular File Upload v0.3.3.1 - https://github.com/nervgh/angular-file-upload -*/ -(function(angular, factory) { - if (typeof define === 'function' && define.amd) { - define('angular-file-upload', ['angular'], function(angular) { - return factory(angular); - }); - } else { - return factory(angular); - } -}(angular || null, function(angular) { -var app = angular.module('angularFileUpload', []); - -// It is attached to an element that catches the event drop file -app.directive('ngFileDrop', [ '$fileUploader', function ($fileUploader) { - 'use strict'; - - return { - // don't use drag-n-drop files in IE9, because not File API support - link: !$fileUploader.isHTML5 ? angular.noop : function (scope, element, attributes) { - element - .bind('drop', function (event) { - var dataTransfer = event.dataTransfer ? - event.dataTransfer : - event.originalEvent.dataTransfer; // jQuery fix; - if (!dataTransfer) return; - event.preventDefault(); - event.stopPropagation(); - scope.$broadcast('file:removeoverclass'); - scope.$emit('file:add', dataTransfer.files, scope.$eval(attributes.ngFileDrop)); - }) - .bind('dragover', function (event) { - var dataTransfer = event.dataTransfer ? - event.dataTransfer : - event.originalEvent.dataTransfer; // jQuery fix; - - event.preventDefault(); - event.stopPropagation(); - dataTransfer.dropEffect = 'copy'; - scope.$broadcast('file:addoverclass'); - }) - .bind('dragleave', function () { - scope.$broadcast('file:removeoverclass'); - }); - } - }; -}]) -// It is attached to an element which will be assigned to a class "ng-file-over" or ng-file-over="className" -app.directive('ngFileOver', function () { - 'use strict'; - - return { - link: function (scope, element, attributes) { - scope.$on('file:addoverclass', function () { - element.addClass(attributes.ngFileOver || 'ng-file-over'); - }); - scope.$on('file:removeoverclass', function () { - element.removeClass(attributes.ngFileOver || 'ng-file-over'); - }); - } - }; -}); -// It is attached to element like -app.directive('ngFileSelect', [ '$fileUploader', function ($fileUploader) { - 'use strict'; - - return { - link: function (scope, element, attributes) { - $fileUploader.isHTML5 || element.removeAttr('multiple'); - - element.bind('change', function () { - scope.$emit('file:add', $fileUploader.isHTML5 ? this.files : this, scope.$eval(attributes.ngFileSelect)); - ($fileUploader.isHTML5 && element.attr('multiple')) && element.prop('value', null); - }); - - element.prop('value', null); // FF fix - } - }; -}]); -app.factory('$fileUploader', [ '$compile', '$rootScope', '$http', '$window', function ($compile, $rootScope, $http, $window) { - 'use strict'; - - /** - * Creates a uploader - * @param {Object} params - * @constructor - */ - function Uploader(params) { - angular.extend(this, { - scope: $rootScope, - url: '/', - alias: 'file', - queue: [], - headers: {}, - progress: null, - autoUpload: false, - removeAfterUpload: false, - method: 'POST', - filters: [], - formData: [], - isUploading: false, - _nextIndex: 0, - _timestamp: Date.now() - }, params); - - // add the base filter - this.filters.unshift(this._filter); - - this.scope.$on('file:add', function (event, items, options) { - event.stopPropagation(); - this.addToQueue(items, options); - }.bind(this)); - - this.bind('beforeupload', Item.prototype._beforeupload); - this.bind('in:progress', Item.prototype._progress); - this.bind('in:success', Item.prototype._success); - this.bind('in:cancel', Item.prototype._cancel); - this.bind('in:error', Item.prototype._error); - this.bind('in:complete', Item.prototype._complete); - this.bind('in:progress', this._progress); - this.bind('in:complete', this._complete); - } - - Uploader.prototype = { - /** - * Link to the constructor - */ - constructor: Uploader, - - /** - * The base filter. If returns "true" an item will be added to the queue - * @param {File|Input} item - * @returns {boolean} - * @private - */ - _filter: function (item) { - return angular.isElement(item) ? true : !!item.size; - }, - - /** - * Registers a event handler - * @param {String} event - * @param {Function} handler - * @return {Function} unsubscribe function - */ - bind: function (event, handler) { - return this.scope.$on(this._timestamp + ':' + event, handler.bind(this)); - }, - - /** - * Triggers events - * @param {String} event - * @param {...*} [some] - */ - trigger: function (event, some) { - arguments[ 0 ] = this._timestamp + ':' + event; - this.scope.$broadcast.apply(this.scope, arguments); - }, - - /** - * Checks a support the html5 uploader - * @returns {Boolean} - * @readonly - */ - isHTML5: !!($window.File && $window.FormData), - - /** - * Adds items to the queue - * @param {FileList|File|HTMLInputElement} items - * @param {Object} [options] - */ - addToQueue: function (items, options) { - var length = this.queue.length; - var list = 'length' in items ? items : [items]; - - angular.forEach(list, function (file) { - // check a [File|HTMLInputElement] - var isValid = !this.filters.length ? true : this.filters.every(function (filter) { - return filter.call(this, file); - }, this); - - // create new item - var item = new Item(angular.extend({ - url: this.url, - alias: this.alias, - headers: angular.copy(this.headers), - formData: angular.copy(this.formData), - removeAfterUpload: this.removeAfterUpload, - method: this.method, - uploader: this, - file: file - }, options)); - - if (isValid) { - this.queue.push(item); - this.trigger('afteraddingfile', item); - } else { - this.trigger('whenaddingfilefailed', item); - } - }, this); - - if (this.queue.length !== length) { - this.trigger('afteraddingall', this.queue); - this.progress = this._getTotalProgress(); - } - - this._render(); - this.autoUpload && this.uploadAll(); - }, - - /** - * Remove items from the queue. Remove last: index = -1 - * @param {Item|Number} value - */ - removeFromQueue: function (value) { - var index = this.getIndexOfItem(value); - var item = this.queue[ index ]; - item.isUploading && item.cancel(); - this.queue.splice(index, 1); - item._destroy(); - this.progress = this._getTotalProgress(); - }, - - /** - * Clears the queue - */ - clearQueue: function () { - this.queue.forEach(function (item) { - item.isUploading && item.cancel(); - item._destroy(); - }, this); - this.queue.length = 0; - this.progress = 0; - }, - - /** - * Returns a index of item from the queue - * @param {Item|Number} value - * @returns {Number} - */ - getIndexOfItem: function (value) { - return angular.isObject(value) ? this.queue.indexOf(value) : value; - }, - - /** - * Returns not uploaded items - * @returns {Array} - */ - getNotUploadedItems: function () { - return this.queue.filter(function (item) { - return !item.isUploaded; - }); - }, - - /** - * Returns items ready for upload - * @returns {Array} - */ - getReadyItems: function() { - return this.queue - .filter(function(item) { - return item.isReady && !item.isUploading; - }) - .sort(function(item1, item2) { - return item1.index - item2.index; - }); - }, - - /** - * Uploads a item from the queue - * @param {Item|Number} value - */ - uploadItem: function (value) { - var index = this.getIndexOfItem(value); - var item = this.queue[ index ]; - var transport = this.isHTML5 ? '_xhrTransport' : '_iframeTransport'; - - item.index = item.index || this._nextIndex++; - item.isReady = true; - - if (this.isUploading) { - return; - } - - this.isUploading = true; - this[ transport ](item); - }, - - /** - * Cancels uploading of item from the queue - * @param {Item|Number} value - */ - cancelItem: function(value) { - var index = this.getIndexOfItem(value); - var item = this.queue[ index ]; - var prop = this.isHTML5 ? '_xhr' : '_form'; - item[prop] && item[prop].abort(); - }, - - /** - * Uploads all not uploaded items of queue - */ - uploadAll: function () { - var items = this.getNotUploadedItems().filter(function(item) { - return !item.isUploading; - }); - items.forEach(function(item) { - item.index = item.index || this._nextIndex++; - item.isReady = true; - }, this); - items.length && this.uploadItem(items[ 0 ]); - }, - - /** - * Cancels all uploads - */ - cancelAll: function() { - this.getNotUploadedItems().forEach(function(item) { - this.cancelItem(item); - }, this); - }, - - /** - * Updates angular scope - * @private - */ - _render: function() { - this.scope.$$phase || this.scope.$digest(); - }, - - /** - * Returns the total progress - * @param {Number} [value] - * @returns {Number} - * @private - */ - _getTotalProgress: function (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); - }, - - /** - * The 'in:progress' handler - * @private - */ - _progress: function (event, item, progress) { - var result = this._getTotalProgress(progress); - this.trigger('progressall', result); - this.progress = result; - this._render(); - }, - - /** - * The 'in:complete' handler - * @private - */ - _complete: function () { - var item = this.getReadyItems()[ 0 ]; - this.isUploading = false; - - if (angular.isDefined(item)) { - this.uploadItem(item); - return; - } - - this.trigger('completeall', this.queue); - this.progress = this._getTotalProgress(); - this._render(); - }, - - /** - * The XMLHttpRequest transport - * @private - */ - _xhrTransport: function (item) { - var xhr = item._xhr = new XMLHttpRequest(); - var form = new FormData(); - var that = this; - - this.trigger('beforeupload', item); - - item.formData.forEach(function(obj) { - angular.forEach(obj, function(value, key) { - form.append(key, value); - }); - }); - - form.append(item.alias, item.file); - - xhr.upload.onprogress = function (event) { - var progress = event.lengthComputable ? event.loaded * 100 / event.total : 0; - that.trigger('in:progress', item, Math.round(progress)); - }; - - xhr.onload = function () { - var response = that._transformResponse(xhr.response); - var event = that._isSuccessCode(xhr.status) ? 'success' : 'error'; - that.trigger('in:' + event, xhr, item, response); - that.trigger('in:complete', xhr, item, response); - }; - - xhr.onerror = function () { - that.trigger('in:error', xhr, item); - that.trigger('in:complete', xhr, item); - }; - - xhr.onabort = function () { - that.trigger('in:cancel', xhr, item); - that.trigger('in:complete', xhr, item); - }; - - xhr.open(item.method, item.url, true); - - angular.forEach(item.headers, function (value, name) { - xhr.setRequestHeader(name, value); - }); - - xhr.send(form); - }, - - /** - * The IFrame transport - * @private - */ - _iframeTransport: function (item) { - var form = angular.element(''); - var iframe = angular.element(''); - var input = item._input; - var that = this; - - item._form && item._form.replaceWith(input); // remove old form - item._form = form; // save link to new form - - this.trigger('beforeupload', item); - - input.prop('name', item.alias); - - item.formData.forEach(function(obj) { - angular.forEach(obj, function(value, key) { - form.append(angular.element('')); - }); - }); - - form.prop({ - action: item.url, - method: item.method, - target: iframe.prop('name'), - enctype: 'multipart/form-data', - encoding: 'multipart/form-data' // old IE - }); - - iframe.bind('load', function () { - // fixed angular.contents() for iframes - var html = iframe[0].contentDocument.body.innerHTML; - var xhr = { response: html, status: 200, dummy: true }; - var response = that._transformResponse(xhr.response); - that.trigger('in:success', xhr, item, response); - that.trigger('in:complete', xhr, item, response); - }); - - form.abort = function() { - var xhr = { status: 0, dummy: true }; - iframe.unbind('load').prop('src', 'javascript:false;'); - form.replaceWith(input); - that.trigger('in:cancel', xhr, item); - that.trigger('in:complete', xhr, item); - }; - - input.after(form); - form.append(input).append(iframe); - - form[ 0 ].submit(); - }, - - /** - * Checks whether upload successful - * @param {Number} status - * @returns {Boolean} - * @private - */ - _isSuccessCode: function(status) { - return (status >= 200 && status < 300) || status === 304; - }, - - /** - * Transforms the server response - * @param {*} response - * @returns {*} - * @private - */ - _transformResponse: function (response) { - $http.defaults.transformResponse.forEach(function (transformFn) { - response = transformFn(response); - }); - return response; - } - }; - - - /** - * Create a item - * @param {Object} params - * @constructor - */ - function Item(params) { - // fix for old browsers - if (!Uploader.prototype.isHTML5) { - var input = angular.element(params.file); - var clone = $compile(input.clone())(params.uploader.scope); - var value = input.val(); - - params.file = { - lastModifiedDate: null, - size: null, - type: 'like/' + value.slice(value.lastIndexOf('.') + 1).toLowerCase(), - name: value.slice(value.lastIndexOf('/') + value.lastIndexOf('\\') + 2) - }; - - params._input = input; - clone.prop('value', null); // FF fix - input.css('display', 'none').after(clone); // remove jquery dependency - } - - angular.extend(this, { - isReady: false, - isUploading: false, - isUploaded: false, - isSuccess: false, - isCancel: false, - isError: false, - progress: null, - index: null - }, params); - } - - - Item.prototype = { - /** - * Link to the constructor - */ - constructor: Item, - /** - * Removes a item - */ - remove: function () { - this.uploader.removeFromQueue(this); - }, - /** - * Uploads a item - */ - upload: function () { - this.uploader.uploadItem(this); - }, - /** - * Cancels uploading - */ - cancel: function() { - this.uploader.cancelItem(this); - }, - /** - * Destroys form and input - * @private - */ - _destroy: function() { - this._form && this._form.remove(); - this._input && this._input.remove(); - delete this._form; - delete this._input; - }, - /** - * The 'beforeupload' handler - * @param {Object} event - * @param {Item} item - * @private - */ - _beforeupload: function (event, item) { - item.isReady = true; - item.isUploading = true; - item.isUploaded = false; - item.isSuccess = false; - item.isCancel = false; - item.isError = false; - item.progress = 0; - }, - /** - * The 'in:progress' handler - * @param {Object} event - * @param {Item} item - * @param {Number} progress - * @private - */ - _progress: function (event, item, progress) { - item.progress = progress; - item.uploader.trigger('progress', item, progress); - }, - /** - * The 'in:success' handler - * @param {Object} event - * @param {XMLHttpRequest} xhr - * @param {Item} item - * @param {*} response - * @private - */ - _success: function (event, xhr, item, response) { - item.isReady = false; - item.isUploading = false; - item.isUploaded = true; - item.isSuccess = true; - item.isCancel = false; - item.isError = false; - item.progress = 100; - item.index = null; - item.uploader.trigger('success', xhr, item, response); - }, - /** - * The 'in:cancel' handler - * @param {Object} event - * @param {XMLHttpRequest} xhr - * @param {Item} item - * @private - */ - _cancel: function(event, xhr, item) { - item.isReady = false; - item.isUploading = false; - item.isUploaded = false; - item.isSuccess = false; - item.isCancel = true; - item.isError = false; - item.progress = 0; - item.index = null; - item.uploader.trigger('cancel', xhr, item); - }, - /** - * The 'in:error' handler - * @param {Object} event - * @param {XMLHttpRequest} xhr - * @param {Item} item - * @param {*} response - * @private - */ - _error: function (event, xhr, item, response) { - item.isReady = false; - item.isUploading = false; - item.isUploaded = true; - item.isSuccess = false; - item.isCancel = false; - item.isError = true; - item.progress = 100; - item.index = null; - item.uploader.trigger('error', xhr, item, response); - }, - /** - * The 'in:complete' handler - * @param {Object} event - * @param {XMLHttpRequest} xhr - * @param {Item} item - * @param {*} response - * @private - */ - _complete: function (event, xhr, item, response) { - item.uploader.trigger('complete', xhr, item, response); - item.removeAfterUpload && item.remove(); - } - }; - - return { - create: function (params) { - return new Uploader(params); - }, - isHTML5: Uploader.prototype.isHTML5 - }; -}]) - - return app; -})); \ No newline at end of file diff --git a/example-2.0/client/angular-file-upload.min.js b/example-2.0/client/angular-file-upload.min.js deleted file mode 100644 index 2cf4290..0000000 --- a/example-2.0/client/angular-file-upload.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/* - angular-file-upload v2.1.1 - https://github.com/nervgh/angular-file-upload -*/ - -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):"object"==typeof exports?exports["angular-file-upload"]=t():e["angular-file-upload"]=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return e[r].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){"use strict";var r=function(e){return e&&e.__esModule?e["default"]:e},i=r(n(2)),o=r(n(3)),s=r(n(4)),a=r(n(5)),u=r(n(6)),l=r(n(7)),c=r(n(1)),f=r(n(8)),p=r(n(9)),d=r(n(10)),v=r(n(11)),h=r(n(12));angular.module(i.name,[]).value("fileUploaderOptions",o).factory("FileUploader",s).factory("FileLikeObject",a).factory("FileItem",u).factory("FileDirective",l).factory("FileSelect",c).factory("FileDrop",f).factory("FileOver",p).directive("nvFileSelect",d).directive("nvFileDrop",v).directive("nvFileOver",h).run(["FileUploader","FileLikeObject","FileItem","FileDirective","FileSelect","FileDrop","FileOver",function(e,t,n,r,i,o,s){e.FileLikeObject=t,e.FileItem=n,e.FileDirective=r,e.FileSelect=i,e.FileDrop=o,e.FileOver=s}])},function(e,t,n){"use strict";var r=function(e){return e&&e.__esModule?e["default"]:e},i=function(){function e(e,t){for(var n in t){var r=t[n];r.configurable=!0,r.value&&(r.writable=!0)}Object.defineProperties(e,t)}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=function u(e,t,n){var r=Object.getOwnPropertyDescriptor(e,t);if(void 0===r){var i=Object.getPrototypeOf(e);return null===i?void 0:u(i,t,n)}if("value"in r&&r.writable)return r.value;var o=r.get;return void 0===o?void 0:o.call(n)},s=function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)},a=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")};r(n(2));e.exports=function(e){var t=function(e){function t(e){a(this,t),this.events={$destroy:"destroy",change:"onChange"},this.prop="select",o(Object.getPrototypeOf(t.prototype),"constructor",this).call(this,e),this.uploader.isHTML5||this.element.removeAttr("multiple"),this.element.prop("value",null)}return s(t,e),i(t,{getOptions:{value:function(){}},getFilters:{value:function(){}},isEmptyAfterSelection:{value:function(){return!!this.element.attr("multiple")}},onChange:{value:function(){var e=this.uploader.isHTML5?this.element[0].files:this.element[0],t=this.getOptions(),n=this.getFilters();this.uploader.isHTML5||this.destroy(),this.uploader.addToQueue(e,t,n),this.isEmptyAfterSelection()&&this.element.prop("value",null)}}}),t}(e);return t},e.exports.$inject=["FileDirective"]},function(e,t){e.exports={name:"angularFileUpload"}},function(e,t){"use strict";e.exports={url:"/",alias:"file",headers:{},queue:[],progress:0,autoUpload:!1,removeAfterUpload:!1,method:"POST",filters:[],formData:[],queueLimit:Number.MAX_VALUE,withCredentials:!1}},function(e,t,n){"use strict";var r=function(e){return e&&e.__esModule?e["default"]:e},i=function(){function e(e,t){for(var n in t){var r=t[n];r.configurable=!0,r.value&&(r.writable=!0)}Object.defineProperties(e,t)}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},s=(r(n(2)),angular.copy),a=angular.extend,u=angular.forEach,l=angular.isObject,c=angular.isNumber,f=angular.isDefined,p=angular.isArray,d=angular.element;e.exports=function(e,t,n,r,v,h){var m=r.File,_=r.FormData,g=function(){function r(t){o(this,r);var n=s(e);a(this,n,t,{isUploading:!1,_nextIndex:0,_failFilterIndex:-1,_directives:{select:[],drop:[],over:[]}}),this.filters.unshift({name:"queueLimit",fn:this._queueLimitFilter}),this.filters.unshift({name:"folder",fn:this._folderFilter})}return i(r,{addToQueue:{value:function(e,t,n){var r=this,i=this.isArrayLikeObject(e)?e:[e],o=this._getFilters(n),s=this.queue.length,a=[];u(i,function(e){var n=new v(e);if(r._isValidFile(n,o,t)){var i=new h(r,e,t);a.push(i),r.queue.push(i),r._onAfterAddingFile(i)}else{var s=o[r._failFilterIndex];r._onWhenAddingFileFailed(n,s,t)}}),this.queue.length!==s&&(this._onAfterAddingAll(a),this.progress=this._getTotalProgress()),this._render(),this.autoUpload&&this.uploadAll()}},removeFromQueue:{value:function(e){var t=this.getIndexOfItem(e),n=this.queue[t];n.isUploading&&n.cancel(),this.queue.splice(t,1),n._destroy(),this.progress=this._getTotalProgress()}},clearQueue:{value:function(){for(;this.queue.length;)this.queue[0].remove();this.progress=0}},uploadItem:{value:function(e){var t=this.getIndexOfItem(e),n=this.queue[t],r=this.isHTML5?"_xhrTransport":"_iframeTransport";n._prepareToUploading(),this.isUploading||(this.isUploading=!0,this[r](n))}},cancelItem:{value:function(e){var t=this.getIndexOfItem(e),n=this.queue[t],r=this.isHTML5?"_xhr":"_form";n&&n.isUploading&&n[r].abort()}},uploadAll:{value:function(){var e=this.getNotUploadedItems().filter(function(e){return!e.isUploading});e.length&&(u(e,function(e){return e._prepareToUploading()}),e[0].upload())}},cancelAll:{value:function(){var e=this.getNotUploadedItems();u(e,function(e){return e.cancel()})}},isFile:{value:function(e){return this.constructor.isFile(e)}},isFileLikeObject:{value:function(e){return this.constructor.isFileLikeObject(e)}},isArrayLikeObject:{value:function(e){return this.constructor.isArrayLikeObject(e)}},getIndexOfItem:{value:function(e){return c(e)?e:this.queue.indexOf(e)}},getNotUploadedItems:{value:function(){return this.queue.filter(function(e){return!e.isUploaded})}},getReadyItems:{value:function(){return this.queue.filter(function(e){return e.isReady&&!e.isUploading}).sort(function(e,t){return e.index-t.index})}},destroy:{value:function(){var e=this;u(this._directives,function(t){u(e._directives[t],function(e){e.destroy()})})}},onAfterAddingAll:{value:function(e){}},onAfterAddingFile:{value:function(e){}},onWhenAddingFileFailed:{value:function(e,t,n){}},onBeforeUploadItem:{value:function(e){}},onProgressItem:{value:function(e,t){}},onProgressAll:{value:function(e){}},onSuccessItem:{value:function(e,t,n,r){}},onErrorItem:{value:function(e,t,n,r){}},onCancelItem:{value:function(e,t,n,r){}},onCompleteItem:{value:function(e,t,n,r){}},onCompleteAll:{value:function(){}},_getTotalProgress:{value:function(e){if(this.removeAfterUpload)return e||0;var t=this.getNotUploadedItems().length,n=t?this.queue.length-t:this.queue.length,r=100/this.queue.length,i=(e||0)*r/100;return Math.round(n*r+i)}},_getFilters:{value:function(e){if(!e)return this.filters;if(p(e))return e;var t=e.match(/[^\s,]+/g);return this.filters.filter(function(e){return-1!==t.indexOf(e.name)})}},_render:{value:function(){t.$$phase||t.$apply()}},_folderFilter:{value:function(e){return!(!e.size&&!e.type)}},_queueLimitFilter:{value:function(){return this.queue.length=200&&300>e||304===e}},_transformResponse:{value:function(e,t){var r=this._headersGetter(t);return u(n.defaults.transformResponse,function(t){e=t(e,r)}),e}},_parseHeaders:{value:function(e){var t,n,r,i={};return e?(u(e.split("\n"),function(e){r=e.indexOf(":"),t=e.slice(0,r).trim().toLowerCase(),n=e.slice(r+1).trim(),t&&(i[t]=i[t]?i[t]+", "+n:n)}),i):i}},_headersGetter:{value:function(e){return function(t){return t?e[t.toLowerCase()]||null:e}}},_xhrTransport:{value:function(e){var t=this,n=e._xhr=new XMLHttpRequest,r=new _;if(this._onBeforeUploadItem(e),u(e.formData,function(e){u(e,function(e,t){r.append(t,e)})}),"number"!=typeof e._file.size)throw new TypeError("The file specified is no longer valid");r.append(e.alias,e._file,e.file.name),n.upload.onprogress=function(n){var r=Math.round(n.lengthComputable?100*n.loaded/n.total:0);t._onProgressItem(e,r)},n.onload=function(){var r=t._parseHeaders(n.getAllResponseHeaders()),i=t._transformResponse(n.response,r),o=t._isSuccessCode(n.status)?"Success":"Error",s="_on"+o+"Item";t[s](e,i,n.status,r),t._onCompleteItem(e,i,n.status,r)},n.onerror=function(){var r=t._parseHeaders(n.getAllResponseHeaders()),i=t._transformResponse(n.response,r);t._onErrorItem(e,i,n.status,r),t._onCompleteItem(e,i,n.status,r)},n.onabort=function(){var r=t._parseHeaders(n.getAllResponseHeaders()),i=t._transformResponse(n.response,r);t._onCancelItem(e,i,n.status,r),t._onCompleteItem(e,i,n.status,r)},n.open(e.method,e.url,!0),n.withCredentials=e.withCredentials,u(e.headers,function(e,t){n.setRequestHeader(t,e)}),n.send(r),this._render()}},_iframeTransport:{value:function(e){var t=this,n=d(''),r=d(''),i=e._input;e._form&&e._form.replaceWith(i),e._form=n,this._onBeforeUploadItem(e),i.prop("name",e.alias),u(e.formData,function(e){u(e,function(e,t){var r=d('');r.val(e),n.append(r)})}),n.prop({action:e.url,method:"POST",target:r.prop("name"),enctype:"multipart/form-data",encoding:"multipart/form-data"}),r.bind("load",function(){var n="",i=200;try{n=r[0].contentDocument.body.innerHTML}catch(o){i=500}var s={response:n,status:i,dummy:!0},a={},u=t._transformResponse(s.response,a);t._onSuccessItem(e,u,s.status,a),t._onCompleteItem(e,u,s.status,a)}),n.abort=function(){var o,s={status:0,dummy:!0},a={};r.unbind("load").prop("src","javascript:false;"),n.replaceWith(i),t._onCancelItem(e,o,s.status,a),t._onCompleteItem(e,o,s.status,a)},i.after(n),n.append(i).append(r),n[0].submit(),this._render()}},_onWhenAddingFileFailed:{value:function(e,t,n){this.onWhenAddingFileFailed(e,t,n)}},_onAfterAddingFile:{value:function(e){this.onAfterAddingFile(e)}},_onAfterAddingAll:{value:function(e){this.onAfterAddingAll(e)}},_onBeforeUploadItem:{value:function(e){e._onBeforeUpload(),this.onBeforeUploadItem(e)}},_onProgressItem:{value:function(e,t){var n=this._getTotalProgress(t);this.progress=n,e._onProgress(t),this.onProgressItem(e,t),this.onProgressAll(n),this._render()}},_onSuccessItem:{value:function(e,t,n,r){e._onSuccess(t,n,r),this.onSuccessItem(e,t,n,r)}},_onErrorItem:{value:function(e,t,n,r){e._onError(t,n,r),this.onErrorItem(e,t,n,r)}},_onCancelItem:{value:function(e,t,n,r){e._onCancel(t,n,r),this.onCancelItem(e,t,n,r)}},_onCompleteItem:{value:function(e,t,n,r){e._onComplete(t,n,r),this.onCompleteItem(e,t,n,r);var i=this.getReadyItems()[0];return this.isUploading=!1,f(i)?void i.upload():(this.onCompleteAll(),this.progress=this._getTotalProgress(),void this._render())}}},{isFile:{value:function(e){return m&&e instanceof m}},isFileLikeObject:{value:function(e){return e instanceof v}},isArrayLikeObject:{value:function(e){return l(e)&&"length"in e}},inherit:{value:function(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.super_=t}}}),r}();return g.prototype.isHTML5=!(!m||!_),g.isHTML5=g.prototype.isHTML5,g},e.exports.$inject=["fileUploaderOptions","$rootScope","$http","$window","FileLikeObject","FileItem"]},function(e,t,n){"use strict";var r=function(e){return e&&e.__esModule?e["default"]:e},i=function(){function e(e,t){for(var n in t){var r=t[n];r.configurable=!0,r.value&&(r.writable=!0)}Object.defineProperties(e,t)}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},s=(r(n(2)),angular.copy),a=angular.isElement,u=angular.isString;e.exports=function(){var e=function(){function e(t){o(this,e);var n=a(t),r=n?t.value:t,i=u(r)?"FakePath":"Object",s="_createFrom"+i;this[s](r)}return i(e,{_createFromFakePath:{value:function(e){this.lastModifiedDate=null,this.size=null,this.type="like/"+e.slice(e.lastIndexOf(".")+1).toLowerCase(),this.name=e.slice(e.lastIndexOf("/")+e.lastIndexOf("\\")+2)}},_createFromObject:{value:function(e){this.lastModifiedDate=s(e.lastModifiedDate),this.size=e.size,this.type=e.type,this.name=e.name}}}),e}();return e},e.exports.$inject=[]},function(e,t,n){"use strict";var r=function(e){return e&&e.__esModule?e["default"]:e},i=function(){function e(e,t){for(var n in t){var r=t[n];r.configurable=!0,r.value&&(r.writable=!0)}Object.defineProperties(e,t)}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},s=(r(n(2)),angular.copy),a=angular.extend,u=angular.element,l=angular.isElement;e.exports=function(e,t){var n=function(){function n(e,r,i){o(this,n);var c=l(r),f=c?u(r):null,p=c?null:r;a(this,{url:e.url,alias:e.alias,headers:s(e.headers),formData:s(e.formData),removeAfterUpload:e.removeAfterUpload,withCredentials:e.withCredentials,method:e.method},i,{uploader:e,file:new t(r),isReady:!1,isUploading:!1,isUploaded:!1,isSuccess:!1,isCancel:!1,isError:!1,progress:0,index:null,_file:p,_input:f}),f&&this._replaceNode(f)}return i(n,{upload:{value:function(){try{this.uploader.uploadItem(this)}catch(e){this.uploader._onCompleteItem(this,"",0,[]),this.uploader._onErrorItem(this,"",0,[])}}},cancel:{value:function(){this.uploader.cancelItem(this)}},remove:{value:function(){this.uploader.removeFromQueue(this)}},onBeforeUpload:{value:function(){}},onProgress:{value:function(e){}},onSuccess:{value:function(e,t,n){}},onError:{value:function(e,t,n){}},onCancel:{value:function(e,t,n){}},onComplete:{value:function(e,t,n){}},_onBeforeUpload:{value:function(){this.isReady=!0,this.isUploading=!0,this.isUploaded=!1,this.isSuccess=!1,this.isCancel=!1,this.isError=!1,this.progress=0,this.onBeforeUpload()}},_onProgress:{value:function(e){this.progress=e,this.onProgress(e)}},_onSuccess:{value:function(e,t,n){this.isReady=!1,this.isUploading=!1,this.isUploaded=!0,this.isSuccess=!0,this.isCancel=!1,this.isError=!1,this.progress=100,this.index=null,this.onSuccess(e,t,n)}},_onError:{value:function(e,t,n){this.isReady=!1,this.isUploading=!1,this.isUploaded=!0,this.isSuccess=!1,this.isCancel=!1,this.isError=!0,this.progress=0,this.index=null,this.onError(e,t,n)}},_onCancel:{value:function(e,t,n){this.isReady=!1,this.isUploading=!1,this.isUploaded=!1,this.isSuccess=!1,this.isCancel=!0,this.isError=!1,this.progress=0,this.index=null,this.onCancel(e,t,n)}},_onComplete:{value:function(e,t,n){this.onComplete(e,t,n),this.removeAfterUpload&&this.remove()}},_destroy:{value:function(){this._input&&this._input.remove(),this._form&&this._form.remove(),delete this._form,delete this._input}},_prepareToUploading:{value:function(){this.index=this.index||++this.uploader._nextIndex,this.isReady=!0}},_replaceNode:{value:function(t){var n=e(t.clone())(t.scope());n.prop("value",null),t.css("display","none"),t.after(n)}}}),n}();return n},e.exports.$inject=["$compile","FileLikeObject"]},function(e,t,n){"use strict";var r=function(e){return e&&e.__esModule?e["default"]:e},i=function(){function e(e,t){for(var n in t){var r=t[n];r.configurable=!0,r.value&&(r.writable=!0)}Object.defineProperties(e,t)}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},s=(r(n(2)),angular.extend);e.exports=function(){var e=function(){function e(t){o(this,e),s(this,t),this.uploader._directives[this.prop].push(this),this._saveLinks(),this.bind()}return i(e,{bind:{value:function(){for(var e in this.events){var t=this.events[e];this.element.bind(e,this[t])}}},unbind:{value:function(){for(var e in this.events)this.element.unbind(e,this.events[e])}},destroy:{value:function(){var e=this.uploader._directives[this.prop].indexOf(this);this.uploader._directives[this.prop].splice(e,1),this.unbind()}},_saveLinks:{value:function(){for(var e in this.events){var t=this.events[e];this[t]=this[t].bind(this)}}}}),e}();return e.prototype.events={},e},e.exports.$inject=[]},function(e,t,n){"use strict";var r=function(e){return e&&e.__esModule?e["default"]:e},i=function(){function e(e,t){for(var n in t){var r=t[n];r.configurable=!0,r.value&&(r.writable=!0)}Object.defineProperties(e,t)}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=function l(e,t,n){var r=Object.getOwnPropertyDescriptor(e,t);if(void 0===r){var i=Object.getPrototypeOf(e);return null===i?void 0:l(i,t,n)}if("value"in r&&r.writable)return r.value;var o=r.get;return void 0===o?void 0:o.call(n)},s=function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)},a=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},u=(r(n(2)),angular.forEach);e.exports=function(e){var t=function(e){function t(e){a(this,t),this.events={$destroy:"destroy",drop:"onDrop",dragover:"onDragOver",dragleave:"onDragLeave"},this.prop="drop",o(Object.getPrototypeOf(t.prototype),"constructor",this).call(this,e)}return s(t,e),i(t,{getOptions:{value:function(){}},getFilters:{value:function(){}},onDrop:{value:function(e){var t=this._getTransfer(e);if(t){var n=this.getOptions(),r=this.getFilters();this._preventAndStop(e),u(this.uploader._directives.over,this._removeOverClass,this),this.uploader.addToQueue(t.files,n,r)}}},onDragOver:{value:function(e){var t=this._getTransfer(e);this._haveFiles(t.types)&&(t.dropEffect="copy",this._preventAndStop(e),u(this.uploader._directives.over,this._addOverClass,this))}},onDragLeave:{value:function(e){e.currentTarget!==this.element[0]&&(this._preventAndStop(e),u(this.uploader._directives.over,this._removeOverClass,this))}},_getTransfer:{value:function(e){return e.dataTransfer?e.dataTransfer:e.originalEvent.dataTransfer}},_preventAndStop:{value:function(e){e.preventDefault(),e.stopPropagation()}},_haveFiles:{value:function(e){return e?e.indexOf?-1!==e.indexOf("Files"):e.contains?e.contains("Files"):!1:!1}},_addOverClass:{value:function(e){e.addOverClass()}},_removeOverClass:{value:function(e){e.removeOverClass()}}}),t}(e);return t},e.exports.$inject=["FileDirective"]},function(e,t,n){"use strict";var r=function(e){return e&&e.__esModule?e["default"]:e},i=function(){function e(e,t){for(var n in t){var r=t[n];r.configurable=!0,r.value&&(r.writable=!0)}Object.defineProperties(e,t)}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=function u(e,t,n){var r=Object.getOwnPropertyDescriptor(e,t);if(void 0===r){var i=Object.getPrototypeOf(e);return null===i?void 0:u(i,t,n)}if("value"in r&&r.writable)return r.value;var o=r.get;return void 0===o?void 0:o.call(n)},s=function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(e.__proto__=t)},a=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")};r(n(2));e.exports=function(e){var t=function(e){function t(e){a(this,t),this.events={$destroy:"destroy"},this.prop="over",this.overClass="nv-file-over",o(Object.getPrototypeOf(t.prototype),"constructor",this).call(this,e)}return s(t,e),i(t,{addOverClass:{value:function(){this.element.addClass(this.getOverClass())}},removeOverClass:{value:function(){this.element.removeClass(this.getOverClass())}},getOverClass:{value:function(){return this.overClass}}}),t}(e);return t},e.exports.$inject=["FileDirective"]},function(e,t,n){"use strict";var r=function(e){return e&&e.__esModule?e["default"]:e};r(n(2));e.exports=function(e,t,n){return{link:function(r,i,o){var s=r.$eval(o.uploader);if(!(s instanceof t))throw new TypeError('"Uploader" must be an instance of FileUploader');var a=new n({uploader:s,element:i});a.getOptions=e(o.options).bind(a,r),a.getFilters=function(){return o.filters}}}},e.exports.$inject=["$parse","FileUploader","FileSelect"]},function(e,t,n){"use strict";var r=function(e){return e&&e.__esModule?e["default"]:e};r(n(2));e.exports=function(e,t,n){return{link:function(r,i,o){var s=r.$eval(o.uploader);if(!(s instanceof t))throw new TypeError('"Uploader" must be an instance of FileUploader');if(s.isHTML5){var a=new n({uploader:s,element:i});a.getOptions=e(o.options).bind(a,r),a.getFilters=function(){return o.filters}}}}},e.exports.$inject=["$parse","FileUploader","FileDrop"]},function(e,t,n){"use strict";var r=function(e){return e&&e.__esModule?e["default"]:e};r(n(2));e.exports=function(e,t){return{link:function(n,r,i){var o=n.$eval(i.uploader);if(!(o instanceof e))throw new TypeError('"Uploader" must be an instance of FileUploader');var s=new t({uploader:o,element:r});s.getOverClass=function(){return i.overClass||s.overClass}}}},e.exports.$inject=["FileUploader","FileOver"]}])}); -//# sourceMappingURL=angular-file-upload.min.js.map diff --git a/example-2.0/client/angular-file-upload.min.js.map b/example-2.0/client/angular-file-upload.min.js.map deleted file mode 100644 index 0109167..0000000 --- a/example-2.0/client/angular-file-upload.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///angular-file-upload.min.js","webpack:///webpack/bootstrap 8e42257eef0ea5c40144","webpack:///c:/OpenServer/domains/angular-file-upload.my/src/index.js","webpack:///c:/OpenServer/domains/angular-file-upload.my/src/services/FileSelect.js","webpack:///./src/config.json","webpack:///c:/OpenServer/domains/angular-file-upload.my/src/values/options.js","webpack:///c:/OpenServer/domains/angular-file-upload.my/src/services/FileUploader.js","webpack:///c:/OpenServer/domains/angular-file-upload.my/src/services/FileLikeObject.js","webpack:///c:/OpenServer/domains/angular-file-upload.my/src/services/FileItem.js","webpack:///c:/OpenServer/domains/angular-file-upload.my/src/services/FileDirective.js","webpack:///c:/OpenServer/domains/angular-file-upload.my/src/services/FileDrop.js","webpack:///c:/OpenServer/domains/angular-file-upload.my/src/services/FileOver.js","webpack:///c:/OpenServer/domains/angular-file-upload.my/src/directives/FileSelect.js","webpack:///c:/OpenServer/domains/angular-file-upload.my/src/directives/FileDrop.js","webpack:///c:/OpenServer/domains/angular-file-upload.my/src/directives/FileOver.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_interopRequire","obj","__esModule","CONFIG","options","serviceFileUploader","serviceFileLikeObject","serviceFileItem","serviceFileDirective","serviceFileSelect","serviceFileDrop","serviceFileOver","directiveFileSelect","directiveFileDrop","directiveFileOver","angular","name","value","directive","run","FileUploader","FileLikeObject","FileItem","FileDirective","FileSelect","FileDrop","FileOver","_createClass","defineProperties","target","props","key","prop","configurable","writable","Object","Constructor","protoProps","staticProps","prototype","_get","get","object","property","receiver","desc","getOwnPropertyDescriptor","undefined","parent","getPrototypeOf","getter","_inherits","subClass","superClass","TypeError","create","constructor","enumerable","__proto__","_classCallCheck","instance","_FileDirective","events","$destroy","change","uploader","isHTML5","element","removeAttr","getOptions","getFilters","isEmptyAfterSelection","attr","onChange","files","filters","destroy","addToQueue","$inject","url","alias","headers","queue","progress","autoUpload","removeAfterUpload","method","formData","queueLimit","Number","MAX_VALUE","withCredentials","copy","extend","forEach","isObject","isNumber","isDefined","isArray","fileUploaderOptions","$rootScope","$http","$window","File","FormData","settings","isUploading","_nextIndex","_failFilterIndex","_directives","select","drop","over","unshift","fn","_queueLimitFilter","_folderFilter","_this","list","isArrayLikeObject","arrayOfFilters","_getFilters","count","length","addedFileItems","some","temp","_isValidFile","fileItem","push","_onAfterAddingFile","filter","_onWhenAddingFileFailed","_onAfterAddingAll","_getTotalProgress","_render","uploadAll","removeFromQueue","index","getIndexOfItem","item","cancel","splice","_destroy","clearQueue","remove","uploadItem","transport","_prepareToUploading","cancelItem","abort","items","getNotUploadedItems","upload","cancelAll","isFile","isFileLikeObject","indexOf","isUploaded","getReadyItems","isReady","sort","item1","item2","onAfterAddingAll","fileItems","onAfterAddingFile","onWhenAddingFileFailed","onBeforeUploadItem","onProgressItem","onProgressAll","onSuccessItem","response","status","onErrorItem","onCancelItem","onCompleteItem","onCompleteAll","notUploaded","uploaded","ratio","current","Math","round","names","match","$$phase","$apply","size","type","file","every","_isSuccessCode","_transformResponse","headersGetter","_headersGetter","defaults","transformResponse","transformFn","_parseHeaders","val","i","parsed","split","line","slice","trim","toLowerCase","parsedHeaders","_xhrTransport","xhr","_xhr","XMLHttpRequest","form","_onBeforeUploadItem","append","_file","onprogress","event","lengthComputable","total","_onProgressItem","onload","getAllResponseHeaders","gist","_onCompleteItem","onerror","_onErrorItem","onabort","_onCancelItem","open","setRequestHeader","send","_iframeTransport","iframe","Date","now","input","_input","_form","replaceWith","element_","action","enctype","encoding","bind","html","contentDocument","body","innerHTML","e","dummy","_onSuccessItem","unbind","after","submit","_onBeforeUpload","_onProgress","_onSuccess","_onError","_onCancel","_onComplete","nextItem","inherit","source","super_","isElement","isString","fileOrInput","isInput","fakePathOrObject","postfix","_createFromFakePath","path","lastModifiedDate","lastIndexOf","_createFromObject","$compile","isSuccess","isCancel","isError","_replaceNode","onBeforeUpload","onProgress","onSuccess","onError","onCancel","onComplete","clone","scope","css","_saveLinks","dragover","dragleave","onDrop","transfer","_getTransfer","_preventAndStop","_removeOverClass","onDragOver","_haveFiles","types","dropEffect","_addOverClass","onDragLeave","currentTarget","dataTransfer","originalEvent","preventDefault","stopPropagation","contains","addOverClass","removeOverClass","overClass","addClass","getOverClass","removeClass","$parse","link","attributes","$eval"],"mappings":"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","file":"angular-file-upload.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"angular-file-upload\"] = factory();\n\telse\n\t\troot[\"angular-file-upload\"] = factory();\n})(this, function() {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"angular-file-upload\"] = factory();\n\telse\n\t\troot[\"angular-file-upload\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tvar _interopRequire = function (obj) { return obj && obj.__esModule ? obj[\"default\"] : obj; };\n\t\n\tvar CONFIG = _interopRequire(__webpack_require__(2));\n\t\n\tvar options = _interopRequire(__webpack_require__(3));\n\t\n\tvar serviceFileUploader = _interopRequire(__webpack_require__(4));\n\t\n\tvar serviceFileLikeObject = _interopRequire(__webpack_require__(5));\n\t\n\tvar serviceFileItem = _interopRequire(__webpack_require__(6));\n\t\n\tvar serviceFileDirective = _interopRequire(__webpack_require__(7));\n\t\n\tvar serviceFileSelect = _interopRequire(__webpack_require__(1));\n\t\n\tvar serviceFileDrop = _interopRequire(__webpack_require__(8));\n\t\n\tvar serviceFileOver = _interopRequire(__webpack_require__(9));\n\t\n\tvar directiveFileSelect = _interopRequire(__webpack_require__(10));\n\t\n\tvar directiveFileDrop = _interopRequire(__webpack_require__(11));\n\t\n\tvar directiveFileOver = _interopRequire(__webpack_require__(12));\n\t\n\tangular.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) {\n\t // only for compatibility\n\t FileUploader.FileLikeObject = FileLikeObject;\n\t FileUploader.FileItem = FileItem;\n\t FileUploader.FileDirective = FileDirective;\n\t FileUploader.FileSelect = FileSelect;\n\t FileUploader.FileDrop = FileDrop;\n\t FileUploader.FileOver = FileOver;\n\t}]);\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tvar _interopRequire = function (obj) { return obj && obj.__esModule ? obj[\"default\"] : obj; };\n\t\n\tvar _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; }; })();\n\t\n\tvar _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\t\n\tvar _inherits = function (subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; };\n\t\n\tvar _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } };\n\t\n\tvar CONFIG = _interopRequire(__webpack_require__(2));\n\t\n\tmodule.exports = function (FileDirective) {\n\t var FileSelect = (function (_FileDirective) {\n\t /**\r\n\t * Creates instance of {FileSelect} object\r\n\t * @param {Object} options\r\n\t * @constructor\r\n\t */\n\t\n\t function FileSelect(options) {\n\t _classCallCheck(this, FileSelect);\n\t\n\t // Map of events\n\t this.events = {\n\t $destroy: \"destroy\",\n\t change: \"onChange\"\n\t };\n\t // Name of property inside uploader._directive object\n\t this.prop = \"select\";\n\t\n\t _get(Object.getPrototypeOf(FileSelect.prototype), \"constructor\", this).call(this, options);\n\t\n\t if (!this.uploader.isHTML5) {\n\t this.element.removeAttr(\"multiple\");\n\t }\n\t this.element.prop(\"value\", null); // FF fix\n\t }\n\t\n\t _inherits(FileSelect, _FileDirective);\n\t\n\t _createClass(FileSelect, {\n\t getOptions: {\n\t /**\r\n\t * Returns options\r\n\t * @return {Object|undefined}\r\n\t */\n\t\n\t value: function getOptions() {}\n\t },\n\t getFilters: {\n\t /**\r\n\t * Returns filters\r\n\t * @return {Array|String|undefined}\r\n\t */\n\t\n\t value: function getFilters() {}\n\t },\n\t isEmptyAfterSelection: {\n\t /**\r\n\t * If returns \"true\" then HTMLInputElement will be cleared\r\n\t * @returns {Boolean}\r\n\t */\n\t\n\t value: function isEmptyAfterSelection() {\n\t return !!this.element.attr(\"multiple\");\n\t }\n\t },\n\t onChange: {\n\t /**\r\n\t * Event handler\r\n\t */\n\t\n\t value: function onChange() {\n\t var files = this.uploader.isHTML5 ? this.element[0].files : this.element[0];\n\t var options = this.getOptions();\n\t var filters = this.getFilters();\n\t\n\t if (!this.uploader.isHTML5) this.destroy();\n\t this.uploader.addToQueue(files, options, filters);\n\t if (this.isEmptyAfterSelection()) this.element.prop(\"value\", null);\n\t }\n\t }\n\t });\n\t\n\t return FileSelect;\n\t })(FileDirective);\n\t\n\t return FileSelect;\n\t};\n\t\n\tmodule.exports.$inject = [\"FileDirective\"];\n\n/***/ },\n/* 2 */\n/***/ function(module, exports) {\n\n\tmodule.exports = {\n\t\t\"name\": \"angularFileUpload\"\n\t}\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t\n\tmodule.exports = {\n\t url: \"/\",\n\t alias: \"file\",\n\t headers: {},\n\t queue: [],\n\t progress: 0,\n\t autoUpload: false,\n\t removeAfterUpload: false,\n\t method: \"POST\",\n\t filters: [],\n\t formData: [],\n\t queueLimit: Number.MAX_VALUE,\n\t withCredentials: false\n\t};\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tvar _interopRequire = function (obj) { return obj && obj.__esModule ? obj[\"default\"] : obj; };\n\t\n\tvar _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; }; })();\n\t\n\tvar _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } };\n\t\n\tvar CONFIG = _interopRequire(__webpack_require__(2));\n\t\n\tvar copy = angular.copy;\n\tvar extend = angular.extend;\n\tvar forEach = angular.forEach;\n\tvar isObject = angular.isObject;\n\tvar isNumber = angular.isNumber;\n\tvar isDefined = angular.isDefined;\n\tvar isArray = angular.isArray;\n\tvar element = angular.element;\n\t\n\tmodule.exports = function (fileUploaderOptions, $rootScope, $http, $window, FileLikeObject, FileItem) {\n\t var File = $window.File;\n\t var FormData = $window.FormData;\n\t\n\t var FileUploader = (function () {\n\t /**********************\r\n\t * PUBLIC\r\n\t **********************/\n\t /**\r\n\t * Creates an instance of FileUploader\r\n\t * @param {Object} [options]\r\n\t * @constructor\r\n\t */\n\t\n\t function FileUploader(options) {\n\t _classCallCheck(this, FileUploader);\n\t\n\t var settings = copy(fileUploaderOptions);\n\t\n\t extend(this, settings, options, {\n\t isUploading: false,\n\t _nextIndex: 0,\n\t _failFilterIndex: -1,\n\t _directives: { select: [], drop: [], over: [] }\n\t });\n\t\n\t // add default filters\n\t this.filters.unshift({ name: \"queueLimit\", fn: this._queueLimitFilter });\n\t this.filters.unshift({ name: \"folder\", fn: this._folderFilter });\n\t }\n\t\n\t _createClass(FileUploader, {\n\t addToQueue: {\n\t /**\r\n\t * Adds items to the queue\r\n\t * @param {File|HTMLInputElement|Object|FileList|Array} files\r\n\t * @param {Object} [options]\r\n\t * @param {Array|String} filters\r\n\t */\n\t\n\t value: function addToQueue(files, options, filters) {\n\t var _this = this;\n\t\n\t var list = this.isArrayLikeObject(files) ? files : [files];\n\t var arrayOfFilters = this._getFilters(filters);\n\t var count = this.queue.length;\n\t var addedFileItems = [];\n\t\n\t forEach(list, function (some /*{File|HTMLInputElement|Object}*/) {\n\t var temp = new FileLikeObject(some);\n\t\n\t if (_this._isValidFile(temp, arrayOfFilters, options)) {\n\t var fileItem = new FileItem(_this, some, options);\n\t addedFileItems.push(fileItem);\n\t _this.queue.push(fileItem);\n\t _this._onAfterAddingFile(fileItem);\n\t } else {\n\t var filter = arrayOfFilters[_this._failFilterIndex];\n\t _this._onWhenAddingFileFailed(temp, filter, options);\n\t }\n\t });\n\t\n\t if (this.queue.length !== count) {\n\t this._onAfterAddingAll(addedFileItems);\n\t this.progress = this._getTotalProgress();\n\t }\n\t\n\t this._render();\n\t if (this.autoUpload) this.uploadAll();\n\t }\n\t },\n\t removeFromQueue: {\n\t /**\r\n\t * Remove items from the queue. Remove last: index = -1\r\n\t * @param {FileItem|Number} value\r\n\t */\n\t\n\t value: function removeFromQueue(value) {\n\t var index = this.getIndexOfItem(value);\n\t var item = this.queue[index];\n\t if (item.isUploading) item.cancel();\n\t this.queue.splice(index, 1);\n\t item._destroy();\n\t this.progress = this._getTotalProgress();\n\t }\n\t },\n\t clearQueue: {\n\t /**\r\n\t * Clears the queue\r\n\t */\n\t\n\t value: function clearQueue() {\n\t while (this.queue.length) {\n\t this.queue[0].remove();\n\t }\n\t this.progress = 0;\n\t }\n\t },\n\t uploadItem: {\n\t /**\r\n\t * Uploads a item from the queue\r\n\t * @param {FileItem|Number} value\r\n\t */\n\t\n\t value: function uploadItem(value) {\n\t var index = this.getIndexOfItem(value);\n\t var item = this.queue[index];\n\t var transport = this.isHTML5 ? \"_xhrTransport\" : \"_iframeTransport\";\n\t\n\t item._prepareToUploading();\n\t if (this.isUploading) {\n\t return;\n\t }this.isUploading = true;\n\t this[transport](item);\n\t }\n\t },\n\t cancelItem: {\n\t /**\r\n\t * Cancels uploading of item from the queue\r\n\t * @param {FileItem|Number} value\r\n\t */\n\t\n\t value: function cancelItem(value) {\n\t var index = this.getIndexOfItem(value);\n\t var item = this.queue[index];\n\t var prop = this.isHTML5 ? \"_xhr\" : \"_form\";\n\t if (item && item.isUploading) item[prop].abort();\n\t }\n\t },\n\t uploadAll: {\n\t /**\r\n\t * Uploads all not uploaded items of queue\r\n\t */\n\t\n\t value: function uploadAll() {\n\t var items = this.getNotUploadedItems().filter(function (item) {\n\t return !item.isUploading;\n\t });\n\t if (!items.length) {\n\t return;\n\t }forEach(items, function (item) {\n\t return item._prepareToUploading();\n\t });\n\t items[0].upload();\n\t }\n\t },\n\t cancelAll: {\n\t /**\r\n\t * Cancels all uploads\r\n\t */\n\t\n\t value: function cancelAll() {\n\t var items = this.getNotUploadedItems();\n\t forEach(items, function (item) {\n\t return item.cancel();\n\t });\n\t }\n\t },\n\t isFile: {\n\t /**\r\n\t * Returns \"true\" if value an instance of File\r\n\t * @param {*} value\r\n\t * @returns {Boolean}\r\n\t * @private\r\n\t */\n\t\n\t value: function isFile(value) {\n\t return this.constructor.isFile(value);\n\t }\n\t },\n\t isFileLikeObject: {\n\t /**\r\n\t * Returns \"true\" if value an instance of FileLikeObject\r\n\t * @param {*} value\r\n\t * @returns {Boolean}\r\n\t * @private\r\n\t */\n\t\n\t value: function isFileLikeObject(value) {\n\t return this.constructor.isFileLikeObject(value);\n\t }\n\t },\n\t isArrayLikeObject: {\n\t /**\r\n\t * Returns \"true\" if value is array like object\r\n\t * @param {*} value\r\n\t * @returns {Boolean}\r\n\t */\n\t\n\t value: function isArrayLikeObject(value) {\n\t return this.constructor.isArrayLikeObject(value);\n\t }\n\t },\n\t getIndexOfItem: {\n\t /**\r\n\t * Returns a index of item from the queue\r\n\t * @param {Item|Number} value\r\n\t * @returns {Number}\r\n\t */\n\t\n\t value: function getIndexOfItem(value) {\n\t return isNumber(value) ? value : this.queue.indexOf(value);\n\t }\n\t },\n\t getNotUploadedItems: {\n\t /**\r\n\t * Returns not uploaded items\r\n\t * @returns {Array}\r\n\t */\n\t\n\t value: function getNotUploadedItems() {\n\t return this.queue.filter(function (item) {\n\t return !item.isUploaded;\n\t });\n\t }\n\t },\n\t getReadyItems: {\n\t /**\r\n\t * Returns items ready for upload\r\n\t * @returns {Array}\r\n\t */\n\t\n\t value: function getReadyItems() {\n\t return this.queue.filter(function (item) {\n\t return item.isReady && !item.isUploading;\n\t }).sort(function (item1, item2) {\n\t return item1.index - item2.index;\n\t });\n\t }\n\t },\n\t destroy: {\n\t /**\r\n\t * Destroys instance of FileUploader\r\n\t */\n\t\n\t value: function destroy() {\n\t var _this = this;\n\t\n\t forEach(this._directives, function (key) {\n\t forEach(_this._directives[key], function (object) {\n\t object.destroy();\n\t });\n\t });\n\t }\n\t },\n\t onAfterAddingAll: {\n\t /**\r\n\t * Callback\r\n\t * @param {Array} fileItems\r\n\t */\n\t\n\t value: function onAfterAddingAll(fileItems) {}\n\t },\n\t onAfterAddingFile: {\n\t /**\r\n\t * Callback\r\n\t * @param {FileItem} fileItem\r\n\t */\n\t\n\t value: function onAfterAddingFile(fileItem) {}\n\t },\n\t onWhenAddingFileFailed: {\n\t /**\r\n\t * Callback\r\n\t * @param {File|Object} item\r\n\t * @param {Object} filter\r\n\t * @param {Object} options\r\n\t */\n\t\n\t value: function onWhenAddingFileFailed(item, filter, options) {}\n\t },\n\t onBeforeUploadItem: {\n\t /**\r\n\t * Callback\r\n\t * @param {FileItem} fileItem\r\n\t */\n\t\n\t value: function onBeforeUploadItem(fileItem) {}\n\t },\n\t onProgressItem: {\n\t /**\r\n\t * Callback\r\n\t * @param {FileItem} fileItem\r\n\t * @param {Number} progress\r\n\t */\n\t\n\t value: function onProgressItem(fileItem, progress) {}\n\t },\n\t onProgressAll: {\n\t /**\r\n\t * Callback\r\n\t * @param {Number} progress\r\n\t */\n\t\n\t value: function onProgressAll(progress) {}\n\t },\n\t onSuccessItem: {\n\t /**\r\n\t * Callback\r\n\t * @param {FileItem} item\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t */\n\t\n\t value: function onSuccessItem(item, response, status, headers) {}\n\t },\n\t onErrorItem: {\n\t /**\r\n\t * Callback\r\n\t * @param {FileItem} item\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t */\n\t\n\t value: function onErrorItem(item, response, status, headers) {}\n\t },\n\t onCancelItem: {\n\t /**\r\n\t * Callback\r\n\t * @param {FileItem} item\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t */\n\t\n\t value: function onCancelItem(item, response, status, headers) {}\n\t },\n\t onCompleteItem: {\n\t /**\r\n\t * Callback\r\n\t * @param {FileItem} item\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t */\n\t\n\t value: function onCompleteItem(item, response, status, headers) {}\n\t },\n\t onCompleteAll: {\n\t /**\r\n\t * Callback\r\n\t */\n\t\n\t value: function onCompleteAll() {}\n\t },\n\t _getTotalProgress: {\n\t /**********************\r\n\t * PRIVATE\r\n\t **********************/\n\t /**\r\n\t * Returns the total progress\r\n\t * @param {Number} [value]\r\n\t * @returns {Number}\r\n\t * @private\r\n\t */\n\t\n\t value: function _getTotalProgress(value) {\n\t if (this.removeAfterUpload) {\n\t return value || 0;\n\t }var notUploaded = this.getNotUploadedItems().length;\n\t var uploaded = notUploaded ? this.queue.length - notUploaded : this.queue.length;\n\t var ratio = 100 / this.queue.length;\n\t var current = (value || 0) * ratio / 100;\n\t\n\t return Math.round(uploaded * ratio + current);\n\t }\n\t },\n\t _getFilters: {\n\t /**\r\n\t * Returns array of filters\r\n\t * @param {Array|String} filters\r\n\t * @returns {Array}\r\n\t * @private\r\n\t */\n\t\n\t value: function _getFilters(filters) {\n\t if (!filters) {\n\t return this.filters;\n\t }if (isArray(filters)) {\n\t return filters;\n\t }var names = filters.match(/[^\\s,]+/g);\n\t return this.filters.filter(function (filter) {\n\t return names.indexOf(filter.name) !== -1;\n\t });\n\t }\n\t },\n\t _render: {\n\t /**\r\n\t * Updates html\r\n\t * @private\r\n\t */\n\t\n\t value: function _render() {\n\t if (!$rootScope.$$phase) $rootScope.$apply();\n\t }\n\t },\n\t _folderFilter: {\n\t /**\r\n\t * Returns \"true\" if item is a file (not folder)\r\n\t * @param {File|FileLikeObject} item\r\n\t * @returns {Boolean}\r\n\t * @private\r\n\t */\n\t\n\t value: function _folderFilter(item) {\n\t return !!(item.size || item.type);\n\t }\n\t },\n\t _queueLimitFilter: {\n\t /**\r\n\t * Returns \"true\" if the limit has not been reached\r\n\t * @returns {Boolean}\r\n\t * @private\r\n\t */\n\t\n\t value: function _queueLimitFilter() {\n\t return this.queue.length < this.queueLimit;\n\t }\n\t },\n\t _isValidFile: {\n\t /**\r\n\t * Returns \"true\" if file pass all filters\r\n\t * @param {File|Object} file\r\n\t * @param {Array} filters\r\n\t * @param {Object} options\r\n\t * @returns {Boolean}\r\n\t * @private\r\n\t */\n\t\n\t value: function _isValidFile(file, filters, options) {\n\t var _this = this;\n\t\n\t this._failFilterIndex = -1;\n\t return !filters.length ? true : filters.every(function (filter) {\n\t _this._failFilterIndex++;\n\t return filter.fn.call(_this, file, options);\n\t });\n\t }\n\t },\n\t _isSuccessCode: {\n\t /**\r\n\t * Checks whether upload successful\r\n\t * @param {Number} status\r\n\t * @returns {Boolean}\r\n\t * @private\r\n\t */\n\t\n\t value: function _isSuccessCode(status) {\n\t return status >= 200 && status < 300 || status === 304;\n\t }\n\t },\n\t _transformResponse: {\n\t /**\r\n\t * Transforms the server response\r\n\t * @param {*} response\r\n\t * @param {Object} headers\r\n\t * @returns {*}\r\n\t * @private\r\n\t */\n\t\n\t value: function _transformResponse(response, headers) {\n\t var headersGetter = this._headersGetter(headers);\n\t forEach($http.defaults.transformResponse, function (transformFn) {\n\t response = transformFn(response, headersGetter);\n\t });\n\t return response;\n\t }\n\t },\n\t _parseHeaders: {\n\t /**\r\n\t * Parsed response headers\r\n\t * @param headers\r\n\t * @returns {Object}\r\n\t * @see https://github.com/angular/angular.js/blob/master/src/ng/http.js\r\n\t * @private\r\n\t */\n\t\n\t value: function _parseHeaders(headers) {\n\t var parsed = {},\n\t key,\n\t val,\n\t i;\n\t\n\t if (!headers) {\n\t return parsed;\n\t }forEach(headers.split(\"\\n\"), function (line) {\n\t i = line.indexOf(\":\");\n\t key = line.slice(0, i).trim().toLowerCase();\n\t val = line.slice(i + 1).trim();\n\t\n\t if (key) {\n\t parsed[key] = parsed[key] ? parsed[key] + \", \" + val : val;\n\t }\n\t });\n\t\n\t return parsed;\n\t }\n\t },\n\t _headersGetter: {\n\t /**\r\n\t * Returns function that returns headers\r\n\t * @param {Object} parsedHeaders\r\n\t * @returns {Function}\r\n\t * @private\r\n\t */\n\t\n\t value: function _headersGetter(parsedHeaders) {\n\t return function (name) {\n\t if (name) {\n\t return parsedHeaders[name.toLowerCase()] || null;\n\t }\n\t return parsedHeaders;\n\t };\n\t }\n\t },\n\t _xhrTransport: {\n\t /**\r\n\t * The XMLHttpRequest transport\r\n\t * @param {FileItem} item\r\n\t * @private\r\n\t */\n\t\n\t value: function _xhrTransport(item) {\n\t var _this = this;\n\t\n\t var xhr = item._xhr = new XMLHttpRequest();\n\t var form = new FormData();\n\t\n\t this._onBeforeUploadItem(item);\n\t\n\t forEach(item.formData, function (obj) {\n\t forEach(obj, function (value, key) {\n\t form.append(key, value);\n\t });\n\t });\n\t\n\t if (typeof item._file.size != \"number\") {\n\t throw new TypeError(\"The file specified is no longer valid\");\n\t }\n\t\n\t form.append(item.alias, item._file, item.file.name);\n\t\n\t xhr.upload.onprogress = function (event) {\n\t var progress = Math.round(event.lengthComputable ? event.loaded * 100 / event.total : 0);\n\t _this._onProgressItem(item, progress);\n\t };\n\t\n\t xhr.onload = function () {\n\t var headers = _this._parseHeaders(xhr.getAllResponseHeaders());\n\t var response = _this._transformResponse(xhr.response, headers);\n\t var gist = _this._isSuccessCode(xhr.status) ? \"Success\" : \"Error\";\n\t var method = \"_on\" + gist + \"Item\";\n\t _this[method](item, response, xhr.status, headers);\n\t _this._onCompleteItem(item, response, xhr.status, headers);\n\t };\n\t\n\t xhr.onerror = function () {\n\t var headers = _this._parseHeaders(xhr.getAllResponseHeaders());\n\t var response = _this._transformResponse(xhr.response, headers);\n\t _this._onErrorItem(item, response, xhr.status, headers);\n\t _this._onCompleteItem(item, response, xhr.status, headers);\n\t };\n\t\n\t xhr.onabort = function () {\n\t var headers = _this._parseHeaders(xhr.getAllResponseHeaders());\n\t var response = _this._transformResponse(xhr.response, headers);\n\t _this._onCancelItem(item, response, xhr.status, headers);\n\t _this._onCompleteItem(item, response, xhr.status, headers);\n\t };\n\t\n\t xhr.open(item.method, item.url, true);\n\t\n\t xhr.withCredentials = item.withCredentials;\n\t\n\t forEach(item.headers, function (value, name) {\n\t xhr.setRequestHeader(name, value);\n\t });\n\t\n\t xhr.send(form);\n\t this._render();\n\t }\n\t },\n\t _iframeTransport: {\n\t /**\r\n\t * The IFrame transport\r\n\t * @param {FileItem} item\r\n\t * @private\r\n\t */\n\t\n\t value: function _iframeTransport(item) {\n\t var _this = this;\n\t\n\t var form = element(\"\");\n\t var iframe = element(\"\");\n\t var input = item._input;\n\t\n\t if (item._form) item._form.replaceWith(input); // remove old form\n\t item._form = form; // save link to new form\n\t\n\t this._onBeforeUploadItem(item);\n\t\n\t input.prop(\"name\", item.alias);\n\t\n\t forEach(item.formData, function (obj) {\n\t forEach(obj, function (value, key) {\n\t var element_ = element(\"\");\n\t element_.val(value);\n\t form.append(element_);\n\t });\n\t });\n\t\n\t form.prop({\n\t action: item.url,\n\t method: \"POST\",\n\t target: iframe.prop(\"name\"),\n\t enctype: \"multipart/form-data\",\n\t encoding: \"multipart/form-data\" // old IE\n\t });\n\t\n\t iframe.bind(\"load\", function () {\n\t var html = \"\";\n\t var status = 200;\n\t\n\t try {\n\t // Fix for legacy IE browsers that loads internal error page\n\t // when failed WS response received. In consequence iframe\n\t // content access denied error is thrown becouse trying to\n\t // access cross domain page. When such thing occurs notifying\n\t // with empty response object. See more info at:\n\t // http://stackoverflow.com/questions/151362/access-is-denied-error-on-accessing-iframe-document-object\n\t // Note that if non standard 4xx or 5xx error code returned\n\t // from WS then response content can be accessed without error\n\t // but 'XHR' status becomes 200. In order to avoid confusion\n\t // returning response via same 'success' event handler.\n\t\n\t // fixed angular.contents() for iframes\n\t html = iframe[0].contentDocument.body.innerHTML;\n\t } catch (e) {\n\t // in case we run into the access-is-denied error or we have another error on the server side\n\t // (intentional 500,40... errors), we at least say 'something went wrong' -> 500\n\t status = 500;\n\t }\n\t\n\t var xhr = { response: html, status: status, dummy: true };\n\t var headers = {};\n\t var response = _this._transformResponse(xhr.response, headers);\n\t\n\t _this._onSuccessItem(item, response, xhr.status, headers);\n\t _this._onCompleteItem(item, response, xhr.status, headers);\n\t });\n\t\n\t form.abort = function () {\n\t var xhr = { status: 0, dummy: true };\n\t var headers = {};\n\t var response;\n\t\n\t iframe.unbind(\"load\").prop(\"src\", \"javascript:false;\");\n\t form.replaceWith(input);\n\t\n\t _this._onCancelItem(item, response, xhr.status, headers);\n\t _this._onCompleteItem(item, response, xhr.status, headers);\n\t };\n\t\n\t input.after(form);\n\t form.append(input).append(iframe);\n\t\n\t form[0].submit();\n\t this._render();\n\t }\n\t },\n\t _onWhenAddingFileFailed: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {File|Object} item\r\n\t * @param {Object} filter\r\n\t * @param {Object} options\r\n\t * @private\r\n\t */\n\t\n\t value: function _onWhenAddingFileFailed(item, filter, options) {\n\t this.onWhenAddingFileFailed(item, filter, options);\n\t }\n\t },\n\t _onAfterAddingFile: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {FileItem} item\r\n\t */\n\t\n\t value: function _onAfterAddingFile(item) {\n\t this.onAfterAddingFile(item);\n\t }\n\t },\n\t _onAfterAddingAll: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {Array} items\r\n\t */\n\t\n\t value: function _onAfterAddingAll(items) {\n\t this.onAfterAddingAll(items);\n\t }\n\t },\n\t _onBeforeUploadItem: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {FileItem} item\r\n\t * @private\r\n\t */\n\t\n\t value: function _onBeforeUploadItem(item) {\n\t item._onBeforeUpload();\n\t this.onBeforeUploadItem(item);\n\t }\n\t },\n\t _onProgressItem: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {FileItem} item\r\n\t * @param {Number} progress\r\n\t * @private\r\n\t */\n\t\n\t value: function _onProgressItem(item, progress) {\n\t var total = this._getTotalProgress(progress);\n\t this.progress = total;\n\t item._onProgress(progress);\n\t this.onProgressItem(item, progress);\n\t this.onProgressAll(total);\n\t this._render();\n\t }\n\t },\n\t _onSuccessItem: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {FileItem} item\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t * @private\r\n\t */\n\t\n\t value: function _onSuccessItem(item, response, status, headers) {\n\t item._onSuccess(response, status, headers);\n\t this.onSuccessItem(item, response, status, headers);\n\t }\n\t },\n\t _onErrorItem: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {FileItem} item\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t * @private\r\n\t */\n\t\n\t value: function _onErrorItem(item, response, status, headers) {\n\t item._onError(response, status, headers);\n\t this.onErrorItem(item, response, status, headers);\n\t }\n\t },\n\t _onCancelItem: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {FileItem} item\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t * @private\r\n\t */\n\t\n\t value: function _onCancelItem(item, response, status, headers) {\n\t item._onCancel(response, status, headers);\n\t this.onCancelItem(item, response, status, headers);\n\t }\n\t },\n\t _onCompleteItem: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {FileItem} item\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t * @private\r\n\t */\n\t\n\t value: function _onCompleteItem(item, response, status, headers) {\n\t item._onComplete(response, status, headers);\n\t this.onCompleteItem(item, response, status, headers);\n\t\n\t var nextItem = this.getReadyItems()[0];\n\t this.isUploading = false;\n\t\n\t if (isDefined(nextItem)) {\n\t nextItem.upload();\n\t return;\n\t }\n\t\n\t this.onCompleteAll();\n\t this.progress = this._getTotalProgress();\n\t this._render();\n\t }\n\t }\n\t }, {\n\t isFile: {\n\t /**********************\r\n\t * STATIC\r\n\t **********************/\n\t /**\r\n\t * Returns \"true\" if value an instance of File\r\n\t * @param {*} value\r\n\t * @returns {Boolean}\r\n\t * @private\r\n\t */\n\t\n\t value: function isFile(value) {\n\t return File && value instanceof File;\n\t }\n\t },\n\t isFileLikeObject: {\n\t /**\r\n\t * Returns \"true\" if value an instance of FileLikeObject\r\n\t * @param {*} value\r\n\t * @returns {Boolean}\r\n\t * @private\r\n\t */\n\t\n\t value: function isFileLikeObject(value) {\n\t return value instanceof FileLikeObject;\n\t }\n\t },\n\t isArrayLikeObject: {\n\t /**\r\n\t * Returns \"true\" if value is array like object\r\n\t * @param {*} value\r\n\t * @returns {Boolean}\r\n\t */\n\t\n\t value: function isArrayLikeObject(value) {\n\t return isObject(value) && \"length\" in value;\n\t }\n\t },\n\t inherit: {\n\t /**\r\n\t * Inherits a target (Class_1) by a source (Class_2)\r\n\t * @param {Function} target\r\n\t * @param {Function} source\r\n\t */\n\t\n\t value: function inherit(target, source) {\n\t target.prototype = Object.create(source.prototype);\n\t target.prototype.constructor = target;\n\t target.super_ = source;\n\t }\n\t }\n\t });\n\t\n\t return FileUploader;\n\t })();\n\t\n\t /**********************\r\n\t * PUBLIC\r\n\t **********************/\n\t /**\r\n\t * Checks a support the html5 uploader\r\n\t * @returns {Boolean}\r\n\t * @readonly\r\n\t */\n\t FileUploader.prototype.isHTML5 = !!(File && FormData);\n\t /**********************\r\n\t * STATIC\r\n\t **********************/\n\t /**\r\n\t * @borrows FileUploader.prototype.isHTML5\r\n\t */\n\t FileUploader.isHTML5 = FileUploader.prototype.isHTML5;\n\t\n\t return FileUploader;\n\t};\n\t\n\tmodule.exports.$inject = [\"fileUploaderOptions\", \"$rootScope\", \"$http\", \"$window\", \"FileLikeObject\", \"FileItem\"];\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tvar _interopRequire = function (obj) { return obj && obj.__esModule ? obj[\"default\"] : obj; };\n\t\n\tvar _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; }; })();\n\t\n\tvar _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } };\n\t\n\tvar CONFIG = _interopRequire(__webpack_require__(2));\n\t\n\tvar copy = angular.copy;\n\tvar isElement = angular.isElement;\n\tvar isString = angular.isString;\n\t\n\tmodule.exports = function () {\n\t var FileLikeObject = (function () {\n\t /**\r\n\t * Creates an instance of FileLikeObject\r\n\t * @param {File|HTMLInputElement|Object} fileOrInput\r\n\t * @constructor\r\n\t */\n\t\n\t function FileLikeObject(fileOrInput) {\n\t _classCallCheck(this, FileLikeObject);\n\t\n\t var isInput = isElement(fileOrInput);\n\t var fakePathOrObject = isInput ? fileOrInput.value : fileOrInput;\n\t var postfix = isString(fakePathOrObject) ? \"FakePath\" : \"Object\";\n\t var method = \"_createFrom\" + postfix;\n\t this[method](fakePathOrObject);\n\t }\n\t\n\t _createClass(FileLikeObject, {\n\t _createFromFakePath: {\n\t /**\r\n\t * Creates file like object from fake path string\r\n\t * @param {String} path\r\n\t * @private\r\n\t */\n\t\n\t value: function _createFromFakePath(path) {\n\t this.lastModifiedDate = null;\n\t this.size = null;\n\t this.type = \"like/\" + path.slice(path.lastIndexOf(\".\") + 1).toLowerCase();\n\t this.name = path.slice(path.lastIndexOf(\"/\") + path.lastIndexOf(\"\\\\\") + 2);\n\t }\n\t },\n\t _createFromObject: {\n\t /**\r\n\t * Creates file like object from object\r\n\t * @param {File|FileLikeObject} object\r\n\t * @private\r\n\t */\n\t\n\t value: function _createFromObject(object) {\n\t this.lastModifiedDate = copy(object.lastModifiedDate);\n\t this.size = object.size;\n\t this.type = object.type;\n\t this.name = object.name;\n\t }\n\t }\n\t });\n\t\n\t return FileLikeObject;\n\t })();\n\t\n\t return FileLikeObject;\n\t};\n\t\n\tmodule.exports.$inject = [];\n\n/***/ },\n/* 6 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tvar _interopRequire = function (obj) { return obj && obj.__esModule ? obj[\"default\"] : obj; };\n\t\n\tvar _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; }; })();\n\t\n\tvar _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } };\n\t\n\tvar CONFIG = _interopRequire(__webpack_require__(2));\n\t\n\tvar copy = angular.copy;\n\tvar extend = angular.extend;\n\tvar element = angular.element;\n\tvar isElement = angular.isElement;\n\t\n\tmodule.exports = function ($compile, FileLikeObject) {\n\t var FileItem = (function () {\n\t /**\r\n\t * Creates an instance of FileItem\r\n\t * @param {FileUploader} uploader\r\n\t * @param {File|HTMLInputElement|Object} some\r\n\t * @param {Object} options\r\n\t * @constructor\r\n\t */\n\t\n\t function FileItem(uploader, some, options) {\n\t _classCallCheck(this, FileItem);\n\t\n\t var isInput = isElement(some);\n\t var input = isInput ? element(some) : null;\n\t var file = !isInput ? some : null;\n\t\n\t extend(this, {\n\t url: uploader.url,\n\t alias: uploader.alias,\n\t headers: copy(uploader.headers),\n\t formData: copy(uploader.formData),\n\t removeAfterUpload: uploader.removeAfterUpload,\n\t withCredentials: uploader.withCredentials,\n\t method: uploader.method\n\t }, options, {\n\t uploader: uploader,\n\t file: new FileLikeObject(some),\n\t isReady: false,\n\t isUploading: false,\n\t isUploaded: false,\n\t isSuccess: false,\n\t isCancel: false,\n\t isError: false,\n\t progress: 0,\n\t index: null,\n\t _file: file,\n\t _input: input\n\t });\n\t\n\t if (input) this._replaceNode(input);\n\t }\n\t\n\t _createClass(FileItem, {\n\t upload: {\n\t /**********************\r\n\t * PUBLIC\r\n\t **********************/\n\t /**\r\n\t * Uploads a FileItem\r\n\t */\n\t\n\t value: function upload() {\n\t try {\n\t this.uploader.uploadItem(this);\n\t } catch (e) {\n\t this.uploader._onCompleteItem(this, \"\", 0, []);\n\t this.uploader._onErrorItem(this, \"\", 0, []);\n\t }\n\t }\n\t },\n\t cancel: {\n\t /**\r\n\t * Cancels uploading of FileItem\r\n\t */\n\t\n\t value: function cancel() {\n\t this.uploader.cancelItem(this);\n\t }\n\t },\n\t remove: {\n\t /**\r\n\t * Removes a FileItem\r\n\t */\n\t\n\t value: function remove() {\n\t this.uploader.removeFromQueue(this);\n\t }\n\t },\n\t onBeforeUpload: {\n\t /**\r\n\t * Callback\r\n\t * @private\r\n\t */\n\t\n\t value: function onBeforeUpload() {}\n\t },\n\t onProgress: {\n\t /**\r\n\t * Callback\r\n\t * @param {Number} progress\r\n\t * @private\r\n\t */\n\t\n\t value: function onProgress(progress) {}\n\t },\n\t onSuccess: {\n\t /**\r\n\t * Callback\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t */\n\t\n\t value: function onSuccess(response, status, headers) {}\n\t },\n\t onError: {\n\t /**\r\n\t * Callback\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t */\n\t\n\t value: function onError(response, status, headers) {}\n\t },\n\t onCancel: {\n\t /**\r\n\t * Callback\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t */\n\t\n\t value: function onCancel(response, status, headers) {}\n\t },\n\t onComplete: {\n\t /**\r\n\t * Callback\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t */\n\t\n\t value: function onComplete(response, status, headers) {}\n\t },\n\t _onBeforeUpload: {\n\t /**********************\r\n\t * PRIVATE\r\n\t **********************/\n\t /**\r\n\t * Inner callback\r\n\t */\n\t\n\t value: function _onBeforeUpload() {\n\t this.isReady = true;\n\t this.isUploading = true;\n\t this.isUploaded = false;\n\t this.isSuccess = false;\n\t this.isCancel = false;\n\t this.isError = false;\n\t this.progress = 0;\n\t this.onBeforeUpload();\n\t }\n\t },\n\t _onProgress: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {Number} progress\r\n\t * @private\r\n\t */\n\t\n\t value: function _onProgress(progress) {\n\t this.progress = progress;\n\t this.onProgress(progress);\n\t }\n\t },\n\t _onSuccess: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t * @private\r\n\t */\n\t\n\t value: function _onSuccess(response, status, headers) {\n\t this.isReady = false;\n\t this.isUploading = false;\n\t this.isUploaded = true;\n\t this.isSuccess = true;\n\t this.isCancel = false;\n\t this.isError = false;\n\t this.progress = 100;\n\t this.index = null;\n\t this.onSuccess(response, status, headers);\n\t }\n\t },\n\t _onError: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t * @private\r\n\t */\n\t\n\t value: function _onError(response, status, headers) {\n\t this.isReady = false;\n\t this.isUploading = false;\n\t this.isUploaded = true;\n\t this.isSuccess = false;\n\t this.isCancel = false;\n\t this.isError = true;\n\t this.progress = 0;\n\t this.index = null;\n\t this.onError(response, status, headers);\n\t }\n\t },\n\t _onCancel: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t * @private\r\n\t */\n\t\n\t value: function _onCancel(response, status, headers) {\n\t this.isReady = false;\n\t this.isUploading = false;\n\t this.isUploaded = false;\n\t this.isSuccess = false;\n\t this.isCancel = true;\n\t this.isError = false;\n\t this.progress = 0;\n\t this.index = null;\n\t this.onCancel(response, status, headers);\n\t }\n\t },\n\t _onComplete: {\n\t /**\r\n\t * Inner callback\r\n\t * @param {*} response\r\n\t * @param {Number} status\r\n\t * @param {Object} headers\r\n\t * @private\r\n\t */\n\t\n\t value: function _onComplete(response, status, headers) {\n\t this.onComplete(response, status, headers);\n\t if (this.removeAfterUpload) this.remove();\n\t }\n\t },\n\t _destroy: {\n\t /**\r\n\t * Destroys a FileItem\r\n\t */\n\t\n\t value: function _destroy() {\n\t if (this._input) this._input.remove();\n\t if (this._form) this._form.remove();\n\t delete this._form;\n\t delete this._input;\n\t }\n\t },\n\t _prepareToUploading: {\n\t /**\r\n\t * Prepares to uploading\r\n\t * @private\r\n\t */\n\t\n\t value: function _prepareToUploading() {\n\t this.index = this.index || ++this.uploader._nextIndex;\n\t this.isReady = true;\n\t }\n\t },\n\t _replaceNode: {\n\t /**\r\n\t * Replaces input element on his clone\r\n\t * @param {JQLite|jQuery} input\r\n\t * @private\r\n\t */\n\t\n\t value: function _replaceNode(input) {\n\t var clone = $compile(input.clone())(input.scope());\n\t clone.prop(\"value\", null); // FF fix\n\t input.css(\"display\", \"none\");\n\t input.after(clone); // remove jquery dependency\n\t }\n\t }\n\t });\n\t\n\t return FileItem;\n\t })();\n\t\n\t return FileItem;\n\t};\n\t\n\tmodule.exports.$inject = [\"$compile\", \"FileLikeObject\"];\n\n/***/ },\n/* 7 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tvar _interopRequire = function (obj) { return obj && obj.__esModule ? obj[\"default\"] : obj; };\n\t\n\tvar _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; }; })();\n\t\n\tvar _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } };\n\t\n\tvar CONFIG = _interopRequire(__webpack_require__(2));\n\t\n\tvar extend = angular.extend;\n\t\n\tmodule.exports = function () {\n\t var FileDirective = (function () {\n\t /**\r\n\t * Creates instance of {FileDirective} object\r\n\t * @param {Object} options\r\n\t * @param {Object} options.uploader\r\n\t * @param {HTMLElement} options.element\r\n\t * @param {Object} options.events\r\n\t * @param {String} options.prop\r\n\t * @constructor\r\n\t */\n\t\n\t function FileDirective(options) {\n\t _classCallCheck(this, FileDirective);\n\t\n\t extend(this, options);\n\t this.uploader._directives[this.prop].push(this);\n\t this._saveLinks();\n\t this.bind();\n\t }\n\t\n\t _createClass(FileDirective, {\n\t bind: {\n\t /**\r\n\t * Binds events handles\r\n\t */\n\t\n\t value: function bind() {\n\t for (var key in this.events) {\n\t var prop = this.events[key];\n\t this.element.bind(key, this[prop]);\n\t }\n\t }\n\t },\n\t unbind: {\n\t /**\r\n\t * Unbinds events handles\r\n\t */\n\t\n\t value: function unbind() {\n\t for (var key in this.events) {\n\t this.element.unbind(key, this.events[key]);\n\t }\n\t }\n\t },\n\t destroy: {\n\t /**\r\n\t * Destroys directive\r\n\t */\n\t\n\t value: function destroy() {\n\t var index = this.uploader._directives[this.prop].indexOf(this);\n\t this.uploader._directives[this.prop].splice(index, 1);\n\t this.unbind();\n\t // this.element = null;\n\t }\n\t },\n\t _saveLinks: {\n\t /**\r\n\t * Saves links to functions\r\n\t * @private\r\n\t */\n\t\n\t value: function _saveLinks() {\n\t for (var key in this.events) {\n\t var prop = this.events[key];\n\t this[prop] = this[prop].bind(this);\n\t }\n\t }\n\t }\n\t });\n\t\n\t return FileDirective;\n\t })();\n\t\n\t /**\r\n\t * Map of events\r\n\t * @type {Object}\r\n\t */\n\t FileDirective.prototype.events = {};\n\t\n\t return FileDirective;\n\t};\n\t\n\tmodule.exports.$inject = [];\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tvar _interopRequire = function (obj) { return obj && obj.__esModule ? obj[\"default\"] : obj; };\n\t\n\tvar _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; }; })();\n\t\n\tvar _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\t\n\tvar _inherits = function (subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; };\n\t\n\tvar _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } };\n\t\n\tvar CONFIG = _interopRequire(__webpack_require__(2));\n\t\n\tvar forEach = angular.forEach;\n\t\n\tmodule.exports = function (FileDirective) {\n\t var FileDrop = (function (_FileDirective) {\n\t /**\r\n\t * Creates instance of {FileDrop} object\r\n\t * @param {Object} options\r\n\t * @constructor\r\n\t */\n\t\n\t function FileDrop(options) {\n\t _classCallCheck(this, FileDrop);\n\t\n\t // Map of events\n\t this.events = {\n\t $destroy: \"destroy\",\n\t drop: \"onDrop\",\n\t dragover: \"onDragOver\",\n\t dragleave: \"onDragLeave\"\n\t };\n\t // Name of property inside uploader._directive object\n\t this.prop = \"drop\";\n\t\n\t _get(Object.getPrototypeOf(FileDrop.prototype), \"constructor\", this).call(this, options);\n\t }\n\t\n\t _inherits(FileDrop, _FileDirective);\n\t\n\t _createClass(FileDrop, {\n\t getOptions: {\n\t /**\r\n\t * Returns options\r\n\t * @return {Object|undefined}\r\n\t */\n\t\n\t value: function getOptions() {}\n\t },\n\t getFilters: {\n\t /**\r\n\t * Returns filters\r\n\t * @return {Array|String|undefined}\r\n\t */\n\t\n\t value: function getFilters() {}\n\t },\n\t onDrop: {\n\t /**\r\n\t * Event handler\r\n\t */\n\t\n\t value: function onDrop(event) {\n\t var transfer = this._getTransfer(event);\n\t if (!transfer) {\n\t return;\n\t }var options = this.getOptions();\n\t var filters = this.getFilters();\n\t this._preventAndStop(event);\n\t forEach(this.uploader._directives.over, this._removeOverClass, this);\n\t this.uploader.addToQueue(transfer.files, options, filters);\n\t }\n\t },\n\t onDragOver: {\n\t /**\r\n\t * Event handler\r\n\t */\n\t\n\t value: function onDragOver(event) {\n\t var transfer = this._getTransfer(event);\n\t if (!this._haveFiles(transfer.types)) {\n\t return;\n\t }transfer.dropEffect = \"copy\";\n\t this._preventAndStop(event);\n\t forEach(this.uploader._directives.over, this._addOverClass, this);\n\t }\n\t },\n\t onDragLeave: {\n\t /**\r\n\t * Event handler\r\n\t */\n\t\n\t value: function onDragLeave(event) {\n\t if (event.currentTarget === this.element[0]) {\n\t return;\n\t }this._preventAndStop(event);\n\t forEach(this.uploader._directives.over, this._removeOverClass, this);\n\t }\n\t },\n\t _getTransfer: {\n\t /**\r\n\t * Helper\r\n\t */\n\t\n\t value: function _getTransfer(event) {\n\t return event.dataTransfer ? event.dataTransfer : event.originalEvent.dataTransfer; // jQuery fix;\n\t }\n\t },\n\t _preventAndStop: {\n\t /**\r\n\t * Helper\r\n\t */\n\t\n\t value: function _preventAndStop(event) {\n\t event.preventDefault();\n\t event.stopPropagation();\n\t }\n\t },\n\t _haveFiles: {\n\t /**\r\n\t * Returns \"true\" if types contains files\r\n\t * @param {Object} types\r\n\t */\n\t\n\t value: function _haveFiles(types) {\n\t if (!types) {\n\t return false;\n\t }if (types.indexOf) {\n\t return types.indexOf(\"Files\") !== -1;\n\t } else if (types.contains) {\n\t return types.contains(\"Files\");\n\t } else {\n\t return false;\n\t }\n\t }\n\t },\n\t _addOverClass: {\n\t /**\r\n\t * Callback\r\n\t */\n\t\n\t value: function _addOverClass(item) {\n\t item.addOverClass();\n\t }\n\t },\n\t _removeOverClass: {\n\t /**\r\n\t * Callback\r\n\t */\n\t\n\t value: function _removeOverClass(item) {\n\t item.removeOverClass();\n\t }\n\t }\n\t });\n\t\n\t return FileDrop;\n\t })(FileDirective);\n\t\n\t return FileDrop;\n\t};\n\t\n\tmodule.exports.$inject = [\"FileDirective\"];\n\n/***/ },\n/* 9 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tvar _interopRequire = function (obj) { return obj && obj.__esModule ? obj[\"default\"] : obj; };\n\t\n\tvar _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; }; })();\n\t\n\tvar _get = function get(object, property, receiver) { var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc && desc.writable) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\t\n\tvar _inherits = function (subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; };\n\t\n\tvar _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } };\n\t\n\tvar CONFIG = _interopRequire(__webpack_require__(2));\n\t\n\tmodule.exports = function (FileDirective) {\n\t var FileOver = (function (_FileDirective) {\n\t /**\r\n\t * Creates instance of {FileDrop} object\r\n\t * @param {Object} options\r\n\t * @constructor\r\n\t */\n\t\n\t function FileOver(options) {\n\t _classCallCheck(this, FileOver);\n\t\n\t // Map of events\n\t this.events = {\n\t $destroy: \"destroy\"\n\t };\n\t // Name of property inside uploader._directive object\n\t this.prop = \"over\";\n\t // Over class\n\t this.overClass = \"nv-file-over\";\n\t\n\t _get(Object.getPrototypeOf(FileOver.prototype), \"constructor\", this).call(this, options);\n\t }\n\t\n\t _inherits(FileOver, _FileDirective);\n\t\n\t _createClass(FileOver, {\n\t addOverClass: {\n\t /**\r\n\t * Adds over class\r\n\t */\n\t\n\t value: function addOverClass() {\n\t this.element.addClass(this.getOverClass());\n\t }\n\t },\n\t removeOverClass: {\n\t /**\r\n\t * Removes over class\r\n\t */\n\t\n\t value: function removeOverClass() {\n\t this.element.removeClass(this.getOverClass());\n\t }\n\t },\n\t getOverClass: {\n\t /**\r\n\t * Returns over class\r\n\t * @returns {String}\r\n\t */\n\t\n\t value: function getOverClass() {\n\t return this.overClass;\n\t }\n\t }\n\t });\n\t\n\t return FileOver;\n\t })(FileDirective);\n\t\n\t return FileOver;\n\t};\n\t\n\tmodule.exports.$inject = [\"FileDirective\"];\n\n/***/ },\n/* 10 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tvar _interopRequire = function (obj) { return obj && obj.__esModule ? obj[\"default\"] : obj; };\n\t\n\tvar CONFIG = _interopRequire(__webpack_require__(2));\n\t\n\tmodule.exports = function ($parse, FileUploader, FileSelect) {\n\t\n\t return {\n\t link: function (scope, element, attributes) {\n\t var uploader = scope.$eval(attributes.uploader);\n\t\n\t if (!(uploader instanceof FileUploader)) {\n\t throw new TypeError(\"\\\"Uploader\\\" must be an instance of FileUploader\");\n\t }\n\t\n\t var object = new FileSelect({\n\t uploader: uploader,\n\t element: element\n\t });\n\t\n\t object.getOptions = $parse(attributes.options).bind(object, scope);\n\t object.getFilters = function () {\n\t return attributes.filters;\n\t };\n\t }\n\t };\n\t};\n\t\n\tmodule.exports.$inject = [\"$parse\", \"FileUploader\", \"FileSelect\"];\n\n/***/ },\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tvar _interopRequire = function (obj) { return obj && obj.__esModule ? obj[\"default\"] : obj; };\n\t\n\tvar CONFIG = _interopRequire(__webpack_require__(2));\n\t\n\tmodule.exports = function ($parse, FileUploader, FileDrop) {\n\t\n\t return {\n\t link: function (scope, element, attributes) {\n\t var uploader = scope.$eval(attributes.uploader);\n\t\n\t if (!(uploader instanceof FileUploader)) {\n\t throw new TypeError(\"\\\"Uploader\\\" must be an instance of FileUploader\");\n\t }\n\t\n\t if (!uploader.isHTML5) return;\n\t\n\t var object = new FileDrop({\n\t uploader: uploader,\n\t element: element\n\t });\n\t\n\t object.getOptions = $parse(attributes.options).bind(object, scope);\n\t object.getFilters = function () {\n\t return attributes.filters;\n\t };\n\t }\n\t };\n\t};\n\t\n\tmodule.exports.$inject = [\"$parse\", \"FileUploader\", \"FileDrop\"];\n\n/***/ },\n/* 12 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t\n\tvar _interopRequire = function (obj) { return obj && obj.__esModule ? obj[\"default\"] : obj; };\n\t\n\tvar CONFIG = _interopRequire(__webpack_require__(2));\n\t\n\tmodule.exports = function (FileUploader, FileOver) {\n\t\n\t return {\n\t link: function (scope, element, attributes) {\n\t var uploader = scope.$eval(attributes.uploader);\n\t\n\t if (!(uploader instanceof FileUploader)) {\n\t throw new TypeError(\"\\\"Uploader\\\" must be an instance of FileUploader\");\n\t }\n\t\n\t var object = new FileOver({\n\t uploader: uploader,\n\t element: element\n\t });\n\t\n\t object.getOverClass = function () {\n\t return attributes.overClass || object.overClass;\n\t };\n\t }\n\t };\n\t};\n\t\n\tmodule.exports.$inject = [\"FileUploader\", \"FileOver\"];\n\n/***/ }\n/******/ ])\n});\n;\n\n\n/** WEBPACK FOOTER **\n ** angular-file-upload.min.js\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 8e42257eef0ea5c40144\n **/","'use strict';\r\n\r\n\r\nimport CONFIG from './config.json';\r\n\r\n\r\nimport options from './values/options'\r\n\r\n\r\nimport serviceFileUploader from './services/FileUploader';\r\nimport serviceFileLikeObject from './services/FileLikeObject';\r\nimport serviceFileItem from './services/FileItem';\r\nimport serviceFileDirective from './services/FileDirective';\r\nimport serviceFileSelect from './services/FileSelect';\r\nimport serviceFileDrop from './services/FileDrop';\r\nimport serviceFileOver from './services/FileOver';\r\n\r\n\r\nimport directiveFileSelect from './directives/FileSelect';\r\nimport directiveFileDrop from './directives/FileDrop';\r\nimport directiveFileOver from './directives/FileOver';\r\n\r\n\r\nangular\r\n .module(CONFIG.name, [])\r\n .value('fileUploaderOptions', options)\r\n .factory('FileUploader', serviceFileUploader)\r\n .factory('FileLikeObject', serviceFileLikeObject)\r\n .factory('FileItem', serviceFileItem)\r\n .factory('FileDirective', serviceFileDirective)\r\n .factory('FileSelect', serviceFileSelect)\r\n .factory('FileDrop', serviceFileDrop)\r\n .factory('FileOver', serviceFileOver)\r\n .directive('nvFileSelect', directiveFileSelect)\r\n .directive('nvFileDrop', directiveFileDrop)\r\n .directive('nvFileOver', directiveFileOver)\r\n .run([\r\n 'FileUploader',\r\n 'FileLikeObject',\r\n 'FileItem',\r\n 'FileDirective',\r\n 'FileSelect',\r\n 'FileDrop',\r\n 'FileOver',\r\n function(FileUploader, FileLikeObject, FileItem, FileDirective, FileSelect, FileDrop, FileOver) {\r\n // only for compatibility\r\n FileUploader.FileLikeObject = FileLikeObject;\r\n FileUploader.FileItem = FileItem;\r\n FileUploader.FileDirective = FileDirective;\r\n FileUploader.FileSelect = FileSelect;\r\n FileUploader.FileDrop = FileDrop;\r\n FileUploader.FileOver = FileOver;\r\n }\r\n ]);\r\n\n\n\n/** WEBPACK FOOTER **\n ** c:/OpenServer/domains/angular-file-upload.my/src/index.js\n **/","'use strict';\r\n\r\n\r\nimport CONFIG from './../config.json';\r\n\r\n\r\nexport default (FileDirective) => {\r\n \r\n \r\n class FileSelect extends FileDirective {\r\n /**\r\n * Creates instance of {FileSelect} object\r\n * @param {Object} options\r\n * @constructor\r\n */\r\n constructor(options) {\r\n // Map of events\r\n this.events = {\r\n $destroy: 'destroy',\r\n change: 'onChange'\r\n };\r\n // Name of property inside uploader._directive object\r\n this.prop = 'select';\r\n \r\n super(options);\r\n \r\n if(!this.uploader.isHTML5) {\r\n this.element.removeAttr('multiple');\r\n }\r\n this.element.prop('value', null); // FF fix\r\n }\r\n /**\r\n * Returns options\r\n * @return {Object|undefined}\r\n */\r\n getOptions() {\r\n }\r\n /**\r\n * Returns filters\r\n * @return {Array|String|undefined}\r\n */\r\n getFilters() {\r\n }\r\n /**\r\n * If returns \"true\" then HTMLInputElement will be cleared\r\n * @returns {Boolean}\r\n */\r\n isEmptyAfterSelection() {\r\n return !!this.element.attr('multiple');\r\n }\r\n /**\r\n * Event handler\r\n */\r\n onChange() {\r\n var files = this.uploader.isHTML5 ? this.element[0].files : this.element[0];\r\n var options = this.getOptions();\r\n var filters = this.getFilters();\r\n\r\n if(!this.uploader.isHTML5) this.destroy();\r\n this.uploader.addToQueue(files, options, filters);\r\n if(this.isEmptyAfterSelection()) this.element.prop('value', null);\r\n }\r\n }\r\n \r\n \r\n return FileSelect;\r\n}\r\n\r\n\r\nmodule.exports.$inject = [\r\n 'FileDirective'\r\n];\n\n\n/** WEBPACK FOOTER **\n ** c:/OpenServer/domains/angular-file-upload.my/src/services/FileSelect.js\n **/","module.exports = {\n\t\"name\": \"angularFileUpload\"\n}\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/config.json\n ** module id = 2\n ** module chunks = 0\n **/","'use strict';\r\n\r\n\r\nexport default {\r\n url: '/',\r\n alias: 'file',\r\n headers: {},\r\n queue: [],\r\n progress: 0,\r\n autoUpload: false,\r\n removeAfterUpload: false,\r\n method: 'POST',\r\n filters: [],\r\n formData: [],\r\n queueLimit: Number.MAX_VALUE,\r\n withCredentials: false\r\n};\n\n\n/** WEBPACK FOOTER **\n ** c:/OpenServer/domains/angular-file-upload.my/src/values/options.js\n **/","'use strict';\r\n\r\n\r\nimport CONFIG from './../config.json';\r\n\r\n\r\nlet {\r\n copy,\r\n extend,\r\n forEach,\r\n isObject,\r\n isNumber,\r\n isDefined,\r\n isArray,\r\n element\r\n } = angular;\r\n\r\n\r\nexport default (fileUploaderOptions, $rootScope, $http, $window, FileLikeObject, FileItem) => {\r\n \r\n \r\n let {\r\n File,\r\n FormData\r\n } = $window;\r\n \r\n \r\n class FileUploader {\r\n /**********************\r\n * PUBLIC\r\n **********************/\r\n /**\r\n * Creates an instance of FileUploader\r\n * @param {Object} [options]\r\n * @constructor\r\n */\r\n constructor(options) {\r\n var settings = copy(fileUploaderOptions);\r\n \r\n extend(this, settings, options, {\r\n isUploading: false,\r\n _nextIndex: 0,\r\n _failFilterIndex: -1,\r\n _directives: {select: [], drop: [], over: []}\r\n });\r\n\r\n // add default filters\r\n this.filters.unshift({name: 'queueLimit', fn: this._queueLimitFilter});\r\n this.filters.unshift({name: 'folder', fn: this._folderFilter});\r\n }\r\n /**\r\n * Adds items to the queue\r\n * @param {File|HTMLInputElement|Object|FileList|Array} files\r\n * @param {Object} [options]\r\n * @param {Array|String} filters\r\n */\r\n addToQueue(files, options, filters) {\r\n var list = this.isArrayLikeObject(files) ? files: [files];\r\n var arrayOfFilters = this._getFilters(filters);\r\n var count = this.queue.length;\r\n var addedFileItems = [];\r\n\r\n forEach(list, (some /*{File|HTMLInputElement|Object}*/) => {\r\n var temp = new FileLikeObject(some);\r\n\r\n if (this._isValidFile(temp, arrayOfFilters, options)) {\r\n var fileItem = new FileItem(this, some, options);\r\n addedFileItems.push(fileItem);\r\n this.queue.push(fileItem);\r\n this._onAfterAddingFile(fileItem);\r\n } else {\r\n var filter = arrayOfFilters[this._failFilterIndex];\r\n this._onWhenAddingFileFailed(temp, filter, options);\r\n }\r\n });\r\n\r\n if(this.queue.length !== count) {\r\n this._onAfterAddingAll(addedFileItems);\r\n this.progress = this._getTotalProgress();\r\n }\r\n\r\n this._render();\r\n if (this.autoUpload) this.uploadAll();\r\n }\r\n /**\r\n * Remove items from the queue. Remove last: index = -1\r\n * @param {FileItem|Number} value\r\n */\r\n removeFromQueue(value) {\r\n var index = this.getIndexOfItem(value);\r\n var item = this.queue[index];\r\n if(item.isUploading) item.cancel();\r\n this.queue.splice(index, 1);\r\n item._destroy();\r\n this.progress = this._getTotalProgress();\r\n }\r\n /**\r\n * Clears the queue\r\n */\r\n clearQueue() {\r\n while(this.queue.length) {\r\n this.queue[0].remove();\r\n }\r\n this.progress = 0;\r\n }\r\n /**\r\n * Uploads a item from the queue\r\n * @param {FileItem|Number} value\r\n */\r\n uploadItem(value) {\r\n var index = this.getIndexOfItem(value);\r\n var item = this.queue[index];\r\n var transport = this.isHTML5 ? '_xhrTransport' : '_iframeTransport';\r\n\r\n item._prepareToUploading();\r\n if(this.isUploading) return;\r\n\r\n this.isUploading = true;\r\n this[transport](item);\r\n }\r\n /**\r\n * Cancels uploading of item from the queue\r\n * @param {FileItem|Number} value\r\n */\r\n cancelItem(value) {\r\n var index = this.getIndexOfItem(value);\r\n var item = this.queue[index];\r\n var prop = this.isHTML5 ? '_xhr' : '_form';\r\n if(item && item.isUploading) item[prop].abort();\r\n }\r\n /**\r\n * Uploads all not uploaded items of queue\r\n */\r\n uploadAll() {\r\n var items = this.getNotUploadedItems().filter(item => !item.isUploading);\r\n if(!items.length) return;\r\n\r\n forEach(items, item => item._prepareToUploading());\r\n items[0].upload();\r\n }\r\n /**\r\n * Cancels all uploads\r\n */\r\n cancelAll() {\r\n var items = this.getNotUploadedItems();\r\n forEach(items, item => item.cancel());\r\n }\r\n /**\r\n * Returns \"true\" if value an instance of File\r\n * @param {*} value\r\n * @returns {Boolean}\r\n * @private\r\n */\r\n isFile(value) {\r\n return this.constructor.isFile(value);\r\n }\r\n /**\r\n * Returns \"true\" if value an instance of FileLikeObject\r\n * @param {*} value\r\n * @returns {Boolean}\r\n * @private\r\n */\r\n isFileLikeObject(value) {\r\n return this.constructor.isFileLikeObject(value);\r\n }\r\n /**\r\n * Returns \"true\" if value is array like object\r\n * @param {*} value\r\n * @returns {Boolean}\r\n */\r\n isArrayLikeObject(value) {\r\n return this.constructor.isArrayLikeObject(value);\r\n }\r\n /**\r\n * Returns a index of item from the queue\r\n * @param {Item|Number} value\r\n * @returns {Number}\r\n */\r\n getIndexOfItem(value) {\r\n return isNumber(value) ? value : this.queue.indexOf(value);\r\n }\r\n /**\r\n * Returns not uploaded items\r\n * @returns {Array}\r\n */\r\n getNotUploadedItems() {\r\n return this.queue.filter(item => !item.isUploaded);\r\n }\r\n /**\r\n * Returns items ready for upload\r\n * @returns {Array}\r\n */\r\n getReadyItems() {\r\n return this.queue\r\n .filter(item => (item.isReady && !item.isUploading))\r\n .sort((item1, item2) => item1.index - item2.index);\r\n }\r\n /**\r\n * Destroys instance of FileUploader\r\n */\r\n destroy() {\r\n forEach(this._directives, (key) => {\r\n forEach(this._directives[key], (object) => {\r\n object.destroy();\r\n });\r\n });\r\n }\r\n /**\r\n * Callback\r\n * @param {Array} fileItems\r\n */\r\n onAfterAddingAll(fileItems) {\r\n }\r\n /**\r\n * Callback\r\n * @param {FileItem} fileItem\r\n */\r\n onAfterAddingFile(fileItem) {\r\n }\r\n /**\r\n * Callback\r\n * @param {File|Object} item\r\n * @param {Object} filter\r\n * @param {Object} options\r\n */\r\n onWhenAddingFileFailed(item, filter, options) {\r\n }\r\n /**\r\n * Callback\r\n * @param {FileItem} fileItem\r\n */\r\n onBeforeUploadItem(fileItem) {\r\n }\r\n /**\r\n * Callback\r\n * @param {FileItem} fileItem\r\n * @param {Number} progress\r\n */\r\n onProgressItem(fileItem, progress) {\r\n }\r\n /**\r\n * Callback\r\n * @param {Number} progress\r\n */\r\n onProgressAll(progress) {\r\n }\r\n /**\r\n * Callback\r\n * @param {FileItem} item\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n */\r\n onSuccessItem(item, response, status, headers) {\r\n }\r\n /**\r\n * Callback\r\n * @param {FileItem} item\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n */\r\n onErrorItem(item, response, status, headers) {\r\n }\r\n /**\r\n * Callback\r\n * @param {FileItem} item\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n */\r\n onCancelItem(item, response, status, headers) {\r\n }\r\n /**\r\n * Callback\r\n * @param {FileItem} item\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n */\r\n onCompleteItem(item, response, status, headers) {\r\n }\r\n /**\r\n * Callback\r\n */\r\n onCompleteAll() {\r\n }\r\n /**********************\r\n * PRIVATE\r\n **********************/\r\n /**\r\n * Returns the total progress\r\n * @param {Number} [value]\r\n * @returns {Number}\r\n * @private\r\n */\r\n _getTotalProgress(value) {\r\n if(this.removeAfterUpload) return value || 0;\r\n\r\n var notUploaded = this.getNotUploadedItems().length;\r\n var uploaded = notUploaded ? this.queue.length - notUploaded : this.queue.length;\r\n var ratio = 100 / this.queue.length;\r\n var current = (value || 0) * ratio / 100;\r\n\r\n return Math.round(uploaded * ratio + current);\r\n }\r\n /**\r\n * Returns array of filters\r\n * @param {Array|String} filters\r\n * @returns {Array}\r\n * @private\r\n */\r\n _getFilters(filters) {\r\n if(!filters) return this.filters;\r\n if(isArray(filters)) return filters;\r\n var names = filters.match(/[^\\s,]+/g);\r\n return this.filters\r\n .filter(filter => names.indexOf(filter.name) !== -1);\r\n }\r\n /**\r\n * Updates html\r\n * @private\r\n */\r\n _render() {\r\n if(!$rootScope.$$phase) $rootScope.$apply();\r\n }\r\n /**\r\n * Returns \"true\" if item is a file (not folder)\r\n * @param {File|FileLikeObject} item\r\n * @returns {Boolean}\r\n * @private\r\n */\r\n _folderFilter(item) {\r\n return !!(item.size || item.type);\r\n }\r\n /**\r\n * Returns \"true\" if the limit has not been reached\r\n * @returns {Boolean}\r\n * @private\r\n */\r\n _queueLimitFilter() {\r\n return this.queue.length < this.queueLimit;\r\n }\r\n /**\r\n * Returns \"true\" if file pass all filters\r\n * @param {File|Object} file\r\n * @param {Array} filters\r\n * @param {Object} options\r\n * @returns {Boolean}\r\n * @private\r\n */\r\n _isValidFile(file, filters, options) {\r\n this._failFilterIndex = -1;\r\n return !filters.length ? true : filters.every((filter) => {\r\n this._failFilterIndex++;\r\n return filter.fn.call(this, file, options);\r\n });\r\n }\r\n /**\r\n * Checks whether upload successful\r\n * @param {Number} status\r\n * @returns {Boolean}\r\n * @private\r\n */\r\n _isSuccessCode(status) {\r\n return (status >= 200 && status < 300) || status === 304;\r\n }\r\n /**\r\n * Transforms the server response\r\n * @param {*} response\r\n * @param {Object} headers\r\n * @returns {*}\r\n * @private\r\n */\r\n _transformResponse(response, headers) {\r\n var headersGetter = this._headersGetter(headers);\r\n forEach($http.defaults.transformResponse, (transformFn) => {\r\n response = transformFn(response, headersGetter);\r\n });\r\n return response;\r\n }\r\n /**\r\n * Parsed response headers\r\n * @param headers\r\n * @returns {Object}\r\n * @see https://github.com/angular/angular.js/blob/master/src/ng/http.js\r\n * @private\r\n */\r\n _parseHeaders(headers) {\r\n var parsed = {}, key, val, i;\r\n\r\n if(!headers) return parsed;\r\n\r\n forEach(headers.split('\\n'), (line) => {\r\n i = line.indexOf(':');\r\n key = line.slice(0, i).trim().toLowerCase();\r\n val = line.slice(i + 1).trim();\r\n\r\n if(key) {\r\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\r\n }\r\n });\r\n\r\n return parsed;\r\n }\r\n /**\r\n * Returns function that returns headers\r\n * @param {Object} parsedHeaders\r\n * @returns {Function}\r\n * @private\r\n */\r\n _headersGetter(parsedHeaders) {\r\n return (name) => {\r\n if(name) {\r\n return parsedHeaders[name.toLowerCase()] || null;\r\n }\r\n return parsedHeaders;\r\n };\r\n }\r\n /**\r\n * The XMLHttpRequest transport\r\n * @param {FileItem} item\r\n * @private\r\n */\r\n _xhrTransport(item) {\r\n var xhr = item._xhr = new XMLHttpRequest();\r\n var form = new FormData();\r\n\r\n this._onBeforeUploadItem(item);\r\n\r\n forEach(item.formData, (obj) => {\r\n forEach(obj, (value, key) => {\r\n form.append(key, value);\r\n });\r\n });\r\n\r\n if(typeof(item._file.size) != 'number') {\r\n throw new TypeError('The file specified is no longer valid');\r\n }\r\n\r\n form.append(item.alias, item._file, item.file.name);\r\n\r\n xhr.upload.onprogress = (event) => {\r\n var progress = Math.round(event.lengthComputable ? event.loaded * 100 / event.total : 0);\r\n this._onProgressItem(item, progress);\r\n };\r\n\r\n xhr.onload = () => {\r\n var headers = this._parseHeaders(xhr.getAllResponseHeaders());\r\n var response = this._transformResponse(xhr.response, headers);\r\n var gist = this._isSuccessCode(xhr.status) ? 'Success' : 'Error';\r\n var method = '_on' + gist + 'Item';\r\n this[method](item, response, xhr.status, headers);\r\n this._onCompleteItem(item, response, xhr.status, headers);\r\n };\r\n\r\n xhr.onerror = () => {\r\n var headers = this._parseHeaders(xhr.getAllResponseHeaders());\r\n var response = this._transformResponse(xhr.response, headers);\r\n this._onErrorItem(item, response, xhr.status, headers);\r\n this._onCompleteItem(item, response, xhr.status, headers);\r\n };\r\n\r\n xhr.onabort = () => {\r\n var headers = this._parseHeaders(xhr.getAllResponseHeaders());\r\n var response = this._transformResponse(xhr.response, headers);\r\n this._onCancelItem(item, response, xhr.status, headers);\r\n this._onCompleteItem(item, response, xhr.status, headers);\r\n };\r\n\r\n xhr.open(item.method, item.url, true);\r\n\r\n xhr.withCredentials = item.withCredentials;\r\n\r\n forEach(item.headers, (value, name) => {\r\n xhr.setRequestHeader(name, value);\r\n });\r\n\r\n xhr.send(form);\r\n this._render();\r\n }\r\n /**\r\n * The IFrame transport\r\n * @param {FileItem} item\r\n * @private\r\n */\r\n _iframeTransport(item) {\r\n var form = element('');\r\n var iframe = element('');\r\n var input = item._input;\r\n\r\n if(item._form) item._form.replaceWith(input); // remove old form\r\n item._form = form; // save link to new form\r\n\r\n this._onBeforeUploadItem(item);\r\n\r\n input.prop('name', item.alias);\r\n\r\n forEach(item.formData, (obj) => {\r\n forEach(obj, (value, key) => {\r\n var element_ = element('');\r\n element_.val(value);\r\n form.append(element_);\r\n });\r\n });\r\n\r\n form.prop({\r\n action: item.url,\r\n method: 'POST',\r\n target: iframe.prop('name'),\r\n enctype: 'multipart/form-data',\r\n encoding: 'multipart/form-data' // old IE\r\n });\r\n\r\n iframe.bind('load', () => {\r\n var html = '';\r\n var status = 200;\r\n\r\n try {\r\n // Fix for legacy IE browsers that loads internal error page\r\n // when failed WS response received. In consequence iframe\r\n // content access denied error is thrown becouse trying to\r\n // access cross domain page. When such thing occurs notifying\r\n // with empty response object. See more info at:\r\n // http://stackoverflow.com/questions/151362/access-is-denied-error-on-accessing-iframe-document-object\r\n // Note that if non standard 4xx or 5xx error code returned\r\n // from WS then response content can be accessed without error\r\n // but 'XHR' status becomes 200. In order to avoid confusion\r\n // returning response via same 'success' event handler.\r\n\r\n // fixed angular.contents() for iframes\r\n html = iframe[0].contentDocument.body.innerHTML;\r\n } catch(e) {\r\n // in case we run into the access-is-denied error or we have another error on the server side\r\n // (intentional 500,40... errors), we at least say 'something went wrong' -> 500\r\n status = 500;\r\n }\r\n\r\n var xhr = {response: html, status: status, dummy: true};\r\n var headers = {};\r\n var response = this._transformResponse(xhr.response, headers);\r\n\r\n this._onSuccessItem(item, response, xhr.status, headers);\r\n this._onCompleteItem(item, response, xhr.status, headers);\r\n });\r\n\r\n form.abort = () => {\r\n var xhr = {status: 0, dummy: true};\r\n var headers = {};\r\n var response;\r\n\r\n iframe.unbind('load').prop('src', 'javascript:false;');\r\n form.replaceWith(input);\r\n\r\n this._onCancelItem(item, response, xhr.status, headers);\r\n this._onCompleteItem(item, response, xhr.status, headers);\r\n };\r\n\r\n input.after(form);\r\n form.append(input).append(iframe);\r\n\r\n form[0].submit();\r\n this._render();\r\n }\r\n /**\r\n * Inner callback\r\n * @param {File|Object} item\r\n * @param {Object} filter\r\n * @param {Object} options\r\n * @private\r\n */\r\n _onWhenAddingFileFailed(item, filter, options) {\r\n this.onWhenAddingFileFailed(item, filter, options);\r\n }\r\n /**\r\n * Inner callback\r\n * @param {FileItem} item\r\n */\r\n _onAfterAddingFile(item) {\r\n this.onAfterAddingFile(item);\r\n }\r\n /**\r\n * Inner callback\r\n * @param {Array} items\r\n */\r\n _onAfterAddingAll(items) {\r\n this.onAfterAddingAll(items);\r\n }\r\n /**\r\n * Inner callback\r\n * @param {FileItem} item\r\n * @private\r\n */\r\n _onBeforeUploadItem(item) {\r\n item._onBeforeUpload();\r\n this.onBeforeUploadItem(item);\r\n }\r\n /**\r\n * Inner callback\r\n * @param {FileItem} item\r\n * @param {Number} progress\r\n * @private\r\n */\r\n _onProgressItem(item, progress) {\r\n var total = this._getTotalProgress(progress);\r\n this.progress = total;\r\n item._onProgress(progress);\r\n this.onProgressItem(item, progress);\r\n this.onProgressAll(total);\r\n this._render();\r\n }\r\n /**\r\n * Inner callback\r\n * @param {FileItem} item\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n * @private\r\n */\r\n _onSuccessItem(item, response, status, headers) {\r\n item._onSuccess(response, status, headers);\r\n this.onSuccessItem(item, response, status, headers);\r\n }\r\n /**\r\n * Inner callback\r\n * @param {FileItem} item\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n * @private\r\n */\r\n _onErrorItem(item, response, status, headers) {\r\n item._onError(response, status, headers);\r\n this.onErrorItem(item, response, status, headers);\r\n }\r\n /**\r\n * Inner callback\r\n * @param {FileItem} item\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n * @private\r\n */\r\n _onCancelItem(item, response, status, headers) {\r\n item._onCancel(response, status, headers);\r\n this.onCancelItem(item, response, status, headers);\r\n }\r\n /**\r\n * Inner callback\r\n * @param {FileItem} item\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n * @private\r\n */\r\n _onCompleteItem(item, response, status, headers) {\r\n item._onComplete(response, status, headers);\r\n this.onCompleteItem(item, response, status, headers);\r\n\r\n var nextItem = this.getReadyItems()[0];\r\n this.isUploading = false;\r\n\r\n if(isDefined(nextItem)) {\r\n nextItem.upload();\r\n return;\r\n }\r\n\r\n this.onCompleteAll();\r\n this.progress = this._getTotalProgress();\r\n this._render();\r\n }\r\n /**********************\r\n * STATIC\r\n **********************/\r\n /**\r\n * Returns \"true\" if value an instance of File\r\n * @param {*} value\r\n * @returns {Boolean}\r\n * @private\r\n */\r\n static isFile(value) {\r\n return (File && value instanceof File);\r\n }\r\n /**\r\n * Returns \"true\" if value an instance of FileLikeObject\r\n * @param {*} value\r\n * @returns {Boolean}\r\n * @private\r\n */\r\n static isFileLikeObject(value) {\r\n return value instanceof FileLikeObject;\r\n }\r\n /**\r\n * Returns \"true\" if value is array like object\r\n * @param {*} value\r\n * @returns {Boolean}\r\n */\r\n static isArrayLikeObject(value) {\r\n return (isObject(value) && 'length' in value);\r\n }\r\n /**\r\n * Inherits a target (Class_1) by a source (Class_2)\r\n * @param {Function} target\r\n * @param {Function} source\r\n */\r\n static inherit(target, source) {\r\n target.prototype = Object.create(source.prototype);\r\n target.prototype.constructor = target;\r\n target.super_ = source;\r\n }\r\n }\r\n\r\n\r\n /**********************\r\n * PUBLIC\r\n **********************/\r\n /**\r\n * Checks a support the html5 uploader\r\n * @returns {Boolean}\r\n * @readonly\r\n */\r\n FileUploader.prototype.isHTML5 = !!(File && FormData);\r\n /**********************\r\n * STATIC\r\n **********************/\r\n /**\r\n * @borrows FileUploader.prototype.isHTML5\r\n */\r\n FileUploader.isHTML5 = FileUploader.prototype.isHTML5;\r\n\r\n \r\n return FileUploader;\r\n}\r\n\r\n\r\nmodule.exports.$inject = [\r\n 'fileUploaderOptions', \r\n '$rootScope', \r\n '$http', \r\n '$window',\r\n 'FileLikeObject',\r\n 'FileItem'\r\n];\n\n\n/** WEBPACK FOOTER **\n ** c:/OpenServer/domains/angular-file-upload.my/src/services/FileUploader.js\n **/","'use strict';\r\n\r\n\r\nimport CONFIG from './../config.json';\r\n\r\n\r\nlet {\r\n copy,\r\n isElement,\r\n isString\r\n } = angular;\r\n\r\n\r\nexport default () => {\r\n \r\n \r\n class FileLikeObject {\r\n /**\r\n * Creates an instance of FileLikeObject\r\n * @param {File|HTMLInputElement|Object} fileOrInput\r\n * @constructor\r\n */\r\n constructor(fileOrInput) {\r\n var isInput = isElement(fileOrInput);\r\n var fakePathOrObject = isInput ? fileOrInput.value : fileOrInput;\r\n var postfix = isString(fakePathOrObject) ? 'FakePath' : 'Object';\r\n var method = '_createFrom' + postfix;\r\n this[method](fakePathOrObject);\r\n }\r\n /**\r\n * Creates file like object from fake path string\r\n * @param {String} path\r\n * @private\r\n */\r\n _createFromFakePath(path) {\r\n this.lastModifiedDate = null;\r\n this.size = null;\r\n this.type = 'like/' + path.slice(path.lastIndexOf('.') + 1).toLowerCase();\r\n this.name = path.slice(path.lastIndexOf('/') + path.lastIndexOf('\\\\') + 2);\r\n }\r\n /**\r\n * Creates file like object from object\r\n * @param {File|FileLikeObject} object\r\n * @private\r\n */\r\n _createFromObject(object) {\r\n this.lastModifiedDate = copy(object.lastModifiedDate);\r\n this.size = object.size;\r\n this.type = object.type;\r\n this.name = object.name;\r\n }\r\n }\r\n \r\n \r\n return FileLikeObject;\r\n}\r\n\r\n\r\nmodule.exports.$inject = [\r\n];\n\n\n/** WEBPACK FOOTER **\n ** c:/OpenServer/domains/angular-file-upload.my/src/services/FileLikeObject.js\n **/","'use strict';\r\n\r\n\r\nimport CONFIG from './../config.json';\r\n\r\n\r\nlet {\r\n copy,\r\n extend,\r\n element,\r\n isElement\r\n } = angular;\r\n\r\n\r\nexport default ($compile, FileLikeObject) => {\r\n \r\n \r\n class FileItem {\r\n /**\r\n * Creates an instance of FileItem\r\n * @param {FileUploader} uploader\r\n * @param {File|HTMLInputElement|Object} some\r\n * @param {Object} options\r\n * @constructor\r\n */\r\n constructor(uploader, some, options) {\r\n var isInput = isElement(some);\r\n var input = isInput ? element(some) : null;\r\n var file = !isInput ? some : null;\r\n\r\n extend(this, {\r\n url: uploader.url,\r\n alias: uploader.alias,\r\n headers: copy(uploader.headers),\r\n formData: copy(uploader.formData),\r\n removeAfterUpload: uploader.removeAfterUpload,\r\n withCredentials: uploader.withCredentials,\r\n method: uploader.method\r\n }, options, {\r\n uploader: uploader,\r\n file: new FileLikeObject(some),\r\n isReady: false,\r\n isUploading: false,\r\n isUploaded: false,\r\n isSuccess: false,\r\n isCancel: false,\r\n isError: false,\r\n progress: 0,\r\n index: null,\r\n _file: file,\r\n _input: input\r\n });\r\n\r\n if (input) this._replaceNode(input);\r\n }\r\n /**********************\r\n * PUBLIC\r\n **********************/\r\n /**\r\n * Uploads a FileItem\r\n */\r\n upload() {\r\n try {\r\n this.uploader.uploadItem(this);\r\n } catch(e) {\r\n this.uploader._onCompleteItem(this, '', 0, []);\r\n this.uploader._onErrorItem(this, '', 0, []);\r\n }\r\n }\r\n /**\r\n * Cancels uploading of FileItem\r\n */\r\n cancel() {\r\n this.uploader.cancelItem(this);\r\n }\r\n /**\r\n * Removes a FileItem\r\n */\r\n remove() {\r\n this.uploader.removeFromQueue(this);\r\n }\r\n /**\r\n * Callback\r\n * @private\r\n */\r\n onBeforeUpload() {\r\n }\r\n /**\r\n * Callback\r\n * @param {Number} progress\r\n * @private\r\n */\r\n onProgress(progress) {\r\n }\r\n /**\r\n * Callback\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n */\r\n onSuccess(response, status, headers) {\r\n }\r\n /**\r\n * Callback\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n */\r\n onError(response, status, headers) {\r\n }\r\n /**\r\n * Callback\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n */\r\n onCancel(response, status, headers) {\r\n }\r\n /**\r\n * Callback\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n */\r\n onComplete(response, status, headers) {\r\n }\r\n /**********************\r\n * PRIVATE\r\n **********************/\r\n /**\r\n * Inner callback\r\n */\r\n _onBeforeUpload() {\r\n this.isReady = true;\r\n this.isUploading = true;\r\n this.isUploaded = false;\r\n this.isSuccess = false;\r\n this.isCancel = false;\r\n this.isError = false;\r\n this.progress = 0;\r\n this.onBeforeUpload();\r\n }\r\n /**\r\n * Inner callback\r\n * @param {Number} progress\r\n * @private\r\n */\r\n _onProgress(progress) {\r\n this.progress = progress;\r\n this.onProgress(progress);\r\n }\r\n /**\r\n * Inner callback\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n * @private\r\n */\r\n _onSuccess(response, status, headers) {\r\n this.isReady = false;\r\n this.isUploading = false;\r\n this.isUploaded = true;\r\n this.isSuccess = true;\r\n this.isCancel = false;\r\n this.isError = false;\r\n this.progress = 100;\r\n this.index = null;\r\n this.onSuccess(response, status, headers);\r\n }\r\n /**\r\n * Inner callback\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n * @private\r\n */\r\n _onError(response, status, headers) {\r\n this.isReady = false;\r\n this.isUploading = false;\r\n this.isUploaded = true;\r\n this.isSuccess = false;\r\n this.isCancel = false;\r\n this.isError = true;\r\n this.progress = 0;\r\n this.index = null;\r\n this.onError(response, status, headers);\r\n }\r\n /**\r\n * Inner callback\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n * @private\r\n */\r\n _onCancel(response, status, headers) {\r\n this.isReady = false;\r\n this.isUploading = false;\r\n this.isUploaded = false;\r\n this.isSuccess = false;\r\n this.isCancel = true;\r\n this.isError = false;\r\n this.progress = 0;\r\n this.index = null;\r\n this.onCancel(response, status, headers);\r\n }\r\n /**\r\n * Inner callback\r\n * @param {*} response\r\n * @param {Number} status\r\n * @param {Object} headers\r\n * @private\r\n */\r\n _onComplete(response, status, headers) {\r\n this.onComplete(response, status, headers);\r\n if(this.removeAfterUpload) this.remove();\r\n }\r\n /**\r\n * Destroys a FileItem\r\n */\r\n _destroy() {\r\n if(this._input) this._input.remove();\r\n if(this._form) this._form.remove();\r\n delete this._form;\r\n delete this._input;\r\n }\r\n /**\r\n * Prepares to uploading\r\n * @private\r\n */\r\n _prepareToUploading() {\r\n this.index = this.index || ++this.uploader._nextIndex;\r\n this.isReady = true;\r\n }\r\n /**\r\n * Replaces input element on his clone\r\n * @param {JQLite|jQuery} input\r\n * @private\r\n */\r\n _replaceNode(input) {\r\n var clone = $compile(input.clone())(input.scope());\r\n clone.prop('value', null); // FF fix\r\n input.css('display', 'none');\r\n input.after(clone); // remove jquery dependency\r\n }\r\n\r\n }\r\n \r\n \r\n return FileItem;\r\n}\r\n\r\n\r\nmodule.exports.$inject = [\r\n '$compile',\r\n 'FileLikeObject'\r\n];\n\n\n/** WEBPACK FOOTER **\n ** c:/OpenServer/domains/angular-file-upload.my/src/services/FileItem.js\n **/","'use strict';\r\n\r\n\r\nimport CONFIG from './../config.json';\r\n\r\n\r\nlet {\r\n extend\r\n } = angular;\r\n\r\n\r\nexport default () => {\r\n\r\n\r\n class FileDirective {\r\n /**\r\n * Creates instance of {FileDirective} object\r\n * @param {Object} options\r\n * @param {Object} options.uploader\r\n * @param {HTMLElement} options.element\r\n * @param {Object} options.events\r\n * @param {String} options.prop\r\n * @constructor\r\n */\r\n constructor(options) {\r\n extend(this, options);\r\n this.uploader._directives[this.prop].push(this);\r\n this._saveLinks();\r\n this.bind();\r\n }\r\n /**\r\n * Binds events handles\r\n */\r\n bind() {\r\n for(var key in this.events) {\r\n var prop = this.events[key];\r\n this.element.bind(key, this[prop]);\r\n }\r\n }\r\n /**\r\n * Unbinds events handles\r\n */\r\n unbind() {\r\n for(var key in this.events) {\r\n this.element.unbind(key, this.events[key]);\r\n }\r\n }\r\n /**\r\n * Destroys directive\r\n */\r\n destroy() {\r\n var index = this.uploader._directives[this.prop].indexOf(this);\r\n this.uploader._directives[this.prop].splice(index, 1);\r\n this.unbind();\r\n // this.element = null;\r\n }\r\n /**\r\n * Saves links to functions\r\n * @private\r\n */\r\n _saveLinks() {\r\n for(var key in this.events) {\r\n var prop = this.events[key];\r\n this[prop] = this[prop].bind(this);\r\n }\r\n }\r\n }\r\n\r\n\r\n /**\r\n * Map of events\r\n * @type {Object}\r\n */\r\n FileDirective.prototype.events = {};\r\n\r\n\r\n return FileDirective;\r\n}\r\n\r\n\r\nmodule.exports.$inject = [\r\n];\n\n\n/** WEBPACK FOOTER **\n ** c:/OpenServer/domains/angular-file-upload.my/src/services/FileDirective.js\n **/","'use strict';\r\n\r\n\r\nimport CONFIG from './../config.json';\r\n\r\n\r\nlet {\r\n forEach\r\n } = angular;\r\n\r\n\r\nexport default (FileDirective) => {\r\n \r\n \r\n class FileDrop extends FileDirective {\r\n /**\r\n * Creates instance of {FileDrop} object\r\n * @param {Object} options\r\n * @constructor\r\n */\r\n constructor(options) {\r\n // Map of events\r\n this.events = {\r\n $destroy: 'destroy',\r\n drop: 'onDrop',\r\n dragover: 'onDragOver',\r\n dragleave: 'onDragLeave'\r\n };\r\n // Name of property inside uploader._directive object\r\n this.prop = 'drop';\r\n \r\n super(options);\r\n }\r\n /**\r\n * Returns options\r\n * @return {Object|undefined}\r\n */\r\n getOptions() {\r\n }\r\n /**\r\n * Returns filters\r\n * @return {Array|String|undefined}\r\n */\r\n getFilters() {\r\n }\r\n /**\r\n * Event handler\r\n */\r\n onDrop(event) {\r\n var transfer = this._getTransfer(event);\r\n if(!transfer) return;\r\n var options = this.getOptions();\r\n var filters = this.getFilters();\r\n this._preventAndStop(event);\r\n forEach(this.uploader._directives.over, this._removeOverClass, this);\r\n this.uploader.addToQueue(transfer.files, options, filters);\r\n }\r\n /**\r\n * Event handler\r\n */\r\n onDragOver(event) {\r\n var transfer = this._getTransfer(event);\r\n if(!this._haveFiles(transfer.types)) return;\r\n transfer.dropEffect = 'copy';\r\n this._preventAndStop(event);\r\n forEach(this.uploader._directives.over, this._addOverClass, this);\r\n }\r\n /**\r\n * Event handler\r\n */\r\n onDragLeave(event) {\r\n if(event.currentTarget === this.element[0]) return;\r\n this._preventAndStop(event);\r\n forEach(this.uploader._directives.over, this._removeOverClass, this);\r\n }\r\n /**\r\n * Helper\r\n */\r\n _getTransfer(event) {\r\n return event.dataTransfer ? event.dataTransfer : event.originalEvent.dataTransfer; // jQuery fix;\r\n }\r\n /**\r\n * Helper\r\n */\r\n _preventAndStop(event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n /**\r\n * Returns \"true\" if types contains files\r\n * @param {Object} types\r\n */\r\n _haveFiles(types) {\r\n if(!types) return false;\r\n if(types.indexOf) {\r\n return types.indexOf('Files') !== -1;\r\n } else if(types.contains) {\r\n return types.contains('Files');\r\n } else {\r\n return false;\r\n }\r\n }\r\n /**\r\n * Callback\r\n */\r\n _addOverClass(item) {\r\n item.addOverClass();\r\n }\r\n /**\r\n * Callback\r\n */\r\n _removeOverClass(item) {\r\n item.removeOverClass();\r\n }\r\n }\r\n \r\n \r\n return FileDrop;\r\n}\r\n\r\n\r\nmodule.exports.$inject = [\r\n 'FileDirective'\r\n];\n\n\n/** WEBPACK FOOTER **\n ** c:/OpenServer/domains/angular-file-upload.my/src/services/FileDrop.js\n **/","'use strict';\r\n\r\n\r\nimport CONFIG from './../config.json';\r\n\r\n\r\nexport default (FileDirective) => {\r\n \r\n \r\n class FileOver extends FileDirective {\r\n /**\r\n * Creates instance of {FileDrop} object\r\n * @param {Object} options\r\n * @constructor\r\n */\r\n constructor(options) {\r\n // Map of events\r\n this.events = {\r\n $destroy: 'destroy'\r\n };\r\n // Name of property inside uploader._directive object\r\n this.prop = 'over';\r\n // Over class\r\n this.overClass = 'nv-file-over';\r\n \r\n super(options);\r\n }\r\n /**\r\n * Adds over class\r\n */\r\n addOverClass() {\r\n this.element.addClass(this.getOverClass());\r\n }\r\n /**\r\n * Removes over class\r\n */\r\n removeOverClass() {\r\n this.element.removeClass(this.getOverClass());\r\n }\r\n /**\r\n * Returns over class\r\n * @returns {String}\r\n */\r\n getOverClass() {\r\n return this.overClass;\r\n }\r\n }\r\n \r\n \r\n return FileOver;\r\n}\r\n\r\n\r\nmodule.exports.$inject = [\r\n 'FileDirective'\r\n];\n\n\n/** WEBPACK FOOTER **\n ** c:/OpenServer/domains/angular-file-upload.my/src/services/FileOver.js\n **/","'use strict';\r\n\r\n\r\nimport CONFIG from './../config.json';\r\n\r\n\r\nexport default ($parse, FileUploader, FileSelect) => {\r\n\r\n\r\n return {\r\n link: (scope, element, attributes) => {\r\n var uploader = scope.$eval(attributes.uploader);\r\n\r\n if (!(uploader instanceof FileUploader)) {\r\n throw new TypeError('\"Uploader\" must be an instance of FileUploader');\r\n }\r\n\r\n var object = new FileSelect({\r\n uploader: uploader,\r\n element: element\r\n });\r\n\r\n object.getOptions = $parse(attributes.options).bind(object, scope);\r\n object.getFilters = () => attributes.filters;\r\n }\r\n };\r\n\r\n\r\n}\r\n\r\n\r\nmodule.exports.$inject = [\r\n '$parse',\r\n 'FileUploader',\r\n 'FileSelect'\r\n];\n\n\n/** WEBPACK FOOTER **\n ** c:/OpenServer/domains/angular-file-upload.my/src/directives/FileSelect.js\n **/","'use strict';\r\n\r\n\r\nimport CONFIG from './../config.json';\r\n\r\n\r\nexport default ($parse, FileUploader, FileDrop) => {\r\n\r\n\r\n return {\r\n link: (scope, element, attributes) => {\r\n var uploader = scope.$eval(attributes.uploader);\r\n\r\n if (!(uploader instanceof FileUploader)) {\r\n throw new TypeError('\"Uploader\" must be an instance of FileUploader');\r\n }\r\n\r\n if (!uploader.isHTML5) return;\r\n\r\n var object = new FileDrop({\r\n uploader: uploader,\r\n element: element\r\n });\r\n\r\n object.getOptions = $parse(attributes.options).bind(object, scope);\r\n object.getFilters = () => attributes.filters;\r\n }\r\n };\r\n\r\n\r\n}\r\n\r\n\r\nmodule.exports.$inject = [\r\n '$parse',\r\n 'FileUploader',\r\n 'FileDrop'\r\n];\n\n\n/** WEBPACK FOOTER **\n ** c:/OpenServer/domains/angular-file-upload.my/src/directives/FileDrop.js\n **/","'use strict';\r\n\r\n\r\nimport CONFIG from './../config.json';\r\n\r\n\r\nexport default (FileUploader, FileOver) => {\r\n\r\n\r\n return {\r\n link: (scope, element, attributes) => {\r\n var uploader = scope.$eval(attributes.uploader);\r\n\r\n if (!(uploader instanceof FileUploader)) {\r\n throw new TypeError('\"Uploader\" must be an instance of FileUploader');\r\n }\r\n\r\n var object = new FileOver({\r\n uploader: uploader,\r\n element: element\r\n });\r\n\r\n object.getOverClass = () => attributes.overClass || object.overClass;\r\n }\r\n };\r\n\r\n\r\n}\r\n\r\n\r\nmodule.exports.$inject = [\r\n 'FileUploader',\r\n 'FileOver'\r\n];\n\n\n/** WEBPACK FOOTER **\n ** c:/OpenServer/domains/angular-file-upload.my/src/directives/FileOver.js\n **/"],"sourceRoot":""} diff --git a/example-2.0/client/controllers.js b/example-2.0/client/controllers.js deleted file mode 100644 index f8ed4f0..0000000 --- a/example-2.0/client/controllers.js +++ /dev/null @@ -1,94 +0,0 @@ -angular.module('app', ['angularFileUpload']) - - // The example of the full functionality - .controller('TestController',function ($scope, FileUploader) { - 'use strict'; - - // create a uploader with options - - var uploader = $scope.uploader = new FileUploader({ - scope: $scope, // to automatically update the html. Default: $rootScope - url: '/api/containers/container1/upload', - formData: [ - { key: 'value' } - ] - }); - - // ADDING FILTERS - uploader.filters.push({ - name: 'filterName', - fn: function (item, options) { // second user filter - console.info('filter2'); - return true; - } - }); - - // REGISTER HANDLERS - // -------------------- - uploader.onAfterAddingFile = function(item) { - console.info('After adding a file', item); - }; - // -------------------- - uploader.onAfterAddingAll = function(items) { - console.info('After adding all files', items); - }; - // -------------------- - uploader.onWhenAddingFileFailed = function(item, filter, options) { - console.info('When adding a file failed', item); - }; - // -------------------- - uploader.onBeforeUploadItem = function(item) { - console.info('Before upload', item); - }; - // -------------------- - uploader.onProgressItem = function(item, progress) { - console.info('Progress: ' + progress, item); - }; - // -------------------- - uploader.onProgressAll = function(progress) { - console.info('Total progress: ' + progress); - }; - // -------------------- - uploader.onSuccessItem = function(item, response, status, headers) { - console.info('Success', response, status, headers); - $scope.$broadcast('uploadCompleted', item); - }; - // -------------------- - uploader.onErrorItem = function(item, response, status, headers) { - console.info('Error', response, status, headers); - }; - // -------------------- - uploader.onCancelItem = function(item, response, status, headers) { - console.info('Cancel', response, status); - }; - // -------------------- - uploader.onCompleteItem = function(item, response, status, headers) { - console.info('Complete', response, status, headers); - }; - // -------------------- - uploader.onCompleteAll = function() { - console.info('Complete all'); - }; - // -------------------- - } -).controller('FilesController', function ($scope, $http) { - - $scope.load = function () { - $http.get('/api/containers/container1/files').success(function (data) { - console.log(data); - $scope.files = data; - }); - }; - - $scope.delete = function (index, id) { - $http.delete('/api/containers/container1/files/' + encodeURIComponent(id)).success(function (data, status, headers) { - $scope.files.splice(index, 1); - }); - }; - - $scope.$on('uploadCompleted', function(event) { - console.log('uploadCompleted event received'); - $scope.load(); - }); - - }); diff --git a/example-2.0/client/index.html b/example-2.0/client/index.html deleted file mode 100644 index 03a3011..0000000 --- a/example-2.0/client/index.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - LoopBack Storage Service Demo - - - - - - - - - - - - - - - - - - - - - - - - LoopBack - Storage Service - - - - - - - - - - - Select files - - - - - Base drop zone - - - - - Another drop zone with its own settings - - - - - Multiple - - - Single - - - - - - Upload queue - - Queue length: {{ uploader.queue.length }} - - - - - Name - Size - Progress - Status - Actions - - - - - {{ item.file.name }} - {{ - item.file.size/1024/1024|number:2 }} MB - - - - - - - - - - - - - - - Upload - - - - Cancel - - - - Remove - - - - - - - - - Queue progress: - - - - - - - Upload all - - - Cancel - all - - - Remove all - - - - - - - - Files in the container - - - - - - - {{ - file.name }} - - - - - Remove - - - - - - - - - - - - - - - - - - - diff --git a/example-2.0/package.json b/example-2.0/package.json deleted file mode 100644 index 7f50487..0000000 --- a/example-2.0/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "loopback-example-storage", - "version": "0.0.0", - "main": "server/server.js", - "scripts": { - "pretest": "jshint ." - }, - "dependencies": { - "compression": "^1.0.3", - "errorhandler": "^1.1.1", - "loopback": "^2.0.0", - "loopback-boot": "^2.0.0", - "loopback-component-explorer": "^2.1.0", - "loopback-component-storage": "^1.5.0", - "loopback-datasource-juggler": "^2.7.0", - "serve-favicon": "^2.0.1" - } -} diff --git a/example-2.0/server/boot/authentication.js b/example-2.0/server/boot/authentication.js deleted file mode 100644 index a87cd08..0000000 --- a/example-2.0/server/boot/authentication.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = function enableAuthentication(server) { - // enable authentication - server.enableAuth(); -}; diff --git a/example-2.0/server/component-config.json b/example-2.0/server/component-config.json deleted file mode 100644 index f36959a..0000000 --- a/example-2.0/server/component-config.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "loopback-component-explorer": { - "mountPath": "/explorer" - } -} diff --git a/example-2.0/server/config.json b/example-2.0/server/config.json deleted file mode 100644 index c589cb4..0000000 --- a/example-2.0/server/config.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "legacyExplorer": false, - "restApiRoot": "/api", - "host": "0.0.0.0", - "port": 3000, - "url": "http://localhost:3000/" -} diff --git a/example-2.0/server/datasources.json b/example-2.0/server/datasources.json deleted file mode 100644 index 16423ff..0000000 --- a/example-2.0/server/datasources.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db": { - "name": "db", - "connector": "memory" - }, - "storage": { - "name": "storage", - "connector": "loopback-component-storage", - "provider": "filesystem", - "root": "./server/storage" - } -} diff --git a/example-2.0/server/middleware.json b/example-2.0/server/middleware.json deleted file mode 100644 index a1be9a1..0000000 --- a/example-2.0/server/middleware.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "initial:before": { - "loopback#favicon": {}, - "loopback#compress": {} - }, - "initial": { - "compression": {} - }, - "session": { - }, - "auth": { - }, - "parse": { - }, - "routes": { - "loopback#rest": { - "paths": ["${restApiRoot}"] - } - }, - "files": { - "loopback#static": { - "params": "$!../client" - } - }, - "final": { - "loopback#urlNotFound": {} - }, - "final:after": { - "errorhandler": {} - } -} diff --git a/example-2.0/server/model-config.json b/example-2.0/server/model-config.json deleted file mode 100644 index 73467d5..0000000 --- a/example-2.0/server/model-config.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "_meta": { - "sources": [ - "../common/models", - "./models" - ] - }, - "User": { - "dataSource": "db" - }, - "AccessToken": { - "dataSource": "db", - "public": false - }, - "ACL": { - "dataSource": "db", - "public": false - }, - "RoleMapping": { - "dataSource": "db", - "public": false - }, - "Role": { - "dataSource": "db", - "public": false - }, - "container": { - "dataSource": "storage", - "public": true - } -} diff --git a/example-2.0/server/models/container.js b/example-2.0/server/models/container.js deleted file mode 100644 index a0e8234..0000000 --- a/example-2.0/server/models/container.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = function(Container) { - -}; diff --git a/example-2.0/server/models/container.json b/example-2.0/server/models/container.json deleted file mode 100644 index a42952c..0000000 --- a/example-2.0/server/models/container.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "container", - "base": "Model", - "properties": {}, - "validations": [], - "relations": {}, - "acls": [], - "methods": [] -} diff --git a/example-2.0/server/providers.json b/example-2.0/server/providers.json deleted file mode 100644 index 15dd4ac..0000000 --- a/example-2.0/server/providers.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "rackspace": { - "username": "your-rackspace-username", - "apiKey": "your-rackspace-api-key", - "region": "DFW" - }, - "amazon": { - "key": "your-amazon-key", - "keyId": "your-amazon-key-id" - } -} diff --git a/example-2.0/server/server.js b/example-2.0/server/server.js deleted file mode 100644 index 3be7b08..0000000 --- a/example-2.0/server/server.js +++ /dev/null @@ -1,27 +0,0 @@ -var loopback = require('loopback'); -var boot = require('loopback-boot'); - -var app = module.exports = loopback(); - -app.start = function() { - // start the web server - return app.listen(function() { - app.emit('started'); - var baseUrl = app.get('url').replace(/\/$/, ''); - console.log('Web server listening at: %s', baseUrl); - if (app.get('loopback-component-explorer')) { - var explorerPath = app.get('loopback-component-explorer').mountPath; - console.log('Browse your REST API at %s%s', baseUrl, explorerPath); - } - }); -}; - -// Bootstrap the application, configure models, datasources and middleware. -// Sub-apps like REST API are mounted via boot scripts. -boot(app, __dirname, function(err) { - if (err) throw err; - - // start the server if `$ node server.js` - if (require.main === module) - app.start(); -}); diff --git a/example-2.0/server/storage/container1/f1.txt b/example-2.0/server/storage/container1/f1.txt deleted file mode 100644 index 1652405..0000000 --- a/example-2.0/server/storage/container1/f1.txt +++ /dev/null @@ -1 +0,0 @@ -Hello.... \ No newline at end of file diff --git a/example-2.0/server/storage/container1/f1_downloaded.txt b/example-2.0/server/storage/container1/f1_downloaded.txt deleted file mode 100644 index 1652405..0000000 --- a/example-2.0/server/storage/container1/f1_downloaded.txt +++ /dev/null @@ -1 +0,0 @@ -Hello.... \ No newline at end of file diff --git a/example-2.0/server/storage/container1/lb.png b/example-2.0/server/storage/container1/lb.png deleted file mode 100644 index a91e0a5..0000000 Binary files a/example-2.0/server/storage/container1/lb.png and /dev/null differ diff --git a/example-2.0/server/storage/container1/uploadTest.txt b/example-2.0/server/storage/container1/uploadTest.txt deleted file mode 100644 index 9bc8a72..0000000 --- a/example-2.0/server/storage/container1/uploadTest.txt +++ /dev/null @@ -1 +0,0 @@ -Upload test \ No newline at end of file diff --git a/example-2.0/server/storage/container2/f2.txt b/example-2.0/server/storage/container2/f2.txt deleted file mode 100644 index 1652405..0000000 --- a/example-2.0/server/storage/container2/f2.txt +++ /dev/null @@ -1 +0,0 @@ -Hello.... \ No newline at end of file diff --git a/example/app-cloud.js b/example/app-cloud.js deleted file mode 100644 index 0060c36..0000000 --- a/example/app-cloud.js +++ /dev/null @@ -1,57 +0,0 @@ -var StorageService = require('../').StorageService; -var path = require('path'); -var providers = null; -try { - providers = require('./providers-private.json'); -} catch(err) { - providers = require('./providers.json'); -} - -function listContainersAndFiles(ss) { - ss.getContainers(function (err, containers) { - if (err) { - console.error(err); - return; - } - console.log('----------- %s (%d) ---------------', ss.provider, containers.length); - containers.forEach(function (c) { - console.log('[%s] %s/', ss.provider, c.name); - c.getFiles(function (err, files) { - files.forEach(function (f) { - console.log('[%s] ... %s', ss.provider, f.name); - }); - }); - }); - }); -} - -var rs = new StorageService({ - provider: 'rackspace', - username: providers.rackspace.username, - apiKey: providers.rackspace.apiKey, - region: providers.rackspace.region -}); - -listContainersAndFiles(rs); - -var s3 = new StorageService({ - provider: 'amazon', - key: providers.amazon.key, - keyId: providers.amazon.keyId -}); - -listContainersAndFiles(s3); - - -var fs = require('fs'); -var path = require('path'); -var stream = s3.uploadStream('con1', 'test.jpg'); -fs.createReadStream(path.join(__dirname, 'test.jpg')).pipe(stream); - -var local = StorageService({ - provider: 'filesystem', - root: path.join(__dirname, 'storage') -}); - -listContainersAndFiles(local); - diff --git a/example/providers.json b/example/providers.json deleted file mode 100644 index 15dd4ac..0000000 --- a/example/providers.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "rackspace": { - "username": "your-rackspace-username", - "apiKey": "your-rackspace-api-key", - "region": "DFW" - }, - "amazon": { - "key": "your-amazon-key", - "keyId": "your-amazon-key-id" - } -} diff --git a/example/public/angular-file-upload.js b/example/public/angular-file-upload.js deleted file mode 100644 index a73fd4c..0000000 --- a/example/public/angular-file-upload.js +++ /dev/null @@ -1,685 +0,0 @@ -/* - Angular File Upload v0.3.3.1 - https://github.com/nervgh/angular-file-upload -*/ -(function(angular, factory) { - if (typeof define === 'function' && define.amd) { - define('angular-file-upload', ['angular'], function(angular) { - return factory(angular); - }); - } else { - return factory(angular); - } -}(angular || null, function(angular) { -var app = angular.module('angularFileUpload', []); - -// It is attached to an element that catches the event drop file -app.directive('ngFileDrop', [ '$fileUploader', function ($fileUploader) { - 'use strict'; - - return { - // don't use drag-n-drop files in IE9, because not File API support - link: !$fileUploader.isHTML5 ? angular.noop : function (scope, element, attributes) { - element - .bind('drop', function (event) { - var dataTransfer = event.dataTransfer ? - event.dataTransfer : - event.originalEvent.dataTransfer; // jQuery fix; - if (!dataTransfer) return; - event.preventDefault(); - event.stopPropagation(); - scope.$broadcast('file:removeoverclass'); - scope.$emit('file:add', dataTransfer.files, scope.$eval(attributes.ngFileDrop)); - }) - .bind('dragover', function (event) { - var dataTransfer = event.dataTransfer ? - event.dataTransfer : - event.originalEvent.dataTransfer; // jQuery fix; - - event.preventDefault(); - event.stopPropagation(); - dataTransfer.dropEffect = 'copy'; - scope.$broadcast('file:addoverclass'); - }) - .bind('dragleave', function () { - scope.$broadcast('file:removeoverclass'); - }); - } - }; -}]) -// It is attached to an element which will be assigned to a class "ng-file-over" or ng-file-over="className" -app.directive('ngFileOver', function () { - 'use strict'; - - return { - link: function (scope, element, attributes) { - scope.$on('file:addoverclass', function () { - element.addClass(attributes.ngFileOver || 'ng-file-over'); - }); - scope.$on('file:removeoverclass', function () { - element.removeClass(attributes.ngFileOver || 'ng-file-over'); - }); - } - }; -}); -// It is attached to element like -app.directive('ngFileSelect', [ '$fileUploader', function ($fileUploader) { - 'use strict'; - - return { - link: function (scope, element, attributes) { - $fileUploader.isHTML5 || element.removeAttr('multiple'); - - element.bind('change', function () { - scope.$emit('file:add', $fileUploader.isHTML5 ? this.files : this, scope.$eval(attributes.ngFileSelect)); - ($fileUploader.isHTML5 && element.attr('multiple')) && element.prop('value', null); - }); - - element.prop('value', null); // FF fix - } - }; -}]); -app.factory('$fileUploader', [ '$compile', '$rootScope', '$http', '$window', function ($compile, $rootScope, $http, $window) { - 'use strict'; - - /** - * Creates a uploader - * @param {Object} params - * @constructor - */ - function Uploader(params) { - angular.extend(this, { - scope: $rootScope, - url: '/', - alias: 'file', - queue: [], - headers: {}, - progress: null, - autoUpload: false, - removeAfterUpload: false, - method: 'POST', - filters: [], - formData: [], - isUploading: false, - _nextIndex: 0, - _timestamp: Date.now() - }, params); - - // add the base filter - this.filters.unshift(this._filter); - - this.scope.$on('file:add', function (event, items, options) { - event.stopPropagation(); - this.addToQueue(items, options); - }.bind(this)); - - this.bind('beforeupload', Item.prototype._beforeupload); - this.bind('in:progress', Item.prototype._progress); - this.bind('in:success', Item.prototype._success); - this.bind('in:cancel', Item.prototype._cancel); - this.bind('in:error', Item.prototype._error); - this.bind('in:complete', Item.prototype._complete); - this.bind('in:progress', this._progress); - this.bind('in:complete', this._complete); - } - - Uploader.prototype = { - /** - * Link to the constructor - */ - constructor: Uploader, - - /** - * The base filter. If returns "true" an item will be added to the queue - * @param {File|Input} item - * @returns {boolean} - * @private - */ - _filter: function (item) { - return angular.isElement(item) ? true : !!item.size; - }, - - /** - * Registers a event handler - * @param {String} event - * @param {Function} handler - * @return {Function} unsubscribe function - */ - bind: function (event, handler) { - return this.scope.$on(this._timestamp + ':' + event, handler.bind(this)); - }, - - /** - * Triggers events - * @param {String} event - * @param {...*} [some] - */ - trigger: function (event, some) { - arguments[ 0 ] = this._timestamp + ':' + event; - this.scope.$broadcast.apply(this.scope, arguments); - }, - - /** - * Checks a support the html5 uploader - * @returns {Boolean} - * @readonly - */ - isHTML5: !!($window.File && $window.FormData), - - /** - * Adds items to the queue - * @param {FileList|File|HTMLInputElement} items - * @param {Object} [options] - */ - addToQueue: function (items, options) { - var length = this.queue.length; - var list = 'length' in items ? items : [items]; - - angular.forEach(list, function (file) { - // check a [File|HTMLInputElement] - var isValid = !this.filters.length ? true : this.filters.every(function (filter) { - return filter.call(this, file); - }, this); - - // create new item - var item = new Item(angular.extend({ - url: this.url, - alias: this.alias, - headers: angular.copy(this.headers), - formData: angular.copy(this.formData), - removeAfterUpload: this.removeAfterUpload, - method: this.method, - uploader: this, - file: file - }, options)); - - if (isValid) { - this.queue.push(item); - this.trigger('afteraddingfile', item); - } else { - this.trigger('whenaddingfilefailed', item); - } - }, this); - - if (this.queue.length !== length) { - this.trigger('afteraddingall', this.queue); - this.progress = this._getTotalProgress(); - } - - this._render(); - this.autoUpload && this.uploadAll(); - }, - - /** - * Remove items from the queue. Remove last: index = -1 - * @param {Item|Number} value - */ - removeFromQueue: function (value) { - var index = this.getIndexOfItem(value); - var item = this.queue[ index ]; - item.isUploading && item.cancel(); - this.queue.splice(index, 1); - item._destroy(); - this.progress = this._getTotalProgress(); - }, - - /** - * Clears the queue - */ - clearQueue: function () { - this.queue.forEach(function (item) { - item.isUploading && item.cancel(); - item._destroy(); - }, this); - this.queue.length = 0; - this.progress = 0; - }, - - /** - * Returns a index of item from the queue - * @param {Item|Number} value - * @returns {Number} - */ - getIndexOfItem: function (value) { - return angular.isObject(value) ? this.queue.indexOf(value) : value; - }, - - /** - * Returns not uploaded items - * @returns {Array} - */ - getNotUploadedItems: function () { - return this.queue.filter(function (item) { - return !item.isUploaded; - }); - }, - - /** - * Returns items ready for upload - * @returns {Array} - */ - getReadyItems: function() { - return this.queue - .filter(function(item) { - return item.isReady && !item.isUploading; - }) - .sort(function(item1, item2) { - return item1.index - item2.index; - }); - }, - - /** - * Uploads a item from the queue - * @param {Item|Number} value - */ - uploadItem: function (value) { - var index = this.getIndexOfItem(value); - var item = this.queue[ index ]; - var transport = this.isHTML5 ? '_xhrTransport' : '_iframeTransport'; - - item.index = item.index || this._nextIndex++; - item.isReady = true; - - if (this.isUploading) { - return; - } - - this.isUploading = true; - this[ transport ](item); - }, - - /** - * Cancels uploading of item from the queue - * @param {Item|Number} value - */ - cancelItem: function(value) { - var index = this.getIndexOfItem(value); - var item = this.queue[ index ]; - var prop = this.isHTML5 ? '_xhr' : '_form'; - item[prop] && item[prop].abort(); - }, - - /** - * Uploads all not uploaded items of queue - */ - uploadAll: function () { - var items = this.getNotUploadedItems().filter(function(item) { - return !item.isUploading; - }); - items.forEach(function(item) { - item.index = item.index || this._nextIndex++; - item.isReady = true; - }, this); - items.length && this.uploadItem(items[ 0 ]); - }, - - /** - * Cancels all uploads - */ - cancelAll: function() { - this.getNotUploadedItems().forEach(function(item) { - this.cancelItem(item); - }, this); - }, - - /** - * Updates angular scope - * @private - */ - _render: function() { - this.scope.$$phase || this.scope.$digest(); - }, - - /** - * Returns the total progress - * @param {Number} [value] - * @returns {Number} - * @private - */ - _getTotalProgress: function (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); - }, - - /** - * The 'in:progress' handler - * @private - */ - _progress: function (event, item, progress) { - var result = this._getTotalProgress(progress); - this.trigger('progressall', result); - this.progress = result; - this._render(); - }, - - /** - * The 'in:complete' handler - * @private - */ - _complete: function () { - var item = this.getReadyItems()[ 0 ]; - this.isUploading = false; - - if (angular.isDefined(item)) { - this.uploadItem(item); - return; - } - - this.trigger('completeall', this.queue); - this.progress = this._getTotalProgress(); - this._render(); - }, - - /** - * The XMLHttpRequest transport - * @private - */ - _xhrTransport: function (item) { - var xhr = item._xhr = new XMLHttpRequest(); - var form = new FormData(); - var that = this; - - this.trigger('beforeupload', item); - - item.formData.forEach(function(obj) { - angular.forEach(obj, function(value, key) { - form.append(key, value); - }); - }); - - form.append(item.alias, item.file); - - xhr.upload.onprogress = function (event) { - var progress = event.lengthComputable ? event.loaded * 100 / event.total : 0; - that.trigger('in:progress', item, Math.round(progress)); - }; - - xhr.onload = function () { - var response = that._transformResponse(xhr.response); - var event = that._isSuccessCode(xhr.status) ? 'success' : 'error'; - that.trigger('in:' + event, xhr, item, response); - that.trigger('in:complete', xhr, item, response); - }; - - xhr.onerror = function () { - that.trigger('in:error', xhr, item); - that.trigger('in:complete', xhr, item); - }; - - xhr.onabort = function () { - that.trigger('in:cancel', xhr, item); - that.trigger('in:complete', xhr, item); - }; - - xhr.open(item.method, item.url, true); - - angular.forEach(item.headers, function (value, name) { - xhr.setRequestHeader(name, value); - }); - - xhr.send(form); - }, - - /** - * The IFrame transport - * @private - */ - _iframeTransport: function (item) { - var form = angular.element(''); - var iframe = angular.element(''); - var input = item._input; - var that = this; - - item._form && item._form.replaceWith(input); // remove old form - item._form = form; // save link to new form - - this.trigger('beforeupload', item); - - input.prop('name', item.alias); - - item.formData.forEach(function(obj) { - angular.forEach(obj, function(value, key) { - form.append(angular.element('')); - }); - }); - - form.prop({ - action: item.url, - method: item.method, - target: iframe.prop('name'), - enctype: 'multipart/form-data', - encoding: 'multipart/form-data' // old IE - }); - - iframe.bind('load', function () { - // fixed angular.contents() for iframes - var html = iframe[0].contentDocument.body.innerHTML; - var xhr = { response: html, status: 200, dummy: true }; - var response = that._transformResponse(xhr.response); - that.trigger('in:success', xhr, item, response); - that.trigger('in:complete', xhr, item, response); - }); - - form.abort = function() { - var xhr = { status: 0, dummy: true }; - iframe.unbind('load').prop('src', 'javascript:false;'); - form.replaceWith(input); - that.trigger('in:cancel', xhr, item); - that.trigger('in:complete', xhr, item); - }; - - input.after(form); - form.append(input).append(iframe); - - form[ 0 ].submit(); - }, - - /** - * Checks whether upload successful - * @param {Number} status - * @returns {Boolean} - * @private - */ - _isSuccessCode: function(status) { - return (status >= 200 && status < 300) || status === 304; - }, - - /** - * Transforms the server response - * @param {*} response - * @returns {*} - * @private - */ - _transformResponse: function (response) { - $http.defaults.transformResponse.forEach(function (transformFn) { - response = transformFn(response); - }); - return response; - } - }; - - - /** - * Create a item - * @param {Object} params - * @constructor - */ - function Item(params) { - // fix for old browsers - if (!Uploader.prototype.isHTML5) { - var input = angular.element(params.file); - var clone = $compile(input.clone())(params.uploader.scope); - var value = input.val(); - - params.file = { - lastModifiedDate: null, - size: null, - type: 'like/' + value.slice(value.lastIndexOf('.') + 1).toLowerCase(), - name: value.slice(value.lastIndexOf('/') + value.lastIndexOf('\\') + 2) - }; - - params._input = input; - clone.prop('value', null); // FF fix - input.css('display', 'none').after(clone); // remove jquery dependency - } - - angular.extend(this, { - isReady: false, - isUploading: false, - isUploaded: false, - isSuccess: false, - isCancel: false, - isError: false, - progress: null, - index: null - }, params); - } - - - Item.prototype = { - /** - * Link to the constructor - */ - constructor: Item, - /** - * Removes a item - */ - remove: function () { - this.uploader.removeFromQueue(this); - }, - /** - * Uploads a item - */ - upload: function () { - this.uploader.uploadItem(this); - }, - /** - * Cancels uploading - */ - cancel: function() { - this.uploader.cancelItem(this); - }, - /** - * Destroys form and input - * @private - */ - _destroy: function() { - this._form && this._form.remove(); - this._input && this._input.remove(); - delete this._form; - delete this._input; - }, - /** - * The 'beforeupload' handler - * @param {Object} event - * @param {Item} item - * @private - */ - _beforeupload: function (event, item) { - item.isReady = true; - item.isUploading = true; - item.isUploaded = false; - item.isSuccess = false; - item.isCancel = false; - item.isError = false; - item.progress = 0; - }, - /** - * The 'in:progress' handler - * @param {Object} event - * @param {Item} item - * @param {Number} progress - * @private - */ - _progress: function (event, item, progress) { - item.progress = progress; - item.uploader.trigger('progress', item, progress); - }, - /** - * The 'in:success' handler - * @param {Object} event - * @param {XMLHttpRequest} xhr - * @param {Item} item - * @param {*} response - * @private - */ - _success: function (event, xhr, item, response) { - item.isReady = false; - item.isUploading = false; - item.isUploaded = true; - item.isSuccess = true; - item.isCancel = false; - item.isError = false; - item.progress = 100; - item.index = null; - item.uploader.trigger('success', xhr, item, response); - }, - /** - * The 'in:cancel' handler - * @param {Object} event - * @param {XMLHttpRequest} xhr - * @param {Item} item - * @private - */ - _cancel: function(event, xhr, item) { - item.isReady = false; - item.isUploading = false; - item.isUploaded = false; - item.isSuccess = false; - item.isCancel = true; - item.isError = false; - item.progress = 0; - item.index = null; - item.uploader.trigger('cancel', xhr, item); - }, - /** - * The 'in:error' handler - * @param {Object} event - * @param {XMLHttpRequest} xhr - * @param {Item} item - * @param {*} response - * @private - */ - _error: function (event, xhr, item, response) { - item.isReady = false; - item.isUploading = false; - item.isUploaded = true; - item.isSuccess = false; - item.isCancel = false; - item.isError = true; - item.progress = 100; - item.index = null; - item.uploader.trigger('error', xhr, item, response); - }, - /** - * The 'in:complete' handler - * @param {Object} event - * @param {XMLHttpRequest} xhr - * @param {Item} item - * @param {*} response - * @private - */ - _complete: function (event, xhr, item, response) { - item.uploader.trigger('complete', xhr, item, response); - item.removeAfterUpload && item.remove(); - } - }; - - return { - create: function (params) { - return new Uploader(params); - }, - isHTML5: Uploader.prototype.isHTML5 - }; -}]) - - return app; -})); \ No newline at end of file diff --git a/example/public/angular-file-upload.min.js b/example/public/angular-file-upload.min.js deleted file mode 100644 index 243ca0c..0000000 --- a/example/public/angular-file-upload.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/* - Angular File Upload v0.3.3.1 - https://github.com/nervgh/angular-file-upload -*/ -!function(a,b){return"function"==typeof define&&define.amd?(define("angular-file-upload",["angular"],function(a){return b(a)}),void 0):b(a)}(angular||null,function(a){var b=a.module("angularFileUpload",[]);return b.directive("ngFileDrop",["$fileUploader",function(b){"use strict";return{link:b.isHTML5?function(a,b,c){b.bind("drop",function(b){var d=b.dataTransfer?b.dataTransfer:b.originalEvent.dataTransfer;d&&(b.preventDefault(),b.stopPropagation(),a.$broadcast("file:removeoverclass"),a.$emit("file:add",d.files,a.$eval(c.ngFileDrop)))}).bind("dragover",function(b){var c=b.dataTransfer?b.dataTransfer:b.originalEvent.dataTransfer;b.preventDefault(),b.stopPropagation(),c.dropEffect="copy",a.$broadcast("file:addoverclass")}).bind("dragleave",function(){a.$broadcast("file:removeoverclass")})}:a.noop}}]),b.directive("ngFileOver",function(){"use strict";return{link:function(a,b,c){a.$on("file:addoverclass",function(){b.addClass(c.ngFileOver||"ng-file-over")}),a.$on("file:removeoverclass",function(){b.removeClass(c.ngFileOver||"ng-file-over")})}}}),b.directive("ngFileSelect",["$fileUploader",function(a){"use strict";return{link:function(b,c,d){a.isHTML5||c.removeAttr("multiple"),c.bind("change",function(){b.$emit("file:add",a.isHTML5?this.files:this,b.$eval(d.ngFileSelect)),a.isHTML5&&c.attr("multiple")&&c.prop("value",null)}),c.prop("value",null)}}}]),b.factory("$fileUploader",["$compile","$rootScope","$http","$window",function(b,c,d,e){"use strict";function f(b){a.extend(this,{scope:c,url:"/",alias:"file",queue:[],headers:{},progress:null,autoUpload:!1,removeAfterUpload:!1,method:"POST",filters:[],formData:[],isUploading:!1,_nextIndex:0,_timestamp:Date.now()},b),this.filters.unshift(this._filter),this.scope.$on("file:add",function(a,b,c){a.stopPropagation(),this.addToQueue(b,c)}.bind(this)),this.bind("beforeupload",g.prototype._beforeupload),this.bind("in:progress",g.prototype._progress),this.bind("in:success",g.prototype._success),this.bind("in:cancel",g.prototype._cancel),this.bind("in:error",g.prototype._error),this.bind("in:complete",g.prototype._complete),this.bind("in:progress",this._progress),this.bind("in:complete",this._complete)}function g(c){if(!f.prototype.isHTML5){var d=a.element(c.file),e=b(d.clone())(c.uploader.scope),g=d.val();c.file={lastModifiedDate:null,size:null,type:"like/"+g.slice(g.lastIndexOf(".")+1).toLowerCase(),name:g.slice(g.lastIndexOf("/")+g.lastIndexOf("\\")+2)},c._input=d,e.prop("value",null),d.css("display","none").after(e)}a.extend(this,{isReady:!1,isUploading:!1,isUploaded:!1,isSuccess:!1,isCancel:!1,isError:!1,progress:null,index:null},c)}return f.prototype={constructor:f,_filter:function(b){return a.isElement(b)?!0:!!b.size},bind:function(a,b){return this.scope.$on(this._timestamp+":"+a,b.bind(this))},trigger:function(a){arguments[0]=this._timestamp+":"+a,this.scope.$broadcast.apply(this.scope,arguments)},isHTML5:!(!e.File||!e.FormData),addToQueue:function(b,c){var d=this.queue.length,e="length"in b?b:[b];a.forEach(e,function(b){var d=this.filters.length?this.filters.every(function(a){return a.call(this,b)},this):!0,e=new g(a.extend({url:this.url,alias:this.alias,headers:a.copy(this.headers),formData:a.copy(this.formData),removeAfterUpload:this.removeAfterUpload,method:this.method,uploader:this,file:b},c));d?(this.queue.push(e),this.trigger("afteraddingfile",e)):this.trigger("whenaddingfilefailed",e)},this),this.queue.length!==d&&(this.trigger("afteraddingall",this.queue),this.progress=this._getTotalProgress()),this._render(),this.autoUpload&&this.uploadAll()},removeFromQueue:function(a){var b=this.getIndexOfItem(a),c=this.queue[b];c.isUploading&&c.cancel(),this.queue.splice(b,1),c._destroy(),this.progress=this._getTotalProgress()},clearQueue:function(){this.queue.forEach(function(a){a.isUploading&&a.cancel(),a._destroy()},this),this.queue.length=0,this.progress=0},getIndexOfItem:function(b){return a.isObject(b)?this.queue.indexOf(b):b},getNotUploadedItems:function(){return this.queue.filter(function(a){return!a.isUploaded})},getReadyItems:function(){return this.queue.filter(function(a){return a.isReady&&!a.isUploading}).sort(function(a,b){return a.index-b.index})},uploadItem:function(a){var b=this.getIndexOfItem(a),c=this.queue[b],d=this.isHTML5?"_xhrTransport":"_iframeTransport";c.index=c.index||this._nextIndex++,c.isReady=!0,this.isUploading||(this.isUploading=!0,this[d](c))},cancelItem:function(a){var b=this.getIndexOfItem(a),c=this.queue[b],d=this.isHTML5?"_xhr":"_form";c[d]&&c[d].abort()},uploadAll:function(){var a=this.getNotUploadedItems().filter(function(a){return!a.isUploading});a.forEach(function(a){a.index=a.index||this._nextIndex++,a.isReady=!0},this),a.length&&this.uploadItem(a[0])},cancelAll:function(){this.getNotUploadedItems().forEach(function(a){this.cancelItem(a)},this)},_render:function(){this.scope.$$phase||this.scope.$digest()},_getTotalProgress:function(a){if(this.removeAfterUpload)return a||0;var b=this.getNotUploadedItems().length,c=b?this.queue.length-b:this.queue.length,d=100/this.queue.length,e=(a||0)*d/100;return Math.round(c*d+e)},_progress:function(a,b,c){var d=this._getTotalProgress(c);this.trigger("progressall",d),this.progress=d,this._render()},_complete:function(){var b=this.getReadyItems()[0];return this.isUploading=!1,a.isDefined(b)?(this.uploadItem(b),void 0):(this.trigger("completeall",this.queue),this.progress=this._getTotalProgress(),this._render(),void 0)},_xhrTransport:function(b){var c=b._xhr=new XMLHttpRequest,d=new FormData,e=this;this.trigger("beforeupload",b),b.formData.forEach(function(b){a.forEach(b,function(a,b){d.append(b,a)})}),d.append(b.alias,b.file),c.upload.onprogress=function(a){var c=a.lengthComputable?100*a.loaded/a.total:0;e.trigger("in:progress",b,Math.round(c))},c.onload=function(){var a=e._transformResponse(c.response),d=e._isSuccessCode(c.status)?"success":"error";e.trigger("in:"+d,c,b,a),e.trigger("in:complete",c,b,a)},c.onerror=function(){e.trigger("in:error",c,b),e.trigger("in:complete",c,b)},c.onabort=function(){e.trigger("in:cancel",c,b),e.trigger("in:complete",c,b)},c.open(b.method,b.url,!0),a.forEach(b.headers,function(a,b){c.setRequestHeader(b,a)}),c.send(d)},_iframeTransport:function(b){var c=a.element(''),d=a.element(''),e=b._input,f=this;b._form&&b._form.replaceWith(e),b._form=c,this.trigger("beforeupload",b),e.prop("name",b.alias),b.formData.forEach(function(b){a.forEach(b,function(b,d){c.append(a.element(''))})}),c.prop({action:b.url,method:b.method,target:d.prop("name"),enctype:"multipart/form-data",encoding:"multipart/form-data"}),d.bind("load",function(){var a=d[0].contentDocument.body.innerHTML,c={response:a,status:200,dummy:!0},e=f._transformResponse(c.response);f.trigger("in:success",c,b,e),f.trigger("in:complete",c,b,e)}),c.abort=function(){var a={status:0,dummy:!0};d.unbind("load").prop("src","javascript:false;"),c.replaceWith(e),f.trigger("in:cancel",a,b),f.trigger("in:complete",a,b)},e.after(c),c.append(e).append(d),c[0].submit()},_isSuccessCode:function(a){return a>=200&&300>a||304===a},_transformResponse:function(a){return d.defaults.transformResponse.forEach(function(b){a=b(a)}),a}},g.prototype={constructor:g,remove:function(){this.uploader.removeFromQueue(this)},upload:function(){this.uploader.uploadItem(this)},cancel:function(){this.uploader.cancelItem(this)},_destroy:function(){this._form&&this._form.remove(),this._input&&this._input.remove(),delete this._form,delete this._input},_beforeupload:function(a,b){b.isReady=!0,b.isUploading=!0,b.isUploaded=!1,b.isSuccess=!1,b.isCancel=!1,b.isError=!1,b.progress=0},_progress:function(a,b,c){b.progress=c,b.uploader.trigger("progress",b,c)},_success:function(a,b,c,d){c.isReady=!1,c.isUploading=!1,c.isUploaded=!0,c.isSuccess=!0,c.isCancel=!1,c.isError=!1,c.progress=100,c.index=null,c.uploader.trigger("success",b,c,d)},_cancel:function(a,b,c){c.isReady=!1,c.isUploading=!1,c.isUploaded=!1,c.isSuccess=!1,c.isCancel=!0,c.isError=!1,c.progress=0,c.index=null,c.uploader.trigger("cancel",b,c)},_error:function(a,b,c,d){c.isReady=!1,c.isUploading=!1,c.isUploaded=!0,c.isSuccess=!1,c.isCancel=!1,c.isError=!0,c.progress=100,c.index=null,c.uploader.trigger("error",b,c,d)},_complete:function(a,b,c,d){c.uploader.trigger("complete",b,c,d),c.removeAfterUpload&&c.remove()}},{create:function(a){return new f(a)},isHTML5:f.prototype.isHTML5}}]),b}); -//# sourceMappingURL=angular-file-upload.min.map \ No newline at end of file diff --git a/example/public/angular-file-upload.min.map b/example/public/angular-file-upload.min.map deleted file mode 100644 index 142ccfd..0000000 --- a/example/public/angular-file-upload.min.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"angular-file-upload.min.js","sources":["angular-file-upload.js"],"names":["angular","factory","define","amd","app","module","directive","$fileUploader","link","isHTML5","scope","element","attributes","bind","event","dataTransfer","originalEvent","preventDefault","stopPropagation","$broadcast","$emit","files","$eval","ngFileDrop","dropEffect","noop","$on","addClass","ngFileOver","removeClass","removeAttr","this","ngFileSelect","attr","prop","$compile","$rootScope","$http","$window","Uploader","params","extend","url","alias","queue","headers","progress","autoUpload","removeAfterUpload","method","filters","formData","isUploading","_nextIndex","_timestamp","Date","now","unshift","_filter","items","options","addToQueue","Item","prototype","_beforeupload","_progress","_success","_cancel","_error","_complete","input","file","clone","uploader","value","val","lastModifiedDate","size","type","slice","lastIndexOf","toLowerCase","name","_input","css","after","isReady","isUploaded","isSuccess","isCancel","isError","index","constructor","item","isElement","handler","trigger","arguments","apply","File","FormData","length","list","forEach","isValid","every","filter","call","copy","push","_getTotalProgress","_render","uploadAll","removeFromQueue","getIndexOfItem","cancel","splice","_destroy","clearQueue","isObject","indexOf","getNotUploadedItems","getReadyItems","sort","item1","item2","uploadItem","transport","cancelItem","abort","cancelAll","$$phase","$digest","notUploaded","uploaded","ratio","current","Math","round","result","isDefined","_xhrTransport","xhr","_xhr","XMLHttpRequest","form","that","obj","key","append","upload","onprogress","lengthComputable","loaded","total","onload","response","_transformResponse","_isSuccessCode","status","onerror","onabort","open","setRequestHeader","send","_iframeTransport","iframe","_form","replaceWith","action","target","enctype","encoding","html","contentDocument","body","innerHTML","dummy","unbind","submit","defaults","transformResponse","transformFn","remove","create"],"mappings":"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"} \ No newline at end of file diff --git a/example/public/controllers.js b/example/public/controllers.js deleted file mode 100644 index 9eb16ce..0000000 --- a/example/public/controllers.js +++ /dev/null @@ -1,97 +0,0 @@ -angular.module('app', ['angularFileUpload']) - - // The example of the full functionality - .controller('TestController',function ($scope, $fileUploader) { - 'use strict'; - - // create a uploader with options - var uploader = $scope.uploader = $fileUploader.create({ - scope: $scope, // to automatically update the html. Default: $rootScope - url: '/api/containers/container1/upload', - formData: [ - { key: 'value' } - ], - filters: [ - function (item) { // first user filter - console.info('filter1'); - return true; - } - ] - }); - - // ADDING FILTERS - - uploader.filters.push(function (item) { // second user filter - console.info('filter2'); - return true; - }); - - // REGISTER HANDLERS - - uploader.bind('afteraddingfile', function (event, item) { - console.info('After adding a file', item); - }); - - uploader.bind('whenaddingfilefailed', function (event, item) { - console.info('When adding a file failed', item); - }); - - uploader.bind('afteraddingall', function (event, items) { - console.info('After adding all files', items); - }); - - uploader.bind('beforeupload', function (event, item) { - console.info('Before upload', item); - }); - - uploader.bind('progress', function (event, item, progress) { - console.info('Progress: ' + progress, item); - }); - - uploader.bind('success', function (event, xhr, item, response) { - console.info('Success', xhr, item, response); - $scope.$broadcast('uploadCompleted', item); - }); - - uploader.bind('cancel', function (event, xhr, item) { - console.info('Cancel', xhr, item); - }); - - uploader.bind('error', function (event, xhr, item, response) { - console.info('Error', xhr, item, response); - }); - - uploader.bind('complete', function (event, xhr, item, response) { - console.info('Complete', xhr, item, response); - }); - - uploader.bind('progressall', function (event, progress) { - console.info('Total progress: ' + progress); - }); - - uploader.bind('completeall', function (event, items) { - console.info('Complete all', items); - }); - - } -).controller('FilesController', function ($scope, $http) { - - $scope.load = function () { - $http.get('/api/containers/container1/files').success(function (data) { - console.log(data); - $scope.files = data; - }); - }; - - $scope.delete = function (index, id) { - $http.delete('/api/containers/container1/files/' + encodeURIComponent(id)).success(function (data, status, headers) { - $scope.files.splice(index, 1); - }); - }; - - $scope.$on('uploadCompleted', function(event) { - console.log('uploadCompleted event received'); - $scope.load(); - }); - - }); diff --git a/example/public/index.html b/example/public/index.html deleted file mode 100644 index e7ef4ad..0000000 --- a/example/public/index.html +++ /dev/null @@ -1,202 +0,0 @@ - - - - - LoopBack Storage Service Demo - - - - - - - - - - - - - - - - - - - - - - - - LoopBack - Storage Service - - - - - - - - Select files - - - - - Base drop zone - - - - - Another drop zone with its own settings - - - - - Multiple - - - Single - - - - - - Upload queue - - Queue length: {{ uploader.queue.length }} - - - - - Name - Size - Progress - Status - Actions - - - - - {{ item.file.name }} - {{ - item.file.size/1024/1024|number:2 }} MB - - - - - - - - - - - - - - - Upload - - - - Cancel - - - - Remove - - - - - - - - - Queue progress: - - - - - - - Upload all - - - Cancel - all - - - Remove all - - - - - - - - Files in the container - - - - - - - {{ - file.name }} - - - - - Remove - - - - - - - - - - - - - - - - diff --git a/example/storage/container1/f1.txt b/example/storage/container1/f1.txt deleted file mode 100644 index 1652405..0000000 --- a/example/storage/container1/f1.txt +++ /dev/null @@ -1 +0,0 @@ -Hello.... \ No newline at end of file diff --git a/example/storage/container1/f1_downloaded.txt b/example/storage/container1/f1_downloaded.txt deleted file mode 100644 index 1652405..0000000 --- a/example/storage/container1/f1_downloaded.txt +++ /dev/null @@ -1 +0,0 @@ -Hello.... \ No newline at end of file diff --git a/example/storage/container2/f2.txt b/example/storage/container2/f2.txt deleted file mode 100644 index 1652405..0000000 --- a/example/storage/container2/f2.txt +++ /dev/null @@ -1 +0,0 @@ -Hello.... \ No newline at end of file diff --git a/example/upload-amazon.js b/example/upload-amazon.js deleted file mode 100644 index 1f180a8..0000000 --- a/example/upload-amazon.js +++ /dev/null @@ -1,78 +0,0 @@ -var StorageService = require('../').StorageService; -var providers = null; -try { - providers = require('./providers-private.json'); -} catch(err) { - providers = require('./providers.json'); -} -var express = require('express'); -var app = express(); - -app.set('port', process.env.PORT || 3000); -app.set('views', __dirname + '/views'); -app.set('view engine', 'ejs'); - -var handler = new StorageService( - { - provider: 'amazon', - key: providers.amazon.key, - keyId: providers.amazon.keyId - }); - -app.get('/', function(req, res, next) { - res.setHeader('Content-Type', 'text/html'); - var form = "Storage Service Demo" + - "List all containers" + - "Upload to container con1: " + - "" - + "File to upload: " - + "Notes about the file: " - + "" + - ""; - res.send(form); - res.end(); -}); - -app.post('/upload/:container', function(req, res, next) { - handler.upload(req, res, function(err, result) { - if (!err) { - res.setHeader('Content-Type', 'application/json'); - res.status(200).send(result); - } else { - res.status(500).send(err); - } - }); -}); - -app.get('/download', function(req, res, next) { - handler.getContainers(function(err, containers) { - var html = "Containers"; - containers.forEach(function(f) { - html += "" + f.name + "" - }); - html += "Home"; - res.status(200).send(html); - }); -}); - -app.get('/download/:container', function(req, res, next) { - handler.getFiles(req.params.container, function(err, files) { - var html = "Files in container " + req.params.container + ""; - files.forEach(function(f) { - html += "" + f.container + "/" + f.name + "" - }); - html += "Home"; - res.status(200).send(html); - }); -}); - -app.get('/download/:container/:file', function(req, res, next) { - handler.download(req.params.container, req.params.file, res, function(err, result) { - if (err) { - res.status(500).send(err); - } - }); -}); - -app.listen(app.get('port')); -console.log('http://127.0.0.1:' + app.get('port')); diff --git a/example/upload.js b/example/upload.js deleted file mode 100644 index f740237..0000000 --- a/example/upload.js +++ /dev/null @@ -1,72 +0,0 @@ -var StorageService = require('../').StorageService; - -var express = require('express'); -var app = express(); - -app.set('port', process.env.PORT || 3000); -app.set('views', __dirname + '/views'); -app.set('view engine', 'ejs'); - -// Create the container -var mkdirp = require('mkdirp'); -mkdirp.sync('/tmp/storage/con1'); - -var handler = new StorageService({provider: 'filesystem', root: '/tmp/storage'}); - -app.get('/', function(req, res, next) { - res.setHeader('Content-Type', 'text/html'); - var form = "Storage Service Demo" + - "List all containers" + - "Upload to container con1: " + - "" - + "File to upload: " - + "Notes about the file: " - + "" + - ""; - res.send(form); - res.end(); -}); - -app.post('/upload/:container', function(req, res, next) { - handler.upload(req, res, function(err, result) { - if (!err) { - res.setHeader('Content-Type', 'application/json'); - res.status(200).send(result); - } else { - res.status(500).send(err); - } - }); -}); - -app.get('/download', function(req, res, next) { - handler.getContainers(function(err, containers) { - var html = "Containers"; - containers.forEach(function(f) { - html += "" + f.name + "" - }); - html += "Home"; - res.status(200).send(html); - }); -}); - -app.get('/download/:container', function(req, res, next) { - handler.getFiles(req.params.container, function(err, files) { - var html = "Files in container " + req.params.container + ""; - files.forEach(function(f) { - html += "" + f.container + "/" + f.name + "" - }); - html += "Home"; - res.status(200).send(html); - }); -}); - -app.get('/download/:container/:file', function(req, res, next) { - handler.download(req.params.container, req.params.file, res, function(err, result) { - if (err) { - res.status(500).send(err); - } - }); -}); - -app.listen(app.get('port')); -console.log('http://127.0.0.1:' + app.get('port')); diff --git a/example/app.js b/test/fixtures/app.js similarity index 100% rename from example/app.js rename to test/fixtures/app.js diff --git a/example/largeImage.jpg b/test/fixtures/largeImage.jpg similarity index 100% rename from example/largeImage.jpg rename to test/fixtures/largeImage.jpg diff --git a/example/test.jpg b/test/fixtures/test.jpg similarity index 100% rename from example/test.jpg rename to test/fixtures/test.jpg diff --git a/test/upload-download.test.js b/test/upload-download.test.js index e592994..845cff4 100644 --- a/test/upload-download.test.js +++ b/test/upload-download.test.js @@ -158,7 +158,7 @@ describe('storage service', function () { request('http://localhost:3000') .post('/containers/album1/upload') - .attach('image', path.join(__dirname, '../example/test.jpg')) + .attach('image', path.join(__dirname, './fixtures/test.jpg')) .set('Accept', 'application/json') .expect('Content-Type', /json/) .expect(200, function (err, res) { @@ -174,7 +174,7 @@ describe('storage service', function () { request('http://localhost:3000') .post('/imageContainers/album1/upload') - .attach('image', path.join(__dirname, '../example/test.jpg')) + .attach('image', path.join(__dirname, './fixtures/test.jpg')) .set('Accept', 'application/json') .expect('Content-Type', /json/) .expect(200, function (err, res) { @@ -189,7 +189,7 @@ describe('storage service', function () { request('http://localhost:3000') .post('/imageContainers/album1/upload') - .attach('image', path.join(__dirname, '../example/app.js')) + .attach('image', path.join(__dirname, './fixtures/app.js')) .set('Accept', 'application/json') .expect('Content-Type', /json/) .expect(200, function (err, res) { @@ -203,7 +203,7 @@ describe('storage service', function () { request('http://localhost:3000') .post('/imageContainers/album1/upload') - .attach('image', path.join(__dirname, '../example/largeImage.jpg')) + .attach('image', path.join(__dirname, './fixtures/largeImage.jpg')) .set('Accept', 'application/json') .expect('Content-Type', /json/) .expect(200, function (err, res) {
Queue length: {{ uploader.queue.length }}
- Queue progress: - -
" + - "Upload to container con1:
" + - "
Home