Socket
Socket
Sign inDemoInstall

ng-file-upload

Package Overview
Dependencies
Maintainers
1
Versions
169
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

ng-file-upload - npm Package Compare versions

Comparing version 3.1.2 to 3.2.0

demo/war/.idea/.name

1072

demo/war/js/angular-file-upload-all.js
/**!
* AngularJS file upload/drop directive and service with progress and abort
* @author Danial <danial.farid@gmail.com>
* @version 3.1.2
* @version 3.2.0
*/
(function() {
(function () {
var key, i;
function patchXHR(fnName, newFn) {
window.XMLHttpRequest.prototype[fnName] = newFn(window.XMLHttpRequest.prototype[fnName]);
window.XMLHttpRequest.prototype[fnName] = newFn(window.XMLHttpRequest.prototype[fnName]);
}
if (window.XMLHttpRequest && !window.XMLHttpRequest.__isFileAPIShim) {
patchXHR('setRequestHeader', function(orig) {
return function(header, value) {
if (header === '__setXHR_') {
var val = value(this);
// fix for angular < 1.2.0
if (val instanceof Function) {
val(this);
}
} else {
orig.apply(this, arguments);
}
}
});
patchXHR('setRequestHeader', function (orig) {
return function (header, value) {
if (header === '__setXHR_') {
var val = value(this);
// fix for angular < 1.2.0
if (val instanceof Function) {
val(this);
}
} else {
orig.apply(this, arguments);
}
}
});
}
var angularFileUpload = angular.module('angularFileUpload', []);
angularFileUpload.version = '3.1.2';
angularFileUpload.service('$upload', ['$http', '$q', '$timeout', function($http, $q, $timeout) {
function sendHttp(config) {
config.method = config.method || 'POST';
config.headers = config.headers || {};
config.transformRequest = config.transformRequest || function(data, headersGetter) {
if (window.ArrayBuffer && data instanceof window.ArrayBuffer) {
return data;
}
return $http.defaults.transformRequest[0](data, headersGetter);
};
var deferred = $q.defer();
var promise = deferred.promise;
angularFileUpload.version = '3.2.0';
angularFileUpload.service('$upload', ['$http', '$q', '$timeout', function ($http, $q, $timeout) {
function sendHttp(config) {
config.method = config.method || 'POST';
config.headers = config.headers || {};
config.transformRequest = config.transformRequest || function (data, headersGetter) {
if (window.ArrayBuffer && data instanceof window.ArrayBuffer) {
return data;
}
return $http.defaults.transformRequest[0](data, headersGetter);
};
var deferred = $q.defer();
var promise = deferred.promise;
config.headers['__setXHR_'] = function() {
return function(xhr) {
if (!xhr) return;
config.__XHR = xhr;
config.xhrFn && config.xhrFn(xhr);
xhr.upload.addEventListener('progress', function(e) {
e.config = config;
deferred.notify ? deferred.notify(e) : promise.progress_fn && $timeout(function(){promise.progress_fn(e)});
}, false);
//fix for firefox not firing upload progress end, also IE8-9
xhr.upload.addEventListener('load', function(e) {
if (e.lengthComputable) {
e.config = config;
deferred.notify ? deferred.notify(e) : promise.progress_fn && $timeout(function(){promise.progress_fn(e)});
}
}, false);
};
};
config.headers['__setXHR_'] = function () {
return function (xhr) {
if (!xhr) return;
config.__XHR = xhr;
config.xhrFn && config.xhrFn(xhr);
xhr.upload.addEventListener('progress', function (e) {
e.config = config;
deferred.notify ? deferred.notify(e) : promise.progress_fn && $timeout(function () {
promise.progress_fn(e)
});
}, false);
//fix for firefox not firing upload progress end, also IE8-9
xhr.upload.addEventListener('load', function (e) {
if (e.lengthComputable) {
e.config = config;
deferred.notify ? deferred.notify(e) : promise.progress_fn && $timeout(function () {
promise.progress_fn(e)
});
}
}, false);
};
};
$http(config).then(function(r){deferred.resolve(r)}, function(e){deferred.reject(e)}, function(n){deferred.notify(n)});
promise.success = function(fn) {
promise.then(function(response) {
fn(response.data, response.status, response.headers, config);
});
return promise;
};
$http(config).then(function (r) {
deferred.resolve(r)
}, function (e) {
deferred.reject(e)
}, function (n) {
deferred.notify(n)
});
promise.error = function(fn) {
promise.then(null, function(response) {
fn(response.data, response.status, response.headers, config);
});
return promise;
};
promise.success = function (fn) {
promise.then(function (response) {
fn(response.data, response.status, response.headers, config);
});
return promise;
};
promise.progress = function(fn) {
promise.progress_fn = fn;
promise.then(null, null, function(update) {
fn(update);
});
return promise;
};
promise.abort = function() {
if (config.__XHR) {
$timeout(function() {
config.__XHR.abort();
});
}
return promise;
};
promise.xhr = function(fn) {
config.xhrFn = (function(origXhrFn) {
return function() {
origXhrFn && origXhrFn.apply(promise, arguments);
fn.apply(promise, arguments);
}
})(config.xhrFn);
return promise;
};
return promise;
}
promise.error = function (fn) {
promise.then(null, function (response) {
fn(response.data, response.status, response.headers, config);
});
return promise;
};
this.upload = function(config) {
config.headers = config.headers || {};
config.headers['Content-Type'] = undefined;
var origTransformRequest = config.transformRequest;
config.transformRequest = config.transformRequest ?
(Object.prototype.toString.call(config.transformRequest) === '[object Array]' ?
config.transformRequest : [config.transformRequest]) : [];
config.transformRequest.push(function(data, headerGetter) {
var formData = new FormData();
var allFields = {};
for (var key in config.fields) allFields[key] = config.fields[key];
if (data) allFields['data'] = data;
if (config.formDataAppender) {
for (var key in allFields) {
config.formDataAppender(formData, key, allFields[key]);
}
} else {
for (var key in allFields) {
var val = allFields[key];
if (val !== undefined) {
if (Object.prototype.toString.call(val) === '[object String]') {
formData.append(key, val);
} else {
if (config.sendObjectsAsJsonBlob && typeof val === 'object') {
formData.append(key, new Blob([val], { type: 'application/json' }));
} else {
formData.append(key, JSON.stringify(val));
}
}
}
}
}
promise.progress = function (fn) {
promise.progress_fn = fn;
promise.then(null, null, function (update) {
fn(update);
});
return promise;
};
promise.abort = function () {
if (config.__XHR) {
$timeout(function () {
config.__XHR.abort();
});
}
return promise;
};
promise.xhr = function (fn) {
config.xhrFn = (function (origXhrFn) {
return function () {
origXhrFn && origXhrFn.apply(promise, arguments);
fn.apply(promise, arguments);
}
})(config.xhrFn);
return promise;
};
if (config.file != null) {
var fileFormName = config.fileFormDataName || 'file';
return promise;
}
if (Object.prototype.toString.call(config.file) === '[object Array]') {
var isFileFormNameString = Object.prototype.toString.call(fileFormName) === '[object String]';
for (var i = 0; i < config.file.length; i++) {
formData.append(isFileFormNameString ? fileFormName : fileFormName[i], config.file[i],
(config.fileName && config.fileName[i]) || config.file[i].name);
}
} else {
formData.append(fileFormName, config.file, config.fileName || config.file.name);
}
}
return formData;
});
this.upload = function (config) {
config.headers = config.headers || {};
config.headers['Content-Type'] = undefined;
config.transformRequest = config.transformRequest ?
(Object.prototype.toString.call(config.transformRequest) === '[object Array]' ?
config.transformRequest : [config.transformRequest]) : [];
config.transformRequest.push(function (data) {
var formData = new FormData();
var allFields = {};
for (key in config.fields) {
if (config.fields.hasOwnProperty(key)) {
allFields[key] = config.fields[key];
}
}
if (data) allFields['data'] = data;
return sendHttp(config);
};
if (config.formDataAppender) {
for (key in allFields) {
if (allFields.hasOwnProperty(key)) {
config.formDataAppender(formData, key, allFields[key]);
}
}
} else {
for (key in allFields) {
if (allFields.hasOwnProperty(key)) {
var val = allFields[key];
if (val !== undefined) {
if (Object.prototype.toString.call(val) === '[object String]') {
formData.append(key, val);
} else {
if (config.sendObjectsAsJsonBlob && typeof val === 'object') {
formData.append(key, new Blob([val], {type: 'application/json'}));
} else {
formData.append(key, JSON.stringify(val));
}
}
this.http = function(config) {
return sendHttp(config);
};
}
}
}
}
if (config.file != null) {
var fileFormName = config.fileFormDataName || 'file';
if (Object.prototype.toString.call(config.file) === '[object Array]') {
var isFileFormNameString = Object.prototype.toString.call(fileFormName) === '[object String]';
for (i = 0; i < config.file.length; i++) {
formData.append(isFileFormNameString ? fileFormName : fileFormName[i], config.file[i],
(config.fileName && config.fileName[i]) || config.file[i].name);
}
} else {
formData.append(fileFormName, config.file, config.fileName || config.file.name);
}
}
return formData;
});
return sendHttp(config);
};
this.http = function (config) {
return sendHttp(config);
};
}]);
angularFileUpload.directive('ngFileSelect', [ '$parse', '$timeout', '$compile',
function($parse, $timeout, $compile) { return {
restrict: 'AEC',
require:'?ngModel',
link: function(scope, elem, attr, ngModel) {
handleFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile);
}
}}]);
angularFileUpload.directive('ngFileSelect', ['$parse', '$timeout', '$compile',
function ($parse, $timeout, $compile) {
return {
restrict: 'AEC',
require: '?ngModel',
link: function (scope, elem, attr, ngModel) {
linkFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile);
}
}
}]);
function handleFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile) {
function isInputTypeFile() {
return elem[0].tagName.toLowerCase() === 'input' && elem.attr('type') && elem.attr('type').toLowerCase() === 'file';
}
var watchers = [];
function linkFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile) {
function isInputTypeFile() {
return elem[0].tagName.toLowerCase() === 'input' && elem.attr('type') && elem.attr('type').toLowerCase() === 'file';
}
function watchForRecompile(attrVal) {
$timeout(function() {
if (elem.parent().length) {
watchers.push(scope.$watch(attrVal, function(val, oldVal) {
if (val != oldVal) {
recompileElem();
}
}));
}
});
}
function bindAttrToFileInput(fileElem) {
if (attr.ngMultiple) fileElem.attr('multiple', $parse(attr.ngMultiple)(scope));
if (attr.ngSelectAccept) fileElem.attr('accept', $parse(attr.ngSelectAccept)(scope));
if (attr.ngCapture) fileElem.attr('capture', $parse(attr.ngCapture)(scope));
if (attr.ngDisabled) fileElem.attr('disabled', $parse(attr.ngDisabled)(scope));
function recompileElem() {
var clone = elem.clone();
if (elem.attr('__afu_gen__')) {
angular.element(document.getElementById(elem.attr('id').substring(1))).remove();
}
if (elem.parent().length) {
for (var i = 0; i < watchers.length; i++) {
watchers[i]();
}
elem.replaceWith(clone);
$compile(clone)(scope);
}
return clone;
}
function bindAttr(bindAttr, attrName) {
if (bindAttr) {
watchForRecompile(bindAttr);
var val = $parse(bindAttr)(scope);
if (val) {
elem.attr(attrName, val);
attr[attrName] = val;
} else {
elem.attr(attrName, null);
delete attr[attrName];
}
}
}
bindAttr(attr.ngMultiple, 'multiple');
bindAttr(attr.ngAccept, 'ng-accept');
bindAttr(attr.ngCapture, 'capture');
if (attr['ngFileSelect'] != '') {
attr.ngFileChange = attr.ngFileSelect;
}
function onChangeFn(evt) {
var files = [], fileList, i;
fileList = evt.__files_ || (evt.target && evt.target.files);
updateModel(fileList, attr, ngModel, scope, evt);
};
var fileElem = elem;
if (!isInputTypeFile()) {
fileElem = angular.element('<input type="file">')
if (elem.attr('multiple')) fileElem.attr('multiple', elem.attr('multiple'));
if (elem.attr('accept')) fileElem.attr('accept', elem.attr('accept'));
if (elem.attr('capture')) fileElem.attr('capture', elem.attr('capture'));
for (var key in attr) {
if (key.indexOf('inputFile') == 0) {
var name = key.substring('inputFile'.length);
name = name[0].toLowerCase() + name.substring(1);
fileElem.attr(name, attr[key]);
}
}
var isUpdating = false;
fileElem.bind('change', function(evt) {
if (!isUpdating) {
isUpdating = true;
try {
var fileList = evt.__files_ || (evt.target && evt.target.files);
var files = [], rejFiles = [];
fileElem.css('width', '0px').css('height', '0px').css('position', 'absolute').css('padding', 0).css('margin', 0)
.css('overflow', 'hidden').attr('tabindex', '-1').css('opacity', 0).attr('__afu_gen__', true);
elem.attr('__refElem__', true);
fileElem[0].__refElem__ = elem[0];
elem.parent()[0].insertBefore(fileElem[0], elem[0])
elem.css('overflow', 'hidden');
elem.bind('click', function(e) {
if (!resetAndClick(e)) {
fileElem[0].click();
}
});
} else {
elem.bind('click', resetAndClick);
}
function resetAndClick(evt) {
if (fileElem[0].value != null && fileElem[0].value != '') {
fileElem[0].value = null;
// IE 11 already fires change event when you set the value to null
if (navigator.userAgent.indexOf("Trident/7") === -1) {
onChangeFn({target: {files: []}});
}
}
// if this is manual click trigger we don't need to reset again
if (!elem.attr('__afu_clone__')) {
// fix for IE10 cannot set the value of the input to null programmatically by cloning and replacing input
// IE 11 setting the value to null event will be fired after file change clearing the selected file so
// we just recreate the element for IE 11 as well
if (navigator.appVersion.indexOf("MSIE 10") !== -1 || navigator.userAgent.indexOf("Trident/7") !== -1) {
var clone = recompileElem();
clone.attr('__afu_clone__', true);
clone[0].click();
evt.preventDefault();
evt.stopPropagation();
return true;
}
} else {
elem.attr('__afu_clone__', null);
}
}
fileElem.bind('change', onChangeFn);
elem.on('$destroy', function() {
for (var i = 0; i < watchers.length; i++) {
watchers[i]();
}
if (elem[0] != fileElem[0]) fileElem.remove();
});
watchers.push(scope.$watch(attr.ngModel, function(val, oldVal) {
if (val != oldVal && (val == null || !val.length)) {
if (navigator.appVersion.indexOf("MSIE 10") !== -1) {
recompileElem();
} else {
fileElem[0].value = null;
}
}
}));
function updateModel(fileList, attr, ngModel, scope, evt) {
var files = [], rejFiles = [];
var accept = $parse(attr.ngAccept)(scope);
var regexp = angular.isString(accept) && accept ? new RegExp(globStringToRegex(accept), 'gi') : null;
var acceptFn = regexp ? null : attr.ngAccept;
var accept = $parse(attr.ngAccept);
for (i = 0; i < fileList.length; i++) {
var file = fileList.item(i);
if (isAccepted(scope, accept, file, evt)) {
files.push(file);
} else {
rejFiles.push(file);
}
}
console.log('change' + files);
updateModel($parse, $timeout, scope, ngModel, attr,
attr.ngFileChange || attr.ngFileSelect, files, rejFiles, evt);
if (files.length == 0) fileElem[0].value = files;
if (fileElem.attr('__afu_gen__')) {
fileElem.remove();
}
} finally {
isUpdating = false;
}
}
});
}
for (var i = 0; i < fileList.length; i++) {
var file = fileList.item(i);
if ((!regexp || file.type.match(regexp) || (file.name != null && file.name.match(regexp))) &&
(!acceptFn || $parse(acceptFn)(scope, {$file: file, $event: evt}))) {
files.push(file);
} else {
rejFiles.push(file);
}
}
$timeout(function() {
if (ngModel) {
$parse(attr.ngModel).assign(scope, files);
ngModel && ngModel.$setViewValue(files != null && files.length == 0 ? '' : files);
if (attr.ngModelRejected) {
$parse(attr.ngModelRejected).assign(scope, rejFiles);
}
}
if (attr.ngFileChange && attr.ngFileChange != "") {
$parse(attr.ngFileChange)(scope, {
$files: files,
$rejectedFiles: rejFiles,
$event: evt
});
}
});
}
function clickHandler(evt) {
createAndClickFileInput(evt);
if (isInputTypeFile()) {
evt.preventDefault()
}
}
elem.bind('click', clickHandler);
function createAndClickFileInput(evt) {
if (elem.attr('disabled')) {
return;
}
fileElem = angular.element('<input type="file">');
for (var i = 0; i < elem[0].attributes.length; i++) {
var attribute = elem[0].attributes[i];
fileElem.attr(attribute.name, attribute.value);
}
if (isInputTypeFile()) {
elem.replaceWith(fileElem);
elem = fileElem;
} else {
fileElem.css('width', '0px').css('height', '0px').css('position', 'absolute').css('padding', 0).css('margin', 0)
.css('overflow', 'hidden').attr('tabindex', '-1').css('opacity', 0).attr('__afu_gen__', true);
elem.attr('__refElem__', true);
fileElem[0].__refElem__ = elem[0];
elem.parent()[0].insertBefore(fileElem[0], elem[0]);
elem.css('overflow', 'hidden');
}
bindAttrToFileInput(fileElem);
updateModel($parse, $timeout, scope, ngModel, attr,
attr.ngFileChange || attr.ngFileSelect, [], [], evt, true);
fileElem[0].click();
if (isInputTypeFile()) {
elem.bind('click', clickHandler);
}
}
}
angularFileUpload.directive('ngFileDrop', [ '$parse', '$timeout', '$location', function($parse, $timeout, $location) { return {
restrict: 'AEC',
require:'?ngModel',
link: function(scope, elem, attr, ngModel) {
handleDrop(scope, elem, attr, ngModel, $parse, $timeout, $location);
}
}}]);
angularFileUpload.directive('ngFileDrop', ['$parse', '$timeout', '$location', function ($parse, $timeout, $location) {
return {
restrict: 'AEC',
require: '?ngModel',
link: function (scope, elem, attr, ngModel) {
linkDrop(scope, elem, attr, ngModel, $parse, $timeout, $location);
}
}
}]);
angularFileUpload.directive('ngNoFileDrop', function() {
return function(scope, elem, attr) {
if (dropAvailable()) elem.css('display', 'none')
}
angularFileUpload.directive('ngNoFileDrop', function () {
return function (scope, elem) {
if (dropAvailable()) elem.css('display', 'none')
}
});
//for backward compatibility
angularFileUpload.directive('ngFileDropAvailable', [ '$parse', '$timeout', function($parse, $timeout) {
return function(scope, elem, attr) {
if (dropAvailable()) {
var fn = $parse(attr['ngFileDropAvailable']);
$timeout(function() {
fn(scope);
});
}
}
angularFileUpload.directive('ngFileDropAvailable', ['$parse', '$timeout', function ($parse, $timeout) {
return function (scope, elem, attr) {
if (dropAvailable()) {
var fn = $parse(attr['ngFileDropAvailable']);
$timeout(function () {
fn(scope);
});
}
}
}]);
function handleDrop(scope, elem, attr, ngModel, $parse, $timeout, $location) {
var available = dropAvailable();
if (attr['dropAvailable']) {
$timeout(function() {
scope.dropAvailable ? scope.dropAvailable.value = available : scope.dropAvailable = available;
});
}
if (!available) {
if ($parse(attr.hideOnDropNotAvailable)(scope) != false) {
elem.css('display', 'none');
}
return;
}
var leaveTimeout = null;
var stopPropagation = $parse(attr.stopPropagation)(scope);
var dragOverDelay = 1;
var accept = $parse(attr.ngAccept)(scope) || attr.accept;
var regexp = angular.isString(accept) && accept ? new RegExp(globStringToRegex(accept), 'gi') : null;
var acceptFn = regexp ? null : attr.ngAccept;
var actualDragOverClass;
elem[0].addEventListener('dragover', function(evt) {
evt.preventDefault();
if (stopPropagation) evt.stopPropagation();
// handling dragover events from the Chrome download bar
if (navigator.userAgent.indexOf("Chrome") > -1) {
var b = evt.dataTransfer.effectAllowed;
evt.dataTransfer.dropEffect = ('move' === b || 'linkMove' === b) ? 'move' : 'copy';
}
$timeout.cancel(leaveTimeout);
if (!scope.actualDragOverClass) {
actualDragOverClass = calculateDragOverClass(scope, attr, evt);
}
elem.addClass(actualDragOverClass);
}, false);
elem[0].addEventListener('dragenter', function(evt) {
evt.preventDefault();
if (stopPropagation) evt.stopPropagation();
}, false);
elem[0].addEventListener('dragleave', function(evt) {
leaveTimeout = $timeout(function() {
elem.removeClass(actualDragOverClass);
actualDragOverClass = null;
}, dragOverDelay || 1);
}, false);
if (attr['ngFileDrop'] != '') {
attr.ngFileChange = scope.ngFileDrop;
}
elem[0].addEventListener('drop', function(evt) {
evt.preventDefault();
if (stopPropagation) evt.stopPropagation();
elem.removeClass(actualDragOverClass);
actualDragOverClass = null;
extractFiles(evt, function(files, rejFiles) {
$timeout(function() {
if (ngModel) {
$parse(attr.ngModel).assign(scope, files);
ngModel && ngModel.$setViewValue(files != null && files.length == 0 ? '' : files);
}
if (attr['ngModelRejected']) {
if (scope[attr.ngModelRejected]) {
$parse(attr.ngModelRejected).assign(scope, rejFiles);
}
}
});
$timeout(function() {
$parse(attr.ngFileChange)(scope, {
$files: files,
$rejectedFiles: rejFiles,
$event: evt
});
});
}, $parse(attr.allowDir)(scope) != false, attr.multiple || $parse(attr.ngMultiple)(scope));
}, false);
function calculateDragOverClass(scope, attr, evt) {
var valid = true;
if (regexp || acceptFn) {
var items = evt.dataTransfer.items;
if (items != null) {
for (var i = 0 ; i < items.length && valid; i++) {
valid = valid && (items[i].kind == 'file' || items[i].kind == '') &&
((acceptFn && $parse(acceptFn)(scope, {$file: items[i], $event: evt})) ||
(regexp && (items[i].type != null && items[i].type.match(regexp)) ||
(items[i].name != null && items[i].name.match(regexp))));
}
}
}
var clazz = $parse(attr.dragOverClass)(scope, {$event : evt});
if (clazz) {
if (clazz.delay) dragOverDelay = clazz.delay;
if (clazz.accept) clazz = valid ? clazz.accept : clazz.reject;
}
return clazz || attr['dragOverClass'] || 'dragover';
}
function extractFiles(evt, callback, allowDir, multiple) {
var files = [], rejFiles = [], items = evt.dataTransfer.items, processing = 0;
function addFile(file) {
if ((!regexp || file.type.match(regexp) || (file.name != null && file.name.match(regexp))) &&
(!acceptFn || $parse(acceptFn)(scope, {$file: file, $event: evt}))) {
files.push(file);
} else {
rejFiles.push(file);
}
}
if (items && items.length > 0 && $location.protocol() != 'file') {
for (var i = 0; i < items.length; i++) {
if (items[i].webkitGetAsEntry && items[i].webkitGetAsEntry() && items[i].webkitGetAsEntry().isDirectory) {
var entry = items[i].webkitGetAsEntry();
if (entry.isDirectory && !allowDir) {
continue;
}
if (entry != null) {
traverseFileTree(files, entry);
}
} else {
var f = items[i].getAsFile();
if (f != null) addFile(f);
}
if (!multiple && files.length > 0) break;
}
} else {
var fileList = evt.dataTransfer.files;
if (fileList != null) {
for (var i = 0; i < fileList.length; i++) {
addFile(fileList.item(i));
if (!multiple && files.length > 0) break;
}
}
}
var delays = 0;
(function waitForProcess(delay) {
$timeout(function() {
if (!processing) {
if (!multiple && files.length > 1) {
var i = 0;
while (files[i].type == 'directory') i++;
files = [files[i]];
}
callback(files, rejFiles);
} else {
if (delays++ * 10 < 20 * 1000) {
waitForProcess(10);
}
}
}, delay || 0)
})();
function traverseFileTree(files, entry, path) {
if (entry != null) {
if (entry.isDirectory) {
var filePath = (path || '') + entry.name;
addFile({name: entry.name, type: 'directory', path: filePath});
var dirReader = entry.createReader();
var entries = [];
processing++;
var readEntries = function() {
dirReader.readEntries(function(results) {
try {
if (!results.length) {
for (var i = 0; i < entries.length; i++) {
traverseFileTree(files, entries[i], (path ? path : '') + entry.name + '/');
}
processing--;
} else {
entries = entries.concat(Array.prototype.slice.call(results || [], 0));
readEntries();
}
} catch (e) {
processing--;
console.error(e);
}
}, function() {
processing--;
});
};
readEntries();
} else {
processing++;
entry.file(function(file) {
try {
processing--;
file.path = (path ? path : '') + file.name;
addFile(file);
} catch (e) {
processing--;
console.error(e);
}
}, function(e) {
processing--;
});
}
}
}
}
function linkDrop(scope, elem, attr, ngModel, $parse, $timeout, $location) {
var available = dropAvailable();
if (attr['dropAvailable']) {
$timeout(function () {
scope.dropAvailable ? scope.dropAvailable.value = available : scope.dropAvailable = available;
});
}
if (!available) {
if ($parse(attr.hideOnDropNotAvailable)(scope) != false) {
elem.css('display', 'none');
}
return;
}
var leaveTimeout = null;
var stopPropagation = $parse(attr.stopPropagation);
var dragOverDelay = 1;
var accept = $parse(attr.ngAccept);
var disabled = $parse(attr.ngDisabled);
var actualDragOverClass;
elem[0].addEventListener('dragover', function (evt) {
if (disabled(scope)) return;
evt.preventDefault();
if (stopPropagation(scope)) evt.stopPropagation();
// handling dragover events from the Chrome download bar
if (navigator.userAgent.indexOf("Chrome") > -1) {
var b = evt.dataTransfer.effectAllowed;
evt.dataTransfer.dropEffect = ('move' === b || 'linkMove' === b) ? 'move' : 'copy';
}
$timeout.cancel(leaveTimeout);
if (!scope.actualDragOverClass) {
actualDragOverClass = calculateDragOverClass(scope, attr, evt);
}
elem.addClass(actualDragOverClass);
}, false);
elem[0].addEventListener('dragenter', function (evt) {
if (disabled(scope)) return;
evt.preventDefault();
if (stopPropagation(scope)) evt.stopPropagation();
}, false);
elem[0].addEventListener('dragleave', function () {
if (disabled(scope)) return;
leaveTimeout = $timeout(function () {
elem.removeClass(actualDragOverClass);
actualDragOverClass = null;
}, dragOverDelay || 1);
}, false);
elem[0].addEventListener('drop', function (evt) {
if (disabled(scope)) return;
evt.preventDefault();
if (stopPropagation(scope)) evt.stopPropagation();
elem.removeClass(actualDragOverClass);
actualDragOverClass = null;
extractFiles(evt, function (files, rejFiles) {
updateModel($parse, $timeout, scope, ngModel, attr,
attr.ngFileChange || attr.ngFileDrop, files, rejFiles, evt)
}, $parse(attr.allowDir)(scope) != false, attr.multiple || $parse(attr.ngMultiple)(scope));
}, false);
function calculateDragOverClass(scope, attr, evt) {
var accepted = true;
var items = evt.dataTransfer.items;
if (items != null) {
for (i = 0; i < items.length && accepted; i++) {
accepted = accepted
&& (items[i].kind == 'file' || items[i].kind == '')
&& isAccepted(scope, accept, items[i], evt);
}
}
var clazz = $parse(attr.dragOverClass)(scope, {$event: evt});
if (clazz) {
if (clazz.delay) dragOverDelay = clazz.delay;
if (clazz.accept) clazz = accepted ? clazz.accept : clazz.reject;
}
return clazz || attr['dragOverClass'] || 'dragover';
}
function extractFiles(evt, callback, allowDir, multiple) {
var files = [], rejFiles = [], items = evt.dataTransfer.items, processing = 0;
function addFile(file) {
if (isAccepted(scope, accept, file, evt)) {
files.push(file);
} else {
rejFiles.push(file);
}
}
if (items && items.length > 0 && $location.protocol() != 'file') {
for (i = 0; i < items.length; i++) {
if (items[i].webkitGetAsEntry && items[i].webkitGetAsEntry() && items[i].webkitGetAsEntry().isDirectory) {
var entry = items[i].webkitGetAsEntry();
if (entry.isDirectory && !allowDir) {
continue;
}
if (entry != null) {
traverseFileTree(files, entry);
}
} else {
var f = items[i].getAsFile();
if (f != null) addFile(f);
}
if (!multiple && files.length > 0) break;
}
} else {
var fileList = evt.dataTransfer.files;
if (fileList != null) {
for (i = 0; i < fileList.length; i++) {
addFile(fileList.item(i));
if (!multiple && files.length > 0) break;
}
}
}
var delays = 0;
(function waitForProcess(delay) {
$timeout(function () {
if (!processing) {
if (!multiple && files.length > 1) {
i = 0;
while (files[i].type == 'directory') i++;
files = [files[i]];
}
callback(files, rejFiles);
} else {
if (delays++ * 10 < 20 * 1000) {
waitForProcess(10);
}
}
}, delay || 0)
})();
function traverseFileTree(files, entry, path) {
if (entry != null) {
if (entry.isDirectory) {
var filePath = (path || '') + entry.name;
addFile({name: entry.name, type: 'directory', path: filePath});
var dirReader = entry.createReader();
var entries = [];
processing++;
var readEntries = function () {
dirReader.readEntries(function (results) {
try {
if (!results.length) {
for (i = 0; i < entries.length; i++) {
traverseFileTree(files, entries[i], (path ? path : '') + entry.name + '/');
}
processing--;
} else {
entries = entries.concat(Array.prototype.slice.call(results || [], 0));
readEntries();
}
} catch (e) {
processing--;
console.error(e);
}
}, function () {
processing--;
});
};
readEntries();
} else {
processing++;
entry.file(function (file) {
try {
processing--;
file.path = (path ? path : '') + file.name;
addFile(file);
} catch (e) {
processing--;
console.error(e);
}
}, function () {
processing--;
});
}
}
}
}
}

@@ -574,22 +495,65 @@

function updateModel($parse, $timeout, scope, ngModel, attr, fileChange, files, rejFiles, evt, noDelay) {
console.log('aa ' + files);
function update() {
if (ngModel) {
$parse(attr.ngModel).assign(scope, files);
$timeout(function () {
ngModel && ngModel.$setViewValue(files != null && files.length == 0 ? null : files);
});
}
if (attr.ngModelRejected) {
$parse(attr.ngModelRejected).assign(scope, rejFiles);
}
if (fileChange) {
$parse(fileChange)(scope, {
$files: files,
$rejectedFiles: rejFiles,
$event: evt
});
}
}
if (noDelay) {
update();
} else {
$timeout(function () {
update();
});
}
}
function isAccepted(scope, accept, file, evt) {
var val = accept(scope, {$file: file, $event: evt});
if (val == null) {
return true;
}
if (angular.isString(val)) {
var regexp = new RegExp(globStringToRegex(val), 'gi')
val = (file.type != null && file.type.match(regexp)) ||
(file.name != null && file.name.match(regexp));
}
return val;
}
function globStringToRegex(str) {
if (str.length > 2 && str[0] === '/' && str[str.length -1] === '/') {
return str.substring(1, str.length - 1);
}
var split = str.split(','), result = '';
if (split.length > 1) {
for (var i = 0; i < split.length; i++) {
result += '(' + globStringToRegex(split[i]) + ')';
if (i < split.length - 1) {
result += '|'
}
}
} else {
if (str.indexOf('.') == 0) {
str= '*' + str;
}
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$';
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.');
}
return result;
if (str.length > 2 && str[0] === '/' && str[str.length - 1] === '/') {
return str.substring(1, str.length - 1);
}
var split = str.split(','), result = '';
if (split.length > 1) {
for (i = 0; i < split.length; i++) {
result += '(' + globStringToRegex(split[i]) + ')';
if (i < split.length - 1) {
result += '|'
}
}
} else {
if (str.indexOf('.') == 0) {
str = '*' + str;
}
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$';
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.');
}
return result;
}

@@ -599,4 +563,6 @@

for (var key in angularFileUpload) {
ngFileUpload[key] = angularFileUpload[key];
for (key in angularFileUpload) {
if (angularFileUpload.hasOwnProperty(key)) {
ngFileUpload[key] = angularFileUpload[key];
}
}

@@ -610,3 +576,3 @@

* @author Danial <danial.farid@gmail.com>
* @version 3.1.2
* @version 3.2.0
*/

@@ -613,0 +579,0 @@

@@ -6,563 +6,484 @@ /**!

*/
(function() {
(function () {
var key, i;
function patchXHR(fnName, newFn) {
window.XMLHttpRequest.prototype[fnName] = newFn(window.XMLHttpRequest.prototype[fnName]);
window.XMLHttpRequest.prototype[fnName] = newFn(window.XMLHttpRequest.prototype[fnName]);
}
if (window.XMLHttpRequest && !window.XMLHttpRequest.__isFileAPIShim) {
patchXHR('setRequestHeader', function(orig) {
return function(header, value) {
if (header === '__setXHR_') {
var val = value(this);
// fix for angular < 1.2.0
if (val instanceof Function) {
val(this);
}
} else {
orig.apply(this, arguments);
}
}
});
patchXHR('setRequestHeader', function (orig) {
return function (header, value) {
if (header === '__setXHR_') {
var val = value(this);
// fix for angular < 1.2.0
if (val instanceof Function) {
val(this);
}
} else {
orig.apply(this, arguments);
}
}
});
}
var angularFileUpload = angular.module('angularFileUpload', []);
angularFileUpload.version = '<%= pkg.version %>';
angularFileUpload.service('$upload', ['$http', '$q', '$timeout', function($http, $q, $timeout) {
function sendHttp(config) {
config.method = config.method || 'POST';
config.headers = config.headers || {};
config.transformRequest = config.transformRequest || function(data, headersGetter) {
if (window.ArrayBuffer && data instanceof window.ArrayBuffer) {
return data;
}
return $http.defaults.transformRequest[0](data, headersGetter);
};
var deferred = $q.defer();
var promise = deferred.promise;
angularFileUpload.service('$upload', ['$http', '$q', '$timeout', function ($http, $q, $timeout) {
function sendHttp(config) {
config.method = config.method || 'POST';
config.headers = config.headers || {};
config.transformRequest = config.transformRequest || function (data, headersGetter) {
if (window.ArrayBuffer && data instanceof window.ArrayBuffer) {
return data;
}
return $http.defaults.transformRequest[0](data, headersGetter);
};
var deferred = $q.defer();
var promise = deferred.promise;
config.headers['__setXHR_'] = function() {
return function(xhr) {
if (!xhr) return;
config.__XHR = xhr;
config.xhrFn && config.xhrFn(xhr);
xhr.upload.addEventListener('progress', function(e) {
e.config = config;
deferred.notify ? deferred.notify(e) : promise.progress_fn && $timeout(function(){promise.progress_fn(e)});
}, false);
//fix for firefox not firing upload progress end, also IE8-9
xhr.upload.addEventListener('load', function(e) {
if (e.lengthComputable) {
e.config = config;
deferred.notify ? deferred.notify(e) : promise.progress_fn && $timeout(function(){promise.progress_fn(e)});
}
}, false);
};
};
config.headers['__setXHR_'] = function () {
return function (xhr) {
if (!xhr) return;
config.__XHR = xhr;
config.xhrFn && config.xhrFn(xhr);
xhr.upload.addEventListener('progress', function (e) {
e.config = config;
deferred.notify ? deferred.notify(e) : promise.progress_fn && $timeout(function () {
promise.progress_fn(e)
});
}, false);
//fix for firefox not firing upload progress end, also IE8-9
xhr.upload.addEventListener('load', function (e) {
if (e.lengthComputable) {
e.config = config;
deferred.notify ? deferred.notify(e) : promise.progress_fn && $timeout(function () {
promise.progress_fn(e)
});
}
}, false);
};
};
$http(config).then(function(r){deferred.resolve(r)}, function(e){deferred.reject(e)}, function(n){deferred.notify(n)});
promise.success = function(fn) {
promise.then(function(response) {
fn(response.data, response.status, response.headers, config);
});
return promise;
};
$http(config).then(function (r) {
deferred.resolve(r)
}, function (e) {
deferred.reject(e)
}, function (n) {
deferred.notify(n)
});
promise.error = function(fn) {
promise.then(null, function(response) {
fn(response.data, response.status, response.headers, config);
});
return promise;
};
promise.success = function (fn) {
promise.then(function (response) {
fn(response.data, response.status, response.headers, config);
});
return promise;
};
promise.progress = function(fn) {
promise.progress_fn = fn;
promise.then(null, null, function(update) {
fn(update);
});
return promise;
};
promise.abort = function() {
if (config.__XHR) {
$timeout(function() {
config.__XHR.abort();
});
}
return promise;
};
promise.xhr = function(fn) {
config.xhrFn = (function(origXhrFn) {
return function() {
origXhrFn && origXhrFn.apply(promise, arguments);
fn.apply(promise, arguments);
}
})(config.xhrFn);
return promise;
};
return promise;
}
promise.error = function (fn) {
promise.then(null, function (response) {
fn(response.data, response.status, response.headers, config);
});
return promise;
};
this.upload = function(config) {
config.headers = config.headers || {};
config.headers['Content-Type'] = undefined;
var origTransformRequest = config.transformRequest;
config.transformRequest = config.transformRequest ?
(Object.prototype.toString.call(config.transformRequest) === '[object Array]' ?
config.transformRequest : [config.transformRequest]) : [];
config.transformRequest.push(function(data, headerGetter) {
var formData = new FormData();
var allFields = {};
for (var key in config.fields) allFields[key] = config.fields[key];
if (data) allFields['data'] = data;
if (config.formDataAppender) {
for (var key in allFields) {
config.formDataAppender(formData, key, allFields[key]);
}
} else {
for (var key in allFields) {
var val = allFields[key];
if (val !== undefined) {
if (Object.prototype.toString.call(val) === '[object String]') {
formData.append(key, val);
} else {
if (config.sendObjectsAsJsonBlob && typeof val === 'object') {
formData.append(key, new Blob([val], { type: 'application/json' }));
} else {
formData.append(key, JSON.stringify(val));
}
}
}
}
}
promise.progress = function (fn) {
promise.progress_fn = fn;
promise.then(null, null, function (update) {
fn(update);
});
return promise;
};
promise.abort = function () {
if (config.__XHR) {
$timeout(function () {
config.__XHR.abort();
});
}
return promise;
};
promise.xhr = function (fn) {
config.xhrFn = (function (origXhrFn) {
return function () {
origXhrFn && origXhrFn.apply(promise, arguments);
fn.apply(promise, arguments);
}
})(config.xhrFn);
return promise;
};
if (config.file != null) {
var fileFormName = config.fileFormDataName || 'file';
return promise;
}
if (Object.prototype.toString.call(config.file) === '[object Array]') {
var isFileFormNameString = Object.prototype.toString.call(fileFormName) === '[object String]';
for (var i = 0; i < config.file.length; i++) {
formData.append(isFileFormNameString ? fileFormName : fileFormName[i], config.file[i],
(config.fileName && config.fileName[i]) || config.file[i].name);
}
} else {
formData.append(fileFormName, config.file, config.fileName || config.file.name);
}
}
return formData;
});
this.upload = function (config) {
config.headers = config.headers || {};
config.headers['Content-Type'] = undefined;
config.transformRequest = config.transformRequest ?
(Object.prototype.toString.call(config.transformRequest) === '[object Array]' ?
config.transformRequest : [config.transformRequest]) : [];
config.transformRequest.push(function (data) {
var formData = new FormData();
var allFields = {};
for (key in config.fields) {
if (config.fields.hasOwnProperty(key)) {
allFields[key] = config.fields[key];
}
}
if (data) allFields['data'] = data;
return sendHttp(config);
};
if (config.formDataAppender) {
for (key in allFields) {
if (allFields.hasOwnProperty(key)) {
config.formDataAppender(formData, key, allFields[key]);
}
}
} else {
for (key in allFields) {
if (allFields.hasOwnProperty(key)) {
var val = allFields[key];
if (val !== undefined) {
if (Object.prototype.toString.call(val) === '[object String]') {
formData.append(key, val);
} else {
if (config.sendObjectsAsJsonBlob && typeof val === 'object') {
formData.append(key, new Blob([val], {type: 'application/json'}));
} else {
formData.append(key, JSON.stringify(val));
}
}
this.http = function(config) {
return sendHttp(config);
};
}
}
}
}
if (config.file != null) {
var fileFormName = config.fileFormDataName || 'file';
if (Object.prototype.toString.call(config.file) === '[object Array]') {
var isFileFormNameString = Object.prototype.toString.call(fileFormName) === '[object String]';
for (i = 0; i < config.file.length; i++) {
formData.append(isFileFormNameString ? fileFormName : fileFormName[i], config.file[i],
(config.fileName && config.fileName[i]) || config.file[i].name);
}
} else {
formData.append(fileFormName, config.file, config.fileName || config.file.name);
}
}
return formData;
});
return sendHttp(config);
};
this.http = function (config) {
return sendHttp(config);
};
}]);
angularFileUpload.directive('ngFileSelect', [ '$parse', '$timeout', '$compile',
function($parse, $timeout, $compile) { return {
restrict: 'AEC',
require:'?ngModel',
link: function(scope, elem, attr, ngModel) {
handleFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile);
}
}}]);
angularFileUpload.directive('ngFileSelect', ['$parse', '$timeout', '$compile',
function ($parse, $timeout, $compile) {
return {
restrict: 'AEC',
require: '?ngModel',
link: function (scope, elem, attr, ngModel) {
linkFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile);
}
}
}]);
function handleFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile) {
function isInputTypeFile() {
return elem[0].tagName.toLowerCase() === 'input' && elem.attr('type') && elem.attr('type').toLowerCase() === 'file';
}
var watchers = [];
function linkFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile) {
function isInputTypeFile() {
return elem[0].tagName.toLowerCase() === 'input' && elem.attr('type') && elem.attr('type').toLowerCase() === 'file';
}
function watchForRecompile(attrVal) {
$timeout(function() {
if (elem.parent().length) {
watchers.push(scope.$watch(attrVal, function(val, oldVal) {
if (val != oldVal) {
recompileElem();
}
}));
}
});
}
function bindAttrToFileInput(fileElem) {
if (attr.ngMultiple) fileElem.attr('multiple', $parse(attr.ngMultiple)(scope));
if (attr.ngSelectAccept) fileElem.attr('accept', $parse(attr.ngSelectAccept)(scope));
if (attr.ngCapture) fileElem.attr('capture', $parse(attr.ngCapture)(scope));
if (attr.ngDisabled) fileElem.attr('disabled', $parse(attr.ngDisabled)(scope));
function recompileElem() {
var clone = elem.clone();
if (elem.attr('__afu_gen__')) {
angular.element(document.getElementById(elem.attr('id').substring(1))).remove();
}
if (elem.parent().length) {
for (var i = 0; i < watchers.length; i++) {
watchers[i]();
}
elem.replaceWith(clone);
$compile(clone)(scope);
}
return clone;
}
function bindAttr(bindAttr, attrName) {
if (bindAttr) {
watchForRecompile(bindAttr);
var val = $parse(bindAttr)(scope);
if (val) {
elem.attr(attrName, val);
attr[attrName] = val;
} else {
elem.attr(attrName, null);
delete attr[attrName];
}
}
}
bindAttr(attr.ngMultiple, 'multiple');
bindAttr(attr.ngAccept, 'ng-accept');
bindAttr(attr.ngCapture, 'capture');
if (attr['ngFileSelect'] != '') {
attr.ngFileChange = attr.ngFileSelect;
}
function onChangeFn(evt) {
var files = [], fileList, i;
fileList = evt.__files_ || (evt.target && evt.target.files);
updateModel(fileList, attr, ngModel, scope, evt);
};
var fileElem = elem;
if (!isInputTypeFile()) {
fileElem = angular.element('<input type="file">')
if (elem.attr('multiple')) fileElem.attr('multiple', elem.attr('multiple'));
if (elem.attr('accept')) fileElem.attr('accept', elem.attr('accept'));
if (elem.attr('capture')) fileElem.attr('capture', elem.attr('capture'));
for (var key in attr) {
if (key.indexOf('inputFile') == 0) {
var name = key.substring('inputFile'.length);
name = name[0].toLowerCase() + name.substring(1);
fileElem.attr(name, attr[key]);
}
}
var isUpdating = false;
fileElem.bind('change', function(evt) {
if (!isUpdating) {
isUpdating = true;
try {
var fileList = evt.__files_ || (evt.target && evt.target.files);
var files = [], rejFiles = [];
fileElem.css('width', '0px').css('height', '0px').css('position', 'absolute').css('padding', 0).css('margin', 0)
.css('overflow', 'hidden').attr('tabindex', '-1').css('opacity', 0).attr('__afu_gen__', true);
elem.attr('__refElem__', true);
fileElem[0].__refElem__ = elem[0];
elem.parent()[0].insertBefore(fileElem[0], elem[0])
elem.css('overflow', 'hidden');
elem.bind('click', function(e) {
if (!resetAndClick(e)) {
fileElem[0].click();
}
});
} else {
elem.bind('click', resetAndClick);
}
function resetAndClick(evt) {
if (fileElem[0].value != null && fileElem[0].value != '') {
fileElem[0].value = null;
// IE 11 already fires change event when you set the value to null
if (navigator.userAgent.indexOf("Trident/7") === -1) {
onChangeFn({target: {files: []}});
}
}
// if this is manual click trigger we don't need to reset again
if (!elem.attr('__afu_clone__')) {
// fix for IE10 cannot set the value of the input to null programmatically by cloning and replacing input
// IE 11 setting the value to null event will be fired after file change clearing the selected file so
// we just recreate the element for IE 11 as well
if (navigator.appVersion.indexOf("MSIE 10") !== -1 || navigator.userAgent.indexOf("Trident/7") !== -1) {
var clone = recompileElem();
clone.attr('__afu_clone__', true);
clone[0].click();
evt.preventDefault();
evt.stopPropagation();
return true;
}
} else {
elem.attr('__afu_clone__', null);
}
}
fileElem.bind('change', onChangeFn);
elem.on('$destroy', function() {
for (var i = 0; i < watchers.length; i++) {
watchers[i]();
}
if (elem[0] != fileElem[0]) fileElem.remove();
});
watchers.push(scope.$watch(attr.ngModel, function(val, oldVal) {
if (val != oldVal && (val == null || !val.length)) {
if (navigator.appVersion.indexOf("MSIE 10") !== -1) {
recompileElem();
} else {
fileElem[0].value = null;
}
}
}));
function updateModel(fileList, attr, ngModel, scope, evt) {
var files = [], rejFiles = [];
var accept = $parse(attr.ngAccept)(scope);
var regexp = angular.isString(accept) && accept ? new RegExp(globStringToRegex(accept), 'gi') : null;
var acceptFn = regexp ? null : attr.ngAccept;
var accept = $parse(attr.ngAccept);
for (i = 0; i < fileList.length; i++) {
var file = fileList.item(i);
if (isAccepted(scope, accept, file, evt)) {
files.push(file);
} else {
rejFiles.push(file);
}
}
console.log('change' + files);
updateModel($parse, $timeout, scope, ngModel, attr,
attr.ngFileChange || attr.ngFileSelect, files, rejFiles, evt);
if (files.length == 0) fileElem[0].value = files;
if (fileElem.attr('__afu_gen__')) {
fileElem.remove();
}
} finally {
isUpdating = false;
}
}
});
}
for (var i = 0; i < fileList.length; i++) {
var file = fileList.item(i);
if ((!regexp || file.type.match(regexp) || (file.name != null && file.name.match(regexp))) &&
(!acceptFn || $parse(acceptFn)(scope, {$file: file, $event: evt}))) {
files.push(file);
} else {
rejFiles.push(file);
}
}
$timeout(function() {
if (ngModel) {
$parse(attr.ngModel).assign(scope, files);
ngModel && ngModel.$setViewValue(files != null && files.length == 0 ? '' : files);
if (attr.ngModelRejected) {
$parse(attr.ngModelRejected).assign(scope, rejFiles);
}
}
if (attr.ngFileChange && attr.ngFileChange != "") {
$parse(attr.ngFileChange)(scope, {
$files: files,
$rejectedFiles: rejFiles,
$event: evt
});
}
});
}
function clickHandler(evt) {
createAndClickFileInput(evt);
if (isInputTypeFile()) {
evt.preventDefault()
}
}
elem.bind('click', clickHandler);
function createAndClickFileInput(evt) {
if (elem.attr('disabled')) {
return;
}
fileElem = angular.element('<input type="file">');
for (var i = 0; i < elem[0].attributes.length; i++) {
var attribute = elem[0].attributes[i];
fileElem.attr(attribute.name, attribute.value);
}
if (isInputTypeFile()) {
elem.replaceWith(fileElem);
elem = fileElem;
} else {
fileElem.css('width', '0px').css('height', '0px').css('position', 'absolute').css('padding', 0).css('margin', 0)
.css('overflow', 'hidden').attr('tabindex', '-1').css('opacity', 0).attr('__afu_gen__', true);
elem.attr('__refElem__', true);
fileElem[0].__refElem__ = elem[0];
elem.parent()[0].insertBefore(fileElem[0], elem[0]);
elem.css('overflow', 'hidden');
}
bindAttrToFileInput(fileElem);
updateModel($parse, $timeout, scope, ngModel, attr,
attr.ngFileChange || attr.ngFileSelect, [], [], evt, true);
fileElem[0].click();
if (isInputTypeFile()) {
elem.bind('click', clickHandler);
}
}
}
angularFileUpload.directive('ngFileDrop', [ '$parse', '$timeout', '$location', function($parse, $timeout, $location) { return {
restrict: 'AEC',
require:'?ngModel',
link: function(scope, elem, attr, ngModel) {
handleDrop(scope, elem, attr, ngModel, $parse, $timeout, $location);
}
}}]);
angularFileUpload.directive('ngFileDrop', ['$parse', '$timeout', '$location', function ($parse, $timeout, $location) {
return {
restrict: 'AEC',
require: '?ngModel',
link: function (scope, elem, attr, ngModel) {
linkDrop(scope, elem, attr, ngModel, $parse, $timeout, $location);
}
}
}]);
angularFileUpload.directive('ngNoFileDrop', function() {
return function(scope, elem, attr) {
if (dropAvailable()) elem.css('display', 'none')
}
angularFileUpload.directive('ngNoFileDrop', function () {
return function (scope, elem) {
if (dropAvailable()) elem.css('display', 'none')
}
});
//for backward compatibility
angularFileUpload.directive('ngFileDropAvailable', [ '$parse', '$timeout', function($parse, $timeout) {
return function(scope, elem, attr) {
if (dropAvailable()) {
var fn = $parse(attr['ngFileDropAvailable']);
$timeout(function() {
fn(scope);
});
}
}
angularFileUpload.directive('ngFileDropAvailable', ['$parse', '$timeout', function ($parse, $timeout) {
return function (scope, elem, attr) {
if (dropAvailable()) {
var fn = $parse(attr['ngFileDropAvailable']);
$timeout(function () {
fn(scope);
});
}
}
}]);
function handleDrop(scope, elem, attr, ngModel, $parse, $timeout, $location) {
var available = dropAvailable();
if (attr['dropAvailable']) {
$timeout(function() {
scope.dropAvailable ? scope.dropAvailable.value = available : scope.dropAvailable = available;
});
}
if (!available) {
if ($parse(attr.hideOnDropNotAvailable)(scope) != false) {
elem.css('display', 'none');
}
return;
}
var leaveTimeout = null;
var stopPropagation = $parse(attr.stopPropagation)(scope);
var dragOverDelay = 1;
var accept = $parse(attr.ngAccept)(scope) || attr.accept;
var regexp = angular.isString(accept) && accept ? new RegExp(globStringToRegex(accept), 'gi') : null;
var acceptFn = regexp ? null : attr.ngAccept;
var actualDragOverClass;
elem[0].addEventListener('dragover', function(evt) {
evt.preventDefault();
if (stopPropagation) evt.stopPropagation();
// handling dragover events from the Chrome download bar
if (navigator.userAgent.indexOf("Chrome") > -1) {
var b = evt.dataTransfer.effectAllowed;
evt.dataTransfer.dropEffect = ('move' === b || 'linkMove' === b) ? 'move' : 'copy';
}
$timeout.cancel(leaveTimeout);
if (!scope.actualDragOverClass) {
actualDragOverClass = calculateDragOverClass(scope, attr, evt);
}
elem.addClass(actualDragOverClass);
}, false);
elem[0].addEventListener('dragenter', function(evt) {
evt.preventDefault();
if (stopPropagation) evt.stopPropagation();
}, false);
elem[0].addEventListener('dragleave', function(evt) {
leaveTimeout = $timeout(function() {
elem.removeClass(actualDragOverClass);
actualDragOverClass = null;
}, dragOverDelay || 1);
}, false);
if (attr['ngFileDrop'] != '') {
attr.ngFileChange = scope.ngFileDrop;
}
elem[0].addEventListener('drop', function(evt) {
evt.preventDefault();
if (stopPropagation) evt.stopPropagation();
elem.removeClass(actualDragOverClass);
actualDragOverClass = null;
extractFiles(evt, function(files, rejFiles) {
$timeout(function() {
if (ngModel) {
$parse(attr.ngModel).assign(scope, files);
ngModel && ngModel.$setViewValue(files != null && files.length == 0 ? '' : files);
}
if (attr['ngModelRejected']) {
if (scope[attr.ngModelRejected]) {
$parse(attr.ngModelRejected).assign(scope, rejFiles);
}
}
});
$timeout(function() {
$parse(attr.ngFileChange)(scope, {
$files: files,
$rejectedFiles: rejFiles,
$event: evt
});
});
}, $parse(attr.allowDir)(scope) != false, attr.multiple || $parse(attr.ngMultiple)(scope));
}, false);
function calculateDragOverClass(scope, attr, evt) {
var valid = true;
if (regexp || acceptFn) {
var items = evt.dataTransfer.items;
if (items != null) {
for (var i = 0 ; i < items.length && valid; i++) {
valid = valid && (items[i].kind == 'file' || items[i].kind == '') &&
((acceptFn && $parse(acceptFn)(scope, {$file: items[i], $event: evt})) ||
(regexp && (items[i].type != null && items[i].type.match(regexp)) ||
(items[i].name != null && items[i].name.match(regexp))));
}
}
}
var clazz = $parse(attr.dragOverClass)(scope, {$event : evt});
if (clazz) {
if (clazz.delay) dragOverDelay = clazz.delay;
if (clazz.accept) clazz = valid ? clazz.accept : clazz.reject;
}
return clazz || attr['dragOverClass'] || 'dragover';
}
function extractFiles(evt, callback, allowDir, multiple) {
var files = [], rejFiles = [], items = evt.dataTransfer.items, processing = 0;
function addFile(file) {
if ((!regexp || file.type.match(regexp) || (file.name != null && file.name.match(regexp))) &&
(!acceptFn || $parse(acceptFn)(scope, {$file: file, $event: evt}))) {
files.push(file);
} else {
rejFiles.push(file);
}
}
if (items && items.length > 0 && $location.protocol() != 'file') {
for (var i = 0; i < items.length; i++) {
if (items[i].webkitGetAsEntry && items[i].webkitGetAsEntry() && items[i].webkitGetAsEntry().isDirectory) {
var entry = items[i].webkitGetAsEntry();
if (entry.isDirectory && !allowDir) {
continue;
}
if (entry != null) {
traverseFileTree(files, entry);
}
} else {
var f = items[i].getAsFile();
if (f != null) addFile(f);
}
if (!multiple && files.length > 0) break;
}
} else {
var fileList = evt.dataTransfer.files;
if (fileList != null) {
for (var i = 0; i < fileList.length; i++) {
addFile(fileList.item(i));
if (!multiple && files.length > 0) break;
}
}
}
var delays = 0;
(function waitForProcess(delay) {
$timeout(function() {
if (!processing) {
if (!multiple && files.length > 1) {
var i = 0;
while (files[i].type == 'directory') i++;
files = [files[i]];
}
callback(files, rejFiles);
} else {
if (delays++ * 10 < 20 * 1000) {
waitForProcess(10);
}
}
}, delay || 0)
})();
function traverseFileTree(files, entry, path) {
if (entry != null) {
if (entry.isDirectory) {
var filePath = (path || '') + entry.name;
addFile({name: entry.name, type: 'directory', path: filePath});
var dirReader = entry.createReader();
var entries = [];
processing++;
var readEntries = function() {
dirReader.readEntries(function(results) {
try {
if (!results.length) {
for (var i = 0; i < entries.length; i++) {
traverseFileTree(files, entries[i], (path ? path : '') + entry.name + '/');
}
processing--;
} else {
entries = entries.concat(Array.prototype.slice.call(results || [], 0));
readEntries();
}
} catch (e) {
processing--;
console.error(e);
}
}, function() {
processing--;
});
};
readEntries();
} else {
processing++;
entry.file(function(file) {
try {
processing--;
file.path = (path ? path : '') + file.name;
addFile(file);
} catch (e) {
processing--;
console.error(e);
}
}, function(e) {
processing--;
});
}
}
}
}
function linkDrop(scope, elem, attr, ngModel, $parse, $timeout, $location) {
var available = dropAvailable();
if (attr['dropAvailable']) {
$timeout(function () {
scope.dropAvailable ? scope.dropAvailable.value = available : scope.dropAvailable = available;
});
}
if (!available) {
if ($parse(attr.hideOnDropNotAvailable)(scope) != false) {
elem.css('display', 'none');
}
return;
}
var leaveTimeout = null;
var stopPropagation = $parse(attr.stopPropagation);
var dragOverDelay = 1;
var accept = $parse(attr.ngAccept);
var disabled = $parse(attr.ngDisabled);
var actualDragOverClass;
elem[0].addEventListener('dragover', function (evt) {
if (disabled(scope)) return;
evt.preventDefault();
if (stopPropagation(scope)) evt.stopPropagation();
// handling dragover events from the Chrome download bar
if (navigator.userAgent.indexOf("Chrome") > -1) {
var b = evt.dataTransfer.effectAllowed;
evt.dataTransfer.dropEffect = ('move' === b || 'linkMove' === b) ? 'move' : 'copy';
}
$timeout.cancel(leaveTimeout);
if (!scope.actualDragOverClass) {
actualDragOverClass = calculateDragOverClass(scope, attr, evt);
}
elem.addClass(actualDragOverClass);
}, false);
elem[0].addEventListener('dragenter', function (evt) {
if (disabled(scope)) return;
evt.preventDefault();
if (stopPropagation(scope)) evt.stopPropagation();
}, false);
elem[0].addEventListener('dragleave', function () {
if (disabled(scope)) return;
leaveTimeout = $timeout(function () {
elem.removeClass(actualDragOverClass);
actualDragOverClass = null;
}, dragOverDelay || 1);
}, false);
elem[0].addEventListener('drop', function (evt) {
if (disabled(scope)) return;
evt.preventDefault();
if (stopPropagation(scope)) evt.stopPropagation();
elem.removeClass(actualDragOverClass);
actualDragOverClass = null;
extractFiles(evt, function (files, rejFiles) {
updateModel($parse, $timeout, scope, ngModel, attr,
attr.ngFileChange || attr.ngFileDrop, files, rejFiles, evt)
}, $parse(attr.allowDir)(scope) != false, attr.multiple || $parse(attr.ngMultiple)(scope));
}, false);
function calculateDragOverClass(scope, attr, evt) {
var accepted = true;
var items = evt.dataTransfer.items;
if (items != null) {
for (i = 0; i < items.length && accepted; i++) {
accepted = accepted
&& (items[i].kind == 'file' || items[i].kind == '')
&& isAccepted(scope, accept, items[i], evt);
}
}
var clazz = $parse(attr.dragOverClass)(scope, {$event: evt});
if (clazz) {
if (clazz.delay) dragOverDelay = clazz.delay;
if (clazz.accept) clazz = accepted ? clazz.accept : clazz.reject;
}
return clazz || attr['dragOverClass'] || 'dragover';
}
function extractFiles(evt, callback, allowDir, multiple) {
var files = [], rejFiles = [], items = evt.dataTransfer.items, processing = 0;
function addFile(file) {
if (isAccepted(scope, accept, file, evt)) {
files.push(file);
} else {
rejFiles.push(file);
}
}
if (items && items.length > 0 && $location.protocol() != 'file') {
for (i = 0; i < items.length; i++) {
if (items[i].webkitGetAsEntry && items[i].webkitGetAsEntry() && items[i].webkitGetAsEntry().isDirectory) {
var entry = items[i].webkitGetAsEntry();
if (entry.isDirectory && !allowDir) {
continue;
}
if (entry != null) {
traverseFileTree(files, entry);
}
} else {
var f = items[i].getAsFile();
if (f != null) addFile(f);
}
if (!multiple && files.length > 0) break;
}
} else {
var fileList = evt.dataTransfer.files;
if (fileList != null) {
for (i = 0; i < fileList.length; i++) {
addFile(fileList.item(i));
if (!multiple && files.length > 0) break;
}
}
}
var delays = 0;
(function waitForProcess(delay) {
$timeout(function () {
if (!processing) {
if (!multiple && files.length > 1) {
i = 0;
while (files[i].type == 'directory') i++;
files = [files[i]];
}
callback(files, rejFiles);
} else {
if (delays++ * 10 < 20 * 1000) {
waitForProcess(10);
}
}
}, delay || 0)
})();
function traverseFileTree(files, entry, path) {
if (entry != null) {
if (entry.isDirectory) {
var filePath = (path || '') + entry.name;
addFile({name: entry.name, type: 'directory', path: filePath});
var dirReader = entry.createReader();
var entries = [];
processing++;
var readEntries = function () {
dirReader.readEntries(function (results) {
try {
if (!results.length) {
for (i = 0; i < entries.length; i++) {
traverseFileTree(files, entries[i], (path ? path : '') + entry.name + '/');
}
processing--;
} else {
entries = entries.concat(Array.prototype.slice.call(results || [], 0));
readEntries();
}
} catch (e) {
processing--;
console.error(e);
}
}, function () {
processing--;
});
};
readEntries();
} else {
processing++;
entry.file(function (file) {
try {
processing--;
file.path = (path ? path : '') + file.name;
addFile(file);
} catch (e) {
processing--;
console.error(e);
}
}, function () {
processing--;
});
}
}
}
}
}

@@ -575,22 +496,65 @@

function updateModel($parse, $timeout, scope, ngModel, attr, fileChange, files, rejFiles, evt, noDelay) {
console.log('aa ' + files);
function update() {
if (ngModel) {
$parse(attr.ngModel).assign(scope, files);
$timeout(function () {
ngModel && ngModel.$setViewValue(files != null && files.length == 0 ? null : files);
});
}
if (attr.ngModelRejected) {
$parse(attr.ngModelRejected).assign(scope, rejFiles);
}
if (fileChange) {
$parse(fileChange)(scope, {
$files: files,
$rejectedFiles: rejFiles,
$event: evt
});
}
}
if (noDelay) {
update();
} else {
$timeout(function () {
update();
});
}
}
function isAccepted(scope, accept, file, evt) {
var val = accept(scope, {$file: file, $event: evt});
if (val == null) {
return true;
}
if (angular.isString(val)) {
var regexp = new RegExp(globStringToRegex(val), 'gi')
val = (file.type != null && file.type.match(regexp)) ||
(file.name != null && file.name.match(regexp));
}
return val;
}
function globStringToRegex(str) {
if (str.length > 2 && str[0] === '/' && str[str.length -1] === '/') {
return str.substring(1, str.length - 1);
}
var split = str.split(','), result = '';
if (split.length > 1) {
for (var i = 0; i < split.length; i++) {
result += '(' + globStringToRegex(split[i]) + ')';
if (i < split.length - 1) {
result += '|'
}
}
} else {
if (str.indexOf('.') == 0) {
str= '*' + str;
}
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$';
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.');
}
return result;
if (str.length > 2 && str[0] === '/' && str[str.length - 1] === '/') {
return str.substring(1, str.length - 1);
}
var split = str.split(','), result = '';
if (split.length > 1) {
for (i = 0; i < split.length; i++) {
result += '(' + globStringToRegex(split[i]) + ')';
if (i < split.length - 1) {
result += '|'
}
}
} else {
if (str.indexOf('.') == 0) {
str = '*' + str;
}
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$';
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.');
}
return result;
}

@@ -600,6 +564,8 @@

for (var key in angularFileUpload) {
ngFileUpload[key] = angularFileUpload[key];
for (key in angularFileUpload) {
if (angularFileUpload.hasOwnProperty(key)) {
ngFileUpload[key] = angularFileUpload[key];
}
}
})();

@@ -1,6 +0,6 @@

"use strict";
'use strict';
var app = angular.module('fileUpload', [ 'ngFileUpload' ]);
var version = '3.0.6';
var version = '3.2.0';

@@ -36,3 +36,3 @@ app.controller('MyCtrl', [ '$scope', '$http', '$timeout', '$compile', '$upload', function($scope, $http, $timeout, $compile, $upload) {

}
}
};

@@ -42,3 +42,3 @@ function generateThumbAndUpload(file) {

$scope.generateThumb(file);
if ($scope.howToSend == 1) {
if ($scope.howToSend === 1) {
uploadUsing$upload(file);

@@ -66,3 +66,3 @@ } else if ($scope.howToSend == 2) {

}
}
};

@@ -78,3 +78,3 @@ function uploadUsing$upload(file) {

file: file,
fileFormDataName: 'myFile',
fileFormDataName: 'myFile'
});

@@ -125,3 +125,3 @@

}, 5000);
}
};
fileReader.readAsArrayBuffer(file);

@@ -141,6 +141,6 @@ }

signature : $scope.signature,
"Content-Type" : file.type === null || file.type === '' ? 'application/octet-stream' : file.type,
'Content-Type' : file.type === null || file.type === '' ? 'application/octet-stream' : file.type,
filename : file.name
},
file : file,
file : file
});

@@ -169,14 +169,14 @@

});
}
};
if (localStorage) {
$scope.s3url = localStorage.getItem("s3url");
$scope.AWSAccessKeyId = localStorage.getItem("AWSAccessKeyId");
$scope.acl = localStorage.getItem("acl");
$scope.success_action_redirect = localStorage.getItem("success_action_redirect");
$scope.policy = localStorage.getItem("policy");
$scope.signature = localStorage.getItem("signature");
$scope.s3url = localStorage.getItem('s3url');
$scope.AWSAccessKeyId = localStorage.getItem('AWSAccessKeyId');
$scope.acl = localStorage.getItem('acl');
$scope.success_action_redirect = localStorage.getItem('success_action_redirect');
$scope.policy = localStorage.getItem('policy');
$scope.signature = localStorage.getItem('signature');
}
$scope.success_action_redirect = $scope.success_action_redirect || window.location.protocol + "//" + window.location.host;
$scope.success_action_redirect = $scope.success_action_redirect || window.location.protocol + '//' + window.location.host;
$scope.jsonPolicy = $scope.jsonPolicy || '{\n "expiration": "2020-01-01T00:00:00Z",\n "conditions": [\n {"bucket": "angular-file-upload"},\n ["starts-with", "$key", ""],\n {"acl": "private"},\n ["starts-with", "$Content-Type", ""],\n ["starts-with", "$filename", ""],\n ["content-length-range", 0, 524288000]\n ]\n}';

@@ -186,27 +186,27 @@ $scope.acl = $scope.acl || 'private';

function storeS3UploadConfigInLocalStore() {
if ($scope.howToSend == 3 && localStorage) {
localStorage.setItem("s3url", $scope.s3url);
localStorage.setItem("AWSAccessKeyId", $scope.AWSAccessKeyId);
localStorage.setItem("acl", $scope.acl);
localStorage.setItem("success_action_redirect", $scope.success_action_redirect);
localStorage.setItem("policy", $scope.policy);
localStorage.setItem("signature", $scope.signature);
if ($scope.howToSend === 3 && localStorage) {
localStorage.setItem('s3url', $scope.s3url);
localStorage.setItem('AWSAccessKeyId', $scope.AWSAccessKeyId);
localStorage.setItem('acl', $scope.acl);
localStorage.setItem('success_action_redirect', $scope.success_action_redirect);
localStorage.setItem('policy', $scope.policy);
localStorage.setItem('signature', $scope.signature);
}
}
(function handleDynamicEditingOfScriptsAndHtml($scope, $http) {
(function handleDynamicEditingOfScriptsAndHtml($scope) {
$scope.defaultHtml = document.getElementById('editArea').innerHTML.replace(/\t\t\t\t/g, '');
$scope.editHtml = (localStorage && localStorage.getItem("editHtml" + version)) || $scope.defaultHtml;
function htmlEdit(update) {
document.getElementById("editArea").innerHTML = $scope.editHtml;
$compile(document.getElementById("editArea"))($scope);
$scope.editHtml && localStorage && localStorage.setItem("editHtml" + version, $scope.editHtml);
$scope.editHtml = (localStorage && localStorage.getItem('editHtml' + version)) || $scope.defaultHtml;
function htmlEdit() {
document.getElementById('editArea').innerHTML = $scope.editHtml;
$compile(document.getElementById('editArea'))($scope);
$scope.editHtml && localStorage && localStorage.setItem('editHtml' + version, $scope.editHtml);
if ($scope.editHtml != $scope.htmlEditor.getValue()) $scope.htmlEditor.setValue($scope.editHtml);
}
$scope.$watch("editHtml", htmlEdit);
$scope.$watch('editHtml', htmlEdit);
$scope.htmlEditor = CodeMirror(document.getElementById('htmlEdit'), {
lineNumbers: true, indentUnit: 4,
mode: "htmlmixed"
mode: 'htmlmixed'
});

@@ -223,16 +223,33 @@ $scope.htmlEditor.on('change', function() {

return confirm('Are you sure? Your local changes will be lost.');
}
};
$scope.getReqParams = function() {
return $scope.generateErrorOnServer ? "?errorCode=" + $scope.serverErrorCode +
"&errorMessage=" + $scope.serverErrorMsg : "";
}
return $scope.generateErrorOnServer ? '?errorCode=' + $scope.serverErrorCode +
'&errorMessage=' + $scope.serverErrorMsg : '';
};
angular.element(window).bind("dragover", function(e) {
angular.element(window).bind('dragover', function(e) {
e.preventDefault();
});
angular.element(window).bind("drop", function(e) {
angular.element(window).bind('drop', function(e) {
e.preventDefault();
});
$timeout(function(){
$scope.capture = localStorage.getItem('capture'+ version) || 'camera';
$scope.accept = localStorage.getItem('accept'+ version) || 'image/*';
$scope.acceptSelect = localStorage.getItem('acceptSelect'+ version) || 'image/*';
$scope.disabled = localStorage.getItem('disabled'+ version) == 'true' || false;
$scope.multiple = localStorage.getItem('multiple'+ version) == 'true' || false;
$scope.allowDir = localStorage.getItem('allowDir'+ version) == 'true' || true;
$scope.$watch('capture+accept+acceptSelect+disabled+capture+multiple+allowDir', function() {
localStorage.setItem('capture'+ version, $scope.capture);
localStorage.setItem('accept'+ version, $scope.accept);
localStorage.setItem('acceptSelect'+ version, $scope.acceptSelect);
localStorage.setItem('disabled'+ version, $scope.disabled);
localStorage.setItem('multiple'+ version, $scope.multiple);
localStorage.setItem('allowDir'+ version, $scope.allowDir);
});
});
} ]);
/**!
* AngularJS file upload/drop directive and service with progress and abort
* @author Danial <danial.farid@gmail.com>
* @version 3.1.2
* @version 3.2.0
*/
(function() {
(function () {
var key, i;
function patchXHR(fnName, newFn) {
window.XMLHttpRequest.prototype[fnName] = newFn(window.XMLHttpRequest.prototype[fnName]);
window.XMLHttpRequest.prototype[fnName] = newFn(window.XMLHttpRequest.prototype[fnName]);
}
if (window.XMLHttpRequest && !window.XMLHttpRequest.__isFileAPIShim) {
patchXHR('setRequestHeader', function(orig) {
return function(header, value) {
if (header === '__setXHR_') {
var val = value(this);
// fix for angular < 1.2.0
if (val instanceof Function) {
val(this);
}
} else {
orig.apply(this, arguments);
}
}
});
patchXHR('setRequestHeader', function (orig) {
return function (header, value) {
if (header === '__setXHR_') {
var val = value(this);
// fix for angular < 1.2.0
if (val instanceof Function) {
val(this);
}
} else {
orig.apply(this, arguments);
}
}
});
}
var angularFileUpload = angular.module('angularFileUpload', []);
angularFileUpload.version = '3.1.2';
angularFileUpload.service('$upload', ['$http', '$q', '$timeout', function($http, $q, $timeout) {
function sendHttp(config) {
config.method = config.method || 'POST';
config.headers = config.headers || {};
config.transformRequest = config.transformRequest || function(data, headersGetter) {
if (window.ArrayBuffer && data instanceof window.ArrayBuffer) {
return data;
}
return $http.defaults.transformRequest[0](data, headersGetter);
};
var deferred = $q.defer();
var promise = deferred.promise;
angularFileUpload.version = '3.2.0';
angularFileUpload.service('$upload', ['$http', '$q', '$timeout', function ($http, $q, $timeout) {
function sendHttp(config) {
config.method = config.method || 'POST';
config.headers = config.headers || {};
config.transformRequest = config.transformRequest || function (data, headersGetter) {
if (window.ArrayBuffer && data instanceof window.ArrayBuffer) {
return data;
}
return $http.defaults.transformRequest[0](data, headersGetter);
};
var deferred = $q.defer();
var promise = deferred.promise;
config.headers['__setXHR_'] = function() {
return function(xhr) {
if (!xhr) return;
config.__XHR = xhr;
config.xhrFn && config.xhrFn(xhr);
xhr.upload.addEventListener('progress', function(e) {
e.config = config;
deferred.notify ? deferred.notify(e) : promise.progress_fn && $timeout(function(){promise.progress_fn(e)});
}, false);
//fix for firefox not firing upload progress end, also IE8-9
xhr.upload.addEventListener('load', function(e) {
if (e.lengthComputable) {
e.config = config;
deferred.notify ? deferred.notify(e) : promise.progress_fn && $timeout(function(){promise.progress_fn(e)});
}
}, false);
};
};
config.headers['__setXHR_'] = function () {
return function (xhr) {
if (!xhr) return;
config.__XHR = xhr;
config.xhrFn && config.xhrFn(xhr);
xhr.upload.addEventListener('progress', function (e) {
e.config = config;
deferred.notify ? deferred.notify(e) : promise.progress_fn && $timeout(function () {
promise.progress_fn(e)
});
}, false);
//fix for firefox not firing upload progress end, also IE8-9
xhr.upload.addEventListener('load', function (e) {
if (e.lengthComputable) {
e.config = config;
deferred.notify ? deferred.notify(e) : promise.progress_fn && $timeout(function () {
promise.progress_fn(e)
});
}
}, false);
};
};
$http(config).then(function(r){deferred.resolve(r)}, function(e){deferred.reject(e)}, function(n){deferred.notify(n)});
promise.success = function(fn) {
promise.then(function(response) {
fn(response.data, response.status, response.headers, config);
});
return promise;
};
$http(config).then(function (r) {
deferred.resolve(r)
}, function (e) {
deferred.reject(e)
}, function (n) {
deferred.notify(n)
});
promise.error = function(fn) {
promise.then(null, function(response) {
fn(response.data, response.status, response.headers, config);
});
return promise;
};
promise.success = function (fn) {
promise.then(function (response) {
fn(response.data, response.status, response.headers, config);
});
return promise;
};
promise.progress = function(fn) {
promise.progress_fn = fn;
promise.then(null, null, function(update) {
fn(update);
});
return promise;
};
promise.abort = function() {
if (config.__XHR) {
$timeout(function() {
config.__XHR.abort();
});
}
return promise;
};
promise.xhr = function(fn) {
config.xhrFn = (function(origXhrFn) {
return function() {
origXhrFn && origXhrFn.apply(promise, arguments);
fn.apply(promise, arguments);
}
})(config.xhrFn);
return promise;
};
return promise;
}
promise.error = function (fn) {
promise.then(null, function (response) {
fn(response.data, response.status, response.headers, config);
});
return promise;
};
this.upload = function(config) {
config.headers = config.headers || {};
config.headers['Content-Type'] = undefined;
var origTransformRequest = config.transformRequest;
config.transformRequest = config.transformRequest ?
(Object.prototype.toString.call(config.transformRequest) === '[object Array]' ?
config.transformRequest : [config.transformRequest]) : [];
config.transformRequest.push(function(data, headerGetter) {
var formData = new FormData();
var allFields = {};
for (var key in config.fields) allFields[key] = config.fields[key];
if (data) allFields['data'] = data;
if (config.formDataAppender) {
for (var key in allFields) {
config.formDataAppender(formData, key, allFields[key]);
}
} else {
for (var key in allFields) {
var val = allFields[key];
if (val !== undefined) {
if (Object.prototype.toString.call(val) === '[object String]') {
formData.append(key, val);
} else {
if (config.sendObjectsAsJsonBlob && typeof val === 'object') {
formData.append(key, new Blob([val], { type: 'application/json' }));
} else {
formData.append(key, JSON.stringify(val));
}
}
}
}
}
promise.progress = function (fn) {
promise.progress_fn = fn;
promise.then(null, null, function (update) {
fn(update);
});
return promise;
};
promise.abort = function () {
if (config.__XHR) {
$timeout(function () {
config.__XHR.abort();
});
}
return promise;
};
promise.xhr = function (fn) {
config.xhrFn = (function (origXhrFn) {
return function () {
origXhrFn && origXhrFn.apply(promise, arguments);
fn.apply(promise, arguments);
}
})(config.xhrFn);
return promise;
};
if (config.file != null) {
var fileFormName = config.fileFormDataName || 'file';
return promise;
}
if (Object.prototype.toString.call(config.file) === '[object Array]') {
var isFileFormNameString = Object.prototype.toString.call(fileFormName) === '[object String]';
for (var i = 0; i < config.file.length; i++) {
formData.append(isFileFormNameString ? fileFormName : fileFormName[i], config.file[i],
(config.fileName && config.fileName[i]) || config.file[i].name);
}
} else {
formData.append(fileFormName, config.file, config.fileName || config.file.name);
}
}
return formData;
});
this.upload = function (config) {
config.headers = config.headers || {};
config.headers['Content-Type'] = undefined;
config.transformRequest = config.transformRequest ?
(Object.prototype.toString.call(config.transformRequest) === '[object Array]' ?
config.transformRequest : [config.transformRequest]) : [];
config.transformRequest.push(function (data) {
var formData = new FormData();
var allFields = {};
for (key in config.fields) {
if (config.fields.hasOwnProperty(key)) {
allFields[key] = config.fields[key];
}
}
if (data) allFields['data'] = data;
return sendHttp(config);
};
if (config.formDataAppender) {
for (key in allFields) {
if (allFields.hasOwnProperty(key)) {
config.formDataAppender(formData, key, allFields[key]);
}
}
} else {
for (key in allFields) {
if (allFields.hasOwnProperty(key)) {
var val = allFields[key];
if (val !== undefined) {
if (Object.prototype.toString.call(val) === '[object String]') {
formData.append(key, val);
} else {
if (config.sendObjectsAsJsonBlob && typeof val === 'object') {
formData.append(key, new Blob([val], {type: 'application/json'}));
} else {
formData.append(key, JSON.stringify(val));
}
}
this.http = function(config) {
return sendHttp(config);
};
}
}
}
}
if (config.file != null) {
var fileFormName = config.fileFormDataName || 'file';
if (Object.prototype.toString.call(config.file) === '[object Array]') {
var isFileFormNameString = Object.prototype.toString.call(fileFormName) === '[object String]';
for (i = 0; i < config.file.length; i++) {
formData.append(isFileFormNameString ? fileFormName : fileFormName[i], config.file[i],
(config.fileName && config.fileName[i]) || config.file[i].name);
}
} else {
formData.append(fileFormName, config.file, config.fileName || config.file.name);
}
}
return formData;
});
return sendHttp(config);
};
this.http = function (config) {
return sendHttp(config);
};
}]);
angularFileUpload.directive('ngFileSelect', [ '$parse', '$timeout', '$compile',
function($parse, $timeout, $compile) { return {
restrict: 'AEC',
require:'?ngModel',
link: function(scope, elem, attr, ngModel) {
handleFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile);
}
}}]);
angularFileUpload.directive('ngFileSelect', ['$parse', '$timeout', '$compile',
function ($parse, $timeout, $compile) {
return {
restrict: 'AEC',
require: '?ngModel',
link: function (scope, elem, attr, ngModel) {
linkFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile);
}
}
}]);
function handleFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile) {
function isInputTypeFile() {
return elem[0].tagName.toLowerCase() === 'input' && elem.attr('type') && elem.attr('type').toLowerCase() === 'file';
}
var watchers = [];
function linkFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile) {
function isInputTypeFile() {
return elem[0].tagName.toLowerCase() === 'input' && elem.attr('type') && elem.attr('type').toLowerCase() === 'file';
}
function watchForRecompile(attrVal) {
$timeout(function() {
if (elem.parent().length) {
watchers.push(scope.$watch(attrVal, function(val, oldVal) {
if (val != oldVal) {
recompileElem();
}
}));
}
});
}
function bindAttrToFileInput(fileElem) {
if (attr.ngMultiple) fileElem.attr('multiple', $parse(attr.ngMultiple)(scope));
if (attr.ngSelectAccept) fileElem.attr('accept', $parse(attr.ngSelectAccept)(scope));
if (attr.ngCapture) fileElem.attr('capture', $parse(attr.ngCapture)(scope));
if (attr.ngDisabled) fileElem.attr('disabled', $parse(attr.ngDisabled)(scope));
function recompileElem() {
var clone = elem.clone();
if (elem.attr('__afu_gen__')) {
angular.element(document.getElementById(elem.attr('id').substring(1))).remove();
}
if (elem.parent().length) {
for (var i = 0; i < watchers.length; i++) {
watchers[i]();
}
elem.replaceWith(clone);
$compile(clone)(scope);
}
return clone;
}
function bindAttr(bindAttr, attrName) {
if (bindAttr) {
watchForRecompile(bindAttr);
var val = $parse(bindAttr)(scope);
if (val) {
elem.attr(attrName, val);
attr[attrName] = val;
} else {
elem.attr(attrName, null);
delete attr[attrName];
}
}
}
bindAttr(attr.ngMultiple, 'multiple');
bindAttr(attr.ngAccept, 'ng-accept');
bindAttr(attr.ngCapture, 'capture');
if (attr['ngFileSelect'] != '') {
attr.ngFileChange = attr.ngFileSelect;
}
function onChangeFn(evt) {
var files = [], fileList, i;
fileList = evt.__files_ || (evt.target && evt.target.files);
updateModel(fileList, attr, ngModel, scope, evt);
};
var fileElem = elem;
if (!isInputTypeFile()) {
fileElem = angular.element('<input type="file">')
if (elem.attr('multiple')) fileElem.attr('multiple', elem.attr('multiple'));
if (elem.attr('accept')) fileElem.attr('accept', elem.attr('accept'));
if (elem.attr('capture')) fileElem.attr('capture', elem.attr('capture'));
for (var key in attr) {
if (key.indexOf('inputFile') == 0) {
var name = key.substring('inputFile'.length);
name = name[0].toLowerCase() + name.substring(1);
fileElem.attr(name, attr[key]);
}
}
var isUpdating = false;
fileElem.bind('change', function(evt) {
if (!isUpdating) {
isUpdating = true;
try {
var fileList = evt.__files_ || (evt.target && evt.target.files);
var files = [], rejFiles = [];
fileElem.css('width', '0px').css('height', '0px').css('position', 'absolute').css('padding', 0).css('margin', 0)
.css('overflow', 'hidden').attr('tabindex', '-1').css('opacity', 0).attr('__afu_gen__', true);
elem.attr('__refElem__', true);
fileElem[0].__refElem__ = elem[0];
elem.parent()[0].insertBefore(fileElem[0], elem[0])
elem.css('overflow', 'hidden');
elem.bind('click', function(e) {
if (!resetAndClick(e)) {
fileElem[0].click();
}
});
} else {
elem.bind('click', resetAndClick);
}
function resetAndClick(evt) {
if (fileElem[0].value != null && fileElem[0].value != '') {
fileElem[0].value = null;
// IE 11 already fires change event when you set the value to null
if (navigator.userAgent.indexOf("Trident/7") === -1) {
onChangeFn({target: {files: []}});
}
}
// if this is manual click trigger we don't need to reset again
if (!elem.attr('__afu_clone__')) {
// fix for IE10 cannot set the value of the input to null programmatically by cloning and replacing input
// IE 11 setting the value to null event will be fired after file change clearing the selected file so
// we just recreate the element for IE 11 as well
if (navigator.appVersion.indexOf("MSIE 10") !== -1 || navigator.userAgent.indexOf("Trident/7") !== -1) {
var clone = recompileElem();
clone.attr('__afu_clone__', true);
clone[0].click();
evt.preventDefault();
evt.stopPropagation();
return true;
}
} else {
elem.attr('__afu_clone__', null);
}
}
fileElem.bind('change', onChangeFn);
elem.on('$destroy', function() {
for (var i = 0; i < watchers.length; i++) {
watchers[i]();
}
if (elem[0] != fileElem[0]) fileElem.remove();
});
watchers.push(scope.$watch(attr.ngModel, function(val, oldVal) {
if (val != oldVal && (val == null || !val.length)) {
if (navigator.appVersion.indexOf("MSIE 10") !== -1) {
recompileElem();
} else {
fileElem[0].value = null;
}
}
}));
function updateModel(fileList, attr, ngModel, scope, evt) {
var files = [], rejFiles = [];
var accept = $parse(attr.ngAccept)(scope);
var regexp = angular.isString(accept) && accept ? new RegExp(globStringToRegex(accept), 'gi') : null;
var acceptFn = regexp ? null : attr.ngAccept;
var accept = $parse(attr.ngAccept);
for (i = 0; i < fileList.length; i++) {
var file = fileList.item(i);
if (isAccepted(scope, accept, file, evt)) {
files.push(file);
} else {
rejFiles.push(file);
}
}
console.log('change' + files);
updateModel($parse, $timeout, scope, ngModel, attr,
attr.ngFileChange || attr.ngFileSelect, files, rejFiles, evt);
if (files.length == 0) fileElem[0].value = files;
if (fileElem.attr('__afu_gen__')) {
fileElem.remove();
}
} finally {
isUpdating = false;
}
}
});
}
for (var i = 0; i < fileList.length; i++) {
var file = fileList.item(i);
if ((!regexp || file.type.match(regexp) || (file.name != null && file.name.match(regexp))) &&
(!acceptFn || $parse(acceptFn)(scope, {$file: file, $event: evt}))) {
files.push(file);
} else {
rejFiles.push(file);
}
}
$timeout(function() {
if (ngModel) {
$parse(attr.ngModel).assign(scope, files);
ngModel && ngModel.$setViewValue(files != null && files.length == 0 ? '' : files);
if (attr.ngModelRejected) {
$parse(attr.ngModelRejected).assign(scope, rejFiles);
}
}
if (attr.ngFileChange && attr.ngFileChange != "") {
$parse(attr.ngFileChange)(scope, {
$files: files,
$rejectedFiles: rejFiles,
$event: evt
});
}
});
}
function clickHandler(evt) {
createAndClickFileInput(evt);
if (isInputTypeFile()) {
evt.preventDefault()
}
}
elem.bind('click', clickHandler);
function createAndClickFileInput(evt) {
if (elem.attr('disabled')) {
return;
}
fileElem = angular.element('<input type="file">');
for (var i = 0; i < elem[0].attributes.length; i++) {
var attribute = elem[0].attributes[i];
fileElem.attr(attribute.name, attribute.value);
}
if (isInputTypeFile()) {
elem.replaceWith(fileElem);
elem = fileElem;
} else {
fileElem.css('width', '0px').css('height', '0px').css('position', 'absolute').css('padding', 0).css('margin', 0)
.css('overflow', 'hidden').attr('tabindex', '-1').css('opacity', 0).attr('__afu_gen__', true);
elem.attr('__refElem__', true);
fileElem[0].__refElem__ = elem[0];
elem.parent()[0].insertBefore(fileElem[0], elem[0]);
elem.css('overflow', 'hidden');
}
bindAttrToFileInput(fileElem);
updateModel($parse, $timeout, scope, ngModel, attr,
attr.ngFileChange || attr.ngFileSelect, [], [], evt, true);
fileElem[0].click();
if (isInputTypeFile()) {
elem.bind('click', clickHandler);
}
}
}
angularFileUpload.directive('ngFileDrop', [ '$parse', '$timeout', '$location', function($parse, $timeout, $location) { return {
restrict: 'AEC',
require:'?ngModel',
link: function(scope, elem, attr, ngModel) {
handleDrop(scope, elem, attr, ngModel, $parse, $timeout, $location);
}
}}]);
angularFileUpload.directive('ngFileDrop', ['$parse', '$timeout', '$location', function ($parse, $timeout, $location) {
return {
restrict: 'AEC',
require: '?ngModel',
link: function (scope, elem, attr, ngModel) {
linkDrop(scope, elem, attr, ngModel, $parse, $timeout, $location);
}
}
}]);
angularFileUpload.directive('ngNoFileDrop', function() {
return function(scope, elem, attr) {
if (dropAvailable()) elem.css('display', 'none')
}
angularFileUpload.directive('ngNoFileDrop', function () {
return function (scope, elem) {
if (dropAvailable()) elem.css('display', 'none')
}
});
//for backward compatibility
angularFileUpload.directive('ngFileDropAvailable', [ '$parse', '$timeout', function($parse, $timeout) {
return function(scope, elem, attr) {
if (dropAvailable()) {
var fn = $parse(attr['ngFileDropAvailable']);
$timeout(function() {
fn(scope);
});
}
}
angularFileUpload.directive('ngFileDropAvailable', ['$parse', '$timeout', function ($parse, $timeout) {
return function (scope, elem, attr) {
if (dropAvailable()) {
var fn = $parse(attr['ngFileDropAvailable']);
$timeout(function () {
fn(scope);
});
}
}
}]);
function handleDrop(scope, elem, attr, ngModel, $parse, $timeout, $location) {
var available = dropAvailable();
if (attr['dropAvailable']) {
$timeout(function() {
scope.dropAvailable ? scope.dropAvailable.value = available : scope.dropAvailable = available;
});
}
if (!available) {
if ($parse(attr.hideOnDropNotAvailable)(scope) != false) {
elem.css('display', 'none');
}
return;
}
var leaveTimeout = null;
var stopPropagation = $parse(attr.stopPropagation)(scope);
var dragOverDelay = 1;
var accept = $parse(attr.ngAccept)(scope) || attr.accept;
var regexp = angular.isString(accept) && accept ? new RegExp(globStringToRegex(accept), 'gi') : null;
var acceptFn = regexp ? null : attr.ngAccept;
var actualDragOverClass;
elem[0].addEventListener('dragover', function(evt) {
evt.preventDefault();
if (stopPropagation) evt.stopPropagation();
// handling dragover events from the Chrome download bar
if (navigator.userAgent.indexOf("Chrome") > -1) {
var b = evt.dataTransfer.effectAllowed;
evt.dataTransfer.dropEffect = ('move' === b || 'linkMove' === b) ? 'move' : 'copy';
}
$timeout.cancel(leaveTimeout);
if (!scope.actualDragOverClass) {
actualDragOverClass = calculateDragOverClass(scope, attr, evt);
}
elem.addClass(actualDragOverClass);
}, false);
elem[0].addEventListener('dragenter', function(evt) {
evt.preventDefault();
if (stopPropagation) evt.stopPropagation();
}, false);
elem[0].addEventListener('dragleave', function(evt) {
leaveTimeout = $timeout(function() {
elem.removeClass(actualDragOverClass);
actualDragOverClass = null;
}, dragOverDelay || 1);
}, false);
if (attr['ngFileDrop'] != '') {
attr.ngFileChange = scope.ngFileDrop;
}
elem[0].addEventListener('drop', function(evt) {
evt.preventDefault();
if (stopPropagation) evt.stopPropagation();
elem.removeClass(actualDragOverClass);
actualDragOverClass = null;
extractFiles(evt, function(files, rejFiles) {
$timeout(function() {
if (ngModel) {
$parse(attr.ngModel).assign(scope, files);
ngModel && ngModel.$setViewValue(files != null && files.length == 0 ? '' : files);
}
if (attr['ngModelRejected']) {
if (scope[attr.ngModelRejected]) {
$parse(attr.ngModelRejected).assign(scope, rejFiles);
}
}
});
$timeout(function() {
$parse(attr.ngFileChange)(scope, {
$files: files,
$rejectedFiles: rejFiles,
$event: evt
});
});
}, $parse(attr.allowDir)(scope) != false, attr.multiple || $parse(attr.ngMultiple)(scope));
}, false);
function calculateDragOverClass(scope, attr, evt) {
var valid = true;
if (regexp || acceptFn) {
var items = evt.dataTransfer.items;
if (items != null) {
for (var i = 0 ; i < items.length && valid; i++) {
valid = valid && (items[i].kind == 'file' || items[i].kind == '') &&
((acceptFn && $parse(acceptFn)(scope, {$file: items[i], $event: evt})) ||
(regexp && (items[i].type != null && items[i].type.match(regexp)) ||
(items[i].name != null && items[i].name.match(regexp))));
}
}
}
var clazz = $parse(attr.dragOverClass)(scope, {$event : evt});
if (clazz) {
if (clazz.delay) dragOverDelay = clazz.delay;
if (clazz.accept) clazz = valid ? clazz.accept : clazz.reject;
}
return clazz || attr['dragOverClass'] || 'dragover';
}
function extractFiles(evt, callback, allowDir, multiple) {
var files = [], rejFiles = [], items = evt.dataTransfer.items, processing = 0;
function addFile(file) {
if ((!regexp || file.type.match(regexp) || (file.name != null && file.name.match(regexp))) &&
(!acceptFn || $parse(acceptFn)(scope, {$file: file, $event: evt}))) {
files.push(file);
} else {
rejFiles.push(file);
}
}
if (items && items.length > 0 && $location.protocol() != 'file') {
for (var i = 0; i < items.length; i++) {
if (items[i].webkitGetAsEntry && items[i].webkitGetAsEntry() && items[i].webkitGetAsEntry().isDirectory) {
var entry = items[i].webkitGetAsEntry();
if (entry.isDirectory && !allowDir) {
continue;
}
if (entry != null) {
traverseFileTree(files, entry);
}
} else {
var f = items[i].getAsFile();
if (f != null) addFile(f);
}
if (!multiple && files.length > 0) break;
}
} else {
var fileList = evt.dataTransfer.files;
if (fileList != null) {
for (var i = 0; i < fileList.length; i++) {
addFile(fileList.item(i));
if (!multiple && files.length > 0) break;
}
}
}
var delays = 0;
(function waitForProcess(delay) {
$timeout(function() {
if (!processing) {
if (!multiple && files.length > 1) {
var i = 0;
while (files[i].type == 'directory') i++;
files = [files[i]];
}
callback(files, rejFiles);
} else {
if (delays++ * 10 < 20 * 1000) {
waitForProcess(10);
}
}
}, delay || 0)
})();
function traverseFileTree(files, entry, path) {
if (entry != null) {
if (entry.isDirectory) {
var filePath = (path || '') + entry.name;
addFile({name: entry.name, type: 'directory', path: filePath});
var dirReader = entry.createReader();
var entries = [];
processing++;
var readEntries = function() {
dirReader.readEntries(function(results) {
try {
if (!results.length) {
for (var i = 0; i < entries.length; i++) {
traverseFileTree(files, entries[i], (path ? path : '') + entry.name + '/');
}
processing--;
} else {
entries = entries.concat(Array.prototype.slice.call(results || [], 0));
readEntries();
}
} catch (e) {
processing--;
console.error(e);
}
}, function() {
processing--;
});
};
readEntries();
} else {
processing++;
entry.file(function(file) {
try {
processing--;
file.path = (path ? path : '') + file.name;
addFile(file);
} catch (e) {
processing--;
console.error(e);
}
}, function(e) {
processing--;
});
}
}
}
}
function linkDrop(scope, elem, attr, ngModel, $parse, $timeout, $location) {
var available = dropAvailable();
if (attr['dropAvailable']) {
$timeout(function () {
scope.dropAvailable ? scope.dropAvailable.value = available : scope.dropAvailable = available;
});
}
if (!available) {
if ($parse(attr.hideOnDropNotAvailable)(scope) != false) {
elem.css('display', 'none');
}
return;
}
var leaveTimeout = null;
var stopPropagation = $parse(attr.stopPropagation);
var dragOverDelay = 1;
var accept = $parse(attr.ngAccept);
var disabled = $parse(attr.ngDisabled);
var actualDragOverClass;
elem[0].addEventListener('dragover', function (evt) {
if (disabled(scope)) return;
evt.preventDefault();
if (stopPropagation(scope)) evt.stopPropagation();
// handling dragover events from the Chrome download bar
if (navigator.userAgent.indexOf("Chrome") > -1) {
var b = evt.dataTransfer.effectAllowed;
evt.dataTransfer.dropEffect = ('move' === b || 'linkMove' === b) ? 'move' : 'copy';
}
$timeout.cancel(leaveTimeout);
if (!scope.actualDragOverClass) {
actualDragOverClass = calculateDragOverClass(scope, attr, evt);
}
elem.addClass(actualDragOverClass);
}, false);
elem[0].addEventListener('dragenter', function (evt) {
if (disabled(scope)) return;
evt.preventDefault();
if (stopPropagation(scope)) evt.stopPropagation();
}, false);
elem[0].addEventListener('dragleave', function () {
if (disabled(scope)) return;
leaveTimeout = $timeout(function () {
elem.removeClass(actualDragOverClass);
actualDragOverClass = null;
}, dragOverDelay || 1);
}, false);
elem[0].addEventListener('drop', function (evt) {
if (disabled(scope)) return;
evt.preventDefault();
if (stopPropagation(scope)) evt.stopPropagation();
elem.removeClass(actualDragOverClass);
actualDragOverClass = null;
extractFiles(evt, function (files, rejFiles) {
updateModel($parse, $timeout, scope, ngModel, attr,
attr.ngFileChange || attr.ngFileDrop, files, rejFiles, evt)
}, $parse(attr.allowDir)(scope) != false, attr.multiple || $parse(attr.ngMultiple)(scope));
}, false);
function calculateDragOverClass(scope, attr, evt) {
var accepted = true;
var items = evt.dataTransfer.items;
if (items != null) {
for (i = 0; i < items.length && accepted; i++) {
accepted = accepted
&& (items[i].kind == 'file' || items[i].kind == '')
&& isAccepted(scope, accept, items[i], evt);
}
}
var clazz = $parse(attr.dragOverClass)(scope, {$event: evt});
if (clazz) {
if (clazz.delay) dragOverDelay = clazz.delay;
if (clazz.accept) clazz = accepted ? clazz.accept : clazz.reject;
}
return clazz || attr['dragOverClass'] || 'dragover';
}
function extractFiles(evt, callback, allowDir, multiple) {
var files = [], rejFiles = [], items = evt.dataTransfer.items, processing = 0;
function addFile(file) {
if (isAccepted(scope, accept, file, evt)) {
files.push(file);
} else {
rejFiles.push(file);
}
}
if (items && items.length > 0 && $location.protocol() != 'file') {
for (i = 0; i < items.length; i++) {
if (items[i].webkitGetAsEntry && items[i].webkitGetAsEntry() && items[i].webkitGetAsEntry().isDirectory) {
var entry = items[i].webkitGetAsEntry();
if (entry.isDirectory && !allowDir) {
continue;
}
if (entry != null) {
traverseFileTree(files, entry);
}
} else {
var f = items[i].getAsFile();
if (f != null) addFile(f);
}
if (!multiple && files.length > 0) break;
}
} else {
var fileList = evt.dataTransfer.files;
if (fileList != null) {
for (i = 0; i < fileList.length; i++) {
addFile(fileList.item(i));
if (!multiple && files.length > 0) break;
}
}
}
var delays = 0;
(function waitForProcess(delay) {
$timeout(function () {
if (!processing) {
if (!multiple && files.length > 1) {
i = 0;
while (files[i].type == 'directory') i++;
files = [files[i]];
}
callback(files, rejFiles);
} else {
if (delays++ * 10 < 20 * 1000) {
waitForProcess(10);
}
}
}, delay || 0)
})();
function traverseFileTree(files, entry, path) {
if (entry != null) {
if (entry.isDirectory) {
var filePath = (path || '') + entry.name;
addFile({name: entry.name, type: 'directory', path: filePath});
var dirReader = entry.createReader();
var entries = [];
processing++;
var readEntries = function () {
dirReader.readEntries(function (results) {
try {
if (!results.length) {
for (i = 0; i < entries.length; i++) {
traverseFileTree(files, entries[i], (path ? path : '') + entry.name + '/');
}
processing--;
} else {
entries = entries.concat(Array.prototype.slice.call(results || [], 0));
readEntries();
}
} catch (e) {
processing--;
console.error(e);
}
}, function () {
processing--;
});
};
readEntries();
} else {
processing++;
entry.file(function (file) {
try {
processing--;
file.path = (path ? path : '') + file.name;
addFile(file);
} catch (e) {
processing--;
console.error(e);
}
}, function () {
processing--;
});
}
}
}
}
}

@@ -574,22 +495,65 @@

function updateModel($parse, $timeout, scope, ngModel, attr, fileChange, files, rejFiles, evt, noDelay) {
console.log('aa ' + files);
function update() {
if (ngModel) {
$parse(attr.ngModel).assign(scope, files);
$timeout(function () {
ngModel && ngModel.$setViewValue(files != null && files.length == 0 ? null : files);
});
}
if (attr.ngModelRejected) {
$parse(attr.ngModelRejected).assign(scope, rejFiles);
}
if (fileChange) {
$parse(fileChange)(scope, {
$files: files,
$rejectedFiles: rejFiles,
$event: evt
});
}
}
if (noDelay) {
update();
} else {
$timeout(function () {
update();
});
}
}
function isAccepted(scope, accept, file, evt) {
var val = accept(scope, {$file: file, $event: evt});
if (val == null) {
return true;
}
if (angular.isString(val)) {
var regexp = new RegExp(globStringToRegex(val), 'gi')
val = (file.type != null && file.type.match(regexp)) ||
(file.name != null && file.name.match(regexp));
}
return val;
}
function globStringToRegex(str) {
if (str.length > 2 && str[0] === '/' && str[str.length -1] === '/') {
return str.substring(1, str.length - 1);
}
var split = str.split(','), result = '';
if (split.length > 1) {
for (var i = 0; i < split.length; i++) {
result += '(' + globStringToRegex(split[i]) + ')';
if (i < split.length - 1) {
result += '|'
}
}
} else {
if (str.indexOf('.') == 0) {
str= '*' + str;
}
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$';
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.');
}
return result;
if (str.length > 2 && str[0] === '/' && str[str.length - 1] === '/') {
return str.substring(1, str.length - 1);
}
var split = str.split(','), result = '';
if (split.length > 1) {
for (i = 0; i < split.length; i++) {
result += '(' + globStringToRegex(split[i]) + ')';
if (i < split.length - 1) {
result += '|'
}
}
} else {
if (str.indexOf('.') == 0) {
str = '*' + str;
}
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$';
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.');
}
return result;
}

@@ -599,4 +563,6 @@

for (var key in angularFileUpload) {
ngFileUpload[key] = angularFileUpload[key];
for (key in angularFileUpload) {
if (angularFileUpload.hasOwnProperty(key)) {
ngFileUpload[key] = angularFileUpload[key];
}
}

@@ -610,3 +576,3 @@

* @author Danial <danial.farid@gmail.com>
* @version 3.1.2
* @version 3.2.0
*/

@@ -613,0 +579,0 @@

@@ -1,2 +0,2 @@

/*! 3.1.2 */
!function(){function a(a,b){window.XMLHttpRequest.prototype[a]=b(window.XMLHttpRequest.prototype[a])}function b(a,b,c,d,f,g,h){function i(){return"input"===b[0].tagName.toLowerCase()&&b.attr("type")&&"file"===b.attr("type").toLowerCase()}function j(c){g(function(){b.parent().length&&p.push(a.$watch(c,function(a,b){a!=b&&k()}))})}function k(){var c=b.clone();if(b.attr("__afu_gen__")&&angular.element(document.getElementById(b.attr("id").substring(1))).remove(),b.parent().length){for(var d=0;d<p.length;d++)p[d]();b.replaceWith(c),h(c)(a)}return c}function l(d,e){if(d){j(d);var g=f(d)(a);g?(b.attr(e,g),c[e]=g):(b.attr(e,null),delete c[e])}}function m(b){var e;e=b.__files_||b.target&&b.target.files,o(e,c,d,a,b)}function n(a){if(null!=q[0].value&&""!=q[0].value&&(q[0].value=null,-1===navigator.userAgent.indexOf("Trident/7")&&m({target:{files:[]}})),b.attr("__afu_clone__"))b.attr("__afu_clone__",null);else if(-1!==navigator.appVersion.indexOf("MSIE 10")||-1!==navigator.userAgent.indexOf("Trident/7")){var c=k();return c.attr("__afu_clone__",!0),c[0].click(),a.preventDefault(),a.stopPropagation(),!0}}function o(a,b,c,d,h){for(var i=[],j=[],k=f(b.ngAccept)(d),l=angular.isString(k)&&k?new RegExp(e(k),"gi"):null,m=l?null:b.ngAccept,n=0;n<a.length;n++){var o=a.item(n);!(!l||o.type.match(l)||null!=o.name&&o.name.match(l))||m&&!f(m)(d,{$file:o,$event:h})?j.push(o):i.push(o)}g(function(){c&&(f(b.ngModel).assign(d,i),c&&c.$setViewValue(null!=i&&0==i.length?"":i),b.ngModelRejected&&f(b.ngModelRejected).assign(d,j)),b.ngFileChange&&""!=b.ngFileChange&&f(b.ngFileChange)(d,{$files:i,$rejectedFiles:j,$event:h})})}var p=[];l(c.ngMultiple,"multiple"),l(c.ngAccept,"ng-accept"),l(c.ngCapture,"capture"),""!=c.ngFileSelect&&(c.ngFileChange=c.ngFileSelect);var q=b;if(i())b.bind("click",n);else{q=angular.element('<input type="file">'),b.attr("multiple")&&q.attr("multiple",b.attr("multiple")),b.attr("accept")&&q.attr("accept",b.attr("accept")),b.attr("capture")&&q.attr("capture",b.attr("capture"));for(var r in c)if(0==r.indexOf("inputFile")){var s=r.substring("inputFile".length);s=s[0].toLowerCase()+s.substring(1),q.attr(s,c[r])}q.css("width","0px").css("height","0px").css("position","absolute").css("padding",0).css("margin",0).css("overflow","hidden").attr("tabindex","-1").css("opacity",0).attr("__afu_gen__",!0),b.attr("__refElem__",!0),q[0].__refElem__=b[0],b.parent()[0].insertBefore(q[0],b[0]),b.css("overflow","hidden"),b.bind("click",function(a){n(a)||q[0].click()})}q.bind("change",m),b.on("$destroy",function(){for(var a=0;a<p.length;a++)p[a]();b[0]!=q[0]&&q.remove()}),p.push(a.$watch(c.ngModel,function(a,b){a==b||null!=a&&a.length||(-1!==navigator.appVersion.indexOf("MSIE 10")?k():q[0].value=null)}))}function c(a,b,c,f,g,h,i){function j(a,b,c){var d=!0;if(r||s){var e=c.dataTransfer.items;if(null!=e)for(var f=0;f<e.length&&d;f++)d=d&&("file"==e[f].kind||""==e[f].kind)&&(s&&g(s)(a,{$file:e[f],$event:c})||r&&null!=e[f].type&&e[f].type.match(r)||null!=e[f].name&&e[f].name.match(r))}var h=g(b.dragOverClass)(a,{$event:c});return h&&(h.delay&&(p=h.delay),h.accept&&(h=d?h.accept:h.reject)),h||b.dragOverClass||"dragover"}function k(b,c,d,e){function f(c){!(!r||c.type.match(r)||null!=c.name&&c.name.match(r))||s&&!g(s)(a,{$file:c,$event:b})?l.push(c):k.push(c)}function j(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;f({name:b.name,type:"directory",path:d});var e=b.createReader(),g=[];n++;var h=function(){e.readEntries(function(d){try{if(d.length)g=g.concat(Array.prototype.slice.call(d||[],0)),h();else{for(var e=0;e<g.length;e++)j(a,g[e],(c?c:"")+b.name+"/");n--}}catch(f){n--,console.error(f)}},function(){n--})};h()}else n++,b.file(function(a){try{n--,a.path=(c?c:"")+a.name,f(a)}catch(b){n--,console.error(b)}},function(){n--})}var k=[],l=[],m=b.dataTransfer.items,n=0;if(m&&m.length>0&&"file"!=i.protocol())for(var o=0;o<m.length;o++){if(m[o].webkitGetAsEntry&&m[o].webkitGetAsEntry()&&m[o].webkitGetAsEntry().isDirectory){var p=m[o].webkitGetAsEntry();if(p.isDirectory&&!d)continue;null!=p&&j(k,p)}else{var q=m[o].getAsFile();null!=q&&f(q)}if(!e&&k.length>0)break}else{var t=b.dataTransfer.files;if(null!=t)for(var o=0;o<t.length&&(f(t.item(o)),e||!(k.length>0));o++);}var u=0;!function v(a){h(function(){if(n)10*u++<2e4&&v(10);else{if(!e&&k.length>1){for(var a=0;"directory"==k[a].type;)a++;k=[k[a]]}c(k,l)}},a||0)}()}var l=d();if(c.dropAvailable&&h(function(){a.dropAvailable?a.dropAvailable.value=l:a.dropAvailable=l}),!l)return 0!=g(c.hideOnDropNotAvailable)(a)&&b.css("display","none"),void 0;var m,n=null,o=g(c.stopPropagation)(a),p=1,q=g(c.ngAccept)(a)||c.accept,r=angular.isString(q)&&q?new RegExp(e(q),"gi"):null,s=r?null:c.ngAccept;b[0].addEventListener("dragover",function(d){if(d.preventDefault(),o&&d.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var e=d.dataTransfer.effectAllowed;d.dataTransfer.dropEffect="move"===e||"linkMove"===e?"move":"copy"}h.cancel(n),a.actualDragOverClass||(m=j(a,c,d)),b.addClass(m)},!1),b[0].addEventListener("dragenter",function(a){a.preventDefault(),o&&a.stopPropagation()},!1),b[0].addEventListener("dragleave",function(){n=h(function(){b.removeClass(m),m=null},p||1)},!1),""!=c.ngFileDrop&&(c.ngFileChange=a.ngFileDrop),b[0].addEventListener("drop",function(d){d.preventDefault(),o&&d.stopPropagation(),b.removeClass(m),m=null,k(d,function(b,e){h(function(){f&&(g(c.ngModel).assign(a,b),f&&f.$setViewValue(null!=b&&0==b.length?"":b)),c.ngModelRejected&&a[c.ngModelRejected]&&g(c.ngModelRejected).assign(a,e)}),h(function(){g(c.ngFileChange)(a,{$files:b,$rejectedFiles:e,$event:d})})},0!=g(c.allowDir)(a),c.multiple||g(c.ngMultiple)(a))},!1)}function d(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}function e(a){if(a.length>2&&"/"===a[0]&&"/"===a[a.length-1])return a.substring(1,a.length-1);var b=a.split(","),c="";if(b.length>1)for(var d=0;d<b.length;d++)c+="("+e(b[d])+")",d<b.length-1&&(c+="|");else 0==a.indexOf(".")&&(a="*"+a),c="^"+a.replace(new RegExp("[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\-]","g"),"\\$&")+"$",c=c.replace(/\\\*/g,".*").replace(/\\\?/g,".");return c}window.XMLHttpRequest&&!window.XMLHttpRequest.__isFileAPIShim&&a("setRequestHeader",function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}});var f=angular.module("angularFileUpload",[]);f.version="3.1.2",f.service("$upload",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{},d.transformRequest=d.transformRequest||function(b,c){return window.ArrayBuffer&&b instanceof window.ArrayBuffer?b:a.defaults.transformRequest[0](b,c)};var e=b.defer(),f=e.promise;return d.headers.__setXHR_=function(){return function(a){a&&(d.__XHR=a,d.xhrFn&&d.xhrFn(a),a.upload.addEventListener("progress",function(a){a.config=d,e.notify?e.notify(a):f.progress_fn&&c(function(){f.progress_fn(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progress_fn&&c(function(){f.progress_fn(a)}))},!1))}},a(d).then(function(a){e.resolve(a)},function(a){e.reject(a)},function(a){e.notify(a)}),f.success=function(a){return f.then(function(b){a(b.data,b.status,b.headers,d)}),f},f.error=function(a){return f.then(null,function(b){a(b.data,b.status,b.headers,d)}),f},f.progress=function(a){return f.progress_fn=a,f.then(null,null,function(b){a(b)}),f},f.abort=function(){return d.__XHR&&c(function(){d.__XHR.abort()}),f},f.xhr=function(a){return d.xhrFn=function(b){return function(){b&&b.apply(f,arguments),a.apply(f,arguments)}}(d.xhrFn),f},f}this.upload=function(a){a.headers=a.headers||{},a.headers["Content-Type"]=void 0;a.transformRequest;return a.transformRequest=a.transformRequest?"[object Array]"===Object.prototype.toString.call(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(b){var c=new FormData,d={};for(var e in a.fields)d[e]=a.fields[e];if(b&&(d.data=b),a.formDataAppender)for(var e in d)a.formDataAppender(c,e,d[e]);else for(var e in d){var f=d[e];void 0!==f&&("[object String]"===Object.prototype.toString.call(f)?c.append(e,f):a.sendObjectsAsJsonBlob&&"object"==typeof f?c.append(e,new Blob([f],{type:"application/json"})):c.append(e,JSON.stringify(f)))}if(null!=a.file){var g=a.fileFormDataName||"file";if("[object Array]"===Object.prototype.toString.call(a.file))for(var h="[object String]"===Object.prototype.toString.call(g),i=0;i<a.file.length;i++)c.append(h?g:g[i],a.file[i],a.fileName&&a.fileName[i]||a.file[i].name);else c.append(g,a.file,a.fileName||a.file.name)}return c}),d(a)},this.http=function(a){return d(a)}}]),f.directive("ngFileSelect",["$parse","$timeout","$compile",function(a,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){b(e,f,g,h,a,c,d)}}}]),f.directive("ngFileDrop",["$parse","$timeout","$location",function(a,b,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){c(e,f,g,h,a,b,d)}}}]),f.directive("ngNoFileDrop",function(){return function(a,b){d()&&b.css("display","none")}}),f.directive("ngFileDropAvailable",["$parse","$timeout",function(a,b){return function(c,e,f){if(d()){var g=a(f.ngFileDropAvailable);b(function(){g(c)})}}}]);var g=angular.module("ngFileUpload",[]);for(var h in f)g[h]=f[h]}(),function(){function a(a,b){window.XMLHttpRequest.prototype[a]=b(window.XMLHttpRequest.prototype[a])}function b(a,b,c){try{Object.defineProperty(a,b,{get:c})}catch(d){}}var c=function(){try{var a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");if(a)return!0}catch(b){if(void 0!=navigator.mimeTypes["application/x-shockwave-flash"])return!0}return!1};if(window.XMLHttpRequest&&!window.FormData||window.FileAPI&&FileAPI.forceLoad){var d=function(a){if(!a.__listeners){a.upload||(a.upload={}),a.__listeners=[];var b=a.upload.addEventListener;a.upload.addEventListener=function(c,d){a.__listeners[c]=d,b&&b.apply(this,arguments)}}};a("open",function(a){return function(b,c,e){d(this),this.__url=c;try{a.apply(this,[b,c,e])}catch(f){f.message.indexOf("Access is denied")>-1&&(this.__origError=f,a.apply(this,[b,"_fix_for_ie_crossdomain__",e]))}}}),a("getResponseHeader",function(a){return function(b){return this.__fileApiXHR&&this.__fileApiXHR.getResponseHeader?this.__fileApiXHR.getResponseHeader(b):null==a?null:a.apply(this,[b])}}),a("getAllResponseHeaders",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.getAllResponseHeaders?this.__fileApiXHR.getAllResponseHeaders():null==a?null:a.apply(this)}}),a("abort",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.abort?this.__fileApiXHR.abort():null==a?null:a.apply(this)}}),a("setRequestHeader",function(a){return function(b,c){if("__setXHR_"===b){d(this);var e=c(this);e instanceof Function&&e(this)}else this.__requestHeaders=this.__requestHeaders||{},this.__requestHeaders[b]=c,a.apply(this,arguments)}}),a("send",function(a){return function(){var d=this;if(arguments[0]&&arguments[0].__isFileAPIShim){var e=arguments[0],f={url:d.__url,jsonp:!1,cache:!0,complete:function(a,c){d.__completed=!0,!a&&d.__listeners.load&&d.__listeners.load({type:"load",loaded:d.__loaded,total:d.__total,target:d,lengthComputable:!0}),!a&&d.__listeners.loadend&&d.__listeners.loadend({type:"loadend",loaded:d.__loaded,total:d.__total,target:d,lengthComputable:!0}),"abort"===a&&d.__listeners.abort&&d.__listeners.abort({type:"abort",loaded:d.__loaded,total:d.__total,target:d,lengthComputable:!0}),void 0!==c.status&&b(d,"status",function(){return 0==c.status&&a&&"abort"!==a?500:c.status}),void 0!==c.statusText&&b(d,"statusText",function(){return c.statusText}),b(d,"readyState",function(){return 4}),void 0!==c.response&&b(d,"response",function(){return c.response});var e=c.responseText||(a&&0==c.status&&"abort"!==a?a:void 0);b(d,"responseText",function(){return e}),b(d,"response",function(){return e}),a&&b(d,"err",function(){return a}),d.__fileApiXHR=c,d.onreadystatechange&&d.onreadystatechange(),d.onload&&d.onload()},fileprogress:function(a){if(a.target=d,d.__listeners.progress&&d.__listeners.progress(a),d.__total=a.total,d.__loaded=a.loaded,a.total===a.loaded){var b=this;setTimeout(function(){d.__completed||(d.getAllResponseHeaders=function(){},b.complete(null,{status:204,statusText:"No Content"}))},FileAPI.noContentTimeout||1e4)}},headers:d.__requestHeaders};f.data={},f.files={};for(var g=0;g<e.data.length;g++){var h=e.data[g];null!=h.val&&null!=h.val.name&&null!=h.val.size&&null!=h.val.type?f.files[h.key]=h.val:f.data[h.key]=h.val}setTimeout(function(){if(!c())throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';d.__fileApiXHR=FileAPI.upload(f)},1)}else{if(this.__origError)throw this.__origError;a.apply(d,arguments)}}}),window.XMLHttpRequest.__isFileAPIShim=!0;var e=function(a){if(!c())throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';var b=angular.element(a);if(!b.attr("disabled")){for(var d=!1,e=0;e<b[0].attributes.length;e++){var f=b[0].attributes[e];if(-1!==f.name.indexOf("file-select")){d=!0;break}}if(!b.hasClass("js-fileapi-wrapper")&&(d||null!=b.attr("__afu_gen__"))&&(b.addClass("js-fileapi-wrapper"),null!=b.attr("__afu_gen__"))){for(var g=b[0].__refElem__&&angular.element(b[0].__refElem__)||b;g&&!g.attr("__refElem__");)g=angular.element(g[0].nextSibling);g.bind("mouseover",function(){(""===b.parent().css("position")||"static"===b.parent().css("position"))&&b.parent().css("position","relative"),b.css("position","absolute").css("top",g[0].offsetTop+"px").css("left",g[0].offsetLeft+"px").css("width",g[0].offsetWidth+"px").css("height",g[0].offsetHeight+"px").css("padding",g.css("padding")).css("margin",g.css("margin")).css("filter","alpha(opacity=0)"),g.attr("onclick",""),b.css("z-index","1000")})}}},f=function(a){return function(b){for(var c=FileAPI.getFiles(b),d=0;d<c.length;d++)void 0===c[d].size&&(c[d].size=0),void 0===c[d].name&&(c[d].name="file"),void 0===c[d].type&&(c[d].type="undefined");b.target||(b.target={}),b.target.files=c,b.target.files!=c&&(b.__files_=c),(b.__files_||b.target.files).item=function(a){return(b.__files_||b.target.files)[a]||null},a&&a.apply(this,[b])}},g=function(a,b){return("change"===b.toLowerCase()||"onchange"===b.toLowerCase())&&"file"==a.getAttribute("type")};HTMLInputElement.prototype.addEventListener&&(HTMLInputElement.prototype.addEventListener=function(a){return function(b,c,d,h){g(this,b)?(e(this),a.apply(this,[b,f(c),d,h])):a.apply(this,[b,c,d,h])}}(HTMLInputElement.prototype.addEventListener)),HTMLInputElement.prototype.attachEvent&&(HTMLInputElement.prototype.attachEvent=function(a){return function(b,c){g(this,b)?(e(this),window.jQuery?angular.element(this).bind("change",f(null)):a.apply(this,[b,f(c)])):a.apply(this,[b,c])}}(HTMLInputElement.prototype.attachEvent)),window.FormData=FormData=function(){return{append:function(a,b,c){b.__isFileAPIBlobShim&&(b=b.data[0]),this.data.push({key:a,val:b,name:c})},data:[],__isFileAPIShim:!0}},window.Blob=Blob=function(a){return{data:a,__isFileAPIBlobShim:!0}},function(){if(window.FileAPI||(window.FileAPI={}),FileAPI.forceLoad&&(FileAPI.html5=!1),!FileAPI.upload){var a,b,d,e,f,g=document.createElement("script"),h=document.getElementsByTagName("script");if(window.FileAPI.jsUrl)a=window.FileAPI.jsUrl;else if(window.FileAPI.jsPath)b=window.FileAPI.jsPath;else for(d=0;d<h.length;d++)if(f=h[d].src,e=f.search(/\/angular\-file\-upload[\-a-zA-z0-9\.]*\.js/),e>-1){b=f.substring(0,e+1);break}null==FileAPI.staticPath&&(FileAPI.staticPath=b),g.setAttribute("src",a||b+"FileAPI.min.js"),document.getElementsByTagName("head")[0].appendChild(g),FileAPI.hasFlash=c()}}(),FileAPI.disableFileInput=function(a,b){b?a.removeClass("js-fileapi-wrapper"):a.addClass("js-fileapi-wrapper")}}window.FileReader||(window.FileReader=function(){var a=this,b=!1;this.listeners={},this.addEventListener=function(b,c){a.listeners[b]=a.listeners[b]||[],a.listeners[b].push(c)},this.removeEventListener=function(b,c){a.listeners[b]&&a.listeners[b].splice(a.listeners[b].indexOf(c),1)},this.dispatchEvent=function(b){var c=a.listeners[b.type];if(c)for(var d=0;d<c.length;d++)c[d].call(a,b)},this.onabort=this.onerror=this.onload=this.onloadstart=this.onloadend=this.onprogress=null;var c=function(b,c){var d={type:b,target:a,loaded:c.loaded,total:c.total,error:c.error};return null!=c.result&&(d.target.result=c.result),d},d=function(d){if(b||(b=!0,a.onloadstart&&a.onloadstart(c("loadstart",d))),"load"===d.type){a.onloadend&&a.onloadend(c("loadend",d));var e=c("load",d);a.onload&&a.onload(e),a.dispatchEvent(e)}else if("progress"===d.type){var e=c("progress",d);a.onprogress&&a.onprogress(e),a.dispatchEvent(e)}else{var e=c("error",d);a.onerror&&a.onerror(e),a.dispatchEvent(e)}};this.readAsArrayBuffer=function(a){FileAPI.readAsBinaryString(a,d)},this.readAsBinaryString=function(a){FileAPI.readAsBinaryString(a,d)},this.readAsDataURL=function(a){FileAPI.readAsDataURL(a,d)},this.readAsText=function(a){FileAPI.readAsText(a,d)}})}();
/*! 3.2.0 */
!function(){function a(a,b){window.XMLHttpRequest.prototype[a]=b(window.XMLHttpRequest.prototype[a])}function b(a,b,c,d,g,h){function j(){return"input"===b[0].tagName.toLowerCase()&&b.attr("type")&&"file"===b.attr("type").toLowerCase()}function k(b){c.ngMultiple&&b.attr("multiple",g(c.ngMultiple)(a)),c.ngSelectAccept&&b.attr("accept",g(c.ngSelectAccept)(a)),c.ngCapture&&b.attr("capture",g(c.ngCapture)(a)),c.ngDisabled&&b.attr("disabled",g(c.ngDisabled)(a));var j=!1;b.bind("change",function(k){if(!j){j=!0;try{var l=k.__files_||k.target&&k.target.files,m=[],n=[],o=g(c.ngAccept);for(i=0;i<l.length;i++){var p=l.item(i);f(a,o,p,k)?m.push(p):n.push(p)}console.log("change"+m),e(g,h,a,d,c,c.ngFileChange||c.ngFileSelect,m,n,k),0==m.length&&(b[0].value=m),b.attr("__afu_gen__")&&b.remove()}finally{j=!1}}})}function l(a){m(a),j()&&a.preventDefault()}function m(f){if(!b.attr("disabled")){fileElem=angular.element('<input type="file">');for(var i=0;i<b[0].attributes.length;i++){var m=b[0].attributes[i];fileElem.attr(m.name,m.value)}j()?(b.replaceWith(fileElem),b=fileElem):(fileElem.css("width","0px").css("height","0px").css("position","absolute").css("padding",0).css("margin",0).css("overflow","hidden").attr("tabindex","-1").css("opacity",0).attr("__afu_gen__",!0),b.attr("__refElem__",!0),fileElem[0].__refElem__=b[0],b.parent()[0].insertBefore(fileElem[0],b[0]),b.css("overflow","hidden")),k(fileElem),e(g,h,a,d,c,c.ngFileChange||c.ngFileSelect,[],[],f,!0),fileElem[0].click(),j()&&b.bind("click",l)}}b.bind("click",l)}function c(a,b,c,g,h,j,k){function l(a,b,c){var d=!0,e=c.dataTransfer.items;if(null!=e)for(i=0;i<e.length&&d;i++)d=d&&("file"==e[i].kind||""==e[i].kind)&&f(a,s,e[i],c);var g=h(b.dragOverClass)(a,{$event:c});return g&&(g.delay&&(r=g.delay),g.accept&&(g=d?g.accept:g.reject)),g||b.dragOverClass||"dragover"}function m(b,c,d,e){function g(c){f(a,s,c,b)?l.push(c):m.push(c)}function h(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;g({name:b.name,type:"directory",path:d});var e=b.createReader(),f=[];o++;var j=function(){e.readEntries(function(d){try{if(d.length)f=f.concat(Array.prototype.slice.call(d||[],0)),j();else{for(i=0;i<f.length;i++)h(a,f[i],(c?c:"")+b.name+"/");o--}}catch(e){o--,console.error(e)}},function(){o--})};j()}else o++,b.file(function(a){try{o--,a.path=(c?c:"")+a.name,g(a)}catch(b){o--,console.error(b)}},function(){o--})}var l=[],m=[],n=b.dataTransfer.items,o=0;if(n&&n.length>0&&"file"!=k.protocol())for(i=0;i<n.length;i++){if(n[i].webkitGetAsEntry&&n[i].webkitGetAsEntry()&&n[i].webkitGetAsEntry().isDirectory){var p=n[i].webkitGetAsEntry();if(p.isDirectory&&!d)continue;null!=p&&h(l,p)}else{var q=n[i].getAsFile();null!=q&&g(q)}if(!e&&l.length>0)break}else{var r=b.dataTransfer.files;if(null!=r)for(i=0;i<r.length&&(g(r.item(i)),e||!(l.length>0));i++);}var t=0;!function u(a){j(function(){if(o)10*t++<2e4&&u(10);else{if(!e&&l.length>1){for(i=0;"directory"==l[i].type;)i++;l=[l[i]]}c(l,m)}},a||0)}()}var n=d();if(c.dropAvailable&&j(function(){a.dropAvailable?a.dropAvailable.value=n:a.dropAvailable=n}),!n)return 0!=h(c.hideOnDropNotAvailable)(a)&&b.css("display","none"),void 0;var o,p=null,q=h(c.stopPropagation),r=1,s=h(c.ngAccept),t=h(c.ngDisabled);b[0].addEventListener("dragover",function(d){if(!t(a)){if(d.preventDefault(),q(a)&&d.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var e=d.dataTransfer.effectAllowed;d.dataTransfer.dropEffect="move"===e||"linkMove"===e?"move":"copy"}j.cancel(p),a.actualDragOverClass||(o=l(a,c,d)),b.addClass(o)}},!1),b[0].addEventListener("dragenter",function(b){t(a)||(b.preventDefault(),q(a)&&b.stopPropagation())},!1),b[0].addEventListener("dragleave",function(){t(a)||(p=j(function(){b.removeClass(o),o=null},r||1))},!1),b[0].addEventListener("drop",function(d){t(a)||(d.preventDefault(),q(a)&&d.stopPropagation(),b.removeClass(o),o=null,m(d,function(b,f){e(h,j,a,g,c,c.ngFileChange||c.ngFileDrop,b,f,d)},0!=h(c.allowDir)(a),c.multiple||h(c.ngMultiple)(a)))},!1)}function d(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}function e(a,b,c,d,e,f,g,h,i,j){function k(){d&&(a(e.ngModel).assign(c,g),b(function(){d&&d.$setViewValue(null!=g&&0==g.length?null:g)})),e.ngModelRejected&&a(e.ngModelRejected).assign(c,h),f&&a(f)(c,{$files:g,$rejectedFiles:h,$event:i})}console.log("aa "+g),j?k():b(function(){k()})}function f(a,b,c,d){var e=b(a,{$file:c,$event:d});if(null==e)return!0;if(angular.isString(e)){var f=new RegExp(g(e),"gi");e=null!=c.type&&c.type.match(f)||null!=c.name&&c.name.match(f)}return e}function g(a){if(a.length>2&&"/"===a[0]&&"/"===a[a.length-1])return a.substring(1,a.length-1);var b=a.split(","),c="";if(b.length>1)for(i=0;i<b.length;i++)c+="("+g(b[i])+")",i<b.length-1&&(c+="|");else 0==a.indexOf(".")&&(a="*"+a),c="^"+a.replace(new RegExp("[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\-]","g"),"\\$&")+"$",c=c.replace(/\\\*/g,".*").replace(/\\\?/g,".");return c}var h,i;window.XMLHttpRequest&&!window.XMLHttpRequest.__isFileAPIShim&&a("setRequestHeader",function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}});var j=angular.module("angularFileUpload",[]);j.version="3.2.0",j.service("$upload",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{},d.transformRequest=d.transformRequest||function(b,c){return window.ArrayBuffer&&b instanceof window.ArrayBuffer?b:a.defaults.transformRequest[0](b,c)};var e=b.defer(),f=e.promise;return d.headers.__setXHR_=function(){return function(a){a&&(d.__XHR=a,d.xhrFn&&d.xhrFn(a),a.upload.addEventListener("progress",function(a){a.config=d,e.notify?e.notify(a):f.progress_fn&&c(function(){f.progress_fn(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progress_fn&&c(function(){f.progress_fn(a)}))},!1))}},a(d).then(function(a){e.resolve(a)},function(a){e.reject(a)},function(a){e.notify(a)}),f.success=function(a){return f.then(function(b){a(b.data,b.status,b.headers,d)}),f},f.error=function(a){return f.then(null,function(b){a(b.data,b.status,b.headers,d)}),f},f.progress=function(a){return f.progress_fn=a,f.then(null,null,function(b){a(b)}),f},f.abort=function(){return d.__XHR&&c(function(){d.__XHR.abort()}),f},f.xhr=function(a){return d.xhrFn=function(b){return function(){b&&b.apply(f,arguments),a.apply(f,arguments)}}(d.xhrFn),f},f}this.upload=function(a){return a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?"[object Array]"===Object.prototype.toString.call(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(b){var c=new FormData,d={};for(h in a.fields)a.fields.hasOwnProperty(h)&&(d[h]=a.fields[h]);if(b&&(d.data=b),a.formDataAppender)for(h in d)d.hasOwnProperty(h)&&a.formDataAppender(c,h,d[h]);else for(h in d)if(d.hasOwnProperty(h)){var e=d[h];void 0!==e&&("[object String]"===Object.prototype.toString.call(e)?c.append(h,e):a.sendObjectsAsJsonBlob&&"object"==typeof e?c.append(h,new Blob([e],{type:"application/json"})):c.append(h,JSON.stringify(e)))}if(null!=a.file){var f=a.fileFormDataName||"file";if("[object Array]"===Object.prototype.toString.call(a.file)){var g="[object String]"===Object.prototype.toString.call(f);for(i=0;i<a.file.length;i++)c.append(g?f:f[i],a.file[i],a.fileName&&a.fileName[i]||a.file[i].name)}else c.append(f,a.file,a.fileName||a.file.name)}return c}),d(a)},this.http=function(a){return d(a)}}]),j.directive("ngFileSelect",["$parse","$timeout","$compile",function(a,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){b(e,f,g,h,a,c,d)}}}]),j.directive("ngFileDrop",["$parse","$timeout","$location",function(a,b,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){c(e,f,g,h,a,b,d)}}}]),j.directive("ngNoFileDrop",function(){return function(a,b){d()&&b.css("display","none")}}),j.directive("ngFileDropAvailable",["$parse","$timeout",function(a,b){return function(c,e,f){if(d()){var g=a(f.ngFileDropAvailable);b(function(){g(c)})}}}]);var k=angular.module("ngFileUpload",[]);for(h in j)j.hasOwnProperty(h)&&(k[h]=j[h])}(),function(){function a(a,b){window.XMLHttpRequest.prototype[a]=b(window.XMLHttpRequest.prototype[a])}function b(a,b,c){try{Object.defineProperty(a,b,{get:c})}catch(d){}}var c=function(){try{var a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");if(a)return!0}catch(b){if(void 0!=navigator.mimeTypes["application/x-shockwave-flash"])return!0}return!1};if(window.XMLHttpRequest&&!window.FormData||window.FileAPI&&FileAPI.forceLoad){var d=function(a){if(!a.__listeners){a.upload||(a.upload={}),a.__listeners=[];var b=a.upload.addEventListener;a.upload.addEventListener=function(c,d){a.__listeners[c]=d,b&&b.apply(this,arguments)}}};a("open",function(a){return function(b,c,e){d(this),this.__url=c;try{a.apply(this,[b,c,e])}catch(f){f.message.indexOf("Access is denied")>-1&&(this.__origError=f,a.apply(this,[b,"_fix_for_ie_crossdomain__",e]))}}}),a("getResponseHeader",function(a){return function(b){return this.__fileApiXHR&&this.__fileApiXHR.getResponseHeader?this.__fileApiXHR.getResponseHeader(b):null==a?null:a.apply(this,[b])}}),a("getAllResponseHeaders",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.getAllResponseHeaders?this.__fileApiXHR.getAllResponseHeaders():null==a?null:a.apply(this)}}),a("abort",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.abort?this.__fileApiXHR.abort():null==a?null:a.apply(this)}}),a("setRequestHeader",function(a){return function(b,c){if("__setXHR_"===b){d(this);var e=c(this);e instanceof Function&&e(this)}else this.__requestHeaders=this.__requestHeaders||{},this.__requestHeaders[b]=c,a.apply(this,arguments)}}),a("send",function(a){return function(){var d=this;if(arguments[0]&&arguments[0].__isFileAPIShim){var e=arguments[0],f={url:d.__url,jsonp:!1,cache:!0,complete:function(a,c){d.__completed=!0,!a&&d.__listeners.load&&d.__listeners.load({type:"load",loaded:d.__loaded,total:d.__total,target:d,lengthComputable:!0}),!a&&d.__listeners.loadend&&d.__listeners.loadend({type:"loadend",loaded:d.__loaded,total:d.__total,target:d,lengthComputable:!0}),"abort"===a&&d.__listeners.abort&&d.__listeners.abort({type:"abort",loaded:d.__loaded,total:d.__total,target:d,lengthComputable:!0}),void 0!==c.status&&b(d,"status",function(){return 0==c.status&&a&&"abort"!==a?500:c.status}),void 0!==c.statusText&&b(d,"statusText",function(){return c.statusText}),b(d,"readyState",function(){return 4}),void 0!==c.response&&b(d,"response",function(){return c.response});var e=c.responseText||(a&&0==c.status&&"abort"!==a?a:void 0);b(d,"responseText",function(){return e}),b(d,"response",function(){return e}),a&&b(d,"err",function(){return a}),d.__fileApiXHR=c,d.onreadystatechange&&d.onreadystatechange(),d.onload&&d.onload()},fileprogress:function(a){if(a.target=d,d.__listeners.progress&&d.__listeners.progress(a),d.__total=a.total,d.__loaded=a.loaded,a.total===a.loaded){var b=this;setTimeout(function(){d.__completed||(d.getAllResponseHeaders=function(){},b.complete(null,{status:204,statusText:"No Content"}))},FileAPI.noContentTimeout||1e4)}},headers:d.__requestHeaders};f.data={},f.files={};for(var g=0;g<e.data.length;g++){var h=e.data[g];null!=h.val&&null!=h.val.name&&null!=h.val.size&&null!=h.val.type?f.files[h.key]=h.val:f.data[h.key]=h.val}setTimeout(function(){if(!c())throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';d.__fileApiXHR=FileAPI.upload(f)},1)}else{if(this.__origError)throw this.__origError;a.apply(d,arguments)}}}),window.XMLHttpRequest.__isFileAPIShim=!0;var e=function(a){if(!c())throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';var b=angular.element(a);if(!b.attr("disabled")){for(var d=!1,e=0;e<b[0].attributes.length;e++){var f=b[0].attributes[e];if(-1!==f.name.indexOf("file-select")){d=!0;break}}if(!b.hasClass("js-fileapi-wrapper")&&(d||null!=b.attr("__afu_gen__"))&&(b.addClass("js-fileapi-wrapper"),null!=b.attr("__afu_gen__"))){for(var g=b[0].__refElem__&&angular.element(b[0].__refElem__)||b;g&&!g.attr("__refElem__");)g=angular.element(g[0].nextSibling);g.bind("mouseover",function(){(""===b.parent().css("position")||"static"===b.parent().css("position"))&&b.parent().css("position","relative"),b.css("position","absolute").css("top",g[0].offsetTop+"px").css("left",g[0].offsetLeft+"px").css("width",g[0].offsetWidth+"px").css("height",g[0].offsetHeight+"px").css("padding",g.css("padding")).css("margin",g.css("margin")).css("filter","alpha(opacity=0)"),g.attr("onclick",""),b.css("z-index","1000")})}}},f=function(a){return function(b){for(var c=FileAPI.getFiles(b),d=0;d<c.length;d++)void 0===c[d].size&&(c[d].size=0),void 0===c[d].name&&(c[d].name="file"),void 0===c[d].type&&(c[d].type="undefined");b.target||(b.target={}),b.target.files=c,b.target.files!=c&&(b.__files_=c),(b.__files_||b.target.files).item=function(a){return(b.__files_||b.target.files)[a]||null},a&&a.apply(this,[b])}},g=function(a,b){return("change"===b.toLowerCase()||"onchange"===b.toLowerCase())&&"file"==a.getAttribute("type")};HTMLInputElement.prototype.addEventListener&&(HTMLInputElement.prototype.addEventListener=function(a){return function(b,c,d,h){g(this,b)?(e(this),a.apply(this,[b,f(c),d,h])):a.apply(this,[b,c,d,h])}}(HTMLInputElement.prototype.addEventListener)),HTMLInputElement.prototype.attachEvent&&(HTMLInputElement.prototype.attachEvent=function(a){return function(b,c){g(this,b)?(e(this),window.jQuery?angular.element(this).bind("change",f(null)):a.apply(this,[b,f(c)])):a.apply(this,[b,c])}}(HTMLInputElement.prototype.attachEvent)),window.FormData=FormData=function(){return{append:function(a,b,c){b.__isFileAPIBlobShim&&(b=b.data[0]),this.data.push({key:a,val:b,name:c})},data:[],__isFileAPIShim:!0}},window.Blob=Blob=function(a){return{data:a,__isFileAPIBlobShim:!0}},function(){if(window.FileAPI||(window.FileAPI={}),FileAPI.forceLoad&&(FileAPI.html5=!1),!FileAPI.upload){var a,b,d,e,f,g=document.createElement("script"),h=document.getElementsByTagName("script");if(window.FileAPI.jsUrl)a=window.FileAPI.jsUrl;else if(window.FileAPI.jsPath)b=window.FileAPI.jsPath;else for(d=0;d<h.length;d++)if(f=h[d].src,e=f.search(/\/angular\-file\-upload[\-a-zA-z0-9\.]*\.js/),e>-1){b=f.substring(0,e+1);break}null==FileAPI.staticPath&&(FileAPI.staticPath=b),g.setAttribute("src",a||b+"FileAPI.min.js"),document.getElementsByTagName("head")[0].appendChild(g),FileAPI.hasFlash=c()}}(),FileAPI.disableFileInput=function(a,b){b?a.removeClass("js-fileapi-wrapper"):a.addClass("js-fileapi-wrapper")}}window.FileReader||(window.FileReader=function(){var a=this,b=!1;this.listeners={},this.addEventListener=function(b,c){a.listeners[b]=a.listeners[b]||[],a.listeners[b].push(c)},this.removeEventListener=function(b,c){a.listeners[b]&&a.listeners[b].splice(a.listeners[b].indexOf(c),1)},this.dispatchEvent=function(b){var c=a.listeners[b.type];if(c)for(var d=0;d<c.length;d++)c[d].call(a,b)},this.onabort=this.onerror=this.onload=this.onloadstart=this.onloadend=this.onprogress=null;var c=function(b,c){var d={type:b,target:a,loaded:c.loaded,total:c.total,error:c.error};return null!=c.result&&(d.target.result=c.result),d},d=function(d){if(b||(b=!0,a.onloadstart&&a.onloadstart(c("loadstart",d))),"load"===d.type){a.onloadend&&a.onloadend(c("loadend",d));var e=c("load",d);a.onload&&a.onload(e),a.dispatchEvent(e)}else if("progress"===d.type){var e=c("progress",d);a.onprogress&&a.onprogress(e),a.dispatchEvent(e)}else{var e=c("error",d);a.onerror&&a.onerror(e),a.dispatchEvent(e)}};this.readAsArrayBuffer=function(a){FileAPI.readAsBinaryString(a,d)},this.readAsBinaryString=function(a){FileAPI.readAsBinaryString(a,d)},this.readAsDataURL=function(a){FileAPI.readAsDataURL(a,d)},this.readAsText=function(a){FileAPI.readAsText(a,d)}})}();

@@ -5,3 +5,3 @@ /**!

* @author Danial <danial.farid@gmail.com>
* @version 3.1.2
* @version 3.2.0
*/

@@ -8,0 +8,0 @@

@@ -1,2 +0,2 @@

/*! 3.1.2 */
/*! 3.2.0 */
!function(){function a(a,b){window.XMLHttpRequest.prototype[a]=b(window.XMLHttpRequest.prototype[a])}function b(a,b,c){try{Object.defineProperty(a,b,{get:c})}catch(d){}}var c=function(){try{var a=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");if(a)return!0}catch(b){if(void 0!=navigator.mimeTypes["application/x-shockwave-flash"])return!0}return!1};if(window.XMLHttpRequest&&!window.FormData||window.FileAPI&&FileAPI.forceLoad){var d=function(a){if(!a.__listeners){a.upload||(a.upload={}),a.__listeners=[];var b=a.upload.addEventListener;a.upload.addEventListener=function(c,d){a.__listeners[c]=d,b&&b.apply(this,arguments)}}};a("open",function(a){return function(b,c,e){d(this),this.__url=c;try{a.apply(this,[b,c,e])}catch(f){f.message.indexOf("Access is denied")>-1&&(this.__origError=f,a.apply(this,[b,"_fix_for_ie_crossdomain__",e]))}}}),a("getResponseHeader",function(a){return function(b){return this.__fileApiXHR&&this.__fileApiXHR.getResponseHeader?this.__fileApiXHR.getResponseHeader(b):null==a?null:a.apply(this,[b])}}),a("getAllResponseHeaders",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.getAllResponseHeaders?this.__fileApiXHR.getAllResponseHeaders():null==a?null:a.apply(this)}}),a("abort",function(a){return function(){return this.__fileApiXHR&&this.__fileApiXHR.abort?this.__fileApiXHR.abort():null==a?null:a.apply(this)}}),a("setRequestHeader",function(a){return function(b,c){if("__setXHR_"===b){d(this);var e=c(this);e instanceof Function&&e(this)}else this.__requestHeaders=this.__requestHeaders||{},this.__requestHeaders[b]=c,a.apply(this,arguments)}}),a("send",function(a){return function(){var d=this;if(arguments[0]&&arguments[0].__isFileAPIShim){var e=arguments[0],f={url:d.__url,jsonp:!1,cache:!0,complete:function(a,c){d.__completed=!0,!a&&d.__listeners.load&&d.__listeners.load({type:"load",loaded:d.__loaded,total:d.__total,target:d,lengthComputable:!0}),!a&&d.__listeners.loadend&&d.__listeners.loadend({type:"loadend",loaded:d.__loaded,total:d.__total,target:d,lengthComputable:!0}),"abort"===a&&d.__listeners.abort&&d.__listeners.abort({type:"abort",loaded:d.__loaded,total:d.__total,target:d,lengthComputable:!0}),void 0!==c.status&&b(d,"status",function(){return 0==c.status&&a&&"abort"!==a?500:c.status}),void 0!==c.statusText&&b(d,"statusText",function(){return c.statusText}),b(d,"readyState",function(){return 4}),void 0!==c.response&&b(d,"response",function(){return c.response});var e=c.responseText||(a&&0==c.status&&"abort"!==a?a:void 0);b(d,"responseText",function(){return e}),b(d,"response",function(){return e}),a&&b(d,"err",function(){return a}),d.__fileApiXHR=c,d.onreadystatechange&&d.onreadystatechange(),d.onload&&d.onload()},fileprogress:function(a){if(a.target=d,d.__listeners.progress&&d.__listeners.progress(a),d.__total=a.total,d.__loaded=a.loaded,a.total===a.loaded){var b=this;setTimeout(function(){d.__completed||(d.getAllResponseHeaders=function(){},b.complete(null,{status:204,statusText:"No Content"}))},FileAPI.noContentTimeout||1e4)}},headers:d.__requestHeaders};f.data={},f.files={};for(var g=0;g<e.data.length;g++){var h=e.data[g];null!=h.val&&null!=h.val.name&&null!=h.val.size&&null!=h.val.type?f.files[h.key]=h.val:f.data[h.key]=h.val}setTimeout(function(){if(!c())throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';d.__fileApiXHR=FileAPI.upload(f)},1)}else{if(this.__origError)throw this.__origError;a.apply(d,arguments)}}}),window.XMLHttpRequest.__isFileAPIShim=!0;var e=function(a){if(!c())throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';var b=angular.element(a);if(!b.attr("disabled")){for(var d=!1,e=0;e<b[0].attributes.length;e++){var f=b[0].attributes[e];if(-1!==f.name.indexOf("file-select")){d=!0;break}}if(!b.hasClass("js-fileapi-wrapper")&&(d||null!=b.attr("__afu_gen__"))&&(b.addClass("js-fileapi-wrapper"),null!=b.attr("__afu_gen__"))){for(var g=b[0].__refElem__&&angular.element(b[0].__refElem__)||b;g&&!g.attr("__refElem__");)g=angular.element(g[0].nextSibling);g.bind("mouseover",function(){(""===b.parent().css("position")||"static"===b.parent().css("position"))&&b.parent().css("position","relative"),b.css("position","absolute").css("top",g[0].offsetTop+"px").css("left",g[0].offsetLeft+"px").css("width",g[0].offsetWidth+"px").css("height",g[0].offsetHeight+"px").css("padding",g.css("padding")).css("margin",g.css("margin")).css("filter","alpha(opacity=0)"),g.attr("onclick",""),b.css("z-index","1000")})}}},f=function(a){return function(b){for(var c=FileAPI.getFiles(b),d=0;d<c.length;d++)void 0===c[d].size&&(c[d].size=0),void 0===c[d].name&&(c[d].name="file"),void 0===c[d].type&&(c[d].type="undefined");b.target||(b.target={}),b.target.files=c,b.target.files!=c&&(b.__files_=c),(b.__files_||b.target.files).item=function(a){return(b.__files_||b.target.files)[a]||null},a&&a.apply(this,[b])}},g=function(a,b){return("change"===b.toLowerCase()||"onchange"===b.toLowerCase())&&"file"==a.getAttribute("type")};HTMLInputElement.prototype.addEventListener&&(HTMLInputElement.prototype.addEventListener=function(a){return function(b,c,d,h){g(this,b)?(e(this),a.apply(this,[b,f(c),d,h])):a.apply(this,[b,c,d,h])}}(HTMLInputElement.prototype.addEventListener)),HTMLInputElement.prototype.attachEvent&&(HTMLInputElement.prototype.attachEvent=function(a){return function(b,c){g(this,b)?(e(this),window.jQuery?angular.element(this).bind("change",f(null)):a.apply(this,[b,f(c)])):a.apply(this,[b,c])}}(HTMLInputElement.prototype.attachEvent)),window.FormData=FormData=function(){return{append:function(a,b,c){b.__isFileAPIBlobShim&&(b=b.data[0]),this.data.push({key:a,val:b,name:c})},data:[],__isFileAPIShim:!0}},window.Blob=Blob=function(a){return{data:a,__isFileAPIBlobShim:!0}},function(){if(window.FileAPI||(window.FileAPI={}),FileAPI.forceLoad&&(FileAPI.html5=!1),!FileAPI.upload){var a,b,d,e,f,g=document.createElement("script"),h=document.getElementsByTagName("script");if(window.FileAPI.jsUrl)a=window.FileAPI.jsUrl;else if(window.FileAPI.jsPath)b=window.FileAPI.jsPath;else for(d=0;d<h.length;d++)if(f=h[d].src,e=f.search(/\/angular\-file\-upload[\-a-zA-z0-9\.]*\.js/),e>-1){b=f.substring(0,e+1);break}null==FileAPI.staticPath&&(FileAPI.staticPath=b),g.setAttribute("src",a||b+"FileAPI.min.js"),document.getElementsByTagName("head")[0].appendChild(g),FileAPI.hasFlash=c()}}(),FileAPI.disableFileInput=function(a,b){b?a.removeClass("js-fileapi-wrapper"):a.addClass("js-fileapi-wrapper")}}window.FileReader||(window.FileReader=function(){var a=this,b=!1;this.listeners={},this.addEventListener=function(b,c){a.listeners[b]=a.listeners[b]||[],a.listeners[b].push(c)},this.removeEventListener=function(b,c){a.listeners[b]&&a.listeners[b].splice(a.listeners[b].indexOf(c),1)},this.dispatchEvent=function(b){var c=a.listeners[b.type];if(c)for(var d=0;d<c.length;d++)c[d].call(a,b)},this.onabort=this.onerror=this.onload=this.onloadstart=this.onloadend=this.onprogress=null;var c=function(b,c){var d={type:b,target:a,loaded:c.loaded,total:c.total,error:c.error};return null!=c.result&&(d.target.result=c.result),d},d=function(d){if(b||(b=!0,a.onloadstart&&a.onloadstart(c("loadstart",d))),"load"===d.type){a.onloadend&&a.onloadend(c("loadend",d));var e=c("load",d);a.onload&&a.onload(e),a.dispatchEvent(e)}else if("progress"===d.type){var e=c("progress",d);a.onprogress&&a.onprogress(e),a.dispatchEvent(e)}else{var e=c("error",d);a.onerror&&a.onerror(e),a.dispatchEvent(e)}};this.readAsArrayBuffer=function(a){FileAPI.readAsBinaryString(a,d)},this.readAsBinaryString=function(a){FileAPI.readAsBinaryString(a,d)},this.readAsDataURL=function(a){FileAPI.readAsDataURL(a,d)},this.readAsText=function(a){FileAPI.readAsText(a,d)}})}();
/**!
* AngularJS file upload/drop directive and service with progress and abort
* @author Danial <danial.farid@gmail.com>
* @version 3.1.2
* @version 3.2.0
*/
(function() {
(function () {
var key, i;
function patchXHR(fnName, newFn) {
window.XMLHttpRequest.prototype[fnName] = newFn(window.XMLHttpRequest.prototype[fnName]);
window.XMLHttpRequest.prototype[fnName] = newFn(window.XMLHttpRequest.prototype[fnName]);
}
if (window.XMLHttpRequest && !window.XMLHttpRequest.__isFileAPIShim) {
patchXHR('setRequestHeader', function(orig) {
return function(header, value) {
if (header === '__setXHR_') {
var val = value(this);
// fix for angular < 1.2.0
if (val instanceof Function) {
val(this);
}
} else {
orig.apply(this, arguments);
}
}
});
patchXHR('setRequestHeader', function (orig) {
return function (header, value) {
if (header === '__setXHR_') {
var val = value(this);
// fix for angular < 1.2.0
if (val instanceof Function) {
val(this);
}
} else {
orig.apply(this, arguments);
}
}
});
}
var angularFileUpload = angular.module('angularFileUpload', []);
angularFileUpload.version = '3.1.2';
angularFileUpload.service('$upload', ['$http', '$q', '$timeout', function($http, $q, $timeout) {
function sendHttp(config) {
config.method = config.method || 'POST';
config.headers = config.headers || {};
config.transformRequest = config.transformRequest || function(data, headersGetter) {
if (window.ArrayBuffer && data instanceof window.ArrayBuffer) {
return data;
}
return $http.defaults.transformRequest[0](data, headersGetter);
};
var deferred = $q.defer();
var promise = deferred.promise;
angularFileUpload.version = '3.2.0';
angularFileUpload.service('$upload', ['$http', '$q', '$timeout', function ($http, $q, $timeout) {
function sendHttp(config) {
config.method = config.method || 'POST';
config.headers = config.headers || {};
config.transformRequest = config.transformRequest || function (data, headersGetter) {
if (window.ArrayBuffer && data instanceof window.ArrayBuffer) {
return data;
}
return $http.defaults.transformRequest[0](data, headersGetter);
};
var deferred = $q.defer();
var promise = deferred.promise;
config.headers['__setXHR_'] = function() {
return function(xhr) {
if (!xhr) return;
config.__XHR = xhr;
config.xhrFn && config.xhrFn(xhr);
xhr.upload.addEventListener('progress', function(e) {
e.config = config;
deferred.notify ? deferred.notify(e) : promise.progress_fn && $timeout(function(){promise.progress_fn(e)});
}, false);
//fix for firefox not firing upload progress end, also IE8-9
xhr.upload.addEventListener('load', function(e) {
if (e.lengthComputable) {
e.config = config;
deferred.notify ? deferred.notify(e) : promise.progress_fn && $timeout(function(){promise.progress_fn(e)});
}
}, false);
};
};
config.headers['__setXHR_'] = function () {
return function (xhr) {
if (!xhr) return;
config.__XHR = xhr;
config.xhrFn && config.xhrFn(xhr);
xhr.upload.addEventListener('progress', function (e) {
e.config = config;
deferred.notify ? deferred.notify(e) : promise.progress_fn && $timeout(function () {
promise.progress_fn(e)
});
}, false);
//fix for firefox not firing upload progress end, also IE8-9
xhr.upload.addEventListener('load', function (e) {
if (e.lengthComputable) {
e.config = config;
deferred.notify ? deferred.notify(e) : promise.progress_fn && $timeout(function () {
promise.progress_fn(e)
});
}
}, false);
};
};
$http(config).then(function(r){deferred.resolve(r)}, function(e){deferred.reject(e)}, function(n){deferred.notify(n)});
promise.success = function(fn) {
promise.then(function(response) {
fn(response.data, response.status, response.headers, config);
});
return promise;
};
$http(config).then(function (r) {
deferred.resolve(r)
}, function (e) {
deferred.reject(e)
}, function (n) {
deferred.notify(n)
});
promise.error = function(fn) {
promise.then(null, function(response) {
fn(response.data, response.status, response.headers, config);
});
return promise;
};
promise.success = function (fn) {
promise.then(function (response) {
fn(response.data, response.status, response.headers, config);
});
return promise;
};
promise.progress = function(fn) {
promise.progress_fn = fn;
promise.then(null, null, function(update) {
fn(update);
});
return promise;
};
promise.abort = function() {
if (config.__XHR) {
$timeout(function() {
config.__XHR.abort();
});
}
return promise;
};
promise.xhr = function(fn) {
config.xhrFn = (function(origXhrFn) {
return function() {
origXhrFn && origXhrFn.apply(promise, arguments);
fn.apply(promise, arguments);
}
})(config.xhrFn);
return promise;
};
return promise;
}
promise.error = function (fn) {
promise.then(null, function (response) {
fn(response.data, response.status, response.headers, config);
});
return promise;
};
this.upload = function(config) {
config.headers = config.headers || {};
config.headers['Content-Type'] = undefined;
var origTransformRequest = config.transformRequest;
config.transformRequest = config.transformRequest ?
(Object.prototype.toString.call(config.transformRequest) === '[object Array]' ?
config.transformRequest : [config.transformRequest]) : [];
config.transformRequest.push(function(data, headerGetter) {
var formData = new FormData();
var allFields = {};
for (var key in config.fields) allFields[key] = config.fields[key];
if (data) allFields['data'] = data;
if (config.formDataAppender) {
for (var key in allFields) {
config.formDataAppender(formData, key, allFields[key]);
}
} else {
for (var key in allFields) {
var val = allFields[key];
if (val !== undefined) {
if (Object.prototype.toString.call(val) === '[object String]') {
formData.append(key, val);
} else {
if (config.sendObjectsAsJsonBlob && typeof val === 'object') {
formData.append(key, new Blob([val], { type: 'application/json' }));
} else {
formData.append(key, JSON.stringify(val));
}
}
}
}
}
promise.progress = function (fn) {
promise.progress_fn = fn;
promise.then(null, null, function (update) {
fn(update);
});
return promise;
};
promise.abort = function () {
if (config.__XHR) {
$timeout(function () {
config.__XHR.abort();
});
}
return promise;
};
promise.xhr = function (fn) {
config.xhrFn = (function (origXhrFn) {
return function () {
origXhrFn && origXhrFn.apply(promise, arguments);
fn.apply(promise, arguments);
}
})(config.xhrFn);
return promise;
};
if (config.file != null) {
var fileFormName = config.fileFormDataName || 'file';
return promise;
}
if (Object.prototype.toString.call(config.file) === '[object Array]') {
var isFileFormNameString = Object.prototype.toString.call(fileFormName) === '[object String]';
for (var i = 0; i < config.file.length; i++) {
formData.append(isFileFormNameString ? fileFormName : fileFormName[i], config.file[i],
(config.fileName && config.fileName[i]) || config.file[i].name);
}
} else {
formData.append(fileFormName, config.file, config.fileName || config.file.name);
}
}
return formData;
});
this.upload = function (config) {
config.headers = config.headers || {};
config.headers['Content-Type'] = undefined;
config.transformRequest = config.transformRequest ?
(Object.prototype.toString.call(config.transformRequest) === '[object Array]' ?
config.transformRequest : [config.transformRequest]) : [];
config.transformRequest.push(function (data) {
var formData = new FormData();
var allFields = {};
for (key in config.fields) {
if (config.fields.hasOwnProperty(key)) {
allFields[key] = config.fields[key];
}
}
if (data) allFields['data'] = data;
return sendHttp(config);
};
if (config.formDataAppender) {
for (key in allFields) {
if (allFields.hasOwnProperty(key)) {
config.formDataAppender(formData, key, allFields[key]);
}
}
} else {
for (key in allFields) {
if (allFields.hasOwnProperty(key)) {
var val = allFields[key];
if (val !== undefined) {
if (Object.prototype.toString.call(val) === '[object String]') {
formData.append(key, val);
} else {
if (config.sendObjectsAsJsonBlob && typeof val === 'object') {
formData.append(key, new Blob([val], {type: 'application/json'}));
} else {
formData.append(key, JSON.stringify(val));
}
}
this.http = function(config) {
return sendHttp(config);
};
}
}
}
}
if (config.file != null) {
var fileFormName = config.fileFormDataName || 'file';
if (Object.prototype.toString.call(config.file) === '[object Array]') {
var isFileFormNameString = Object.prototype.toString.call(fileFormName) === '[object String]';
for (i = 0; i < config.file.length; i++) {
formData.append(isFileFormNameString ? fileFormName : fileFormName[i], config.file[i],
(config.fileName && config.fileName[i]) || config.file[i].name);
}
} else {
formData.append(fileFormName, config.file, config.fileName || config.file.name);
}
}
return formData;
});
return sendHttp(config);
};
this.http = function (config) {
return sendHttp(config);
};
}]);
angularFileUpload.directive('ngFileSelect', [ '$parse', '$timeout', '$compile',
function($parse, $timeout, $compile) { return {
restrict: 'AEC',
require:'?ngModel',
link: function(scope, elem, attr, ngModel) {
handleFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile);
}
}}]);
angularFileUpload.directive('ngFileSelect', ['$parse', '$timeout', '$compile',
function ($parse, $timeout, $compile) {
return {
restrict: 'AEC',
require: '?ngModel',
link: function (scope, elem, attr, ngModel) {
linkFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile);
}
}
}]);
function handleFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile) {
function isInputTypeFile() {
return elem[0].tagName.toLowerCase() === 'input' && elem.attr('type') && elem.attr('type').toLowerCase() === 'file';
}
var watchers = [];
function linkFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile) {
function isInputTypeFile() {
return elem[0].tagName.toLowerCase() === 'input' && elem.attr('type') && elem.attr('type').toLowerCase() === 'file';
}
function watchForRecompile(attrVal) {
$timeout(function() {
if (elem.parent().length) {
watchers.push(scope.$watch(attrVal, function(val, oldVal) {
if (val != oldVal) {
recompileElem();
}
}));
}
});
}
function bindAttrToFileInput(fileElem) {
if (attr.ngMultiple) fileElem.attr('multiple', $parse(attr.ngMultiple)(scope));
if (attr.ngSelectAccept) fileElem.attr('accept', $parse(attr.ngSelectAccept)(scope));
if (attr.ngCapture) fileElem.attr('capture', $parse(attr.ngCapture)(scope));
if (attr.ngDisabled) fileElem.attr('disabled', $parse(attr.ngDisabled)(scope));
function recompileElem() {
var clone = elem.clone();
if (elem.attr('__afu_gen__')) {
angular.element(document.getElementById(elem.attr('id').substring(1))).remove();
}
if (elem.parent().length) {
for (var i = 0; i < watchers.length; i++) {
watchers[i]();
}
elem.replaceWith(clone);
$compile(clone)(scope);
}
return clone;
}
function bindAttr(bindAttr, attrName) {
if (bindAttr) {
watchForRecompile(bindAttr);
var val = $parse(bindAttr)(scope);
if (val) {
elem.attr(attrName, val);
attr[attrName] = val;
} else {
elem.attr(attrName, null);
delete attr[attrName];
}
}
}
bindAttr(attr.ngMultiple, 'multiple');
bindAttr(attr.ngAccept, 'ng-accept');
bindAttr(attr.ngCapture, 'capture');
if (attr['ngFileSelect'] != '') {
attr.ngFileChange = attr.ngFileSelect;
}
function onChangeFn(evt) {
var files = [], fileList, i;
fileList = evt.__files_ || (evt.target && evt.target.files);
updateModel(fileList, attr, ngModel, scope, evt);
};
var fileElem = elem;
if (!isInputTypeFile()) {
fileElem = angular.element('<input type="file">')
if (elem.attr('multiple')) fileElem.attr('multiple', elem.attr('multiple'));
if (elem.attr('accept')) fileElem.attr('accept', elem.attr('accept'));
if (elem.attr('capture')) fileElem.attr('capture', elem.attr('capture'));
for (var key in attr) {
if (key.indexOf('inputFile') == 0) {
var name = key.substring('inputFile'.length);
name = name[0].toLowerCase() + name.substring(1);
fileElem.attr(name, attr[key]);
}
}
var isUpdating = false;
fileElem.bind('change', function(evt) {
if (!isUpdating) {
isUpdating = true;
try {
var fileList = evt.__files_ || (evt.target && evt.target.files);
var files = [], rejFiles = [];
fileElem.css('width', '0px').css('height', '0px').css('position', 'absolute').css('padding', 0).css('margin', 0)
.css('overflow', 'hidden').attr('tabindex', '-1').css('opacity', 0).attr('__afu_gen__', true);
elem.attr('__refElem__', true);
fileElem[0].__refElem__ = elem[0];
elem.parent()[0].insertBefore(fileElem[0], elem[0])
elem.css('overflow', 'hidden');
elem.bind('click', function(e) {
if (!resetAndClick(e)) {
fileElem[0].click();
}
});
} else {
elem.bind('click', resetAndClick);
}
function resetAndClick(evt) {
if (fileElem[0].value != null && fileElem[0].value != '') {
fileElem[0].value = null;
// IE 11 already fires change event when you set the value to null
if (navigator.userAgent.indexOf("Trident/7") === -1) {
onChangeFn({target: {files: []}});
}
}
// if this is manual click trigger we don't need to reset again
if (!elem.attr('__afu_clone__')) {
// fix for IE10 cannot set the value of the input to null programmatically by cloning and replacing input
// IE 11 setting the value to null event will be fired after file change clearing the selected file so
// we just recreate the element for IE 11 as well
if (navigator.appVersion.indexOf("MSIE 10") !== -1 || navigator.userAgent.indexOf("Trident/7") !== -1) {
var clone = recompileElem();
clone.attr('__afu_clone__', true);
clone[0].click();
evt.preventDefault();
evt.stopPropagation();
return true;
}
} else {
elem.attr('__afu_clone__', null);
}
}
fileElem.bind('change', onChangeFn);
elem.on('$destroy', function() {
for (var i = 0; i < watchers.length; i++) {
watchers[i]();
}
if (elem[0] != fileElem[0]) fileElem.remove();
});
watchers.push(scope.$watch(attr.ngModel, function(val, oldVal) {
if (val != oldVal && (val == null || !val.length)) {
if (navigator.appVersion.indexOf("MSIE 10") !== -1) {
recompileElem();
} else {
fileElem[0].value = null;
}
}
}));
function updateModel(fileList, attr, ngModel, scope, evt) {
var files = [], rejFiles = [];
var accept = $parse(attr.ngAccept)(scope);
var regexp = angular.isString(accept) && accept ? new RegExp(globStringToRegex(accept), 'gi') : null;
var acceptFn = regexp ? null : attr.ngAccept;
var accept = $parse(attr.ngAccept);
for (i = 0; i < fileList.length; i++) {
var file = fileList.item(i);
if (isAccepted(scope, accept, file, evt)) {
files.push(file);
} else {
rejFiles.push(file);
}
}
console.log('change' + files);
updateModel($parse, $timeout, scope, ngModel, attr,
attr.ngFileChange || attr.ngFileSelect, files, rejFiles, evt);
if (files.length == 0) fileElem[0].value = files;
if (fileElem.attr('__afu_gen__')) {
fileElem.remove();
}
} finally {
isUpdating = false;
}
}
});
}
for (var i = 0; i < fileList.length; i++) {
var file = fileList.item(i);
if ((!regexp || file.type.match(regexp) || (file.name != null && file.name.match(regexp))) &&
(!acceptFn || $parse(acceptFn)(scope, {$file: file, $event: evt}))) {
files.push(file);
} else {
rejFiles.push(file);
}
}
$timeout(function() {
if (ngModel) {
$parse(attr.ngModel).assign(scope, files);
ngModel && ngModel.$setViewValue(files != null && files.length == 0 ? '' : files);
if (attr.ngModelRejected) {
$parse(attr.ngModelRejected).assign(scope, rejFiles);
}
}
if (attr.ngFileChange && attr.ngFileChange != "") {
$parse(attr.ngFileChange)(scope, {
$files: files,
$rejectedFiles: rejFiles,
$event: evt
});
}
});
}
function clickHandler(evt) {
createAndClickFileInput(evt);
if (isInputTypeFile()) {
evt.preventDefault()
}
}
elem.bind('click', clickHandler);
function createAndClickFileInput(evt) {
if (elem.attr('disabled')) {
return;
}
fileElem = angular.element('<input type="file">');
for (var i = 0; i < elem[0].attributes.length; i++) {
var attribute = elem[0].attributes[i];
fileElem.attr(attribute.name, attribute.value);
}
if (isInputTypeFile()) {
elem.replaceWith(fileElem);
elem = fileElem;
} else {
fileElem.css('width', '0px').css('height', '0px').css('position', 'absolute').css('padding', 0).css('margin', 0)
.css('overflow', 'hidden').attr('tabindex', '-1').css('opacity', 0).attr('__afu_gen__', true);
elem.attr('__refElem__', true);
fileElem[0].__refElem__ = elem[0];
elem.parent()[0].insertBefore(fileElem[0], elem[0]);
elem.css('overflow', 'hidden');
}
bindAttrToFileInput(fileElem);
updateModel($parse, $timeout, scope, ngModel, attr,
attr.ngFileChange || attr.ngFileSelect, [], [], evt, true);
fileElem[0].click();
if (isInputTypeFile()) {
elem.bind('click', clickHandler);
}
}
}
angularFileUpload.directive('ngFileDrop', [ '$parse', '$timeout', '$location', function($parse, $timeout, $location) { return {
restrict: 'AEC',
require:'?ngModel',
link: function(scope, elem, attr, ngModel) {
handleDrop(scope, elem, attr, ngModel, $parse, $timeout, $location);
}
}}]);
angularFileUpload.directive('ngFileDrop', ['$parse', '$timeout', '$location', function ($parse, $timeout, $location) {
return {
restrict: 'AEC',
require: '?ngModel',
link: function (scope, elem, attr, ngModel) {
linkDrop(scope, elem, attr, ngModel, $parse, $timeout, $location);
}
}
}]);
angularFileUpload.directive('ngNoFileDrop', function() {
return function(scope, elem, attr) {
if (dropAvailable()) elem.css('display', 'none')
}
angularFileUpload.directive('ngNoFileDrop', function () {
return function (scope, elem) {
if (dropAvailable()) elem.css('display', 'none')
}
});
//for backward compatibility
angularFileUpload.directive('ngFileDropAvailable', [ '$parse', '$timeout', function($parse, $timeout) {
return function(scope, elem, attr) {
if (dropAvailable()) {
var fn = $parse(attr['ngFileDropAvailable']);
$timeout(function() {
fn(scope);
});
}
}
angularFileUpload.directive('ngFileDropAvailable', ['$parse', '$timeout', function ($parse, $timeout) {
return function (scope, elem, attr) {
if (dropAvailable()) {
var fn = $parse(attr['ngFileDropAvailable']);
$timeout(function () {
fn(scope);
});
}
}
}]);
function handleDrop(scope, elem, attr, ngModel, $parse, $timeout, $location) {
var available = dropAvailable();
if (attr['dropAvailable']) {
$timeout(function() {
scope.dropAvailable ? scope.dropAvailable.value = available : scope.dropAvailable = available;
});
}
if (!available) {
if ($parse(attr.hideOnDropNotAvailable)(scope) != false) {
elem.css('display', 'none');
}
return;
}
var leaveTimeout = null;
var stopPropagation = $parse(attr.stopPropagation)(scope);
var dragOverDelay = 1;
var accept = $parse(attr.ngAccept)(scope) || attr.accept;
var regexp = angular.isString(accept) && accept ? new RegExp(globStringToRegex(accept), 'gi') : null;
var acceptFn = regexp ? null : attr.ngAccept;
var actualDragOverClass;
elem[0].addEventListener('dragover', function(evt) {
evt.preventDefault();
if (stopPropagation) evt.stopPropagation();
// handling dragover events from the Chrome download bar
if (navigator.userAgent.indexOf("Chrome") > -1) {
var b = evt.dataTransfer.effectAllowed;
evt.dataTransfer.dropEffect = ('move' === b || 'linkMove' === b) ? 'move' : 'copy';
}
$timeout.cancel(leaveTimeout);
if (!scope.actualDragOverClass) {
actualDragOverClass = calculateDragOverClass(scope, attr, evt);
}
elem.addClass(actualDragOverClass);
}, false);
elem[0].addEventListener('dragenter', function(evt) {
evt.preventDefault();
if (stopPropagation) evt.stopPropagation();
}, false);
elem[0].addEventListener('dragleave', function(evt) {
leaveTimeout = $timeout(function() {
elem.removeClass(actualDragOverClass);
actualDragOverClass = null;
}, dragOverDelay || 1);
}, false);
if (attr['ngFileDrop'] != '') {
attr.ngFileChange = scope.ngFileDrop;
}
elem[0].addEventListener('drop', function(evt) {
evt.preventDefault();
if (stopPropagation) evt.stopPropagation();
elem.removeClass(actualDragOverClass);
actualDragOverClass = null;
extractFiles(evt, function(files, rejFiles) {
$timeout(function() {
if (ngModel) {
$parse(attr.ngModel).assign(scope, files);
ngModel && ngModel.$setViewValue(files != null && files.length == 0 ? '' : files);
}
if (attr['ngModelRejected']) {
if (scope[attr.ngModelRejected]) {
$parse(attr.ngModelRejected).assign(scope, rejFiles);
}
}
});
$timeout(function() {
$parse(attr.ngFileChange)(scope, {
$files: files,
$rejectedFiles: rejFiles,
$event: evt
});
});
}, $parse(attr.allowDir)(scope) != false, attr.multiple || $parse(attr.ngMultiple)(scope));
}, false);
function calculateDragOverClass(scope, attr, evt) {
var valid = true;
if (regexp || acceptFn) {
var items = evt.dataTransfer.items;
if (items != null) {
for (var i = 0 ; i < items.length && valid; i++) {
valid = valid && (items[i].kind == 'file' || items[i].kind == '') &&
((acceptFn && $parse(acceptFn)(scope, {$file: items[i], $event: evt})) ||
(regexp && (items[i].type != null && items[i].type.match(regexp)) ||
(items[i].name != null && items[i].name.match(regexp))));
}
}
}
var clazz = $parse(attr.dragOverClass)(scope, {$event : evt});
if (clazz) {
if (clazz.delay) dragOverDelay = clazz.delay;
if (clazz.accept) clazz = valid ? clazz.accept : clazz.reject;
}
return clazz || attr['dragOverClass'] || 'dragover';
}
function extractFiles(evt, callback, allowDir, multiple) {
var files = [], rejFiles = [], items = evt.dataTransfer.items, processing = 0;
function addFile(file) {
if ((!regexp || file.type.match(regexp) || (file.name != null && file.name.match(regexp))) &&
(!acceptFn || $parse(acceptFn)(scope, {$file: file, $event: evt}))) {
files.push(file);
} else {
rejFiles.push(file);
}
}
if (items && items.length > 0 && $location.protocol() != 'file') {
for (var i = 0; i < items.length; i++) {
if (items[i].webkitGetAsEntry && items[i].webkitGetAsEntry() && items[i].webkitGetAsEntry().isDirectory) {
var entry = items[i].webkitGetAsEntry();
if (entry.isDirectory && !allowDir) {
continue;
}
if (entry != null) {
traverseFileTree(files, entry);
}
} else {
var f = items[i].getAsFile();
if (f != null) addFile(f);
}
if (!multiple && files.length > 0) break;
}
} else {
var fileList = evt.dataTransfer.files;
if (fileList != null) {
for (var i = 0; i < fileList.length; i++) {
addFile(fileList.item(i));
if (!multiple && files.length > 0) break;
}
}
}
var delays = 0;
(function waitForProcess(delay) {
$timeout(function() {
if (!processing) {
if (!multiple && files.length > 1) {
var i = 0;
while (files[i].type == 'directory') i++;
files = [files[i]];
}
callback(files, rejFiles);
} else {
if (delays++ * 10 < 20 * 1000) {
waitForProcess(10);
}
}
}, delay || 0)
})();
function traverseFileTree(files, entry, path) {
if (entry != null) {
if (entry.isDirectory) {
var filePath = (path || '') + entry.name;
addFile({name: entry.name, type: 'directory', path: filePath});
var dirReader = entry.createReader();
var entries = [];
processing++;
var readEntries = function() {
dirReader.readEntries(function(results) {
try {
if (!results.length) {
for (var i = 0; i < entries.length; i++) {
traverseFileTree(files, entries[i], (path ? path : '') + entry.name + '/');
}
processing--;
} else {
entries = entries.concat(Array.prototype.slice.call(results || [], 0));
readEntries();
}
} catch (e) {
processing--;
console.error(e);
}
}, function() {
processing--;
});
};
readEntries();
} else {
processing++;
entry.file(function(file) {
try {
processing--;
file.path = (path ? path : '') + file.name;
addFile(file);
} catch (e) {
processing--;
console.error(e);
}
}, function(e) {
processing--;
});
}
}
}
}
function linkDrop(scope, elem, attr, ngModel, $parse, $timeout, $location) {
var available = dropAvailable();
if (attr['dropAvailable']) {
$timeout(function () {
scope.dropAvailable ? scope.dropAvailable.value = available : scope.dropAvailable = available;
});
}
if (!available) {
if ($parse(attr.hideOnDropNotAvailable)(scope) != false) {
elem.css('display', 'none');
}
return;
}
var leaveTimeout = null;
var stopPropagation = $parse(attr.stopPropagation);
var dragOverDelay = 1;
var accept = $parse(attr.ngAccept);
var disabled = $parse(attr.ngDisabled);
var actualDragOverClass;
elem[0].addEventListener('dragover', function (evt) {
if (disabled(scope)) return;
evt.preventDefault();
if (stopPropagation(scope)) evt.stopPropagation();
// handling dragover events from the Chrome download bar
if (navigator.userAgent.indexOf("Chrome") > -1) {
var b = evt.dataTransfer.effectAllowed;
evt.dataTransfer.dropEffect = ('move' === b || 'linkMove' === b) ? 'move' : 'copy';
}
$timeout.cancel(leaveTimeout);
if (!scope.actualDragOverClass) {
actualDragOverClass = calculateDragOverClass(scope, attr, evt);
}
elem.addClass(actualDragOverClass);
}, false);
elem[0].addEventListener('dragenter', function (evt) {
if (disabled(scope)) return;
evt.preventDefault();
if (stopPropagation(scope)) evt.stopPropagation();
}, false);
elem[0].addEventListener('dragleave', function () {
if (disabled(scope)) return;
leaveTimeout = $timeout(function () {
elem.removeClass(actualDragOverClass);
actualDragOverClass = null;
}, dragOverDelay || 1);
}, false);
elem[0].addEventListener('drop', function (evt) {
if (disabled(scope)) return;
evt.preventDefault();
if (stopPropagation(scope)) evt.stopPropagation();
elem.removeClass(actualDragOverClass);
actualDragOverClass = null;
extractFiles(evt, function (files, rejFiles) {
updateModel($parse, $timeout, scope, ngModel, attr,
attr.ngFileChange || attr.ngFileDrop, files, rejFiles, evt)
}, $parse(attr.allowDir)(scope) != false, attr.multiple || $parse(attr.ngMultiple)(scope));
}, false);
function calculateDragOverClass(scope, attr, evt) {
var accepted = true;
var items = evt.dataTransfer.items;
if (items != null) {
for (i = 0; i < items.length && accepted; i++) {
accepted = accepted
&& (items[i].kind == 'file' || items[i].kind == '')
&& isAccepted(scope, accept, items[i], evt);
}
}
var clazz = $parse(attr.dragOverClass)(scope, {$event: evt});
if (clazz) {
if (clazz.delay) dragOverDelay = clazz.delay;
if (clazz.accept) clazz = accepted ? clazz.accept : clazz.reject;
}
return clazz || attr['dragOverClass'] || 'dragover';
}
function extractFiles(evt, callback, allowDir, multiple) {
var files = [], rejFiles = [], items = evt.dataTransfer.items, processing = 0;
function addFile(file) {
if (isAccepted(scope, accept, file, evt)) {
files.push(file);
} else {
rejFiles.push(file);
}
}
if (items && items.length > 0 && $location.protocol() != 'file') {
for (i = 0; i < items.length; i++) {
if (items[i].webkitGetAsEntry && items[i].webkitGetAsEntry() && items[i].webkitGetAsEntry().isDirectory) {
var entry = items[i].webkitGetAsEntry();
if (entry.isDirectory && !allowDir) {
continue;
}
if (entry != null) {
traverseFileTree(files, entry);
}
} else {
var f = items[i].getAsFile();
if (f != null) addFile(f);
}
if (!multiple && files.length > 0) break;
}
} else {
var fileList = evt.dataTransfer.files;
if (fileList != null) {
for (i = 0; i < fileList.length; i++) {
addFile(fileList.item(i));
if (!multiple && files.length > 0) break;
}
}
}
var delays = 0;
(function waitForProcess(delay) {
$timeout(function () {
if (!processing) {
if (!multiple && files.length > 1) {
i = 0;
while (files[i].type == 'directory') i++;
files = [files[i]];
}
callback(files, rejFiles);
} else {
if (delays++ * 10 < 20 * 1000) {
waitForProcess(10);
}
}
}, delay || 0)
})();
function traverseFileTree(files, entry, path) {
if (entry != null) {
if (entry.isDirectory) {
var filePath = (path || '') + entry.name;
addFile({name: entry.name, type: 'directory', path: filePath});
var dirReader = entry.createReader();
var entries = [];
processing++;
var readEntries = function () {
dirReader.readEntries(function (results) {
try {
if (!results.length) {
for (i = 0; i < entries.length; i++) {
traverseFileTree(files, entries[i], (path ? path : '') + entry.name + '/');
}
processing--;
} else {
entries = entries.concat(Array.prototype.slice.call(results || [], 0));
readEntries();
}
} catch (e) {
processing--;
console.error(e);
}
}, function () {
processing--;
});
};
readEntries();
} else {
processing++;
entry.file(function (file) {
try {
processing--;
file.path = (path ? path : '') + file.name;
addFile(file);
} catch (e) {
processing--;
console.error(e);
}
}, function () {
processing--;
});
}
}
}
}
}

@@ -574,22 +495,65 @@

function updateModel($parse, $timeout, scope, ngModel, attr, fileChange, files, rejFiles, evt, noDelay) {
console.log('aa ' + files);
function update() {
if (ngModel) {
$parse(attr.ngModel).assign(scope, files);
$timeout(function () {
ngModel && ngModel.$setViewValue(files != null && files.length == 0 ? null : files);
});
}
if (attr.ngModelRejected) {
$parse(attr.ngModelRejected).assign(scope, rejFiles);
}
if (fileChange) {
$parse(fileChange)(scope, {
$files: files,
$rejectedFiles: rejFiles,
$event: evt
});
}
}
if (noDelay) {
update();
} else {
$timeout(function () {
update();
});
}
}
function isAccepted(scope, accept, file, evt) {
var val = accept(scope, {$file: file, $event: evt});
if (val == null) {
return true;
}
if (angular.isString(val)) {
var regexp = new RegExp(globStringToRegex(val), 'gi')
val = (file.type != null && file.type.match(regexp)) ||
(file.name != null && file.name.match(regexp));
}
return val;
}
function globStringToRegex(str) {
if (str.length > 2 && str[0] === '/' && str[str.length -1] === '/') {
return str.substring(1, str.length - 1);
}
var split = str.split(','), result = '';
if (split.length > 1) {
for (var i = 0; i < split.length; i++) {
result += '(' + globStringToRegex(split[i]) + ')';
if (i < split.length - 1) {
result += '|'
}
}
} else {
if (str.indexOf('.') == 0) {
str= '*' + str;
}
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$';
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.');
}
return result;
if (str.length > 2 && str[0] === '/' && str[str.length - 1] === '/') {
return str.substring(1, str.length - 1);
}
var split = str.split(','), result = '';
if (split.length > 1) {
for (i = 0; i < split.length; i++) {
result += '(' + globStringToRegex(split[i]) + ')';
if (i < split.length - 1) {
result += '|'
}
}
} else {
if (str.indexOf('.') == 0) {
str = '*' + str;
}
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$';
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.');
}
return result;
}

@@ -599,6 +563,8 @@

for (var key in angularFileUpload) {
ngFileUpload[key] = angularFileUpload[key];
for (key in angularFileUpload) {
if (angularFileUpload.hasOwnProperty(key)) {
ngFileUpload[key] = angularFileUpload[key];
}
}
})();

@@ -1,2 +0,2 @@

/*! 3.1.2 */
!function(){function a(a,b){window.XMLHttpRequest.prototype[a]=b(window.XMLHttpRequest.prototype[a])}function b(a,b,c,d,f,g,h){function i(){return"input"===b[0].tagName.toLowerCase()&&b.attr("type")&&"file"===b.attr("type").toLowerCase()}function j(c){g(function(){b.parent().length&&p.push(a.$watch(c,function(a,b){a!=b&&k()}))})}function k(){var c=b.clone();if(b.attr("__afu_gen__")&&angular.element(document.getElementById(b.attr("id").substring(1))).remove(),b.parent().length){for(var d=0;d<p.length;d++)p[d]();b.replaceWith(c),h(c)(a)}return c}function l(d,e){if(d){j(d);var g=f(d)(a);g?(b.attr(e,g),c[e]=g):(b.attr(e,null),delete c[e])}}function m(b){var e;e=b.__files_||b.target&&b.target.files,o(e,c,d,a,b)}function n(a){if(null!=q[0].value&&""!=q[0].value&&(q[0].value=null,-1===navigator.userAgent.indexOf("Trident/7")&&m({target:{files:[]}})),b.attr("__afu_clone__"))b.attr("__afu_clone__",null);else if(-1!==navigator.appVersion.indexOf("MSIE 10")||-1!==navigator.userAgent.indexOf("Trident/7")){var c=k();return c.attr("__afu_clone__",!0),c[0].click(),a.preventDefault(),a.stopPropagation(),!0}}function o(a,b,c,d,h){for(var i=[],j=[],k=f(b.ngAccept)(d),l=angular.isString(k)&&k?new RegExp(e(k),"gi"):null,m=l?null:b.ngAccept,n=0;n<a.length;n++){var o=a.item(n);!(!l||o.type.match(l)||null!=o.name&&o.name.match(l))||m&&!f(m)(d,{$file:o,$event:h})?j.push(o):i.push(o)}g(function(){c&&(f(b.ngModel).assign(d,i),c&&c.$setViewValue(null!=i&&0==i.length?"":i),b.ngModelRejected&&f(b.ngModelRejected).assign(d,j)),b.ngFileChange&&""!=b.ngFileChange&&f(b.ngFileChange)(d,{$files:i,$rejectedFiles:j,$event:h})})}var p=[];l(c.ngMultiple,"multiple"),l(c.ngAccept,"ng-accept"),l(c.ngCapture,"capture"),""!=c.ngFileSelect&&(c.ngFileChange=c.ngFileSelect);var q=b;if(i())b.bind("click",n);else{q=angular.element('<input type="file">'),b.attr("multiple")&&q.attr("multiple",b.attr("multiple")),b.attr("accept")&&q.attr("accept",b.attr("accept")),b.attr("capture")&&q.attr("capture",b.attr("capture"));for(var r in c)if(0==r.indexOf("inputFile")){var s=r.substring("inputFile".length);s=s[0].toLowerCase()+s.substring(1),q.attr(s,c[r])}q.css("width","0px").css("height","0px").css("position","absolute").css("padding",0).css("margin",0).css("overflow","hidden").attr("tabindex","-1").css("opacity",0).attr("__afu_gen__",!0),b.attr("__refElem__",!0),q[0].__refElem__=b[0],b.parent()[0].insertBefore(q[0],b[0]),b.css("overflow","hidden"),b.bind("click",function(a){n(a)||q[0].click()})}q.bind("change",m),b.on("$destroy",function(){for(var a=0;a<p.length;a++)p[a]();b[0]!=q[0]&&q.remove()}),p.push(a.$watch(c.ngModel,function(a,b){a==b||null!=a&&a.length||(-1!==navigator.appVersion.indexOf("MSIE 10")?k():q[0].value=null)}))}function c(a,b,c,f,g,h,i){function j(a,b,c){var d=!0;if(r||s){var e=c.dataTransfer.items;if(null!=e)for(var f=0;f<e.length&&d;f++)d=d&&("file"==e[f].kind||""==e[f].kind)&&(s&&g(s)(a,{$file:e[f],$event:c})||r&&null!=e[f].type&&e[f].type.match(r)||null!=e[f].name&&e[f].name.match(r))}var h=g(b.dragOverClass)(a,{$event:c});return h&&(h.delay&&(p=h.delay),h.accept&&(h=d?h.accept:h.reject)),h||b.dragOverClass||"dragover"}function k(b,c,d,e){function f(c){!(!r||c.type.match(r)||null!=c.name&&c.name.match(r))||s&&!g(s)(a,{$file:c,$event:b})?l.push(c):k.push(c)}function j(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;f({name:b.name,type:"directory",path:d});var e=b.createReader(),g=[];n++;var h=function(){e.readEntries(function(d){try{if(d.length)g=g.concat(Array.prototype.slice.call(d||[],0)),h();else{for(var e=0;e<g.length;e++)j(a,g[e],(c?c:"")+b.name+"/");n--}}catch(f){n--,console.error(f)}},function(){n--})};h()}else n++,b.file(function(a){try{n--,a.path=(c?c:"")+a.name,f(a)}catch(b){n--,console.error(b)}},function(){n--})}var k=[],l=[],m=b.dataTransfer.items,n=0;if(m&&m.length>0&&"file"!=i.protocol())for(var o=0;o<m.length;o++){if(m[o].webkitGetAsEntry&&m[o].webkitGetAsEntry()&&m[o].webkitGetAsEntry().isDirectory){var p=m[o].webkitGetAsEntry();if(p.isDirectory&&!d)continue;null!=p&&j(k,p)}else{var q=m[o].getAsFile();null!=q&&f(q)}if(!e&&k.length>0)break}else{var t=b.dataTransfer.files;if(null!=t)for(var o=0;o<t.length&&(f(t.item(o)),e||!(k.length>0));o++);}var u=0;!function v(a){h(function(){if(n)10*u++<2e4&&v(10);else{if(!e&&k.length>1){for(var a=0;"directory"==k[a].type;)a++;k=[k[a]]}c(k,l)}},a||0)}()}var l=d();if(c.dropAvailable&&h(function(){a.dropAvailable?a.dropAvailable.value=l:a.dropAvailable=l}),!l)return 0!=g(c.hideOnDropNotAvailable)(a)&&b.css("display","none"),void 0;var m,n=null,o=g(c.stopPropagation)(a),p=1,q=g(c.ngAccept)(a)||c.accept,r=angular.isString(q)&&q?new RegExp(e(q),"gi"):null,s=r?null:c.ngAccept;b[0].addEventListener("dragover",function(d){if(d.preventDefault(),o&&d.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var e=d.dataTransfer.effectAllowed;d.dataTransfer.dropEffect="move"===e||"linkMove"===e?"move":"copy"}h.cancel(n),a.actualDragOverClass||(m=j(a,c,d)),b.addClass(m)},!1),b[0].addEventListener("dragenter",function(a){a.preventDefault(),o&&a.stopPropagation()},!1),b[0].addEventListener("dragleave",function(){n=h(function(){b.removeClass(m),m=null},p||1)},!1),""!=c.ngFileDrop&&(c.ngFileChange=a.ngFileDrop),b[0].addEventListener("drop",function(d){d.preventDefault(),o&&d.stopPropagation(),b.removeClass(m),m=null,k(d,function(b,e){h(function(){f&&(g(c.ngModel).assign(a,b),f&&f.$setViewValue(null!=b&&0==b.length?"":b)),c.ngModelRejected&&a[c.ngModelRejected]&&g(c.ngModelRejected).assign(a,e)}),h(function(){g(c.ngFileChange)(a,{$files:b,$rejectedFiles:e,$event:d})})},0!=g(c.allowDir)(a),c.multiple||g(c.ngMultiple)(a))},!1)}function d(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}function e(a){if(a.length>2&&"/"===a[0]&&"/"===a[a.length-1])return a.substring(1,a.length-1);var b=a.split(","),c="";if(b.length>1)for(var d=0;d<b.length;d++)c+="("+e(b[d])+")",d<b.length-1&&(c+="|");else 0==a.indexOf(".")&&(a="*"+a),c="^"+a.replace(new RegExp("[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\-]","g"),"\\$&")+"$",c=c.replace(/\\\*/g,".*").replace(/\\\?/g,".");return c}window.XMLHttpRequest&&!window.XMLHttpRequest.__isFileAPIShim&&a("setRequestHeader",function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}});var f=angular.module("angularFileUpload",[]);f.version="3.1.2",f.service("$upload",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{},d.transformRequest=d.transformRequest||function(b,c){return window.ArrayBuffer&&b instanceof window.ArrayBuffer?b:a.defaults.transformRequest[0](b,c)};var e=b.defer(),f=e.promise;return d.headers.__setXHR_=function(){return function(a){a&&(d.__XHR=a,d.xhrFn&&d.xhrFn(a),a.upload.addEventListener("progress",function(a){a.config=d,e.notify?e.notify(a):f.progress_fn&&c(function(){f.progress_fn(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progress_fn&&c(function(){f.progress_fn(a)}))},!1))}},a(d).then(function(a){e.resolve(a)},function(a){e.reject(a)},function(a){e.notify(a)}),f.success=function(a){return f.then(function(b){a(b.data,b.status,b.headers,d)}),f},f.error=function(a){return f.then(null,function(b){a(b.data,b.status,b.headers,d)}),f},f.progress=function(a){return f.progress_fn=a,f.then(null,null,function(b){a(b)}),f},f.abort=function(){return d.__XHR&&c(function(){d.__XHR.abort()}),f},f.xhr=function(a){return d.xhrFn=function(b){return function(){b&&b.apply(f,arguments),a.apply(f,arguments)}}(d.xhrFn),f},f}this.upload=function(a){a.headers=a.headers||{},a.headers["Content-Type"]=void 0;a.transformRequest;return a.transformRequest=a.transformRequest?"[object Array]"===Object.prototype.toString.call(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(b){var c=new FormData,d={};for(var e in a.fields)d[e]=a.fields[e];if(b&&(d.data=b),a.formDataAppender)for(var e in d)a.formDataAppender(c,e,d[e]);else for(var e in d){var f=d[e];void 0!==f&&("[object String]"===Object.prototype.toString.call(f)?c.append(e,f):a.sendObjectsAsJsonBlob&&"object"==typeof f?c.append(e,new Blob([f],{type:"application/json"})):c.append(e,JSON.stringify(f)))}if(null!=a.file){var g=a.fileFormDataName||"file";if("[object Array]"===Object.prototype.toString.call(a.file))for(var h="[object String]"===Object.prototype.toString.call(g),i=0;i<a.file.length;i++)c.append(h?g:g[i],a.file[i],a.fileName&&a.fileName[i]||a.file[i].name);else c.append(g,a.file,a.fileName||a.file.name)}return c}),d(a)},this.http=function(a){return d(a)}}]),f.directive("ngFileSelect",["$parse","$timeout","$compile",function(a,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){b(e,f,g,h,a,c,d)}}}]),f.directive("ngFileDrop",["$parse","$timeout","$location",function(a,b,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){c(e,f,g,h,a,b,d)}}}]),f.directive("ngNoFileDrop",function(){return function(a,b){d()&&b.css("display","none")}}),f.directive("ngFileDropAvailable",["$parse","$timeout",function(a,b){return function(c,e,f){if(d()){var g=a(f.ngFileDropAvailable);b(function(){g(c)})}}}]);var g=angular.module("ngFileUpload",[]);for(var h in f)g[h]=f[h]}();
/*! 3.2.0 */
!function(){function a(a,b){window.XMLHttpRequest.prototype[a]=b(window.XMLHttpRequest.prototype[a])}function b(a,b,c,d,g,h){function j(){return"input"===b[0].tagName.toLowerCase()&&b.attr("type")&&"file"===b.attr("type").toLowerCase()}function k(b){c.ngMultiple&&b.attr("multiple",g(c.ngMultiple)(a)),c.ngSelectAccept&&b.attr("accept",g(c.ngSelectAccept)(a)),c.ngCapture&&b.attr("capture",g(c.ngCapture)(a)),c.ngDisabled&&b.attr("disabled",g(c.ngDisabled)(a));var j=!1;b.bind("change",function(k){if(!j){j=!0;try{var l=k.__files_||k.target&&k.target.files,m=[],n=[],o=g(c.ngAccept);for(i=0;i<l.length;i++){var p=l.item(i);f(a,o,p,k)?m.push(p):n.push(p)}console.log("change"+m),e(g,h,a,d,c,c.ngFileChange||c.ngFileSelect,m,n,k),0==m.length&&(b[0].value=m),b.attr("__afu_gen__")&&b.remove()}finally{j=!1}}})}function l(a){m(a),j()&&a.preventDefault()}function m(f){if(!b.attr("disabled")){fileElem=angular.element('<input type="file">');for(var i=0;i<b[0].attributes.length;i++){var m=b[0].attributes[i];fileElem.attr(m.name,m.value)}j()?(b.replaceWith(fileElem),b=fileElem):(fileElem.css("width","0px").css("height","0px").css("position","absolute").css("padding",0).css("margin",0).css("overflow","hidden").attr("tabindex","-1").css("opacity",0).attr("__afu_gen__",!0),b.attr("__refElem__",!0),fileElem[0].__refElem__=b[0],b.parent()[0].insertBefore(fileElem[0],b[0]),b.css("overflow","hidden")),k(fileElem),e(g,h,a,d,c,c.ngFileChange||c.ngFileSelect,[],[],f,!0),fileElem[0].click(),j()&&b.bind("click",l)}}b.bind("click",l)}function c(a,b,c,g,h,j,k){function l(a,b,c){var d=!0,e=c.dataTransfer.items;if(null!=e)for(i=0;i<e.length&&d;i++)d=d&&("file"==e[i].kind||""==e[i].kind)&&f(a,s,e[i],c);var g=h(b.dragOverClass)(a,{$event:c});return g&&(g.delay&&(r=g.delay),g.accept&&(g=d?g.accept:g.reject)),g||b.dragOverClass||"dragover"}function m(b,c,d,e){function g(c){f(a,s,c,b)?l.push(c):m.push(c)}function h(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;g({name:b.name,type:"directory",path:d});var e=b.createReader(),f=[];o++;var j=function(){e.readEntries(function(d){try{if(d.length)f=f.concat(Array.prototype.slice.call(d||[],0)),j();else{for(i=0;i<f.length;i++)h(a,f[i],(c?c:"")+b.name+"/");o--}}catch(e){o--,console.error(e)}},function(){o--})};j()}else o++,b.file(function(a){try{o--,a.path=(c?c:"")+a.name,g(a)}catch(b){o--,console.error(b)}},function(){o--})}var l=[],m=[],n=b.dataTransfer.items,o=0;if(n&&n.length>0&&"file"!=k.protocol())for(i=0;i<n.length;i++){if(n[i].webkitGetAsEntry&&n[i].webkitGetAsEntry()&&n[i].webkitGetAsEntry().isDirectory){var p=n[i].webkitGetAsEntry();if(p.isDirectory&&!d)continue;null!=p&&h(l,p)}else{var q=n[i].getAsFile();null!=q&&g(q)}if(!e&&l.length>0)break}else{var r=b.dataTransfer.files;if(null!=r)for(i=0;i<r.length&&(g(r.item(i)),e||!(l.length>0));i++);}var t=0;!function u(a){j(function(){if(o)10*t++<2e4&&u(10);else{if(!e&&l.length>1){for(i=0;"directory"==l[i].type;)i++;l=[l[i]]}c(l,m)}},a||0)}()}var n=d();if(c.dropAvailable&&j(function(){a.dropAvailable?a.dropAvailable.value=n:a.dropAvailable=n}),!n)return 0!=h(c.hideOnDropNotAvailable)(a)&&b.css("display","none"),void 0;var o,p=null,q=h(c.stopPropagation),r=1,s=h(c.ngAccept),t=h(c.ngDisabled);b[0].addEventListener("dragover",function(d){if(!t(a)){if(d.preventDefault(),q(a)&&d.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var e=d.dataTransfer.effectAllowed;d.dataTransfer.dropEffect="move"===e||"linkMove"===e?"move":"copy"}j.cancel(p),a.actualDragOverClass||(o=l(a,c,d)),b.addClass(o)}},!1),b[0].addEventListener("dragenter",function(b){t(a)||(b.preventDefault(),q(a)&&b.stopPropagation())},!1),b[0].addEventListener("dragleave",function(){t(a)||(p=j(function(){b.removeClass(o),o=null},r||1))},!1),b[0].addEventListener("drop",function(d){t(a)||(d.preventDefault(),q(a)&&d.stopPropagation(),b.removeClass(o),o=null,m(d,function(b,f){e(h,j,a,g,c,c.ngFileChange||c.ngFileDrop,b,f,d)},0!=h(c.allowDir)(a),c.multiple||h(c.ngMultiple)(a)))},!1)}function d(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}function e(a,b,c,d,e,f,g,h,i,j){function k(){d&&(a(e.ngModel).assign(c,g),b(function(){d&&d.$setViewValue(null!=g&&0==g.length?null:g)})),e.ngModelRejected&&a(e.ngModelRejected).assign(c,h),f&&a(f)(c,{$files:g,$rejectedFiles:h,$event:i})}console.log("aa "+g),j?k():b(function(){k()})}function f(a,b,c,d){var e=b(a,{$file:c,$event:d});if(null==e)return!0;if(angular.isString(e)){var f=new RegExp(g(e),"gi");e=null!=c.type&&c.type.match(f)||null!=c.name&&c.name.match(f)}return e}function g(a){if(a.length>2&&"/"===a[0]&&"/"===a[a.length-1])return a.substring(1,a.length-1);var b=a.split(","),c="";if(b.length>1)for(i=0;i<b.length;i++)c+="("+g(b[i])+")",i<b.length-1&&(c+="|");else 0==a.indexOf(".")&&(a="*"+a),c="^"+a.replace(new RegExp("[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\-]","g"),"\\$&")+"$",c=c.replace(/\\\*/g,".*").replace(/\\\?/g,".");return c}var h,i;window.XMLHttpRequest&&!window.XMLHttpRequest.__isFileAPIShim&&a("setRequestHeader",function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}});var j=angular.module("angularFileUpload",[]);j.version="3.2.0",j.service("$upload",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{},d.transformRequest=d.transformRequest||function(b,c){return window.ArrayBuffer&&b instanceof window.ArrayBuffer?b:a.defaults.transformRequest[0](b,c)};var e=b.defer(),f=e.promise;return d.headers.__setXHR_=function(){return function(a){a&&(d.__XHR=a,d.xhrFn&&d.xhrFn(a),a.upload.addEventListener("progress",function(a){a.config=d,e.notify?e.notify(a):f.progress_fn&&c(function(){f.progress_fn(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progress_fn&&c(function(){f.progress_fn(a)}))},!1))}},a(d).then(function(a){e.resolve(a)},function(a){e.reject(a)},function(a){e.notify(a)}),f.success=function(a){return f.then(function(b){a(b.data,b.status,b.headers,d)}),f},f.error=function(a){return f.then(null,function(b){a(b.data,b.status,b.headers,d)}),f},f.progress=function(a){return f.progress_fn=a,f.then(null,null,function(b){a(b)}),f},f.abort=function(){return d.__XHR&&c(function(){d.__XHR.abort()}),f},f.xhr=function(a){return d.xhrFn=function(b){return function(){b&&b.apply(f,arguments),a.apply(f,arguments)}}(d.xhrFn),f},f}this.upload=function(a){return a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?"[object Array]"===Object.prototype.toString.call(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(b){var c=new FormData,d={};for(h in a.fields)a.fields.hasOwnProperty(h)&&(d[h]=a.fields[h]);if(b&&(d.data=b),a.formDataAppender)for(h in d)d.hasOwnProperty(h)&&a.formDataAppender(c,h,d[h]);else for(h in d)if(d.hasOwnProperty(h)){var e=d[h];void 0!==e&&("[object String]"===Object.prototype.toString.call(e)?c.append(h,e):a.sendObjectsAsJsonBlob&&"object"==typeof e?c.append(h,new Blob([e],{type:"application/json"})):c.append(h,JSON.stringify(e)))}if(null!=a.file){var f=a.fileFormDataName||"file";if("[object Array]"===Object.prototype.toString.call(a.file)){var g="[object String]"===Object.prototype.toString.call(f);for(i=0;i<a.file.length;i++)c.append(g?f:f[i],a.file[i],a.fileName&&a.fileName[i]||a.file[i].name)}else c.append(f,a.file,a.fileName||a.file.name)}return c}),d(a)},this.http=function(a){return d(a)}}]),j.directive("ngFileSelect",["$parse","$timeout","$compile",function(a,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){b(e,f,g,h,a,c,d)}}}]),j.directive("ngFileDrop",["$parse","$timeout","$location",function(a,b,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){c(e,f,g,h,a,b,d)}}}]),j.directive("ngNoFileDrop",function(){return function(a,b){d()&&b.css("display","none")}}),j.directive("ngFileDropAvailable",["$parse","$timeout",function(a,b){return function(c,e,f){if(d()){var g=a(f.ngFileDropAvailable);b(function(){g(c)})}}}]);var k=angular.module("ngFileUpload",[]);for(h in j)j.hasOwnProperty(h)&&(k[h]=j[h])}();
{
"name": "ng-file-upload",
"version": "3.1.2",
"version": "3.2.0",
"devDependencies": {

@@ -5,0 +5,0 @@ "grunt": "~0.4.1",

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc