Comparing version 0.0.5 to 0.1.1
{ | ||
"name": "ng-s3upload", | ||
"version": "0.0.5", | ||
"version": "0.1.1", | ||
"main": "build/ng-s3upload.js", | ||
@@ -13,2 +13,2 @@ "dependencies": { | ||
} | ||
} | ||
} |
@@ -29,3 +29,6 @@ (function(window, document) { | ||
]); | ||
angular.module('ngS3upload.services', []). | ||
angular.module('ngS3upload.config', []). | ||
constant('ngS3Config', { | ||
theme: 'bootstrap2' | ||
});angular.module('ngS3upload.services', []). | ||
service('S3Uploader', ['$http', '$q', '$window', function ($http, $q, $window) { | ||
@@ -143,3 +146,3 @@ this.uploads = 0; | ||
angular.module('ngS3upload.directives', []). | ||
directive('s3Upload', ['$parse', 'S3Uploader', function ($parse, S3Uploader) { | ||
directive('s3Upload', ['$parse', 'S3Uploader', 'ngS3Config', function ($parse, S3Uploader, ngS3Config) { | ||
return { | ||
@@ -178,3 +181,4 @@ restrict: 'AC', | ||
folder: '', | ||
enableValidation: true | ||
enableValidation: true, | ||
targetFilename: null | ||
}, opts); | ||
@@ -206,3 +210,3 @@ var bucket = scope.$eval(attrs.bucket); | ||
var s3Uri = 'https://' + bucket + '.s3.amazonaws.com/'; | ||
var key = opts.folder + (new Date()).getTime() + '-' + S3Uploader.randomString(16) + "." + ext; | ||
var key = opts.targetFilename ? scope.$eval(opts.targetFilename) : opts.folder + (new Date()).getTime() + '-' + S3Uploader.randomString(16) + "." + ext; | ||
S3Uploader.upload(scope, | ||
@@ -256,12 +260,37 @@ s3Uri, | ||
}, | ||
template: '<div class="upload-wrap">' + | ||
'<button class="btn btn-primary" type="button"><span ng-if="!filename">Choose file</span><span ng-if="filename">Replace file</span></button>' + | ||
'<a ng-href="{{ filename }}" target="_blank" class="" ng-if="filename" > Stored file </a>' + | ||
'<div class="progress progress-striped" ng-class="{active: uploading}" ng-show="attempt" style="margin-top: 10px">' + | ||
'<div class="bar" style="width: {{ progress }}%;" ng-class="barClass()"></div>' + | ||
'</div>' + | ||
'<input type="file" style="display: none"/>' + | ||
'</div>' | ||
templateUrl: function(elm, attrs) { | ||
var theme = attrs.theme || ngS3Config.theme; | ||
return 'theme/' + theme + '.html'; | ||
} | ||
}; | ||
}]); | ||
angular.module('ngS3upload').run(['$templateCache', function($templateCache) { | ||
'use strict'; | ||
$templateCache.put('theme/bootstrap2.html', | ||
"<div class=\"upload-wrap\">\n" + | ||
" <button class=\"btn btn-primary\" type=\"button\"><span ng-if=\"!filename\">Choose file</span><span ng-if=\"filename\">Replace file</span></button>\n" + | ||
" <a ng-href=\"{{ filename }}\" target=\"_blank\" class=\"\" ng-if=\"filename\" > Stored file </a>\n" + | ||
" <div class=\"progress progress-striped\" ng-class=\"{active: uploading}\" ng-show=\"attempt\" style=\"margin-top: 10px\">\n" + | ||
" <div class=\"bar\" style=\"width: {{ progress }}%;\" ng-class=\"barClass()\"></div>\n" + | ||
" </div>\n" + | ||
" <input type=\"file\" style=\"display: none\"/>\n" + | ||
"</div>" | ||
); | ||
$templateCache.put('theme/bootstrap3.html', | ||
"<div class=\"upload-wrap\">\n" + | ||
" <button class=\"btn btn-primary\" type=\"button\"><span ng-if=\"!filename\">Choose file</span><span ng-if=\"filename\">Replace file</span></button>\n" + | ||
" <a ng-href=\"{{ filename }}\" target=\"_blank\" class=\"\" ng-if=\"filename\" > Stored file </a>\n" + | ||
" <div class=\"progress\">\n" + | ||
" <div class=\"progress-bar progress-bar-striped\" ng-class=\"{active: uploading}\" role=\"progressbar\" aria-valuemin=\"0\" aria-valuemax=\"100\" style=\"width: {{ progress }}%; margin-top: 10px\" ng-class=\"barClass()\">\n" + | ||
" <span class=\"sr-only\">{{progress}}% Complete</span>\n" + | ||
" </div>\n" + | ||
" </div>\n" + | ||
" <input type=\"file\" style=\"display: none\"/>\n" + | ||
"</div>" | ||
); | ||
}]); | ||
})(window, document); |
@@ -1,2 +0,2 @@ | ||
/*! ngs3upload 28-09-2014 */ | ||
!function(){angular.module("ngS3upload.config",[]).value("ngS3upload.config",{debug:!0}).config(["$compileProvider",function(a){angular.isDefined(a.urlSanitizationWhitelist)?a.urlSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|data):/):a.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|data):/)}]),angular.module("ngS3upload.directives",[]),angular.module("ngS3upload",["ngS3upload.config","ngS3upload.directives","ngS3upload.services","ngSanitize"]),angular.module("ngS3upload.services",[]).service("S3Uploader",["$http","$q","$window",function(a,b){this.uploads=0;var c=this;this.getUploadOptions=function(c){var d=b.defer();return a.get(c).success(function(a){d.resolve(a)}).error(function(a){d.reject(a)}),d.promise},this.randomString=function(a){for(var b="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",c="",d=a;d>0;--d)c+=b[Math.round(Math.random()*(b.length-1))];return c},this.upload=function(a,d,e,f,g,h,i,j,k){function l(b){a.$apply(function(){a.progress=b.lengthComputable?Math.round(100*b.loaded/b.total):"unable to compute";var c={type:"progress",value:a.progress};a.$emit("s3upload:progress",c),"function"==typeof p.notify&&p.notify(c)})}function m(b){var f=b.srcElement||b.target;a.$apply(function(){c.uploads--,a.uploading=!1,204===f.status?(a.success=!0,p.resolve(f),a.$emit("s3upload:success",f,{path:d+e})):(a.success=!1,p.reject(f),a.$emit("s3upload:error",f))})}function n(b){var d=b.srcElement||b.target;a.$apply(function(){c.uploads--,a.uploading=!1,a.success=!1,p.reject(d),a.$emit("s3upload:error",d)})}function o(b){var d=b.srcElement||b.target;a.$apply(function(){c.uploads--,a.uploading=!1,a.success=!1,p.reject(d),a.$emit("s3upload:abort",d)})}var p=b.defer();a.attempt=!0;var q=new FormData;q.append("key",e),q.append("acl",f),q.append("Content-Type",k.type),q.append("AWSAccessKeyId",h),q.append("policy",i),q.append("signature",j),q.append("file",k);var r=new XMLHttpRequest;return r.upload.addEventListener("progress",l,!1),r.addEventListener("load",m,!1),r.addEventListener("error",n,!1),r.addEventListener("abort",o,!1),a.$emit("s3upload:start",r),a.uploading=!0,this.uploads++,r.open("POST",d,!0),r.send(q),p.promise},this.isUploading=function(){return this.uploads>0}}]),angular.module("ngS3upload.directives",[]).directive("s3Upload",["$parse","S3Uploader",function(a,b){return{restrict:"AC",require:"?ngModel",replace:!0,transclude:!1,scope:!0,controller:["$scope","$element","$attrs","$transclude",function(a){a.attempt=!1,a.success=!1,a.uploading=!1,a.barClass=function(){return{"bar-success":a.attempt&&!a.uploading&&a.success}}}],compile:function(){return{pre:function(a,b,c){if(angular.isUndefined(c.bucket))throw Error("bucket is a mandatory attribute")},post:function(a,c,d,e){var f=angular.extend({},a.$eval(d.s3UploadOptions||d.options));f=angular.extend({submitOnChange:!0,getOptionsUri:"/getS3Options",acl:"public-read",uploadingKey:"uploading",folder:"",enableValidation:!0},f);var g=a.$eval(d.bucket),h=angular.element(c.children()[0]),i=angular.element(c.find("input")[0]);h.bind("click",function(){i[0].click()}),e.$render=function(){a.filename=e.$viewValue};var j=function(){var c=i[0].files[0],d=c.name,h=d.split(".").pop();b.getUploadOptions(f.getOptionsUri).then(function(d){f.enableValidation&&e.$setValidity("uploading",!1);var i="https://"+g+".s3.amazonaws.com/",j=f.folder+(new Date).getTime()+"-"+b.randomString(16)+"."+h;b.upload(a,i,j,f.acl,c.type,d.key,d.policy,d.signature,c).then(function(){e.$setViewValue(i+j),a.filename=e.$viewValue,f.enableValidation&&(e.$setValidity("uploading",!0),e.$setValidity("succeeded",!0))},function(){a.filename=e.$viewValue,f.enableValidation&&(e.$setValidity("uploading",!0),e.$setValidity("succeeded",!1))})},function(a){throw Error("Can't receive the needed options for S3 "+a)})};c.bind("change",function(){f.submitOnChange&&a.$apply(function(){j()})}),angular.isDefined(d.doUpload)&&a.$watch(d.doUpload,function(a){a&&j()})}}},template:'<div class="upload-wrap"><button class="btn btn-primary" type="button"><span ng-if="!filename">Choose file</span><span ng-if="filename">Replace file</span></button><a ng-href="{{ filename }}" target="_blank" class="" ng-if="filename" > Stored file </a><div class="progress progress-striped" ng-class="{active: uploading}" ng-show="attempt" style="margin-top: 10px"><div class="bar" style="width: {{ progress }}%;" ng-class="barClass()"></div></div><input type="file" style="display: none"/></div>'}}])}(window,document); | ||
/*! ngs3upload 05-10-2014 */ | ||
!function(){angular.module("ngS3upload.config",[]).value("ngS3upload.config",{debug:!0}).config(["$compileProvider",function(a){angular.isDefined(a.urlSanitizationWhitelist)?a.urlSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|data):/):a.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|data):/)}]),angular.module("ngS3upload.directives",[]),angular.module("ngS3upload",["ngS3upload.config","ngS3upload.directives","ngS3upload.services","ngSanitize"]),angular.module("ngS3upload.config",[]).constant("ngS3Config",{theme:"bootstrap2"}),angular.module("ngS3upload.services",[]).service("S3Uploader",["$http","$q","$window",function(a,b){this.uploads=0;var c=this;this.getUploadOptions=function(c){var d=b.defer();return a.get(c).success(function(a){d.resolve(a)}).error(function(a){d.reject(a)}),d.promise},this.randomString=function(a){for(var b="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",c="",d=a;d>0;--d)c+=b[Math.round(Math.random()*(b.length-1))];return c},this.upload=function(a,d,e,f,g,h,i,j,k){function l(b){a.$apply(function(){a.progress=b.lengthComputable?Math.round(100*b.loaded/b.total):"unable to compute";var c={type:"progress",value:a.progress};a.$emit("s3upload:progress",c),"function"==typeof p.notify&&p.notify(c)})}function m(b){var f=b.srcElement||b.target;a.$apply(function(){c.uploads--,a.uploading=!1,204===f.status?(a.success=!0,p.resolve(f),a.$emit("s3upload:success",f,{path:d+e})):(a.success=!1,p.reject(f),a.$emit("s3upload:error",f))})}function n(b){var d=b.srcElement||b.target;a.$apply(function(){c.uploads--,a.uploading=!1,a.success=!1,p.reject(d),a.$emit("s3upload:error",d)})}function o(b){var d=b.srcElement||b.target;a.$apply(function(){c.uploads--,a.uploading=!1,a.success=!1,p.reject(d),a.$emit("s3upload:abort",d)})}var p=b.defer();a.attempt=!0;var q=new FormData;q.append("key",e),q.append("acl",f),q.append("Content-Type",k.type),q.append("AWSAccessKeyId",h),q.append("policy",i),q.append("signature",j),q.append("file",k);var r=new XMLHttpRequest;return r.upload.addEventListener("progress",l,!1),r.addEventListener("load",m,!1),r.addEventListener("error",n,!1),r.addEventListener("abort",o,!1),a.$emit("s3upload:start",r),a.uploading=!0,this.uploads++,r.open("POST",d,!0),r.send(q),p.promise},this.isUploading=function(){return this.uploads>0}}]),angular.module("ngS3upload.directives",[]).directive("s3Upload",["$parse","S3Uploader","ngS3Config",function(a,b,c){return{restrict:"AC",require:"?ngModel",replace:!0,transclude:!1,scope:!0,controller:["$scope","$element","$attrs","$transclude",function(a){a.attempt=!1,a.success=!1,a.uploading=!1,a.barClass=function(){return{"bar-success":a.attempt&&!a.uploading&&a.success}}}],compile:function(){return{pre:function(a,b,c){if(angular.isUndefined(c.bucket))throw Error("bucket is a mandatory attribute")},post:function(a,c,d,e){var f=angular.extend({},a.$eval(d.s3UploadOptions||d.options));f=angular.extend({submitOnChange:!0,getOptionsUri:"/getS3Options",acl:"public-read",uploadingKey:"uploading",folder:"",enableValidation:!0,targetFilename:null},f);var g=a.$eval(d.bucket),h=angular.element(c.children()[0]),i=angular.element(c.find("input")[0]);h.bind("click",function(){i[0].click()}),e.$render=function(){a.filename=e.$viewValue};var j=function(){var c=i[0].files[0],d=c.name,h=d.split(".").pop();b.getUploadOptions(f.getOptionsUri).then(function(d){f.enableValidation&&e.$setValidity("uploading",!1);var i="https://"+g+".s3.amazonaws.com/",j=f.targetFilename?a.$eval(f.targetFilename):f.folder+(new Date).getTime()+"-"+b.randomString(16)+"."+h;b.upload(a,i,j,f.acl,c.type,d.key,d.policy,d.signature,c).then(function(){e.$setViewValue(i+j),a.filename=e.$viewValue,f.enableValidation&&(e.$setValidity("uploading",!0),e.$setValidity("succeeded",!0))},function(){a.filename=e.$viewValue,f.enableValidation&&(e.$setValidity("uploading",!0),e.$setValidity("succeeded",!1))})},function(a){throw Error("Can't receive the needed options for S3 "+a)})};c.bind("change",function(){f.submitOnChange&&a.$apply(function(){j()})}),angular.isDefined(d.doUpload)&&a.$watch(d.doUpload,function(a){a&&j()})}}},templateUrl:function(a,b){var d=b.theme||c.theme;return"theme/"+d+".html"}}}]),angular.module("ngS3upload").run(["$templateCache",function(a){"use strict";a.put("theme/bootstrap2.html",'<div class="upload-wrap">\n <button class="btn btn-primary" type="button"><span ng-if="!filename">Choose file</span><span ng-if="filename">Replace file</span></button>\n <a ng-href="{{ filename }}" target="_blank" class="" ng-if="filename" > Stored file </a>\n <div class="progress progress-striped" ng-class="{active: uploading}" ng-show="attempt" style="margin-top: 10px">\n <div class="bar" style="width: {{ progress }}%;" ng-class="barClass()"></div>\n </div>\n <input type="file" style="display: none"/>\n</div>'),a.put("theme/bootstrap3.html",'<div class="upload-wrap">\n <button class="btn btn-primary" type="button"><span ng-if="!filename">Choose file</span><span ng-if="filename">Replace file</span></button>\n <a ng-href="{{ filename }}" target="_blank" class="" ng-if="filename" > Stored file </a>\n <div class="progress">\n <div class="progress-bar progress-bar-striped" ng-class="{active: uploading}" role="progressbar" aria-valuemin="0" aria-valuemax="100" style="width: {{ progress }}%; margin-top: 10px" ng-class="barClass()">\n <span class="sr-only">{{progress}}% Complete</span>\n </div>\n </div>\n <input type="file" style="display: none"/>\n</div>')}])}(window,document); |
@@ -9,2 +9,12 @@ module.exports = function (grunt) { | ||
library: grunt.file.readJSON('bower.json'), | ||
ngtemplates: { | ||
app: { | ||
cwd: 'src/<%= library.name %>/templates', | ||
src: 'theme/**.html', | ||
dest: '.tmp/templates.js', | ||
options: { | ||
module: 'ngS3upload' | ||
} | ||
} | ||
}, | ||
concat: { | ||
@@ -21,2 +31,3 @@ options: { | ||
'src/<%= library.name %>/filters/**/*.js', | ||
'<%= ngtemplates.app.dest %>', | ||
'src/<%= library.name %>/<%= library.name %>.suffix' | ||
@@ -80,2 +91,13 @@ ], | ||
tasks: ['default'] | ||
}, | ||
clean: { | ||
dist: { | ||
files: [{ | ||
dot: false, | ||
src: [ | ||
'.tmp', | ||
'build/' | ||
] | ||
}] | ||
} | ||
} | ||
@@ -91,7 +113,9 @@ }); | ||
grunt.loadNpmTasks('grunt-contrib-watch'); | ||
grunt.loadNpmTasks('grunt-contrib-clean'); | ||
grunt.loadNpmTasks('grunt-angular-templates'); | ||
grunt.registerTask('test', ['jshint', 'karma:unit']); | ||
grunt.registerTask('default', ['jshint:beforeConcat', 'concat', 'jshint:afterConcat', 'uglify']); | ||
grunt.registerTask('default', ['clean:dist','jshint:beforeConcat', 'ngtemplates', 'concat', 'jshint:afterConcat', 'uglify']); | ||
grunt.registerTask('livereload', ['default', 'watch']); | ||
}; |
{ | ||
"name": "ngs3upload", | ||
"version": "0.0.5", | ||
"dependencies": {}, | ||
"devDependencies": { | ||
"grunt": "~0.4.1", | ||
"grunt-contrib-copy": "~0.4.1", | ||
"grunt-contrib-concat": "~0.3.0", | ||
"grunt-contrib-coffee": "~0.7.0", | ||
"grunt-contrib-uglify": "~0.2.0", | ||
"grunt-contrib-compass": "~0.3.0", | ||
"grunt-contrib-jshint": "~0.6.0", | ||
"grunt-contrib-cssmin": "~0.6.0", | ||
"grunt-contrib-connect": "~0.3.0", | ||
"grunt-contrib-clean": "~0.4.1", | ||
"grunt-contrib-htmlmin": "~0.1.3", | ||
"grunt-contrib-imagemin": "~0.1.4", | ||
"grunt-contrib-watch": "~0.4.0", | ||
"grunt-usemin": "~0.1.11", | ||
"grunt-svgmin": "~0.2.0", | ||
"grunt-rev": "~0.1.0", | ||
"grunt-karma": "~0.4.3", | ||
"grunt-open": "~0.2.0", | ||
"grunt-concurrent": "~0.3.0", | ||
"matchdep": "~0.1.2", | ||
"connect-livereload": "~0.2.0", | ||
"grunt-google-cdn": "~0.2.0", | ||
"grunt-ngmin": "~0.0.2", | ||
"karma": "~0.10", | ||
"karma-jasmine": "~0.1.0" | ||
}, | ||
"engines": { | ||
"node": ">=0.8.0" | ||
} | ||
"name": "ngs3upload", | ||
"version": "0.1.1", | ||
"dependencies": {}, | ||
"devDependencies": { | ||
"connect-livereload": "~0.2.0", | ||
"grunt": "~0.4.1", | ||
"grunt-angular-templates": "^0.5.7", | ||
"grunt-concurrent": "~0.3.0", | ||
"grunt-contrib-clean": "^0.6.0", | ||
"grunt-contrib-coffee": "~0.7.0", | ||
"grunt-contrib-compass": "~0.3.0", | ||
"grunt-contrib-concat": "~0.3.0", | ||
"grunt-contrib-connect": "~0.3.0", | ||
"grunt-contrib-copy": "~0.4.1", | ||
"grunt-contrib-cssmin": "~0.6.0", | ||
"grunt-contrib-htmlmin": "~0.1.3", | ||
"grunt-contrib-imagemin": "~0.1.4", | ||
"grunt-contrib-jshint": "~0.6.0", | ||
"grunt-contrib-uglify": "~0.2.0", | ||
"grunt-contrib-watch": "~0.4.0", | ||
"grunt-google-cdn": "~0.2.0", | ||
"grunt-karma": "~0.4.3", | ||
"grunt-ngmin": "~0.0.2", | ||
"grunt-open": "~0.2.0", | ||
"grunt-rev": "~0.1.0", | ||
"grunt-svgmin": "~0.2.0", | ||
"grunt-usemin": "~0.1.11", | ||
"karma": "~0.10", | ||
"karma-jasmine": "~0.1.0", | ||
"matchdep": "~0.1.2" | ||
}, | ||
"engines": { | ||
"node": ">=0.8.0" | ||
} | ||
} |
@@ -95,4 +95,19 @@ ng-s3upload - Upload to S3 using AngularJS | ||
5. Download ng-s3upload.min.js and add it to your project or use bower (bower install ng-s3upload --save). | ||
## How to get it ? | ||
#### Manual Download | ||
Download the from [here](https://github.com/asafdav/ng-s3upload/releases) | ||
#### Bower | ||
``` | ||
bower install ng-s3upload | ||
``` | ||
#### Npm | ||
``` | ||
npm install ng-s3upload | ||
``` | ||
## Usage | ||
@@ -115,7 +130,8 @@ 1. Add ng-s3upload.min.js to your main file (index.html) | ||
attributes: | ||
* bucket - Speificy the wanted bucket | ||
* bucket - Specify the wanted bucket | ||
* s3-upload-options - Provide additional options: | ||
* getOptionsUri - The uri of the server service that is needed to sign the request (mentioned in section Setup#4) - Required. | ||
* folder - optional, specifies a folder inside the bucket the save the file to | ||
* enableValidation - optional, set to "false" in order to disable the field validation. | ||
* enableValidation - optional, set to "false" in order to disable the field validation. | ||
* targetFilename - An optional attribute for the target filename. if provided the file will be renamed to the provided value instead of having the file original filename. | ||
@@ -122,0 +138,0 @@ |
angular.module('ngS3upload.directives', []). | ||
directive('s3Upload', ['$parse', 'S3Uploader', function ($parse, S3Uploader) { | ||
directive('s3Upload', ['$parse', 'S3Uploader', 'ngS3Config', function ($parse, S3Uploader, ngS3Config) { | ||
return { | ||
@@ -36,3 +36,4 @@ restrict: 'AC', | ||
folder: '', | ||
enableValidation: true | ||
enableValidation: true, | ||
targetFilename: null | ||
}, opts); | ||
@@ -64,3 +65,3 @@ var bucket = scope.$eval(attrs.bucket); | ||
var s3Uri = 'https://' + bucket + '.s3.amazonaws.com/'; | ||
var key = opts.folder + (new Date()).getTime() + '-' + S3Uploader.randomString(16) + "." + ext; | ||
var key = opts.targetFilename ? scope.$eval(opts.targetFilename) : opts.folder + (new Date()).getTime() + '-' + S3Uploader.randomString(16) + "." + ext; | ||
S3Uploader.upload(scope, | ||
@@ -114,11 +115,7 @@ s3Uri, | ||
}, | ||
template: '<div class="upload-wrap">' + | ||
'<button class="btn btn-primary" type="button"><span ng-if="!filename">Choose file</span><span ng-if="filename">Replace file</span></button>' + | ||
'<a ng-href="{{ filename }}" target="_blank" class="" ng-if="filename" > Stored file </a>' + | ||
'<div class="progress progress-striped" ng-class="{active: uploading}" ng-show="attempt" style="margin-top: 10px">' + | ||
'<div class="bar" style="width: {{ progress }}%;" ng-class="barClass()"></div>' + | ||
'</div>' + | ||
'<input type="file" style="display: none"/>' + | ||
'</div>' | ||
templateUrl: function(elm, attrs) { | ||
var theme = attrs.theme || ngS3Config.theme; | ||
return 'theme/' + theme + '.html'; | ||
} | ||
}; | ||
}]); |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
38753
20
637
140
26