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