diff --git a/dist/angular-bootstrap-file-field.min.js b/dist/angular-bootstrap-file-field.min.js
index 8f0dcfa..bfdee9d 100644
--- a/dist/angular-bootstrap-file-field.min.js
+++ b/dist/angular-bootstrap-file-field.min.js
@@ -3,8 +3,8 @@
* angular-bootstrap-file
* https://github.com/itslenny/angular-bootstrap-file-field
*
- * Version: 0.1.3 - 02/21/2015
+ * Version: 0.1.4 - 02/03/2016
* License: MIT
*/
-angular.module("bootstrap.fileField",[]).directive("fileField",function(){return{require:"ngModel",restrict:"E",link:function(scope,element,attrs,ngModel){if(!attrs.class&&!attrs.ngClass){element.addClass("btn")}var fileField=element.find("input");fileField.bind("change",function(event){scope.$evalAsync(function(){ngModel.$setViewValue(event.target.files[0]);if(attrs.preview){var reader=new FileReader;reader.onload=function(e){scope.$evalAsync(function(){scope[attrs.preview]=e.target.result})};reader.readAsDataURL(event.target.files[0])}})});fileField.bind("click",function(e){e.stopPropagation()});element.bind("click",function(e){e.preventDefault();fileField[0].click()})},template:'',replace:true,transclude:true}});
+angular.module("bootstrap.fileField",[]).directive("fileField",["$parse",function($parse){return{require:"ngModel",restrict:"E",link:function(scope,element,attrs,ngModel){if(!attrs.class&&!attrs.ngClass){element.addClass("btn")}var allowed=attrs.allowed?JSON.parse(attrs.allowed):null;var error=attrs.error?$parse(attrs.error):null;var fileField=element.find("input");fileField.bind("change",function(event){scope.$evalAsync(function(){var passed=false;if(!allowed){passed=true}else{if(!Array.isArray(allowed)){throw"Allowed property must be an array"}allowed.forEach(function(type){var patt=new RegExp(".*."+type);if(patt.exec(event.target.files[0].name)){passed=true}})}if(passed){scope.$evalAsync(function(){error.assign(scope,undefined)});ngModel.$setViewValue(event.target.files[0]);if(attrs.preview){var reader=new FileReader;reader.onload=function(e){scope.$evalAsync(function(){scope[attrs.preview]=e.target.result})};reader.readAsDataURL(event.target.files[0])}}else{if(error){scope.$evalAsync(function(){error.assign(scope,"Only "+allowed+" files are allowed")})}}})});fileField.bind("click",function(e){e.stopPropagation()});element.bind("click",function(e){e.preventDefault();fileField[0].click()})},template:'',replace:true,transclude:true}}]);
//# sourceMappingURL=angular-bootstrap-file-field.min.js.map
\ No newline at end of file
diff --git a/dist/angular-bootstrap-file-field.min.js.map b/dist/angular-bootstrap-file-field.min.js.map
index 0610c6d..0b54500 100644
--- a/dist/angular-bootstrap-file-field.min.js.map
+++ b/dist/angular-bootstrap-file-field.min.js.map
@@ -1 +1 @@
-{"version":3,"file":"./dist/angular-bootstrap-file-field.min.js","sources":["./src/angular-bootstrap-file-field.js"],"names":["angular","module","directive","require","restrict","link","scope","element","attrs","ngModel","class","ngClass","addClass","fileField","find","bind","event","$evalAsync","$setViewValue","target","files","preview","reader","FileReader","onload","e","result","readAsDataURL","stopPropagation","preventDefault","click","template","replace","transclude"],"mappings":";;;;;;;;AASAA,QAAQC,OAAO,0BACdC,UAAU,YAAa,WACtB,OACEC,QAAQ,UACRC,SAAU,IACVC,KAAM,SAAUC,MAAOC,QAASC,MAAOC,SAEnC,IAAID,MAAME,QAAUF,MAAMG,QAAQ,CAC9BJ,QAAQK,SAAS,OAGrB,GAAIC,WAAYN,QAAQO,KAAK,QAE7BD,WAAUE,KAAK,SAAU,SAASC,OAC9BV,MAAMW,WAAW,WACfR,QAAQS,cAAcF,MAAMG,OAAOC,MAAM,GACzC,IAAGZ,MAAMa,QAAQ,CACf,GAAIC,QAAS,GAAIC,WACjBD,QAAOE,OAAS,SAAUC,GACtBnB,MAAMW,WAAW,WACbX,MAAME,MAAMa,SAASI,EAAEN,OAAOO,SAGtCJ,QAAOK,cAAcX,MAAMG,OAAOC,MAAM,QAIhDP,WAAUE,KAAK,QAAQ,SAASU,GAC5BA,EAAEG,mBAENrB,SAAQQ,KAAK,QAAQ,SAASU,GAC1BA,EAAEI,gBACFhB,WAAU,GAAGiB,WAGrBC,SAAS,yGACTC,QAAQ,KACRC,WAAW"}
\ No newline at end of file
+{"version":3,"sources":["./src/angular-bootstrap-file-field.js"],"names":["angular","module","directive","$parse","require","restrict","link","scope","element","attrs","ngModel","class","ngClass","addClass","allowed","JSON","parse","error","fileField","find","bind","event","$evalAsync","passed","Array","isArray","forEach","type","patt","RegExp","exec","target","files","name","assign","undefined","$setViewValue","preview","reader","FileReader","onload","e","result","readAsDataURL","stopPropagation","preventDefault","click","template","replace","transclude"],"mappings":";;;;;;;;AASAA,QAAQC,OAAO,0BACdC,UAAU,aAAe,SAAU,SAASC,QAC3C,OACEC,QAAQ,UACRC,SAAU,IACVC,KAAM,SAAUC,MAAOC,QAASC,MAAOC,SAEnC,IAAID,MAAME,QAAUF,MAAMG,QAAQ,CAC9BJ,QAAQK,SAAS,OAKrB,GAAIC,SAAUL,MAAMK,QAAUC,KAAKC,MAAMP,MAAMK,SAAW,IAI1D,IAAIG,OAAQR,MAAMQ,MAAQd,OAAOM,MAAMQ,OAAS,IAEhD,IAAIC,WAAYV,QAAQW,KAAK,QAE7BD,WAAUE,KAAK,SAAU,SAASC,OAC9Bd,MAAMe,WAAW,WAIf,GAAIC,QAAS,KAEb,KAAIT,QAAQ,CAAES,OAAS,SAElB,CAEH,IAAIC,MAAMC,QAAQX,SAAS,CAAE,KAAM,oCAEnCA,QAAQY,QAAQ,SAASC,MAEvB,GAAIC,MAAO,GAAIC,QAAO,MAASF,KAC/B,IAAGC,KAAKE,KAAKT,MAAMU,OAAOC,MAAM,GAAGC,MAAM,CACvCV,OAAS,QAOf,GAAGA,OAAO,CACRhB,MAAMe,WAAW,WACbL,MAAMiB,OAAO3B,MAAO4B,YAExBzB,SAAQ0B,cAAcf,MAAMU,OAAOC,MAAM,GACzC,IAAGvB,MAAM4B,QAAQ,CACf,GAAIC,QAAS,GAAIC,WACjBD,QAAOE,OAAS,SAAUC,GACxBlC,MAAMe,WAAW,WACff,MAAME,MAAM4B,SAASI,EAAEV,OAAOW,SAGlCJ,QAAOK,cAActB,MAAMU,OAAOC,MAAM,SAGvC,CACH,GAAGf,MAAM,CACPV,MAAMe,WAAW,WACfL,MAAMiB,OAAO3B,MAAO,QAAUO,QAAW,6BAOrDI,WAAUE,KAAK,QAAQ,SAASqB,GAC5BA,EAAEG,mBAENpC,SAAQY,KAAK,QAAQ,SAASqB,GAC1BA,EAAEI,gBACF3B,WAAU,GAAG4B,WAGrBC,SAAS,yGACTC,QAAQ,KACRC,WAAW","file":"./dist/angular-bootstrap-file-field.min.js"}
\ No newline at end of file
diff --git a/src/angular-bootstrap-file-field.js b/src/angular-bootstrap-file-field.js
index 2a3f647..9b1ca92 100644
--- a/src/angular-bootstrap-file-field.js
+++ b/src/angular-bootstrap-file-field.js
@@ -3,12 +3,12 @@
* angular-bootstrap-file
* https://github.com/itslenny/angular-bootstrap-file-field
*
- * Version: 0.1.3 - 02/21/2015
+ * Version: 0.1.4 - 02/03/2016
* License: MIT
*/
angular.module('bootstrap.fileField',[])
-.directive('fileField', function() {
+.directive('fileField', [ '$parse', function($parse) {
return {
require:'ngModel',
restrict: 'E',
@@ -18,20 +18,63 @@ angular.module('bootstrap.fileField',[])
element.addClass('btn');
}
+ // Allowed variavle for manage allowed property
+
+ var allowed = attrs.allowed ? JSON.parse(attrs.allowed) : null;
+
+ // Error variable for manage error property
+
+ var error = attrs.error ? $parse(attrs.error) : null;
+
var fileField = element.find('input');
fileField.bind('change', function(event){
scope.$evalAsync(function () {
- ngModel.$setViewValue(event.target.files[0]);
- if(attrs.preview){
- var reader = new FileReader();
- reader.onload = function (e) {
+
+ // Variable for verify allowed extensions
+
+ var passed = false;
+
+ if(!allowed){ passed = true; }
+
+ else {
+
+ if(!Array.isArray(allowed)){ throw 'Allowed property must be an array'; }
+
+ allowed.forEach(function(type){
+
+ var patt = new RegExp('.*\.' + type);
+ if(patt.exec(event.target.files[0].name)){
+ passed = true;
+ }
+
+ });
+
+ }
+
+ if(passed){
+ scope.$evalAsync(function(){
+ error.assign(scope, undefined);
+ });
+ ngModel.$setViewValue(event.target.files[0]);
+ if(attrs.preview){
+ var reader = new FileReader();
+ reader.onload = function (e) {
scope.$evalAsync(function(){
- scope[attrs.preview]=e.target.result;
+ scope[attrs.preview]=e.target.result;
});
- };
- reader.readAsDataURL(event.target.files[0]);
+ };
+ reader.readAsDataURL(event.target.files[0]);
+ }
+
+ }else{
+ if(error){
+ scope.$evalAsync(function(){
+ error.assign(scope, 'Only ' + allowed + ' files are allowed');
+ });
+ }
}
+
});
});
fileField.bind('click',function(e){
@@ -46,4 +89,4 @@ angular.module('bootstrap.fileField',[])
replace:true,
transclude:true
};
-});
\ No newline at end of file
+}]);
\ No newline at end of file