ng-file-upload
Advanced tools
Comparing version 5.0.9 to 5.1.0
@@ -1,2 +0,2 @@ | ||
/*! 5.0.9 */ | ||
/*! 5.1.0 */ | ||
/*! FileAPI 2.0.7 - BSD | git://github.com/mailru/FileAPI.git | ||
@@ -3,0 +3,0 @@ * FileAPI — a set of javascript tools for working with files. Multiupload, drag'n'drop and chunked file upload. Images: crop, resize and auto orientation by EXIF. |
@@ -5,3 +5,3 @@ /**! | ||
* @author Danial <danial.farid@gmail.com> | ||
* @version 5.0.9 | ||
* @version 5.1.0 | ||
*/ | ||
@@ -434,3 +434,3 @@ | ||
* @author Danial <danial.farid@gmail.com> | ||
* @version 5.0.9 | ||
* @version 5.1.0 | ||
*/ | ||
@@ -456,3 +456,5 @@ | ||
ngFileUpload.version = '5.0.9'; | ||
ngFileUpload.version = '5.1.0'; | ||
ngFileUpload.defaults = {}; | ||
ngFileUpload.service('Upload', ['$http', '$q', '$timeout', function ($http, $q, $timeout) { | ||
@@ -630,2 +632,31 @@ function sendHttp(config) { | ||
}; | ||
this.dataUrl = function (file, callback, disallowObjectUrl) { | ||
if (window.FileReader && file && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) { | ||
$timeout(function () { | ||
//prefer URL.createObjectURL for handling refrences to files of all sizes | ||
//since it doesn´t build a large string in memory | ||
var URL = window.URL || window.webkitURL; | ||
if (URL && URL.createObjectURL && !disallowObjectUrl) { | ||
callback(URL.createObjectURL(file)); | ||
} else { | ||
var fileReader = new FileReader(); | ||
fileReader.readAsDataURL(file); | ||
fileReader.onload = function (e) { | ||
$timeout(function () { | ||
callback(e.target.result); | ||
}); | ||
}; | ||
} | ||
}); | ||
} else { | ||
callback(null); | ||
} | ||
}; | ||
this.setDefaults = function(defaults) { | ||
ngFileUpload.defaults = defaults || {}; | ||
}; | ||
} | ||
@@ -636,260 +667,310 @@ | ||
(function () { | ||
ngFileUpload.directive('ngfSelect', ['$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); | ||
} | ||
}; | ||
}]); | ||
ngFileUpload.getAttrWithDefaults = function(attr, name) { | ||
return attr[name] != null ? attr[name] : | ||
(ngFileUpload.defaults[name] == null ? | ||
ngFileUpload.defaults[name] : ngFileUpload.defaults[name].toString()); | ||
}; | ||
function linkFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile) { | ||
/** @namespace attr.ngfSelect */ | ||
/** @namespace attr.ngfChange */ | ||
/** @namespace attr.ngModel */ | ||
/** @namespace attr.ngModelRejected */ | ||
/** @namespace attr.ngfMultiple */ | ||
/** @namespace attr.ngfCapture */ | ||
/** @namespace attr.ngfAccept */ | ||
/** @namespace attr.ngfMaxSize */ | ||
/** @namespace attr.ngfMinSize */ | ||
/** @namespace attr.ngfResetOnClick */ | ||
/** @namespace attr.ngfResetModelOnClick */ | ||
/** @namespace attr.ngfKeep */ | ||
/** @namespace attr.ngfKeepDistinct */ | ||
var getAttr = ngFileUpload.getAttrWithDefaults; | ||
if (elem.attr('__ngf_gen__')) { | ||
return; | ||
ngFileUpload.directive('ngfSelect', ['$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); | ||
} | ||
}; | ||
}]); | ||
scope.$on('$destroy', function () { | ||
if (elem.$$ngfRefElem) elem.$$ngfRefElem.remove(); | ||
}); | ||
function linkFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile) { | ||
/** @namespace attr.ngfSelect */ | ||
/** @namespace attr.ngfChange */ | ||
/** @namespace attr.ngModel */ | ||
/** @namespace attr.ngModelRejected */ | ||
/** @namespace attr.ngfMultiple */ | ||
/** @namespace attr.ngfCapture */ | ||
/** @namespace attr.ngfAccept */ | ||
/** @namespace attr.ngfMaxSize */ | ||
/** @namespace attr.ngfMinSize */ | ||
/** @namespace attr.ngfResetOnClick */ | ||
/** @namespace attr.ngfResetModelOnClick */ | ||
/** @namespace attr.ngfKeep */ | ||
/** @namespace attr.ngfKeepDistinct */ | ||
var disabled = false; | ||
if (attr.ngfSelect.search(/\W+$files\W+/) === -1) { | ||
scope.$watch(attr.ngfSelect, function (val) { | ||
disabled = val === false; | ||
}); | ||
} | ||
function isInputTypeFile() { | ||
return elem[0].tagName.toLowerCase() === 'input' && attr.type && attr.type.toLowerCase() === 'file'; | ||
} | ||
if (elem.attr('__ngf_gen__')) { | ||
return; | ||
} | ||
var isUpdating = false; | ||
scope.$on('$destroy', function () { | ||
if (elem.$$ngfRefElem) elem.$$ngfRefElem.remove(); | ||
}); | ||
function changeFn(evt) { | ||
if (!isUpdating) { | ||
isUpdating = true; | ||
try { | ||
var fileList = evt.__files_ || (evt.target && evt.target.files); | ||
var files = [], rejFiles = []; | ||
var disabled = false; | ||
if (getAttr(attr, 'ngfSelect').search(/\W+$files\W+/) === -1) { | ||
scope.$watch(getAttr(attr, 'ngfSelect'), function (val) { | ||
disabled = val === false; | ||
}); | ||
} | ||
function isInputTypeFile() { | ||
return elem[0].tagName.toLowerCase() === 'input' && attr.type && attr.type.toLowerCase() === 'file'; | ||
} | ||
for (var i = 0; i < fileList.length; i++) { | ||
var file = fileList.item(i); | ||
if (validate(scope, $parse, attr, file, evt)) { | ||
files.push(file); | ||
} else { | ||
rejFiles.push(file); | ||
} | ||
} | ||
updateModel($parse, $timeout, scope, ngModel, attr, attr.ngfChange || attr.ngfSelect, files, rejFiles, evt); | ||
if (files.length === 0) evt.target.value = files; | ||
var isUpdating = false; | ||
function changeFn(evt) { | ||
if (!isUpdating) { | ||
isUpdating = true; | ||
try { | ||
var fileList = evt.__files_ || (evt.target && evt.target.files); | ||
var files = [], rejFiles = []; | ||
for (var i = 0; i < fileList.length; i++) { | ||
var file = fileList.item(i); | ||
if (validate(scope, $parse, attr, file, evt)) { | ||
files.push(file); | ||
} else { | ||
rejFiles.push(file); | ||
} | ||
} | ||
updateModel($parse, $timeout, scope, ngModel, attr, | ||
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), files, rejFiles, evt); | ||
if (files.length === 0) evt.target.value = files; | ||
// if (evt.target && evt.target.getAttribute('__ngf_gen__')) { | ||
// angular.element(evt.target).remove(); | ||
// } | ||
} finally { | ||
isUpdating = false; | ||
} | ||
} | ||
} finally { | ||
isUpdating = false; | ||
} | ||
} | ||
} | ||
function bindAttrToFileInput(fileElem) { | ||
if (attr.ngfMultiple) fileElem.attr('multiple', $parse(attr.ngfMultiple)(scope)); | ||
if (attr.ngfCapture) fileElem.attr('capture', $parse(attr.ngfCapture)(scope)); | ||
if (attr.accept) fileElem.attr('accept', attr.accept); | ||
for (var i = 0; i < elem[0].attributes.length; i++) { | ||
var attribute = elem[0].attributes[i]; | ||
if ((isInputTypeFile() && attribute.name !== 'type') || | ||
(attribute.name !== 'type' && attribute.name !== 'class' && | ||
attribute.name !== 'id' && attribute.name !== 'style')) { | ||
fileElem.attr(attribute.name, attribute.value); | ||
} | ||
} | ||
function bindAttrToFileInput(fileElem) { | ||
if (getAttr(attr, 'ngfMultiple')) fileElem.attr('multiple', $parse(getAttr(attr, 'ngfMultiple'))(scope)); | ||
if (getAttr(attr, 'ngfCapture')) fileElem.attr('capture', $parse(getAttr(attr, 'ngfCapture'))(scope)); | ||
if (getAttr(attr, 'accept')) fileElem.attr('accept', getAttr(attr, 'accept')); | ||
for (var i = 0; i < elem[0].attributes.length; i++) { | ||
var attribute = elem[0].attributes[i]; | ||
if ((isInputTypeFile() && attribute.name !== 'type') || | ||
(attribute.name !== 'type' && attribute.name !== 'class' && | ||
attribute.name !== 'id' && attribute.name !== 'style')) { | ||
fileElem.attr(attribute.name, attribute.value); | ||
} | ||
} | ||
} | ||
function createFileInput(evt, resetOnClick) { | ||
if (!resetOnClick && (evt || isInputTypeFile())) return elem.$$ngfRefElem || elem; | ||
function createFileInput(evt, resetOnClick) { | ||
if (!resetOnClick && (evt || isInputTypeFile())) return elem.$$ngfRefElem || elem; | ||
var fileElem = angular.element('<input type="file">'); | ||
bindAttrToFileInput(fileElem); | ||
var fileElem = angular.element('<input type="file">'); | ||
bindAttrToFileInput(fileElem); | ||
if (isInputTypeFile()) { | ||
elem.replaceWith(fileElem); | ||
elem = fileElem; | ||
fileElem.attr('__ngf_gen__', true); | ||
$compile(elem)(scope); | ||
} else { | ||
fileElem.css('visibility', 'hidden').css('position', 'absolute').css('overflow', 'hidden') | ||
.css('width', '0px').css('height', '0px').css('z-index', '-100000').css('border', 'none') | ||
.css('margin', '0px').css('padding', '0px').attr('tabindex', '-1'); | ||
if (elem.$$ngfRefElem) { | ||
elem.$$ngfRefElem.remove(); | ||
} | ||
elem.$$ngfRefElem = fileElem; | ||
document.body.appendChild(fileElem[0]); | ||
} | ||
return fileElem; | ||
if (isInputTypeFile()) { | ||
elem.replaceWith(fileElem); | ||
elem = fileElem; | ||
fileElem.attr('__ngf_gen__', true); | ||
$compile(elem)(scope); | ||
} else { | ||
fileElem.css('visibility', 'hidden').css('position', 'absolute').css('overflow', 'hidden') | ||
.css('width', '0px').css('height', '0px').css('z-index', '-100000').css('border', 'none') | ||
.css('margin', '0px').css('padding', '0px').attr('tabindex', '-1'); | ||
if (elem.$$ngfRefElem) { | ||
elem.$$ngfRefElem.remove(); | ||
} | ||
elem.$$ngfRefElem = fileElem; | ||
document.body.appendChild(fileElem[0]); | ||
} | ||
function resetModel(evt) { | ||
updateModel($parse, $timeout, scope, ngModel, attr, attr.ngfChange || attr.ngfSelect, [], [], evt, true); | ||
} | ||
return fileElem; | ||
} | ||
function clickHandler(evt) { | ||
if (elem.attr('disabled') || disabled) return false; | ||
if (evt != null) { | ||
evt.preventDefault(); | ||
evt.stopPropagation(); | ||
} | ||
var resetOnClick = $parse(attr.ngfResetOnClick)(scope) !== false; | ||
var fileElem = createFileInput(evt, resetOnClick); | ||
function resetModel(evt) { | ||
updateModel($parse, $timeout, scope, ngModel, attr, | ||
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), [], [], evt, true); | ||
} | ||
function clickAndAssign(evt) { | ||
if (evt) { | ||
fileElem[0].click(); | ||
} | ||
if (isInputTypeFile() || !evt) { | ||
elem.bind('click touchend', clickHandler); | ||
} | ||
} | ||
var initialTouchStartY = 0; | ||
if (fileElem) { | ||
if (!evt || resetOnClick) fileElem.bind('change', changeFn); | ||
if (evt && resetOnClick && $parse(attr.ngfResetModelOnClick)(scope) !== false) resetModel(evt); | ||
function clickHandler(evt) { | ||
if (elem.attr('disabled') || disabled) return false; | ||
// fix for android native browser < 4.4 | ||
if (shouldClickLater(navigator.userAgent)) { | ||
setTimeout(function () { | ||
clickAndAssign(evt); | ||
}, 0); | ||
} else { | ||
clickAndAssign(evt); | ||
} | ||
} | ||
return false; | ||
if (evt != null) { | ||
if (evt.type === 'touchstart') { | ||
initialTouchStartY = evt.originalEvent.touches[0].clientY; | ||
return true; // don't block event default | ||
} else { | ||
evt.stopPropagation(); | ||
evt.preventDefault(); | ||
// prevent scroll from triggering event | ||
if (evt.type === 'touchend') { | ||
var currentLocation = evt.originalEvent.changedTouches[0].clientY; | ||
if (Math.abs(currentLocation - initialTouchStartY) > 20) return false; | ||
} | ||
} | ||
} | ||
if (window.FileAPI && window.FileAPI.ngfFixIE) { | ||
window.FileAPI.ngfFixIE(elem, createFileInput, bindAttrToFileInput, changeFn); | ||
var resetOnClick = $parse(getAttr(attr, 'ngfResetOnClick'))(scope) !== false; | ||
var fileElem = createFileInput(evt, resetOnClick); | ||
function clickAndAssign(evt) { | ||
if (evt && evt.clientY > 0) { | ||
fileElem[0].click(); | ||
} | ||
if ((isInputTypeFile() || !evt) && resetOnClick) { | ||
elem.bind('click touchend touchstart', clickHandler); | ||
} | ||
} | ||
if (fileElem) { | ||
if (!evt || resetOnClick) fileElem.bind('change', changeFn); | ||
if (evt && resetOnClick && $parse(getAttr(attr, 'ngfResetModelOnClick'))(scope) !== false) { | ||
resetModel(evt); | ||
} | ||
// fix for android native browser < 4.4 | ||
if (shouldClickLater(navigator.userAgent)) { | ||
setTimeout(function () { | ||
clickAndAssign(evt); | ||
}, 0); | ||
} else { | ||
clickHandler(); | ||
//if (!isInputTypeFile()) { | ||
// elem.bind('click touchend', clickHandler); | ||
//} | ||
clickAndAssign(evt); | ||
} | ||
} | ||
return false; | ||
} | ||
function shouldClickLater(ua) { | ||
// android below 4.4 | ||
var m = ua.match(/Android[^\d]*(\d+)\.(\d+)/); | ||
if (m && m.length > 2) { | ||
return parseInt(m[1]) < 4 || (parseInt(m[1]) === 4 && parseInt(m[2]) < 4); | ||
} | ||
if (window.FileAPI && window.FileAPI.ngfFixIE) { | ||
window.FileAPI.ngfFixIE(elem, createFileInput, bindAttrToFileInput, changeFn); | ||
} else { | ||
clickHandler(); | ||
//if (!isInputTypeFile()) { | ||
// elem.bind('click touchend', clickHandler); | ||
//} | ||
} | ||
} | ||
// safari on windows | ||
return /.*Windows.*Safari.*/.test(ua); | ||
function shouldClickLater(ua) { | ||
// android below 4.4 | ||
var m = ua.match(/Android[^\d]*(\d+)\.(\d+)/); | ||
if (m && m.length > 2) { | ||
var v = ngFileUpload.defaults.androidFixMinorVersion || 4; | ||
return parseInt(m[1]) < 4 || (parseInt(m[1]) === v && parseInt(m[2]) < v); | ||
} | ||
ngFileUpload.validate = function (scope, $parse, attr, file, evt) { | ||
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; | ||
} | ||
// safari on windows | ||
return ua.indexOf('Chrome') === -1 && /.*Windows.*Safari.*/.test(ua); | ||
} | ||
var accept = $parse(attr.ngfAccept)(scope, {$file: file, $event: evt}); | ||
var fileSizeMax = $parse(attr.ngfMaxSize)(scope, {$file: file, $event: evt}) || 9007199254740991; | ||
var fileSizeMin = $parse(attr.ngfMinSize)(scope, {$file: file, $event: evt}) || -1; | ||
if (accept != null && angular.isString(accept)) { | ||
var regexp = new RegExp(globStringToRegex(accept), 'gi'); | ||
accept = (file.type != null && regexp.test(file.type.toLowerCase())) || | ||
(file.name != null && regexp.test(file.name.toLowerCase())); | ||
ngFileUpload.validate = function (scope, $parse, attr, file, evt) { | ||
if (file == null) { | ||
return false; | ||
} | ||
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 += '|'; | ||
} | ||
} | ||
return (accept == null || accept) && (file.size == null || (file.size < fileSizeMax && file.size > fileSizeMin)); | ||
}; | ||
} else { | ||
if (str.indexOf('.') === 0) { | ||
str = '*' + str; | ||
} | ||
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$'; | ||
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.'); | ||
} | ||
return result; | ||
} | ||
ngFileUpload.updateModel = function ($parse, $timeout, scope, ngModel, attr, fileChange, | ||
files, rejFiles, evt, noDelay) { | ||
function update() { | ||
if ($parse(attr.ngfKeep)(scope) === true) { | ||
var prevFiles = (ngModel.$modelValue || []).slice(0); | ||
if (!files || !files.length) { | ||
files = prevFiles; | ||
} else if ($parse(attr.ngfKeepDistinct)(scope) === true) { | ||
var len = prevFiles.length; | ||
for (var i = 0; i < files.length; i++) { | ||
for (var j = 0; j < len; j++) { | ||
if (files[i].name === prevFiles[j].name) break; | ||
} | ||
if (j === len) { | ||
prevFiles.push(files[i]); | ||
} | ||
} | ||
files = prevFiles; | ||
} else { | ||
files = prevFiles.concat(files); | ||
} | ||
var accept = $parse(getAttr(attr, 'ngfAccept'))(scope, {$file: file, $event: evt}); | ||
var fileSizeMax = $parse(getAttr(attr, 'ngfMaxSize'))(scope, {$file: file, $event: evt}) || 9007199254740991; | ||
var fileSizeMin = $parse(getAttr(attr, 'ngfMinSize'))(scope, {$file: file, $event: evt}) || -1; | ||
if (accept != null && angular.isString(accept)) { | ||
var regexp = new RegExp(globStringToRegex(accept), 'gi'); | ||
accept = (file.type != null && regexp.test(file.type.toLowerCase())) || | ||
(file.name != null && regexp.test(file.name.toLowerCase())); | ||
if (!accept) { | ||
file.$error = 'accept'; | ||
return false; | ||
} | ||
} else { | ||
if (accept === false) { | ||
file.$error = 'accept'; | ||
return false; | ||
} | ||
} | ||
if (file.size == null) return true; | ||
if (file.size > fileSizeMax) { | ||
file.$error = 'maxSize'; | ||
return false; | ||
} | ||
if (file.size < fileSizeMin) { | ||
file.$error = 'minSize'; | ||
return false; | ||
} | ||
return true; | ||
}; | ||
ngFileUpload.updateModel = function ($parse, $timeout, scope, ngModel, attr, fileChange, | ||
files, rejFiles, evt, noDelay) { | ||
function update() { | ||
if ($parse(getAttr(attr, 'ngfKeep'))(scope) === true) { | ||
var prevFiles = (ngModel.$modelValue || []).slice(0); | ||
if (!files || !files.length) { | ||
files = prevFiles; | ||
} else if ($parse(getAttr(attr, 'ngfKeepDistinct'))(scope) === true) { | ||
var len = prevFiles.length; | ||
for (var i = 0; i < files.length; i++) { | ||
for (var j = 0; j < len; j++) { | ||
if (files[i].name === prevFiles[j].name) break; | ||
} | ||
if (ngModel) { | ||
$parse(attr.ngModel).assign(scope, files); | ||
$timeout(function () { | ||
if (ngModel) { | ||
ngModel.$setViewValue(files != null && files.length === 0 ? null : files); | ||
} | ||
}); | ||
if (j === len) { | ||
prevFiles.push(files[i]); | ||
} | ||
if (attr.ngModelRejected) { | ||
$parse(attr.ngModelRejected).assign(scope, rejFiles); | ||
} | ||
if (fileChange) { | ||
$parse(fileChange)(scope, { | ||
$files: files, | ||
$rejectedFiles: rejFiles, | ||
$event: evt | ||
}); | ||
} | ||
} | ||
if (noDelay) { | ||
update(); | ||
} | ||
files = prevFiles; | ||
} else { | ||
$timeout(function () { | ||
update(); | ||
}); | ||
files = prevFiles.concat(files); | ||
} | ||
}; | ||
} | ||
if (ngModel) { | ||
$parse(getAttr(attr, 'ngModel')).assign(scope, files); | ||
$timeout(function () { | ||
if (ngModel) { | ||
ngModel.$setViewValue(files != null && files.length === 0 ? null : files); | ||
} | ||
}); | ||
} | ||
if (getAttr(attr, 'ngModelRejected')) { | ||
$parse(getAttr(attr, 'ngModelRejected')).assign(scope, rejFiles); | ||
} | ||
if (fileChange) { | ||
$parse(fileChange)(scope, { | ||
$files: files, | ||
$rejectedFiles: rejFiles, | ||
$event: evt | ||
}); | ||
} | ||
} | ||
var validate = ngFileUpload.validate; | ||
var updateModel = ngFileUpload.updateModel; | ||
if (noDelay) { | ||
update(); | ||
} else { | ||
$timeout(function () { | ||
update(); | ||
}); | ||
} | ||
}; | ||
var validate = ngFileUpload.validate; | ||
var updateModel = ngFileUpload.updateModel; | ||
})(); | ||
@@ -900,2 +981,3 @@ | ||
var updateModel = ngFileUpload.updateModel; | ||
var getAttr = ngFileUpload.getAttrWithDefaults; | ||
@@ -921,3 +1003,3 @@ ngFileUpload.directive('ngfDrop', ['$parse', '$timeout', '$location', function ($parse, $timeout, $location) { | ||
if (dropAvailable()) { | ||
var fn = $parse(attr.ngfDropAvailable); | ||
var fn = $parse(getAttr(attr, 'ngfDropAvailable')); | ||
$timeout(function () { | ||
@@ -935,8 +1017,8 @@ fn(scope); | ||
var available = dropAvailable(); | ||
if (attr.dropAvailable) { | ||
if (getAttr(attr, 'dropAvailable')) { | ||
$timeout(function () { | ||
if (scope[attr.dropAvailable]) { | ||
scope[attr.dropAvailable].value = available; | ||
if (scope[getAttr(attr, 'dropAvailable')]) { | ||
scope[getAttr(attr, 'dropAvailable')].value = available; | ||
} else { | ||
scope[attr.dropAvailable] = available; | ||
scope[getAttr(attr, 'dropAvailable')] = available; | ||
} | ||
@@ -946,3 +1028,3 @@ }); | ||
if (!available) { | ||
if ($parse(attr.ngfHideOnDropNotAvailable)(scope) === true) { | ||
if ($parse(getAttr(attr, 'ngfHideOnDropNotAvailable'))(scope) === true) { | ||
elem.css('display', 'none'); | ||
@@ -954,4 +1036,4 @@ } | ||
var disabled = false; | ||
if (attr.ngfDrop.search(/\W+$files\W+/) === -1) { | ||
scope.$watch(attr.ngfDrop, function(val) { | ||
if (getAttr(attr, 'ngfDrop').search(/\W+$files\W+/) === -1) { | ||
scope.$watch(getAttr(attr, 'ngfDrop'), function(val) { | ||
disabled = val === false; | ||
@@ -962,3 +1044,3 @@ }); | ||
var leaveTimeout = null; | ||
var stopPropagation = $parse(attr.ngfStopPropagation); | ||
var stopPropagation = $parse(getAttr(attr, 'ngfStopPropagation')); | ||
var dragOverDelay = 1; | ||
@@ -1002,4 +1084,5 @@ var actualDragOverClass; | ||
updateModel($parse, $timeout, scope, ngModel, attr, | ||
attr.ngfChange || attr.ngfDrop, files, rejFiles, evt); | ||
}, $parse(attr.ngfAllowDir)(scope) !== false, attr.multiple || $parse(attr.ngfMultiple)(scope)); | ||
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt); | ||
}, $parse(getAttr(attr, 'ngfAllowDir'))(scope) !== false, | ||
getAttr(attr, 'multiple') || $parse(getAttr(attr, 'ngfMultiple'))(scope)); | ||
}, false); | ||
@@ -1017,3 +1100,3 @@ | ||
} | ||
var clazz = $parse(attr.ngfDragOverClass)(scope, {$event: evt}); | ||
var clazz = $parse(getAttr(attr, 'ngfDragOverClass'))(scope, {$event: evt}); | ||
if (clazz) { | ||
@@ -1023,3 +1106,3 @@ if (clazz.delay) dragOverDelay = clazz.delay; | ||
} | ||
return clazz || attr.ngfDragOverClass || 'dragover'; | ||
return clazz || getAttr(attr, 'ngfDragOverClass') || 'dragover'; | ||
} | ||
@@ -1132,33 +1215,35 @@ | ||
ngFileUpload.directive('ngfSrc', ['$parse', '$timeout', function ($parse, $timeout) { | ||
function dropAvailable() { | ||
var div = document.createElement('div'); | ||
return ('draggable' in div) && ('ondrop' in div); | ||
} | ||
})(); | ||
(function () { | ||
function fileToSrc(Upload, scope, $parse, attr, name, defaultName, callback) { | ||
scope.$watch(name, function (file) { | ||
if (window.FileReader && ngFileUpload.validate(scope, $parse, attr, file, null)) { | ||
Upload.dataUrl(file, function(url) { | ||
if (callback) { | ||
callback(url); | ||
} else { | ||
file.dataUrl = url || $parse(defaultName)(scope); | ||
} | ||
}, $parse(attr.ngfNoObjectUrl)(scope)); | ||
} | ||
}); | ||
} | ||
/** @namespace attr.ngfSrc */ | ||
/** @namespace attr.ngfDefaultSrc */ | ||
/** @namespace attr.ngfNoObjectUrl */ | ||
ngFileUpload.directive('ngfSrc', ['$parse', 'Upload', function ($parse, Upload) { | ||
return { | ||
restrict: 'AE', | ||
link: function (scope, elem, attr) { | ||
if (window.FileReader) { | ||
scope.$watch(attr.ngfSrc, function (file) { | ||
if (file && | ||
validate(scope, $parse, attr, file, null) && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) { | ||
$timeout(function () { | ||
//prefer URL.createObjectURL for handling refrences to files of all sizes | ||
//since it doesn´t build a large string in memory | ||
var URL = window.URL || window.webkitURL; | ||
if (URL && URL.createObjectURL) { | ||
elem.attr('src', URL.createObjectURL(file)); | ||
} else { | ||
var fileReader = new FileReader(); | ||
fileReader.readAsDataURL(file); | ||
fileReader.onload = function (e) { | ||
$timeout(function () { | ||
elem.attr('src', e.target.result); | ||
}); | ||
}; | ||
} | ||
}); | ||
} else { | ||
elem.attr('src', attr.ngfDefaultSrc || ''); | ||
} | ||
}); | ||
} | ||
fileToSrc(Upload, scope, $parse, attr, attr.ngfSrc, attr.ngfDefaultSrc, function (url) { | ||
elem.attr('src', url); | ||
}); | ||
} | ||
@@ -1168,7 +1253,28 @@ }; | ||
function dropAvailable() { | ||
var div = document.createElement('div'); | ||
return ('draggable' in div) && ('ondrop' in div); | ||
} | ||
/** @namespace attr.ngfBackground */ | ||
/** @namespace attr.ngfDefaultBackground */ | ||
/** @namespace attr.ngfNoObjectUrl */ | ||
ngFileUpload.directive('ngfBackground', ['$parse', 'Upload', function ($parse, Upload) { | ||
return { | ||
restrict: 'AE', | ||
link: function (scope, elem, attr) { | ||
fileToSrc(Upload, scope, $parse, attr, attr.ngfBackground, attr.ngfDefaultBackground, function (url) { | ||
elem.css('background-image', 'url(' + url + ')'); | ||
}); | ||
} | ||
}; | ||
}]); | ||
/** @namespace attr.ngfDataUrl */ | ||
/** @namespace attr.ngfDefaultDataUrl */ | ||
/** @namespace attr.ngfNoObjectUrl */ | ||
ngFileUpload.directive('ngfDataUrl', ['$parse', 'Upload', function ($parse, Upload) { | ||
return { | ||
restrict: 'AE', | ||
link: function (scope, elem, attr) { | ||
fileToSrc(Upload, scope, $parse, attr, attr.ngfDataUrl, attr.ngfDefaultDataUrl); | ||
} | ||
}; | ||
}]); | ||
})(); |
@@ -1,2 +0,2 @@ | ||
/*! 5.0.9 */ | ||
!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){}}if(window.FileAPI||(window.FileAPI={}),FileAPI.shouldLoad=window.XMLHttpRequest&&!window.FormData||FileAPI.forceLoad,FileAPI.shouldLoad){var c=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,d,e){c(this),this.__url=d;try{a.apply(this,[b,d,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,d){if("__setXHR_"===b){c(this);var e=d(this);e instanceof Function&&e(this)}else this.__requestHeaders=this.__requestHeaders||{},this.__requestHeaders[b]=d,a.apply(this,arguments)}}),a("send",function(a){return function(){var c=this;if(arguments[0]&&arguments[0].__isFileAPIShim){var d=arguments[0],e={url:c.__url,jsonp:!1,cache:!0,complete:function(a,d){c.__completed=!0,!a&&c.__listeners.load&&c.__listeners.load({type:"load",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),!a&&c.__listeners.loadend&&c.__listeners.loadend({type:"loadend",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),"abort"===a&&c.__listeners.abort&&c.__listeners.abort({type:"abort",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),void 0!==d.status&&b(c,"status",function(){return 0===d.status&&a&&"abort"!==a?500:d.status}),void 0!==d.statusText&&b(c,"statusText",function(){return d.statusText}),b(c,"readyState",function(){return 4}),void 0!==d.response&&b(c,"response",function(){return d.response});var e=d.responseText||(a&&0===d.status&&"abort"!==a?a:void 0);b(c,"responseText",function(){return e}),b(c,"response",function(){return e}),a&&b(c,"err",function(){return a}),c.__fileApiXHR=d,c.onreadystatechange&&c.onreadystatechange(),c.onload&&c.onload()},progress:function(a){if(a.target=c,c.__listeners.progress&&c.__listeners.progress(a),c.__total=a.total,c.__loaded=a.loaded,a.total===a.loaded){var b=this;setTimeout(function(){c.__completed||(c.getAllResponseHeaders=function(){},b.complete(null,{status:204,statusText:"No Content"}))},FileAPI.noContentTimeout||1e4)}},headers:c.__requestHeaders};e.data={},e.files={};for(var f=0;f<d.data.length;f++){var g=d.data[f];null!=g.val&&null!=g.val.name&&null!=g.val.size&&null!=g.val.type?e.files[g.key]=g.val:e.data[g.key]=g.val}setTimeout(function(){if(!FileAPI.hasFlash)throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';c.__fileApiXHR=FileAPI.upload(e)},1)}else{if(this.__origError)throw this.__origError;a.apply(c,arguments)}}}),window.XMLHttpRequest.__isFileAPIShim=!0,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(){function a(a){return"input"===a[0].tagName.toLowerCase()&&a.attr("type")&&"file"===a.attr("type").toLowerCase()}function b(){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}function c(a){var b=0,c=0;if(window.jQuery)return jQuery(a).offset();if(a.offsetParent)do b+=a.offsetLeft-a.scrollLeft,c+=a.offsetTop-a.scrollTop,a=a.offsetParent;while(a);return{left:b,top:c}}if(FileAPI.shouldLoad){if(FileAPI.forceLoad&&(FileAPI.html5=!1),!FileAPI.upload){var d,e,f,g,h,i=document.createElement("script"),j=document.getElementsByTagName("script");if(window.FileAPI.jsUrl)d=window.FileAPI.jsUrl;else if(window.FileAPI.jsPath)e=window.FileAPI.jsPath;else for(f=0;f<j.length;f++)if(h=j[f].src,g=h.search(/\/ng\-file\-upload[\-a-zA-z0-9\.]*\.js/),g>-1){e=h.substring(0,g+1);break}null==FileAPI.staticPath&&(FileAPI.staticPath=e),i.setAttribute("src",d||e+"FileAPI.min.js"),document.getElementsByTagName("head")[0].appendChild(i),FileAPI.hasFlash=b()}FileAPI.ngfFixIE=function(d,e,f,g){if(!b())throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';var h=function(){if(d.attr("disabled"))d.$$ngfRefElem.removeClass("js-fileapi-wrapper");else{var b=d.$$ngfRefElem;b?f(d.$$ngfRefElem):(b=d.$$ngfRefElem=e(),b.addClass("js-fileapi-wrapper"),!a(d),setTimeout(function(){b.bind("mouseenter",h)},10),b.bind("change",function(a){i.apply(this,[a]),g.apply(this,[a])})),a(d)||b.css("position","absolute").css("top",c(d[0]).top+"px").css("left",c(d[0]).left+"px").css("width",d[0].offsetWidth+"px").css("height",d[0].offsetHeight+"px").css("filter","alpha(opacity=0)").css("display",d.css("display")).css("overflow","hidden").css("z-index","900000").css("visibility","visible")}};d.bind("mouseenter",h);var i=function(a){for(var b=FileAPI.getFiles(a),c=0;c<b.length;c++)void 0===b[c].size&&(b[c].size=0),void 0===b[c].name&&(b[c].name="file"),void 0===b[c].type&&(b[c].type="undefined");a.target||(a.target={}),a.target.files=b,a.target.files!==b&&(a.__files_=b),(a.__files_||a.target.files).item=function(b){return(a.__files_||a.target.files)[b]||null}}},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){b||(b=!0,a.onloadstart&&a.onloadstart(c("loadstart",d)));var e;"load"===d.type?(a.onloadend&&a.onloadend(c("loadend",d)),e=c("load",d),a.onload&&a.onload(e),a.dispatchEvent(e)):"progress"===d.type?(e=c("progress",d),a.onprogress&&a.onprogress(e),a.dispatchEvent(e)):(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)}}),!window.XMLHttpRequest||window.FileAPI&&FileAPI.shouldLoad||(window.XMLHttpRequest.prototype.setRequestHeader=function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}}(window.XMLHttpRequest.prototype.setRequestHeader));var ngFileUpload=angular.module("ngFileUpload",[]);ngFileUpload.version="5.0.9",ngFileUpload.service("Upload",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{};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.progressFunc&&c(function(){f.progressFunc(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(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.progressFunc=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){function b(c,d,e){if(void 0!==d)if(angular.isDate(d)&&(d=d.toISOString()),angular.isString(d))c.append(e,d);else if("form"===a.sendFieldsAs)if(angular.isObject(d))for(var f in d)d.hasOwnProperty(f)&&b(c,d[f],e+"["+f+"]");else c.append(e,d);else d=angular.isString(d)?d:JSON.stringify(d),"json-blob"===a.sendFieldsAs?c.append(e,new Blob([d],{type:"application/json"})):c.append(e,d)}return a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?angular.isArray(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(c){var d,e=new FormData,f={};for(d in a.fields)a.fields.hasOwnProperty(d)&&(f[d]=a.fields[d]);c&&(f.data=c);for(d in f)if(f.hasOwnProperty(d)){var g=f[d];a.formDataAppender?a.formDataAppender(e,d,g):b(e,g,d)}if(null!=a.file){var h=a.fileFormDataName||"file";if(angular.isArray(a.file))for(var i=angular.isString(h),j=0;j<a.file.length;j++)e.append(i?h:h[j],a.file[j],a.fileName&&a.fileName[j]||a.file[j].name);else e.append(h,a.file,a.fileName||a.file.name)}return e}),d(a)},this.http=function(b){return b.transformRequest=b.transformRequest||function(b){return window.ArrayBuffer&&b instanceof window.ArrayBuffer||b instanceof Blob?b:a.defaults.transformRequest[0](arguments)},d(b)}}]),function(){function a(a,e,f,g,h,i,j){function k(){return"input"===e[0].tagName.toLowerCase()&&f.type&&"file"===f.type.toLowerCase()}function l(b){if(!r){r=!0;try{for(var e=b.__files_||b.target&&b.target.files,j=[],k=[],l=0;l<e.length;l++){var m=e.item(l);c(a,h,f,m,b)?j.push(m):k.push(m)}d(h,i,a,g,f,f.ngfChange||f.ngfSelect,j,k,b),0===j.length&&(b.target.value=j)}finally{r=!1}}}function m(b){f.ngfMultiple&&b.attr("multiple",h(f.ngfMultiple)(a)),f.ngfCapture&&b.attr("capture",h(f.ngfCapture)(a)),f.accept&&b.attr("accept",f.accept);for(var c=0;c<e[0].attributes.length;c++){var d=e[0].attributes[c];(k()&&"type"!==d.name||"type"!==d.name&&"class"!==d.name&&"id"!==d.name&&"style"!==d.name)&&b.attr(d.name,d.value)}}function n(b,c){if(!c&&(b||k()))return e.$$ngfRefElem||e;var d=angular.element('<input type="file">');return m(d),k()?(e.replaceWith(d),e=d,d.attr("__ngf_gen__",!0),j(e)(a)):(d.css("visibility","hidden").css("position","absolute").css("overflow","hidden").css("width","0px").css("height","0px").css("z-index","-100000").css("border","none").css("margin","0px").css("padding","0px").attr("tabindex","-1"),e.$$ngfRefElem&&e.$$ngfRefElem.remove(),e.$$ngfRefElem=d,document.body.appendChild(d[0])),d}function o(b){d(h,i,a,g,f,f.ngfChange||f.ngfSelect,[],[],b,!0)}function p(c){function d(a){a&&i[0].click(),(k()||!a)&&e.bind("click touchend",p)}if(e.attr("disabled")||q)return!1;null!=c&&(c.preventDefault(),c.stopPropagation());var g=h(f.ngfResetOnClick)(a)!==!1,i=n(c,g);return i&&((!c||g)&&i.bind("change",l),c&&g&&h(f.ngfResetModelOnClick)(a)!==!1&&o(c),b(navigator.userAgent)?setTimeout(function(){d(c)},0):d(c)),!1}if(!e.attr("__ngf_gen__")){a.$on("$destroy",function(){e.$$ngfRefElem&&e.$$ngfRefElem.remove()});var q=!1;-1===f.ngfSelect.search(/\W+$files\W+/)&&a.$watch(f.ngfSelect,function(a){q=a===!1});var r=!1;window.FileAPI&&window.FileAPI.ngfFixIE?window.FileAPI.ngfFixIE(e,n,m,l):p()}}function b(a){var b=a.match(/Android[^\d]*(\d+)\.(\d+)/);return b&&b.length>2?parseInt(b[1])<4||4===parseInt(b[1])&&parseInt(b[2])<4:/.*Windows.*Safari.*/.test(a)}ngFileUpload.directive("ngfSelect",["$parse","$timeout","$compile",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.validate=function(a,b,c,d,e){function f(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+="("+f(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}var g=b(c.ngfAccept)(a,{$file:d,$event:e}),h=b(c.ngfMaxSize)(a,{$file:d,$event:e})||9007199254740991,i=b(c.ngfMinSize)(a,{$file:d,$event:e})||-1;if(null!=g&&angular.isString(g)){var j=new RegExp(f(g),"gi");g=null!=d.type&&j.test(d.type.toLowerCase())||null!=d.name&&j.test(d.name.toLowerCase())}return(null==g||g)&&(null==d.size||d.size<h&&d.size>i)},ngFileUpload.updateModel=function(a,b,c,d,e,f,g,h,i,j){function k(){if(a(e.ngfKeep)(c)===!0){var j=(d.$modelValue||[]).slice(0);if(g&&g.length)if(a(e.ngfKeepDistinct)(c)===!0){for(var k=j.length,l=0;l<g.length;l++){for(var m=0;k>m&&g[l].name!==j[m].name;m++);m===k&&j.push(g[l])}g=j}else g=j.concat(g);else g=j}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})}j?k():b(function(){k()})};var c=ngFileUpload.validate,d=ngFileUpload.updateModel}(),function(){function a(a,e,f,g,h,i,j){function k(a,b,d){var e=!0,f=d.dataTransfer.items;if(null!=f)for(var g=0;g<f.length&&e;g++)e=e&&("file"===f[g].kind||""===f[g].kind)&&c(a,h,b,f[g],d);var i=h(b.ngfDragOverClass)(a,{$event:d});return i&&(i.delay&&(r=i.delay),i.accept&&(i=e?i.accept:i.reject)),i||b.ngfDragOverClass||"dragover"}function l(b,d,e,g){function k(d){c(a,h,f,d,b)?m.push(d):n.push(d)}function l(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;k({name:b.name,type:"directory",path:d});var e=b.createReader(),f=[];p++;var g=function(){e.readEntries(function(d){try{if(d.length)f=f.concat(Array.prototype.slice.call(d||[],0)),g();else{for(var e=0;e<f.length;e++)l(a,f[e],(c?c:"")+b.name+"/");p--}}catch(h){p--,console.error(h)}},function(){p--})};g()}else p++,b.file(function(a){try{p--,a.path=(c?c:"")+a.name,k(a)}catch(b){p--,console.error(b)}},function(){p--})}var m=[],n=[],o=b.dataTransfer.items,p=0;if(o&&o.length>0&&"file"!==j.protocol())for(var q=0;q<o.length;q++){if(o[q].webkitGetAsEntry&&o[q].webkitGetAsEntry()&&o[q].webkitGetAsEntry().isDirectory){var r=o[q].webkitGetAsEntry();if(r.isDirectory&&!e)continue;null!=r&&l(m,r)}else{var s=o[q].getAsFile();null!=s&&k(s)}if(!g&&m.length>0)break}else{var t=b.dataTransfer.files;if(null!=t)for(var u=0;u<t.length&&(k(t.item(u)),g||!(m.length>0));u++);}var v=0;!function w(a){i(function(){if(p)10*v++<2e4&&w(10);else{if(!g&&m.length>1){for(q=0;"directory"===m[q].type;)q++;m=[m[q]]}d(m,n)}},a||0)}()}var m=b();if(f.dropAvailable&&i(function(){a[f.dropAvailable]?a[f.dropAvailable].value=m:a[f.dropAvailable]=m}),!m)return void(h(f.ngfHideOnDropNotAvailable)(a)===!0&&e.css("display","none"));var n=!1;-1===f.ngfDrop.search(/\W+$files\W+/)&&a.$watch(f.ngfDrop,function(a){n=a===!1});var o,p=null,q=h(f.ngfStopPropagation),r=1;e[0].addEventListener("dragover",function(b){if(!e.attr("disabled")&&!n){if(b.preventDefault(),q(a)&&b.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var c=b.dataTransfer.effectAllowed;b.dataTransfer.dropEffect="move"===c||"linkMove"===c?"move":"copy"}i.cancel(p),a.actualDragOverClass||(o=k(a,f,b)),e.addClass(o)}},!1),e[0].addEventListener("dragenter",function(b){e.attr("disabled")||n||(b.preventDefault(),q(a)&&b.stopPropagation())},!1),e[0].addEventListener("dragleave",function(){e.attr("disabled")||n||(p=i(function(){e.removeClass(o),o=null},r||1))},!1),e[0].addEventListener("drop",function(b){e.attr("disabled")||n||(b.preventDefault(),q(a)&&b.stopPropagation(),e.removeClass(o),o=null,l(b,function(c,e){d(h,i,a,g,f,f.ngfChange||f.ngfDrop,c,e,b)},h(f.ngfAllowDir)(a)!==!1,f.multiple||h(f.ngfMultiple)(a)))},!1)}function b(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}var c=ngFileUpload.validate,d=ngFileUpload.updateModel;ngFileUpload.directive("ngfDrop",["$parse","$timeout","$location",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.directive("ngfNoFileDrop",function(){return function(a,c){b()&&c.css("display","none")}}),ngFileUpload.directive("ngfDropAvailable",["$parse","$timeout",function(a,c){return function(d,e,f){if(b()){var g=a(f.ngfDropAvailable);c(function(){g(d),g.assign&&g.assign(d,!0)})}}}]),ngFileUpload.directive("ngfSrc",["$parse","$timeout",function(a,b){return{restrict:"AE",link:function(d,e,f){window.FileReader&&d.$watch(f.ngfSrc,function(g){g&&c(d,a,f,g,null)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 8")||g.size<2e4)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 9")||g.size<4e6)?b(function(){var a=window.URL||window.webkitURL;if(a&&a.createObjectURL)e.attr("src",a.createObjectURL(g));else{var c=new FileReader;c.readAsDataURL(g),c.onload=function(a){b(function(){e.attr("src",a.target.result)})}}}):e.attr("src",f.ngfDefaultSrc||"")})}}}])}(); | ||
/*! 5.1.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){}}if(window.FileAPI||(window.FileAPI={}),FileAPI.shouldLoad=window.XMLHttpRequest&&!window.FormData||FileAPI.forceLoad,FileAPI.shouldLoad){var c=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,d,e){c(this),this.__url=d;try{a.apply(this,[b,d,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,d){if("__setXHR_"===b){c(this);var e=d(this);e instanceof Function&&e(this)}else this.__requestHeaders=this.__requestHeaders||{},this.__requestHeaders[b]=d,a.apply(this,arguments)}}),a("send",function(a){return function(){var c=this;if(arguments[0]&&arguments[0].__isFileAPIShim){var d=arguments[0],e={url:c.__url,jsonp:!1,cache:!0,complete:function(a,d){c.__completed=!0,!a&&c.__listeners.load&&c.__listeners.load({type:"load",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),!a&&c.__listeners.loadend&&c.__listeners.loadend({type:"loadend",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),"abort"===a&&c.__listeners.abort&&c.__listeners.abort({type:"abort",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),void 0!==d.status&&b(c,"status",function(){return 0===d.status&&a&&"abort"!==a?500:d.status}),void 0!==d.statusText&&b(c,"statusText",function(){return d.statusText}),b(c,"readyState",function(){return 4}),void 0!==d.response&&b(c,"response",function(){return d.response});var e=d.responseText||(a&&0===d.status&&"abort"!==a?a:void 0);b(c,"responseText",function(){return e}),b(c,"response",function(){return e}),a&&b(c,"err",function(){return a}),c.__fileApiXHR=d,c.onreadystatechange&&c.onreadystatechange(),c.onload&&c.onload()},progress:function(a){if(a.target=c,c.__listeners.progress&&c.__listeners.progress(a),c.__total=a.total,c.__loaded=a.loaded,a.total===a.loaded){var b=this;setTimeout(function(){c.__completed||(c.getAllResponseHeaders=function(){},b.complete(null,{status:204,statusText:"No Content"}))},FileAPI.noContentTimeout||1e4)}},headers:c.__requestHeaders};e.data={},e.files={};for(var f=0;f<d.data.length;f++){var g=d.data[f];null!=g.val&&null!=g.val.name&&null!=g.val.size&&null!=g.val.type?e.files[g.key]=g.val:e.data[g.key]=g.val}setTimeout(function(){if(!FileAPI.hasFlash)throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';c.__fileApiXHR=FileAPI.upload(e)},1)}else{if(this.__origError)throw this.__origError;a.apply(c,arguments)}}}),window.XMLHttpRequest.__isFileAPIShim=!0,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(){function a(a){return"input"===a[0].tagName.toLowerCase()&&a.attr("type")&&"file"===a.attr("type").toLowerCase()}function b(){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}function c(a){var b=0,c=0;if(window.jQuery)return jQuery(a).offset();if(a.offsetParent)do b+=a.offsetLeft-a.scrollLeft,c+=a.offsetTop-a.scrollTop,a=a.offsetParent;while(a);return{left:b,top:c}}if(FileAPI.shouldLoad){if(FileAPI.forceLoad&&(FileAPI.html5=!1),!FileAPI.upload){var d,e,f,g,h,i=document.createElement("script"),j=document.getElementsByTagName("script");if(window.FileAPI.jsUrl)d=window.FileAPI.jsUrl;else if(window.FileAPI.jsPath)e=window.FileAPI.jsPath;else for(f=0;f<j.length;f++)if(h=j[f].src,g=h.search(/\/ng\-file\-upload[\-a-zA-z0-9\.]*\.js/),g>-1){e=h.substring(0,g+1);break}null==FileAPI.staticPath&&(FileAPI.staticPath=e),i.setAttribute("src",d||e+"FileAPI.min.js"),document.getElementsByTagName("head")[0].appendChild(i),FileAPI.hasFlash=b()}FileAPI.ngfFixIE=function(d,e,f,g){if(!b())throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';var h=function(){if(d.attr("disabled"))d.$$ngfRefElem.removeClass("js-fileapi-wrapper");else{var b=d.$$ngfRefElem;b?f(d.$$ngfRefElem):(b=d.$$ngfRefElem=e(),b.addClass("js-fileapi-wrapper"),!a(d),setTimeout(function(){b.bind("mouseenter",h)},10),b.bind("change",function(a){i.apply(this,[a]),g.apply(this,[a])})),a(d)||b.css("position","absolute").css("top",c(d[0]).top+"px").css("left",c(d[0]).left+"px").css("width",d[0].offsetWidth+"px").css("height",d[0].offsetHeight+"px").css("filter","alpha(opacity=0)").css("display",d.css("display")).css("overflow","hidden").css("z-index","900000").css("visibility","visible")}};d.bind("mouseenter",h);var i=function(a){for(var b=FileAPI.getFiles(a),c=0;c<b.length;c++)void 0===b[c].size&&(b[c].size=0),void 0===b[c].name&&(b[c].name="file"),void 0===b[c].type&&(b[c].type="undefined");a.target||(a.target={}),a.target.files=b,a.target.files!==b&&(a.__files_=b),(a.__files_||a.target.files).item=function(b){return(a.__files_||a.target.files)[b]||null}}},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){b||(b=!0,a.onloadstart&&a.onloadstart(c("loadstart",d)));var e;"load"===d.type?(a.onloadend&&a.onloadend(c("loadend",d)),e=c("load",d),a.onload&&a.onload(e),a.dispatchEvent(e)):"progress"===d.type?(e=c("progress",d),a.onprogress&&a.onprogress(e),a.dispatchEvent(e)):(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)}}),!window.XMLHttpRequest||window.FileAPI&&FileAPI.shouldLoad||(window.XMLHttpRequest.prototype.setRequestHeader=function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}}(window.XMLHttpRequest.prototype.setRequestHeader));var ngFileUpload=angular.module("ngFileUpload",[]);ngFileUpload.version="5.1.0",ngFileUpload.defaults={},ngFileUpload.service("Upload",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{};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.progressFunc&&c(function(){f.progressFunc(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(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.progressFunc=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){function b(c,d,e){if(void 0!==d)if(angular.isDate(d)&&(d=d.toISOString()),angular.isString(d))c.append(e,d);else if("form"===a.sendFieldsAs)if(angular.isObject(d))for(var f in d)d.hasOwnProperty(f)&&b(c,d[f],e+"["+f+"]");else c.append(e,d);else d=angular.isString(d)?d:JSON.stringify(d),"json-blob"===a.sendFieldsAs?c.append(e,new Blob([d],{type:"application/json"})):c.append(e,d)}return a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?angular.isArray(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(c){var d,e=new FormData,f={};for(d in a.fields)a.fields.hasOwnProperty(d)&&(f[d]=a.fields[d]);c&&(f.data=c);for(d in f)if(f.hasOwnProperty(d)){var g=f[d];a.formDataAppender?a.formDataAppender(e,d,g):b(e,g,d)}if(null!=a.file){var h=a.fileFormDataName||"file";if(angular.isArray(a.file))for(var i=angular.isString(h),j=0;j<a.file.length;j++)e.append(i?h:h[j],a.file[j],a.fileName&&a.fileName[j]||a.file[j].name);else e.append(h,a.file,a.fileName||a.file.name)}return e}),d(a)},this.http=function(b){return b.transformRequest=b.transformRequest||function(b){return window.ArrayBuffer&&b instanceof window.ArrayBuffer||b instanceof Blob?b:a.defaults.transformRequest[0](arguments)},d(b)},this.dataUrl=function(a,b,d){window.FileReader&&a&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 8")||a.size<2e4)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 9")||a.size<4e6)?c(function(){var e=window.URL||window.webkitURL;if(e&&e.createObjectURL&&!d)b(e.createObjectURL(a));else{var f=new FileReader;f.readAsDataURL(a),f.onload=function(a){c(function(){b(a.target.result)})}}}):b(null)},this.setDefaults=function(a){ngFileUpload.defaults=a||{}}}]),function(){function a(a,f,g,h,i,j,k){function l(){return"input"===f[0].tagName.toLowerCase()&&g.type&&"file"===g.type.toLowerCase()}function m(b){if(!s){s=!0;try{for(var f=b.__files_||b.target&&b.target.files,k=[],l=[],m=0;m<f.length;m++){var n=f.item(m);d(a,i,g,n,b)?k.push(n):l.push(n)}e(i,j,a,h,g,c(g,"ngfChange")||c(g,"ngfSelect"),k,l,b),0===k.length&&(b.target.value=k)}finally{s=!1}}}function n(b){c(g,"ngfMultiple")&&b.attr("multiple",i(c(g,"ngfMultiple"))(a)),c(g,"ngfCapture")&&b.attr("capture",i(c(g,"ngfCapture"))(a)),c(g,"accept")&&b.attr("accept",c(g,"accept"));for(var d=0;d<f[0].attributes.length;d++){var e=f[0].attributes[d];(l()&&"type"!==e.name||"type"!==e.name&&"class"!==e.name&&"id"!==e.name&&"style"!==e.name)&&b.attr(e.name,e.value)}}function o(b,c){if(!c&&(b||l()))return f.$$ngfRefElem||f;var d=angular.element('<input type="file">');return n(d),l()?(f.replaceWith(d),f=d,d.attr("__ngf_gen__",!0),k(f)(a)):(d.css("visibility","hidden").css("position","absolute").css("overflow","hidden").css("width","0px").css("height","0px").css("z-index","-100000").css("border","none").css("margin","0px").css("padding","0px").attr("tabindex","-1"),f.$$ngfRefElem&&f.$$ngfRefElem.remove(),f.$$ngfRefElem=d,document.body.appendChild(d[0])),d}function p(b){e(i,j,a,h,g,c(g,"ngfChange")||c(g,"ngfSelect"),[],[],b,!0)}function q(d){function e(a){a&&a.clientY>0&&k[0].click(),!l()&&a||!j||f.bind("click touchend touchstart",q)}if(f.attr("disabled")||r)return!1;if(null!=d){if("touchstart"===d.type)return t=d.originalEvent.touches[0].clientY,!0;if(d.stopPropagation(),d.preventDefault(),"touchend"===d.type){var h=d.originalEvent.changedTouches[0].clientY;if(Math.abs(h-t)>20)return!1}}var j=i(c(g,"ngfResetOnClick"))(a)!==!1,k=o(d,j);return k&&((!d||j)&&k.bind("change",m),d&&j&&i(c(g,"ngfResetModelOnClick"))(a)!==!1&&p(d),b(navigator.userAgent)?setTimeout(function(){e(d)},0):e(d)),!1}if(!f.attr("__ngf_gen__")){a.$on("$destroy",function(){f.$$ngfRefElem&&f.$$ngfRefElem.remove()});var r=!1;-1===c(g,"ngfSelect").search(/\W+$files\W+/)&&a.$watch(c(g,"ngfSelect"),function(a){r=a===!1});var s=!1,t=0;window.FileAPI&&window.FileAPI.ngfFixIE?window.FileAPI.ngfFixIE(f,o,n,m):q()}}function b(a){var b=a.match(/Android[^\d]*(\d+)\.(\d+)/);if(b&&b.length>2){var c=ngFileUpload.defaults.androidFixMinorVersion||4;return parseInt(b[1])<4||parseInt(b[1])===c&&parseInt(b[2])<c}return-1===a.indexOf("Chrome")&&/.*Windows.*Safari.*/.test(a)}ngFileUpload.getAttrWithDefaults=function(a,b){return null!=a[b]?a[b]:null==ngFileUpload.defaults[b]?ngFileUpload.defaults[b]:ngFileUpload.defaults[b].toString()};var c=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfSelect",["$parse","$timeout","$compile",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.validate=function(a,b,d,e,f){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(var d=0;d<b.length;d++)c+="("+g(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}if(null==e)return!1;var h=b(c(d,"ngfAccept"))(a,{$file:e,$event:f}),i=b(c(d,"ngfMaxSize"))(a,{$file:e,$event:f})||9007199254740991,j=b(c(d,"ngfMinSize"))(a,{$file:e,$event:f})||-1;if(null!=h&&angular.isString(h)){var k=new RegExp(g(h),"gi");if(h=null!=e.type&&k.test(e.type.toLowerCase())||null!=e.name&&k.test(e.name.toLowerCase()),!h)return e.$error="accept",!1}else if(h===!1)return e.$error="accept",!1;return null==e.size?!0:e.size>i?(e.$error="maxSize",!1):e.size<j?(e.$error="minSize",!1):!0},ngFileUpload.updateModel=function(a,b,d,e,f,g,h,i,j,k){function l(){if(a(c(f,"ngfKeep"))(d)===!0){var k=(e.$modelValue||[]).slice(0);if(h&&h.length)if(a(c(f,"ngfKeepDistinct"))(d)===!0){for(var l=k.length,m=0;m<h.length;m++){for(var n=0;l>n&&h[m].name!==k[n].name;n++);n===l&&k.push(h[m])}h=k}else h=k.concat(h);else h=k}e&&(a(c(f,"ngModel")).assign(d,h),b(function(){e&&e.$setViewValue(null!=h&&0===h.length?null:h)})),c(f,"ngModelRejected")&&a(c(f,"ngModelRejected")).assign(d,i),g&&a(g)(d,{$files:h,$rejectedFiles:i,$event:j})}k?l():b(function(){l()})};var d=ngFileUpload.validate,e=ngFileUpload.updateModel}(),function(){function a(a,f,g,h,i,j,k){function l(a,b,d){var f=!0,g=d.dataTransfer.items;if(null!=g)for(var h=0;h<g.length&&f;h++)f=f&&("file"===g[h].kind||""===g[h].kind)&&c(a,i,b,g[h],d);var j=i(e(b,"ngfDragOverClass"))(a,{$event:d});return j&&(j.delay&&(s=j.delay),j.accept&&(j=f?j.accept:j.reject)),j||e(b,"ngfDragOverClass")||"dragover"}function m(b,d,e,f){function h(d){c(a,i,g,d,b)?m.push(d):n.push(d)}function l(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;h({name:b.name,type:"directory",path:d});var e=b.createReader(),f=[];p++;var g=function(){e.readEntries(function(d){try{if(d.length)f=f.concat(Array.prototype.slice.call(d||[],0)),g();else{for(var e=0;e<f.length;e++)l(a,f[e],(c?c:"")+b.name+"/");p--}}catch(h){p--,console.error(h)}},function(){p--})};g()}else p++,b.file(function(a){try{p--,a.path=(c?c:"")+a.name,h(a)}catch(b){p--,console.error(b)}},function(){p--})}var m=[],n=[],o=b.dataTransfer.items,p=0;if(o&&o.length>0&&"file"!==k.protocol())for(var q=0;q<o.length;q++){if(o[q].webkitGetAsEntry&&o[q].webkitGetAsEntry()&&o[q].webkitGetAsEntry().isDirectory){var r=o[q].webkitGetAsEntry();if(r.isDirectory&&!e)continue;null!=r&&l(m,r)}else{var s=o[q].getAsFile();null!=s&&h(s)}if(!f&&m.length>0)break}else{var t=b.dataTransfer.files;if(null!=t)for(var u=0;u<t.length&&(h(t.item(u)),f||!(m.length>0));u++);}var v=0;!function w(a){j(function(){if(p)10*v++<2e4&&w(10);else{if(!f&&m.length>1){for(q=0;"directory"===m[q].type;)q++;m=[m[q]]}d(m,n)}},a||0)}()}var n=b();if(e(g,"dropAvailable")&&j(function(){a[e(g,"dropAvailable")]?a[e(g,"dropAvailable")].value=n:a[e(g,"dropAvailable")]=n}),!n)return void(i(e(g,"ngfHideOnDropNotAvailable"))(a)===!0&&f.css("display","none"));var o=!1;-1===e(g,"ngfDrop").search(/\W+$files\W+/)&&a.$watch(e(g,"ngfDrop"),function(a){o=a===!1});var p,q=null,r=i(e(g,"ngfStopPropagation")),s=1;f[0].addEventListener("dragover",function(b){if(!f.attr("disabled")&&!o){if(b.preventDefault(),r(a)&&b.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var c=b.dataTransfer.effectAllowed;b.dataTransfer.dropEffect="move"===c||"linkMove"===c?"move":"copy"}j.cancel(q),a.actualDragOverClass||(p=l(a,g,b)),f.addClass(p)}},!1),f[0].addEventListener("dragenter",function(b){f.attr("disabled")||o||(b.preventDefault(),r(a)&&b.stopPropagation())},!1),f[0].addEventListener("dragleave",function(){f.attr("disabled")||o||(q=j(function(){f.removeClass(p),p=null},s||1))},!1),f[0].addEventListener("drop",function(b){f.attr("disabled")||o||(b.preventDefault(),r(a)&&b.stopPropagation(),f.removeClass(p),p=null,m(b,function(c,f){d(i,j,a,h,g,e(g,"ngfChange")||e(g,"ngfDrop"),c,f,b)},i(e(g,"ngfAllowDir"))(a)!==!1,e(g,"multiple")||i(e(g,"ngfMultiple"))(a)))},!1)}function b(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}var c=ngFileUpload.validate,d=ngFileUpload.updateModel,e=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfDrop",["$parse","$timeout","$location",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.directive("ngfNoFileDrop",function(){return function(a,c){b()&&c.css("display","none")}}),ngFileUpload.directive("ngfDropAvailable",["$parse","$timeout",function(a,c){return function(d,f,g){if(b()){var h=a(e(g,"ngfDropAvailable"));c(function(){h(d),h.assign&&h.assign(d,!0)})}}}])}(),function(){function a(a,b,c,d,e,f,g){b.$watch(e,function(e){window.FileReader&&ngFileUpload.validate(b,c,d,e,null)&&a.dataUrl(e,function(a){g?g(a):e.dataUrl=a||c(f)(b)},c(d.ngfNoObjectUrl)(b))})}ngFileUpload.directive("ngfSrc",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfSrc,f.ngfDefaultSrc,function(a){e.attr("src",a)})}}}]),ngFileUpload.directive("ngfBackground",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfBackground,f.ngfDefaultBackground,function(a){e.css("background-image","url("+a+")")})}}}]),ngFileUpload.directive("ngfDataUrl",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfDataUrl,f.ngfDefaultDataUrl)}}}])}(); |
@@ -5,3 +5,3 @@ /**! | ||
* @author Danial <danial.farid@gmail.com> | ||
* @version 5.0.9 | ||
* @version 5.1.0 | ||
*/ | ||
@@ -8,0 +8,0 @@ |
@@ -1,2 +0,2 @@ | ||
/*! 5.0.9 */ | ||
/*! 5.1.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){}}if(window.FileAPI||(window.FileAPI={}),FileAPI.shouldLoad=window.XMLHttpRequest&&!window.FormData||FileAPI.forceLoad,FileAPI.shouldLoad){var c=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,d,e){c(this),this.__url=d;try{a.apply(this,[b,d,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,d){if("__setXHR_"===b){c(this);var e=d(this);e instanceof Function&&e(this)}else this.__requestHeaders=this.__requestHeaders||{},this.__requestHeaders[b]=d,a.apply(this,arguments)}}),a("send",function(a){return function(){var c=this;if(arguments[0]&&arguments[0].__isFileAPIShim){var d=arguments[0],e={url:c.__url,jsonp:!1,cache:!0,complete:function(a,d){c.__completed=!0,!a&&c.__listeners.load&&c.__listeners.load({type:"load",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),!a&&c.__listeners.loadend&&c.__listeners.loadend({type:"loadend",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),"abort"===a&&c.__listeners.abort&&c.__listeners.abort({type:"abort",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),void 0!==d.status&&b(c,"status",function(){return 0===d.status&&a&&"abort"!==a?500:d.status}),void 0!==d.statusText&&b(c,"statusText",function(){return d.statusText}),b(c,"readyState",function(){return 4}),void 0!==d.response&&b(c,"response",function(){return d.response});var e=d.responseText||(a&&0===d.status&&"abort"!==a?a:void 0);b(c,"responseText",function(){return e}),b(c,"response",function(){return e}),a&&b(c,"err",function(){return a}),c.__fileApiXHR=d,c.onreadystatechange&&c.onreadystatechange(),c.onload&&c.onload()},progress:function(a){if(a.target=c,c.__listeners.progress&&c.__listeners.progress(a),c.__total=a.total,c.__loaded=a.loaded,a.total===a.loaded){var b=this;setTimeout(function(){c.__completed||(c.getAllResponseHeaders=function(){},b.complete(null,{status:204,statusText:"No Content"}))},FileAPI.noContentTimeout||1e4)}},headers:c.__requestHeaders};e.data={},e.files={};for(var f=0;f<d.data.length;f++){var g=d.data[f];null!=g.val&&null!=g.val.name&&null!=g.val.size&&null!=g.val.type?e.files[g.key]=g.val:e.data[g.key]=g.val}setTimeout(function(){if(!FileAPI.hasFlash)throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';c.__fileApiXHR=FileAPI.upload(e)},1)}else{if(this.__origError)throw this.__origError;a.apply(c,arguments)}}}),window.XMLHttpRequest.__isFileAPIShim=!0,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(){function a(a){return"input"===a[0].tagName.toLowerCase()&&a.attr("type")&&"file"===a.attr("type").toLowerCase()}function b(){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}function c(a){var b=0,c=0;if(window.jQuery)return jQuery(a).offset();if(a.offsetParent)do b+=a.offsetLeft-a.scrollLeft,c+=a.offsetTop-a.scrollTop,a=a.offsetParent;while(a);return{left:b,top:c}}if(FileAPI.shouldLoad){if(FileAPI.forceLoad&&(FileAPI.html5=!1),!FileAPI.upload){var d,e,f,g,h,i=document.createElement("script"),j=document.getElementsByTagName("script");if(window.FileAPI.jsUrl)d=window.FileAPI.jsUrl;else if(window.FileAPI.jsPath)e=window.FileAPI.jsPath;else for(f=0;f<j.length;f++)if(h=j[f].src,g=h.search(/\/ng\-file\-upload[\-a-zA-z0-9\.]*\.js/),g>-1){e=h.substring(0,g+1);break}null==FileAPI.staticPath&&(FileAPI.staticPath=e),i.setAttribute("src",d||e+"FileAPI.min.js"),document.getElementsByTagName("head")[0].appendChild(i),FileAPI.hasFlash=b()}FileAPI.ngfFixIE=function(d,e,f,g){if(!b())throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';var h=function(){if(d.attr("disabled"))d.$$ngfRefElem.removeClass("js-fileapi-wrapper");else{var b=d.$$ngfRefElem;b?f(d.$$ngfRefElem):(b=d.$$ngfRefElem=e(),b.addClass("js-fileapi-wrapper"),!a(d),setTimeout(function(){b.bind("mouseenter",h)},10),b.bind("change",function(a){i.apply(this,[a]),g.apply(this,[a])})),a(d)||b.css("position","absolute").css("top",c(d[0]).top+"px").css("left",c(d[0]).left+"px").css("width",d[0].offsetWidth+"px").css("height",d[0].offsetHeight+"px").css("filter","alpha(opacity=0)").css("display",d.css("display")).css("overflow","hidden").css("z-index","900000").css("visibility","visible")}};d.bind("mouseenter",h);var i=function(a){for(var b=FileAPI.getFiles(a),c=0;c<b.length;c++)void 0===b[c].size&&(b[c].size=0),void 0===b[c].name&&(b[c].name="file"),void 0===b[c].type&&(b[c].type="undefined");a.target||(a.target={}),a.target.files=b,a.target.files!==b&&(a.__files_=b),(a.__files_||a.target.files).item=function(b){return(a.__files_||a.target.files)[b]||null}}},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){b||(b=!0,a.onloadstart&&a.onloadstart(c("loadstart",d)));var e;"load"===d.type?(a.onloadend&&a.onloadend(c("loadend",d)),e=c("load",d),a.onload&&a.onload(e),a.dispatchEvent(e)):"progress"===d.type?(e=c("progress",d),a.onprogress&&a.onprogress(e),a.dispatchEvent(e)):(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 5.0.9 | ||
* @version 5.1.0 | ||
*/ | ||
@@ -25,3 +25,5 @@ | ||
ngFileUpload.version = '5.0.9'; | ||
ngFileUpload.version = '5.1.0'; | ||
ngFileUpload.defaults = {}; | ||
ngFileUpload.service('Upload', ['$http', '$q', '$timeout', function ($http, $q, $timeout) { | ||
@@ -199,2 +201,31 @@ function sendHttp(config) { | ||
}; | ||
this.dataUrl = function (file, callback, disallowObjectUrl) { | ||
if (window.FileReader && file && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) { | ||
$timeout(function () { | ||
//prefer URL.createObjectURL for handling refrences to files of all sizes | ||
//since it doesn´t build a large string in memory | ||
var URL = window.URL || window.webkitURL; | ||
if (URL && URL.createObjectURL && !disallowObjectUrl) { | ||
callback(URL.createObjectURL(file)); | ||
} else { | ||
var fileReader = new FileReader(); | ||
fileReader.readAsDataURL(file); | ||
fileReader.onload = function (e) { | ||
$timeout(function () { | ||
callback(e.target.result); | ||
}); | ||
}; | ||
} | ||
}); | ||
} else { | ||
callback(null); | ||
} | ||
}; | ||
this.setDefaults = function(defaults) { | ||
ngFileUpload.defaults = defaults || {}; | ||
}; | ||
} | ||
@@ -205,260 +236,310 @@ | ||
(function () { | ||
ngFileUpload.directive('ngfSelect', ['$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); | ||
} | ||
}; | ||
}]); | ||
ngFileUpload.getAttrWithDefaults = function(attr, name) { | ||
return attr[name] != null ? attr[name] : | ||
(ngFileUpload.defaults[name] == null ? | ||
ngFileUpload.defaults[name] : ngFileUpload.defaults[name].toString()); | ||
}; | ||
function linkFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile) { | ||
/** @namespace attr.ngfSelect */ | ||
/** @namespace attr.ngfChange */ | ||
/** @namespace attr.ngModel */ | ||
/** @namespace attr.ngModelRejected */ | ||
/** @namespace attr.ngfMultiple */ | ||
/** @namespace attr.ngfCapture */ | ||
/** @namespace attr.ngfAccept */ | ||
/** @namespace attr.ngfMaxSize */ | ||
/** @namespace attr.ngfMinSize */ | ||
/** @namespace attr.ngfResetOnClick */ | ||
/** @namespace attr.ngfResetModelOnClick */ | ||
/** @namespace attr.ngfKeep */ | ||
/** @namespace attr.ngfKeepDistinct */ | ||
var getAttr = ngFileUpload.getAttrWithDefaults; | ||
if (elem.attr('__ngf_gen__')) { | ||
return; | ||
ngFileUpload.directive('ngfSelect', ['$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); | ||
} | ||
}; | ||
}]); | ||
scope.$on('$destroy', function () { | ||
if (elem.$$ngfRefElem) elem.$$ngfRefElem.remove(); | ||
}); | ||
function linkFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile) { | ||
/** @namespace attr.ngfSelect */ | ||
/** @namespace attr.ngfChange */ | ||
/** @namespace attr.ngModel */ | ||
/** @namespace attr.ngModelRejected */ | ||
/** @namespace attr.ngfMultiple */ | ||
/** @namespace attr.ngfCapture */ | ||
/** @namespace attr.ngfAccept */ | ||
/** @namespace attr.ngfMaxSize */ | ||
/** @namespace attr.ngfMinSize */ | ||
/** @namespace attr.ngfResetOnClick */ | ||
/** @namespace attr.ngfResetModelOnClick */ | ||
/** @namespace attr.ngfKeep */ | ||
/** @namespace attr.ngfKeepDistinct */ | ||
var disabled = false; | ||
if (attr.ngfSelect.search(/\W+$files\W+/) === -1) { | ||
scope.$watch(attr.ngfSelect, function (val) { | ||
disabled = val === false; | ||
}); | ||
} | ||
function isInputTypeFile() { | ||
return elem[0].tagName.toLowerCase() === 'input' && attr.type && attr.type.toLowerCase() === 'file'; | ||
} | ||
if (elem.attr('__ngf_gen__')) { | ||
return; | ||
} | ||
var isUpdating = false; | ||
scope.$on('$destroy', function () { | ||
if (elem.$$ngfRefElem) elem.$$ngfRefElem.remove(); | ||
}); | ||
function changeFn(evt) { | ||
if (!isUpdating) { | ||
isUpdating = true; | ||
try { | ||
var fileList = evt.__files_ || (evt.target && evt.target.files); | ||
var files = [], rejFiles = []; | ||
var disabled = false; | ||
if (getAttr(attr, 'ngfSelect').search(/\W+$files\W+/) === -1) { | ||
scope.$watch(getAttr(attr, 'ngfSelect'), function (val) { | ||
disabled = val === false; | ||
}); | ||
} | ||
function isInputTypeFile() { | ||
return elem[0].tagName.toLowerCase() === 'input' && attr.type && attr.type.toLowerCase() === 'file'; | ||
} | ||
for (var i = 0; i < fileList.length; i++) { | ||
var file = fileList.item(i); | ||
if (validate(scope, $parse, attr, file, evt)) { | ||
files.push(file); | ||
} else { | ||
rejFiles.push(file); | ||
} | ||
} | ||
updateModel($parse, $timeout, scope, ngModel, attr, attr.ngfChange || attr.ngfSelect, files, rejFiles, evt); | ||
if (files.length === 0) evt.target.value = files; | ||
var isUpdating = false; | ||
function changeFn(evt) { | ||
if (!isUpdating) { | ||
isUpdating = true; | ||
try { | ||
var fileList = evt.__files_ || (evt.target && evt.target.files); | ||
var files = [], rejFiles = []; | ||
for (var i = 0; i < fileList.length; i++) { | ||
var file = fileList.item(i); | ||
if (validate(scope, $parse, attr, file, evt)) { | ||
files.push(file); | ||
} else { | ||
rejFiles.push(file); | ||
} | ||
} | ||
updateModel($parse, $timeout, scope, ngModel, attr, | ||
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), files, rejFiles, evt); | ||
if (files.length === 0) evt.target.value = files; | ||
// if (evt.target && evt.target.getAttribute('__ngf_gen__')) { | ||
// angular.element(evt.target).remove(); | ||
// } | ||
} finally { | ||
isUpdating = false; | ||
} | ||
} | ||
} finally { | ||
isUpdating = false; | ||
} | ||
} | ||
} | ||
function bindAttrToFileInput(fileElem) { | ||
if (attr.ngfMultiple) fileElem.attr('multiple', $parse(attr.ngfMultiple)(scope)); | ||
if (attr.ngfCapture) fileElem.attr('capture', $parse(attr.ngfCapture)(scope)); | ||
if (attr.accept) fileElem.attr('accept', attr.accept); | ||
for (var i = 0; i < elem[0].attributes.length; i++) { | ||
var attribute = elem[0].attributes[i]; | ||
if ((isInputTypeFile() && attribute.name !== 'type') || | ||
(attribute.name !== 'type' && attribute.name !== 'class' && | ||
attribute.name !== 'id' && attribute.name !== 'style')) { | ||
fileElem.attr(attribute.name, attribute.value); | ||
} | ||
} | ||
function bindAttrToFileInput(fileElem) { | ||
if (getAttr(attr, 'ngfMultiple')) fileElem.attr('multiple', $parse(getAttr(attr, 'ngfMultiple'))(scope)); | ||
if (getAttr(attr, 'ngfCapture')) fileElem.attr('capture', $parse(getAttr(attr, 'ngfCapture'))(scope)); | ||
if (getAttr(attr, 'accept')) fileElem.attr('accept', getAttr(attr, 'accept')); | ||
for (var i = 0; i < elem[0].attributes.length; i++) { | ||
var attribute = elem[0].attributes[i]; | ||
if ((isInputTypeFile() && attribute.name !== 'type') || | ||
(attribute.name !== 'type' && attribute.name !== 'class' && | ||
attribute.name !== 'id' && attribute.name !== 'style')) { | ||
fileElem.attr(attribute.name, attribute.value); | ||
} | ||
} | ||
} | ||
function createFileInput(evt, resetOnClick) { | ||
if (!resetOnClick && (evt || isInputTypeFile())) return elem.$$ngfRefElem || elem; | ||
function createFileInput(evt, resetOnClick) { | ||
if (!resetOnClick && (evt || isInputTypeFile())) return elem.$$ngfRefElem || elem; | ||
var fileElem = angular.element('<input type="file">'); | ||
bindAttrToFileInput(fileElem); | ||
var fileElem = angular.element('<input type="file">'); | ||
bindAttrToFileInput(fileElem); | ||
if (isInputTypeFile()) { | ||
elem.replaceWith(fileElem); | ||
elem = fileElem; | ||
fileElem.attr('__ngf_gen__', true); | ||
$compile(elem)(scope); | ||
} else { | ||
fileElem.css('visibility', 'hidden').css('position', 'absolute').css('overflow', 'hidden') | ||
.css('width', '0px').css('height', '0px').css('z-index', '-100000').css('border', 'none') | ||
.css('margin', '0px').css('padding', '0px').attr('tabindex', '-1'); | ||
if (elem.$$ngfRefElem) { | ||
elem.$$ngfRefElem.remove(); | ||
} | ||
elem.$$ngfRefElem = fileElem; | ||
document.body.appendChild(fileElem[0]); | ||
} | ||
return fileElem; | ||
if (isInputTypeFile()) { | ||
elem.replaceWith(fileElem); | ||
elem = fileElem; | ||
fileElem.attr('__ngf_gen__', true); | ||
$compile(elem)(scope); | ||
} else { | ||
fileElem.css('visibility', 'hidden').css('position', 'absolute').css('overflow', 'hidden') | ||
.css('width', '0px').css('height', '0px').css('z-index', '-100000').css('border', 'none') | ||
.css('margin', '0px').css('padding', '0px').attr('tabindex', '-1'); | ||
if (elem.$$ngfRefElem) { | ||
elem.$$ngfRefElem.remove(); | ||
} | ||
elem.$$ngfRefElem = fileElem; | ||
document.body.appendChild(fileElem[0]); | ||
} | ||
function resetModel(evt) { | ||
updateModel($parse, $timeout, scope, ngModel, attr, attr.ngfChange || attr.ngfSelect, [], [], evt, true); | ||
} | ||
return fileElem; | ||
} | ||
function clickHandler(evt) { | ||
if (elem.attr('disabled') || disabled) return false; | ||
if (evt != null) { | ||
evt.preventDefault(); | ||
evt.stopPropagation(); | ||
} | ||
var resetOnClick = $parse(attr.ngfResetOnClick)(scope) !== false; | ||
var fileElem = createFileInput(evt, resetOnClick); | ||
function resetModel(evt) { | ||
updateModel($parse, $timeout, scope, ngModel, attr, | ||
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), [], [], evt, true); | ||
} | ||
function clickAndAssign(evt) { | ||
if (evt) { | ||
fileElem[0].click(); | ||
} | ||
if (isInputTypeFile() || !evt) { | ||
elem.bind('click touchend', clickHandler); | ||
} | ||
} | ||
var initialTouchStartY = 0; | ||
if (fileElem) { | ||
if (!evt || resetOnClick) fileElem.bind('change', changeFn); | ||
if (evt && resetOnClick && $parse(attr.ngfResetModelOnClick)(scope) !== false) resetModel(evt); | ||
function clickHandler(evt) { | ||
if (elem.attr('disabled') || disabled) return false; | ||
// fix for android native browser < 4.4 | ||
if (shouldClickLater(navigator.userAgent)) { | ||
setTimeout(function () { | ||
clickAndAssign(evt); | ||
}, 0); | ||
} else { | ||
clickAndAssign(evt); | ||
} | ||
} | ||
return false; | ||
if (evt != null) { | ||
if (evt.type === 'touchstart') { | ||
initialTouchStartY = evt.originalEvent.touches[0].clientY; | ||
return true; // don't block event default | ||
} else { | ||
evt.stopPropagation(); | ||
evt.preventDefault(); | ||
// prevent scroll from triggering event | ||
if (evt.type === 'touchend') { | ||
var currentLocation = evt.originalEvent.changedTouches[0].clientY; | ||
if (Math.abs(currentLocation - initialTouchStartY) > 20) return false; | ||
} | ||
} | ||
} | ||
if (window.FileAPI && window.FileAPI.ngfFixIE) { | ||
window.FileAPI.ngfFixIE(elem, createFileInput, bindAttrToFileInput, changeFn); | ||
var resetOnClick = $parse(getAttr(attr, 'ngfResetOnClick'))(scope) !== false; | ||
var fileElem = createFileInput(evt, resetOnClick); | ||
function clickAndAssign(evt) { | ||
if (evt && evt.clientY > 0) { | ||
fileElem[0].click(); | ||
} | ||
if ((isInputTypeFile() || !evt) && resetOnClick) { | ||
elem.bind('click touchend touchstart', clickHandler); | ||
} | ||
} | ||
if (fileElem) { | ||
if (!evt || resetOnClick) fileElem.bind('change', changeFn); | ||
if (evt && resetOnClick && $parse(getAttr(attr, 'ngfResetModelOnClick'))(scope) !== false) { | ||
resetModel(evt); | ||
} | ||
// fix for android native browser < 4.4 | ||
if (shouldClickLater(navigator.userAgent)) { | ||
setTimeout(function () { | ||
clickAndAssign(evt); | ||
}, 0); | ||
} else { | ||
clickHandler(); | ||
//if (!isInputTypeFile()) { | ||
// elem.bind('click touchend', clickHandler); | ||
//} | ||
clickAndAssign(evt); | ||
} | ||
} | ||
return false; | ||
} | ||
function shouldClickLater(ua) { | ||
// android below 4.4 | ||
var m = ua.match(/Android[^\d]*(\d+)\.(\d+)/); | ||
if (m && m.length > 2) { | ||
return parseInt(m[1]) < 4 || (parseInt(m[1]) === 4 && parseInt(m[2]) < 4); | ||
} | ||
if (window.FileAPI && window.FileAPI.ngfFixIE) { | ||
window.FileAPI.ngfFixIE(elem, createFileInput, bindAttrToFileInput, changeFn); | ||
} else { | ||
clickHandler(); | ||
//if (!isInputTypeFile()) { | ||
// elem.bind('click touchend', clickHandler); | ||
//} | ||
} | ||
} | ||
// safari on windows | ||
return /.*Windows.*Safari.*/.test(ua); | ||
function shouldClickLater(ua) { | ||
// android below 4.4 | ||
var m = ua.match(/Android[^\d]*(\d+)\.(\d+)/); | ||
if (m && m.length > 2) { | ||
var v = ngFileUpload.defaults.androidFixMinorVersion || 4; | ||
return parseInt(m[1]) < 4 || (parseInt(m[1]) === v && parseInt(m[2]) < v); | ||
} | ||
ngFileUpload.validate = function (scope, $parse, attr, file, evt) { | ||
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; | ||
} | ||
// safari on windows | ||
return ua.indexOf('Chrome') === -1 && /.*Windows.*Safari.*/.test(ua); | ||
} | ||
var accept = $parse(attr.ngfAccept)(scope, {$file: file, $event: evt}); | ||
var fileSizeMax = $parse(attr.ngfMaxSize)(scope, {$file: file, $event: evt}) || 9007199254740991; | ||
var fileSizeMin = $parse(attr.ngfMinSize)(scope, {$file: file, $event: evt}) || -1; | ||
if (accept != null && angular.isString(accept)) { | ||
var regexp = new RegExp(globStringToRegex(accept), 'gi'); | ||
accept = (file.type != null && regexp.test(file.type.toLowerCase())) || | ||
(file.name != null && regexp.test(file.name.toLowerCase())); | ||
ngFileUpload.validate = function (scope, $parse, attr, file, evt) { | ||
if (file == null) { | ||
return false; | ||
} | ||
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 += '|'; | ||
} | ||
} | ||
return (accept == null || accept) && (file.size == null || (file.size < fileSizeMax && file.size > fileSizeMin)); | ||
}; | ||
} else { | ||
if (str.indexOf('.') === 0) { | ||
str = '*' + str; | ||
} | ||
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$'; | ||
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.'); | ||
} | ||
return result; | ||
} | ||
ngFileUpload.updateModel = function ($parse, $timeout, scope, ngModel, attr, fileChange, | ||
files, rejFiles, evt, noDelay) { | ||
function update() { | ||
if ($parse(attr.ngfKeep)(scope) === true) { | ||
var prevFiles = (ngModel.$modelValue || []).slice(0); | ||
if (!files || !files.length) { | ||
files = prevFiles; | ||
} else if ($parse(attr.ngfKeepDistinct)(scope) === true) { | ||
var len = prevFiles.length; | ||
for (var i = 0; i < files.length; i++) { | ||
for (var j = 0; j < len; j++) { | ||
if (files[i].name === prevFiles[j].name) break; | ||
} | ||
if (j === len) { | ||
prevFiles.push(files[i]); | ||
} | ||
} | ||
files = prevFiles; | ||
} else { | ||
files = prevFiles.concat(files); | ||
} | ||
var accept = $parse(getAttr(attr, 'ngfAccept'))(scope, {$file: file, $event: evt}); | ||
var fileSizeMax = $parse(getAttr(attr, 'ngfMaxSize'))(scope, {$file: file, $event: evt}) || 9007199254740991; | ||
var fileSizeMin = $parse(getAttr(attr, 'ngfMinSize'))(scope, {$file: file, $event: evt}) || -1; | ||
if (accept != null && angular.isString(accept)) { | ||
var regexp = new RegExp(globStringToRegex(accept), 'gi'); | ||
accept = (file.type != null && regexp.test(file.type.toLowerCase())) || | ||
(file.name != null && regexp.test(file.name.toLowerCase())); | ||
if (!accept) { | ||
file.$error = 'accept'; | ||
return false; | ||
} | ||
} else { | ||
if (accept === false) { | ||
file.$error = 'accept'; | ||
return false; | ||
} | ||
} | ||
if (file.size == null) return true; | ||
if (file.size > fileSizeMax) { | ||
file.$error = 'maxSize'; | ||
return false; | ||
} | ||
if (file.size < fileSizeMin) { | ||
file.$error = 'minSize'; | ||
return false; | ||
} | ||
return true; | ||
}; | ||
ngFileUpload.updateModel = function ($parse, $timeout, scope, ngModel, attr, fileChange, | ||
files, rejFiles, evt, noDelay) { | ||
function update() { | ||
if ($parse(getAttr(attr, 'ngfKeep'))(scope) === true) { | ||
var prevFiles = (ngModel.$modelValue || []).slice(0); | ||
if (!files || !files.length) { | ||
files = prevFiles; | ||
} else if ($parse(getAttr(attr, 'ngfKeepDistinct'))(scope) === true) { | ||
var len = prevFiles.length; | ||
for (var i = 0; i < files.length; i++) { | ||
for (var j = 0; j < len; j++) { | ||
if (files[i].name === prevFiles[j].name) break; | ||
} | ||
if (ngModel) { | ||
$parse(attr.ngModel).assign(scope, files); | ||
$timeout(function () { | ||
if (ngModel) { | ||
ngModel.$setViewValue(files != null && files.length === 0 ? null : files); | ||
} | ||
}); | ||
if (j === len) { | ||
prevFiles.push(files[i]); | ||
} | ||
if (attr.ngModelRejected) { | ||
$parse(attr.ngModelRejected).assign(scope, rejFiles); | ||
} | ||
if (fileChange) { | ||
$parse(fileChange)(scope, { | ||
$files: files, | ||
$rejectedFiles: rejFiles, | ||
$event: evt | ||
}); | ||
} | ||
} | ||
if (noDelay) { | ||
update(); | ||
} | ||
files = prevFiles; | ||
} else { | ||
$timeout(function () { | ||
update(); | ||
}); | ||
files = prevFiles.concat(files); | ||
} | ||
}; | ||
} | ||
if (ngModel) { | ||
$parse(getAttr(attr, 'ngModel')).assign(scope, files); | ||
$timeout(function () { | ||
if (ngModel) { | ||
ngModel.$setViewValue(files != null && files.length === 0 ? null : files); | ||
} | ||
}); | ||
} | ||
if (getAttr(attr, 'ngModelRejected')) { | ||
$parse(getAttr(attr, 'ngModelRejected')).assign(scope, rejFiles); | ||
} | ||
if (fileChange) { | ||
$parse(fileChange)(scope, { | ||
$files: files, | ||
$rejectedFiles: rejFiles, | ||
$event: evt | ||
}); | ||
} | ||
} | ||
var validate = ngFileUpload.validate; | ||
var updateModel = ngFileUpload.updateModel; | ||
if (noDelay) { | ||
update(); | ||
} else { | ||
$timeout(function () { | ||
update(); | ||
}); | ||
} | ||
}; | ||
var validate = ngFileUpload.validate; | ||
var updateModel = ngFileUpload.updateModel; | ||
})(); | ||
@@ -469,2 +550,3 @@ | ||
var updateModel = ngFileUpload.updateModel; | ||
var getAttr = ngFileUpload.getAttrWithDefaults; | ||
@@ -490,3 +572,3 @@ ngFileUpload.directive('ngfDrop', ['$parse', '$timeout', '$location', function ($parse, $timeout, $location) { | ||
if (dropAvailable()) { | ||
var fn = $parse(attr.ngfDropAvailable); | ||
var fn = $parse(getAttr(attr, 'ngfDropAvailable')); | ||
$timeout(function () { | ||
@@ -504,8 +586,8 @@ fn(scope); | ||
var available = dropAvailable(); | ||
if (attr.dropAvailable) { | ||
if (getAttr(attr, 'dropAvailable')) { | ||
$timeout(function () { | ||
if (scope[attr.dropAvailable]) { | ||
scope[attr.dropAvailable].value = available; | ||
if (scope[getAttr(attr, 'dropAvailable')]) { | ||
scope[getAttr(attr, 'dropAvailable')].value = available; | ||
} else { | ||
scope[attr.dropAvailable] = available; | ||
scope[getAttr(attr, 'dropAvailable')] = available; | ||
} | ||
@@ -515,3 +597,3 @@ }); | ||
if (!available) { | ||
if ($parse(attr.ngfHideOnDropNotAvailable)(scope) === true) { | ||
if ($parse(getAttr(attr, 'ngfHideOnDropNotAvailable'))(scope) === true) { | ||
elem.css('display', 'none'); | ||
@@ -523,4 +605,4 @@ } | ||
var disabled = false; | ||
if (attr.ngfDrop.search(/\W+$files\W+/) === -1) { | ||
scope.$watch(attr.ngfDrop, function(val) { | ||
if (getAttr(attr, 'ngfDrop').search(/\W+$files\W+/) === -1) { | ||
scope.$watch(getAttr(attr, 'ngfDrop'), function(val) { | ||
disabled = val === false; | ||
@@ -531,3 +613,3 @@ }); | ||
var leaveTimeout = null; | ||
var stopPropagation = $parse(attr.ngfStopPropagation); | ||
var stopPropagation = $parse(getAttr(attr, 'ngfStopPropagation')); | ||
var dragOverDelay = 1; | ||
@@ -571,4 +653,5 @@ var actualDragOverClass; | ||
updateModel($parse, $timeout, scope, ngModel, attr, | ||
attr.ngfChange || attr.ngfDrop, files, rejFiles, evt); | ||
}, $parse(attr.ngfAllowDir)(scope) !== false, attr.multiple || $parse(attr.ngfMultiple)(scope)); | ||
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt); | ||
}, $parse(getAttr(attr, 'ngfAllowDir'))(scope) !== false, | ||
getAttr(attr, 'multiple') || $parse(getAttr(attr, 'ngfMultiple'))(scope)); | ||
}, false); | ||
@@ -586,3 +669,3 @@ | ||
} | ||
var clazz = $parse(attr.ngfDragOverClass)(scope, {$event: evt}); | ||
var clazz = $parse(getAttr(attr, 'ngfDragOverClass'))(scope, {$event: evt}); | ||
if (clazz) { | ||
@@ -592,3 +675,3 @@ if (clazz.delay) dragOverDelay = clazz.delay; | ||
} | ||
return clazz || attr.ngfDragOverClass || 'dragover'; | ||
return clazz || getAttr(attr, 'ngfDragOverClass') || 'dragover'; | ||
} | ||
@@ -701,33 +784,35 @@ | ||
ngFileUpload.directive('ngfSrc', ['$parse', '$timeout', function ($parse, $timeout) { | ||
function dropAvailable() { | ||
var div = document.createElement('div'); | ||
return ('draggable' in div) && ('ondrop' in div); | ||
} | ||
})(); | ||
(function () { | ||
function fileToSrc(Upload, scope, $parse, attr, name, defaultName, callback) { | ||
scope.$watch(name, function (file) { | ||
if (window.FileReader && ngFileUpload.validate(scope, $parse, attr, file, null)) { | ||
Upload.dataUrl(file, function(url) { | ||
if (callback) { | ||
callback(url); | ||
} else { | ||
file.dataUrl = url || $parse(defaultName)(scope); | ||
} | ||
}, $parse(attr.ngfNoObjectUrl)(scope)); | ||
} | ||
}); | ||
} | ||
/** @namespace attr.ngfSrc */ | ||
/** @namespace attr.ngfDefaultSrc */ | ||
/** @namespace attr.ngfNoObjectUrl */ | ||
ngFileUpload.directive('ngfSrc', ['$parse', 'Upload', function ($parse, Upload) { | ||
return { | ||
restrict: 'AE', | ||
link: function (scope, elem, attr) { | ||
if (window.FileReader) { | ||
scope.$watch(attr.ngfSrc, function (file) { | ||
if (file && | ||
validate(scope, $parse, attr, file, null) && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) { | ||
$timeout(function () { | ||
//prefer URL.createObjectURL for handling refrences to files of all sizes | ||
//since it doesn´t build a large string in memory | ||
var URL = window.URL || window.webkitURL; | ||
if (URL && URL.createObjectURL) { | ||
elem.attr('src', URL.createObjectURL(file)); | ||
} else { | ||
var fileReader = new FileReader(); | ||
fileReader.readAsDataURL(file); | ||
fileReader.onload = function (e) { | ||
$timeout(function () { | ||
elem.attr('src', e.target.result); | ||
}); | ||
}; | ||
} | ||
}); | ||
} else { | ||
elem.attr('src', attr.ngfDefaultSrc || ''); | ||
} | ||
}); | ||
} | ||
fileToSrc(Upload, scope, $parse, attr, attr.ngfSrc, attr.ngfDefaultSrc, function (url) { | ||
elem.attr('src', url); | ||
}); | ||
} | ||
@@ -737,7 +822,28 @@ }; | ||
function dropAvailable() { | ||
var div = document.createElement('div'); | ||
return ('draggable' in div) && ('ondrop' in div); | ||
} | ||
/** @namespace attr.ngfBackground */ | ||
/** @namespace attr.ngfDefaultBackground */ | ||
/** @namespace attr.ngfNoObjectUrl */ | ||
ngFileUpload.directive('ngfBackground', ['$parse', 'Upload', function ($parse, Upload) { | ||
return { | ||
restrict: 'AE', | ||
link: function (scope, elem, attr) { | ||
fileToSrc(Upload, scope, $parse, attr, attr.ngfBackground, attr.ngfDefaultBackground, function (url) { | ||
elem.css('background-image', 'url(' + url + ')'); | ||
}); | ||
} | ||
}; | ||
}]); | ||
/** @namespace attr.ngfDataUrl */ | ||
/** @namespace attr.ngfDefaultDataUrl */ | ||
/** @namespace attr.ngfNoObjectUrl */ | ||
ngFileUpload.directive('ngfDataUrl', ['$parse', 'Upload', function ($parse, Upload) { | ||
return { | ||
restrict: 'AE', | ||
link: function (scope, elem, attr) { | ||
fileToSrc(Upload, scope, $parse, attr, attr.ngfDataUrl, attr.ngfDefaultDataUrl); | ||
} | ||
}; | ||
}]); | ||
})(); |
@@ -1,2 +0,2 @@ | ||
/*! 5.0.9 */ | ||
!window.XMLHttpRequest||window.FileAPI&&FileAPI.shouldLoad||(window.XMLHttpRequest.prototype.setRequestHeader=function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}}(window.XMLHttpRequest.prototype.setRequestHeader));var ngFileUpload=angular.module("ngFileUpload",[]);ngFileUpload.version="5.0.9",ngFileUpload.service("Upload",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{};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.progressFunc&&c(function(){f.progressFunc(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(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.progressFunc=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){function b(c,d,e){if(void 0!==d)if(angular.isDate(d)&&(d=d.toISOString()),angular.isString(d))c.append(e,d);else if("form"===a.sendFieldsAs)if(angular.isObject(d))for(var f in d)d.hasOwnProperty(f)&&b(c,d[f],e+"["+f+"]");else c.append(e,d);else d=angular.isString(d)?d:JSON.stringify(d),"json-blob"===a.sendFieldsAs?c.append(e,new Blob([d],{type:"application/json"})):c.append(e,d)}return a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?angular.isArray(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(c){var d,e=new FormData,f={};for(d in a.fields)a.fields.hasOwnProperty(d)&&(f[d]=a.fields[d]);c&&(f.data=c);for(d in f)if(f.hasOwnProperty(d)){var g=f[d];a.formDataAppender?a.formDataAppender(e,d,g):b(e,g,d)}if(null!=a.file){var h=a.fileFormDataName||"file";if(angular.isArray(a.file))for(var i=angular.isString(h),j=0;j<a.file.length;j++)e.append(i?h:h[j],a.file[j],a.fileName&&a.fileName[j]||a.file[j].name);else e.append(h,a.file,a.fileName||a.file.name)}return e}),d(a)},this.http=function(b){return b.transformRequest=b.transformRequest||function(b){return window.ArrayBuffer&&b instanceof window.ArrayBuffer||b instanceof Blob?b:a.defaults.transformRequest[0](arguments)},d(b)}}]),function(){function a(a,e,f,g,h,i,j){function k(){return"input"===e[0].tagName.toLowerCase()&&f.type&&"file"===f.type.toLowerCase()}function l(b){if(!r){r=!0;try{for(var e=b.__files_||b.target&&b.target.files,j=[],k=[],l=0;l<e.length;l++){var m=e.item(l);c(a,h,f,m,b)?j.push(m):k.push(m)}d(h,i,a,g,f,f.ngfChange||f.ngfSelect,j,k,b),0===j.length&&(b.target.value=j)}finally{r=!1}}}function m(b){f.ngfMultiple&&b.attr("multiple",h(f.ngfMultiple)(a)),f.ngfCapture&&b.attr("capture",h(f.ngfCapture)(a)),f.accept&&b.attr("accept",f.accept);for(var c=0;c<e[0].attributes.length;c++){var d=e[0].attributes[c];(k()&&"type"!==d.name||"type"!==d.name&&"class"!==d.name&&"id"!==d.name&&"style"!==d.name)&&b.attr(d.name,d.value)}}function n(b,c){if(!c&&(b||k()))return e.$$ngfRefElem||e;var d=angular.element('<input type="file">');return m(d),k()?(e.replaceWith(d),e=d,d.attr("__ngf_gen__",!0),j(e)(a)):(d.css("visibility","hidden").css("position","absolute").css("overflow","hidden").css("width","0px").css("height","0px").css("z-index","-100000").css("border","none").css("margin","0px").css("padding","0px").attr("tabindex","-1"),e.$$ngfRefElem&&e.$$ngfRefElem.remove(),e.$$ngfRefElem=d,document.body.appendChild(d[0])),d}function o(b){d(h,i,a,g,f,f.ngfChange||f.ngfSelect,[],[],b,!0)}function p(c){function d(a){a&&i[0].click(),(k()||!a)&&e.bind("click touchend",p)}if(e.attr("disabled")||q)return!1;null!=c&&(c.preventDefault(),c.stopPropagation());var g=h(f.ngfResetOnClick)(a)!==!1,i=n(c,g);return i&&((!c||g)&&i.bind("change",l),c&&g&&h(f.ngfResetModelOnClick)(a)!==!1&&o(c),b(navigator.userAgent)?setTimeout(function(){d(c)},0):d(c)),!1}if(!e.attr("__ngf_gen__")){a.$on("$destroy",function(){e.$$ngfRefElem&&e.$$ngfRefElem.remove()});var q=!1;-1===f.ngfSelect.search(/\W+$files\W+/)&&a.$watch(f.ngfSelect,function(a){q=a===!1});var r=!1;window.FileAPI&&window.FileAPI.ngfFixIE?window.FileAPI.ngfFixIE(e,n,m,l):p()}}function b(a){var b=a.match(/Android[^\d]*(\d+)\.(\d+)/);return b&&b.length>2?parseInt(b[1])<4||4===parseInt(b[1])&&parseInt(b[2])<4:/.*Windows.*Safari.*/.test(a)}ngFileUpload.directive("ngfSelect",["$parse","$timeout","$compile",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.validate=function(a,b,c,d,e){function f(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+="("+f(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}var g=b(c.ngfAccept)(a,{$file:d,$event:e}),h=b(c.ngfMaxSize)(a,{$file:d,$event:e})||9007199254740991,i=b(c.ngfMinSize)(a,{$file:d,$event:e})||-1;if(null!=g&&angular.isString(g)){var j=new RegExp(f(g),"gi");g=null!=d.type&&j.test(d.type.toLowerCase())||null!=d.name&&j.test(d.name.toLowerCase())}return(null==g||g)&&(null==d.size||d.size<h&&d.size>i)},ngFileUpload.updateModel=function(a,b,c,d,e,f,g,h,i,j){function k(){if(a(e.ngfKeep)(c)===!0){var j=(d.$modelValue||[]).slice(0);if(g&&g.length)if(a(e.ngfKeepDistinct)(c)===!0){for(var k=j.length,l=0;l<g.length;l++){for(var m=0;k>m&&g[l].name!==j[m].name;m++);m===k&&j.push(g[l])}g=j}else g=j.concat(g);else g=j}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})}j?k():b(function(){k()})};var c=ngFileUpload.validate,d=ngFileUpload.updateModel}(),function(){function a(a,e,f,g,h,i,j){function k(a,b,d){var e=!0,f=d.dataTransfer.items;if(null!=f)for(var g=0;g<f.length&&e;g++)e=e&&("file"===f[g].kind||""===f[g].kind)&&c(a,h,b,f[g],d);var i=h(b.ngfDragOverClass)(a,{$event:d});return i&&(i.delay&&(r=i.delay),i.accept&&(i=e?i.accept:i.reject)),i||b.ngfDragOverClass||"dragover"}function l(b,d,e,g){function k(d){c(a,h,f,d,b)?m.push(d):n.push(d)}function l(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;k({name:b.name,type:"directory",path:d});var e=b.createReader(),f=[];p++;var g=function(){e.readEntries(function(d){try{if(d.length)f=f.concat(Array.prototype.slice.call(d||[],0)),g();else{for(var e=0;e<f.length;e++)l(a,f[e],(c?c:"")+b.name+"/");p--}}catch(h){p--,console.error(h)}},function(){p--})};g()}else p++,b.file(function(a){try{p--,a.path=(c?c:"")+a.name,k(a)}catch(b){p--,console.error(b)}},function(){p--})}var m=[],n=[],o=b.dataTransfer.items,p=0;if(o&&o.length>0&&"file"!==j.protocol())for(var q=0;q<o.length;q++){if(o[q].webkitGetAsEntry&&o[q].webkitGetAsEntry()&&o[q].webkitGetAsEntry().isDirectory){var r=o[q].webkitGetAsEntry();if(r.isDirectory&&!e)continue;null!=r&&l(m,r)}else{var s=o[q].getAsFile();null!=s&&k(s)}if(!g&&m.length>0)break}else{var t=b.dataTransfer.files;if(null!=t)for(var u=0;u<t.length&&(k(t.item(u)),g||!(m.length>0));u++);}var v=0;!function w(a){i(function(){if(p)10*v++<2e4&&w(10);else{if(!g&&m.length>1){for(q=0;"directory"===m[q].type;)q++;m=[m[q]]}d(m,n)}},a||0)}()}var m=b();if(f.dropAvailable&&i(function(){a[f.dropAvailable]?a[f.dropAvailable].value=m:a[f.dropAvailable]=m}),!m)return void(h(f.ngfHideOnDropNotAvailable)(a)===!0&&e.css("display","none"));var n=!1;-1===f.ngfDrop.search(/\W+$files\W+/)&&a.$watch(f.ngfDrop,function(a){n=a===!1});var o,p=null,q=h(f.ngfStopPropagation),r=1;e[0].addEventListener("dragover",function(b){if(!e.attr("disabled")&&!n){if(b.preventDefault(),q(a)&&b.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var c=b.dataTransfer.effectAllowed;b.dataTransfer.dropEffect="move"===c||"linkMove"===c?"move":"copy"}i.cancel(p),a.actualDragOverClass||(o=k(a,f,b)),e.addClass(o)}},!1),e[0].addEventListener("dragenter",function(b){e.attr("disabled")||n||(b.preventDefault(),q(a)&&b.stopPropagation())},!1),e[0].addEventListener("dragleave",function(){e.attr("disabled")||n||(p=i(function(){e.removeClass(o),o=null},r||1))},!1),e[0].addEventListener("drop",function(b){e.attr("disabled")||n||(b.preventDefault(),q(a)&&b.stopPropagation(),e.removeClass(o),o=null,l(b,function(c,e){d(h,i,a,g,f,f.ngfChange||f.ngfDrop,c,e,b)},h(f.ngfAllowDir)(a)!==!1,f.multiple||h(f.ngfMultiple)(a)))},!1)}function b(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}var c=ngFileUpload.validate,d=ngFileUpload.updateModel;ngFileUpload.directive("ngfDrop",["$parse","$timeout","$location",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.directive("ngfNoFileDrop",function(){return function(a,c){b()&&c.css("display","none")}}),ngFileUpload.directive("ngfDropAvailable",["$parse","$timeout",function(a,c){return function(d,e,f){if(b()){var g=a(f.ngfDropAvailable);c(function(){g(d),g.assign&&g.assign(d,!0)})}}}]),ngFileUpload.directive("ngfSrc",["$parse","$timeout",function(a,b){return{restrict:"AE",link:function(d,e,f){window.FileReader&&d.$watch(f.ngfSrc,function(g){g&&c(d,a,f,g,null)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 8")||g.size<2e4)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 9")||g.size<4e6)?b(function(){var a=window.URL||window.webkitURL;if(a&&a.createObjectURL)e.attr("src",a.createObjectURL(g));else{var c=new FileReader;c.readAsDataURL(g),c.onload=function(a){b(function(){e.attr("src",a.target.result)})}}}):e.attr("src",f.ngfDefaultSrc||"")})}}}])}(); | ||
/*! 5.1.0 */ | ||
!window.XMLHttpRequest||window.FileAPI&&FileAPI.shouldLoad||(window.XMLHttpRequest.prototype.setRequestHeader=function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}}(window.XMLHttpRequest.prototype.setRequestHeader));var ngFileUpload=angular.module("ngFileUpload",[]);ngFileUpload.version="5.1.0",ngFileUpload.defaults={},ngFileUpload.service("Upload",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{};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.progressFunc&&c(function(){f.progressFunc(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(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.progressFunc=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){function b(c,d,e){if(void 0!==d)if(angular.isDate(d)&&(d=d.toISOString()),angular.isString(d))c.append(e,d);else if("form"===a.sendFieldsAs)if(angular.isObject(d))for(var f in d)d.hasOwnProperty(f)&&b(c,d[f],e+"["+f+"]");else c.append(e,d);else d=angular.isString(d)?d:JSON.stringify(d),"json-blob"===a.sendFieldsAs?c.append(e,new Blob([d],{type:"application/json"})):c.append(e,d)}return a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?angular.isArray(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(c){var d,e=new FormData,f={};for(d in a.fields)a.fields.hasOwnProperty(d)&&(f[d]=a.fields[d]);c&&(f.data=c);for(d in f)if(f.hasOwnProperty(d)){var g=f[d];a.formDataAppender?a.formDataAppender(e,d,g):b(e,g,d)}if(null!=a.file){var h=a.fileFormDataName||"file";if(angular.isArray(a.file))for(var i=angular.isString(h),j=0;j<a.file.length;j++)e.append(i?h:h[j],a.file[j],a.fileName&&a.fileName[j]||a.file[j].name);else e.append(h,a.file,a.fileName||a.file.name)}return e}),d(a)},this.http=function(b){return b.transformRequest=b.transformRequest||function(b){return window.ArrayBuffer&&b instanceof window.ArrayBuffer||b instanceof Blob?b:a.defaults.transformRequest[0](arguments)},d(b)},this.dataUrl=function(a,b,d){window.FileReader&&a&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 8")||a.size<2e4)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 9")||a.size<4e6)?c(function(){var e=window.URL||window.webkitURL;if(e&&e.createObjectURL&&!d)b(e.createObjectURL(a));else{var f=new FileReader;f.readAsDataURL(a),f.onload=function(a){c(function(){b(a.target.result)})}}}):b(null)},this.setDefaults=function(a){ngFileUpload.defaults=a||{}}}]),function(){function a(a,f,g,h,i,j,k){function l(){return"input"===f[0].tagName.toLowerCase()&&g.type&&"file"===g.type.toLowerCase()}function m(b){if(!s){s=!0;try{for(var f=b.__files_||b.target&&b.target.files,k=[],l=[],m=0;m<f.length;m++){var n=f.item(m);d(a,i,g,n,b)?k.push(n):l.push(n)}e(i,j,a,h,g,c(g,"ngfChange")||c(g,"ngfSelect"),k,l,b),0===k.length&&(b.target.value=k)}finally{s=!1}}}function n(b){c(g,"ngfMultiple")&&b.attr("multiple",i(c(g,"ngfMultiple"))(a)),c(g,"ngfCapture")&&b.attr("capture",i(c(g,"ngfCapture"))(a)),c(g,"accept")&&b.attr("accept",c(g,"accept"));for(var d=0;d<f[0].attributes.length;d++){var e=f[0].attributes[d];(l()&&"type"!==e.name||"type"!==e.name&&"class"!==e.name&&"id"!==e.name&&"style"!==e.name)&&b.attr(e.name,e.value)}}function o(b,c){if(!c&&(b||l()))return f.$$ngfRefElem||f;var d=angular.element('<input type="file">');return n(d),l()?(f.replaceWith(d),f=d,d.attr("__ngf_gen__",!0),k(f)(a)):(d.css("visibility","hidden").css("position","absolute").css("overflow","hidden").css("width","0px").css("height","0px").css("z-index","-100000").css("border","none").css("margin","0px").css("padding","0px").attr("tabindex","-1"),f.$$ngfRefElem&&f.$$ngfRefElem.remove(),f.$$ngfRefElem=d,document.body.appendChild(d[0])),d}function p(b){e(i,j,a,h,g,c(g,"ngfChange")||c(g,"ngfSelect"),[],[],b,!0)}function q(d){function e(a){a&&a.clientY>0&&k[0].click(),!l()&&a||!j||f.bind("click touchend touchstart",q)}if(f.attr("disabled")||r)return!1;if(null!=d){if("touchstart"===d.type)return t=d.originalEvent.touches[0].clientY,!0;if(d.stopPropagation(),d.preventDefault(),"touchend"===d.type){var h=d.originalEvent.changedTouches[0].clientY;if(Math.abs(h-t)>20)return!1}}var j=i(c(g,"ngfResetOnClick"))(a)!==!1,k=o(d,j);return k&&((!d||j)&&k.bind("change",m),d&&j&&i(c(g,"ngfResetModelOnClick"))(a)!==!1&&p(d),b(navigator.userAgent)?setTimeout(function(){e(d)},0):e(d)),!1}if(!f.attr("__ngf_gen__")){a.$on("$destroy",function(){f.$$ngfRefElem&&f.$$ngfRefElem.remove()});var r=!1;-1===c(g,"ngfSelect").search(/\W+$files\W+/)&&a.$watch(c(g,"ngfSelect"),function(a){r=a===!1});var s=!1,t=0;window.FileAPI&&window.FileAPI.ngfFixIE?window.FileAPI.ngfFixIE(f,o,n,m):q()}}function b(a){var b=a.match(/Android[^\d]*(\d+)\.(\d+)/);if(b&&b.length>2){var c=ngFileUpload.defaults.androidFixMinorVersion||4;return parseInt(b[1])<4||parseInt(b[1])===c&&parseInt(b[2])<c}return-1===a.indexOf("Chrome")&&/.*Windows.*Safari.*/.test(a)}ngFileUpload.getAttrWithDefaults=function(a,b){return null!=a[b]?a[b]:null==ngFileUpload.defaults[b]?ngFileUpload.defaults[b]:ngFileUpload.defaults[b].toString()};var c=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfSelect",["$parse","$timeout","$compile",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.validate=function(a,b,d,e,f){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(var d=0;d<b.length;d++)c+="("+g(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}if(null==e)return!1;var h=b(c(d,"ngfAccept"))(a,{$file:e,$event:f}),i=b(c(d,"ngfMaxSize"))(a,{$file:e,$event:f})||9007199254740991,j=b(c(d,"ngfMinSize"))(a,{$file:e,$event:f})||-1;if(null!=h&&angular.isString(h)){var k=new RegExp(g(h),"gi");if(h=null!=e.type&&k.test(e.type.toLowerCase())||null!=e.name&&k.test(e.name.toLowerCase()),!h)return e.$error="accept",!1}else if(h===!1)return e.$error="accept",!1;return null==e.size?!0:e.size>i?(e.$error="maxSize",!1):e.size<j?(e.$error="minSize",!1):!0},ngFileUpload.updateModel=function(a,b,d,e,f,g,h,i,j,k){function l(){if(a(c(f,"ngfKeep"))(d)===!0){var k=(e.$modelValue||[]).slice(0);if(h&&h.length)if(a(c(f,"ngfKeepDistinct"))(d)===!0){for(var l=k.length,m=0;m<h.length;m++){for(var n=0;l>n&&h[m].name!==k[n].name;n++);n===l&&k.push(h[m])}h=k}else h=k.concat(h);else h=k}e&&(a(c(f,"ngModel")).assign(d,h),b(function(){e&&e.$setViewValue(null!=h&&0===h.length?null:h)})),c(f,"ngModelRejected")&&a(c(f,"ngModelRejected")).assign(d,i),g&&a(g)(d,{$files:h,$rejectedFiles:i,$event:j})}k?l():b(function(){l()})};var d=ngFileUpload.validate,e=ngFileUpload.updateModel}(),function(){function a(a,f,g,h,i,j,k){function l(a,b,d){var f=!0,g=d.dataTransfer.items;if(null!=g)for(var h=0;h<g.length&&f;h++)f=f&&("file"===g[h].kind||""===g[h].kind)&&c(a,i,b,g[h],d);var j=i(e(b,"ngfDragOverClass"))(a,{$event:d});return j&&(j.delay&&(s=j.delay),j.accept&&(j=f?j.accept:j.reject)),j||e(b,"ngfDragOverClass")||"dragover"}function m(b,d,e,f){function h(d){c(a,i,g,d,b)?m.push(d):n.push(d)}function l(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;h({name:b.name,type:"directory",path:d});var e=b.createReader(),f=[];p++;var g=function(){e.readEntries(function(d){try{if(d.length)f=f.concat(Array.prototype.slice.call(d||[],0)),g();else{for(var e=0;e<f.length;e++)l(a,f[e],(c?c:"")+b.name+"/");p--}}catch(h){p--,console.error(h)}},function(){p--})};g()}else p++,b.file(function(a){try{p--,a.path=(c?c:"")+a.name,h(a)}catch(b){p--,console.error(b)}},function(){p--})}var m=[],n=[],o=b.dataTransfer.items,p=0;if(o&&o.length>0&&"file"!==k.protocol())for(var q=0;q<o.length;q++){if(o[q].webkitGetAsEntry&&o[q].webkitGetAsEntry()&&o[q].webkitGetAsEntry().isDirectory){var r=o[q].webkitGetAsEntry();if(r.isDirectory&&!e)continue;null!=r&&l(m,r)}else{var s=o[q].getAsFile();null!=s&&h(s)}if(!f&&m.length>0)break}else{var t=b.dataTransfer.files;if(null!=t)for(var u=0;u<t.length&&(h(t.item(u)),f||!(m.length>0));u++);}var v=0;!function w(a){j(function(){if(p)10*v++<2e4&&w(10);else{if(!f&&m.length>1){for(q=0;"directory"===m[q].type;)q++;m=[m[q]]}d(m,n)}},a||0)}()}var n=b();if(e(g,"dropAvailable")&&j(function(){a[e(g,"dropAvailable")]?a[e(g,"dropAvailable")].value=n:a[e(g,"dropAvailable")]=n}),!n)return void(i(e(g,"ngfHideOnDropNotAvailable"))(a)===!0&&f.css("display","none"));var o=!1;-1===e(g,"ngfDrop").search(/\W+$files\W+/)&&a.$watch(e(g,"ngfDrop"),function(a){o=a===!1});var p,q=null,r=i(e(g,"ngfStopPropagation")),s=1;f[0].addEventListener("dragover",function(b){if(!f.attr("disabled")&&!o){if(b.preventDefault(),r(a)&&b.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var c=b.dataTransfer.effectAllowed;b.dataTransfer.dropEffect="move"===c||"linkMove"===c?"move":"copy"}j.cancel(q),a.actualDragOverClass||(p=l(a,g,b)),f.addClass(p)}},!1),f[0].addEventListener("dragenter",function(b){f.attr("disabled")||o||(b.preventDefault(),r(a)&&b.stopPropagation())},!1),f[0].addEventListener("dragleave",function(){f.attr("disabled")||o||(q=j(function(){f.removeClass(p),p=null},s||1))},!1),f[0].addEventListener("drop",function(b){f.attr("disabled")||o||(b.preventDefault(),r(a)&&b.stopPropagation(),f.removeClass(p),p=null,m(b,function(c,f){d(i,j,a,h,g,e(g,"ngfChange")||e(g,"ngfDrop"),c,f,b)},i(e(g,"ngfAllowDir"))(a)!==!1,e(g,"multiple")||i(e(g,"ngfMultiple"))(a)))},!1)}function b(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}var c=ngFileUpload.validate,d=ngFileUpload.updateModel,e=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfDrop",["$parse","$timeout","$location",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.directive("ngfNoFileDrop",function(){return function(a,c){b()&&c.css("display","none")}}),ngFileUpload.directive("ngfDropAvailable",["$parse","$timeout",function(a,c){return function(d,f,g){if(b()){var h=a(e(g,"ngfDropAvailable"));c(function(){h(d),h.assign&&h.assign(d,!0)})}}}])}(),function(){function a(a,b,c,d,e,f,g){b.$watch(e,function(e){window.FileReader&&ngFileUpload.validate(b,c,d,e,null)&&a.dataUrl(e,function(a){g?g(a):e.dataUrl=a||c(f)(b)},c(d.ngfNoObjectUrl)(b))})}ngFileUpload.directive("ngfSrc",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfSrc,f.ngfDefaultSrc,function(a){e.attr("src",a)})}}}]),ngFileUpload.directive("ngfBackground",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfBackground,f.ngfDefaultBackground,function(a){e.css("background-image","url("+a+")")})}}}]),ngFileUpload.directive("ngfDataUrl",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfDataUrl,f.ngfDefaultDataUrl)}}}])}(); |
@@ -5,7 +5,7 @@ 'use strict'; | ||
var app = angular.module('fileUpload', ['ngFileUpload']); | ||
var version = '5.0.8'; | ||
var version = '5.1.0'; | ||
app.controller('MyCtrl', ['$scope', '$http', '$timeout', '$compile', 'Upload', function ($scope, $http, $timeout, $compile, Upload) { | ||
$scope.usingFlash = FileAPI && FileAPI.upload != null; | ||
//Upload.setDefaults({ngfKeep: true, ngfResetModelOnClick: false, ngfResetOnClick:false}); | ||
$scope.changeAngularVersion = function () { | ||
@@ -12,0 +12,0 @@ window.location.hash = $scope.angularVersion; |
@@ -1,2 +0,2 @@ | ||
/*! 5.0.8 */ | ||
/*! 5.0.9 */ | ||
/*! FileAPI 2.0.7 - BSD | git://github.com/mailru/FileAPI.git | ||
@@ -3,0 +3,0 @@ * FileAPI — a set of javascript tools for working with files. Multiupload, drag'n'drop and chunked file upload. Images: crop, resize and auto orientation by EXIF. |
@@ -5,3 +5,3 @@ /**! | ||
* @author Danial <danial.farid@gmail.com> | ||
* @version 5.0.8 | ||
* @version 5.0.9 | ||
*/ | ||
@@ -434,3 +434,3 @@ | ||
* @author Danial <danial.farid@gmail.com> | ||
* @version 5.0.8 | ||
* @version 5.0.9 | ||
*/ | ||
@@ -456,3 +456,5 @@ | ||
ngFileUpload.version = '5.0.8'; | ||
ngFileUpload.version = '5.0.9'; | ||
ngFileUpload.defaults = {}; | ||
ngFileUpload.service('Upload', ['$http', '$q', '$timeout', function ($http, $q, $timeout) { | ||
@@ -630,2 +632,31 @@ function sendHttp(config) { | ||
}; | ||
this.dataUrl = function (file, callback, disallowObjectUrl) { | ||
if (window.FileReader && file && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) { | ||
$timeout(function () { | ||
//prefer URL.createObjectURL for handling refrences to files of all sizes | ||
//since it doesn´t build a large string in memory | ||
var URL = window.URL || window.webkitURL; | ||
if (URL && URL.createObjectURL && !disallowObjectUrl) { | ||
callback(URL.createObjectURL(file)); | ||
} else { | ||
var fileReader = new FileReader(); | ||
fileReader.readAsDataURL(file); | ||
fileReader.onload = function (e) { | ||
$timeout(function () { | ||
callback(e.target.result); | ||
}); | ||
}; | ||
} | ||
}); | ||
} else { | ||
callback(null); | ||
} | ||
}; | ||
this.setDefaults = function(defaults) { | ||
ngFileUpload.defaults = defaults || {}; | ||
}; | ||
} | ||
@@ -636,260 +667,311 @@ | ||
(function () { | ||
ngFileUpload.directive('ngfSelect', ['$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); | ||
} | ||
}; | ||
}]); | ||
ngFileUpload.getAttrWithDefaults = function(attr, name) { | ||
return attr[name] != null ? attr[name] : | ||
(ngFileUpload.defaults[name] == null ? | ||
ngFileUpload.defaults[name] : ngFileUpload.defaults[name].toString()); | ||
}; | ||
function linkFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile) { | ||
/** @namespace attr.ngfSelect */ | ||
/** @namespace attr.ngfChange */ | ||
/** @namespace attr.ngModel */ | ||
/** @namespace attr.ngModelRejected */ | ||
/** @namespace attr.ngfMultiple */ | ||
/** @namespace attr.ngfCapture */ | ||
/** @namespace attr.ngfAccept */ | ||
/** @namespace attr.ngfMaxSize */ | ||
/** @namespace attr.ngfMinSize */ | ||
/** @namespace attr.ngfResetOnClick */ | ||
/** @namespace attr.ngfResetModelOnClick */ | ||
/** @namespace attr.ngfKeep */ | ||
/** @namespace attr.ngfKeepDistinct */ | ||
var getAttr = ngFileUpload.getAttrWithDefaults; | ||
if (elem.attr('__ngf_gen__')) { | ||
return; | ||
ngFileUpload.directive('ngfSelect', ['$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); | ||
} | ||
}; | ||
}]); | ||
scope.$on('$destroy', function () { | ||
if (elem.$$ngfRefElem) elem.$$ngfRefElem.remove(); | ||
}); | ||
function linkFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile) { | ||
/** @namespace attr.ngfSelect */ | ||
/** @namespace attr.ngfChange */ | ||
/** @namespace attr.ngModel */ | ||
/** @namespace attr.ngModelRejected */ | ||
/** @namespace attr.ngfMultiple */ | ||
/** @namespace attr.ngfCapture */ | ||
/** @namespace attr.ngfAccept */ | ||
/** @namespace attr.ngfMaxSize */ | ||
/** @namespace attr.ngfMinSize */ | ||
/** @namespace attr.ngfResetOnClick */ | ||
/** @namespace attr.ngfResetModelOnClick */ | ||
/** @namespace attr.ngfKeep */ | ||
/** @namespace attr.ngfKeepDistinct */ | ||
var disabled = false; | ||
if (attr.ngfSelect.search(/\W+$files\W+/) === -1) { | ||
scope.$watch(attr.ngfSelect, function (val) { | ||
disabled = val === false; | ||
}); | ||
} | ||
function isInputTypeFile() { | ||
return elem[0].tagName.toLowerCase() === 'input' && attr.type && attr.type.toLowerCase() === 'file'; | ||
} | ||
if (elem.attr('__ngf_gen__')) { | ||
return; | ||
} | ||
var isUpdating = false; | ||
scope.$on('$destroy', function () { | ||
if (elem.$$ngfRefElem) elem.$$ngfRefElem.remove(); | ||
}); | ||
function changeFn(evt) { | ||
if (!isUpdating) { | ||
isUpdating = true; | ||
try { | ||
var fileList = evt.__files_ || (evt.target && evt.target.files); | ||
var files = [], rejFiles = []; | ||
var disabled = false; | ||
if (getAttr(attr, 'ngfSelect').search(/\W+$files\W+/) === -1) { | ||
scope.$watch(getAttr(attr, 'ngfSelect'), function (val) { | ||
disabled = val === false; | ||
}); | ||
} | ||
function isInputTypeFile() { | ||
return elem[0].tagName.toLowerCase() === 'input' && attr.type && attr.type.toLowerCase() === 'file'; | ||
} | ||
for (var i = 0; i < fileList.length; i++) { | ||
var file = fileList.item(i); | ||
if (validate(scope, $parse, attr, file, evt)) { | ||
files.push(file); | ||
} else { | ||
rejFiles.push(file); | ||
} | ||
} | ||
updateModel($parse, $timeout, scope, ngModel, attr, attr.ngfChange || attr.ngfSelect, files, rejFiles, evt); | ||
if (files.length === 0) evt.target.value = files; | ||
var isUpdating = false; | ||
function changeFn(evt) { | ||
if (!isUpdating) { | ||
isUpdating = true; | ||
try { | ||
var fileList = evt.__files_ || (evt.target && evt.target.files); | ||
var files = [], rejFiles = []; | ||
for (var i = 0; i < fileList.length; i++) { | ||
var file = fileList.item(i); | ||
if (validate(scope, $parse, attr, file, evt)) { | ||
files.push(file); | ||
} else { | ||
rejFiles.push(file); | ||
} | ||
} | ||
updateModel($parse, $timeout, scope, ngModel, attr, | ||
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), files, rejFiles, evt); | ||
if (files.length === 0) evt.target.value = files; | ||
// if (evt.target && evt.target.getAttribute('__ngf_gen__')) { | ||
// angular.element(evt.target).remove(); | ||
// } | ||
} finally { | ||
isUpdating = false; | ||
} | ||
} | ||
} finally { | ||
isUpdating = false; | ||
} | ||
} | ||
} | ||
function bindAttrToFileInput(fileElem) { | ||
if (attr.ngfMultiple) fileElem.attr('multiple', $parse(attr.ngfMultiple)(scope)); | ||
if (attr.ngfCapture) fileElem.attr('capture', $parse(attr.ngfCapture)(scope)); | ||
if (attr.accept) fileElem.attr('accept', attr.accept); | ||
for (var i = 0; i < elem[0].attributes.length; i++) { | ||
var attribute = elem[0].attributes[i]; | ||
if ((isInputTypeFile() && attribute.name !== 'type') || | ||
(attribute.name !== 'type' && attribute.name !== 'class' && | ||
attribute.name !== 'id' && attribute.name !== 'style')) { | ||
fileElem.attr(attribute.name, attribute.value); | ||
} | ||
} | ||
function bindAttrToFileInput(fileElem) { | ||
if (getAttr(attr, 'ngfMultiple')) fileElem.attr('multiple', $parse(getAttr(attr, 'ngfMultiple'))(scope)); | ||
if (getAttr(attr, 'ngfCapture')) fileElem.attr('capture', $parse(getAttr(attr, 'ngfCapture'))(scope)); | ||
if (getAttr(attr, 'accept')) fileElem.attr('accept', getAttr(attr, 'accept')); | ||
for (var i = 0; i < elem[0].attributes.length; i++) { | ||
var attribute = elem[0].attributes[i]; | ||
if ((isInputTypeFile() && attribute.name !== 'type') || | ||
(attribute.name !== 'type' && attribute.name !== 'class' && | ||
attribute.name !== 'id' && attribute.name !== 'style')) { | ||
fileElem.attr(attribute.name, attribute.value); | ||
} | ||
} | ||
} | ||
function createFileInput(evt, resetOnClick) { | ||
if (!resetOnClick && (evt || isInputTypeFile())) return elem.$$ngfRefElem || elem; | ||
function createFileInput(evt, resetOnClick) { | ||
if (!resetOnClick && (evt || isInputTypeFile())) return elem.$$ngfRefElem || elem; | ||
var fileElem = angular.element('<input type="file">'); | ||
bindAttrToFileInput(fileElem); | ||
var fileElem = angular.element('<input type="file">'); | ||
bindAttrToFileInput(fileElem); | ||
if (isInputTypeFile()) { | ||
elem.replaceWith(fileElem); | ||
elem = fileElem; | ||
fileElem.attr('__ngf_gen__', true); | ||
$compile(elem)(scope); | ||
} else { | ||
fileElem.css('visibility', 'hidden').css('position', 'absolute').css('overflow', 'hidden') | ||
.css('width', '0px').css('height', '0px').css('z-index', '-100000').css('border', 'none') | ||
.css('margin', '0px').css('padding', '0px').attr('tabindex', '-1'); | ||
if (elem.$$ngfRefElem) { | ||
elem.$$ngfRefElem.remove(); | ||
} | ||
elem.$$ngfRefElem = fileElem; | ||
document.body.appendChild(fileElem[0]); | ||
} | ||
return fileElem; | ||
if (isInputTypeFile()) { | ||
elem.replaceWith(fileElem); | ||
elem = fileElem; | ||
fileElem.attr('__ngf_gen__', true); | ||
$compile(elem)(scope); | ||
} else { | ||
fileElem.css('visibility', 'hidden').css('position', 'absolute').css('overflow', 'hidden') | ||
.css('width', '0px').css('height', '0px').css('z-index', '-100000').css('border', 'none') | ||
.css('margin', '0px').css('padding', '0px').attr('tabindex', '-1'); | ||
if (elem.$$ngfRefElem) { | ||
elem.$$ngfRefElem.remove(); | ||
} | ||
elem.$$ngfRefElem = fileElem; | ||
document.body.appendChild(fileElem[0]); | ||
} | ||
function resetModel(evt) { | ||
updateModel($parse, $timeout, scope, ngModel, attr, attr.ngfChange || attr.ngfSelect, [], [], evt, true); | ||
} | ||
return fileElem; | ||
} | ||
function clickHandler(evt) { | ||
if (elem.attr('disabled') || disabled) return false; | ||
if (evt != null) { | ||
evt.preventDefault(); | ||
evt.stopPropagation(); | ||
} | ||
var resetOnClick = $parse(attr.ngfResetOnClick)(scope) !== false; | ||
var fileElem = createFileInput(evt, resetOnClick); | ||
function resetModel(evt) { | ||
updateModel($parse, $timeout, scope, ngModel, attr, | ||
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), [], [], evt, true); | ||
} | ||
function clickAndAssign(evt) { | ||
if (evt) { | ||
fileElem[0].click(); | ||
} | ||
if (isInputTypeFile() || !evt) { | ||
elem.bind('click touchend', clickHandler); | ||
} | ||
} | ||
var initialTouchStartY = 0; | ||
if (fileElem) { | ||
if (!evt || resetOnClick) fileElem.bind('change', changeFn); | ||
if (evt && resetOnClick && $parse(attr.ngfResetModelOnClick)(scope) !== false) resetModel(evt); | ||
function clickHandler(evt) { | ||
if (elem.attr('disabled') || disabled) return false; | ||
// fix for android native browser < 4.4 | ||
if (shouldClickLater(navigator.userAgent)) { | ||
setTimeout(function () { | ||
clickAndAssign(evt); | ||
}, 0); | ||
} else { | ||
clickAndAssign(evt); | ||
} | ||
} | ||
return false; | ||
if (evt != null) { | ||
if (evt.type === 'touchstart') { | ||
initialTouchStartY = evt.originalEvent.touches[0].clientY; | ||
return true; // don't block event default | ||
} else { | ||
evt.stopPropagation(); | ||
evt.preventDefault(); | ||
// prevent scroll from triggering event | ||
if (evt.type === 'touchend') { | ||
var currentLocation = evt.originalEvent.changedTouches[0].clientY; | ||
if (Math.abs(currentLocation - initialTouchStartY) > 20) return false; | ||
} | ||
} | ||
} | ||
if (window.FileAPI && window.FileAPI.ngfFixIE) { | ||
window.FileAPI.ngfFixIE(elem, createFileInput, bindAttrToFileInput, changeFn); | ||
var resetOnClick = $parse(getAttr(attr, 'ngfResetOnClick'))(scope) !== false; | ||
var fileElem = createFileInput(evt, resetOnClick); | ||
function clickAndAssign(evt) { | ||
if (evt && evt.clientY > 0) { | ||
fileElem[0].click(); | ||
} | ||
if ((isInputTypeFile() || !evt) && resetOnClick) { | ||
elem.bind('click touchend touchstart', clickHandler); | ||
} | ||
} | ||
if (fileElem) { | ||
if (!evt || resetOnClick) fileElem.bind('change', changeFn); | ||
if (evt && resetOnClick && $parse(getAttr(attr, 'ngfResetModelOnClick'))(scope) !== false) { | ||
resetModel(evt); | ||
} | ||
// fix for android native browser < 4.4 | ||
if (shouldClickLater(navigator.userAgent)) { | ||
setTimeout(function () { | ||
clickAndAssign(evt); | ||
}, 0); | ||
} else { | ||
clickHandler(); | ||
//if (!isInputTypeFile()) { | ||
// elem.bind('click touchend', clickHandler); | ||
//} | ||
clickAndAssign(evt); | ||
} | ||
} | ||
return false; | ||
} | ||
function shouldClickLater(ua) { | ||
// android below 4.4 | ||
var m = ua.match(/Android[^\d]*(\d+)\.(\d+)/); | ||
if (m && m.length > 2) { | ||
return parseInt(m[1]) < 4 || (parseInt(m[1]) === 4 && parseInt(m[2]) < 4); | ||
} | ||
if (window.FileAPI && window.FileAPI.ngfFixIE) { | ||
window.FileAPI.ngfFixIE(elem, createFileInput, bindAttrToFileInput, changeFn); | ||
} else { | ||
clickHandler(); | ||
//if (!isInputTypeFile()) { | ||
// elem.bind('click touchend', clickHandler); | ||
//} | ||
} | ||
} | ||
// safari on windows | ||
return /.*Windows.*Safari.*/.test(ua); | ||
function shouldClickLater(ua) { | ||
// android below 4.4 | ||
var m = ua.match(/Android[^\d]*(\d+)\.(\d+)/); | ||
if (m && m.length > 2) { | ||
var v = ngFileUpload.defaults.androidFixMinorVersion || 4; | ||
return parseInt(m[1]) < 4 || (parseInt(m[1]) === v && parseInt(m[2]) < v); | ||
} | ||
ngFileUpload.validate = function (scope, $parse, attr, file, evt) { | ||
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; | ||
} | ||
// safari on windows | ||
console.log(ua); | ||
return ua.indexOf('Chrome') === -1 && /.*Windows.*Safari.*/.test(ua); | ||
} | ||
var accept = $parse(attr.ngfAccept)(scope, {$file: file, $event: evt}); | ||
var fileSizeMax = $parse(attr.ngfMaxSize)(scope, {$file: file, $event: evt}) || 9007199254740991; | ||
var fileSizeMin = $parse(attr.ngfMinSize)(scope, {$file: file, $event: evt}) || -1; | ||
if (accept != null && angular.isString(accept)) { | ||
var regexp = new RegExp(globStringToRegex(accept), 'gi'); | ||
accept = (file.type != null && regexp.test(file.type.toLowerCase())) || | ||
(file.name != null && regexp.test(file.name.toLowerCase())); | ||
ngFileUpload.validate = function (scope, $parse, attr, file, evt) { | ||
if (file == null) { | ||
return false; | ||
} | ||
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 += '|'; | ||
} | ||
} | ||
return (accept == null || accept) && (file.size == null || (file.size < fileSizeMax && file.size > fileSizeMin)); | ||
}; | ||
} else { | ||
if (str.indexOf('.') === 0) { | ||
str = '*' + str; | ||
} | ||
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$'; | ||
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.'); | ||
} | ||
return result; | ||
} | ||
ngFileUpload.updateModel = function ($parse, $timeout, scope, ngModel, attr, fileChange, | ||
files, rejFiles, evt, noDelay) { | ||
function update() { | ||
if ($parse(attr.ngfKeep)(scope) === true) { | ||
var prevFiles = (ngModel.$modelValue || []).slice(0); | ||
if (!files || !files.length) { | ||
files = prevFiles; | ||
} else if ($parse(attr.ngfKeepDistinct)(scope) === true) { | ||
var len = prevFiles.length; | ||
for (var i = 0; i < files.length; i++) { | ||
for (var j = 0; j < len; j++) { | ||
if (files[i].name === prevFiles[j].name) break; | ||
} | ||
if (j === len) { | ||
prevFiles.push(files[i]); | ||
} | ||
} | ||
files = prevFiles; | ||
} else { | ||
files = prevFiles.concat(files); | ||
} | ||
var accept = $parse(getAttr(attr, 'ngfAccept'))(scope, {$file: file, $event: evt}); | ||
var fileSizeMax = $parse(getAttr(attr, 'ngfMaxSize'))(scope, {$file: file, $event: evt}) || 9007199254740991; | ||
var fileSizeMin = $parse(getAttr(attr, 'ngfMinSize'))(scope, {$file: file, $event: evt}) || -1; | ||
if (accept != null && angular.isString(accept)) { | ||
var regexp = new RegExp(globStringToRegex(accept), 'gi'); | ||
accept = (file.type != null && regexp.test(file.type.toLowerCase())) || | ||
(file.name != null && regexp.test(file.name.toLowerCase())); | ||
if (!accept) { | ||
file.$error = 'accept'; | ||
return false; | ||
} | ||
} else { | ||
if (accept === false) { | ||
file.$error = 'accept'; | ||
return false; | ||
} | ||
} | ||
if (file.size == null) return true; | ||
if (file.size > fileSizeMax) { | ||
file.$error = 'maxSize'; | ||
return false; | ||
} | ||
if (file.size < fileSizeMin) { | ||
file.$error = 'minSize'; | ||
return false; | ||
} | ||
return true; | ||
}; | ||
ngFileUpload.updateModel = function ($parse, $timeout, scope, ngModel, attr, fileChange, | ||
files, rejFiles, evt, noDelay) { | ||
function update() { | ||
if ($parse(getAttr(attr, 'ngfKeep'))(scope) === true) { | ||
var prevFiles = (ngModel.$modelValue || []).slice(0); | ||
if (!files || !files.length) { | ||
files = prevFiles; | ||
} else if ($parse(getAttr(attr, 'ngfKeepDistinct'))(scope) === true) { | ||
var len = prevFiles.length; | ||
for (var i = 0; i < files.length; i++) { | ||
for (var j = 0; j < len; j++) { | ||
if (files[i].name === prevFiles[j].name) break; | ||
} | ||
if (ngModel) { | ||
$parse(attr.ngModel).assign(scope, files); | ||
$timeout(function () { | ||
if (ngModel) { | ||
ngModel.$setViewValue(files != null && files.length === 0 ? null : files); | ||
} | ||
}); | ||
if (j === len) { | ||
prevFiles.push(files[i]); | ||
} | ||
if (attr.ngModelRejected) { | ||
$parse(attr.ngModelRejected).assign(scope, rejFiles); | ||
} | ||
if (fileChange) { | ||
$parse(fileChange)(scope, { | ||
$files: files, | ||
$rejectedFiles: rejFiles, | ||
$event: evt | ||
}); | ||
} | ||
} | ||
if (noDelay) { | ||
update(); | ||
} | ||
files = prevFiles; | ||
} else { | ||
$timeout(function () { | ||
update(); | ||
}); | ||
files = prevFiles.concat(files); | ||
} | ||
}; | ||
} | ||
if (ngModel) { | ||
$parse(getAttr(attr, 'ngModel')).assign(scope, files); | ||
$timeout(function () { | ||
if (ngModel) { | ||
ngModel.$setViewValue(files != null && files.length === 0 ? null : files); | ||
} | ||
}); | ||
} | ||
if (getAttr(attr, 'ngModelRejected')) { | ||
$parse(getAttr(attr, 'ngModelRejected')).assign(scope, rejFiles); | ||
} | ||
if (fileChange) { | ||
$parse(fileChange)(scope, { | ||
$files: files, | ||
$rejectedFiles: rejFiles, | ||
$event: evt | ||
}); | ||
} | ||
} | ||
var validate = ngFileUpload.validate; | ||
var updateModel = ngFileUpload.updateModel; | ||
if (noDelay) { | ||
update(); | ||
} else { | ||
$timeout(function () { | ||
update(); | ||
}); | ||
} | ||
}; | ||
var validate = ngFileUpload.validate; | ||
var updateModel = ngFileUpload.updateModel; | ||
})(); | ||
@@ -900,2 +982,3 @@ | ||
var updateModel = ngFileUpload.updateModel; | ||
var getAttr = ngFileUpload.getAttrWithDefaults; | ||
@@ -921,3 +1004,3 @@ ngFileUpload.directive('ngfDrop', ['$parse', '$timeout', '$location', function ($parse, $timeout, $location) { | ||
if (dropAvailable()) { | ||
var fn = $parse(attr.ngfDropAvailable); | ||
var fn = $parse(getAttr(attr, 'ngfDropAvailable')); | ||
$timeout(function () { | ||
@@ -935,8 +1018,8 @@ fn(scope); | ||
var available = dropAvailable(); | ||
if (attr.dropAvailable) { | ||
if (getAttr(attr, 'dropAvailable')) { | ||
$timeout(function () { | ||
if (scope[attr.dropAvailable]) { | ||
scope[attr.dropAvailable].value = available; | ||
if (scope[getAttr(attr, 'dropAvailable')]) { | ||
scope[getAttr(attr, 'dropAvailable')].value = available; | ||
} else { | ||
scope[attr.dropAvailable] = available; | ||
scope[getAttr(attr, 'dropAvailable')] = available; | ||
} | ||
@@ -946,3 +1029,3 @@ }); | ||
if (!available) { | ||
if ($parse(attr.ngfHideOnDropNotAvailable)(scope) === true) { | ||
if ($parse(getAttr(attr, 'ngfHideOnDropNotAvailable'))(scope) === true) { | ||
elem.css('display', 'none'); | ||
@@ -954,4 +1037,4 @@ } | ||
var disabled = false; | ||
if (attr.ngfDrop.search(/\W+$files\W+/) === -1) { | ||
scope.$watch(attr.ngfDrop, function(val) { | ||
if (getAttr(attr, 'ngfDrop').search(/\W+$files\W+/) === -1) { | ||
scope.$watch(getAttr(attr, 'ngfDrop'), function(val) { | ||
disabled = val === false; | ||
@@ -962,3 +1045,3 @@ }); | ||
var leaveTimeout = null; | ||
var stopPropagation = $parse(attr.ngfStopPropagation); | ||
var stopPropagation = $parse(getAttr(attr, 'ngfStopPropagation')); | ||
var dragOverDelay = 1; | ||
@@ -1002,4 +1085,5 @@ var actualDragOverClass; | ||
updateModel($parse, $timeout, scope, ngModel, attr, | ||
attr.ngfChange || attr.ngfDrop, files, rejFiles, evt); | ||
}, $parse(attr.ngfAllowDir)(scope) !== false, attr.multiple || $parse(attr.ngfMultiple)(scope)); | ||
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt); | ||
}, $parse(getAttr(attr, 'ngfAllowDir'))(scope) !== false, | ||
getAttr(attr, 'multiple') || $parse(getAttr(attr, 'ngfMultiple'))(scope)); | ||
}, false); | ||
@@ -1017,3 +1101,3 @@ | ||
} | ||
var clazz = $parse(attr.ngfDragOverClass)(scope, {$event: evt}); | ||
var clazz = $parse(getAttr(attr, 'ngfDragOverClass'))(scope, {$event: evt}); | ||
if (clazz) { | ||
@@ -1023,3 +1107,3 @@ if (clazz.delay) dragOverDelay = clazz.delay; | ||
} | ||
return clazz || attr.ngfDragOverClass || 'dragover'; | ||
return clazz || getAttr(attr, 'ngfDragOverClass') || 'dragover'; | ||
} | ||
@@ -1132,33 +1216,35 @@ | ||
ngFileUpload.directive('ngfSrc', ['$parse', '$timeout', function ($parse, $timeout) { | ||
function dropAvailable() { | ||
var div = document.createElement('div'); | ||
return ('draggable' in div) && ('ondrop' in div); | ||
} | ||
})(); | ||
(function () { | ||
function fileToSrc(Upload, scope, $parse, attr, name, defaultName, callback) { | ||
scope.$watch(name, function (file) { | ||
if (window.FileReader && ngFileUpload.validate(scope, $parse, attr, file, null)) { | ||
Upload.dataUrl(file, function(url) { | ||
if (callback) { | ||
callback(url); | ||
} else { | ||
file.dataUrl = url || $parse(defaultName)(scope); | ||
} | ||
}, $parse(attr.ngfNoObjectUrl)(scope)); | ||
} | ||
}); | ||
} | ||
/** @namespace attr.ngfSrc */ | ||
/** @namespace attr.ngfDefaultSrc */ | ||
/** @namespace attr.ngfNoObjectUrl */ | ||
ngFileUpload.directive('ngfSrc', ['$parse', 'Upload', function ($parse, Upload) { | ||
return { | ||
restrict: 'AE', | ||
link: function (scope, elem, attr) { | ||
if (window.FileReader) { | ||
scope.$watch(attr.ngfSrc, function (file) { | ||
if (file && | ||
validate(scope, $parse, attr, file, null) && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) { | ||
$timeout(function () { | ||
//prefer URL.createObjectURL for handling refrences to files of all sizes | ||
//since it doesn´t build a large string in memory | ||
var URL = window.URL || window.webkitURL; | ||
if (URL && URL.createObjectURL) { | ||
elem.attr('src', URL.createObjectURL(file)); | ||
} else { | ||
var fileReader = new FileReader(); | ||
fileReader.readAsDataURL(file); | ||
fileReader.onload = function (e) { | ||
$timeout(function () { | ||
elem.attr('src', e.target.result); | ||
}); | ||
}; | ||
} | ||
}); | ||
} else { | ||
elem.attr('src', attr.ngfDefaultSrc || ''); | ||
} | ||
}); | ||
} | ||
fileToSrc(Upload, scope, $parse, attr, attr.ngfSrc, attr.ngfDefaultSrc, function (url) { | ||
elem.attr('src', url); | ||
}); | ||
} | ||
@@ -1168,7 +1254,28 @@ }; | ||
function dropAvailable() { | ||
var div = document.createElement('div'); | ||
return ('draggable' in div) && ('ondrop' in div); | ||
} | ||
/** @namespace attr.ngfBackground */ | ||
/** @namespace attr.ngfDefaultBackground */ | ||
/** @namespace attr.ngfNoObjectUrl */ | ||
ngFileUpload.directive('ngfBackground', ['$parse', 'Upload', function ($parse, Upload) { | ||
return { | ||
restrict: 'AE', | ||
link: function (scope, elem, attr) { | ||
fileToSrc(Upload, scope, $parse, attr, attr.ngfBackground, attr.ngfDefaultBackground, function (url) { | ||
elem.css('background-image', 'url(' + url + ')'); | ||
}); | ||
} | ||
}; | ||
}]); | ||
/** @namespace attr.ngfDataUrl */ | ||
/** @namespace attr.ngfDefaultDataUrl */ | ||
/** @namespace attr.ngfNoObjectUrl */ | ||
ngFileUpload.directive('ngfDataUrl', ['$parse', 'Upload', function ($parse, Upload) { | ||
return { | ||
restrict: 'AE', | ||
link: function (scope, elem, attr) { | ||
fileToSrc(Upload, scope, $parse, attr, attr.ngfDataUrl, attr.ngfDefaultDataUrl); | ||
} | ||
}; | ||
}]); | ||
})(); |
@@ -1,2 +0,2 @@ | ||
/*! 5.0.8 */ | ||
!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){}}if(window.FileAPI||(window.FileAPI={}),FileAPI.shouldLoad=window.XMLHttpRequest&&!window.FormData||FileAPI.forceLoad,FileAPI.shouldLoad){var c=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,d,e){c(this),this.__url=d;try{a.apply(this,[b,d,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,d){if("__setXHR_"===b){c(this);var e=d(this);e instanceof Function&&e(this)}else this.__requestHeaders=this.__requestHeaders||{},this.__requestHeaders[b]=d,a.apply(this,arguments)}}),a("send",function(a){return function(){var c=this;if(arguments[0]&&arguments[0].__isFileAPIShim){var d=arguments[0],e={url:c.__url,jsonp:!1,cache:!0,complete:function(a,d){c.__completed=!0,!a&&c.__listeners.load&&c.__listeners.load({type:"load",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),!a&&c.__listeners.loadend&&c.__listeners.loadend({type:"loadend",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),"abort"===a&&c.__listeners.abort&&c.__listeners.abort({type:"abort",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),void 0!==d.status&&b(c,"status",function(){return 0===d.status&&a&&"abort"!==a?500:d.status}),void 0!==d.statusText&&b(c,"statusText",function(){return d.statusText}),b(c,"readyState",function(){return 4}),void 0!==d.response&&b(c,"response",function(){return d.response});var e=d.responseText||(a&&0===d.status&&"abort"!==a?a:void 0);b(c,"responseText",function(){return e}),b(c,"response",function(){return e}),a&&b(c,"err",function(){return a}),c.__fileApiXHR=d,c.onreadystatechange&&c.onreadystatechange(),c.onload&&c.onload()},progress:function(a){if(a.target=c,c.__listeners.progress&&c.__listeners.progress(a),c.__total=a.total,c.__loaded=a.loaded,a.total===a.loaded){var b=this;setTimeout(function(){c.__completed||(c.getAllResponseHeaders=function(){},b.complete(null,{status:204,statusText:"No Content"}))},FileAPI.noContentTimeout||1e4)}},headers:c.__requestHeaders};e.data={},e.files={};for(var f=0;f<d.data.length;f++){var g=d.data[f];null!=g.val&&null!=g.val.name&&null!=g.val.size&&null!=g.val.type?e.files[g.key]=g.val:e.data[g.key]=g.val}setTimeout(function(){if(!FileAPI.hasFlash)throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';c.__fileApiXHR=FileAPI.upload(e)},1)}else{if(this.__origError)throw this.__origError;a.apply(c,arguments)}}}),window.XMLHttpRequest.__isFileAPIShim=!0,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(){function a(a){return"input"===a[0].tagName.toLowerCase()&&a.attr("type")&&"file"===a.attr("type").toLowerCase()}function b(){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}function c(a){var b=0,c=0;if(window.jQuery)return jQuery(a).offset();if(a.offsetParent)do b+=a.offsetLeft-a.scrollLeft,c+=a.offsetTop-a.scrollTop,a=a.offsetParent;while(a);return{left:b,top:c}}if(FileAPI.shouldLoad){if(FileAPI.forceLoad&&(FileAPI.html5=!1),!FileAPI.upload){var d,e,f,g,h,i=document.createElement("script"),j=document.getElementsByTagName("script");if(window.FileAPI.jsUrl)d=window.FileAPI.jsUrl;else if(window.FileAPI.jsPath)e=window.FileAPI.jsPath;else for(f=0;f<j.length;f++)if(h=j[f].src,g=h.search(/\/ng\-file\-upload[\-a-zA-z0-9\.]*\.js/),g>-1){e=h.substring(0,g+1);break}null==FileAPI.staticPath&&(FileAPI.staticPath=e),i.setAttribute("src",d||e+"FileAPI.min.js"),document.getElementsByTagName("head")[0].appendChild(i),FileAPI.hasFlash=b()}FileAPI.ngfFixIE=function(d,e,f,g){if(!b())throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';var h=function(){if(d.attr("disabled"))d.$$ngfRefElem.removeClass("js-fileapi-wrapper");else{var b=d.$$ngfRefElem;b?f(d.$$ngfRefElem):(b=d.$$ngfRefElem=e(),b.addClass("js-fileapi-wrapper"),!a(d),setTimeout(function(){b.bind("mouseenter",h)},10),b.bind("change",function(a){i.apply(this,[a]),g.apply(this,[a])})),a(d)||b.css("position","absolute").css("top",c(d[0]).top+"px").css("left",c(d[0]).left+"px").css("width",d[0].offsetWidth+"px").css("height",d[0].offsetHeight+"px").css("filter","alpha(opacity=0)").css("display",d.css("display")).css("overflow","hidden").css("z-index","900000").css("visibility","visible")}};d.bind("mouseenter",h);var i=function(a){for(var b=FileAPI.getFiles(a),c=0;c<b.length;c++)void 0===b[c].size&&(b[c].size=0),void 0===b[c].name&&(b[c].name="file"),void 0===b[c].type&&(b[c].type="undefined");a.target||(a.target={}),a.target.files=b,a.target.files!==b&&(a.__files_=b),(a.__files_||a.target.files).item=function(b){return(a.__files_||a.target.files)[b]||null}}},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){b||(b=!0,a.onloadstart&&a.onloadstart(c("loadstart",d)));var e;"load"===d.type?(a.onloadend&&a.onloadend(c("loadend",d)),e=c("load",d),a.onload&&a.onload(e),a.dispatchEvent(e)):"progress"===d.type?(e=c("progress",d),a.onprogress&&a.onprogress(e),a.dispatchEvent(e)):(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)}}),!window.XMLHttpRequest||window.FileAPI&&FileAPI.shouldLoad||(window.XMLHttpRequest.prototype.setRequestHeader=function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}}(window.XMLHttpRequest.prototype.setRequestHeader));var ngFileUpload=angular.module("ngFileUpload",[]);ngFileUpload.version="5.0.8",ngFileUpload.service("Upload",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{};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.progressFunc&&c(function(){f.progressFunc(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(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.progressFunc=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){function b(c,d,e){if(void 0!==d)if(angular.isDate(d)&&(d=d.toISOString()),angular.isString(d))c.append(e,d);else if("form"===a.sendFieldsAs)if(angular.isObject(d))for(var f in d)d.hasOwnProperty(f)&&b(c,d[f],e+"["+f+"]");else c.append(e,d);else d=angular.isString(d)?d:JSON.stringify(d),"json-blob"===a.sendFieldsAs?c.append(e,new Blob([d],{type:"application/json"})):c.append(e,d)}return a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?angular.isArray(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(c){var d,e=new FormData,f={};for(d in a.fields)a.fields.hasOwnProperty(d)&&(f[d]=a.fields[d]);c&&(f.data=c);for(d in f)if(f.hasOwnProperty(d)){var g=f[d];a.formDataAppender?a.formDataAppender(e,d,g):b(e,g,d)}if(null!=a.file){var h=a.fileFormDataName||"file";if(angular.isArray(a.file))for(var i=angular.isString(h),j=0;j<a.file.length;j++)e.append(i?h:h[j],a.file[j],a.fileName&&a.fileName[j]||a.file[j].name);else e.append(h,a.file,a.fileName||a.file.name)}return e}),d(a)},this.http=function(b){return b.transformRequest=b.transformRequest||function(b){return window.ArrayBuffer&&b instanceof window.ArrayBuffer||b instanceof Blob?b:a.defaults.transformRequest[0](arguments)},d(b)}}]),function(){function a(a,e,f,g,h,i,j){function k(){return"input"===e[0].tagName.toLowerCase()&&f.type&&"file"===f.type.toLowerCase()}function l(b){if(!r){r=!0;try{for(var e=b.__files_||b.target&&b.target.files,j=[],k=[],l=0;l<e.length;l++){var m=e.item(l);c(a,h,f,m,b)?j.push(m):k.push(m)}d(h,i,a,g,f,f.ngfChange||f.ngfSelect,j,k,b),0===j.length&&(b.target.value=j)}finally{r=!1}}}function m(b){f.ngfMultiple&&b.attr("multiple",h(f.ngfMultiple)(a)),f.ngfCapture&&b.attr("capture",h(f.ngfCapture)(a)),f.accept&&b.attr("accept",f.accept);for(var c=0;c<e[0].attributes.length;c++){var d=e[0].attributes[c];(k()&&"type"!==d.name||"type"!==d.name&&"class"!==d.name&&"id"!==d.name&&"style"!==d.name)&&b.attr(d.name,d.value)}}function n(b,c){if(!c&&(b||k()))return e.$$ngfRefElem||e;var d=angular.element('<input type="file">');return m(d),k()?(e.replaceWith(d),e=d,d.attr("__ngf_gen__",!0),j(e)(a)):(d.css("visibility","hidden").css("position","absolute").css("overflow","hidden").css("width","0px").css("height","0px").css("z-index","-100000").css("border","none").css("margin","0px").css("padding","0px").attr("tabindex","-1"),e.$$ngfRefElem&&e.$$ngfRefElem.remove(),e.$$ngfRefElem=d,document.body.appendChild(d[0])),d}function o(b){d(h,i,a,g,f,f.ngfChange||f.ngfSelect,[],[],b,!0)}function p(c){function d(a){a&&i[0].click(),(k()||!a)&&e.bind("click touchend",p)}if(e.attr("disabled")||q)return!1;null!=c&&(c.preventDefault(),c.stopPropagation());var g=h(f.ngfResetOnClick)(a)!==!1,i=n(c,g);return i&&((!c||g)&&i.bind("change",l),c&&g&&h(f.ngfResetModelOnClick)(a)!==!1&&o(c),b(navigator.userAgent)?setTimeout(function(){d(c)},0):d(c)),!1}if(!e.attr("__ngf_gen__")){a.$on("$destroy",function(){e.$$ngfRefElem&&e.$$ngfRefElem.remove()});var q=!1;-1===f.ngfSelect.search(/\W+$files\W+/)&&a.$watch(f.ngfSelect,function(a){q=a===!1});var r=!1;window.FileAPI&&window.FileAPI.ngfFixIE?window.FileAPI.ngfFixIE(e,n,m,l):p()}}function b(a){var b=a.match(/Android[^\d]*(\d+)\.(\d+)/);return b&&b.length>2?parseInt(b[1])<4||4===parseInt(b[1])&&parseInt(b[2])<4:/.*Windows.*Safari.*/.test(a)}ngFileUpload.directive("ngfSelect",["$parse","$timeout","$compile",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.validate=function(a,b,c,d,e){function f(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+="("+f(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}var g=b(c.ngfAccept)(a,{$file:d,$event:e}),h=b(c.ngfMaxSize)(a,{$file:d,$event:e})||9007199254740991,i=b(c.ngfMinSize)(a,{$file:d,$event:e})||-1;if(null!=g&&angular.isString(g)){var j=new RegExp(f(g),"gi");g=null!=d.type&&j.test(d.type.toLowerCase())||null!=d.name&&j.test(d.name.toLowerCase())}return(null==g||g)&&(null==d.size||d.size<h&&d.size>i)},ngFileUpload.updateModel=function(a,b,c,d,e,f,g,h,i,j){function k(){if(a(e.ngfKeep)(c)===!0){var j=(d.$modelValue||[]).slice(0);if(g&&g.length)if(a(e.ngfKeepDistinct)(c)===!0){for(var k=j.length,l=0;l<g.length;l++){for(var m=0;k>m&&g[l].name!==j[m].name;m++);m===k&&j.push(g[l])}g=j}else g=j.concat(g);else g=j}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})}j?k():b(function(){k()})};var c=ngFileUpload.validate,d=ngFileUpload.updateModel}(),function(){function a(a,e,f,g,h,i,j){function k(a,b,d){var e=!0,f=d.dataTransfer.items;if(null!=f)for(var g=0;g<f.length&&e;g++)e=e&&("file"===f[g].kind||""===f[g].kind)&&c(a,h,b,f[g],d);var i=h(b.ngfDragOverClass)(a,{$event:d});return i&&(i.delay&&(r=i.delay),i.accept&&(i=e?i.accept:i.reject)),i||b.ngfDragOverClass||"dragover"}function l(b,d,e,g){function k(d){c(a,h,f,d,b)?m.push(d):n.push(d)}function l(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;k({name:b.name,type:"directory",path:d});var e=b.createReader(),f=[];p++;var g=function(){e.readEntries(function(d){try{if(d.length)f=f.concat(Array.prototype.slice.call(d||[],0)),g();else{for(var e=0;e<f.length;e++)l(a,f[e],(c?c:"")+b.name+"/");p--}}catch(h){p--,console.error(h)}},function(){p--})};g()}else p++,b.file(function(a){try{p--,a.path=(c?c:"")+a.name,k(a)}catch(b){p--,console.error(b)}},function(){p--})}var m=[],n=[],o=b.dataTransfer.items,p=0;if(o&&o.length>0&&"file"!==j.protocol())for(var q=0;q<o.length;q++){if(o[q].webkitGetAsEntry&&o[q].webkitGetAsEntry()&&o[q].webkitGetAsEntry().isDirectory){var r=o[q].webkitGetAsEntry();if(r.isDirectory&&!e)continue;null!=r&&l(m,r)}else{var s=o[q].getAsFile();null!=s&&k(s)}if(!g&&m.length>0)break}else{var t=b.dataTransfer.files;if(null!=t)for(var u=0;u<t.length&&(k(t.item(u)),g||!(m.length>0));u++);}var v=0;!function w(a){i(function(){if(p)10*v++<2e4&&w(10);else{if(!g&&m.length>1){for(q=0;"directory"===m[q].type;)q++;m=[m[q]]}d(m,n)}},a||0)}()}var m=b();if(f.dropAvailable&&i(function(){a[f.dropAvailable]?a[f.dropAvailable].value=m:a[f.dropAvailable]=m}),!m)return void(h(f.ngfHideOnDropNotAvailable)(a)===!0&&e.css("display","none"));var n=!1;-1===f.ngfDrop.search(/\W+$files\W+/)&&a.$watch(f.ngfDrop,function(a){n=a===!1});var o,p=null,q=h(f.ngfStopPropagation),r=1;e[0].addEventListener("dragover",function(b){if(!e.attr("disabled")&&!n){if(b.preventDefault(),q(a)&&b.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var c=b.dataTransfer.effectAllowed;b.dataTransfer.dropEffect="move"===c||"linkMove"===c?"move":"copy"}i.cancel(p),a.actualDragOverClass||(o=k(a,f,b)),e.addClass(o)}},!1),e[0].addEventListener("dragenter",function(b){e.attr("disabled")||n||(b.preventDefault(),q(a)&&b.stopPropagation())},!1),e[0].addEventListener("dragleave",function(){e.attr("disabled")||n||(p=i(function(){e.removeClass(o),o=null},r||1))},!1),e[0].addEventListener("drop",function(b){e.attr("disabled")||n||(b.preventDefault(),q(a)&&b.stopPropagation(),e.removeClass(o),o=null,l(b,function(c,e){d(h,i,a,g,f,f.ngfChange||f.ngfDrop,c,e,b)},h(f.ngfAllowDir)(a)!==!1,f.multiple||h(f.ngfMultiple)(a)))},!1)}function b(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}var c=ngFileUpload.validate,d=ngFileUpload.updateModel;ngFileUpload.directive("ngfDrop",["$parse","$timeout","$location",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.directive("ngfNoFileDrop",function(){return function(a,c){b()&&c.css("display","none")}}),ngFileUpload.directive("ngfDropAvailable",["$parse","$timeout",function(a,c){return function(d,e,f){if(b()){var g=a(f.ngfDropAvailable);c(function(){g(d),g.assign&&g.assign(d,!0)})}}}]),ngFileUpload.directive("ngfSrc",["$parse","$timeout",function(a,b){return{restrict:"AE",link:function(d,e,f){window.FileReader&&d.$watch(f.ngfSrc,function(g){g&&c(d,a,f,g,null)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 8")||g.size<2e4)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 9")||g.size<4e6)?b(function(){var a=window.URL||window.webkitURL;if(a&&a.createObjectURL)e.attr("src",a.createObjectURL(g));else{var c=new FileReader;c.readAsDataURL(g),c.onload=function(a){b(function(){e.attr("src",a.target.result)})}}}):e.attr("src",f.ngfDefaultSrc||"")})}}}])}(); | ||
/*! 5.0.9 */ | ||
!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){}}if(window.FileAPI||(window.FileAPI={}),FileAPI.shouldLoad=window.XMLHttpRequest&&!window.FormData||FileAPI.forceLoad,FileAPI.shouldLoad){var c=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,d,e){c(this),this.__url=d;try{a.apply(this,[b,d,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,d){if("__setXHR_"===b){c(this);var e=d(this);e instanceof Function&&e(this)}else this.__requestHeaders=this.__requestHeaders||{},this.__requestHeaders[b]=d,a.apply(this,arguments)}}),a("send",function(a){return function(){var c=this;if(arguments[0]&&arguments[0].__isFileAPIShim){var d=arguments[0],e={url:c.__url,jsonp:!1,cache:!0,complete:function(a,d){c.__completed=!0,!a&&c.__listeners.load&&c.__listeners.load({type:"load",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),!a&&c.__listeners.loadend&&c.__listeners.loadend({type:"loadend",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),"abort"===a&&c.__listeners.abort&&c.__listeners.abort({type:"abort",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),void 0!==d.status&&b(c,"status",function(){return 0===d.status&&a&&"abort"!==a?500:d.status}),void 0!==d.statusText&&b(c,"statusText",function(){return d.statusText}),b(c,"readyState",function(){return 4}),void 0!==d.response&&b(c,"response",function(){return d.response});var e=d.responseText||(a&&0===d.status&&"abort"!==a?a:void 0);b(c,"responseText",function(){return e}),b(c,"response",function(){return e}),a&&b(c,"err",function(){return a}),c.__fileApiXHR=d,c.onreadystatechange&&c.onreadystatechange(),c.onload&&c.onload()},progress:function(a){if(a.target=c,c.__listeners.progress&&c.__listeners.progress(a),c.__total=a.total,c.__loaded=a.loaded,a.total===a.loaded){var b=this;setTimeout(function(){c.__completed||(c.getAllResponseHeaders=function(){},b.complete(null,{status:204,statusText:"No Content"}))},FileAPI.noContentTimeout||1e4)}},headers:c.__requestHeaders};e.data={},e.files={};for(var f=0;f<d.data.length;f++){var g=d.data[f];null!=g.val&&null!=g.val.name&&null!=g.val.size&&null!=g.val.type?e.files[g.key]=g.val:e.data[g.key]=g.val}setTimeout(function(){if(!FileAPI.hasFlash)throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';c.__fileApiXHR=FileAPI.upload(e)},1)}else{if(this.__origError)throw this.__origError;a.apply(c,arguments)}}}),window.XMLHttpRequest.__isFileAPIShim=!0,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(){function a(a){return"input"===a[0].tagName.toLowerCase()&&a.attr("type")&&"file"===a.attr("type").toLowerCase()}function b(){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}function c(a){var b=0,c=0;if(window.jQuery)return jQuery(a).offset();if(a.offsetParent)do b+=a.offsetLeft-a.scrollLeft,c+=a.offsetTop-a.scrollTop,a=a.offsetParent;while(a);return{left:b,top:c}}if(FileAPI.shouldLoad){if(FileAPI.forceLoad&&(FileAPI.html5=!1),!FileAPI.upload){var d,e,f,g,h,i=document.createElement("script"),j=document.getElementsByTagName("script");if(window.FileAPI.jsUrl)d=window.FileAPI.jsUrl;else if(window.FileAPI.jsPath)e=window.FileAPI.jsPath;else for(f=0;f<j.length;f++)if(h=j[f].src,g=h.search(/\/ng\-file\-upload[\-a-zA-z0-9\.]*\.js/),g>-1){e=h.substring(0,g+1);break}null==FileAPI.staticPath&&(FileAPI.staticPath=e),i.setAttribute("src",d||e+"FileAPI.min.js"),document.getElementsByTagName("head")[0].appendChild(i),FileAPI.hasFlash=b()}FileAPI.ngfFixIE=function(d,e,f,g){if(!b())throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';var h=function(){if(d.attr("disabled"))d.$$ngfRefElem.removeClass("js-fileapi-wrapper");else{var b=d.$$ngfRefElem;b?f(d.$$ngfRefElem):(b=d.$$ngfRefElem=e(),b.addClass("js-fileapi-wrapper"),!a(d),setTimeout(function(){b.bind("mouseenter",h)},10),b.bind("change",function(a){i.apply(this,[a]),g.apply(this,[a])})),a(d)||b.css("position","absolute").css("top",c(d[0]).top+"px").css("left",c(d[0]).left+"px").css("width",d[0].offsetWidth+"px").css("height",d[0].offsetHeight+"px").css("filter","alpha(opacity=0)").css("display",d.css("display")).css("overflow","hidden").css("z-index","900000").css("visibility","visible")}};d.bind("mouseenter",h);var i=function(a){for(var b=FileAPI.getFiles(a),c=0;c<b.length;c++)void 0===b[c].size&&(b[c].size=0),void 0===b[c].name&&(b[c].name="file"),void 0===b[c].type&&(b[c].type="undefined");a.target||(a.target={}),a.target.files=b,a.target.files!==b&&(a.__files_=b),(a.__files_||a.target.files).item=function(b){return(a.__files_||a.target.files)[b]||null}}},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){b||(b=!0,a.onloadstart&&a.onloadstart(c("loadstart",d)));var e;"load"===d.type?(a.onloadend&&a.onloadend(c("loadend",d)),e=c("load",d),a.onload&&a.onload(e),a.dispatchEvent(e)):"progress"===d.type?(e=c("progress",d),a.onprogress&&a.onprogress(e),a.dispatchEvent(e)):(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)}}),!window.XMLHttpRequest||window.FileAPI&&FileAPI.shouldLoad||(window.XMLHttpRequest.prototype.setRequestHeader=function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}}(window.XMLHttpRequest.prototype.setRequestHeader));var ngFileUpload=angular.module("ngFileUpload",[]);ngFileUpload.version="5.0.9",ngFileUpload.defaults={},ngFileUpload.service("Upload",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{};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.progressFunc&&c(function(){f.progressFunc(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(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.progressFunc=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){function b(c,d,e){if(void 0!==d)if(angular.isDate(d)&&(d=d.toISOString()),angular.isString(d))c.append(e,d);else if("form"===a.sendFieldsAs)if(angular.isObject(d))for(var f in d)d.hasOwnProperty(f)&&b(c,d[f],e+"["+f+"]");else c.append(e,d);else d=angular.isString(d)?d:JSON.stringify(d),"json-blob"===a.sendFieldsAs?c.append(e,new Blob([d],{type:"application/json"})):c.append(e,d)}return a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?angular.isArray(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(c){var d,e=new FormData,f={};for(d in a.fields)a.fields.hasOwnProperty(d)&&(f[d]=a.fields[d]);c&&(f.data=c);for(d in f)if(f.hasOwnProperty(d)){var g=f[d];a.formDataAppender?a.formDataAppender(e,d,g):b(e,g,d)}if(null!=a.file){var h=a.fileFormDataName||"file";if(angular.isArray(a.file))for(var i=angular.isString(h),j=0;j<a.file.length;j++)e.append(i?h:h[j],a.file[j],a.fileName&&a.fileName[j]||a.file[j].name);else e.append(h,a.file,a.fileName||a.file.name)}return e}),d(a)},this.http=function(b){return b.transformRequest=b.transformRequest||function(b){return window.ArrayBuffer&&b instanceof window.ArrayBuffer||b instanceof Blob?b:a.defaults.transformRequest[0](arguments)},d(b)},this.dataUrl=function(a,b,d){window.FileReader&&a&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 8")||a.size<2e4)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 9")||a.size<4e6)?c(function(){var e=window.URL||window.webkitURL;if(e&&e.createObjectURL&&!d)b(e.createObjectURL(a));else{var f=new FileReader;f.readAsDataURL(a),f.onload=function(a){c(function(){b(a.target.result)})}}}):b(null)},this.setDefaults=function(a){ngFileUpload.defaults=a||{}}}]),function(){function a(a,f,g,h,i,j,k){function l(){return"input"===f[0].tagName.toLowerCase()&&g.type&&"file"===g.type.toLowerCase()}function m(b){if(!s){s=!0;try{for(var f=b.__files_||b.target&&b.target.files,k=[],l=[],m=0;m<f.length;m++){var n=f.item(m);d(a,i,g,n,b)?k.push(n):l.push(n)}e(i,j,a,h,g,c(g,"ngfChange")||c(g,"ngfSelect"),k,l,b),0===k.length&&(b.target.value=k)}finally{s=!1}}}function n(b){c(g,"ngfMultiple")&&b.attr("multiple",i(c(g,"ngfMultiple"))(a)),c(g,"ngfCapture")&&b.attr("capture",i(c(g,"ngfCapture"))(a)),c(g,"accept")&&b.attr("accept",c(g,"accept"));for(var d=0;d<f[0].attributes.length;d++){var e=f[0].attributes[d];(l()&&"type"!==e.name||"type"!==e.name&&"class"!==e.name&&"id"!==e.name&&"style"!==e.name)&&b.attr(e.name,e.value)}}function o(b,c){if(!c&&(b||l()))return f.$$ngfRefElem||f;var d=angular.element('<input type="file">');return n(d),l()?(f.replaceWith(d),f=d,d.attr("__ngf_gen__",!0),k(f)(a)):(d.css("visibility","hidden").css("position","absolute").css("overflow","hidden").css("width","0px").css("height","0px").css("z-index","-100000").css("border","none").css("margin","0px").css("padding","0px").attr("tabindex","-1"),f.$$ngfRefElem&&f.$$ngfRefElem.remove(),f.$$ngfRefElem=d,document.body.appendChild(d[0])),d}function p(b){e(i,j,a,h,g,c(g,"ngfChange")||c(g,"ngfSelect"),[],[],b,!0)}function q(d){function e(a){a&&a.clientY>0&&k[0].click(),!l()&&a||!j||f.bind("click touchend touchstart",q)}if(f.attr("disabled")||r)return!1;if(null!=d){if("touchstart"===d.type)return t=d.originalEvent.touches[0].clientY,!0;if(d.stopPropagation(),d.preventDefault(),"touchend"===d.type){var h=d.originalEvent.changedTouches[0].clientY;if(Math.abs(h-t)>20)return!1}}var j=i(c(g,"ngfResetOnClick"))(a)!==!1,k=o(d,j);return k&&((!d||j)&&k.bind("change",m),d&&j&&i(c(g,"ngfResetModelOnClick"))(a)!==!1&&p(d),b(navigator.userAgent)?setTimeout(function(){e(d)},0):e(d)),!1}if(!f.attr("__ngf_gen__")){a.$on("$destroy",function(){f.$$ngfRefElem&&f.$$ngfRefElem.remove()});var r=!1;-1===c(g,"ngfSelect").search(/\W+$files\W+/)&&a.$watch(c(g,"ngfSelect"),function(a){r=a===!1});var s=!1,t=0;window.FileAPI&&window.FileAPI.ngfFixIE?window.FileAPI.ngfFixIE(f,o,n,m):q()}}function b(a){var b=a.match(/Android[^\d]*(\d+)\.(\d+)/);if(b&&b.length>2){var c=ngFileUpload.defaults.androidFixMinorVersion||4;return parseInt(b[1])<4||parseInt(b[1])===c&&parseInt(b[2])<c}return console.log(a),-1===a.indexOf("Chrome")&&/.*Windows.*Safari.*/.test(a)}ngFileUpload.getAttrWithDefaults=function(a,b){return null!=a[b]?a[b]:null==ngFileUpload.defaults[b]?ngFileUpload.defaults[b]:ngFileUpload.defaults[b].toString()};var c=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfSelect",["$parse","$timeout","$compile",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.validate=function(a,b,d,e,f){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(var d=0;d<b.length;d++)c+="("+g(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}if(null==e)return!1;var h=b(c(d,"ngfAccept"))(a,{$file:e,$event:f}),i=b(c(d,"ngfMaxSize"))(a,{$file:e,$event:f})||9007199254740991,j=b(c(d,"ngfMinSize"))(a,{$file:e,$event:f})||-1;if(null!=h&&angular.isString(h)){var k=new RegExp(g(h),"gi");if(h=null!=e.type&&k.test(e.type.toLowerCase())||null!=e.name&&k.test(e.name.toLowerCase()),!h)return e.$error="accept",!1}else if(h===!1)return e.$error="accept",!1;return null==e.size?!0:e.size>i?(e.$error="maxSize",!1):e.size<j?(e.$error="minSize",!1):!0},ngFileUpload.updateModel=function(a,b,d,e,f,g,h,i,j,k){function l(){if(a(c(f,"ngfKeep"))(d)===!0){var k=(e.$modelValue||[]).slice(0);if(h&&h.length)if(a(c(f,"ngfKeepDistinct"))(d)===!0){for(var l=k.length,m=0;m<h.length;m++){for(var n=0;l>n&&h[m].name!==k[n].name;n++);n===l&&k.push(h[m])}h=k}else h=k.concat(h);else h=k}e&&(a(c(f,"ngModel")).assign(d,h),b(function(){e&&e.$setViewValue(null!=h&&0===h.length?null:h)})),c(f,"ngModelRejected")&&a(c(f,"ngModelRejected")).assign(d,i),g&&a(g)(d,{$files:h,$rejectedFiles:i,$event:j})}k?l():b(function(){l()})};var d=ngFileUpload.validate,e=ngFileUpload.updateModel}(),function(){function a(a,f,g,h,i,j,k){function l(a,b,d){var f=!0,g=d.dataTransfer.items;if(null!=g)for(var h=0;h<g.length&&f;h++)f=f&&("file"===g[h].kind||""===g[h].kind)&&c(a,i,b,g[h],d);var j=i(e(b,"ngfDragOverClass"))(a,{$event:d});return j&&(j.delay&&(s=j.delay),j.accept&&(j=f?j.accept:j.reject)),j||e(b,"ngfDragOverClass")||"dragover"}function m(b,d,e,f){function h(d){c(a,i,g,d,b)?m.push(d):n.push(d)}function l(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;h({name:b.name,type:"directory",path:d});var e=b.createReader(),f=[];p++;var g=function(){e.readEntries(function(d){try{if(d.length)f=f.concat(Array.prototype.slice.call(d||[],0)),g();else{for(var e=0;e<f.length;e++)l(a,f[e],(c?c:"")+b.name+"/");p--}}catch(h){p--,console.error(h)}},function(){p--})};g()}else p++,b.file(function(a){try{p--,a.path=(c?c:"")+a.name,h(a)}catch(b){p--,console.error(b)}},function(){p--})}var m=[],n=[],o=b.dataTransfer.items,p=0;if(o&&o.length>0&&"file"!==k.protocol())for(var q=0;q<o.length;q++){if(o[q].webkitGetAsEntry&&o[q].webkitGetAsEntry()&&o[q].webkitGetAsEntry().isDirectory){var r=o[q].webkitGetAsEntry();if(r.isDirectory&&!e)continue;null!=r&&l(m,r)}else{var s=o[q].getAsFile();null!=s&&h(s)}if(!f&&m.length>0)break}else{var t=b.dataTransfer.files;if(null!=t)for(var u=0;u<t.length&&(h(t.item(u)),f||!(m.length>0));u++);}var v=0;!function w(a){j(function(){if(p)10*v++<2e4&&w(10);else{if(!f&&m.length>1){for(q=0;"directory"===m[q].type;)q++;m=[m[q]]}d(m,n)}},a||0)}()}var n=b();if(e(g,"dropAvailable")&&j(function(){a[e(g,"dropAvailable")]?a[e(g,"dropAvailable")].value=n:a[e(g,"dropAvailable")]=n}),!n)return void(i(e(g,"ngfHideOnDropNotAvailable"))(a)===!0&&f.css("display","none"));var o=!1;-1===e(g,"ngfDrop").search(/\W+$files\W+/)&&a.$watch(e(g,"ngfDrop"),function(a){o=a===!1});var p,q=null,r=i(e(g,"ngfStopPropagation")),s=1;f[0].addEventListener("dragover",function(b){if(!f.attr("disabled")&&!o){if(b.preventDefault(),r(a)&&b.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var c=b.dataTransfer.effectAllowed;b.dataTransfer.dropEffect="move"===c||"linkMove"===c?"move":"copy"}j.cancel(q),a.actualDragOverClass||(p=l(a,g,b)),f.addClass(p)}},!1),f[0].addEventListener("dragenter",function(b){f.attr("disabled")||o||(b.preventDefault(),r(a)&&b.stopPropagation())},!1),f[0].addEventListener("dragleave",function(){f.attr("disabled")||o||(q=j(function(){f.removeClass(p),p=null},s||1))},!1),f[0].addEventListener("drop",function(b){f.attr("disabled")||o||(b.preventDefault(),r(a)&&b.stopPropagation(),f.removeClass(p),p=null,m(b,function(c,f){d(i,j,a,h,g,e(g,"ngfChange")||e(g,"ngfDrop"),c,f,b)},i(e(g,"ngfAllowDir"))(a)!==!1,e(g,"multiple")||i(e(g,"ngfMultiple"))(a)))},!1)}function b(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}var c=ngFileUpload.validate,d=ngFileUpload.updateModel,e=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfDrop",["$parse","$timeout","$location",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.directive("ngfNoFileDrop",function(){return function(a,c){b()&&c.css("display","none")}}),ngFileUpload.directive("ngfDropAvailable",["$parse","$timeout",function(a,c){return function(d,f,g){if(b()){var h=a(e(g,"ngfDropAvailable"));c(function(){h(d),h.assign&&h.assign(d,!0)})}}}])}(),function(){function a(a,b,c,d,e,f,g){b.$watch(e,function(e){window.FileReader&&ngFileUpload.validate(b,c,d,e,null)&&a.dataUrl(e,function(a){g?g(a):e.dataUrl=a||c(f)(b)},c(d.ngfNoObjectUrl)(b))})}ngFileUpload.directive("ngfSrc",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfSrc,f.ngfDefaultSrc,function(a){e.attr("src",a)})}}}]),ngFileUpload.directive("ngfBackground",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfBackground,f.ngfDefaultBackground,function(a){e.css("background-image","url("+a+")")})}}}]),ngFileUpload.directive("ngfDataUrl",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfDataUrl,f.ngfDefaultDataUrl)}}}])}(); |
@@ -5,3 +5,3 @@ /**! | ||
* @author Danial <danial.farid@gmail.com> | ||
* @version 5.0.8 | ||
* @version 5.0.9 | ||
*/ | ||
@@ -8,0 +8,0 @@ |
@@ -1,2 +0,2 @@ | ||
/*! 5.0.8 */ | ||
/*! 5.0.9 */ | ||
!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){}}if(window.FileAPI||(window.FileAPI={}),FileAPI.shouldLoad=window.XMLHttpRequest&&!window.FormData||FileAPI.forceLoad,FileAPI.shouldLoad){var c=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,d,e){c(this),this.__url=d;try{a.apply(this,[b,d,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,d){if("__setXHR_"===b){c(this);var e=d(this);e instanceof Function&&e(this)}else this.__requestHeaders=this.__requestHeaders||{},this.__requestHeaders[b]=d,a.apply(this,arguments)}}),a("send",function(a){return function(){var c=this;if(arguments[0]&&arguments[0].__isFileAPIShim){var d=arguments[0],e={url:c.__url,jsonp:!1,cache:!0,complete:function(a,d){c.__completed=!0,!a&&c.__listeners.load&&c.__listeners.load({type:"load",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),!a&&c.__listeners.loadend&&c.__listeners.loadend({type:"loadend",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),"abort"===a&&c.__listeners.abort&&c.__listeners.abort({type:"abort",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),void 0!==d.status&&b(c,"status",function(){return 0===d.status&&a&&"abort"!==a?500:d.status}),void 0!==d.statusText&&b(c,"statusText",function(){return d.statusText}),b(c,"readyState",function(){return 4}),void 0!==d.response&&b(c,"response",function(){return d.response});var e=d.responseText||(a&&0===d.status&&"abort"!==a?a:void 0);b(c,"responseText",function(){return e}),b(c,"response",function(){return e}),a&&b(c,"err",function(){return a}),c.__fileApiXHR=d,c.onreadystatechange&&c.onreadystatechange(),c.onload&&c.onload()},progress:function(a){if(a.target=c,c.__listeners.progress&&c.__listeners.progress(a),c.__total=a.total,c.__loaded=a.loaded,a.total===a.loaded){var b=this;setTimeout(function(){c.__completed||(c.getAllResponseHeaders=function(){},b.complete(null,{status:204,statusText:"No Content"}))},FileAPI.noContentTimeout||1e4)}},headers:c.__requestHeaders};e.data={},e.files={};for(var f=0;f<d.data.length;f++){var g=d.data[f];null!=g.val&&null!=g.val.name&&null!=g.val.size&&null!=g.val.type?e.files[g.key]=g.val:e.data[g.key]=g.val}setTimeout(function(){if(!FileAPI.hasFlash)throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';c.__fileApiXHR=FileAPI.upload(e)},1)}else{if(this.__origError)throw this.__origError;a.apply(c,arguments)}}}),window.XMLHttpRequest.__isFileAPIShim=!0,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(){function a(a){return"input"===a[0].tagName.toLowerCase()&&a.attr("type")&&"file"===a.attr("type").toLowerCase()}function b(){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}function c(a){var b=0,c=0;if(window.jQuery)return jQuery(a).offset();if(a.offsetParent)do b+=a.offsetLeft-a.scrollLeft,c+=a.offsetTop-a.scrollTop,a=a.offsetParent;while(a);return{left:b,top:c}}if(FileAPI.shouldLoad){if(FileAPI.forceLoad&&(FileAPI.html5=!1),!FileAPI.upload){var d,e,f,g,h,i=document.createElement("script"),j=document.getElementsByTagName("script");if(window.FileAPI.jsUrl)d=window.FileAPI.jsUrl;else if(window.FileAPI.jsPath)e=window.FileAPI.jsPath;else for(f=0;f<j.length;f++)if(h=j[f].src,g=h.search(/\/ng\-file\-upload[\-a-zA-z0-9\.]*\.js/),g>-1){e=h.substring(0,g+1);break}null==FileAPI.staticPath&&(FileAPI.staticPath=e),i.setAttribute("src",d||e+"FileAPI.min.js"),document.getElementsByTagName("head")[0].appendChild(i),FileAPI.hasFlash=b()}FileAPI.ngfFixIE=function(d,e,f,g){if(!b())throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';var h=function(){if(d.attr("disabled"))d.$$ngfRefElem.removeClass("js-fileapi-wrapper");else{var b=d.$$ngfRefElem;b?f(d.$$ngfRefElem):(b=d.$$ngfRefElem=e(),b.addClass("js-fileapi-wrapper"),!a(d),setTimeout(function(){b.bind("mouseenter",h)},10),b.bind("change",function(a){i.apply(this,[a]),g.apply(this,[a])})),a(d)||b.css("position","absolute").css("top",c(d[0]).top+"px").css("left",c(d[0]).left+"px").css("width",d[0].offsetWidth+"px").css("height",d[0].offsetHeight+"px").css("filter","alpha(opacity=0)").css("display",d.css("display")).css("overflow","hidden").css("z-index","900000").css("visibility","visible")}};d.bind("mouseenter",h);var i=function(a){for(var b=FileAPI.getFiles(a),c=0;c<b.length;c++)void 0===b[c].size&&(b[c].size=0),void 0===b[c].name&&(b[c].name="file"),void 0===b[c].type&&(b[c].type="undefined");a.target||(a.target={}),a.target.files=b,a.target.files!==b&&(a.__files_=b),(a.__files_||a.target.files).item=function(b){return(a.__files_||a.target.files)[b]||null}}},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){b||(b=!0,a.onloadstart&&a.onloadstart(c("loadstart",d)));var e;"load"===d.type?(a.onloadend&&a.onloadend(c("loadend",d)),e=c("load",d),a.onload&&a.onload(e),a.dispatchEvent(e)):"progress"===d.type?(e=c("progress",d),a.onprogress&&a.onprogress(e),a.dispatchEvent(e)):(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 5.0.8 | ||
* @version 5.0.9 | ||
*/ | ||
@@ -25,3 +25,5 @@ | ||
ngFileUpload.version = '5.0.8'; | ||
ngFileUpload.version = '5.0.9'; | ||
ngFileUpload.defaults = {}; | ||
ngFileUpload.service('Upload', ['$http', '$q', '$timeout', function ($http, $q, $timeout) { | ||
@@ -199,2 +201,31 @@ function sendHttp(config) { | ||
}; | ||
this.dataUrl = function (file, callback, disallowObjectUrl) { | ||
if (window.FileReader && file && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) { | ||
$timeout(function () { | ||
//prefer URL.createObjectURL for handling refrences to files of all sizes | ||
//since it doesn´t build a large string in memory | ||
var URL = window.URL || window.webkitURL; | ||
if (URL && URL.createObjectURL && !disallowObjectUrl) { | ||
callback(URL.createObjectURL(file)); | ||
} else { | ||
var fileReader = new FileReader(); | ||
fileReader.readAsDataURL(file); | ||
fileReader.onload = function (e) { | ||
$timeout(function () { | ||
callback(e.target.result); | ||
}); | ||
}; | ||
} | ||
}); | ||
} else { | ||
callback(null); | ||
} | ||
}; | ||
this.setDefaults = function(defaults) { | ||
ngFileUpload.defaults = defaults || {}; | ||
}; | ||
} | ||
@@ -205,260 +236,311 @@ | ||
(function () { | ||
ngFileUpload.directive('ngfSelect', ['$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); | ||
} | ||
}; | ||
}]); | ||
ngFileUpload.getAttrWithDefaults = function(attr, name) { | ||
return attr[name] != null ? attr[name] : | ||
(ngFileUpload.defaults[name] == null ? | ||
ngFileUpload.defaults[name] : ngFileUpload.defaults[name].toString()); | ||
}; | ||
function linkFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile) { | ||
/** @namespace attr.ngfSelect */ | ||
/** @namespace attr.ngfChange */ | ||
/** @namespace attr.ngModel */ | ||
/** @namespace attr.ngModelRejected */ | ||
/** @namespace attr.ngfMultiple */ | ||
/** @namespace attr.ngfCapture */ | ||
/** @namespace attr.ngfAccept */ | ||
/** @namespace attr.ngfMaxSize */ | ||
/** @namespace attr.ngfMinSize */ | ||
/** @namespace attr.ngfResetOnClick */ | ||
/** @namespace attr.ngfResetModelOnClick */ | ||
/** @namespace attr.ngfKeep */ | ||
/** @namespace attr.ngfKeepDistinct */ | ||
var getAttr = ngFileUpload.getAttrWithDefaults; | ||
if (elem.attr('__ngf_gen__')) { | ||
return; | ||
ngFileUpload.directive('ngfSelect', ['$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); | ||
} | ||
}; | ||
}]); | ||
scope.$on('$destroy', function () { | ||
if (elem.$$ngfRefElem) elem.$$ngfRefElem.remove(); | ||
}); | ||
function linkFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile) { | ||
/** @namespace attr.ngfSelect */ | ||
/** @namespace attr.ngfChange */ | ||
/** @namespace attr.ngModel */ | ||
/** @namespace attr.ngModelRejected */ | ||
/** @namespace attr.ngfMultiple */ | ||
/** @namespace attr.ngfCapture */ | ||
/** @namespace attr.ngfAccept */ | ||
/** @namespace attr.ngfMaxSize */ | ||
/** @namespace attr.ngfMinSize */ | ||
/** @namespace attr.ngfResetOnClick */ | ||
/** @namespace attr.ngfResetModelOnClick */ | ||
/** @namespace attr.ngfKeep */ | ||
/** @namespace attr.ngfKeepDistinct */ | ||
var disabled = false; | ||
if (attr.ngfSelect.search(/\W+$files\W+/) === -1) { | ||
scope.$watch(attr.ngfSelect, function (val) { | ||
disabled = val === false; | ||
}); | ||
} | ||
function isInputTypeFile() { | ||
return elem[0].tagName.toLowerCase() === 'input' && attr.type && attr.type.toLowerCase() === 'file'; | ||
} | ||
if (elem.attr('__ngf_gen__')) { | ||
return; | ||
} | ||
var isUpdating = false; | ||
scope.$on('$destroy', function () { | ||
if (elem.$$ngfRefElem) elem.$$ngfRefElem.remove(); | ||
}); | ||
function changeFn(evt) { | ||
if (!isUpdating) { | ||
isUpdating = true; | ||
try { | ||
var fileList = evt.__files_ || (evt.target && evt.target.files); | ||
var files = [], rejFiles = []; | ||
var disabled = false; | ||
if (getAttr(attr, 'ngfSelect').search(/\W+$files\W+/) === -1) { | ||
scope.$watch(getAttr(attr, 'ngfSelect'), function (val) { | ||
disabled = val === false; | ||
}); | ||
} | ||
function isInputTypeFile() { | ||
return elem[0].tagName.toLowerCase() === 'input' && attr.type && attr.type.toLowerCase() === 'file'; | ||
} | ||
for (var i = 0; i < fileList.length; i++) { | ||
var file = fileList.item(i); | ||
if (validate(scope, $parse, attr, file, evt)) { | ||
files.push(file); | ||
} else { | ||
rejFiles.push(file); | ||
} | ||
} | ||
updateModel($parse, $timeout, scope, ngModel, attr, attr.ngfChange || attr.ngfSelect, files, rejFiles, evt); | ||
if (files.length === 0) evt.target.value = files; | ||
var isUpdating = false; | ||
function changeFn(evt) { | ||
if (!isUpdating) { | ||
isUpdating = true; | ||
try { | ||
var fileList = evt.__files_ || (evt.target && evt.target.files); | ||
var files = [], rejFiles = []; | ||
for (var i = 0; i < fileList.length; i++) { | ||
var file = fileList.item(i); | ||
if (validate(scope, $parse, attr, file, evt)) { | ||
files.push(file); | ||
} else { | ||
rejFiles.push(file); | ||
} | ||
} | ||
updateModel($parse, $timeout, scope, ngModel, attr, | ||
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), files, rejFiles, evt); | ||
if (files.length === 0) evt.target.value = files; | ||
// if (evt.target && evt.target.getAttribute('__ngf_gen__')) { | ||
// angular.element(evt.target).remove(); | ||
// } | ||
} finally { | ||
isUpdating = false; | ||
} | ||
} | ||
} finally { | ||
isUpdating = false; | ||
} | ||
} | ||
} | ||
function bindAttrToFileInput(fileElem) { | ||
if (attr.ngfMultiple) fileElem.attr('multiple', $parse(attr.ngfMultiple)(scope)); | ||
if (attr.ngfCapture) fileElem.attr('capture', $parse(attr.ngfCapture)(scope)); | ||
if (attr.accept) fileElem.attr('accept', attr.accept); | ||
for (var i = 0; i < elem[0].attributes.length; i++) { | ||
var attribute = elem[0].attributes[i]; | ||
if ((isInputTypeFile() && attribute.name !== 'type') || | ||
(attribute.name !== 'type' && attribute.name !== 'class' && | ||
attribute.name !== 'id' && attribute.name !== 'style')) { | ||
fileElem.attr(attribute.name, attribute.value); | ||
} | ||
} | ||
function bindAttrToFileInput(fileElem) { | ||
if (getAttr(attr, 'ngfMultiple')) fileElem.attr('multiple', $parse(getAttr(attr, 'ngfMultiple'))(scope)); | ||
if (getAttr(attr, 'ngfCapture')) fileElem.attr('capture', $parse(getAttr(attr, 'ngfCapture'))(scope)); | ||
if (getAttr(attr, 'accept')) fileElem.attr('accept', getAttr(attr, 'accept')); | ||
for (var i = 0; i < elem[0].attributes.length; i++) { | ||
var attribute = elem[0].attributes[i]; | ||
if ((isInputTypeFile() && attribute.name !== 'type') || | ||
(attribute.name !== 'type' && attribute.name !== 'class' && | ||
attribute.name !== 'id' && attribute.name !== 'style')) { | ||
fileElem.attr(attribute.name, attribute.value); | ||
} | ||
} | ||
} | ||
function createFileInput(evt, resetOnClick) { | ||
if (!resetOnClick && (evt || isInputTypeFile())) return elem.$$ngfRefElem || elem; | ||
function createFileInput(evt, resetOnClick) { | ||
if (!resetOnClick && (evt || isInputTypeFile())) return elem.$$ngfRefElem || elem; | ||
var fileElem = angular.element('<input type="file">'); | ||
bindAttrToFileInput(fileElem); | ||
var fileElem = angular.element('<input type="file">'); | ||
bindAttrToFileInput(fileElem); | ||
if (isInputTypeFile()) { | ||
elem.replaceWith(fileElem); | ||
elem = fileElem; | ||
fileElem.attr('__ngf_gen__', true); | ||
$compile(elem)(scope); | ||
} else { | ||
fileElem.css('visibility', 'hidden').css('position', 'absolute').css('overflow', 'hidden') | ||
.css('width', '0px').css('height', '0px').css('z-index', '-100000').css('border', 'none') | ||
.css('margin', '0px').css('padding', '0px').attr('tabindex', '-1'); | ||
if (elem.$$ngfRefElem) { | ||
elem.$$ngfRefElem.remove(); | ||
} | ||
elem.$$ngfRefElem = fileElem; | ||
document.body.appendChild(fileElem[0]); | ||
} | ||
return fileElem; | ||
if (isInputTypeFile()) { | ||
elem.replaceWith(fileElem); | ||
elem = fileElem; | ||
fileElem.attr('__ngf_gen__', true); | ||
$compile(elem)(scope); | ||
} else { | ||
fileElem.css('visibility', 'hidden').css('position', 'absolute').css('overflow', 'hidden') | ||
.css('width', '0px').css('height', '0px').css('z-index', '-100000').css('border', 'none') | ||
.css('margin', '0px').css('padding', '0px').attr('tabindex', '-1'); | ||
if (elem.$$ngfRefElem) { | ||
elem.$$ngfRefElem.remove(); | ||
} | ||
elem.$$ngfRefElem = fileElem; | ||
document.body.appendChild(fileElem[0]); | ||
} | ||
function resetModel(evt) { | ||
updateModel($parse, $timeout, scope, ngModel, attr, attr.ngfChange || attr.ngfSelect, [], [], evt, true); | ||
} | ||
return fileElem; | ||
} | ||
function clickHandler(evt) { | ||
if (elem.attr('disabled') || disabled) return false; | ||
if (evt != null) { | ||
evt.preventDefault(); | ||
evt.stopPropagation(); | ||
} | ||
var resetOnClick = $parse(attr.ngfResetOnClick)(scope) !== false; | ||
var fileElem = createFileInput(evt, resetOnClick); | ||
function resetModel(evt) { | ||
updateModel($parse, $timeout, scope, ngModel, attr, | ||
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), [], [], evt, true); | ||
} | ||
function clickAndAssign(evt) { | ||
if (evt) { | ||
fileElem[0].click(); | ||
} | ||
if (isInputTypeFile() || !evt) { | ||
elem.bind('click touchend', clickHandler); | ||
} | ||
} | ||
var initialTouchStartY = 0; | ||
if (fileElem) { | ||
if (!evt || resetOnClick) fileElem.bind('change', changeFn); | ||
if (evt && resetOnClick && $parse(attr.ngfResetModelOnClick)(scope) !== false) resetModel(evt); | ||
function clickHandler(evt) { | ||
if (elem.attr('disabled') || disabled) return false; | ||
// fix for android native browser < 4.4 | ||
if (shouldClickLater(navigator.userAgent)) { | ||
setTimeout(function () { | ||
clickAndAssign(evt); | ||
}, 0); | ||
} else { | ||
clickAndAssign(evt); | ||
} | ||
} | ||
return false; | ||
if (evt != null) { | ||
if (evt.type === 'touchstart') { | ||
initialTouchStartY = evt.originalEvent.touches[0].clientY; | ||
return true; // don't block event default | ||
} else { | ||
evt.stopPropagation(); | ||
evt.preventDefault(); | ||
// prevent scroll from triggering event | ||
if (evt.type === 'touchend') { | ||
var currentLocation = evt.originalEvent.changedTouches[0].clientY; | ||
if (Math.abs(currentLocation - initialTouchStartY) > 20) return false; | ||
} | ||
} | ||
} | ||
if (window.FileAPI && window.FileAPI.ngfFixIE) { | ||
window.FileAPI.ngfFixIE(elem, createFileInput, bindAttrToFileInput, changeFn); | ||
var resetOnClick = $parse(getAttr(attr, 'ngfResetOnClick'))(scope) !== false; | ||
var fileElem = createFileInput(evt, resetOnClick); | ||
function clickAndAssign(evt) { | ||
if (evt && evt.clientY > 0) { | ||
fileElem[0].click(); | ||
} | ||
if ((isInputTypeFile() || !evt) && resetOnClick) { | ||
elem.bind('click touchend touchstart', clickHandler); | ||
} | ||
} | ||
if (fileElem) { | ||
if (!evt || resetOnClick) fileElem.bind('change', changeFn); | ||
if (evt && resetOnClick && $parse(getAttr(attr, 'ngfResetModelOnClick'))(scope) !== false) { | ||
resetModel(evt); | ||
} | ||
// fix for android native browser < 4.4 | ||
if (shouldClickLater(navigator.userAgent)) { | ||
setTimeout(function () { | ||
clickAndAssign(evt); | ||
}, 0); | ||
} else { | ||
clickHandler(); | ||
//if (!isInputTypeFile()) { | ||
// elem.bind('click touchend', clickHandler); | ||
//} | ||
clickAndAssign(evt); | ||
} | ||
} | ||
return false; | ||
} | ||
function shouldClickLater(ua) { | ||
// android below 4.4 | ||
var m = ua.match(/Android[^\d]*(\d+)\.(\d+)/); | ||
if (m && m.length > 2) { | ||
return parseInt(m[1]) < 4 || (parseInt(m[1]) === 4 && parseInt(m[2]) < 4); | ||
} | ||
if (window.FileAPI && window.FileAPI.ngfFixIE) { | ||
window.FileAPI.ngfFixIE(elem, createFileInput, bindAttrToFileInput, changeFn); | ||
} else { | ||
clickHandler(); | ||
//if (!isInputTypeFile()) { | ||
// elem.bind('click touchend', clickHandler); | ||
//} | ||
} | ||
} | ||
// safari on windows | ||
return /.*Windows.*Safari.*/.test(ua); | ||
function shouldClickLater(ua) { | ||
// android below 4.4 | ||
var m = ua.match(/Android[^\d]*(\d+)\.(\d+)/); | ||
if (m && m.length > 2) { | ||
var v = ngFileUpload.defaults.androidFixMinorVersion || 4; | ||
return parseInt(m[1]) < 4 || (parseInt(m[1]) === v && parseInt(m[2]) < v); | ||
} | ||
ngFileUpload.validate = function (scope, $parse, attr, file, evt) { | ||
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; | ||
} | ||
// safari on windows | ||
console.log(ua); | ||
return ua.indexOf('Chrome') === -1 && /.*Windows.*Safari.*/.test(ua); | ||
} | ||
var accept = $parse(attr.ngfAccept)(scope, {$file: file, $event: evt}); | ||
var fileSizeMax = $parse(attr.ngfMaxSize)(scope, {$file: file, $event: evt}) || 9007199254740991; | ||
var fileSizeMin = $parse(attr.ngfMinSize)(scope, {$file: file, $event: evt}) || -1; | ||
if (accept != null && angular.isString(accept)) { | ||
var regexp = new RegExp(globStringToRegex(accept), 'gi'); | ||
accept = (file.type != null && regexp.test(file.type.toLowerCase())) || | ||
(file.name != null && regexp.test(file.name.toLowerCase())); | ||
ngFileUpload.validate = function (scope, $parse, attr, file, evt) { | ||
if (file == null) { | ||
return false; | ||
} | ||
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 += '|'; | ||
} | ||
} | ||
return (accept == null || accept) && (file.size == null || (file.size < fileSizeMax && file.size > fileSizeMin)); | ||
}; | ||
} else { | ||
if (str.indexOf('.') === 0) { | ||
str = '*' + str; | ||
} | ||
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$'; | ||
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.'); | ||
} | ||
return result; | ||
} | ||
ngFileUpload.updateModel = function ($parse, $timeout, scope, ngModel, attr, fileChange, | ||
files, rejFiles, evt, noDelay) { | ||
function update() { | ||
if ($parse(attr.ngfKeep)(scope) === true) { | ||
var prevFiles = (ngModel.$modelValue || []).slice(0); | ||
if (!files || !files.length) { | ||
files = prevFiles; | ||
} else if ($parse(attr.ngfKeepDistinct)(scope) === true) { | ||
var len = prevFiles.length; | ||
for (var i = 0; i < files.length; i++) { | ||
for (var j = 0; j < len; j++) { | ||
if (files[i].name === prevFiles[j].name) break; | ||
} | ||
if (j === len) { | ||
prevFiles.push(files[i]); | ||
} | ||
} | ||
files = prevFiles; | ||
} else { | ||
files = prevFiles.concat(files); | ||
} | ||
var accept = $parse(getAttr(attr, 'ngfAccept'))(scope, {$file: file, $event: evt}); | ||
var fileSizeMax = $parse(getAttr(attr, 'ngfMaxSize'))(scope, {$file: file, $event: evt}) || 9007199254740991; | ||
var fileSizeMin = $parse(getAttr(attr, 'ngfMinSize'))(scope, {$file: file, $event: evt}) || -1; | ||
if (accept != null && angular.isString(accept)) { | ||
var regexp = new RegExp(globStringToRegex(accept), 'gi'); | ||
accept = (file.type != null && regexp.test(file.type.toLowerCase())) || | ||
(file.name != null && regexp.test(file.name.toLowerCase())); | ||
if (!accept) { | ||
file.$error = 'accept'; | ||
return false; | ||
} | ||
} else { | ||
if (accept === false) { | ||
file.$error = 'accept'; | ||
return false; | ||
} | ||
} | ||
if (file.size == null) return true; | ||
if (file.size > fileSizeMax) { | ||
file.$error = 'maxSize'; | ||
return false; | ||
} | ||
if (file.size < fileSizeMin) { | ||
file.$error = 'minSize'; | ||
return false; | ||
} | ||
return true; | ||
}; | ||
ngFileUpload.updateModel = function ($parse, $timeout, scope, ngModel, attr, fileChange, | ||
files, rejFiles, evt, noDelay) { | ||
function update() { | ||
if ($parse(getAttr(attr, 'ngfKeep'))(scope) === true) { | ||
var prevFiles = (ngModel.$modelValue || []).slice(0); | ||
if (!files || !files.length) { | ||
files = prevFiles; | ||
} else if ($parse(getAttr(attr, 'ngfKeepDistinct'))(scope) === true) { | ||
var len = prevFiles.length; | ||
for (var i = 0; i < files.length; i++) { | ||
for (var j = 0; j < len; j++) { | ||
if (files[i].name === prevFiles[j].name) break; | ||
} | ||
if (ngModel) { | ||
$parse(attr.ngModel).assign(scope, files); | ||
$timeout(function () { | ||
if (ngModel) { | ||
ngModel.$setViewValue(files != null && files.length === 0 ? null : files); | ||
} | ||
}); | ||
if (j === len) { | ||
prevFiles.push(files[i]); | ||
} | ||
if (attr.ngModelRejected) { | ||
$parse(attr.ngModelRejected).assign(scope, rejFiles); | ||
} | ||
if (fileChange) { | ||
$parse(fileChange)(scope, { | ||
$files: files, | ||
$rejectedFiles: rejFiles, | ||
$event: evt | ||
}); | ||
} | ||
} | ||
if (noDelay) { | ||
update(); | ||
} | ||
files = prevFiles; | ||
} else { | ||
$timeout(function () { | ||
update(); | ||
}); | ||
files = prevFiles.concat(files); | ||
} | ||
}; | ||
} | ||
if (ngModel) { | ||
$parse(getAttr(attr, 'ngModel')).assign(scope, files); | ||
$timeout(function () { | ||
if (ngModel) { | ||
ngModel.$setViewValue(files != null && files.length === 0 ? null : files); | ||
} | ||
}); | ||
} | ||
if (getAttr(attr, 'ngModelRejected')) { | ||
$parse(getAttr(attr, 'ngModelRejected')).assign(scope, rejFiles); | ||
} | ||
if (fileChange) { | ||
$parse(fileChange)(scope, { | ||
$files: files, | ||
$rejectedFiles: rejFiles, | ||
$event: evt | ||
}); | ||
} | ||
} | ||
var validate = ngFileUpload.validate; | ||
var updateModel = ngFileUpload.updateModel; | ||
if (noDelay) { | ||
update(); | ||
} else { | ||
$timeout(function () { | ||
update(); | ||
}); | ||
} | ||
}; | ||
var validate = ngFileUpload.validate; | ||
var updateModel = ngFileUpload.updateModel; | ||
})(); | ||
@@ -469,2 +551,3 @@ | ||
var updateModel = ngFileUpload.updateModel; | ||
var getAttr = ngFileUpload.getAttrWithDefaults; | ||
@@ -490,3 +573,3 @@ ngFileUpload.directive('ngfDrop', ['$parse', '$timeout', '$location', function ($parse, $timeout, $location) { | ||
if (dropAvailable()) { | ||
var fn = $parse(attr.ngfDropAvailable); | ||
var fn = $parse(getAttr(attr, 'ngfDropAvailable')); | ||
$timeout(function () { | ||
@@ -504,8 +587,8 @@ fn(scope); | ||
var available = dropAvailable(); | ||
if (attr.dropAvailable) { | ||
if (getAttr(attr, 'dropAvailable')) { | ||
$timeout(function () { | ||
if (scope[attr.dropAvailable]) { | ||
scope[attr.dropAvailable].value = available; | ||
if (scope[getAttr(attr, 'dropAvailable')]) { | ||
scope[getAttr(attr, 'dropAvailable')].value = available; | ||
} else { | ||
scope[attr.dropAvailable] = available; | ||
scope[getAttr(attr, 'dropAvailable')] = available; | ||
} | ||
@@ -515,3 +598,3 @@ }); | ||
if (!available) { | ||
if ($parse(attr.ngfHideOnDropNotAvailable)(scope) === true) { | ||
if ($parse(getAttr(attr, 'ngfHideOnDropNotAvailable'))(scope) === true) { | ||
elem.css('display', 'none'); | ||
@@ -523,4 +606,4 @@ } | ||
var disabled = false; | ||
if (attr.ngfDrop.search(/\W+$files\W+/) === -1) { | ||
scope.$watch(attr.ngfDrop, function(val) { | ||
if (getAttr(attr, 'ngfDrop').search(/\W+$files\W+/) === -1) { | ||
scope.$watch(getAttr(attr, 'ngfDrop'), function(val) { | ||
disabled = val === false; | ||
@@ -531,3 +614,3 @@ }); | ||
var leaveTimeout = null; | ||
var stopPropagation = $parse(attr.ngfStopPropagation); | ||
var stopPropagation = $parse(getAttr(attr, 'ngfStopPropagation')); | ||
var dragOverDelay = 1; | ||
@@ -571,4 +654,5 @@ var actualDragOverClass; | ||
updateModel($parse, $timeout, scope, ngModel, attr, | ||
attr.ngfChange || attr.ngfDrop, files, rejFiles, evt); | ||
}, $parse(attr.ngfAllowDir)(scope) !== false, attr.multiple || $parse(attr.ngfMultiple)(scope)); | ||
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt); | ||
}, $parse(getAttr(attr, 'ngfAllowDir'))(scope) !== false, | ||
getAttr(attr, 'multiple') || $parse(getAttr(attr, 'ngfMultiple'))(scope)); | ||
}, false); | ||
@@ -586,3 +670,3 @@ | ||
} | ||
var clazz = $parse(attr.ngfDragOverClass)(scope, {$event: evt}); | ||
var clazz = $parse(getAttr(attr, 'ngfDragOverClass'))(scope, {$event: evt}); | ||
if (clazz) { | ||
@@ -592,3 +676,3 @@ if (clazz.delay) dragOverDelay = clazz.delay; | ||
} | ||
return clazz || attr.ngfDragOverClass || 'dragover'; | ||
return clazz || getAttr(attr, 'ngfDragOverClass') || 'dragover'; | ||
} | ||
@@ -701,33 +785,35 @@ | ||
ngFileUpload.directive('ngfSrc', ['$parse', '$timeout', function ($parse, $timeout) { | ||
function dropAvailable() { | ||
var div = document.createElement('div'); | ||
return ('draggable' in div) && ('ondrop' in div); | ||
} | ||
})(); | ||
(function () { | ||
function fileToSrc(Upload, scope, $parse, attr, name, defaultName, callback) { | ||
scope.$watch(name, function (file) { | ||
if (window.FileReader && ngFileUpload.validate(scope, $parse, attr, file, null)) { | ||
Upload.dataUrl(file, function(url) { | ||
if (callback) { | ||
callback(url); | ||
} else { | ||
file.dataUrl = url || $parse(defaultName)(scope); | ||
} | ||
}, $parse(attr.ngfNoObjectUrl)(scope)); | ||
} | ||
}); | ||
} | ||
/** @namespace attr.ngfSrc */ | ||
/** @namespace attr.ngfDefaultSrc */ | ||
/** @namespace attr.ngfNoObjectUrl */ | ||
ngFileUpload.directive('ngfSrc', ['$parse', 'Upload', function ($parse, Upload) { | ||
return { | ||
restrict: 'AE', | ||
link: function (scope, elem, attr) { | ||
if (window.FileReader) { | ||
scope.$watch(attr.ngfSrc, function (file) { | ||
if (file && | ||
validate(scope, $parse, attr, file, null) && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) { | ||
$timeout(function () { | ||
//prefer URL.createObjectURL for handling refrences to files of all sizes | ||
//since it doesn´t build a large string in memory | ||
var URL = window.URL || window.webkitURL; | ||
if (URL && URL.createObjectURL) { | ||
elem.attr('src', URL.createObjectURL(file)); | ||
} else { | ||
var fileReader = new FileReader(); | ||
fileReader.readAsDataURL(file); | ||
fileReader.onload = function (e) { | ||
$timeout(function () { | ||
elem.attr('src', e.target.result); | ||
}); | ||
}; | ||
} | ||
}); | ||
} else { | ||
elem.attr('src', attr.ngfDefaultSrc || ''); | ||
} | ||
}); | ||
} | ||
fileToSrc(Upload, scope, $parse, attr, attr.ngfSrc, attr.ngfDefaultSrc, function (url) { | ||
elem.attr('src', url); | ||
}); | ||
} | ||
@@ -737,7 +823,28 @@ }; | ||
function dropAvailable() { | ||
var div = document.createElement('div'); | ||
return ('draggable' in div) && ('ondrop' in div); | ||
} | ||
/** @namespace attr.ngfBackground */ | ||
/** @namespace attr.ngfDefaultBackground */ | ||
/** @namespace attr.ngfNoObjectUrl */ | ||
ngFileUpload.directive('ngfBackground', ['$parse', 'Upload', function ($parse, Upload) { | ||
return { | ||
restrict: 'AE', | ||
link: function (scope, elem, attr) { | ||
fileToSrc(Upload, scope, $parse, attr, attr.ngfBackground, attr.ngfDefaultBackground, function (url) { | ||
elem.css('background-image', 'url(' + url + ')'); | ||
}); | ||
} | ||
}; | ||
}]); | ||
/** @namespace attr.ngfDataUrl */ | ||
/** @namespace attr.ngfDefaultDataUrl */ | ||
/** @namespace attr.ngfNoObjectUrl */ | ||
ngFileUpload.directive('ngfDataUrl', ['$parse', 'Upload', function ($parse, Upload) { | ||
return { | ||
restrict: 'AE', | ||
link: function (scope, elem, attr) { | ||
fileToSrc(Upload, scope, $parse, attr, attr.ngfDataUrl, attr.ngfDefaultDataUrl); | ||
} | ||
}; | ||
}]); | ||
})(); |
@@ -1,2 +0,2 @@ | ||
/*! 5.0.8 */ | ||
!window.XMLHttpRequest||window.FileAPI&&FileAPI.shouldLoad||(window.XMLHttpRequest.prototype.setRequestHeader=function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}}(window.XMLHttpRequest.prototype.setRequestHeader));var ngFileUpload=angular.module("ngFileUpload",[]);ngFileUpload.version="5.0.8",ngFileUpload.service("Upload",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{};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.progressFunc&&c(function(){f.progressFunc(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(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.progressFunc=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){function b(c,d,e){if(void 0!==d)if(angular.isDate(d)&&(d=d.toISOString()),angular.isString(d))c.append(e,d);else if("form"===a.sendFieldsAs)if(angular.isObject(d))for(var f in d)d.hasOwnProperty(f)&&b(c,d[f],e+"["+f+"]");else c.append(e,d);else d=angular.isString(d)?d:JSON.stringify(d),"json-blob"===a.sendFieldsAs?c.append(e,new Blob([d],{type:"application/json"})):c.append(e,d)}return a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?angular.isArray(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(c){var d,e=new FormData,f={};for(d in a.fields)a.fields.hasOwnProperty(d)&&(f[d]=a.fields[d]);c&&(f.data=c);for(d in f)if(f.hasOwnProperty(d)){var g=f[d];a.formDataAppender?a.formDataAppender(e,d,g):b(e,g,d)}if(null!=a.file){var h=a.fileFormDataName||"file";if(angular.isArray(a.file))for(var i=angular.isString(h),j=0;j<a.file.length;j++)e.append(i?h:h[j],a.file[j],a.fileName&&a.fileName[j]||a.file[j].name);else e.append(h,a.file,a.fileName||a.file.name)}return e}),d(a)},this.http=function(b){return b.transformRequest=b.transformRequest||function(b){return window.ArrayBuffer&&b instanceof window.ArrayBuffer||b instanceof Blob?b:a.defaults.transformRequest[0](arguments)},d(b)}}]),function(){function a(a,e,f,g,h,i,j){function k(){return"input"===e[0].tagName.toLowerCase()&&f.type&&"file"===f.type.toLowerCase()}function l(b){if(!r){r=!0;try{for(var e=b.__files_||b.target&&b.target.files,j=[],k=[],l=0;l<e.length;l++){var m=e.item(l);c(a,h,f,m,b)?j.push(m):k.push(m)}d(h,i,a,g,f,f.ngfChange||f.ngfSelect,j,k,b),0===j.length&&(b.target.value=j)}finally{r=!1}}}function m(b){f.ngfMultiple&&b.attr("multiple",h(f.ngfMultiple)(a)),f.ngfCapture&&b.attr("capture",h(f.ngfCapture)(a)),f.accept&&b.attr("accept",f.accept);for(var c=0;c<e[0].attributes.length;c++){var d=e[0].attributes[c];(k()&&"type"!==d.name||"type"!==d.name&&"class"!==d.name&&"id"!==d.name&&"style"!==d.name)&&b.attr(d.name,d.value)}}function n(b,c){if(!c&&(b||k()))return e.$$ngfRefElem||e;var d=angular.element('<input type="file">');return m(d),k()?(e.replaceWith(d),e=d,d.attr("__ngf_gen__",!0),j(e)(a)):(d.css("visibility","hidden").css("position","absolute").css("overflow","hidden").css("width","0px").css("height","0px").css("z-index","-100000").css("border","none").css("margin","0px").css("padding","0px").attr("tabindex","-1"),e.$$ngfRefElem&&e.$$ngfRefElem.remove(),e.$$ngfRefElem=d,document.body.appendChild(d[0])),d}function o(b){d(h,i,a,g,f,f.ngfChange||f.ngfSelect,[],[],b,!0)}function p(c){function d(a){a&&i[0].click(),(k()||!a)&&e.bind("click touchend",p)}if(e.attr("disabled")||q)return!1;null!=c&&(c.preventDefault(),c.stopPropagation());var g=h(f.ngfResetOnClick)(a)!==!1,i=n(c,g);return i&&((!c||g)&&i.bind("change",l),c&&g&&h(f.ngfResetModelOnClick)(a)!==!1&&o(c),b(navigator.userAgent)?setTimeout(function(){d(c)},0):d(c)),!1}if(!e.attr("__ngf_gen__")){a.$on("$destroy",function(){e.$$ngfRefElem&&e.$$ngfRefElem.remove()});var q=!1;-1===f.ngfSelect.search(/\W+$files\W+/)&&a.$watch(f.ngfSelect,function(a){q=a===!1});var r=!1;window.FileAPI&&window.FileAPI.ngfFixIE?window.FileAPI.ngfFixIE(e,n,m,l):p()}}function b(a){var b=a.match(/Android[^\d]*(\d+)\.(\d+)/);return b&&b.length>2?parseInt(b[1])<4||4===parseInt(b[1])&&parseInt(b[2])<4:/.*Windows.*Safari.*/.test(a)}ngFileUpload.directive("ngfSelect",["$parse","$timeout","$compile",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.validate=function(a,b,c,d,e){function f(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+="("+f(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}var g=b(c.ngfAccept)(a,{$file:d,$event:e}),h=b(c.ngfMaxSize)(a,{$file:d,$event:e})||9007199254740991,i=b(c.ngfMinSize)(a,{$file:d,$event:e})||-1;if(null!=g&&angular.isString(g)){var j=new RegExp(f(g),"gi");g=null!=d.type&&j.test(d.type.toLowerCase())||null!=d.name&&j.test(d.name.toLowerCase())}return(null==g||g)&&(null==d.size||d.size<h&&d.size>i)},ngFileUpload.updateModel=function(a,b,c,d,e,f,g,h,i,j){function k(){if(a(e.ngfKeep)(c)===!0){var j=(d.$modelValue||[]).slice(0);if(g&&g.length)if(a(e.ngfKeepDistinct)(c)===!0){for(var k=j.length,l=0;l<g.length;l++){for(var m=0;k>m&&g[l].name!==j[m].name;m++);m===k&&j.push(g[l])}g=j}else g=j.concat(g);else g=j}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})}j?k():b(function(){k()})};var c=ngFileUpload.validate,d=ngFileUpload.updateModel}(),function(){function a(a,e,f,g,h,i,j){function k(a,b,d){var e=!0,f=d.dataTransfer.items;if(null!=f)for(var g=0;g<f.length&&e;g++)e=e&&("file"===f[g].kind||""===f[g].kind)&&c(a,h,b,f[g],d);var i=h(b.ngfDragOverClass)(a,{$event:d});return i&&(i.delay&&(r=i.delay),i.accept&&(i=e?i.accept:i.reject)),i||b.ngfDragOverClass||"dragover"}function l(b,d,e,g){function k(d){c(a,h,f,d,b)?m.push(d):n.push(d)}function l(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;k({name:b.name,type:"directory",path:d});var e=b.createReader(),f=[];p++;var g=function(){e.readEntries(function(d){try{if(d.length)f=f.concat(Array.prototype.slice.call(d||[],0)),g();else{for(var e=0;e<f.length;e++)l(a,f[e],(c?c:"")+b.name+"/");p--}}catch(h){p--,console.error(h)}},function(){p--})};g()}else p++,b.file(function(a){try{p--,a.path=(c?c:"")+a.name,k(a)}catch(b){p--,console.error(b)}},function(){p--})}var m=[],n=[],o=b.dataTransfer.items,p=0;if(o&&o.length>0&&"file"!==j.protocol())for(var q=0;q<o.length;q++){if(o[q].webkitGetAsEntry&&o[q].webkitGetAsEntry()&&o[q].webkitGetAsEntry().isDirectory){var r=o[q].webkitGetAsEntry();if(r.isDirectory&&!e)continue;null!=r&&l(m,r)}else{var s=o[q].getAsFile();null!=s&&k(s)}if(!g&&m.length>0)break}else{var t=b.dataTransfer.files;if(null!=t)for(var u=0;u<t.length&&(k(t.item(u)),g||!(m.length>0));u++);}var v=0;!function w(a){i(function(){if(p)10*v++<2e4&&w(10);else{if(!g&&m.length>1){for(q=0;"directory"===m[q].type;)q++;m=[m[q]]}d(m,n)}},a||0)}()}var m=b();if(f.dropAvailable&&i(function(){a[f.dropAvailable]?a[f.dropAvailable].value=m:a[f.dropAvailable]=m}),!m)return void(h(f.ngfHideOnDropNotAvailable)(a)===!0&&e.css("display","none"));var n=!1;-1===f.ngfDrop.search(/\W+$files\W+/)&&a.$watch(f.ngfDrop,function(a){n=a===!1});var o,p=null,q=h(f.ngfStopPropagation),r=1;e[0].addEventListener("dragover",function(b){if(!e.attr("disabled")&&!n){if(b.preventDefault(),q(a)&&b.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var c=b.dataTransfer.effectAllowed;b.dataTransfer.dropEffect="move"===c||"linkMove"===c?"move":"copy"}i.cancel(p),a.actualDragOverClass||(o=k(a,f,b)),e.addClass(o)}},!1),e[0].addEventListener("dragenter",function(b){e.attr("disabled")||n||(b.preventDefault(),q(a)&&b.stopPropagation())},!1),e[0].addEventListener("dragleave",function(){e.attr("disabled")||n||(p=i(function(){e.removeClass(o),o=null},r||1))},!1),e[0].addEventListener("drop",function(b){e.attr("disabled")||n||(b.preventDefault(),q(a)&&b.stopPropagation(),e.removeClass(o),o=null,l(b,function(c,e){d(h,i,a,g,f,f.ngfChange||f.ngfDrop,c,e,b)},h(f.ngfAllowDir)(a)!==!1,f.multiple||h(f.ngfMultiple)(a)))},!1)}function b(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}var c=ngFileUpload.validate,d=ngFileUpload.updateModel;ngFileUpload.directive("ngfDrop",["$parse","$timeout","$location",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.directive("ngfNoFileDrop",function(){return function(a,c){b()&&c.css("display","none")}}),ngFileUpload.directive("ngfDropAvailable",["$parse","$timeout",function(a,c){return function(d,e,f){if(b()){var g=a(f.ngfDropAvailable);c(function(){g(d),g.assign&&g.assign(d,!0)})}}}]),ngFileUpload.directive("ngfSrc",["$parse","$timeout",function(a,b){return{restrict:"AE",link:function(d,e,f){window.FileReader&&d.$watch(f.ngfSrc,function(g){g&&c(d,a,f,g,null)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 8")||g.size<2e4)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 9")||g.size<4e6)?b(function(){var a=window.URL||window.webkitURL;if(a&&a.createObjectURL)e.attr("src",a.createObjectURL(g));else{var c=new FileReader;c.readAsDataURL(g),c.onload=function(a){b(function(){e.attr("src",a.target.result)})}}}):e.attr("src",f.ngfDefaultSrc||"")})}}}])}(); | ||
/*! 5.0.9 */ | ||
!window.XMLHttpRequest||window.FileAPI&&FileAPI.shouldLoad||(window.XMLHttpRequest.prototype.setRequestHeader=function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}}(window.XMLHttpRequest.prototype.setRequestHeader));var ngFileUpload=angular.module("ngFileUpload",[]);ngFileUpload.version="5.0.9",ngFileUpload.defaults={},ngFileUpload.service("Upload",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{};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.progressFunc&&c(function(){f.progressFunc(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(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.progressFunc=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){function b(c,d,e){if(void 0!==d)if(angular.isDate(d)&&(d=d.toISOString()),angular.isString(d))c.append(e,d);else if("form"===a.sendFieldsAs)if(angular.isObject(d))for(var f in d)d.hasOwnProperty(f)&&b(c,d[f],e+"["+f+"]");else c.append(e,d);else d=angular.isString(d)?d:JSON.stringify(d),"json-blob"===a.sendFieldsAs?c.append(e,new Blob([d],{type:"application/json"})):c.append(e,d)}return a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?angular.isArray(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(c){var d,e=new FormData,f={};for(d in a.fields)a.fields.hasOwnProperty(d)&&(f[d]=a.fields[d]);c&&(f.data=c);for(d in f)if(f.hasOwnProperty(d)){var g=f[d];a.formDataAppender?a.formDataAppender(e,d,g):b(e,g,d)}if(null!=a.file){var h=a.fileFormDataName||"file";if(angular.isArray(a.file))for(var i=angular.isString(h),j=0;j<a.file.length;j++)e.append(i?h:h[j],a.file[j],a.fileName&&a.fileName[j]||a.file[j].name);else e.append(h,a.file,a.fileName||a.file.name)}return e}),d(a)},this.http=function(b){return b.transformRequest=b.transformRequest||function(b){return window.ArrayBuffer&&b instanceof window.ArrayBuffer||b instanceof Blob?b:a.defaults.transformRequest[0](arguments)},d(b)},this.dataUrl=function(a,b,d){window.FileReader&&a&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 8")||a.size<2e4)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 9")||a.size<4e6)?c(function(){var e=window.URL||window.webkitURL;if(e&&e.createObjectURL&&!d)b(e.createObjectURL(a));else{var f=new FileReader;f.readAsDataURL(a),f.onload=function(a){c(function(){b(a.target.result)})}}}):b(null)},this.setDefaults=function(a){ngFileUpload.defaults=a||{}}}]),function(){function a(a,f,g,h,i,j,k){function l(){return"input"===f[0].tagName.toLowerCase()&&g.type&&"file"===g.type.toLowerCase()}function m(b){if(!s){s=!0;try{for(var f=b.__files_||b.target&&b.target.files,k=[],l=[],m=0;m<f.length;m++){var n=f.item(m);d(a,i,g,n,b)?k.push(n):l.push(n)}e(i,j,a,h,g,c(g,"ngfChange")||c(g,"ngfSelect"),k,l,b),0===k.length&&(b.target.value=k)}finally{s=!1}}}function n(b){c(g,"ngfMultiple")&&b.attr("multiple",i(c(g,"ngfMultiple"))(a)),c(g,"ngfCapture")&&b.attr("capture",i(c(g,"ngfCapture"))(a)),c(g,"accept")&&b.attr("accept",c(g,"accept"));for(var d=0;d<f[0].attributes.length;d++){var e=f[0].attributes[d];(l()&&"type"!==e.name||"type"!==e.name&&"class"!==e.name&&"id"!==e.name&&"style"!==e.name)&&b.attr(e.name,e.value)}}function o(b,c){if(!c&&(b||l()))return f.$$ngfRefElem||f;var d=angular.element('<input type="file">');return n(d),l()?(f.replaceWith(d),f=d,d.attr("__ngf_gen__",!0),k(f)(a)):(d.css("visibility","hidden").css("position","absolute").css("overflow","hidden").css("width","0px").css("height","0px").css("z-index","-100000").css("border","none").css("margin","0px").css("padding","0px").attr("tabindex","-1"),f.$$ngfRefElem&&f.$$ngfRefElem.remove(),f.$$ngfRefElem=d,document.body.appendChild(d[0])),d}function p(b){e(i,j,a,h,g,c(g,"ngfChange")||c(g,"ngfSelect"),[],[],b,!0)}function q(d){function e(a){a&&a.clientY>0&&k[0].click(),!l()&&a||!j||f.bind("click touchend touchstart",q)}if(f.attr("disabled")||r)return!1;if(null!=d){if("touchstart"===d.type)return t=d.originalEvent.touches[0].clientY,!0;if(d.stopPropagation(),d.preventDefault(),"touchend"===d.type){var h=d.originalEvent.changedTouches[0].clientY;if(Math.abs(h-t)>20)return!1}}var j=i(c(g,"ngfResetOnClick"))(a)!==!1,k=o(d,j);return k&&((!d||j)&&k.bind("change",m),d&&j&&i(c(g,"ngfResetModelOnClick"))(a)!==!1&&p(d),b(navigator.userAgent)?setTimeout(function(){e(d)},0):e(d)),!1}if(!f.attr("__ngf_gen__")){a.$on("$destroy",function(){f.$$ngfRefElem&&f.$$ngfRefElem.remove()});var r=!1;-1===c(g,"ngfSelect").search(/\W+$files\W+/)&&a.$watch(c(g,"ngfSelect"),function(a){r=a===!1});var s=!1,t=0;window.FileAPI&&window.FileAPI.ngfFixIE?window.FileAPI.ngfFixIE(f,o,n,m):q()}}function b(a){var b=a.match(/Android[^\d]*(\d+)\.(\d+)/);if(b&&b.length>2){var c=ngFileUpload.defaults.androidFixMinorVersion||4;return parseInt(b[1])<4||parseInt(b[1])===c&&parseInt(b[2])<c}return console.log(a),-1===a.indexOf("Chrome")&&/.*Windows.*Safari.*/.test(a)}ngFileUpload.getAttrWithDefaults=function(a,b){return null!=a[b]?a[b]:null==ngFileUpload.defaults[b]?ngFileUpload.defaults[b]:ngFileUpload.defaults[b].toString()};var c=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfSelect",["$parse","$timeout","$compile",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.validate=function(a,b,d,e,f){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(var d=0;d<b.length;d++)c+="("+g(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}if(null==e)return!1;var h=b(c(d,"ngfAccept"))(a,{$file:e,$event:f}),i=b(c(d,"ngfMaxSize"))(a,{$file:e,$event:f})||9007199254740991,j=b(c(d,"ngfMinSize"))(a,{$file:e,$event:f})||-1;if(null!=h&&angular.isString(h)){var k=new RegExp(g(h),"gi");if(h=null!=e.type&&k.test(e.type.toLowerCase())||null!=e.name&&k.test(e.name.toLowerCase()),!h)return e.$error="accept",!1}else if(h===!1)return e.$error="accept",!1;return null==e.size?!0:e.size>i?(e.$error="maxSize",!1):e.size<j?(e.$error="minSize",!1):!0},ngFileUpload.updateModel=function(a,b,d,e,f,g,h,i,j,k){function l(){if(a(c(f,"ngfKeep"))(d)===!0){var k=(e.$modelValue||[]).slice(0);if(h&&h.length)if(a(c(f,"ngfKeepDistinct"))(d)===!0){for(var l=k.length,m=0;m<h.length;m++){for(var n=0;l>n&&h[m].name!==k[n].name;n++);n===l&&k.push(h[m])}h=k}else h=k.concat(h);else h=k}e&&(a(c(f,"ngModel")).assign(d,h),b(function(){e&&e.$setViewValue(null!=h&&0===h.length?null:h)})),c(f,"ngModelRejected")&&a(c(f,"ngModelRejected")).assign(d,i),g&&a(g)(d,{$files:h,$rejectedFiles:i,$event:j})}k?l():b(function(){l()})};var d=ngFileUpload.validate,e=ngFileUpload.updateModel}(),function(){function a(a,f,g,h,i,j,k){function l(a,b,d){var f=!0,g=d.dataTransfer.items;if(null!=g)for(var h=0;h<g.length&&f;h++)f=f&&("file"===g[h].kind||""===g[h].kind)&&c(a,i,b,g[h],d);var j=i(e(b,"ngfDragOverClass"))(a,{$event:d});return j&&(j.delay&&(s=j.delay),j.accept&&(j=f?j.accept:j.reject)),j||e(b,"ngfDragOverClass")||"dragover"}function m(b,d,e,f){function h(d){c(a,i,g,d,b)?m.push(d):n.push(d)}function l(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;h({name:b.name,type:"directory",path:d});var e=b.createReader(),f=[];p++;var g=function(){e.readEntries(function(d){try{if(d.length)f=f.concat(Array.prototype.slice.call(d||[],0)),g();else{for(var e=0;e<f.length;e++)l(a,f[e],(c?c:"")+b.name+"/");p--}}catch(h){p--,console.error(h)}},function(){p--})};g()}else p++,b.file(function(a){try{p--,a.path=(c?c:"")+a.name,h(a)}catch(b){p--,console.error(b)}},function(){p--})}var m=[],n=[],o=b.dataTransfer.items,p=0;if(o&&o.length>0&&"file"!==k.protocol())for(var q=0;q<o.length;q++){if(o[q].webkitGetAsEntry&&o[q].webkitGetAsEntry()&&o[q].webkitGetAsEntry().isDirectory){var r=o[q].webkitGetAsEntry();if(r.isDirectory&&!e)continue;null!=r&&l(m,r)}else{var s=o[q].getAsFile();null!=s&&h(s)}if(!f&&m.length>0)break}else{var t=b.dataTransfer.files;if(null!=t)for(var u=0;u<t.length&&(h(t.item(u)),f||!(m.length>0));u++);}var v=0;!function w(a){j(function(){if(p)10*v++<2e4&&w(10);else{if(!f&&m.length>1){for(q=0;"directory"===m[q].type;)q++;m=[m[q]]}d(m,n)}},a||0)}()}var n=b();if(e(g,"dropAvailable")&&j(function(){a[e(g,"dropAvailable")]?a[e(g,"dropAvailable")].value=n:a[e(g,"dropAvailable")]=n}),!n)return void(i(e(g,"ngfHideOnDropNotAvailable"))(a)===!0&&f.css("display","none"));var o=!1;-1===e(g,"ngfDrop").search(/\W+$files\W+/)&&a.$watch(e(g,"ngfDrop"),function(a){o=a===!1});var p,q=null,r=i(e(g,"ngfStopPropagation")),s=1;f[0].addEventListener("dragover",function(b){if(!f.attr("disabled")&&!o){if(b.preventDefault(),r(a)&&b.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var c=b.dataTransfer.effectAllowed;b.dataTransfer.dropEffect="move"===c||"linkMove"===c?"move":"copy"}j.cancel(q),a.actualDragOverClass||(p=l(a,g,b)),f.addClass(p)}},!1),f[0].addEventListener("dragenter",function(b){f.attr("disabled")||o||(b.preventDefault(),r(a)&&b.stopPropagation())},!1),f[0].addEventListener("dragleave",function(){f.attr("disabled")||o||(q=j(function(){f.removeClass(p),p=null},s||1))},!1),f[0].addEventListener("drop",function(b){f.attr("disabled")||o||(b.preventDefault(),r(a)&&b.stopPropagation(),f.removeClass(p),p=null,m(b,function(c,f){d(i,j,a,h,g,e(g,"ngfChange")||e(g,"ngfDrop"),c,f,b)},i(e(g,"ngfAllowDir"))(a)!==!1,e(g,"multiple")||i(e(g,"ngfMultiple"))(a)))},!1)}function b(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}var c=ngFileUpload.validate,d=ngFileUpload.updateModel,e=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfDrop",["$parse","$timeout","$location",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.directive("ngfNoFileDrop",function(){return function(a,c){b()&&c.css("display","none")}}),ngFileUpload.directive("ngfDropAvailable",["$parse","$timeout",function(a,c){return function(d,f,g){if(b()){var h=a(e(g,"ngfDropAvailable"));c(function(){h(d),h.assign&&h.assign(d,!0)})}}}])}(),function(){function a(a,b,c,d,e,f,g){b.$watch(e,function(e){window.FileReader&&ngFileUpload.validate(b,c,d,e,null)&&a.dataUrl(e,function(a){g?g(a):e.dataUrl=a||c(f)(b)},c(d.ngfNoObjectUrl)(b))})}ngFileUpload.directive("ngfSrc",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfSrc,f.ngfDefaultSrc,function(a){e.attr("src",a)})}}}]),ngFileUpload.directive("ngfBackground",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfBackground,f.ngfDefaultBackground,function(a){e.css("background-image","url("+a+")")})}}}]),ngFileUpload.directive("ngfDataUrl",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfDataUrl,f.ngfDefaultDataUrl)}}}])}(); |
@@ -5,7 +5,7 @@ 'use strict'; | ||
var app = angular.module('fileUpload', ['ngFileUpload']); | ||
var version = '5.0.8'; | ||
var version = '5.1.0'; | ||
app.controller('MyCtrl', ['$scope', '$http', '$timeout', '$compile', 'Upload', function ($scope, $http, $timeout, $compile, Upload) { | ||
$scope.usingFlash = FileAPI && FileAPI.upload != null; | ||
//Upload.setDefaults({ngfKeep: true, ngfResetModelOnClick: false, ngfResetOnClick:false}); | ||
$scope.changeAngularVersion = function () { | ||
@@ -12,0 +12,0 @@ window.location.hash = $scope.angularVersion; |
@@ -1,2 +0,2 @@ | ||
/*! 5.0.9 */ | ||
/*! 5.1.0 */ | ||
/*! FileAPI 2.0.7 - BSD | git://github.com/mailru/FileAPI.git | ||
@@ -3,0 +3,0 @@ * FileAPI — a set of javascript tools for working with files. Multiupload, drag'n'drop and chunked file upload. Images: crop, resize and auto orientation by EXIF. |
@@ -5,3 +5,3 @@ /**! | ||
* @author Danial <danial.farid@gmail.com> | ||
* @version 5.0.9 | ||
* @version 5.1.0 | ||
*/ | ||
@@ -434,3 +434,3 @@ | ||
* @author Danial <danial.farid@gmail.com> | ||
* @version 5.0.9 | ||
* @version 5.1.0 | ||
*/ | ||
@@ -456,3 +456,5 @@ | ||
ngFileUpload.version = '5.0.9'; | ||
ngFileUpload.version = '5.1.0'; | ||
ngFileUpload.defaults = {}; | ||
ngFileUpload.service('Upload', ['$http', '$q', '$timeout', function ($http, $q, $timeout) { | ||
@@ -630,2 +632,31 @@ function sendHttp(config) { | ||
}; | ||
this.dataUrl = function (file, callback, disallowObjectUrl) { | ||
if (window.FileReader && file && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) { | ||
$timeout(function () { | ||
//prefer URL.createObjectURL for handling refrences to files of all sizes | ||
//since it doesn´t build a large string in memory | ||
var URL = window.URL || window.webkitURL; | ||
if (URL && URL.createObjectURL && !disallowObjectUrl) { | ||
callback(URL.createObjectURL(file)); | ||
} else { | ||
var fileReader = new FileReader(); | ||
fileReader.readAsDataURL(file); | ||
fileReader.onload = function (e) { | ||
$timeout(function () { | ||
callback(e.target.result); | ||
}); | ||
}; | ||
} | ||
}); | ||
} else { | ||
callback(null); | ||
} | ||
}; | ||
this.setDefaults = function(defaults) { | ||
ngFileUpload.defaults = defaults || {}; | ||
}; | ||
} | ||
@@ -636,260 +667,310 @@ | ||
(function () { | ||
ngFileUpload.directive('ngfSelect', ['$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); | ||
} | ||
}; | ||
}]); | ||
ngFileUpload.getAttrWithDefaults = function(attr, name) { | ||
return attr[name] != null ? attr[name] : | ||
(ngFileUpload.defaults[name] == null ? | ||
ngFileUpload.defaults[name] : ngFileUpload.defaults[name].toString()); | ||
}; | ||
function linkFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile) { | ||
/** @namespace attr.ngfSelect */ | ||
/** @namespace attr.ngfChange */ | ||
/** @namespace attr.ngModel */ | ||
/** @namespace attr.ngModelRejected */ | ||
/** @namespace attr.ngfMultiple */ | ||
/** @namespace attr.ngfCapture */ | ||
/** @namespace attr.ngfAccept */ | ||
/** @namespace attr.ngfMaxSize */ | ||
/** @namespace attr.ngfMinSize */ | ||
/** @namespace attr.ngfResetOnClick */ | ||
/** @namespace attr.ngfResetModelOnClick */ | ||
/** @namespace attr.ngfKeep */ | ||
/** @namespace attr.ngfKeepDistinct */ | ||
var getAttr = ngFileUpload.getAttrWithDefaults; | ||
if (elem.attr('__ngf_gen__')) { | ||
return; | ||
ngFileUpload.directive('ngfSelect', ['$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); | ||
} | ||
}; | ||
}]); | ||
scope.$on('$destroy', function () { | ||
if (elem.$$ngfRefElem) elem.$$ngfRefElem.remove(); | ||
}); | ||
function linkFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile) { | ||
/** @namespace attr.ngfSelect */ | ||
/** @namespace attr.ngfChange */ | ||
/** @namespace attr.ngModel */ | ||
/** @namespace attr.ngModelRejected */ | ||
/** @namespace attr.ngfMultiple */ | ||
/** @namespace attr.ngfCapture */ | ||
/** @namespace attr.ngfAccept */ | ||
/** @namespace attr.ngfMaxSize */ | ||
/** @namespace attr.ngfMinSize */ | ||
/** @namespace attr.ngfResetOnClick */ | ||
/** @namespace attr.ngfResetModelOnClick */ | ||
/** @namespace attr.ngfKeep */ | ||
/** @namespace attr.ngfKeepDistinct */ | ||
var disabled = false; | ||
if (attr.ngfSelect.search(/\W+$files\W+/) === -1) { | ||
scope.$watch(attr.ngfSelect, function (val) { | ||
disabled = val === false; | ||
}); | ||
} | ||
function isInputTypeFile() { | ||
return elem[0].tagName.toLowerCase() === 'input' && attr.type && attr.type.toLowerCase() === 'file'; | ||
} | ||
if (elem.attr('__ngf_gen__')) { | ||
return; | ||
} | ||
var isUpdating = false; | ||
scope.$on('$destroy', function () { | ||
if (elem.$$ngfRefElem) elem.$$ngfRefElem.remove(); | ||
}); | ||
function changeFn(evt) { | ||
if (!isUpdating) { | ||
isUpdating = true; | ||
try { | ||
var fileList = evt.__files_ || (evt.target && evt.target.files); | ||
var files = [], rejFiles = []; | ||
var disabled = false; | ||
if (getAttr(attr, 'ngfSelect').search(/\W+$files\W+/) === -1) { | ||
scope.$watch(getAttr(attr, 'ngfSelect'), function (val) { | ||
disabled = val === false; | ||
}); | ||
} | ||
function isInputTypeFile() { | ||
return elem[0].tagName.toLowerCase() === 'input' && attr.type && attr.type.toLowerCase() === 'file'; | ||
} | ||
for (var i = 0; i < fileList.length; i++) { | ||
var file = fileList.item(i); | ||
if (validate(scope, $parse, attr, file, evt)) { | ||
files.push(file); | ||
} else { | ||
rejFiles.push(file); | ||
} | ||
} | ||
updateModel($parse, $timeout, scope, ngModel, attr, attr.ngfChange || attr.ngfSelect, files, rejFiles, evt); | ||
if (files.length === 0) evt.target.value = files; | ||
var isUpdating = false; | ||
function changeFn(evt) { | ||
if (!isUpdating) { | ||
isUpdating = true; | ||
try { | ||
var fileList = evt.__files_ || (evt.target && evt.target.files); | ||
var files = [], rejFiles = []; | ||
for (var i = 0; i < fileList.length; i++) { | ||
var file = fileList.item(i); | ||
if (validate(scope, $parse, attr, file, evt)) { | ||
files.push(file); | ||
} else { | ||
rejFiles.push(file); | ||
} | ||
} | ||
updateModel($parse, $timeout, scope, ngModel, attr, | ||
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), files, rejFiles, evt); | ||
if (files.length === 0) evt.target.value = files; | ||
// if (evt.target && evt.target.getAttribute('__ngf_gen__')) { | ||
// angular.element(evt.target).remove(); | ||
// } | ||
} finally { | ||
isUpdating = false; | ||
} | ||
} | ||
} finally { | ||
isUpdating = false; | ||
} | ||
} | ||
} | ||
function bindAttrToFileInput(fileElem) { | ||
if (attr.ngfMultiple) fileElem.attr('multiple', $parse(attr.ngfMultiple)(scope)); | ||
if (attr.ngfCapture) fileElem.attr('capture', $parse(attr.ngfCapture)(scope)); | ||
if (attr.accept) fileElem.attr('accept', attr.accept); | ||
for (var i = 0; i < elem[0].attributes.length; i++) { | ||
var attribute = elem[0].attributes[i]; | ||
if ((isInputTypeFile() && attribute.name !== 'type') || | ||
(attribute.name !== 'type' && attribute.name !== 'class' && | ||
attribute.name !== 'id' && attribute.name !== 'style')) { | ||
fileElem.attr(attribute.name, attribute.value); | ||
} | ||
} | ||
function bindAttrToFileInput(fileElem) { | ||
if (getAttr(attr, 'ngfMultiple')) fileElem.attr('multiple', $parse(getAttr(attr, 'ngfMultiple'))(scope)); | ||
if (getAttr(attr, 'ngfCapture')) fileElem.attr('capture', $parse(getAttr(attr, 'ngfCapture'))(scope)); | ||
if (getAttr(attr, 'accept')) fileElem.attr('accept', getAttr(attr, 'accept')); | ||
for (var i = 0; i < elem[0].attributes.length; i++) { | ||
var attribute = elem[0].attributes[i]; | ||
if ((isInputTypeFile() && attribute.name !== 'type') || | ||
(attribute.name !== 'type' && attribute.name !== 'class' && | ||
attribute.name !== 'id' && attribute.name !== 'style')) { | ||
fileElem.attr(attribute.name, attribute.value); | ||
} | ||
} | ||
} | ||
function createFileInput(evt, resetOnClick) { | ||
if (!resetOnClick && (evt || isInputTypeFile())) return elem.$$ngfRefElem || elem; | ||
function createFileInput(evt, resetOnClick) { | ||
if (!resetOnClick && (evt || isInputTypeFile())) return elem.$$ngfRefElem || elem; | ||
var fileElem = angular.element('<input type="file">'); | ||
bindAttrToFileInput(fileElem); | ||
var fileElem = angular.element('<input type="file">'); | ||
bindAttrToFileInput(fileElem); | ||
if (isInputTypeFile()) { | ||
elem.replaceWith(fileElem); | ||
elem = fileElem; | ||
fileElem.attr('__ngf_gen__', true); | ||
$compile(elem)(scope); | ||
} else { | ||
fileElem.css('visibility', 'hidden').css('position', 'absolute').css('overflow', 'hidden') | ||
.css('width', '0px').css('height', '0px').css('z-index', '-100000').css('border', 'none') | ||
.css('margin', '0px').css('padding', '0px').attr('tabindex', '-1'); | ||
if (elem.$$ngfRefElem) { | ||
elem.$$ngfRefElem.remove(); | ||
} | ||
elem.$$ngfRefElem = fileElem; | ||
document.body.appendChild(fileElem[0]); | ||
} | ||
return fileElem; | ||
if (isInputTypeFile()) { | ||
elem.replaceWith(fileElem); | ||
elem = fileElem; | ||
fileElem.attr('__ngf_gen__', true); | ||
$compile(elem)(scope); | ||
} else { | ||
fileElem.css('visibility', 'hidden').css('position', 'absolute').css('overflow', 'hidden') | ||
.css('width', '0px').css('height', '0px').css('z-index', '-100000').css('border', 'none') | ||
.css('margin', '0px').css('padding', '0px').attr('tabindex', '-1'); | ||
if (elem.$$ngfRefElem) { | ||
elem.$$ngfRefElem.remove(); | ||
} | ||
elem.$$ngfRefElem = fileElem; | ||
document.body.appendChild(fileElem[0]); | ||
} | ||
function resetModel(evt) { | ||
updateModel($parse, $timeout, scope, ngModel, attr, attr.ngfChange || attr.ngfSelect, [], [], evt, true); | ||
} | ||
return fileElem; | ||
} | ||
function clickHandler(evt) { | ||
if (elem.attr('disabled') || disabled) return false; | ||
if (evt != null) { | ||
evt.preventDefault(); | ||
evt.stopPropagation(); | ||
} | ||
var resetOnClick = $parse(attr.ngfResetOnClick)(scope) !== false; | ||
var fileElem = createFileInput(evt, resetOnClick); | ||
function resetModel(evt) { | ||
updateModel($parse, $timeout, scope, ngModel, attr, | ||
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), [], [], evt, true); | ||
} | ||
function clickAndAssign(evt) { | ||
if (evt) { | ||
fileElem[0].click(); | ||
} | ||
if (isInputTypeFile() || !evt) { | ||
elem.bind('click touchend', clickHandler); | ||
} | ||
} | ||
var initialTouchStartY = 0; | ||
if (fileElem) { | ||
if (!evt || resetOnClick) fileElem.bind('change', changeFn); | ||
if (evt && resetOnClick && $parse(attr.ngfResetModelOnClick)(scope) !== false) resetModel(evt); | ||
function clickHandler(evt) { | ||
if (elem.attr('disabled') || disabled) return false; | ||
// fix for android native browser < 4.4 | ||
if (shouldClickLater(navigator.userAgent)) { | ||
setTimeout(function () { | ||
clickAndAssign(evt); | ||
}, 0); | ||
} else { | ||
clickAndAssign(evt); | ||
} | ||
} | ||
return false; | ||
if (evt != null) { | ||
if (evt.type === 'touchstart') { | ||
initialTouchStartY = evt.originalEvent.touches[0].clientY; | ||
return true; // don't block event default | ||
} else { | ||
evt.stopPropagation(); | ||
evt.preventDefault(); | ||
// prevent scroll from triggering event | ||
if (evt.type === 'touchend') { | ||
var currentLocation = evt.originalEvent.changedTouches[0].clientY; | ||
if (Math.abs(currentLocation - initialTouchStartY) > 20) return false; | ||
} | ||
} | ||
} | ||
if (window.FileAPI && window.FileAPI.ngfFixIE) { | ||
window.FileAPI.ngfFixIE(elem, createFileInput, bindAttrToFileInput, changeFn); | ||
var resetOnClick = $parse(getAttr(attr, 'ngfResetOnClick'))(scope) !== false; | ||
var fileElem = createFileInput(evt, resetOnClick); | ||
function clickAndAssign(evt) { | ||
if (evt && evt.clientY > 0) { | ||
fileElem[0].click(); | ||
} | ||
if ((isInputTypeFile() || !evt) && resetOnClick) { | ||
elem.bind('click touchend touchstart', clickHandler); | ||
} | ||
} | ||
if (fileElem) { | ||
if (!evt || resetOnClick) fileElem.bind('change', changeFn); | ||
if (evt && resetOnClick && $parse(getAttr(attr, 'ngfResetModelOnClick'))(scope) !== false) { | ||
resetModel(evt); | ||
} | ||
// fix for android native browser < 4.4 | ||
if (shouldClickLater(navigator.userAgent)) { | ||
setTimeout(function () { | ||
clickAndAssign(evt); | ||
}, 0); | ||
} else { | ||
clickHandler(); | ||
//if (!isInputTypeFile()) { | ||
// elem.bind('click touchend', clickHandler); | ||
//} | ||
clickAndAssign(evt); | ||
} | ||
} | ||
return false; | ||
} | ||
function shouldClickLater(ua) { | ||
// android below 4.4 | ||
var m = ua.match(/Android[^\d]*(\d+)\.(\d+)/); | ||
if (m && m.length > 2) { | ||
return parseInt(m[1]) < 4 || (parseInt(m[1]) === 4 && parseInt(m[2]) < 4); | ||
} | ||
if (window.FileAPI && window.FileAPI.ngfFixIE) { | ||
window.FileAPI.ngfFixIE(elem, createFileInput, bindAttrToFileInput, changeFn); | ||
} else { | ||
clickHandler(); | ||
//if (!isInputTypeFile()) { | ||
// elem.bind('click touchend', clickHandler); | ||
//} | ||
} | ||
} | ||
// safari on windows | ||
return /.*Windows.*Safari.*/.test(ua); | ||
function shouldClickLater(ua) { | ||
// android below 4.4 | ||
var m = ua.match(/Android[^\d]*(\d+)\.(\d+)/); | ||
if (m && m.length > 2) { | ||
var v = ngFileUpload.defaults.androidFixMinorVersion || 4; | ||
return parseInt(m[1]) < 4 || (parseInt(m[1]) === v && parseInt(m[2]) < v); | ||
} | ||
ngFileUpload.validate = function (scope, $parse, attr, file, evt) { | ||
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; | ||
} | ||
// safari on windows | ||
return ua.indexOf('Chrome') === -1 && /.*Windows.*Safari.*/.test(ua); | ||
} | ||
var accept = $parse(attr.ngfAccept)(scope, {$file: file, $event: evt}); | ||
var fileSizeMax = $parse(attr.ngfMaxSize)(scope, {$file: file, $event: evt}) || 9007199254740991; | ||
var fileSizeMin = $parse(attr.ngfMinSize)(scope, {$file: file, $event: evt}) || -1; | ||
if (accept != null && angular.isString(accept)) { | ||
var regexp = new RegExp(globStringToRegex(accept), 'gi'); | ||
accept = (file.type != null && regexp.test(file.type.toLowerCase())) || | ||
(file.name != null && regexp.test(file.name.toLowerCase())); | ||
ngFileUpload.validate = function (scope, $parse, attr, file, evt) { | ||
if (file == null) { | ||
return false; | ||
} | ||
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 += '|'; | ||
} | ||
} | ||
return (accept == null || accept) && (file.size == null || (file.size < fileSizeMax && file.size > fileSizeMin)); | ||
}; | ||
} else { | ||
if (str.indexOf('.') === 0) { | ||
str = '*' + str; | ||
} | ||
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$'; | ||
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.'); | ||
} | ||
return result; | ||
} | ||
ngFileUpload.updateModel = function ($parse, $timeout, scope, ngModel, attr, fileChange, | ||
files, rejFiles, evt, noDelay) { | ||
function update() { | ||
if ($parse(attr.ngfKeep)(scope) === true) { | ||
var prevFiles = (ngModel.$modelValue || []).slice(0); | ||
if (!files || !files.length) { | ||
files = prevFiles; | ||
} else if ($parse(attr.ngfKeepDistinct)(scope) === true) { | ||
var len = prevFiles.length; | ||
for (var i = 0; i < files.length; i++) { | ||
for (var j = 0; j < len; j++) { | ||
if (files[i].name === prevFiles[j].name) break; | ||
} | ||
if (j === len) { | ||
prevFiles.push(files[i]); | ||
} | ||
} | ||
files = prevFiles; | ||
} else { | ||
files = prevFiles.concat(files); | ||
} | ||
var accept = $parse(getAttr(attr, 'ngfAccept'))(scope, {$file: file, $event: evt}); | ||
var fileSizeMax = $parse(getAttr(attr, 'ngfMaxSize'))(scope, {$file: file, $event: evt}) || 9007199254740991; | ||
var fileSizeMin = $parse(getAttr(attr, 'ngfMinSize'))(scope, {$file: file, $event: evt}) || -1; | ||
if (accept != null && angular.isString(accept)) { | ||
var regexp = new RegExp(globStringToRegex(accept), 'gi'); | ||
accept = (file.type != null && regexp.test(file.type.toLowerCase())) || | ||
(file.name != null && regexp.test(file.name.toLowerCase())); | ||
if (!accept) { | ||
file.$error = 'accept'; | ||
return false; | ||
} | ||
} else { | ||
if (accept === false) { | ||
file.$error = 'accept'; | ||
return false; | ||
} | ||
} | ||
if (file.size == null) return true; | ||
if (file.size > fileSizeMax) { | ||
file.$error = 'maxSize'; | ||
return false; | ||
} | ||
if (file.size < fileSizeMin) { | ||
file.$error = 'minSize'; | ||
return false; | ||
} | ||
return true; | ||
}; | ||
ngFileUpload.updateModel = function ($parse, $timeout, scope, ngModel, attr, fileChange, | ||
files, rejFiles, evt, noDelay) { | ||
function update() { | ||
if ($parse(getAttr(attr, 'ngfKeep'))(scope) === true) { | ||
var prevFiles = (ngModel.$modelValue || []).slice(0); | ||
if (!files || !files.length) { | ||
files = prevFiles; | ||
} else if ($parse(getAttr(attr, 'ngfKeepDistinct'))(scope) === true) { | ||
var len = prevFiles.length; | ||
for (var i = 0; i < files.length; i++) { | ||
for (var j = 0; j < len; j++) { | ||
if (files[i].name === prevFiles[j].name) break; | ||
} | ||
if (ngModel) { | ||
$parse(attr.ngModel).assign(scope, files); | ||
$timeout(function () { | ||
if (ngModel) { | ||
ngModel.$setViewValue(files != null && files.length === 0 ? null : files); | ||
} | ||
}); | ||
if (j === len) { | ||
prevFiles.push(files[i]); | ||
} | ||
if (attr.ngModelRejected) { | ||
$parse(attr.ngModelRejected).assign(scope, rejFiles); | ||
} | ||
if (fileChange) { | ||
$parse(fileChange)(scope, { | ||
$files: files, | ||
$rejectedFiles: rejFiles, | ||
$event: evt | ||
}); | ||
} | ||
} | ||
if (noDelay) { | ||
update(); | ||
} | ||
files = prevFiles; | ||
} else { | ||
$timeout(function () { | ||
update(); | ||
}); | ||
files = prevFiles.concat(files); | ||
} | ||
}; | ||
} | ||
if (ngModel) { | ||
$parse(getAttr(attr, 'ngModel')).assign(scope, files); | ||
$timeout(function () { | ||
if (ngModel) { | ||
ngModel.$setViewValue(files != null && files.length === 0 ? null : files); | ||
} | ||
}); | ||
} | ||
if (getAttr(attr, 'ngModelRejected')) { | ||
$parse(getAttr(attr, 'ngModelRejected')).assign(scope, rejFiles); | ||
} | ||
if (fileChange) { | ||
$parse(fileChange)(scope, { | ||
$files: files, | ||
$rejectedFiles: rejFiles, | ||
$event: evt | ||
}); | ||
} | ||
} | ||
var validate = ngFileUpload.validate; | ||
var updateModel = ngFileUpload.updateModel; | ||
if (noDelay) { | ||
update(); | ||
} else { | ||
$timeout(function () { | ||
update(); | ||
}); | ||
} | ||
}; | ||
var validate = ngFileUpload.validate; | ||
var updateModel = ngFileUpload.updateModel; | ||
})(); | ||
@@ -900,2 +981,3 @@ | ||
var updateModel = ngFileUpload.updateModel; | ||
var getAttr = ngFileUpload.getAttrWithDefaults; | ||
@@ -921,3 +1003,3 @@ ngFileUpload.directive('ngfDrop', ['$parse', '$timeout', '$location', function ($parse, $timeout, $location) { | ||
if (dropAvailable()) { | ||
var fn = $parse(attr.ngfDropAvailable); | ||
var fn = $parse(getAttr(attr, 'ngfDropAvailable')); | ||
$timeout(function () { | ||
@@ -935,8 +1017,8 @@ fn(scope); | ||
var available = dropAvailable(); | ||
if (attr.dropAvailable) { | ||
if (getAttr(attr, 'dropAvailable')) { | ||
$timeout(function () { | ||
if (scope[attr.dropAvailable]) { | ||
scope[attr.dropAvailable].value = available; | ||
if (scope[getAttr(attr, 'dropAvailable')]) { | ||
scope[getAttr(attr, 'dropAvailable')].value = available; | ||
} else { | ||
scope[attr.dropAvailable] = available; | ||
scope[getAttr(attr, 'dropAvailable')] = available; | ||
} | ||
@@ -946,3 +1028,3 @@ }); | ||
if (!available) { | ||
if ($parse(attr.ngfHideOnDropNotAvailable)(scope) === true) { | ||
if ($parse(getAttr(attr, 'ngfHideOnDropNotAvailable'))(scope) === true) { | ||
elem.css('display', 'none'); | ||
@@ -954,4 +1036,4 @@ } | ||
var disabled = false; | ||
if (attr.ngfDrop.search(/\W+$files\W+/) === -1) { | ||
scope.$watch(attr.ngfDrop, function(val) { | ||
if (getAttr(attr, 'ngfDrop').search(/\W+$files\W+/) === -1) { | ||
scope.$watch(getAttr(attr, 'ngfDrop'), function(val) { | ||
disabled = val === false; | ||
@@ -962,3 +1044,3 @@ }); | ||
var leaveTimeout = null; | ||
var stopPropagation = $parse(attr.ngfStopPropagation); | ||
var stopPropagation = $parse(getAttr(attr, 'ngfStopPropagation')); | ||
var dragOverDelay = 1; | ||
@@ -1002,4 +1084,5 @@ var actualDragOverClass; | ||
updateModel($parse, $timeout, scope, ngModel, attr, | ||
attr.ngfChange || attr.ngfDrop, files, rejFiles, evt); | ||
}, $parse(attr.ngfAllowDir)(scope) !== false, attr.multiple || $parse(attr.ngfMultiple)(scope)); | ||
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt); | ||
}, $parse(getAttr(attr, 'ngfAllowDir'))(scope) !== false, | ||
getAttr(attr, 'multiple') || $parse(getAttr(attr, 'ngfMultiple'))(scope)); | ||
}, false); | ||
@@ -1017,3 +1100,3 @@ | ||
} | ||
var clazz = $parse(attr.ngfDragOverClass)(scope, {$event: evt}); | ||
var clazz = $parse(getAttr(attr, 'ngfDragOverClass'))(scope, {$event: evt}); | ||
if (clazz) { | ||
@@ -1023,3 +1106,3 @@ if (clazz.delay) dragOverDelay = clazz.delay; | ||
} | ||
return clazz || attr.ngfDragOverClass || 'dragover'; | ||
return clazz || getAttr(attr, 'ngfDragOverClass') || 'dragover'; | ||
} | ||
@@ -1132,33 +1215,35 @@ | ||
ngFileUpload.directive('ngfSrc', ['$parse', '$timeout', function ($parse, $timeout) { | ||
function dropAvailable() { | ||
var div = document.createElement('div'); | ||
return ('draggable' in div) && ('ondrop' in div); | ||
} | ||
})(); | ||
(function () { | ||
function fileToSrc(Upload, scope, $parse, attr, name, defaultName, callback) { | ||
scope.$watch(name, function (file) { | ||
if (window.FileReader && ngFileUpload.validate(scope, $parse, attr, file, null)) { | ||
Upload.dataUrl(file, function(url) { | ||
if (callback) { | ||
callback(url); | ||
} else { | ||
file.dataUrl = url || $parse(defaultName)(scope); | ||
} | ||
}, $parse(attr.ngfNoObjectUrl)(scope)); | ||
} | ||
}); | ||
} | ||
/** @namespace attr.ngfSrc */ | ||
/** @namespace attr.ngfDefaultSrc */ | ||
/** @namespace attr.ngfNoObjectUrl */ | ||
ngFileUpload.directive('ngfSrc', ['$parse', 'Upload', function ($parse, Upload) { | ||
return { | ||
restrict: 'AE', | ||
link: function (scope, elem, attr) { | ||
if (window.FileReader) { | ||
scope.$watch(attr.ngfSrc, function (file) { | ||
if (file && | ||
validate(scope, $parse, attr, file, null) && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) { | ||
$timeout(function () { | ||
//prefer URL.createObjectURL for handling refrences to files of all sizes | ||
//since it doesn´t build a large string in memory | ||
var URL = window.URL || window.webkitURL; | ||
if (URL && URL.createObjectURL) { | ||
elem.attr('src', URL.createObjectURL(file)); | ||
} else { | ||
var fileReader = new FileReader(); | ||
fileReader.readAsDataURL(file); | ||
fileReader.onload = function (e) { | ||
$timeout(function () { | ||
elem.attr('src', e.target.result); | ||
}); | ||
}; | ||
} | ||
}); | ||
} else { | ||
elem.attr('src', attr.ngfDefaultSrc || ''); | ||
} | ||
}); | ||
} | ||
fileToSrc(Upload, scope, $parse, attr, attr.ngfSrc, attr.ngfDefaultSrc, function (url) { | ||
elem.attr('src', url); | ||
}); | ||
} | ||
@@ -1168,7 +1253,28 @@ }; | ||
function dropAvailable() { | ||
var div = document.createElement('div'); | ||
return ('draggable' in div) && ('ondrop' in div); | ||
} | ||
/** @namespace attr.ngfBackground */ | ||
/** @namespace attr.ngfDefaultBackground */ | ||
/** @namespace attr.ngfNoObjectUrl */ | ||
ngFileUpload.directive('ngfBackground', ['$parse', 'Upload', function ($parse, Upload) { | ||
return { | ||
restrict: 'AE', | ||
link: function (scope, elem, attr) { | ||
fileToSrc(Upload, scope, $parse, attr, attr.ngfBackground, attr.ngfDefaultBackground, function (url) { | ||
elem.css('background-image', 'url(' + url + ')'); | ||
}); | ||
} | ||
}; | ||
}]); | ||
/** @namespace attr.ngfDataUrl */ | ||
/** @namespace attr.ngfDefaultDataUrl */ | ||
/** @namespace attr.ngfNoObjectUrl */ | ||
ngFileUpload.directive('ngfDataUrl', ['$parse', 'Upload', function ($parse, Upload) { | ||
return { | ||
restrict: 'AE', | ||
link: function (scope, elem, attr) { | ||
fileToSrc(Upload, scope, $parse, attr, attr.ngfDataUrl, attr.ngfDefaultDataUrl); | ||
} | ||
}; | ||
}]); | ||
})(); |
@@ -1,2 +0,2 @@ | ||
/*! 5.0.9 */ | ||
!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){}}if(window.FileAPI||(window.FileAPI={}),FileAPI.shouldLoad=window.XMLHttpRequest&&!window.FormData||FileAPI.forceLoad,FileAPI.shouldLoad){var c=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,d,e){c(this),this.__url=d;try{a.apply(this,[b,d,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,d){if("__setXHR_"===b){c(this);var e=d(this);e instanceof Function&&e(this)}else this.__requestHeaders=this.__requestHeaders||{},this.__requestHeaders[b]=d,a.apply(this,arguments)}}),a("send",function(a){return function(){var c=this;if(arguments[0]&&arguments[0].__isFileAPIShim){var d=arguments[0],e={url:c.__url,jsonp:!1,cache:!0,complete:function(a,d){c.__completed=!0,!a&&c.__listeners.load&&c.__listeners.load({type:"load",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),!a&&c.__listeners.loadend&&c.__listeners.loadend({type:"loadend",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),"abort"===a&&c.__listeners.abort&&c.__listeners.abort({type:"abort",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),void 0!==d.status&&b(c,"status",function(){return 0===d.status&&a&&"abort"!==a?500:d.status}),void 0!==d.statusText&&b(c,"statusText",function(){return d.statusText}),b(c,"readyState",function(){return 4}),void 0!==d.response&&b(c,"response",function(){return d.response});var e=d.responseText||(a&&0===d.status&&"abort"!==a?a:void 0);b(c,"responseText",function(){return e}),b(c,"response",function(){return e}),a&&b(c,"err",function(){return a}),c.__fileApiXHR=d,c.onreadystatechange&&c.onreadystatechange(),c.onload&&c.onload()},progress:function(a){if(a.target=c,c.__listeners.progress&&c.__listeners.progress(a),c.__total=a.total,c.__loaded=a.loaded,a.total===a.loaded){var b=this;setTimeout(function(){c.__completed||(c.getAllResponseHeaders=function(){},b.complete(null,{status:204,statusText:"No Content"}))},FileAPI.noContentTimeout||1e4)}},headers:c.__requestHeaders};e.data={},e.files={};for(var f=0;f<d.data.length;f++){var g=d.data[f];null!=g.val&&null!=g.val.name&&null!=g.val.size&&null!=g.val.type?e.files[g.key]=g.val:e.data[g.key]=g.val}setTimeout(function(){if(!FileAPI.hasFlash)throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';c.__fileApiXHR=FileAPI.upload(e)},1)}else{if(this.__origError)throw this.__origError;a.apply(c,arguments)}}}),window.XMLHttpRequest.__isFileAPIShim=!0,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(){function a(a){return"input"===a[0].tagName.toLowerCase()&&a.attr("type")&&"file"===a.attr("type").toLowerCase()}function b(){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}function c(a){var b=0,c=0;if(window.jQuery)return jQuery(a).offset();if(a.offsetParent)do b+=a.offsetLeft-a.scrollLeft,c+=a.offsetTop-a.scrollTop,a=a.offsetParent;while(a);return{left:b,top:c}}if(FileAPI.shouldLoad){if(FileAPI.forceLoad&&(FileAPI.html5=!1),!FileAPI.upload){var d,e,f,g,h,i=document.createElement("script"),j=document.getElementsByTagName("script");if(window.FileAPI.jsUrl)d=window.FileAPI.jsUrl;else if(window.FileAPI.jsPath)e=window.FileAPI.jsPath;else for(f=0;f<j.length;f++)if(h=j[f].src,g=h.search(/\/ng\-file\-upload[\-a-zA-z0-9\.]*\.js/),g>-1){e=h.substring(0,g+1);break}null==FileAPI.staticPath&&(FileAPI.staticPath=e),i.setAttribute("src",d||e+"FileAPI.min.js"),document.getElementsByTagName("head")[0].appendChild(i),FileAPI.hasFlash=b()}FileAPI.ngfFixIE=function(d,e,f,g){if(!b())throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';var h=function(){if(d.attr("disabled"))d.$$ngfRefElem.removeClass("js-fileapi-wrapper");else{var b=d.$$ngfRefElem;b?f(d.$$ngfRefElem):(b=d.$$ngfRefElem=e(),b.addClass("js-fileapi-wrapper"),!a(d),setTimeout(function(){b.bind("mouseenter",h)},10),b.bind("change",function(a){i.apply(this,[a]),g.apply(this,[a])})),a(d)||b.css("position","absolute").css("top",c(d[0]).top+"px").css("left",c(d[0]).left+"px").css("width",d[0].offsetWidth+"px").css("height",d[0].offsetHeight+"px").css("filter","alpha(opacity=0)").css("display",d.css("display")).css("overflow","hidden").css("z-index","900000").css("visibility","visible")}};d.bind("mouseenter",h);var i=function(a){for(var b=FileAPI.getFiles(a),c=0;c<b.length;c++)void 0===b[c].size&&(b[c].size=0),void 0===b[c].name&&(b[c].name="file"),void 0===b[c].type&&(b[c].type="undefined");a.target||(a.target={}),a.target.files=b,a.target.files!==b&&(a.__files_=b),(a.__files_||a.target.files).item=function(b){return(a.__files_||a.target.files)[b]||null}}},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){b||(b=!0,a.onloadstart&&a.onloadstart(c("loadstart",d)));var e;"load"===d.type?(a.onloadend&&a.onloadend(c("loadend",d)),e=c("load",d),a.onload&&a.onload(e),a.dispatchEvent(e)):"progress"===d.type?(e=c("progress",d),a.onprogress&&a.onprogress(e),a.dispatchEvent(e)):(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)}}),!window.XMLHttpRequest||window.FileAPI&&FileAPI.shouldLoad||(window.XMLHttpRequest.prototype.setRequestHeader=function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}}(window.XMLHttpRequest.prototype.setRequestHeader));var ngFileUpload=angular.module("ngFileUpload",[]);ngFileUpload.version="5.0.9",ngFileUpload.service("Upload",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{};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.progressFunc&&c(function(){f.progressFunc(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(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.progressFunc=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){function b(c,d,e){if(void 0!==d)if(angular.isDate(d)&&(d=d.toISOString()),angular.isString(d))c.append(e,d);else if("form"===a.sendFieldsAs)if(angular.isObject(d))for(var f in d)d.hasOwnProperty(f)&&b(c,d[f],e+"["+f+"]");else c.append(e,d);else d=angular.isString(d)?d:JSON.stringify(d),"json-blob"===a.sendFieldsAs?c.append(e,new Blob([d],{type:"application/json"})):c.append(e,d)}return a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?angular.isArray(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(c){var d,e=new FormData,f={};for(d in a.fields)a.fields.hasOwnProperty(d)&&(f[d]=a.fields[d]);c&&(f.data=c);for(d in f)if(f.hasOwnProperty(d)){var g=f[d];a.formDataAppender?a.formDataAppender(e,d,g):b(e,g,d)}if(null!=a.file){var h=a.fileFormDataName||"file";if(angular.isArray(a.file))for(var i=angular.isString(h),j=0;j<a.file.length;j++)e.append(i?h:h[j],a.file[j],a.fileName&&a.fileName[j]||a.file[j].name);else e.append(h,a.file,a.fileName||a.file.name)}return e}),d(a)},this.http=function(b){return b.transformRequest=b.transformRequest||function(b){return window.ArrayBuffer&&b instanceof window.ArrayBuffer||b instanceof Blob?b:a.defaults.transformRequest[0](arguments)},d(b)}}]),function(){function a(a,e,f,g,h,i,j){function k(){return"input"===e[0].tagName.toLowerCase()&&f.type&&"file"===f.type.toLowerCase()}function l(b){if(!r){r=!0;try{for(var e=b.__files_||b.target&&b.target.files,j=[],k=[],l=0;l<e.length;l++){var m=e.item(l);c(a,h,f,m,b)?j.push(m):k.push(m)}d(h,i,a,g,f,f.ngfChange||f.ngfSelect,j,k,b),0===j.length&&(b.target.value=j)}finally{r=!1}}}function m(b){f.ngfMultiple&&b.attr("multiple",h(f.ngfMultiple)(a)),f.ngfCapture&&b.attr("capture",h(f.ngfCapture)(a)),f.accept&&b.attr("accept",f.accept);for(var c=0;c<e[0].attributes.length;c++){var d=e[0].attributes[c];(k()&&"type"!==d.name||"type"!==d.name&&"class"!==d.name&&"id"!==d.name&&"style"!==d.name)&&b.attr(d.name,d.value)}}function n(b,c){if(!c&&(b||k()))return e.$$ngfRefElem||e;var d=angular.element('<input type="file">');return m(d),k()?(e.replaceWith(d),e=d,d.attr("__ngf_gen__",!0),j(e)(a)):(d.css("visibility","hidden").css("position","absolute").css("overflow","hidden").css("width","0px").css("height","0px").css("z-index","-100000").css("border","none").css("margin","0px").css("padding","0px").attr("tabindex","-1"),e.$$ngfRefElem&&e.$$ngfRefElem.remove(),e.$$ngfRefElem=d,document.body.appendChild(d[0])),d}function o(b){d(h,i,a,g,f,f.ngfChange||f.ngfSelect,[],[],b,!0)}function p(c){function d(a){a&&i[0].click(),(k()||!a)&&e.bind("click touchend",p)}if(e.attr("disabled")||q)return!1;null!=c&&(c.preventDefault(),c.stopPropagation());var g=h(f.ngfResetOnClick)(a)!==!1,i=n(c,g);return i&&((!c||g)&&i.bind("change",l),c&&g&&h(f.ngfResetModelOnClick)(a)!==!1&&o(c),b(navigator.userAgent)?setTimeout(function(){d(c)},0):d(c)),!1}if(!e.attr("__ngf_gen__")){a.$on("$destroy",function(){e.$$ngfRefElem&&e.$$ngfRefElem.remove()});var q=!1;-1===f.ngfSelect.search(/\W+$files\W+/)&&a.$watch(f.ngfSelect,function(a){q=a===!1});var r=!1;window.FileAPI&&window.FileAPI.ngfFixIE?window.FileAPI.ngfFixIE(e,n,m,l):p()}}function b(a){var b=a.match(/Android[^\d]*(\d+)\.(\d+)/);return b&&b.length>2?parseInt(b[1])<4||4===parseInt(b[1])&&parseInt(b[2])<4:/.*Windows.*Safari.*/.test(a)}ngFileUpload.directive("ngfSelect",["$parse","$timeout","$compile",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.validate=function(a,b,c,d,e){function f(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+="("+f(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}var g=b(c.ngfAccept)(a,{$file:d,$event:e}),h=b(c.ngfMaxSize)(a,{$file:d,$event:e})||9007199254740991,i=b(c.ngfMinSize)(a,{$file:d,$event:e})||-1;if(null!=g&&angular.isString(g)){var j=new RegExp(f(g),"gi");g=null!=d.type&&j.test(d.type.toLowerCase())||null!=d.name&&j.test(d.name.toLowerCase())}return(null==g||g)&&(null==d.size||d.size<h&&d.size>i)},ngFileUpload.updateModel=function(a,b,c,d,e,f,g,h,i,j){function k(){if(a(e.ngfKeep)(c)===!0){var j=(d.$modelValue||[]).slice(0);if(g&&g.length)if(a(e.ngfKeepDistinct)(c)===!0){for(var k=j.length,l=0;l<g.length;l++){for(var m=0;k>m&&g[l].name!==j[m].name;m++);m===k&&j.push(g[l])}g=j}else g=j.concat(g);else g=j}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})}j?k():b(function(){k()})};var c=ngFileUpload.validate,d=ngFileUpload.updateModel}(),function(){function a(a,e,f,g,h,i,j){function k(a,b,d){var e=!0,f=d.dataTransfer.items;if(null!=f)for(var g=0;g<f.length&&e;g++)e=e&&("file"===f[g].kind||""===f[g].kind)&&c(a,h,b,f[g],d);var i=h(b.ngfDragOverClass)(a,{$event:d});return i&&(i.delay&&(r=i.delay),i.accept&&(i=e?i.accept:i.reject)),i||b.ngfDragOverClass||"dragover"}function l(b,d,e,g){function k(d){c(a,h,f,d,b)?m.push(d):n.push(d)}function l(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;k({name:b.name,type:"directory",path:d});var e=b.createReader(),f=[];p++;var g=function(){e.readEntries(function(d){try{if(d.length)f=f.concat(Array.prototype.slice.call(d||[],0)),g();else{for(var e=0;e<f.length;e++)l(a,f[e],(c?c:"")+b.name+"/");p--}}catch(h){p--,console.error(h)}},function(){p--})};g()}else p++,b.file(function(a){try{p--,a.path=(c?c:"")+a.name,k(a)}catch(b){p--,console.error(b)}},function(){p--})}var m=[],n=[],o=b.dataTransfer.items,p=0;if(o&&o.length>0&&"file"!==j.protocol())for(var q=0;q<o.length;q++){if(o[q].webkitGetAsEntry&&o[q].webkitGetAsEntry()&&o[q].webkitGetAsEntry().isDirectory){var r=o[q].webkitGetAsEntry();if(r.isDirectory&&!e)continue;null!=r&&l(m,r)}else{var s=o[q].getAsFile();null!=s&&k(s)}if(!g&&m.length>0)break}else{var t=b.dataTransfer.files;if(null!=t)for(var u=0;u<t.length&&(k(t.item(u)),g||!(m.length>0));u++);}var v=0;!function w(a){i(function(){if(p)10*v++<2e4&&w(10);else{if(!g&&m.length>1){for(q=0;"directory"===m[q].type;)q++;m=[m[q]]}d(m,n)}},a||0)}()}var m=b();if(f.dropAvailable&&i(function(){a[f.dropAvailable]?a[f.dropAvailable].value=m:a[f.dropAvailable]=m}),!m)return void(h(f.ngfHideOnDropNotAvailable)(a)===!0&&e.css("display","none"));var n=!1;-1===f.ngfDrop.search(/\W+$files\W+/)&&a.$watch(f.ngfDrop,function(a){n=a===!1});var o,p=null,q=h(f.ngfStopPropagation),r=1;e[0].addEventListener("dragover",function(b){if(!e.attr("disabled")&&!n){if(b.preventDefault(),q(a)&&b.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var c=b.dataTransfer.effectAllowed;b.dataTransfer.dropEffect="move"===c||"linkMove"===c?"move":"copy"}i.cancel(p),a.actualDragOverClass||(o=k(a,f,b)),e.addClass(o)}},!1),e[0].addEventListener("dragenter",function(b){e.attr("disabled")||n||(b.preventDefault(),q(a)&&b.stopPropagation())},!1),e[0].addEventListener("dragleave",function(){e.attr("disabled")||n||(p=i(function(){e.removeClass(o),o=null},r||1))},!1),e[0].addEventListener("drop",function(b){e.attr("disabled")||n||(b.preventDefault(),q(a)&&b.stopPropagation(),e.removeClass(o),o=null,l(b,function(c,e){d(h,i,a,g,f,f.ngfChange||f.ngfDrop,c,e,b)},h(f.ngfAllowDir)(a)!==!1,f.multiple||h(f.ngfMultiple)(a)))},!1)}function b(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}var c=ngFileUpload.validate,d=ngFileUpload.updateModel;ngFileUpload.directive("ngfDrop",["$parse","$timeout","$location",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.directive("ngfNoFileDrop",function(){return function(a,c){b()&&c.css("display","none")}}),ngFileUpload.directive("ngfDropAvailable",["$parse","$timeout",function(a,c){return function(d,e,f){if(b()){var g=a(f.ngfDropAvailable);c(function(){g(d),g.assign&&g.assign(d,!0)})}}}]),ngFileUpload.directive("ngfSrc",["$parse","$timeout",function(a,b){return{restrict:"AE",link:function(d,e,f){window.FileReader&&d.$watch(f.ngfSrc,function(g){g&&c(d,a,f,g,null)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 8")||g.size<2e4)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 9")||g.size<4e6)?b(function(){var a=window.URL||window.webkitURL;if(a&&a.createObjectURL)e.attr("src",a.createObjectURL(g));else{var c=new FileReader;c.readAsDataURL(g),c.onload=function(a){b(function(){e.attr("src",a.target.result)})}}}):e.attr("src",f.ngfDefaultSrc||"")})}}}])}(); | ||
/*! 5.1.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){}}if(window.FileAPI||(window.FileAPI={}),FileAPI.shouldLoad=window.XMLHttpRequest&&!window.FormData||FileAPI.forceLoad,FileAPI.shouldLoad){var c=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,d,e){c(this),this.__url=d;try{a.apply(this,[b,d,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,d){if("__setXHR_"===b){c(this);var e=d(this);e instanceof Function&&e(this)}else this.__requestHeaders=this.__requestHeaders||{},this.__requestHeaders[b]=d,a.apply(this,arguments)}}),a("send",function(a){return function(){var c=this;if(arguments[0]&&arguments[0].__isFileAPIShim){var d=arguments[0],e={url:c.__url,jsonp:!1,cache:!0,complete:function(a,d){c.__completed=!0,!a&&c.__listeners.load&&c.__listeners.load({type:"load",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),!a&&c.__listeners.loadend&&c.__listeners.loadend({type:"loadend",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),"abort"===a&&c.__listeners.abort&&c.__listeners.abort({type:"abort",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),void 0!==d.status&&b(c,"status",function(){return 0===d.status&&a&&"abort"!==a?500:d.status}),void 0!==d.statusText&&b(c,"statusText",function(){return d.statusText}),b(c,"readyState",function(){return 4}),void 0!==d.response&&b(c,"response",function(){return d.response});var e=d.responseText||(a&&0===d.status&&"abort"!==a?a:void 0);b(c,"responseText",function(){return e}),b(c,"response",function(){return e}),a&&b(c,"err",function(){return a}),c.__fileApiXHR=d,c.onreadystatechange&&c.onreadystatechange(),c.onload&&c.onload()},progress:function(a){if(a.target=c,c.__listeners.progress&&c.__listeners.progress(a),c.__total=a.total,c.__loaded=a.loaded,a.total===a.loaded){var b=this;setTimeout(function(){c.__completed||(c.getAllResponseHeaders=function(){},b.complete(null,{status:204,statusText:"No Content"}))},FileAPI.noContentTimeout||1e4)}},headers:c.__requestHeaders};e.data={},e.files={};for(var f=0;f<d.data.length;f++){var g=d.data[f];null!=g.val&&null!=g.val.name&&null!=g.val.size&&null!=g.val.type?e.files[g.key]=g.val:e.data[g.key]=g.val}setTimeout(function(){if(!FileAPI.hasFlash)throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';c.__fileApiXHR=FileAPI.upload(e)},1)}else{if(this.__origError)throw this.__origError;a.apply(c,arguments)}}}),window.XMLHttpRequest.__isFileAPIShim=!0,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(){function a(a){return"input"===a[0].tagName.toLowerCase()&&a.attr("type")&&"file"===a.attr("type").toLowerCase()}function b(){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}function c(a){var b=0,c=0;if(window.jQuery)return jQuery(a).offset();if(a.offsetParent)do b+=a.offsetLeft-a.scrollLeft,c+=a.offsetTop-a.scrollTop,a=a.offsetParent;while(a);return{left:b,top:c}}if(FileAPI.shouldLoad){if(FileAPI.forceLoad&&(FileAPI.html5=!1),!FileAPI.upload){var d,e,f,g,h,i=document.createElement("script"),j=document.getElementsByTagName("script");if(window.FileAPI.jsUrl)d=window.FileAPI.jsUrl;else if(window.FileAPI.jsPath)e=window.FileAPI.jsPath;else for(f=0;f<j.length;f++)if(h=j[f].src,g=h.search(/\/ng\-file\-upload[\-a-zA-z0-9\.]*\.js/),g>-1){e=h.substring(0,g+1);break}null==FileAPI.staticPath&&(FileAPI.staticPath=e),i.setAttribute("src",d||e+"FileAPI.min.js"),document.getElementsByTagName("head")[0].appendChild(i),FileAPI.hasFlash=b()}FileAPI.ngfFixIE=function(d,e,f,g){if(!b())throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';var h=function(){if(d.attr("disabled"))d.$$ngfRefElem.removeClass("js-fileapi-wrapper");else{var b=d.$$ngfRefElem;b?f(d.$$ngfRefElem):(b=d.$$ngfRefElem=e(),b.addClass("js-fileapi-wrapper"),!a(d),setTimeout(function(){b.bind("mouseenter",h)},10),b.bind("change",function(a){i.apply(this,[a]),g.apply(this,[a])})),a(d)||b.css("position","absolute").css("top",c(d[0]).top+"px").css("left",c(d[0]).left+"px").css("width",d[0].offsetWidth+"px").css("height",d[0].offsetHeight+"px").css("filter","alpha(opacity=0)").css("display",d.css("display")).css("overflow","hidden").css("z-index","900000").css("visibility","visible")}};d.bind("mouseenter",h);var i=function(a){for(var b=FileAPI.getFiles(a),c=0;c<b.length;c++)void 0===b[c].size&&(b[c].size=0),void 0===b[c].name&&(b[c].name="file"),void 0===b[c].type&&(b[c].type="undefined");a.target||(a.target={}),a.target.files=b,a.target.files!==b&&(a.__files_=b),(a.__files_||a.target.files).item=function(b){return(a.__files_||a.target.files)[b]||null}}},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){b||(b=!0,a.onloadstart&&a.onloadstart(c("loadstart",d)));var e;"load"===d.type?(a.onloadend&&a.onloadend(c("loadend",d)),e=c("load",d),a.onload&&a.onload(e),a.dispatchEvent(e)):"progress"===d.type?(e=c("progress",d),a.onprogress&&a.onprogress(e),a.dispatchEvent(e)):(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)}}),!window.XMLHttpRequest||window.FileAPI&&FileAPI.shouldLoad||(window.XMLHttpRequest.prototype.setRequestHeader=function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}}(window.XMLHttpRequest.prototype.setRequestHeader));var ngFileUpload=angular.module("ngFileUpload",[]);ngFileUpload.version="5.1.0",ngFileUpload.defaults={},ngFileUpload.service("Upload",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{};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.progressFunc&&c(function(){f.progressFunc(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(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.progressFunc=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){function b(c,d,e){if(void 0!==d)if(angular.isDate(d)&&(d=d.toISOString()),angular.isString(d))c.append(e,d);else if("form"===a.sendFieldsAs)if(angular.isObject(d))for(var f in d)d.hasOwnProperty(f)&&b(c,d[f],e+"["+f+"]");else c.append(e,d);else d=angular.isString(d)?d:JSON.stringify(d),"json-blob"===a.sendFieldsAs?c.append(e,new Blob([d],{type:"application/json"})):c.append(e,d)}return a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?angular.isArray(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(c){var d,e=new FormData,f={};for(d in a.fields)a.fields.hasOwnProperty(d)&&(f[d]=a.fields[d]);c&&(f.data=c);for(d in f)if(f.hasOwnProperty(d)){var g=f[d];a.formDataAppender?a.formDataAppender(e,d,g):b(e,g,d)}if(null!=a.file){var h=a.fileFormDataName||"file";if(angular.isArray(a.file))for(var i=angular.isString(h),j=0;j<a.file.length;j++)e.append(i?h:h[j],a.file[j],a.fileName&&a.fileName[j]||a.file[j].name);else e.append(h,a.file,a.fileName||a.file.name)}return e}),d(a)},this.http=function(b){return b.transformRequest=b.transformRequest||function(b){return window.ArrayBuffer&&b instanceof window.ArrayBuffer||b instanceof Blob?b:a.defaults.transformRequest[0](arguments)},d(b)},this.dataUrl=function(a,b,d){window.FileReader&&a&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 8")||a.size<2e4)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 9")||a.size<4e6)?c(function(){var e=window.URL||window.webkitURL;if(e&&e.createObjectURL&&!d)b(e.createObjectURL(a));else{var f=new FileReader;f.readAsDataURL(a),f.onload=function(a){c(function(){b(a.target.result)})}}}):b(null)},this.setDefaults=function(a){ngFileUpload.defaults=a||{}}}]),function(){function a(a,f,g,h,i,j,k){function l(){return"input"===f[0].tagName.toLowerCase()&&g.type&&"file"===g.type.toLowerCase()}function m(b){if(!s){s=!0;try{for(var f=b.__files_||b.target&&b.target.files,k=[],l=[],m=0;m<f.length;m++){var n=f.item(m);d(a,i,g,n,b)?k.push(n):l.push(n)}e(i,j,a,h,g,c(g,"ngfChange")||c(g,"ngfSelect"),k,l,b),0===k.length&&(b.target.value=k)}finally{s=!1}}}function n(b){c(g,"ngfMultiple")&&b.attr("multiple",i(c(g,"ngfMultiple"))(a)),c(g,"ngfCapture")&&b.attr("capture",i(c(g,"ngfCapture"))(a)),c(g,"accept")&&b.attr("accept",c(g,"accept"));for(var d=0;d<f[0].attributes.length;d++){var e=f[0].attributes[d];(l()&&"type"!==e.name||"type"!==e.name&&"class"!==e.name&&"id"!==e.name&&"style"!==e.name)&&b.attr(e.name,e.value)}}function o(b,c){if(!c&&(b||l()))return f.$$ngfRefElem||f;var d=angular.element('<input type="file">');return n(d),l()?(f.replaceWith(d),f=d,d.attr("__ngf_gen__",!0),k(f)(a)):(d.css("visibility","hidden").css("position","absolute").css("overflow","hidden").css("width","0px").css("height","0px").css("z-index","-100000").css("border","none").css("margin","0px").css("padding","0px").attr("tabindex","-1"),f.$$ngfRefElem&&f.$$ngfRefElem.remove(),f.$$ngfRefElem=d,document.body.appendChild(d[0])),d}function p(b){e(i,j,a,h,g,c(g,"ngfChange")||c(g,"ngfSelect"),[],[],b,!0)}function q(d){function e(a){a&&a.clientY>0&&k[0].click(),!l()&&a||!j||f.bind("click touchend touchstart",q)}if(f.attr("disabled")||r)return!1;if(null!=d){if("touchstart"===d.type)return t=d.originalEvent.touches[0].clientY,!0;if(d.stopPropagation(),d.preventDefault(),"touchend"===d.type){var h=d.originalEvent.changedTouches[0].clientY;if(Math.abs(h-t)>20)return!1}}var j=i(c(g,"ngfResetOnClick"))(a)!==!1,k=o(d,j);return k&&((!d||j)&&k.bind("change",m),d&&j&&i(c(g,"ngfResetModelOnClick"))(a)!==!1&&p(d),b(navigator.userAgent)?setTimeout(function(){e(d)},0):e(d)),!1}if(!f.attr("__ngf_gen__")){a.$on("$destroy",function(){f.$$ngfRefElem&&f.$$ngfRefElem.remove()});var r=!1;-1===c(g,"ngfSelect").search(/\W+$files\W+/)&&a.$watch(c(g,"ngfSelect"),function(a){r=a===!1});var s=!1,t=0;window.FileAPI&&window.FileAPI.ngfFixIE?window.FileAPI.ngfFixIE(f,o,n,m):q()}}function b(a){var b=a.match(/Android[^\d]*(\d+)\.(\d+)/);if(b&&b.length>2){var c=ngFileUpload.defaults.androidFixMinorVersion||4;return parseInt(b[1])<4||parseInt(b[1])===c&&parseInt(b[2])<c}return-1===a.indexOf("Chrome")&&/.*Windows.*Safari.*/.test(a)}ngFileUpload.getAttrWithDefaults=function(a,b){return null!=a[b]?a[b]:null==ngFileUpload.defaults[b]?ngFileUpload.defaults[b]:ngFileUpload.defaults[b].toString()};var c=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfSelect",["$parse","$timeout","$compile",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.validate=function(a,b,d,e,f){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(var d=0;d<b.length;d++)c+="("+g(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}if(null==e)return!1;var h=b(c(d,"ngfAccept"))(a,{$file:e,$event:f}),i=b(c(d,"ngfMaxSize"))(a,{$file:e,$event:f})||9007199254740991,j=b(c(d,"ngfMinSize"))(a,{$file:e,$event:f})||-1;if(null!=h&&angular.isString(h)){var k=new RegExp(g(h),"gi");if(h=null!=e.type&&k.test(e.type.toLowerCase())||null!=e.name&&k.test(e.name.toLowerCase()),!h)return e.$error="accept",!1}else if(h===!1)return e.$error="accept",!1;return null==e.size?!0:e.size>i?(e.$error="maxSize",!1):e.size<j?(e.$error="minSize",!1):!0},ngFileUpload.updateModel=function(a,b,d,e,f,g,h,i,j,k){function l(){if(a(c(f,"ngfKeep"))(d)===!0){var k=(e.$modelValue||[]).slice(0);if(h&&h.length)if(a(c(f,"ngfKeepDistinct"))(d)===!0){for(var l=k.length,m=0;m<h.length;m++){for(var n=0;l>n&&h[m].name!==k[n].name;n++);n===l&&k.push(h[m])}h=k}else h=k.concat(h);else h=k}e&&(a(c(f,"ngModel")).assign(d,h),b(function(){e&&e.$setViewValue(null!=h&&0===h.length?null:h)})),c(f,"ngModelRejected")&&a(c(f,"ngModelRejected")).assign(d,i),g&&a(g)(d,{$files:h,$rejectedFiles:i,$event:j})}k?l():b(function(){l()})};var d=ngFileUpload.validate,e=ngFileUpload.updateModel}(),function(){function a(a,f,g,h,i,j,k){function l(a,b,d){var f=!0,g=d.dataTransfer.items;if(null!=g)for(var h=0;h<g.length&&f;h++)f=f&&("file"===g[h].kind||""===g[h].kind)&&c(a,i,b,g[h],d);var j=i(e(b,"ngfDragOverClass"))(a,{$event:d});return j&&(j.delay&&(s=j.delay),j.accept&&(j=f?j.accept:j.reject)),j||e(b,"ngfDragOverClass")||"dragover"}function m(b,d,e,f){function h(d){c(a,i,g,d,b)?m.push(d):n.push(d)}function l(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;h({name:b.name,type:"directory",path:d});var e=b.createReader(),f=[];p++;var g=function(){e.readEntries(function(d){try{if(d.length)f=f.concat(Array.prototype.slice.call(d||[],0)),g();else{for(var e=0;e<f.length;e++)l(a,f[e],(c?c:"")+b.name+"/");p--}}catch(h){p--,console.error(h)}},function(){p--})};g()}else p++,b.file(function(a){try{p--,a.path=(c?c:"")+a.name,h(a)}catch(b){p--,console.error(b)}},function(){p--})}var m=[],n=[],o=b.dataTransfer.items,p=0;if(o&&o.length>0&&"file"!==k.protocol())for(var q=0;q<o.length;q++){if(o[q].webkitGetAsEntry&&o[q].webkitGetAsEntry()&&o[q].webkitGetAsEntry().isDirectory){var r=o[q].webkitGetAsEntry();if(r.isDirectory&&!e)continue;null!=r&&l(m,r)}else{var s=o[q].getAsFile();null!=s&&h(s)}if(!f&&m.length>0)break}else{var t=b.dataTransfer.files;if(null!=t)for(var u=0;u<t.length&&(h(t.item(u)),f||!(m.length>0));u++);}var v=0;!function w(a){j(function(){if(p)10*v++<2e4&&w(10);else{if(!f&&m.length>1){for(q=0;"directory"===m[q].type;)q++;m=[m[q]]}d(m,n)}},a||0)}()}var n=b();if(e(g,"dropAvailable")&&j(function(){a[e(g,"dropAvailable")]?a[e(g,"dropAvailable")].value=n:a[e(g,"dropAvailable")]=n}),!n)return void(i(e(g,"ngfHideOnDropNotAvailable"))(a)===!0&&f.css("display","none"));var o=!1;-1===e(g,"ngfDrop").search(/\W+$files\W+/)&&a.$watch(e(g,"ngfDrop"),function(a){o=a===!1});var p,q=null,r=i(e(g,"ngfStopPropagation")),s=1;f[0].addEventListener("dragover",function(b){if(!f.attr("disabled")&&!o){if(b.preventDefault(),r(a)&&b.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var c=b.dataTransfer.effectAllowed;b.dataTransfer.dropEffect="move"===c||"linkMove"===c?"move":"copy"}j.cancel(q),a.actualDragOverClass||(p=l(a,g,b)),f.addClass(p)}},!1),f[0].addEventListener("dragenter",function(b){f.attr("disabled")||o||(b.preventDefault(),r(a)&&b.stopPropagation())},!1),f[0].addEventListener("dragleave",function(){f.attr("disabled")||o||(q=j(function(){f.removeClass(p),p=null},s||1))},!1),f[0].addEventListener("drop",function(b){f.attr("disabled")||o||(b.preventDefault(),r(a)&&b.stopPropagation(),f.removeClass(p),p=null,m(b,function(c,f){d(i,j,a,h,g,e(g,"ngfChange")||e(g,"ngfDrop"),c,f,b)},i(e(g,"ngfAllowDir"))(a)!==!1,e(g,"multiple")||i(e(g,"ngfMultiple"))(a)))},!1)}function b(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}var c=ngFileUpload.validate,d=ngFileUpload.updateModel,e=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfDrop",["$parse","$timeout","$location",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.directive("ngfNoFileDrop",function(){return function(a,c){b()&&c.css("display","none")}}),ngFileUpload.directive("ngfDropAvailable",["$parse","$timeout",function(a,c){return function(d,f,g){if(b()){var h=a(e(g,"ngfDropAvailable"));c(function(){h(d),h.assign&&h.assign(d,!0)})}}}])}(),function(){function a(a,b,c,d,e,f,g){b.$watch(e,function(e){window.FileReader&&ngFileUpload.validate(b,c,d,e,null)&&a.dataUrl(e,function(a){g?g(a):e.dataUrl=a||c(f)(b)},c(d.ngfNoObjectUrl)(b))})}ngFileUpload.directive("ngfSrc",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfSrc,f.ngfDefaultSrc,function(a){e.attr("src",a)})}}}]),ngFileUpload.directive("ngfBackground",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfBackground,f.ngfDefaultBackground,function(a){e.css("background-image","url("+a+")")})}}}]),ngFileUpload.directive("ngfDataUrl",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfDataUrl,f.ngfDefaultDataUrl)}}}])}(); |
@@ -5,3 +5,3 @@ /**! | ||
* @author Danial <danial.farid@gmail.com> | ||
* @version 5.0.9 | ||
* @version 5.1.0 | ||
*/ | ||
@@ -8,0 +8,0 @@ |
@@ -1,2 +0,2 @@ | ||
/*! 5.0.9 */ | ||
/*! 5.1.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){}}if(window.FileAPI||(window.FileAPI={}),FileAPI.shouldLoad=window.XMLHttpRequest&&!window.FormData||FileAPI.forceLoad,FileAPI.shouldLoad){var c=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,d,e){c(this),this.__url=d;try{a.apply(this,[b,d,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,d){if("__setXHR_"===b){c(this);var e=d(this);e instanceof Function&&e(this)}else this.__requestHeaders=this.__requestHeaders||{},this.__requestHeaders[b]=d,a.apply(this,arguments)}}),a("send",function(a){return function(){var c=this;if(arguments[0]&&arguments[0].__isFileAPIShim){var d=arguments[0],e={url:c.__url,jsonp:!1,cache:!0,complete:function(a,d){c.__completed=!0,!a&&c.__listeners.load&&c.__listeners.load({type:"load",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),!a&&c.__listeners.loadend&&c.__listeners.loadend({type:"loadend",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),"abort"===a&&c.__listeners.abort&&c.__listeners.abort({type:"abort",loaded:c.__loaded,total:c.__total,target:c,lengthComputable:!0}),void 0!==d.status&&b(c,"status",function(){return 0===d.status&&a&&"abort"!==a?500:d.status}),void 0!==d.statusText&&b(c,"statusText",function(){return d.statusText}),b(c,"readyState",function(){return 4}),void 0!==d.response&&b(c,"response",function(){return d.response});var e=d.responseText||(a&&0===d.status&&"abort"!==a?a:void 0);b(c,"responseText",function(){return e}),b(c,"response",function(){return e}),a&&b(c,"err",function(){return a}),c.__fileApiXHR=d,c.onreadystatechange&&c.onreadystatechange(),c.onload&&c.onload()},progress:function(a){if(a.target=c,c.__listeners.progress&&c.__listeners.progress(a),c.__total=a.total,c.__loaded=a.loaded,a.total===a.loaded){var b=this;setTimeout(function(){c.__completed||(c.getAllResponseHeaders=function(){},b.complete(null,{status:204,statusText:"No Content"}))},FileAPI.noContentTimeout||1e4)}},headers:c.__requestHeaders};e.data={},e.files={};for(var f=0;f<d.data.length;f++){var g=d.data[f];null!=g.val&&null!=g.val.name&&null!=g.val.size&&null!=g.val.type?e.files[g.key]=g.val:e.data[g.key]=g.val}setTimeout(function(){if(!FileAPI.hasFlash)throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';c.__fileApiXHR=FileAPI.upload(e)},1)}else{if(this.__origError)throw this.__origError;a.apply(c,arguments)}}}),window.XMLHttpRequest.__isFileAPIShim=!0,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(){function a(a){return"input"===a[0].tagName.toLowerCase()&&a.attr("type")&&"file"===a.attr("type").toLowerCase()}function b(){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}function c(a){var b=0,c=0;if(window.jQuery)return jQuery(a).offset();if(a.offsetParent)do b+=a.offsetLeft-a.scrollLeft,c+=a.offsetTop-a.scrollTop,a=a.offsetParent;while(a);return{left:b,top:c}}if(FileAPI.shouldLoad){if(FileAPI.forceLoad&&(FileAPI.html5=!1),!FileAPI.upload){var d,e,f,g,h,i=document.createElement("script"),j=document.getElementsByTagName("script");if(window.FileAPI.jsUrl)d=window.FileAPI.jsUrl;else if(window.FileAPI.jsPath)e=window.FileAPI.jsPath;else for(f=0;f<j.length;f++)if(h=j[f].src,g=h.search(/\/ng\-file\-upload[\-a-zA-z0-9\.]*\.js/),g>-1){e=h.substring(0,g+1);break}null==FileAPI.staticPath&&(FileAPI.staticPath=e),i.setAttribute("src",d||e+"FileAPI.min.js"),document.getElementsByTagName("head")[0].appendChild(i),FileAPI.hasFlash=b()}FileAPI.ngfFixIE=function(d,e,f,g){if(!b())throw'Adode Flash Player need to be installed. To check ahead use "FileAPI.hasFlash"';var h=function(){if(d.attr("disabled"))d.$$ngfRefElem.removeClass("js-fileapi-wrapper");else{var b=d.$$ngfRefElem;b?f(d.$$ngfRefElem):(b=d.$$ngfRefElem=e(),b.addClass("js-fileapi-wrapper"),!a(d),setTimeout(function(){b.bind("mouseenter",h)},10),b.bind("change",function(a){i.apply(this,[a]),g.apply(this,[a])})),a(d)||b.css("position","absolute").css("top",c(d[0]).top+"px").css("left",c(d[0]).left+"px").css("width",d[0].offsetWidth+"px").css("height",d[0].offsetHeight+"px").css("filter","alpha(opacity=0)").css("display",d.css("display")).css("overflow","hidden").css("z-index","900000").css("visibility","visible")}};d.bind("mouseenter",h);var i=function(a){for(var b=FileAPI.getFiles(a),c=0;c<b.length;c++)void 0===b[c].size&&(b[c].size=0),void 0===b[c].name&&(b[c].name="file"),void 0===b[c].type&&(b[c].type="undefined");a.target||(a.target={}),a.target.files=b,a.target.files!==b&&(a.__files_=b),(a.__files_||a.target.files).item=function(b){return(a.__files_||a.target.files)[b]||null}}},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){b||(b=!0,a.onloadstart&&a.onloadstart(c("loadstart",d)));var e;"load"===d.type?(a.onloadend&&a.onloadend(c("loadend",d)),e=c("load",d),a.onload&&a.onload(e),a.dispatchEvent(e)):"progress"===d.type?(e=c("progress",d),a.onprogress&&a.onprogress(e),a.dispatchEvent(e)):(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 5.0.9 | ||
* @version 5.1.0 | ||
*/ | ||
@@ -25,3 +25,5 @@ | ||
ngFileUpload.version = '5.0.9'; | ||
ngFileUpload.version = '5.1.0'; | ||
ngFileUpload.defaults = {}; | ||
ngFileUpload.service('Upload', ['$http', '$q', '$timeout', function ($http, $q, $timeout) { | ||
@@ -199,2 +201,31 @@ function sendHttp(config) { | ||
}; | ||
this.dataUrl = function (file, callback, disallowObjectUrl) { | ||
if (window.FileReader && file && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) { | ||
$timeout(function () { | ||
//prefer URL.createObjectURL for handling refrences to files of all sizes | ||
//since it doesn´t build a large string in memory | ||
var URL = window.URL || window.webkitURL; | ||
if (URL && URL.createObjectURL && !disallowObjectUrl) { | ||
callback(URL.createObjectURL(file)); | ||
} else { | ||
var fileReader = new FileReader(); | ||
fileReader.readAsDataURL(file); | ||
fileReader.onload = function (e) { | ||
$timeout(function () { | ||
callback(e.target.result); | ||
}); | ||
}; | ||
} | ||
}); | ||
} else { | ||
callback(null); | ||
} | ||
}; | ||
this.setDefaults = function(defaults) { | ||
ngFileUpload.defaults = defaults || {}; | ||
}; | ||
} | ||
@@ -205,260 +236,310 @@ | ||
(function () { | ||
ngFileUpload.directive('ngfSelect', ['$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); | ||
} | ||
}; | ||
}]); | ||
ngFileUpload.getAttrWithDefaults = function(attr, name) { | ||
return attr[name] != null ? attr[name] : | ||
(ngFileUpload.defaults[name] == null ? | ||
ngFileUpload.defaults[name] : ngFileUpload.defaults[name].toString()); | ||
}; | ||
function linkFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile) { | ||
/** @namespace attr.ngfSelect */ | ||
/** @namespace attr.ngfChange */ | ||
/** @namespace attr.ngModel */ | ||
/** @namespace attr.ngModelRejected */ | ||
/** @namespace attr.ngfMultiple */ | ||
/** @namespace attr.ngfCapture */ | ||
/** @namespace attr.ngfAccept */ | ||
/** @namespace attr.ngfMaxSize */ | ||
/** @namespace attr.ngfMinSize */ | ||
/** @namespace attr.ngfResetOnClick */ | ||
/** @namespace attr.ngfResetModelOnClick */ | ||
/** @namespace attr.ngfKeep */ | ||
/** @namespace attr.ngfKeepDistinct */ | ||
var getAttr = ngFileUpload.getAttrWithDefaults; | ||
if (elem.attr('__ngf_gen__')) { | ||
return; | ||
ngFileUpload.directive('ngfSelect', ['$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); | ||
} | ||
}; | ||
}]); | ||
scope.$on('$destroy', function () { | ||
if (elem.$$ngfRefElem) elem.$$ngfRefElem.remove(); | ||
}); | ||
function linkFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile) { | ||
/** @namespace attr.ngfSelect */ | ||
/** @namespace attr.ngfChange */ | ||
/** @namespace attr.ngModel */ | ||
/** @namespace attr.ngModelRejected */ | ||
/** @namespace attr.ngfMultiple */ | ||
/** @namespace attr.ngfCapture */ | ||
/** @namespace attr.ngfAccept */ | ||
/** @namespace attr.ngfMaxSize */ | ||
/** @namespace attr.ngfMinSize */ | ||
/** @namespace attr.ngfResetOnClick */ | ||
/** @namespace attr.ngfResetModelOnClick */ | ||
/** @namespace attr.ngfKeep */ | ||
/** @namespace attr.ngfKeepDistinct */ | ||
var disabled = false; | ||
if (attr.ngfSelect.search(/\W+$files\W+/) === -1) { | ||
scope.$watch(attr.ngfSelect, function (val) { | ||
disabled = val === false; | ||
}); | ||
} | ||
function isInputTypeFile() { | ||
return elem[0].tagName.toLowerCase() === 'input' && attr.type && attr.type.toLowerCase() === 'file'; | ||
} | ||
if (elem.attr('__ngf_gen__')) { | ||
return; | ||
} | ||
var isUpdating = false; | ||
scope.$on('$destroy', function () { | ||
if (elem.$$ngfRefElem) elem.$$ngfRefElem.remove(); | ||
}); | ||
function changeFn(evt) { | ||
if (!isUpdating) { | ||
isUpdating = true; | ||
try { | ||
var fileList = evt.__files_ || (evt.target && evt.target.files); | ||
var files = [], rejFiles = []; | ||
var disabled = false; | ||
if (getAttr(attr, 'ngfSelect').search(/\W+$files\W+/) === -1) { | ||
scope.$watch(getAttr(attr, 'ngfSelect'), function (val) { | ||
disabled = val === false; | ||
}); | ||
} | ||
function isInputTypeFile() { | ||
return elem[0].tagName.toLowerCase() === 'input' && attr.type && attr.type.toLowerCase() === 'file'; | ||
} | ||
for (var i = 0; i < fileList.length; i++) { | ||
var file = fileList.item(i); | ||
if (validate(scope, $parse, attr, file, evt)) { | ||
files.push(file); | ||
} else { | ||
rejFiles.push(file); | ||
} | ||
} | ||
updateModel($parse, $timeout, scope, ngModel, attr, attr.ngfChange || attr.ngfSelect, files, rejFiles, evt); | ||
if (files.length === 0) evt.target.value = files; | ||
var isUpdating = false; | ||
function changeFn(evt) { | ||
if (!isUpdating) { | ||
isUpdating = true; | ||
try { | ||
var fileList = evt.__files_ || (evt.target && evt.target.files); | ||
var files = [], rejFiles = []; | ||
for (var i = 0; i < fileList.length; i++) { | ||
var file = fileList.item(i); | ||
if (validate(scope, $parse, attr, file, evt)) { | ||
files.push(file); | ||
} else { | ||
rejFiles.push(file); | ||
} | ||
} | ||
updateModel($parse, $timeout, scope, ngModel, attr, | ||
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), files, rejFiles, evt); | ||
if (files.length === 0) evt.target.value = files; | ||
// if (evt.target && evt.target.getAttribute('__ngf_gen__')) { | ||
// angular.element(evt.target).remove(); | ||
// } | ||
} finally { | ||
isUpdating = false; | ||
} | ||
} | ||
} finally { | ||
isUpdating = false; | ||
} | ||
} | ||
} | ||
function bindAttrToFileInput(fileElem) { | ||
if (attr.ngfMultiple) fileElem.attr('multiple', $parse(attr.ngfMultiple)(scope)); | ||
if (attr.ngfCapture) fileElem.attr('capture', $parse(attr.ngfCapture)(scope)); | ||
if (attr.accept) fileElem.attr('accept', attr.accept); | ||
for (var i = 0; i < elem[0].attributes.length; i++) { | ||
var attribute = elem[0].attributes[i]; | ||
if ((isInputTypeFile() && attribute.name !== 'type') || | ||
(attribute.name !== 'type' && attribute.name !== 'class' && | ||
attribute.name !== 'id' && attribute.name !== 'style')) { | ||
fileElem.attr(attribute.name, attribute.value); | ||
} | ||
} | ||
function bindAttrToFileInput(fileElem) { | ||
if (getAttr(attr, 'ngfMultiple')) fileElem.attr('multiple', $parse(getAttr(attr, 'ngfMultiple'))(scope)); | ||
if (getAttr(attr, 'ngfCapture')) fileElem.attr('capture', $parse(getAttr(attr, 'ngfCapture'))(scope)); | ||
if (getAttr(attr, 'accept')) fileElem.attr('accept', getAttr(attr, 'accept')); | ||
for (var i = 0; i < elem[0].attributes.length; i++) { | ||
var attribute = elem[0].attributes[i]; | ||
if ((isInputTypeFile() && attribute.name !== 'type') || | ||
(attribute.name !== 'type' && attribute.name !== 'class' && | ||
attribute.name !== 'id' && attribute.name !== 'style')) { | ||
fileElem.attr(attribute.name, attribute.value); | ||
} | ||
} | ||
} | ||
function createFileInput(evt, resetOnClick) { | ||
if (!resetOnClick && (evt || isInputTypeFile())) return elem.$$ngfRefElem || elem; | ||
function createFileInput(evt, resetOnClick) { | ||
if (!resetOnClick && (evt || isInputTypeFile())) return elem.$$ngfRefElem || elem; | ||
var fileElem = angular.element('<input type="file">'); | ||
bindAttrToFileInput(fileElem); | ||
var fileElem = angular.element('<input type="file">'); | ||
bindAttrToFileInput(fileElem); | ||
if (isInputTypeFile()) { | ||
elem.replaceWith(fileElem); | ||
elem = fileElem; | ||
fileElem.attr('__ngf_gen__', true); | ||
$compile(elem)(scope); | ||
} else { | ||
fileElem.css('visibility', 'hidden').css('position', 'absolute').css('overflow', 'hidden') | ||
.css('width', '0px').css('height', '0px').css('z-index', '-100000').css('border', 'none') | ||
.css('margin', '0px').css('padding', '0px').attr('tabindex', '-1'); | ||
if (elem.$$ngfRefElem) { | ||
elem.$$ngfRefElem.remove(); | ||
} | ||
elem.$$ngfRefElem = fileElem; | ||
document.body.appendChild(fileElem[0]); | ||
} | ||
return fileElem; | ||
if (isInputTypeFile()) { | ||
elem.replaceWith(fileElem); | ||
elem = fileElem; | ||
fileElem.attr('__ngf_gen__', true); | ||
$compile(elem)(scope); | ||
} else { | ||
fileElem.css('visibility', 'hidden').css('position', 'absolute').css('overflow', 'hidden') | ||
.css('width', '0px').css('height', '0px').css('z-index', '-100000').css('border', 'none') | ||
.css('margin', '0px').css('padding', '0px').attr('tabindex', '-1'); | ||
if (elem.$$ngfRefElem) { | ||
elem.$$ngfRefElem.remove(); | ||
} | ||
elem.$$ngfRefElem = fileElem; | ||
document.body.appendChild(fileElem[0]); | ||
} | ||
function resetModel(evt) { | ||
updateModel($parse, $timeout, scope, ngModel, attr, attr.ngfChange || attr.ngfSelect, [], [], evt, true); | ||
} | ||
return fileElem; | ||
} | ||
function clickHandler(evt) { | ||
if (elem.attr('disabled') || disabled) return false; | ||
if (evt != null) { | ||
evt.preventDefault(); | ||
evt.stopPropagation(); | ||
} | ||
var resetOnClick = $parse(attr.ngfResetOnClick)(scope) !== false; | ||
var fileElem = createFileInput(evt, resetOnClick); | ||
function resetModel(evt) { | ||
updateModel($parse, $timeout, scope, ngModel, attr, | ||
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), [], [], evt, true); | ||
} | ||
function clickAndAssign(evt) { | ||
if (evt) { | ||
fileElem[0].click(); | ||
} | ||
if (isInputTypeFile() || !evt) { | ||
elem.bind('click touchend', clickHandler); | ||
} | ||
} | ||
var initialTouchStartY = 0; | ||
if (fileElem) { | ||
if (!evt || resetOnClick) fileElem.bind('change', changeFn); | ||
if (evt && resetOnClick && $parse(attr.ngfResetModelOnClick)(scope) !== false) resetModel(evt); | ||
function clickHandler(evt) { | ||
if (elem.attr('disabled') || disabled) return false; | ||
// fix for android native browser < 4.4 | ||
if (shouldClickLater(navigator.userAgent)) { | ||
setTimeout(function () { | ||
clickAndAssign(evt); | ||
}, 0); | ||
} else { | ||
clickAndAssign(evt); | ||
} | ||
} | ||
return false; | ||
if (evt != null) { | ||
if (evt.type === 'touchstart') { | ||
initialTouchStartY = evt.originalEvent.touches[0].clientY; | ||
return true; // don't block event default | ||
} else { | ||
evt.stopPropagation(); | ||
evt.preventDefault(); | ||
// prevent scroll from triggering event | ||
if (evt.type === 'touchend') { | ||
var currentLocation = evt.originalEvent.changedTouches[0].clientY; | ||
if (Math.abs(currentLocation - initialTouchStartY) > 20) return false; | ||
} | ||
} | ||
} | ||
if (window.FileAPI && window.FileAPI.ngfFixIE) { | ||
window.FileAPI.ngfFixIE(elem, createFileInput, bindAttrToFileInput, changeFn); | ||
var resetOnClick = $parse(getAttr(attr, 'ngfResetOnClick'))(scope) !== false; | ||
var fileElem = createFileInput(evt, resetOnClick); | ||
function clickAndAssign(evt) { | ||
if (evt && evt.clientY > 0) { | ||
fileElem[0].click(); | ||
} | ||
if ((isInputTypeFile() || !evt) && resetOnClick) { | ||
elem.bind('click touchend touchstart', clickHandler); | ||
} | ||
} | ||
if (fileElem) { | ||
if (!evt || resetOnClick) fileElem.bind('change', changeFn); | ||
if (evt && resetOnClick && $parse(getAttr(attr, 'ngfResetModelOnClick'))(scope) !== false) { | ||
resetModel(evt); | ||
} | ||
// fix for android native browser < 4.4 | ||
if (shouldClickLater(navigator.userAgent)) { | ||
setTimeout(function () { | ||
clickAndAssign(evt); | ||
}, 0); | ||
} else { | ||
clickHandler(); | ||
//if (!isInputTypeFile()) { | ||
// elem.bind('click touchend', clickHandler); | ||
//} | ||
clickAndAssign(evt); | ||
} | ||
} | ||
return false; | ||
} | ||
function shouldClickLater(ua) { | ||
// android below 4.4 | ||
var m = ua.match(/Android[^\d]*(\d+)\.(\d+)/); | ||
if (m && m.length > 2) { | ||
return parseInt(m[1]) < 4 || (parseInt(m[1]) === 4 && parseInt(m[2]) < 4); | ||
} | ||
if (window.FileAPI && window.FileAPI.ngfFixIE) { | ||
window.FileAPI.ngfFixIE(elem, createFileInput, bindAttrToFileInput, changeFn); | ||
} else { | ||
clickHandler(); | ||
//if (!isInputTypeFile()) { | ||
// elem.bind('click touchend', clickHandler); | ||
//} | ||
} | ||
} | ||
// safari on windows | ||
return /.*Windows.*Safari.*/.test(ua); | ||
function shouldClickLater(ua) { | ||
// android below 4.4 | ||
var m = ua.match(/Android[^\d]*(\d+)\.(\d+)/); | ||
if (m && m.length > 2) { | ||
var v = ngFileUpload.defaults.androidFixMinorVersion || 4; | ||
return parseInt(m[1]) < 4 || (parseInt(m[1]) === v && parseInt(m[2]) < v); | ||
} | ||
ngFileUpload.validate = function (scope, $parse, attr, file, evt) { | ||
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; | ||
} | ||
// safari on windows | ||
return ua.indexOf('Chrome') === -1 && /.*Windows.*Safari.*/.test(ua); | ||
} | ||
var accept = $parse(attr.ngfAccept)(scope, {$file: file, $event: evt}); | ||
var fileSizeMax = $parse(attr.ngfMaxSize)(scope, {$file: file, $event: evt}) || 9007199254740991; | ||
var fileSizeMin = $parse(attr.ngfMinSize)(scope, {$file: file, $event: evt}) || -1; | ||
if (accept != null && angular.isString(accept)) { | ||
var regexp = new RegExp(globStringToRegex(accept), 'gi'); | ||
accept = (file.type != null && regexp.test(file.type.toLowerCase())) || | ||
(file.name != null && regexp.test(file.name.toLowerCase())); | ||
ngFileUpload.validate = function (scope, $parse, attr, file, evt) { | ||
if (file == null) { | ||
return false; | ||
} | ||
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 += '|'; | ||
} | ||
} | ||
return (accept == null || accept) && (file.size == null || (file.size < fileSizeMax && file.size > fileSizeMin)); | ||
}; | ||
} else { | ||
if (str.indexOf('.') === 0) { | ||
str = '*' + str; | ||
} | ||
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$'; | ||
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.'); | ||
} | ||
return result; | ||
} | ||
ngFileUpload.updateModel = function ($parse, $timeout, scope, ngModel, attr, fileChange, | ||
files, rejFiles, evt, noDelay) { | ||
function update() { | ||
if ($parse(attr.ngfKeep)(scope) === true) { | ||
var prevFiles = (ngModel.$modelValue || []).slice(0); | ||
if (!files || !files.length) { | ||
files = prevFiles; | ||
} else if ($parse(attr.ngfKeepDistinct)(scope) === true) { | ||
var len = prevFiles.length; | ||
for (var i = 0; i < files.length; i++) { | ||
for (var j = 0; j < len; j++) { | ||
if (files[i].name === prevFiles[j].name) break; | ||
} | ||
if (j === len) { | ||
prevFiles.push(files[i]); | ||
} | ||
} | ||
files = prevFiles; | ||
} else { | ||
files = prevFiles.concat(files); | ||
} | ||
var accept = $parse(getAttr(attr, 'ngfAccept'))(scope, {$file: file, $event: evt}); | ||
var fileSizeMax = $parse(getAttr(attr, 'ngfMaxSize'))(scope, {$file: file, $event: evt}) || 9007199254740991; | ||
var fileSizeMin = $parse(getAttr(attr, 'ngfMinSize'))(scope, {$file: file, $event: evt}) || -1; | ||
if (accept != null && angular.isString(accept)) { | ||
var regexp = new RegExp(globStringToRegex(accept), 'gi'); | ||
accept = (file.type != null && regexp.test(file.type.toLowerCase())) || | ||
(file.name != null && regexp.test(file.name.toLowerCase())); | ||
if (!accept) { | ||
file.$error = 'accept'; | ||
return false; | ||
} | ||
} else { | ||
if (accept === false) { | ||
file.$error = 'accept'; | ||
return false; | ||
} | ||
} | ||
if (file.size == null) return true; | ||
if (file.size > fileSizeMax) { | ||
file.$error = 'maxSize'; | ||
return false; | ||
} | ||
if (file.size < fileSizeMin) { | ||
file.$error = 'minSize'; | ||
return false; | ||
} | ||
return true; | ||
}; | ||
ngFileUpload.updateModel = function ($parse, $timeout, scope, ngModel, attr, fileChange, | ||
files, rejFiles, evt, noDelay) { | ||
function update() { | ||
if ($parse(getAttr(attr, 'ngfKeep'))(scope) === true) { | ||
var prevFiles = (ngModel.$modelValue || []).slice(0); | ||
if (!files || !files.length) { | ||
files = prevFiles; | ||
} else if ($parse(getAttr(attr, 'ngfKeepDistinct'))(scope) === true) { | ||
var len = prevFiles.length; | ||
for (var i = 0; i < files.length; i++) { | ||
for (var j = 0; j < len; j++) { | ||
if (files[i].name === prevFiles[j].name) break; | ||
} | ||
if (ngModel) { | ||
$parse(attr.ngModel).assign(scope, files); | ||
$timeout(function () { | ||
if (ngModel) { | ||
ngModel.$setViewValue(files != null && files.length === 0 ? null : files); | ||
} | ||
}); | ||
if (j === len) { | ||
prevFiles.push(files[i]); | ||
} | ||
if (attr.ngModelRejected) { | ||
$parse(attr.ngModelRejected).assign(scope, rejFiles); | ||
} | ||
if (fileChange) { | ||
$parse(fileChange)(scope, { | ||
$files: files, | ||
$rejectedFiles: rejFiles, | ||
$event: evt | ||
}); | ||
} | ||
} | ||
if (noDelay) { | ||
update(); | ||
} | ||
files = prevFiles; | ||
} else { | ||
$timeout(function () { | ||
update(); | ||
}); | ||
files = prevFiles.concat(files); | ||
} | ||
}; | ||
} | ||
if (ngModel) { | ||
$parse(getAttr(attr, 'ngModel')).assign(scope, files); | ||
$timeout(function () { | ||
if (ngModel) { | ||
ngModel.$setViewValue(files != null && files.length === 0 ? null : files); | ||
} | ||
}); | ||
} | ||
if (getAttr(attr, 'ngModelRejected')) { | ||
$parse(getAttr(attr, 'ngModelRejected')).assign(scope, rejFiles); | ||
} | ||
if (fileChange) { | ||
$parse(fileChange)(scope, { | ||
$files: files, | ||
$rejectedFiles: rejFiles, | ||
$event: evt | ||
}); | ||
} | ||
} | ||
var validate = ngFileUpload.validate; | ||
var updateModel = ngFileUpload.updateModel; | ||
if (noDelay) { | ||
update(); | ||
} else { | ||
$timeout(function () { | ||
update(); | ||
}); | ||
} | ||
}; | ||
var validate = ngFileUpload.validate; | ||
var updateModel = ngFileUpload.updateModel; | ||
})(); | ||
@@ -469,2 +550,3 @@ | ||
var updateModel = ngFileUpload.updateModel; | ||
var getAttr = ngFileUpload.getAttrWithDefaults; | ||
@@ -490,3 +572,3 @@ ngFileUpload.directive('ngfDrop', ['$parse', '$timeout', '$location', function ($parse, $timeout, $location) { | ||
if (dropAvailable()) { | ||
var fn = $parse(attr.ngfDropAvailable); | ||
var fn = $parse(getAttr(attr, 'ngfDropAvailable')); | ||
$timeout(function () { | ||
@@ -504,8 +586,8 @@ fn(scope); | ||
var available = dropAvailable(); | ||
if (attr.dropAvailable) { | ||
if (getAttr(attr, 'dropAvailable')) { | ||
$timeout(function () { | ||
if (scope[attr.dropAvailable]) { | ||
scope[attr.dropAvailable].value = available; | ||
if (scope[getAttr(attr, 'dropAvailable')]) { | ||
scope[getAttr(attr, 'dropAvailable')].value = available; | ||
} else { | ||
scope[attr.dropAvailable] = available; | ||
scope[getAttr(attr, 'dropAvailable')] = available; | ||
} | ||
@@ -515,3 +597,3 @@ }); | ||
if (!available) { | ||
if ($parse(attr.ngfHideOnDropNotAvailable)(scope) === true) { | ||
if ($parse(getAttr(attr, 'ngfHideOnDropNotAvailable'))(scope) === true) { | ||
elem.css('display', 'none'); | ||
@@ -523,4 +605,4 @@ } | ||
var disabled = false; | ||
if (attr.ngfDrop.search(/\W+$files\W+/) === -1) { | ||
scope.$watch(attr.ngfDrop, function(val) { | ||
if (getAttr(attr, 'ngfDrop').search(/\W+$files\W+/) === -1) { | ||
scope.$watch(getAttr(attr, 'ngfDrop'), function(val) { | ||
disabled = val === false; | ||
@@ -531,3 +613,3 @@ }); | ||
var leaveTimeout = null; | ||
var stopPropagation = $parse(attr.ngfStopPropagation); | ||
var stopPropagation = $parse(getAttr(attr, 'ngfStopPropagation')); | ||
var dragOverDelay = 1; | ||
@@ -571,4 +653,5 @@ var actualDragOverClass; | ||
updateModel($parse, $timeout, scope, ngModel, attr, | ||
attr.ngfChange || attr.ngfDrop, files, rejFiles, evt); | ||
}, $parse(attr.ngfAllowDir)(scope) !== false, attr.multiple || $parse(attr.ngfMultiple)(scope)); | ||
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt); | ||
}, $parse(getAttr(attr, 'ngfAllowDir'))(scope) !== false, | ||
getAttr(attr, 'multiple') || $parse(getAttr(attr, 'ngfMultiple'))(scope)); | ||
}, false); | ||
@@ -586,3 +669,3 @@ | ||
} | ||
var clazz = $parse(attr.ngfDragOverClass)(scope, {$event: evt}); | ||
var clazz = $parse(getAttr(attr, 'ngfDragOverClass'))(scope, {$event: evt}); | ||
if (clazz) { | ||
@@ -592,3 +675,3 @@ if (clazz.delay) dragOverDelay = clazz.delay; | ||
} | ||
return clazz || attr.ngfDragOverClass || 'dragover'; | ||
return clazz || getAttr(attr, 'ngfDragOverClass') || 'dragover'; | ||
} | ||
@@ -701,33 +784,35 @@ | ||
ngFileUpload.directive('ngfSrc', ['$parse', '$timeout', function ($parse, $timeout) { | ||
function dropAvailable() { | ||
var div = document.createElement('div'); | ||
return ('draggable' in div) && ('ondrop' in div); | ||
} | ||
})(); | ||
(function () { | ||
function fileToSrc(Upload, scope, $parse, attr, name, defaultName, callback) { | ||
scope.$watch(name, function (file) { | ||
if (window.FileReader && ngFileUpload.validate(scope, $parse, attr, file, null)) { | ||
Upload.dataUrl(file, function(url) { | ||
if (callback) { | ||
callback(url); | ||
} else { | ||
file.dataUrl = url || $parse(defaultName)(scope); | ||
} | ||
}, $parse(attr.ngfNoObjectUrl)(scope)); | ||
} | ||
}); | ||
} | ||
/** @namespace attr.ngfSrc */ | ||
/** @namespace attr.ngfDefaultSrc */ | ||
/** @namespace attr.ngfNoObjectUrl */ | ||
ngFileUpload.directive('ngfSrc', ['$parse', 'Upload', function ($parse, Upload) { | ||
return { | ||
restrict: 'AE', | ||
link: function (scope, elem, attr) { | ||
if (window.FileReader) { | ||
scope.$watch(attr.ngfSrc, function (file) { | ||
if (file && | ||
validate(scope, $parse, attr, file, null) && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) { | ||
$timeout(function () { | ||
//prefer URL.createObjectURL for handling refrences to files of all sizes | ||
//since it doesn´t build a large string in memory | ||
var URL = window.URL || window.webkitURL; | ||
if (URL && URL.createObjectURL) { | ||
elem.attr('src', URL.createObjectURL(file)); | ||
} else { | ||
var fileReader = new FileReader(); | ||
fileReader.readAsDataURL(file); | ||
fileReader.onload = function (e) { | ||
$timeout(function () { | ||
elem.attr('src', e.target.result); | ||
}); | ||
}; | ||
} | ||
}); | ||
} else { | ||
elem.attr('src', attr.ngfDefaultSrc || ''); | ||
} | ||
}); | ||
} | ||
fileToSrc(Upload, scope, $parse, attr, attr.ngfSrc, attr.ngfDefaultSrc, function (url) { | ||
elem.attr('src', url); | ||
}); | ||
} | ||
@@ -737,7 +822,28 @@ }; | ||
function dropAvailable() { | ||
var div = document.createElement('div'); | ||
return ('draggable' in div) && ('ondrop' in div); | ||
} | ||
/** @namespace attr.ngfBackground */ | ||
/** @namespace attr.ngfDefaultBackground */ | ||
/** @namespace attr.ngfNoObjectUrl */ | ||
ngFileUpload.directive('ngfBackground', ['$parse', 'Upload', function ($parse, Upload) { | ||
return { | ||
restrict: 'AE', | ||
link: function (scope, elem, attr) { | ||
fileToSrc(Upload, scope, $parse, attr, attr.ngfBackground, attr.ngfDefaultBackground, function (url) { | ||
elem.css('background-image', 'url(' + url + ')'); | ||
}); | ||
} | ||
}; | ||
}]); | ||
/** @namespace attr.ngfDataUrl */ | ||
/** @namespace attr.ngfDefaultDataUrl */ | ||
/** @namespace attr.ngfNoObjectUrl */ | ||
ngFileUpload.directive('ngfDataUrl', ['$parse', 'Upload', function ($parse, Upload) { | ||
return { | ||
restrict: 'AE', | ||
link: function (scope, elem, attr) { | ||
fileToSrc(Upload, scope, $parse, attr, attr.ngfDataUrl, attr.ngfDefaultDataUrl); | ||
} | ||
}; | ||
}]); | ||
})(); |
@@ -1,2 +0,2 @@ | ||
/*! 5.0.9 */ | ||
!window.XMLHttpRequest||window.FileAPI&&FileAPI.shouldLoad||(window.XMLHttpRequest.prototype.setRequestHeader=function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}}(window.XMLHttpRequest.prototype.setRequestHeader));var ngFileUpload=angular.module("ngFileUpload",[]);ngFileUpload.version="5.0.9",ngFileUpload.service("Upload",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{};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.progressFunc&&c(function(){f.progressFunc(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(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.progressFunc=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){function b(c,d,e){if(void 0!==d)if(angular.isDate(d)&&(d=d.toISOString()),angular.isString(d))c.append(e,d);else if("form"===a.sendFieldsAs)if(angular.isObject(d))for(var f in d)d.hasOwnProperty(f)&&b(c,d[f],e+"["+f+"]");else c.append(e,d);else d=angular.isString(d)?d:JSON.stringify(d),"json-blob"===a.sendFieldsAs?c.append(e,new Blob([d],{type:"application/json"})):c.append(e,d)}return a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?angular.isArray(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(c){var d,e=new FormData,f={};for(d in a.fields)a.fields.hasOwnProperty(d)&&(f[d]=a.fields[d]);c&&(f.data=c);for(d in f)if(f.hasOwnProperty(d)){var g=f[d];a.formDataAppender?a.formDataAppender(e,d,g):b(e,g,d)}if(null!=a.file){var h=a.fileFormDataName||"file";if(angular.isArray(a.file))for(var i=angular.isString(h),j=0;j<a.file.length;j++)e.append(i?h:h[j],a.file[j],a.fileName&&a.fileName[j]||a.file[j].name);else e.append(h,a.file,a.fileName||a.file.name)}return e}),d(a)},this.http=function(b){return b.transformRequest=b.transformRequest||function(b){return window.ArrayBuffer&&b instanceof window.ArrayBuffer||b instanceof Blob?b:a.defaults.transformRequest[0](arguments)},d(b)}}]),function(){function a(a,e,f,g,h,i,j){function k(){return"input"===e[0].tagName.toLowerCase()&&f.type&&"file"===f.type.toLowerCase()}function l(b){if(!r){r=!0;try{for(var e=b.__files_||b.target&&b.target.files,j=[],k=[],l=0;l<e.length;l++){var m=e.item(l);c(a,h,f,m,b)?j.push(m):k.push(m)}d(h,i,a,g,f,f.ngfChange||f.ngfSelect,j,k,b),0===j.length&&(b.target.value=j)}finally{r=!1}}}function m(b){f.ngfMultiple&&b.attr("multiple",h(f.ngfMultiple)(a)),f.ngfCapture&&b.attr("capture",h(f.ngfCapture)(a)),f.accept&&b.attr("accept",f.accept);for(var c=0;c<e[0].attributes.length;c++){var d=e[0].attributes[c];(k()&&"type"!==d.name||"type"!==d.name&&"class"!==d.name&&"id"!==d.name&&"style"!==d.name)&&b.attr(d.name,d.value)}}function n(b,c){if(!c&&(b||k()))return e.$$ngfRefElem||e;var d=angular.element('<input type="file">');return m(d),k()?(e.replaceWith(d),e=d,d.attr("__ngf_gen__",!0),j(e)(a)):(d.css("visibility","hidden").css("position","absolute").css("overflow","hidden").css("width","0px").css("height","0px").css("z-index","-100000").css("border","none").css("margin","0px").css("padding","0px").attr("tabindex","-1"),e.$$ngfRefElem&&e.$$ngfRefElem.remove(),e.$$ngfRefElem=d,document.body.appendChild(d[0])),d}function o(b){d(h,i,a,g,f,f.ngfChange||f.ngfSelect,[],[],b,!0)}function p(c){function d(a){a&&i[0].click(),(k()||!a)&&e.bind("click touchend",p)}if(e.attr("disabled")||q)return!1;null!=c&&(c.preventDefault(),c.stopPropagation());var g=h(f.ngfResetOnClick)(a)!==!1,i=n(c,g);return i&&((!c||g)&&i.bind("change",l),c&&g&&h(f.ngfResetModelOnClick)(a)!==!1&&o(c),b(navigator.userAgent)?setTimeout(function(){d(c)},0):d(c)),!1}if(!e.attr("__ngf_gen__")){a.$on("$destroy",function(){e.$$ngfRefElem&&e.$$ngfRefElem.remove()});var q=!1;-1===f.ngfSelect.search(/\W+$files\W+/)&&a.$watch(f.ngfSelect,function(a){q=a===!1});var r=!1;window.FileAPI&&window.FileAPI.ngfFixIE?window.FileAPI.ngfFixIE(e,n,m,l):p()}}function b(a){var b=a.match(/Android[^\d]*(\d+)\.(\d+)/);return b&&b.length>2?parseInt(b[1])<4||4===parseInt(b[1])&&parseInt(b[2])<4:/.*Windows.*Safari.*/.test(a)}ngFileUpload.directive("ngfSelect",["$parse","$timeout","$compile",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.validate=function(a,b,c,d,e){function f(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+="("+f(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}var g=b(c.ngfAccept)(a,{$file:d,$event:e}),h=b(c.ngfMaxSize)(a,{$file:d,$event:e})||9007199254740991,i=b(c.ngfMinSize)(a,{$file:d,$event:e})||-1;if(null!=g&&angular.isString(g)){var j=new RegExp(f(g),"gi");g=null!=d.type&&j.test(d.type.toLowerCase())||null!=d.name&&j.test(d.name.toLowerCase())}return(null==g||g)&&(null==d.size||d.size<h&&d.size>i)},ngFileUpload.updateModel=function(a,b,c,d,e,f,g,h,i,j){function k(){if(a(e.ngfKeep)(c)===!0){var j=(d.$modelValue||[]).slice(0);if(g&&g.length)if(a(e.ngfKeepDistinct)(c)===!0){for(var k=j.length,l=0;l<g.length;l++){for(var m=0;k>m&&g[l].name!==j[m].name;m++);m===k&&j.push(g[l])}g=j}else g=j.concat(g);else g=j}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})}j?k():b(function(){k()})};var c=ngFileUpload.validate,d=ngFileUpload.updateModel}(),function(){function a(a,e,f,g,h,i,j){function k(a,b,d){var e=!0,f=d.dataTransfer.items;if(null!=f)for(var g=0;g<f.length&&e;g++)e=e&&("file"===f[g].kind||""===f[g].kind)&&c(a,h,b,f[g],d);var i=h(b.ngfDragOverClass)(a,{$event:d});return i&&(i.delay&&(r=i.delay),i.accept&&(i=e?i.accept:i.reject)),i||b.ngfDragOverClass||"dragover"}function l(b,d,e,g){function k(d){c(a,h,f,d,b)?m.push(d):n.push(d)}function l(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;k({name:b.name,type:"directory",path:d});var e=b.createReader(),f=[];p++;var g=function(){e.readEntries(function(d){try{if(d.length)f=f.concat(Array.prototype.slice.call(d||[],0)),g();else{for(var e=0;e<f.length;e++)l(a,f[e],(c?c:"")+b.name+"/");p--}}catch(h){p--,console.error(h)}},function(){p--})};g()}else p++,b.file(function(a){try{p--,a.path=(c?c:"")+a.name,k(a)}catch(b){p--,console.error(b)}},function(){p--})}var m=[],n=[],o=b.dataTransfer.items,p=0;if(o&&o.length>0&&"file"!==j.protocol())for(var q=0;q<o.length;q++){if(o[q].webkitGetAsEntry&&o[q].webkitGetAsEntry()&&o[q].webkitGetAsEntry().isDirectory){var r=o[q].webkitGetAsEntry();if(r.isDirectory&&!e)continue;null!=r&&l(m,r)}else{var s=o[q].getAsFile();null!=s&&k(s)}if(!g&&m.length>0)break}else{var t=b.dataTransfer.files;if(null!=t)for(var u=0;u<t.length&&(k(t.item(u)),g||!(m.length>0));u++);}var v=0;!function w(a){i(function(){if(p)10*v++<2e4&&w(10);else{if(!g&&m.length>1){for(q=0;"directory"===m[q].type;)q++;m=[m[q]]}d(m,n)}},a||0)}()}var m=b();if(f.dropAvailable&&i(function(){a[f.dropAvailable]?a[f.dropAvailable].value=m:a[f.dropAvailable]=m}),!m)return void(h(f.ngfHideOnDropNotAvailable)(a)===!0&&e.css("display","none"));var n=!1;-1===f.ngfDrop.search(/\W+$files\W+/)&&a.$watch(f.ngfDrop,function(a){n=a===!1});var o,p=null,q=h(f.ngfStopPropagation),r=1;e[0].addEventListener("dragover",function(b){if(!e.attr("disabled")&&!n){if(b.preventDefault(),q(a)&&b.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var c=b.dataTransfer.effectAllowed;b.dataTransfer.dropEffect="move"===c||"linkMove"===c?"move":"copy"}i.cancel(p),a.actualDragOverClass||(o=k(a,f,b)),e.addClass(o)}},!1),e[0].addEventListener("dragenter",function(b){e.attr("disabled")||n||(b.preventDefault(),q(a)&&b.stopPropagation())},!1),e[0].addEventListener("dragleave",function(){e.attr("disabled")||n||(p=i(function(){e.removeClass(o),o=null},r||1))},!1),e[0].addEventListener("drop",function(b){e.attr("disabled")||n||(b.preventDefault(),q(a)&&b.stopPropagation(),e.removeClass(o),o=null,l(b,function(c,e){d(h,i,a,g,f,f.ngfChange||f.ngfDrop,c,e,b)},h(f.ngfAllowDir)(a)!==!1,f.multiple||h(f.ngfMultiple)(a)))},!1)}function b(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}var c=ngFileUpload.validate,d=ngFileUpload.updateModel;ngFileUpload.directive("ngfDrop",["$parse","$timeout","$location",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.directive("ngfNoFileDrop",function(){return function(a,c){b()&&c.css("display","none")}}),ngFileUpload.directive("ngfDropAvailable",["$parse","$timeout",function(a,c){return function(d,e,f){if(b()){var g=a(f.ngfDropAvailable);c(function(){g(d),g.assign&&g.assign(d,!0)})}}}]),ngFileUpload.directive("ngfSrc",["$parse","$timeout",function(a,b){return{restrict:"AE",link:function(d,e,f){window.FileReader&&d.$watch(f.ngfSrc,function(g){g&&c(d,a,f,g,null)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 8")||g.size<2e4)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 9")||g.size<4e6)?b(function(){var a=window.URL||window.webkitURL;if(a&&a.createObjectURL)e.attr("src",a.createObjectURL(g));else{var c=new FileReader;c.readAsDataURL(g),c.onload=function(a){b(function(){e.attr("src",a.target.result)})}}}):e.attr("src",f.ngfDefaultSrc||"")})}}}])}(); | ||
/*! 5.1.0 */ | ||
!window.XMLHttpRequest||window.FileAPI&&FileAPI.shouldLoad||(window.XMLHttpRequest.prototype.setRequestHeader=function(a){return function(b,c){if("__setXHR_"===b){var d=c(this);d instanceof Function&&d(this)}else a.apply(this,arguments)}}(window.XMLHttpRequest.prototype.setRequestHeader));var ngFileUpload=angular.module("ngFileUpload",[]);ngFileUpload.version="5.1.0",ngFileUpload.defaults={},ngFileUpload.service("Upload",["$http","$q","$timeout",function(a,b,c){function d(d){d.method=d.method||"POST",d.headers=d.headers||{};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.progressFunc&&c(function(){f.progressFunc(a)})},!1),a.upload.addEventListener("load",function(a){a.lengthComputable&&(a.config=d,e.notify?e.notify(a):f.progressFunc&&c(function(){f.progressFunc(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.progressFunc=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){function b(c,d,e){if(void 0!==d)if(angular.isDate(d)&&(d=d.toISOString()),angular.isString(d))c.append(e,d);else if("form"===a.sendFieldsAs)if(angular.isObject(d))for(var f in d)d.hasOwnProperty(f)&&b(c,d[f],e+"["+f+"]");else c.append(e,d);else d=angular.isString(d)?d:JSON.stringify(d),"json-blob"===a.sendFieldsAs?c.append(e,new Blob([d],{type:"application/json"})):c.append(e,d)}return a.headers=a.headers||{},a.headers["Content-Type"]=void 0,a.transformRequest=a.transformRequest?angular.isArray(a.transformRequest)?a.transformRequest:[a.transformRequest]:[],a.transformRequest.push(function(c){var d,e=new FormData,f={};for(d in a.fields)a.fields.hasOwnProperty(d)&&(f[d]=a.fields[d]);c&&(f.data=c);for(d in f)if(f.hasOwnProperty(d)){var g=f[d];a.formDataAppender?a.formDataAppender(e,d,g):b(e,g,d)}if(null!=a.file){var h=a.fileFormDataName||"file";if(angular.isArray(a.file))for(var i=angular.isString(h),j=0;j<a.file.length;j++)e.append(i?h:h[j],a.file[j],a.fileName&&a.fileName[j]||a.file[j].name);else e.append(h,a.file,a.fileName||a.file.name)}return e}),d(a)},this.http=function(b){return b.transformRequest=b.transformRequest||function(b){return window.ArrayBuffer&&b instanceof window.ArrayBuffer||b instanceof Blob?b:a.defaults.transformRequest[0](arguments)},d(b)},this.dataUrl=function(a,b,d){window.FileReader&&a&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 8")||a.size<2e4)&&(!window.FileAPI||-1===navigator.userAgent.indexOf("MSIE 9")||a.size<4e6)?c(function(){var e=window.URL||window.webkitURL;if(e&&e.createObjectURL&&!d)b(e.createObjectURL(a));else{var f=new FileReader;f.readAsDataURL(a),f.onload=function(a){c(function(){b(a.target.result)})}}}):b(null)},this.setDefaults=function(a){ngFileUpload.defaults=a||{}}}]),function(){function a(a,f,g,h,i,j,k){function l(){return"input"===f[0].tagName.toLowerCase()&&g.type&&"file"===g.type.toLowerCase()}function m(b){if(!s){s=!0;try{for(var f=b.__files_||b.target&&b.target.files,k=[],l=[],m=0;m<f.length;m++){var n=f.item(m);d(a,i,g,n,b)?k.push(n):l.push(n)}e(i,j,a,h,g,c(g,"ngfChange")||c(g,"ngfSelect"),k,l,b),0===k.length&&(b.target.value=k)}finally{s=!1}}}function n(b){c(g,"ngfMultiple")&&b.attr("multiple",i(c(g,"ngfMultiple"))(a)),c(g,"ngfCapture")&&b.attr("capture",i(c(g,"ngfCapture"))(a)),c(g,"accept")&&b.attr("accept",c(g,"accept"));for(var d=0;d<f[0].attributes.length;d++){var e=f[0].attributes[d];(l()&&"type"!==e.name||"type"!==e.name&&"class"!==e.name&&"id"!==e.name&&"style"!==e.name)&&b.attr(e.name,e.value)}}function o(b,c){if(!c&&(b||l()))return f.$$ngfRefElem||f;var d=angular.element('<input type="file">');return n(d),l()?(f.replaceWith(d),f=d,d.attr("__ngf_gen__",!0),k(f)(a)):(d.css("visibility","hidden").css("position","absolute").css("overflow","hidden").css("width","0px").css("height","0px").css("z-index","-100000").css("border","none").css("margin","0px").css("padding","0px").attr("tabindex","-1"),f.$$ngfRefElem&&f.$$ngfRefElem.remove(),f.$$ngfRefElem=d,document.body.appendChild(d[0])),d}function p(b){e(i,j,a,h,g,c(g,"ngfChange")||c(g,"ngfSelect"),[],[],b,!0)}function q(d){function e(a){a&&a.clientY>0&&k[0].click(),!l()&&a||!j||f.bind("click touchend touchstart",q)}if(f.attr("disabled")||r)return!1;if(null!=d){if("touchstart"===d.type)return t=d.originalEvent.touches[0].clientY,!0;if(d.stopPropagation(),d.preventDefault(),"touchend"===d.type){var h=d.originalEvent.changedTouches[0].clientY;if(Math.abs(h-t)>20)return!1}}var j=i(c(g,"ngfResetOnClick"))(a)!==!1,k=o(d,j);return k&&((!d||j)&&k.bind("change",m),d&&j&&i(c(g,"ngfResetModelOnClick"))(a)!==!1&&p(d),b(navigator.userAgent)?setTimeout(function(){e(d)},0):e(d)),!1}if(!f.attr("__ngf_gen__")){a.$on("$destroy",function(){f.$$ngfRefElem&&f.$$ngfRefElem.remove()});var r=!1;-1===c(g,"ngfSelect").search(/\W+$files\W+/)&&a.$watch(c(g,"ngfSelect"),function(a){r=a===!1});var s=!1,t=0;window.FileAPI&&window.FileAPI.ngfFixIE?window.FileAPI.ngfFixIE(f,o,n,m):q()}}function b(a){var b=a.match(/Android[^\d]*(\d+)\.(\d+)/);if(b&&b.length>2){var c=ngFileUpload.defaults.androidFixMinorVersion||4;return parseInt(b[1])<4||parseInt(b[1])===c&&parseInt(b[2])<c}return-1===a.indexOf("Chrome")&&/.*Windows.*Safari.*/.test(a)}ngFileUpload.getAttrWithDefaults=function(a,b){return null!=a[b]?a[b]:null==ngFileUpload.defaults[b]?ngFileUpload.defaults[b]:ngFileUpload.defaults[b].toString()};var c=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfSelect",["$parse","$timeout","$compile",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.validate=function(a,b,d,e,f){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(var d=0;d<b.length;d++)c+="("+g(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}if(null==e)return!1;var h=b(c(d,"ngfAccept"))(a,{$file:e,$event:f}),i=b(c(d,"ngfMaxSize"))(a,{$file:e,$event:f})||9007199254740991,j=b(c(d,"ngfMinSize"))(a,{$file:e,$event:f})||-1;if(null!=h&&angular.isString(h)){var k=new RegExp(g(h),"gi");if(h=null!=e.type&&k.test(e.type.toLowerCase())||null!=e.name&&k.test(e.name.toLowerCase()),!h)return e.$error="accept",!1}else if(h===!1)return e.$error="accept",!1;return null==e.size?!0:e.size>i?(e.$error="maxSize",!1):e.size<j?(e.$error="minSize",!1):!0},ngFileUpload.updateModel=function(a,b,d,e,f,g,h,i,j,k){function l(){if(a(c(f,"ngfKeep"))(d)===!0){var k=(e.$modelValue||[]).slice(0);if(h&&h.length)if(a(c(f,"ngfKeepDistinct"))(d)===!0){for(var l=k.length,m=0;m<h.length;m++){for(var n=0;l>n&&h[m].name!==k[n].name;n++);n===l&&k.push(h[m])}h=k}else h=k.concat(h);else h=k}e&&(a(c(f,"ngModel")).assign(d,h),b(function(){e&&e.$setViewValue(null!=h&&0===h.length?null:h)})),c(f,"ngModelRejected")&&a(c(f,"ngModelRejected")).assign(d,i),g&&a(g)(d,{$files:h,$rejectedFiles:i,$event:j})}k?l():b(function(){l()})};var d=ngFileUpload.validate,e=ngFileUpload.updateModel}(),function(){function a(a,f,g,h,i,j,k){function l(a,b,d){var f=!0,g=d.dataTransfer.items;if(null!=g)for(var h=0;h<g.length&&f;h++)f=f&&("file"===g[h].kind||""===g[h].kind)&&c(a,i,b,g[h],d);var j=i(e(b,"ngfDragOverClass"))(a,{$event:d});return j&&(j.delay&&(s=j.delay),j.accept&&(j=f?j.accept:j.reject)),j||e(b,"ngfDragOverClass")||"dragover"}function m(b,d,e,f){function h(d){c(a,i,g,d,b)?m.push(d):n.push(d)}function l(a,b,c){if(null!=b)if(b.isDirectory){var d=(c||"")+b.name;h({name:b.name,type:"directory",path:d});var e=b.createReader(),f=[];p++;var g=function(){e.readEntries(function(d){try{if(d.length)f=f.concat(Array.prototype.slice.call(d||[],0)),g();else{for(var e=0;e<f.length;e++)l(a,f[e],(c?c:"")+b.name+"/");p--}}catch(h){p--,console.error(h)}},function(){p--})};g()}else p++,b.file(function(a){try{p--,a.path=(c?c:"")+a.name,h(a)}catch(b){p--,console.error(b)}},function(){p--})}var m=[],n=[],o=b.dataTransfer.items,p=0;if(o&&o.length>0&&"file"!==k.protocol())for(var q=0;q<o.length;q++){if(o[q].webkitGetAsEntry&&o[q].webkitGetAsEntry()&&o[q].webkitGetAsEntry().isDirectory){var r=o[q].webkitGetAsEntry();if(r.isDirectory&&!e)continue;null!=r&&l(m,r)}else{var s=o[q].getAsFile();null!=s&&h(s)}if(!f&&m.length>0)break}else{var t=b.dataTransfer.files;if(null!=t)for(var u=0;u<t.length&&(h(t.item(u)),f||!(m.length>0));u++);}var v=0;!function w(a){j(function(){if(p)10*v++<2e4&&w(10);else{if(!f&&m.length>1){for(q=0;"directory"===m[q].type;)q++;m=[m[q]]}d(m,n)}},a||0)}()}var n=b();if(e(g,"dropAvailable")&&j(function(){a[e(g,"dropAvailable")]?a[e(g,"dropAvailable")].value=n:a[e(g,"dropAvailable")]=n}),!n)return void(i(e(g,"ngfHideOnDropNotAvailable"))(a)===!0&&f.css("display","none"));var o=!1;-1===e(g,"ngfDrop").search(/\W+$files\W+/)&&a.$watch(e(g,"ngfDrop"),function(a){o=a===!1});var p,q=null,r=i(e(g,"ngfStopPropagation")),s=1;f[0].addEventListener("dragover",function(b){if(!f.attr("disabled")&&!o){if(b.preventDefault(),r(a)&&b.stopPropagation(),navigator.userAgent.indexOf("Chrome")>-1){var c=b.dataTransfer.effectAllowed;b.dataTransfer.dropEffect="move"===c||"linkMove"===c?"move":"copy"}j.cancel(q),a.actualDragOverClass||(p=l(a,g,b)),f.addClass(p)}},!1),f[0].addEventListener("dragenter",function(b){f.attr("disabled")||o||(b.preventDefault(),r(a)&&b.stopPropagation())},!1),f[0].addEventListener("dragleave",function(){f.attr("disabled")||o||(q=j(function(){f.removeClass(p),p=null},s||1))},!1),f[0].addEventListener("drop",function(b){f.attr("disabled")||o||(b.preventDefault(),r(a)&&b.stopPropagation(),f.removeClass(p),p=null,m(b,function(c,f){d(i,j,a,h,g,e(g,"ngfChange")||e(g,"ngfDrop"),c,f,b)},i(e(g,"ngfAllowDir"))(a)!==!1,e(g,"multiple")||i(e(g,"ngfMultiple"))(a)))},!1)}function b(){var a=document.createElement("div");return"draggable"in a&&"ondrop"in a}var c=ngFileUpload.validate,d=ngFileUpload.updateModel,e=ngFileUpload.getAttrWithDefaults;ngFileUpload.directive("ngfDrop",["$parse","$timeout","$location",function(b,c,d){return{restrict:"AEC",require:"?ngModel",link:function(e,f,g,h){a(e,f,g,h,b,c,d)}}}]),ngFileUpload.directive("ngfNoFileDrop",function(){return function(a,c){b()&&c.css("display","none")}}),ngFileUpload.directive("ngfDropAvailable",["$parse","$timeout",function(a,c){return function(d,f,g){if(b()){var h=a(e(g,"ngfDropAvailable"));c(function(){h(d),h.assign&&h.assign(d,!0)})}}}])}(),function(){function a(a,b,c,d,e,f,g){b.$watch(e,function(e){window.FileReader&&ngFileUpload.validate(b,c,d,e,null)&&a.dataUrl(e,function(a){g?g(a):e.dataUrl=a||c(f)(b)},c(d.ngfNoObjectUrl)(b))})}ngFileUpload.directive("ngfSrc",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfSrc,f.ngfDefaultSrc,function(a){e.attr("src",a)})}}}]),ngFileUpload.directive("ngfBackground",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfBackground,f.ngfDefaultBackground,function(a){e.css("background-image","url("+a+")")})}}}]),ngFileUpload.directive("ngfDataUrl",["$parse","Upload",function(b,c){return{restrict:"AE",link:function(d,e,f){a(c,d,b,f,f.ngfDataUrl,f.ngfDefaultDataUrl)}}}])}(); |
@@ -17,3 +17,3 @@ 'use strict'; | ||
files: { | ||
'dist/ng-file-upload.js': ['src/upload.js', 'src/select.js', 'src/drop.js'], | ||
'dist/ng-file-upload.js': ['src/upload.js', 'src/select.js', 'src/drop.js', 'src/data-url.js'], | ||
'dist/ng-file-upload-shim.js': ['src/shim-upload.js', 'src/shim-elem.js', 'src/shim-filereader.js'], | ||
@@ -20,0 +20,0 @@ 'dist/ng-file-upload-all.js': ['dist/ng-file-upload-shim.js', 'dist/ng-file-upload.js'] |
{ | ||
"name": "ng-file-upload", | ||
"version": "5.0.9", | ||
"version": "5.1.0", | ||
"devDependencies": { | ||
@@ -5,0 +5,0 @@ "grunt": "^0.4.5", |
ng-file-upload | ||
=================== | ||
Lightweight Angular JS directive to upload files.<br/><br/>**Here is the <a href="https://angular-file-upload.appspot.com/" target="_blank">DEMO</a> page**.<br/> | ||
Lightweight Angular JS directive to upload files. | ||
**Here is the <a href="https://angular-file-upload.appspot.com/" target="_blank">DEMO</a> page**.<br/> | ||
**Migration notes**: [version 3.0.0](https://github.com/danialfarid/ng-file-upload/releases/tag/3.0.0) [version 3.1.0](https://github.com/danialfarid/ng-file-upload/releases/tag/3.1.0) [version 3.2.0](https://github.com/danialfarid/ng-file-upload/releases/tag/3.2.3) [version 4.0.0](https://github.com/danialfarid/ng-file-upload/releases/tag/4.0.0) [version 5.0.0](https://github.com/danialfarid/ng-file-upload/releases/tag/5.0.0) | ||
For questions, bug reports, and feature request please search through existing [issue](https://github.com/danialfarid/ng-file-upload/issues) first then open a new one [here](https://github.com/danialfarid/ng-file-upload/issues/new). If you need support send me an [email](mailto:danial.farid@gmail.com) to set up sessions through [HackHands](https://hackhands.com/). You can also contact [me](https://github.com/danialfarid) for other concerns. | ||
If you like this plugin give it a thumbs up at [ngmodules](http://ngmodules.org/modules/angular-file-upload) or get me a <a target="_blank" href="https://angular-file-upload.appspot.com/donate.html">cup of tea <img src="https://angular-file-upload.appspot.com/img/tea.png" width="40" height="24" title="Icon made by Freepik.com"></a>. | ||
Table of Content: | ||
@@ -17,3 +23,2 @@ * [Features](#features) | ||
* [Install](#install) ([Manual](#manual), [Bower](#bower), [Yeoman](#yeoman), [NuGet](#nuget), [npm](#npm)) | ||
* [Questions, Issues and Contribution](#contrib) | ||
@@ -30,3 +35,3 @@ ##<a name="features"></a> Features | ||
###Sample: | ||
[jsfiddle http://jsfiddle.net/3t50b3fw/](http://jsfiddle.net/3t50b3fw/) | ||
[jsfiddle http://jsfiddle.net/18yao91v/](http://jsfiddle.net/18yao91v/) | ||
```html | ||
@@ -76,3 +81,5 @@ <script src="angular.min.js"></script> | ||
console.log('file ' + config.file.name + 'uploaded. Response: ' + data); | ||
}); | ||
}).error(function (data, status, headers, config) { | ||
console.log('error status: ' + status); | ||
}) | ||
} | ||
@@ -93,2 +100,3 @@ } | ||
ng-model-rejected="rejFiles" // bind to dropped files that do not match the accept wildcard | ||
ng-disable="selectDisabled" // bind to a boolean value that triggers deactivation of the file select | ||
ngf-change="fileSelected($files, $event)" // called when files are selected or removed | ||
@@ -114,2 +122,3 @@ ngf-multiple="true" or "false" // default false, allows selecting multiple files | ||
ng-model-rejected="rejFiles" // bind to dropped files that do not match the accept wildcard | ||
ng-disable="dropDisabled" // bind to a boolean value that triggers deactivation of the file drop | ||
ngf-change="fileDropped($files, $event, $rejectedFiles)" //called when files being dropped | ||
@@ -180,9 +189,13 @@ ngf-multiple="true" or "false" // default false, allows selecting multiple files. | ||
console.log('file ' + config.file.name + 'is uploaded successfully. Response: ' + data); | ||
}).error(... | ||
/* access or attach event listeners to the underlying XMLHttpRequest */ | ||
}).xhr(function(xhr){xhr.upload.addEventListener(...) | ||
/* return $http promise then(). Note that this promise does NOT have progress/abort/xhr functions */ | ||
}).error(function(data, status, headers, config) { | ||
// handle error | ||
}).xhr(function(xhr){ | ||
//access or attach event listeners to the underlying XMLHttpRequest | ||
xhr.upload.addEventListener(...) | ||
}); | ||
/* then promise (note that returned promise doesn't have progress, xhr and cancel functions. */ | ||
/* return $http promise then,catch or finally. | ||
Note that this promise does NOT have progress, abort or xhr functions */ | ||
var promise = upload.then(success, error, progress); | ||
upload.catch(errorCallback); | ||
upload.finally(callback, notifyCallback); | ||
@@ -219,3 +232,3 @@ /* cancel/abort the upload in progress. */ | ||
By default since there is no cross-browser way to detect cancel on the file popup everytime you click on the file select it would create a new element and click on that and the model value will be reset to empty. This would also allow selecting the same file again which normally will not trigger a change event. | ||
Setting this to false would not create a new element, and browsers will behave differently when the user cancels the popup, for example for chrome you would recieve a change event with empty files but in FireFox there will be no event fired. This could be helpful in some rare cases or for testing when you want to keep the original elements without replacing them. Setting ngf-reset-model-on-click will not reset the model when you click on the file select, that would make reseting model when the user cancels the select popup impossible in some browsers. | ||
Setting this to false would not create a new element, and browsers will behave differently when the user cancels the popup, for example for chrome you would receive a change event with empty files but in FireFox there will be no event fired. This could be helpful in some rare cases or for testing when you want to keep the original elements without replacing them. Setting ngf-reset-model-on-click will not reset the model when you click on the file select, that would make reseting model when the user cancels the select popup impossible in some browsers. | ||
@@ -290,4 +303,3 @@ ##<a name="old_browsers"></a> Old browsers | ||
``` | ||
This article explain more about these fields: see [http://aws.amazon.com/articles/1434/](http://aws.amazon.com/articles/1434/) | ||
To generate the policy and signature you need a server side tool as described [this](http://aws.amazon.com/articles/1434/) article. | ||
[This article](http://aws.amazon.com/articles/1434/) explains more about these fields and provides instructions on how to generate the policy and signature using a server side tool. | ||
These two values are generated from the json policy document which looks like this: | ||
@@ -306,3 +318,3 @@ ``` | ||
``` | ||
The [demo](https://angular-file-upload.appspot.com/) page provide a helper tool to generate the policy and signature from you from the json policy document. **Note**: Please use https protocol to access demo page if you are using this tool to genenrate signature and policy to protect your aws secret key which should never be shared. | ||
The [demo](https://angular-file-upload.appspot.com/) page provide a helper tool to generate the policy and signature from you from the json policy document. **Note**: Please use https protocol to access demo page if you are using this tool to generate signature and policy to protect your aws secret key which should never be shared. | ||
@@ -353,3 +365,3 @@ Make sure that you provide upload and CORS post to your bucket at AWS -> S3 -> bucket name -> Properties -> Edit bucket policy and Edit CORS Configuration. Samples of these two files: | ||
If you have Node.js there is a separate github project created by [Nukul Bhasin](https://github.com/nukulb) as an example using this plugin here: [https://github.com/nukulb/s3-angular-file-upload](https://github.com/nukulb/s3-angular-file-upload) | ||
You can also have a look at [https://github.com/nukulb/s3-angular-file-upload](https://github.com/nukulb/s3-angular-file-upload) for another example with [this](https://github.com/danialfarid/ng-file-upload/issues/814#issuecomment-112198426) fix. | ||
@@ -410,10 +422,4 @@ ##<a name="cors"></a>CORS | ||
##<a name="contrib"></a> Issues & Contribution | ||
For questions, bug reports, and feature request please search through existing [issue](https://github.com/danialfarid/ng-file-upload/issues) and if you don't find and answer open a new one [here](https://github.com/danialfarid/ng-file-upload/issues/new). If you need support send me an [email](mailto:danial.farid@gmail.com) to set up a session through [HackHands](https://hackhands.com/). You can also contact [me](https://github.com/danialfarid) for any non public concerns. | ||
To help with the development of this module give it a thumbs up at [ngmodules](http://ngmodules.org/modules/angular-file-upload) or get me a <a target="_blank" href="https://angular-file-upload.appspot.com/donate.html">cup of tea <img src="https://angular-file-upload.appspot.com/img/tea.png" width="40" height="24" title="Icon made by Freepik.com"></a>. | ||
(function () { | ||
var validate = ngFileUpload.validate; | ||
var updateModel = ngFileUpload.updateModel; | ||
var getAttr = ngFileUpload.getAttrWithDefaults; | ||
@@ -24,3 +25,3 @@ ngFileUpload.directive('ngfDrop', ['$parse', '$timeout', '$location', function ($parse, $timeout, $location) { | ||
if (dropAvailable()) { | ||
var fn = $parse(attr.ngfDropAvailable); | ||
var fn = $parse(getAttr(attr, 'ngfDropAvailable')); | ||
$timeout(function () { | ||
@@ -38,8 +39,8 @@ fn(scope); | ||
var available = dropAvailable(); | ||
if (attr.dropAvailable) { | ||
if (getAttr(attr, 'dropAvailable')) { | ||
$timeout(function () { | ||
if (scope[attr.dropAvailable]) { | ||
scope[attr.dropAvailable].value = available; | ||
if (scope[getAttr(attr, 'dropAvailable')]) { | ||
scope[getAttr(attr, 'dropAvailable')].value = available; | ||
} else { | ||
scope[attr.dropAvailable] = available; | ||
scope[getAttr(attr, 'dropAvailable')] = available; | ||
} | ||
@@ -49,3 +50,3 @@ }); | ||
if (!available) { | ||
if ($parse(attr.ngfHideOnDropNotAvailable)(scope) === true) { | ||
if ($parse(getAttr(attr, 'ngfHideOnDropNotAvailable'))(scope) === true) { | ||
elem.css('display', 'none'); | ||
@@ -57,4 +58,4 @@ } | ||
var disabled = false; | ||
if (attr.ngfDrop.search(/\W+$files\W+/) === -1) { | ||
scope.$watch(attr.ngfDrop, function(val) { | ||
if (getAttr(attr, 'ngfDrop').search(/\W+$files\W+/) === -1) { | ||
scope.$watch(getAttr(attr, 'ngfDrop'), function(val) { | ||
disabled = val === false; | ||
@@ -65,3 +66,3 @@ }); | ||
var leaveTimeout = null; | ||
var stopPropagation = $parse(attr.ngfStopPropagation); | ||
var stopPropagation = $parse(getAttr(attr, 'ngfStopPropagation')); | ||
var dragOverDelay = 1; | ||
@@ -105,4 +106,5 @@ var actualDragOverClass; | ||
updateModel($parse, $timeout, scope, ngModel, attr, | ||
attr.ngfChange || attr.ngfDrop, files, rejFiles, evt); | ||
}, $parse(attr.ngfAllowDir)(scope) !== false, attr.multiple || $parse(attr.ngfMultiple)(scope)); | ||
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfDrop'), files, rejFiles, evt); | ||
}, $parse(getAttr(attr, 'ngfAllowDir'))(scope) !== false, | ||
getAttr(attr, 'multiple') || $parse(getAttr(attr, 'ngfMultiple'))(scope)); | ||
}, false); | ||
@@ -120,3 +122,3 @@ | ||
} | ||
var clazz = $parse(attr.ngfDragOverClass)(scope, {$event: evt}); | ||
var clazz = $parse(getAttr(attr, 'ngfDragOverClass'))(scope, {$event: evt}); | ||
if (clazz) { | ||
@@ -126,3 +128,3 @@ if (clazz.delay) dragOverDelay = clazz.delay; | ||
} | ||
return clazz || attr.ngfDragOverClass || 'dragover'; | ||
return clazz || getAttr(attr, 'ngfDragOverClass') || 'dragover'; | ||
} | ||
@@ -235,37 +237,2 @@ | ||
ngFileUpload.directive('ngfSrc', ['$parse', '$timeout', function ($parse, $timeout) { | ||
return { | ||
restrict: 'AE', | ||
link: function (scope, elem, attr) { | ||
if (window.FileReader) { | ||
scope.$watch(attr.ngfSrc, function (file) { | ||
if (file && | ||
validate(scope, $parse, attr, file, null) && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) { | ||
$timeout(function () { | ||
//prefer URL.createObjectURL for handling refrences to files of all sizes | ||
//since it doesn´t build a large string in memory | ||
var URL = window.URL || window.webkitURL; | ||
if (URL && URL.createObjectURL) { | ||
elem.attr('src', URL.createObjectURL(file)); | ||
} else { | ||
var fileReader = new FileReader(); | ||
fileReader.readAsDataURL(file); | ||
fileReader.onload = function (e) { | ||
$timeout(function () { | ||
elem.attr('src', e.target.result); | ||
}); | ||
}; | ||
} | ||
}); | ||
} else { | ||
elem.attr('src', attr.ngfDefaultSrc || ''); | ||
} | ||
}); | ||
} | ||
} | ||
}; | ||
}]); | ||
function dropAvailable() { | ||
@@ -272,0 +239,0 @@ var div = document.createElement('div'); |
(function () { | ||
ngFileUpload.directive('ngfSelect', ['$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); | ||
} | ||
}; | ||
}]); | ||
ngFileUpload.getAttrWithDefaults = function(attr, name) { | ||
return attr[name] != null ? attr[name] : | ||
(ngFileUpload.defaults[name] == null ? | ||
ngFileUpload.defaults[name] : ngFileUpload.defaults[name].toString()); | ||
}; | ||
function linkFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile) { | ||
/** @namespace attr.ngfSelect */ | ||
/** @namespace attr.ngfChange */ | ||
/** @namespace attr.ngModel */ | ||
/** @namespace attr.ngModelRejected */ | ||
/** @namespace attr.ngfMultiple */ | ||
/** @namespace attr.ngfCapture */ | ||
/** @namespace attr.ngfAccept */ | ||
/** @namespace attr.ngfMaxSize */ | ||
/** @namespace attr.ngfMinSize */ | ||
/** @namespace attr.ngfResetOnClick */ | ||
/** @namespace attr.ngfResetModelOnClick */ | ||
/** @namespace attr.ngfKeep */ | ||
/** @namespace attr.ngfKeepDistinct */ | ||
var getAttr = ngFileUpload.getAttrWithDefaults; | ||
if (elem.attr('__ngf_gen__')) { | ||
return; | ||
ngFileUpload.directive('ngfSelect', ['$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); | ||
} | ||
}; | ||
}]); | ||
scope.$on('$destroy', function () { | ||
if (elem.$$ngfRefElem) elem.$$ngfRefElem.remove(); | ||
}); | ||
function linkFileSelect(scope, elem, attr, ngModel, $parse, $timeout, $compile) { | ||
/** @namespace attr.ngfSelect */ | ||
/** @namespace attr.ngfChange */ | ||
/** @namespace attr.ngModel */ | ||
/** @namespace attr.ngModelRejected */ | ||
/** @namespace attr.ngfMultiple */ | ||
/** @namespace attr.ngfCapture */ | ||
/** @namespace attr.ngfAccept */ | ||
/** @namespace attr.ngfMaxSize */ | ||
/** @namespace attr.ngfMinSize */ | ||
/** @namespace attr.ngfResetOnClick */ | ||
/** @namespace attr.ngfResetModelOnClick */ | ||
/** @namespace attr.ngfKeep */ | ||
/** @namespace attr.ngfKeepDistinct */ | ||
var disabled = false; | ||
if (attr.ngfSelect.search(/\W+$files\W+/) === -1) { | ||
scope.$watch(attr.ngfSelect, function (val) { | ||
disabled = val === false; | ||
}); | ||
} | ||
function isInputTypeFile() { | ||
return elem[0].tagName.toLowerCase() === 'input' && attr.type && attr.type.toLowerCase() === 'file'; | ||
} | ||
if (elem.attr('__ngf_gen__')) { | ||
return; | ||
} | ||
var isUpdating = false; | ||
scope.$on('$destroy', function () { | ||
if (elem.$$ngfRefElem) elem.$$ngfRefElem.remove(); | ||
}); | ||
function changeFn(evt) { | ||
if (!isUpdating) { | ||
isUpdating = true; | ||
try { | ||
var fileList = evt.__files_ || (evt.target && evt.target.files); | ||
var files = [], rejFiles = []; | ||
var disabled = false; | ||
if (getAttr(attr, 'ngfSelect').search(/\W+$files\W+/) === -1) { | ||
scope.$watch(getAttr(attr, 'ngfSelect'), function (val) { | ||
disabled = val === false; | ||
}); | ||
} | ||
function isInputTypeFile() { | ||
return elem[0].tagName.toLowerCase() === 'input' && attr.type && attr.type.toLowerCase() === 'file'; | ||
} | ||
for (var i = 0; i < fileList.length; i++) { | ||
var file = fileList.item(i); | ||
if (validate(scope, $parse, attr, file, evt)) { | ||
files.push(file); | ||
} else { | ||
rejFiles.push(file); | ||
} | ||
} | ||
updateModel($parse, $timeout, scope, ngModel, attr, attr.ngfChange || attr.ngfSelect, files, rejFiles, evt); | ||
if (files.length === 0) evt.target.value = files; | ||
var isUpdating = false; | ||
function changeFn(evt) { | ||
if (!isUpdating) { | ||
isUpdating = true; | ||
try { | ||
var fileList = evt.__files_ || (evt.target && evt.target.files); | ||
var files = [], rejFiles = []; | ||
for (var i = 0; i < fileList.length; i++) { | ||
var file = fileList.item(i); | ||
if (validate(scope, $parse, attr, file, evt)) { | ||
files.push(file); | ||
} else { | ||
rejFiles.push(file); | ||
} | ||
} | ||
updateModel($parse, $timeout, scope, ngModel, attr, | ||
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), files, rejFiles, evt); | ||
if (files.length === 0) evt.target.value = files; | ||
// if (evt.target && evt.target.getAttribute('__ngf_gen__')) { | ||
// angular.element(evt.target).remove(); | ||
// } | ||
} finally { | ||
isUpdating = false; | ||
} | ||
} | ||
} finally { | ||
isUpdating = false; | ||
} | ||
} | ||
} | ||
function bindAttrToFileInput(fileElem) { | ||
if (attr.ngfMultiple) fileElem.attr('multiple', $parse(attr.ngfMultiple)(scope)); | ||
if (attr.ngfCapture) fileElem.attr('capture', $parse(attr.ngfCapture)(scope)); | ||
if (attr.accept) fileElem.attr('accept', attr.accept); | ||
for (var i = 0; i < elem[0].attributes.length; i++) { | ||
var attribute = elem[0].attributes[i]; | ||
if ((isInputTypeFile() && attribute.name !== 'type') || | ||
(attribute.name !== 'type' && attribute.name !== 'class' && | ||
attribute.name !== 'id' && attribute.name !== 'style')) { | ||
fileElem.attr(attribute.name, attribute.value); | ||
} | ||
} | ||
function bindAttrToFileInput(fileElem) { | ||
if (getAttr(attr, 'ngfMultiple')) fileElem.attr('multiple', $parse(getAttr(attr, 'ngfMultiple'))(scope)); | ||
if (getAttr(attr, 'ngfCapture')) fileElem.attr('capture', $parse(getAttr(attr, 'ngfCapture'))(scope)); | ||
if (getAttr(attr, 'accept')) fileElem.attr('accept', getAttr(attr, 'accept')); | ||
for (var i = 0; i < elem[0].attributes.length; i++) { | ||
var attribute = elem[0].attributes[i]; | ||
if ((isInputTypeFile() && attribute.name !== 'type') || | ||
(attribute.name !== 'type' && attribute.name !== 'class' && | ||
attribute.name !== 'id' && attribute.name !== 'style')) { | ||
fileElem.attr(attribute.name, attribute.value); | ||
} | ||
} | ||
} | ||
function createFileInput(evt, resetOnClick) { | ||
if (!resetOnClick && (evt || isInputTypeFile())) return elem.$$ngfRefElem || elem; | ||
function createFileInput(evt, resetOnClick) { | ||
if (!resetOnClick && (evt || isInputTypeFile())) return elem.$$ngfRefElem || elem; | ||
var fileElem = angular.element('<input type="file">'); | ||
bindAttrToFileInput(fileElem); | ||
var fileElem = angular.element('<input type="file">'); | ||
bindAttrToFileInput(fileElem); | ||
if (isInputTypeFile()) { | ||
elem.replaceWith(fileElem); | ||
elem = fileElem; | ||
fileElem.attr('__ngf_gen__', true); | ||
$compile(elem)(scope); | ||
} else { | ||
fileElem.css('visibility', 'hidden').css('position', 'absolute').css('overflow', 'hidden') | ||
.css('width', '0px').css('height', '0px').css('z-index', '-100000').css('border', 'none') | ||
.css('margin', '0px').css('padding', '0px').attr('tabindex', '-1'); | ||
if (elem.$$ngfRefElem) { | ||
elem.$$ngfRefElem.remove(); | ||
} | ||
elem.$$ngfRefElem = fileElem; | ||
document.body.appendChild(fileElem[0]); | ||
} | ||
return fileElem; | ||
if (isInputTypeFile()) { | ||
elem.replaceWith(fileElem); | ||
elem = fileElem; | ||
fileElem.attr('__ngf_gen__', true); | ||
$compile(elem)(scope); | ||
} else { | ||
fileElem.css('visibility', 'hidden').css('position', 'absolute').css('overflow', 'hidden') | ||
.css('width', '0px').css('height', '0px').css('z-index', '-100000').css('border', 'none') | ||
.css('margin', '0px').css('padding', '0px').attr('tabindex', '-1'); | ||
if (elem.$$ngfRefElem) { | ||
elem.$$ngfRefElem.remove(); | ||
} | ||
elem.$$ngfRefElem = fileElem; | ||
document.body.appendChild(fileElem[0]); | ||
} | ||
function resetModel(evt) { | ||
updateModel($parse, $timeout, scope, ngModel, attr, attr.ngfChange || attr.ngfSelect, [], [], evt, true); | ||
} | ||
return fileElem; | ||
} | ||
function clickHandler(evt) { | ||
if (elem.attr('disabled') || disabled) return false; | ||
if (evt != null) { | ||
evt.preventDefault(); | ||
evt.stopPropagation(); | ||
} | ||
var resetOnClick = $parse(attr.ngfResetOnClick)(scope) !== false; | ||
var fileElem = createFileInput(evt, resetOnClick); | ||
function resetModel(evt) { | ||
updateModel($parse, $timeout, scope, ngModel, attr, | ||
getAttr(attr, 'ngfChange') || getAttr(attr, 'ngfSelect'), [], [], evt, true); | ||
} | ||
function clickAndAssign(evt) { | ||
if (evt) { | ||
fileElem[0].click(); | ||
} | ||
if (isInputTypeFile() || !evt) { | ||
elem.bind('click touchend', clickHandler); | ||
} | ||
} | ||
var initialTouchStartY = 0; | ||
if (fileElem) { | ||
if (!evt || resetOnClick) fileElem.bind('change', changeFn); | ||
if (evt && resetOnClick && $parse(attr.ngfResetModelOnClick)(scope) !== false) resetModel(evt); | ||
function clickHandler(evt) { | ||
if (elem.attr('disabled') || disabled) return false; | ||
// fix for android native browser < 4.4 | ||
if (shouldClickLater(navigator.userAgent)) { | ||
setTimeout(function () { | ||
clickAndAssign(evt); | ||
}, 0); | ||
} else { | ||
clickAndAssign(evt); | ||
} | ||
} | ||
return false; | ||
if (evt != null) { | ||
if (evt.type === 'touchstart') { | ||
initialTouchStartY = evt.originalEvent.touches[0].clientY; | ||
return true; // don't block event default | ||
} else { | ||
evt.stopPropagation(); | ||
evt.preventDefault(); | ||
// prevent scroll from triggering event | ||
if (evt.type === 'touchend') { | ||
var currentLocation = evt.originalEvent.changedTouches[0].clientY; | ||
if (Math.abs(currentLocation - initialTouchStartY) > 20) return false; | ||
} | ||
} | ||
} | ||
if (window.FileAPI && window.FileAPI.ngfFixIE) { | ||
window.FileAPI.ngfFixIE(elem, createFileInput, bindAttrToFileInput, changeFn); | ||
var resetOnClick = $parse(getAttr(attr, 'ngfResetOnClick'))(scope) !== false; | ||
var fileElem = createFileInput(evt, resetOnClick); | ||
function clickAndAssign(evt) { | ||
if (evt && evt.clientY > 0) { | ||
fileElem[0].click(); | ||
} | ||
if ((isInputTypeFile() || !evt) && resetOnClick) { | ||
elem.bind('click touchend touchstart', clickHandler); | ||
} | ||
} | ||
if (fileElem) { | ||
if (!evt || resetOnClick) fileElem.bind('change', changeFn); | ||
if (evt && resetOnClick && $parse(getAttr(attr, 'ngfResetModelOnClick'))(scope) !== false) { | ||
resetModel(evt); | ||
} | ||
// fix for android native browser < 4.4 | ||
if (shouldClickLater(navigator.userAgent)) { | ||
setTimeout(function () { | ||
clickAndAssign(evt); | ||
}, 0); | ||
} else { | ||
clickHandler(); | ||
//if (!isInputTypeFile()) { | ||
// elem.bind('click touchend', clickHandler); | ||
//} | ||
clickAndAssign(evt); | ||
} | ||
} | ||
return false; | ||
} | ||
function shouldClickLater(ua) { | ||
// android below 4.4 | ||
var m = ua.match(/Android[^\d]*(\d+)\.(\d+)/); | ||
if (m && m.length > 2) { | ||
return parseInt(m[1]) < 4 || (parseInt(m[1]) === 4 && parseInt(m[2]) < 4); | ||
} | ||
if (window.FileAPI && window.FileAPI.ngfFixIE) { | ||
window.FileAPI.ngfFixIE(elem, createFileInput, bindAttrToFileInput, changeFn); | ||
} else { | ||
clickHandler(); | ||
//if (!isInputTypeFile()) { | ||
// elem.bind('click touchend', clickHandler); | ||
//} | ||
} | ||
} | ||
// safari on windows | ||
return /.*Windows.*Safari.*/.test(ua); | ||
function shouldClickLater(ua) { | ||
// android below 4.4 | ||
var m = ua.match(/Android[^\d]*(\d+)\.(\d+)/); | ||
if (m && m.length > 2) { | ||
var v = ngFileUpload.defaults.androidFixMinorVersion || 4; | ||
return parseInt(m[1]) < 4 || (parseInt(m[1]) === v && parseInt(m[2]) < v); | ||
} | ||
ngFileUpload.validate = function (scope, $parse, attr, file, evt) { | ||
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; | ||
} | ||
// safari on windows | ||
return ua.indexOf('Chrome') === -1 && /.*Windows.*Safari.*/.test(ua); | ||
} | ||
var accept = $parse(attr.ngfAccept)(scope, {$file: file, $event: evt}); | ||
var fileSizeMax = $parse(attr.ngfMaxSize)(scope, {$file: file, $event: evt}) || 9007199254740991; | ||
var fileSizeMin = $parse(attr.ngfMinSize)(scope, {$file: file, $event: evt}) || -1; | ||
if (accept != null && angular.isString(accept)) { | ||
var regexp = new RegExp(globStringToRegex(accept), 'gi'); | ||
accept = (file.type != null && regexp.test(file.type.toLowerCase())) || | ||
(file.name != null && regexp.test(file.name.toLowerCase())); | ||
ngFileUpload.validate = function (scope, $parse, attr, file, evt) { | ||
if (file == null) { | ||
return false; | ||
} | ||
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 += '|'; | ||
} | ||
} | ||
return (accept == null || accept) && (file.size == null || (file.size < fileSizeMax && file.size > fileSizeMin)); | ||
}; | ||
} else { | ||
if (str.indexOf('.') === 0) { | ||
str = '*' + str; | ||
} | ||
result = '^' + str.replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + '-]', 'g'), '\\$&') + '$'; | ||
result = result.replace(/\\\*/g, '.*').replace(/\\\?/g, '.'); | ||
} | ||
return result; | ||
} | ||
ngFileUpload.updateModel = function ($parse, $timeout, scope, ngModel, attr, fileChange, | ||
files, rejFiles, evt, noDelay) { | ||
function update() { | ||
if ($parse(attr.ngfKeep)(scope) === true) { | ||
var prevFiles = (ngModel.$modelValue || []).slice(0); | ||
if (!files || !files.length) { | ||
files = prevFiles; | ||
} else if ($parse(attr.ngfKeepDistinct)(scope) === true) { | ||
var len = prevFiles.length; | ||
for (var i = 0; i < files.length; i++) { | ||
for (var j = 0; j < len; j++) { | ||
if (files[i].name === prevFiles[j].name) break; | ||
} | ||
if (j === len) { | ||
prevFiles.push(files[i]); | ||
} | ||
} | ||
files = prevFiles; | ||
} else { | ||
files = prevFiles.concat(files); | ||
} | ||
var accept = $parse(getAttr(attr, 'ngfAccept'))(scope, {$file: file, $event: evt}); | ||
var fileSizeMax = $parse(getAttr(attr, 'ngfMaxSize'))(scope, {$file: file, $event: evt}) || 9007199254740991; | ||
var fileSizeMin = $parse(getAttr(attr, 'ngfMinSize'))(scope, {$file: file, $event: evt}) || -1; | ||
if (accept != null && angular.isString(accept)) { | ||
var regexp = new RegExp(globStringToRegex(accept), 'gi'); | ||
accept = (file.type != null && regexp.test(file.type.toLowerCase())) || | ||
(file.name != null && regexp.test(file.name.toLowerCase())); | ||
if (!accept) { | ||
file.$error = 'accept'; | ||
return false; | ||
} | ||
} else { | ||
if (accept === false) { | ||
file.$error = 'accept'; | ||
return false; | ||
} | ||
} | ||
if (file.size == null) return true; | ||
if (file.size > fileSizeMax) { | ||
file.$error = 'maxSize'; | ||
return false; | ||
} | ||
if (file.size < fileSizeMin) { | ||
file.$error = 'minSize'; | ||
return false; | ||
} | ||
return true; | ||
}; | ||
ngFileUpload.updateModel = function ($parse, $timeout, scope, ngModel, attr, fileChange, | ||
files, rejFiles, evt, noDelay) { | ||
function update() { | ||
if ($parse(getAttr(attr, 'ngfKeep'))(scope) === true) { | ||
var prevFiles = (ngModel.$modelValue || []).slice(0); | ||
if (!files || !files.length) { | ||
files = prevFiles; | ||
} else if ($parse(getAttr(attr, 'ngfKeepDistinct'))(scope) === true) { | ||
var len = prevFiles.length; | ||
for (var i = 0; i < files.length; i++) { | ||
for (var j = 0; j < len; j++) { | ||
if (files[i].name === prevFiles[j].name) break; | ||
} | ||
if (ngModel) { | ||
$parse(attr.ngModel).assign(scope, files); | ||
$timeout(function () { | ||
if (ngModel) { | ||
ngModel.$setViewValue(files != null && files.length === 0 ? null : files); | ||
} | ||
}); | ||
if (j === len) { | ||
prevFiles.push(files[i]); | ||
} | ||
if (attr.ngModelRejected) { | ||
$parse(attr.ngModelRejected).assign(scope, rejFiles); | ||
} | ||
if (fileChange) { | ||
$parse(fileChange)(scope, { | ||
$files: files, | ||
$rejectedFiles: rejFiles, | ||
$event: evt | ||
}); | ||
} | ||
} | ||
if (noDelay) { | ||
update(); | ||
} | ||
files = prevFiles; | ||
} else { | ||
$timeout(function () { | ||
update(); | ||
}); | ||
files = prevFiles.concat(files); | ||
} | ||
}; | ||
} | ||
if (ngModel) { | ||
$parse(getAttr(attr, 'ngModel')).assign(scope, files); | ||
$timeout(function () { | ||
if (ngModel) { | ||
ngModel.$setViewValue(files != null && files.length === 0 ? null : files); | ||
} | ||
}); | ||
} | ||
if (getAttr(attr, 'ngModelRejected')) { | ||
$parse(getAttr(attr, 'ngModelRejected')).assign(scope, rejFiles); | ||
} | ||
if (fileChange) { | ||
$parse(fileChange)(scope, { | ||
$files: files, | ||
$rejectedFiles: rejFiles, | ||
$event: evt | ||
}); | ||
} | ||
} | ||
var validate = ngFileUpload.validate; | ||
var updateModel = ngFileUpload.updateModel; | ||
if (noDelay) { | ||
update(); | ||
} else { | ||
$timeout(function () { | ||
update(); | ||
}); | ||
} | ||
}; | ||
var validate = ngFileUpload.validate; | ||
var updateModel = ngFileUpload.updateModel; | ||
})(); |
@@ -26,2 +26,4 @@ /**! | ||
ngFileUpload.version = '<%= pkg.version %>'; | ||
ngFileUpload.defaults = {}; | ||
ngFileUpload.service('Upload', ['$http', '$q', '$timeout', function ($http, $q, $timeout) { | ||
@@ -199,4 +201,33 @@ function sendHttp(config) { | ||
}; | ||
this.dataUrl = function (file, callback, disallowObjectUrl) { | ||
if (window.FileReader && file && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) && | ||
(!window.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) { | ||
$timeout(function () { | ||
//prefer URL.createObjectURL for handling refrences to files of all sizes | ||
//since it doesn´t build a large string in memory | ||
var URL = window.URL || window.webkitURL; | ||
if (URL && URL.createObjectURL && !disallowObjectUrl) { | ||
callback(URL.createObjectURL(file)); | ||
} else { | ||
var fileReader = new FileReader(); | ||
fileReader.readAsDataURL(file); | ||
fileReader.onload = function (e) { | ||
$timeout(function () { | ||
callback(e.target.result); | ||
}); | ||
}; | ||
} | ||
}); | ||
} else { | ||
callback(null); | ||
} | ||
}; | ||
this.setDefaults = function(defaults) { | ||
ngFileUpload.defaults = defaults || {}; | ||
}; | ||
} | ||
]); |
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
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
3072112
108
23858
415