From a9516d45d83e2beac702abe58ab414d0b0a19545 Mon Sep 17 00:00:00 2001 From: UzielSilva Date: Wed, 3 Feb 2016 03:16:08 -0600 Subject: [PATCH 1/3] Adding allowed and error attributes, and it's functionality --- dist/angular-bootstrap-file-field.min.js | 4 +- dist/angular-bootstrap-file-field.min.js.map | 2 +- src/angular-bootstrap-file-field.js | 61 ++++++++++++++++---- 3 files changed, 54 insertions(+), 13 deletions(-) diff --git a/dist/angular-bootstrap-file-field.min.js b/dist/angular-bootstrap-file-field.min.js index 8f0dcfa..3a3e054 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){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..21d1249 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","$setViewValue","preview","reader","FileReader","onload","e","result","readAsDataURL","assign","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,CAERb,QAAQwB,cAAcb,MAAMU,OAAOC,MAAM,GACzC,IAAGvB,MAAM0B,QAAQ,CACf,GAAIC,QAAS,GAAIC,WACjBD,QAAOE,OAAS,SAAUC,GACxBhC,MAAMe,WAAW,WACff,MAAME,MAAM0B,SAASI,EAAER,OAAOS,SAGlCJ,QAAOK,cAAcpB,MAAMU,OAAOC,MAAM,SAGvC,CACH,GAAGf,MAAM,CACPV,MAAMe,WAAW,WACfL,MAAMyB,OAAOnC,MAAO,QAAUO,QAAW,6BAOrDI,WAAUE,KAAK,QAAQ,SAASmB,GAC5BA,EAAEI,mBAENnC,SAAQY,KAAK,QAAQ,SAASmB,GAC1BA,EAAEK,gBACF1B,WAAU,GAAG2B,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..fc4d8a1 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,61 @@ 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){ + + 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 +87,4 @@ angular.module('bootstrap.fileField',[]) replace:true, transclude:true }; -}); \ No newline at end of file +}]); \ No newline at end of file From 39c68786c4f071718458f11b369cf30ffad02dfd Mon Sep 17 00:00:00 2001 From: UzielSilva Date: Wed, 3 Feb 2016 03:29:43 -0600 Subject: [PATCH 2/3] Resetting error message when all is ok --- src/angular-bootstrap-file-field.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/angular-bootstrap-file-field.js b/src/angular-bootstrap-file-field.js index fc4d8a1..9b1ca92 100644 --- a/src/angular-bootstrap-file-field.js +++ b/src/angular-bootstrap-file-field.js @@ -53,7 +53,9 @@ angular.module('bootstrap.fileField',[]) } if(passed){ - + scope.$evalAsync(function(){ + error.assign(scope, undefined); + }); ngModel.$setViewValue(event.target.files[0]); if(attrs.preview){ var reader = new FileReader(); From 01b3fd204924f6d58cd4490b010b1d873582c798 Mon Sep 17 00:00:00 2001 From: UzielSilva Date: Wed, 3 Feb 2016 03:36:48 -0600 Subject: [PATCH 3/3] Building dist files --- dist/angular-bootstrap-file-field.min.js | 2 +- dist/angular-bootstrap-file-field.min.js.map | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dist/angular-bootstrap-file-field.min.js b/dist/angular-bootstrap-file-field.min.js index 3a3e054..bfdee9d 100644 --- a/dist/angular-bootstrap-file-field.min.js +++ b/dist/angular-bootstrap-file-field.min.js @@ -6,5 +6,5 @@ * Version: 0.1.4 - 02/03/2016 * License: MIT */ -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){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}}]); +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 21d1249..0b54500 100644 --- a/dist/angular-bootstrap-file-field.min.js.map +++ b/dist/angular-bootstrap-file-field.min.js.map @@ -1 +1 @@ -{"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","$setViewValue","preview","reader","FileReader","onload","e","result","readAsDataURL","assign","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,CAERb,QAAQwB,cAAcb,MAAMU,OAAOC,MAAM,GACzC,IAAGvB,MAAM0B,QAAQ,CACf,GAAIC,QAAS,GAAIC,WACjBD,QAAOE,OAAS,SAAUC,GACxBhC,MAAMe,WAAW,WACff,MAAME,MAAM0B,SAASI,EAAER,OAAOS,SAGlCJ,QAAOK,cAAcpB,MAAMU,OAAOC,MAAM,SAGvC,CACH,GAAGf,MAAM,CACPV,MAAMe,WAAW,WACfL,MAAMyB,OAAOnC,MAAO,QAAUO,QAAW,6BAOrDI,WAAUE,KAAK,QAAQ,SAASmB,GAC5BA,EAAEI,mBAENnC,SAAQY,KAAK,QAAQ,SAASmB,GAC1BA,EAAEK,gBACF1B,WAAU,GAAG2B,WAGrBC,SAAS,yGACTC,QAAQ,KACRC,WAAW","file":"./dist/angular-bootstrap-file-field.min.js"} \ 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