uploadbox 0.2.0.rc2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/_file_uploader.coffee +135 -0
- data/app/assets/javascripts/_image_uploader.coffee +2 -0
- data/app/assets/javascripts/uploadbox.coffee +1 -0
- data/app/assets/stylesheets/uploadbox.sass +43 -1
- data/app/controllers/uploadbox/images_controller.rb +7 -5
- data/app/models/image.rb +4 -0
- data/app/views/uploadbox/files/_uploads_one.slim +44 -0
- data/lib/uploadbox/engine.rb +41 -21
- data/lib/uploadbox/image_uploader.rb +1 -0
- data/lib/uploadbox/version.rb +1 -1
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e7bb12a0625b5f87aacfc0021316fe4b67bd1c60
|
4
|
+
data.tar.gz: 135c2fd550e08c6d1df330492cd578fe4290d561
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 63eff65e15bd81b2b1e16350618cbe75c37fb195933049b5554796f33c308a6668855543c87bad1089808a284eb4b3ca691ba573a994e601d2ce71f10c095d9d
|
7
|
+
data.tar.gz: 09ec34fd695b3fd5ee732e200f562405489cc5923b09aac9c291d286f7e90106db8a8812d9b4f26d5e1a0d8381b88f958382bedde3e0e97ae3d50ce8cfe60fec
|
@@ -0,0 +1,135 @@
|
|
1
|
+
class @FileUploader
|
2
|
+
constructor: (@container) ->
|
3
|
+
@preview = @container.find('[data-provides="fileupload"]')
|
4
|
+
@fileInput = @container.find('input[type="file"]')
|
5
|
+
@typeInput = @container.find('input[name="image[imageable_type]"]')
|
6
|
+
@uploadNameInput = @container.find('input[name="image[upload_name]"]')
|
7
|
+
@idInput = @container.find('[data-item="id"]')
|
8
|
+
@container.find('a.btn.fileupload-exists').bind('ajax:success', @delete)
|
9
|
+
@thumbContainer = @container.find('.fileupload-preview.preview')
|
10
|
+
|
11
|
+
@setupLabel()
|
12
|
+
|
13
|
+
@fileInput.show()
|
14
|
+
|
15
|
+
@fileInput.fileupload
|
16
|
+
type: 'POST'
|
17
|
+
dataType: 'xml'
|
18
|
+
formData: @getFormData
|
19
|
+
dropZone: @container
|
20
|
+
pasteZone: @container
|
21
|
+
add: @add
|
22
|
+
progress: @progress
|
23
|
+
done: @done
|
24
|
+
|
25
|
+
add: (e, data) =>
|
26
|
+
@file = data.files[0]
|
27
|
+
if @loader
|
28
|
+
@loader.detach()
|
29
|
+
|
30
|
+
if @verifyProcessingInterval
|
31
|
+
clearInterval(@verifyProcessingInterval)
|
32
|
+
|
33
|
+
@makePreview(@file)
|
34
|
+
|
35
|
+
@loader = $('<div><div class="progress progress-striped active"><div class="bar" style="width: 0%;"></div></div><div class="uploader-overlay"></div></div>').hide()
|
36
|
+
@loader.find('.uploader-overlay').height(@thumbContainer.data('height'))
|
37
|
+
@preview.prepend(@loader)
|
38
|
+
@loader.show()
|
39
|
+
|
40
|
+
data.submit()
|
41
|
+
@container.find('.fileupload').removeClass('processing').addClass('uploading')
|
42
|
+
@container.closest('form').find('[type=submit]').attr("disabled", true)
|
43
|
+
|
44
|
+
makePreview: (file) =>
|
45
|
+
@thumbContainer.html('')
|
46
|
+
@container.find('.fileupload-preview.preview').append($("<a data-item='filename'>#{file.name}</a>"))
|
47
|
+
@container.find('.fileupload').removeClass('fileupload-new').addClass('fileupload-uploading')
|
48
|
+
|
49
|
+
getFormData: (arg) =>
|
50
|
+
file = @file
|
51
|
+
@filePath = @container.find('input[name="key"]').val() + file.name
|
52
|
+
[
|
53
|
+
{ name: 'key', value: @filePath },
|
54
|
+
{ name: 'acl', value: @container.find('input[name="acl"]').val() },
|
55
|
+
{ name: 'Content-Type', value: file.type },
|
56
|
+
{ name: 'AWSAccessKeyId', value: @container.find('input[name="AWSAccessKeyId"]').val() },
|
57
|
+
{ name: 'policy', value: @container.find('input[name="policy"]').val() },
|
58
|
+
{ name: 'signature', value: @container.find('input[name="signature"]').val() },
|
59
|
+
{ name: "file", value: file }
|
60
|
+
]
|
61
|
+
|
62
|
+
progress: (e, data) =>
|
63
|
+
progress = parseInt(data.loaded / data.total * 100, 10)
|
64
|
+
@loader.find('.bar').css({width: progress + '%'})
|
65
|
+
|
66
|
+
done: (e, data) =>
|
67
|
+
@container.find('.fileupload').removeClass('uploading').addClass('processing')
|
68
|
+
@originalFileURL = @fileInput.data('url') + @filePath
|
69
|
+
$.ajax
|
70
|
+
type: 'POST'
|
71
|
+
url: @fileInput.data('callback-url')
|
72
|
+
data:
|
73
|
+
'image[remote_file_url]': @originalFileURL
|
74
|
+
'image[imageable_type]': @typeInput.val()
|
75
|
+
'image[upload_name]': @uploadNameInput.val()
|
76
|
+
'image[secure_random]': @fileInput.data('secure-random')
|
77
|
+
'processed': true
|
78
|
+
|
79
|
+
complete: (data) =>
|
80
|
+
@verifyProcessingInterval = setInterval(@verifyProcessing, 100)
|
81
|
+
|
82
|
+
error: =>
|
83
|
+
@loader.detach()
|
84
|
+
@container.find('.fileupload').removeClass('uploading').removeClass('processing')
|
85
|
+
@container.closest('form').find('[type=submit]').attr("disabled", false)
|
86
|
+
|
87
|
+
verifyProcessing: =>
|
88
|
+
arr = @filePath.split('/')
|
89
|
+
filename = arr[arr.length - 1]
|
90
|
+
$.ajax
|
91
|
+
type: 'GET'
|
92
|
+
dataType: 'json'
|
93
|
+
url: @fileInput.data('find-url')
|
94
|
+
data:
|
95
|
+
image:
|
96
|
+
'imageable_type': @typeInput.val()
|
97
|
+
'upload_name': @uploadNameInput.val()
|
98
|
+
'secure_random': @fileInput.data('secure-random')
|
99
|
+
|
100
|
+
complete: (data) =>
|
101
|
+
if data.responseJSON.hasOwnProperty('id')
|
102
|
+
clearInterval(@verifyProcessingInterval)
|
103
|
+
@showThumb(data.responseJSON)
|
104
|
+
|
105
|
+
error: =>
|
106
|
+
@loader.detach()
|
107
|
+
@container.find('.fileupload').removeClass('uploading').removeClass('processing')
|
108
|
+
@container.closest('form').find('[type=submit]').attr("disabled", false)
|
109
|
+
|
110
|
+
delete: =>
|
111
|
+
@idInput.val('')
|
112
|
+
@container.find('.fileupload-preview.preview a').detach()
|
113
|
+
@container.find('.fileupload').addClass('fileupload-new').removeClass('fileupload-exists')
|
114
|
+
|
115
|
+
fail: (e, data) =>
|
116
|
+
@loader.detach()
|
117
|
+
@container.find('.fileupload').removeClass('uploading').removeClass('processing')
|
118
|
+
@container.closest('form').find('[type=submit]').attr("disabled", false)
|
119
|
+
|
120
|
+
showThumb: (image) =>
|
121
|
+
@container.trigger('uploadbox:complete', {url: @originalFileURL})
|
122
|
+
@loader.fadeOut =>
|
123
|
+
@loader.detach()
|
124
|
+
@idInput.val(image.id)
|
125
|
+
@container.find('a.btn.fileupload-exists').attr('href', image.url)
|
126
|
+
@container.find('[data-item="filename"]').attr('href', @originalFileURL).attr('target', '_blank')
|
127
|
+
@container.find('.fileupload').removeClass('fileupload-new').addClass('fileupload-exists')
|
128
|
+
@container.find('.fileupload').removeClass('uploading').removeClass('processing')
|
129
|
+
@container.closest('form').find('[type=submit]').attr("disabled", false)
|
130
|
+
|
131
|
+
setupLabel: =>
|
132
|
+
labels = @container.find('.fileupload-actions .fileupload-new, .fileupload-actions .fileupload-exists')
|
133
|
+
labels.each (index, label) ->
|
134
|
+
$(label).css({marginLeft: $(label).outerWidth() * -0.5, marginTop: $(label).outerHeight() * -0.5})
|
135
|
+
|
@@ -77,6 +77,7 @@ class @ImageUploader
|
|
77
77
|
|
78
78
|
done: (e, data) =>
|
79
79
|
@container.find('.fileupload').removeClass('uploading').addClass('processing')
|
80
|
+
@originalFileURL = @fileInput.data('url') + @filePath
|
80
81
|
|
81
82
|
$.ajax
|
82
83
|
type: 'POST'
|
@@ -130,6 +131,7 @@ class @ImageUploader
|
|
130
131
|
@container.closest('form').find('[type=submit]').attr("disabled", false)
|
131
132
|
|
132
133
|
showThumb: (image) =>
|
134
|
+
@container.trigger('uploadbox:complete', {url: @originalFileURL})
|
133
135
|
@loader.fadeOut =>
|
134
136
|
@loader.detach()
|
135
137
|
@idInput.val(image.id)
|
@@ -201,4 +201,46 @@
|
|
201
201
|
|
202
202
|
.fileupload-uploading
|
203
203
|
.btn.fileupload-exists
|
204
|
-
display: none
|
204
|
+
display: none
|
205
|
+
|
206
|
+
[data-component="FileUploader"]
|
207
|
+
height: 60px
|
208
|
+
width: 300px
|
209
|
+
|
210
|
+
.fileupload-preview.preview
|
211
|
+
a
|
212
|
+
display: block
|
213
|
+
text-align: left
|
214
|
+
a:hover
|
215
|
+
background: transparent
|
216
|
+
color: black
|
217
|
+
|
218
|
+
.fileupload-exists
|
219
|
+
.btn.fileupload-exists
|
220
|
+
display: block
|
221
|
+
// .fileupload-new
|
222
|
+
// display: none !important
|
223
|
+
|
224
|
+
.fileupload
|
225
|
+
background: transparent
|
226
|
+
|
227
|
+
.fileupload-actions
|
228
|
+
background: transparent
|
229
|
+
height: 50px
|
230
|
+
width: 230px
|
231
|
+
|
232
|
+
.btn-file
|
233
|
+
background: transparent
|
234
|
+
|
235
|
+
.fileupload-new
|
236
|
+
width: 200px
|
237
|
+
display: block
|
238
|
+
height: 30px
|
239
|
+
line-height: 30px
|
240
|
+
position: static
|
241
|
+
margin-top: 0 !important
|
242
|
+
margin-left: 0 !important
|
243
|
+
|
244
|
+
|
245
|
+
.fileupload-actions
|
246
|
+
position: static
|
@@ -12,10 +12,12 @@ module Uploadbox
|
|
12
12
|
|
13
13
|
upload = Uploadbox.const_get(upload_class_name).create!(attributes)
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
unless params["processed"].present?
|
16
|
+
if Uploadbox.background_processing
|
17
|
+
Resque.enqueue(ProcessImage, {id: upload.id, upload_class_name: upload_class_name})
|
18
|
+
else
|
19
|
+
upload.process
|
20
|
+
end
|
19
21
|
end
|
20
22
|
|
21
23
|
render nothing: true
|
@@ -34,7 +36,7 @@ module Uploadbox
|
|
34
36
|
|
35
37
|
private
|
36
38
|
def image_params
|
37
|
-
params.require(:image).permit(:remote_file_url, :imageable_type, :upload_name, :secure_random)
|
39
|
+
params.require(:image).permit(:remote_file_url, :imageable_type, :upload_name, :secure_random, :processed)
|
38
40
|
end
|
39
41
|
|
40
42
|
def upload_class_name
|
data/app/models/image.rb
CHANGED
@@ -0,0 +1,44 @@
|
|
1
|
+
= form.fields_for upload_name do |f|
|
2
|
+
/ forces multipart/form-data
|
3
|
+
= f.file_field :temp, style: 'display: none'
|
4
|
+
|
5
|
+
/ old browsers
|
6
|
+
- if browser.ie? and browser.version.to_i <= 9
|
7
|
+
- if namespace
|
8
|
+
input name="[#{resource.class.name.underscore}][#{namespace}]#{upload_name}" data-item="id" type="file"
|
9
|
+
- else
|
10
|
+
input name="[#{resource.class.name.underscore}]#{upload_name}" data-item="id" type="file"
|
11
|
+
- else
|
12
|
+
- secure_random = SecureRandom.uuid
|
13
|
+
.uploadbox-image-uploader.uploads-one data-component="FileUploader"
|
14
|
+
- if namespace
|
15
|
+
input name="[#{resource.class.name.underscore}][#{namespace}]#{upload_name}" data-item="id" type="hidden" value="#{resource.send(upload_name).try :id}"
|
16
|
+
- else
|
17
|
+
input name="[#{resource.class.name.underscore}]#{upload_name}" data-item="id" type="hidden" value="#{resource.send(upload_name).try :id}"
|
18
|
+
|
19
|
+
.fileupload data-provides="fileupload" class="fileupload-#{resource.send("#{upload_name}?") ? 'exists' : 'new'}"
|
20
|
+
.fileupload-preview.preview
|
21
|
+
- if resource.send("#{upload_name}?")
|
22
|
+
= link_to resource.send(upload_name).name, resource.send(upload_name).original_file
|
23
|
+
|
24
|
+
.fileupload-actions
|
25
|
+
span.btn.btn-file
|
26
|
+
span.fileupload-new = choose_label
|
27
|
+
span.fileupload-exists = update_label
|
28
|
+
|
29
|
+
|
30
|
+
input type="file" name="image[file]" data-callback-url="#{uploadbox.images_path}" data-find-url="#{uploadbox.find_images_path(format: :json)}" data-url="https://#{CarrierWave::Uploader::Base.fog_directory}.s3.amazonaws.com/" data-secure-random="#{secure_random}"
|
31
|
+
input type="hidden" name="policy" value="#{s3_policy}"
|
32
|
+
input type="hidden" name="signature" value="#{s3_signature}"
|
33
|
+
input type="hidden" name="AWSAccessKeyId" value="#{CarrierWave::Uploader::Base.fog_credentials[:aws_access_key_id]}"
|
34
|
+
input type="hidden" name="acl" value="public-read"
|
35
|
+
input type="hidden" name="key" value="uploads/#{secure_random}/"
|
36
|
+
|
37
|
+
input type="hidden" name="image[imageable_type]" value="#{resource.class.base_class}"
|
38
|
+
input type="hidden" name="image[upload_name]" value="#{upload_name}"
|
39
|
+
- if removable
|
40
|
+
- if resource.send(upload_name).present?
|
41
|
+
= link_to destroy_label, uploadbox.image_path(resource.send(upload_name)), class: 'btn fileupload-exists', remote: true, method: :delete
|
42
|
+
- else
|
43
|
+
= link_to destroy_label, '#', class: 'btn fileupload-exists', remote: true, method: :delete
|
44
|
+
|
data/lib/uploadbox/engine.rb
CHANGED
@@ -39,27 +39,47 @@ end
|
|
39
39
|
class ActionView::Helpers::FormBuilder
|
40
40
|
def uploads_one(upload_name, options={})
|
41
41
|
upload_model_class = "Uploadbox::#{@object.class.base_class.to_s + upload_name.to_s.camelize}".constantize
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
42
|
+
|
43
|
+
if upload_model_class.versions.present?
|
44
|
+
options.reverse_merge!(preview: upload_model_class.versions.keys.first,
|
45
|
+
namespace: false,
|
46
|
+
default: false,
|
47
|
+
update_label: 'Alterar',
|
48
|
+
choose_label: 'Escolher',
|
49
|
+
destroy_label: '×'.html_safe)
|
50
|
+
dimensions = upload_model_class.versions[options[:preview]]
|
51
|
+
@template.render partial: 'uploadbox/images/uploads_one', locals: {
|
52
|
+
upload_name: upload_name,
|
53
|
+
resource: @object,
|
54
|
+
form: self,
|
55
|
+
version: options[:preview],
|
56
|
+
width: dimensions[0],
|
57
|
+
height: dimensions[1],
|
58
|
+
namespace: options[:namespace],
|
59
|
+
default: options[:default],
|
60
|
+
removable: upload_model_class.removable?,
|
61
|
+
update_label: options[:update_label],
|
62
|
+
choose_label: options[:choose_label],
|
63
|
+
destroy_label: options[:destroy_label]
|
64
|
+
}
|
65
|
+
else
|
66
|
+
options.reverse_merge!(namespace: false,
|
67
|
+
default: false,
|
68
|
+
update_label: 'Alterar',
|
69
|
+
choose_label: 'Escolher',
|
70
|
+
destroy_label: '×'.html_safe)
|
71
|
+
dimensions = upload_model_class.versions[options[:preview]]
|
72
|
+
@template.render partial: 'uploadbox/files/uploads_one', locals: {
|
73
|
+
upload_name: upload_name,
|
74
|
+
resource: @object,
|
75
|
+
form: self,
|
76
|
+
namespace: options[:namespace],
|
77
|
+
removable: upload_model_class.removable?,
|
78
|
+
update_label: options[:update_label],
|
79
|
+
choose_label: options[:choose_label],
|
80
|
+
destroy_label: options[:destroy_label]
|
81
|
+
}
|
82
|
+
end
|
63
83
|
end
|
64
84
|
|
65
85
|
def uploads_many(upload_name, options={})
|
data/lib/uploadbox/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: uploadbox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.0
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Julio Protzek
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-07-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -547,6 +547,7 @@ executables: []
|
|
547
547
|
extensions: []
|
548
548
|
extra_rdoc_files: []
|
549
549
|
files:
|
550
|
+
- app/assets/javascripts/_file_uploader.coffee
|
550
551
|
- app/assets/javascripts/_gallery_uploader.coffee
|
551
552
|
- app/assets/javascripts/_image_uploader.coffee
|
552
553
|
- app/assets/javascripts/_manager.coffee
|
@@ -571,6 +572,7 @@ files:
|
|
571
572
|
- app/models/image.rb
|
572
573
|
- app/uploaders/uploadbox/image_processing_uploader.rb
|
573
574
|
- app/views/layouts/uploadbox/application.html.erb
|
575
|
+
- app/views/uploadbox/files/_uploads_one.slim
|
574
576
|
- app/views/uploadbox/images/_uploads_many.slim
|
575
577
|
- app/views/uploadbox/images/_uploads_one.slim
|
576
578
|
- app/views/uploadbox/images/find.json.jbuilder
|
@@ -606,9 +608,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
606
608
|
version: 1.9.3
|
607
609
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
608
610
|
requirements:
|
609
|
-
- - '
|
611
|
+
- - '>='
|
610
612
|
- !ruby/object:Gem::Version
|
611
|
-
version:
|
613
|
+
version: '0'
|
612
614
|
requirements: []
|
613
615
|
rubyforge_project:
|
614
616
|
rubygems_version: 2.1.11
|