glebtv-rails-uploader 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +48 -146
  3. data/Rakefile +2 -2
  4. data/app/assets/javascripts/uploader/application.js +5 -6
  5. data/app/assets/javascripts/uploader/rails_admin.js +6 -25
  6. data/app/assets/stylesheets/uploader/application.css.sass +2 -0
  7. data/app/assets/stylesheets/uploader/{application.css → application.css.scss} +0 -0
  8. data/app/controllers/uploader/attachments_controller.rb +28 -50
  9. data/app/views/rails_admin/main/_form_rails_uploader.haml +1 -10
  10. data/app/views/uploader/default/_container.html.erb +49 -64
  11. data/app/views/uploader/default/_download.html.erb +16 -12
  12. data/app/views/uploader/default/_upload.html.erb +2 -2
  13. data/config/routes.rb +1 -5
  14. data/lib/glebtv-rails-uploader.rb +0 -1
  15. data/lib/uploader.rb +5 -5
  16. data/lib/uploader/asset.rb +84 -41
  17. data/lib/uploader/engine.rb +10 -6
  18. data/lib/uploader/fileuploads.rb +53 -31
  19. data/lib/uploader/helpers/field_tag.rb +24 -35
  20. data/lib/uploader/helpers/form_builder.rb +1 -1
  21. data/lib/uploader/helpers/form_tag_helper.rb +2 -3
  22. data/lib/uploader/hooks/formtastic.rb +10 -4
  23. data/lib/uploader/hooks/simple_form.rb +1 -3
  24. data/lib/uploader/version.rb +1 -1
  25. data/spec/dummy/app/models/article.rb +3 -7
  26. data/spec/dummy/app/models/asset.rb +26 -19
  27. data/spec/dummy/app/models/picture.rb +4 -4
  28. data/spec/dummy/config/application.rb +5 -7
  29. data/spec/dummy/config/environments/development.rb +1 -5
  30. data/spec/dummy/config/environments/production.rb +0 -4
  31. data/spec/dummy/config/environments/test.rb +2 -6
  32. data/spec/dummy/db/migrate/20120508093416_create_assets.rb +3 -1
  33. data/spec/factories/articles.rb +1 -0
  34. data/spec/factories/assets.rb +1 -0
  35. data/spec/fileuploads_spec.rb +2 -2
  36. data/spec/mongoid_spec.rb +4 -6
  37. data/spec/requests/attachments_controller_spec.rb +10 -2
  38. data/spec/spec_helper.rb +7 -3
  39. data/spec/uploader_spec.rb +1 -1
  40. data/{app → vendor}/assets/images/uploader/but_del_tag2.png +0 -0
  41. data/{app → vendor}/assets/images/uploader/ico_attach.png +0 -0
  42. data/{app → vendor}/assets/images/uploader/preloader.gif +0 -0
  43. data/{app → vendor}/assets/images/uploader/progressBarFillBg.png +0 -0
  44. data/vendor/assets/javascripts/uploader/jquery.fileupload-fp.js +8 -4
  45. data/{app → vendor}/assets/javascripts/uploader/jquery.fileupload-ui.js +219 -44
  46. data/{app → vendor}/assets/javascripts/uploader/jquery.fileupload.js +16 -74
  47. data/{app → vendor}/assets/javascripts/uploader/jquery.iframe-transport.js +3 -9
  48. data/vendor/assets/javascripts/uploader/load-image.min.js +1 -0
  49. data/{app → vendor}/assets/javascripts/uploader/locales/en.js +0 -0
  50. data/{app → vendor}/assets/javascripts/uploader/locales/ru.js +0 -0
  51. data/{app → vendor}/assets/javascripts/uploader/locales/uk.js +0 -0
  52. data/vendor/assets/javascripts/uploader/tmpl.min.js +1 -0
  53. data/{app/assets/stylesheets/uploader/default.css → vendor/assets/stylesheets/uploader/default.css.scss} +3 -11
  54. data/{app/assets/stylesheets/uploader/jquery.fileupload-ui.css → vendor/assets/stylesheets/uploader/jquery.fileupload-ui.css.scss} +0 -0
  55. metadata +78 -146
  56. data/app/assets/javascripts/uploader/canvas-to-blob.js +0 -95
  57. data/app/assets/javascripts/uploader/jquery.fileupload-angular.js +0 -348
  58. data/app/assets/javascripts/uploader/jquery.fileupload-process.js +0 -158
  59. data/app/assets/javascripts/uploader/jquery.fileupload-resize.js +0 -212
  60. data/app/assets/javascripts/uploader/jquery.fileupload-validate.js +0 -116
  61. data/app/assets/javascripts/uploader/jquery.ui.widget.js +0 -530
  62. data/app/assets/javascripts/uploader/load-image.js +0 -381
  63. data/app/assets/javascripts/uploader/tmpl.js +0 -86
  64. data/lib/file_size_validator.rb +0 -68
  65. data/spec/dummy/config/mongoid.yml +0 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 88efe49c0d42aff2f12db2360479b4251fedc7a6
4
- data.tar.gz: 6878df72b63fca3d0196d14fb5d4c3cc9c478b51
3
+ metadata.gz: c9ea7aed1c3dc17e2923dd15546cb0a417b1309d
4
+ data.tar.gz: 38353c20fc5a4c43a19cbad8f2f8c2b50f8d8bf7
5
5
  SHA512:
6
- metadata.gz: fc980ceee75826bfd9d73ac15a4ed178575bc7fb99b9e6ada11f6024cfefe70bb6bd7bc53e0d6efcb1fdc0ae682f69447e668dd78f0e1c80d04cb98cc7ed46c6
7
- data.tar.gz: beb74c354fa43d79cd95dd9ac9a2744c7c54bba1823e154d9d2d74a214cf8a76f0c8303155ab5faf95540fa046783f10f1783cc63d74983c83880f1206147c6c
6
+ metadata.gz: 8c0b5db051449405489eaaa1d65822d1c924a559f431c20cce280b4bd23914a7a4304ddaf27f6dbd980dcb1737d6973b6097ee82a212b88959f0bc413194f8e0
7
+ data.tar.gz: 55883971815eda043a179e150a78b806321dd6262b71274343c773fc9402413b0c21fd5625798db44c8d9bb58746f52f42010848eaf8310cbecf03579bb8d94e
data/README.md CHANGED
@@ -1,11 +1,4 @@
1
- ## this fork adds mongoid and rails_admin support.
2
- ## ActiveRecord support is dropped!
3
-
4
- This fork works when both simple form and formtastic are loaded
5
-
6
- Also nested associations are working
7
-
8
- ## HTML5 File uploader for rails
1
+ # HTML5 File uploader for rails
9
2
 
10
3
  This gem use https://github.com/blueimp/jQuery-File-Upload for upload files.
11
4
 
@@ -13,12 +6,12 @@ Preview:
13
6
 
14
7
  ![Uploader in use](http://img39.imageshack.us/img39/2206/railsuploader.png)
15
8
 
16
-
17
9
  ## Install
18
10
 
19
11
  In Gemfile:
20
- ``` ruby
21
- gem "glebtv-rails-uploader"
12
+
13
+ ```
14
+ gem "rails-uploader"
22
15
  ```
23
16
 
24
17
  In routes:
@@ -27,127 +20,13 @@ In routes:
27
20
  mount Uploader::Engine => '/uploader'
28
21
  ```
29
22
 
30
- ## HowTo for mongoid / carrierwave:
31
-
32
- ### Asset Parent Model (common)
33
- ``` ruby
34
- # models/asset.rb
35
- class Asset
36
- include Mongoid::Document
37
- include Uploader::Asset
38
-
39
- field :guid, type: String
40
- belongs_to :assetable, polymorphic: true
41
-
42
- # this workaround is sometimes needed so IDs are ObjectIDs not strings
43
- before_save do
44
- return true if self.assetable_id.nil? || !self.assetable_id.is_a?(String)
45
- if defined?(Moped::BSON)
46
- self.assetable_id = Moped::BSON::ObjectId.from_string(self.assetable_id) if Moped::BSON::ObjectId.legal?(self.assetable_id)
47
- else
48
- self.assetable_id = BSON::ObjectId.from_string(self.assetable_id) if BSON::ObjectId.legal?(self.assetable_id)
49
- end
50
- true
51
- end
52
- end
53
- ```
54
-
55
- ### Your asset model
56
- ``` ruby
57
- # models/cover.rb
58
- class Cover < Asset
59
- # DO NOT add this!
60
- # belongs_to :post
61
-
62
- # optional built-in sorting for rails_admin
63
- field :sort, type: Integer
64
-
65
- # field name must be 'data'
66
- mount_uploader :data, CoverUploader
67
-
68
- validates :data,
69
- :presence => true,
70
- :file_size => {
71
- :maximum => 5.megabytes.to_i
72
- }
73
-
74
- def to_jq_upload
75
- {
76
- 'id' => id.to_s,
77
- "filename" => File.basename(data.path),
78
- "url" => data.url,
79
- 'thumb_url' => data.thumb.url,
80
- }
81
- end
82
- end
83
- ```
84
-
85
- ### Model to which you want to add assets
86
- ```ruby
87
- # models/post.rb
88
- class Post
89
- include Mongoid::Document
90
-
91
- field :fileupload_guid, type: String
92
-
93
- include Uploader::Fileuploads
94
- has_one :cover, as: :assetable
95
- fileuploads :cover
96
- end
97
- ```
98
-
99
- ### has_many
100
-
101
- ```ruby
102
- class Album
103
- has_many :pictures, as: :assetable, dependent: :destroy
104
- fileuploads :pictures
105
-
106
- accepts_nested_attributes_for :pictures
107
-
108
- rails_admin do
109
- edit do
110
- ...
111
- field :fileupload_guid, :hidden # this is needed or else rails_admin sanitizes it away
112
- field :pictures, :rails_uploader
113
- end
114
- end
115
- end
116
-
117
- ```
118
-
119
- ### CarrierWave uploader - all like usual
120
- ```ruby
121
- # uploades/cover_uploader.rb
122
- class CoverUploader < CarrierWave::Uploader::Base
123
- include CarrierWave::MiniMagick
124
-
125
- storage :file
126
-
127
- def store_dir
128
- "uploads/covers/#{model.id}"
129
- end
130
-
131
- version :thumb do
132
- process resize_to_limit: [50, 50]
133
- end
134
- end
135
- ```
136
-
137
- # Active Admin and RailsAdmin are both working
23
+ Migration for ActiveRecord:
138
24
 
139
- # RailsAdmin Integration
140
- ``` ruby
141
- rails_admin do
142
- edit do
143
- ...
144
- field :fileupload_guid, :hidden # this is needed or else rails_admin sanitizes it away
145
- field :pictures, :rails_uploader
146
- end
147
- end
25
+ ```bash
26
+ $> rake uploader:install:migrations
148
27
  ```
149
28
 
150
- ## Usage (Original description)
29
+ ## Usage
151
30
 
152
31
  Architecture to store uploaded files (cancan integration):
153
32
 
@@ -182,6 +61,17 @@ class Picture < Asset
182
61
 
183
62
  validates_integrity_of :data
184
63
  validates_filesize_of :data, :maximum => 2.megabytes.to_i
64
+
65
+ # structure of returned json array of files. (used in Hash.to_json operation)
66
+ def serializable_hash(options=nil)
67
+ {
68
+ "id" => id.to_s,
69
+ "filename" => File.basename(data.path),
70
+ "url" => data.url,
71
+ "thumb_url" => data.url(:thumb),
72
+ "public_token" => public_token
73
+ }
74
+ end
185
75
  end
186
76
  ```
187
77
 
@@ -206,66 +96,78 @@ Find asset by foreign key or guid:
206
96
 
207
97
  ### Mongoid
208
98
 
99
+ No parent asset model is required, one only has to `include Uploader::Asset::Mongoid` into the
100
+ model that should act like an asset:
101
+
209
102
  ``` ruby
210
- class Asset
103
+ class Picture
211
104
  include Mongoid::Document
212
105
  include Uploader::Asset::Mongoid
213
106
 
214
- belongs_to :assetable, polymorphic: true
107
+ belongs_to :user
215
108
  end
216
109
 
217
- class Picture < Asset
218
- mount_uploader :data, ImageUploader
110
+ class User
111
+ include Mongoid::Document
112
+ include Uploader::Fileuploads
113
+
114
+ has_one :picture, :as => :assetable
219
115
 
220
- default_scope asc( :sort_order )
116
+ fileuploads :picture
221
117
  end
118
+ ```
119
+
120
+ ### Notice
222
121
 
122
+ User method fileuploads only once pre model. So if you have many attached files, use this:
123
+
124
+ ``` ruby
223
125
  class User
224
- include Mongoid::Document
225
- include Uploader::Fileuploads::Mongoid
126
+ include Uploader::Fileuploads
226
127
 
227
- has_many :pictures, :as => :assetable
128
+ has_one :picture, :as => :assetable
129
+ has_one :avatar, :as => :assetable
228
130
 
229
- fileuploads :pictures
131
+ fileuploads :picture, :avatar
230
132
  end
231
133
  ```
232
134
 
135
+
233
136
  ### Include assets
234
137
 
235
138
  Javascripts:
236
139
 
237
- ``` ruby
238
- //= require jquery.ui.widget
140
+ ```
239
141
  //= require uploader/application
240
142
  ```
241
143
 
242
144
  Stylesheets:
243
145
 
244
- ``` ruby
146
+ ```
245
147
  *= require uploader/application
246
148
  ```
247
149
 
248
150
  ### Views
249
151
 
250
- ``` ruby
152
+ ```erb
251
153
  <%= uploader_field_tag :article, :photo %>
252
154
  ```
253
155
 
254
156
  or FormBuilder:
255
157
 
256
- ``` ruby
158
+ ```erb
257
159
  <%= form.uploader_field :photo, :sortable => true %>
258
160
  ```
259
161
 
260
162
  ### Formtastic
261
163
 
262
- ``` ruby
164
+ ```erb
263
165
  <%= f.input :pictures, :as => :uploader %>
264
166
  ```
265
167
 
266
168
  ### SimpleForm
267
169
 
268
- ``` ruby
170
+ ```erb
269
171
  <%= f.input :pictures, :as => :uploader, :input_html => {:sortable => true} %>
270
172
  ```
271
173
 
@@ -273,7 +175,7 @@ or FormBuilder:
273
175
 
274
176
  This is only working in Formtastic and FormBuilder:
275
177
 
276
- ``` ruby
178
+ ``` erb
277
179
  # formtastic
278
180
  <%= f.input :picture, :as => :uploader, :confirm_delete => true %>
279
181
  # the i18n lookup key would be en.formtastic.delete_confirmations.picture
data/Rakefile CHANGED
@@ -1,6 +1,4 @@
1
1
  # encoding: utf-8
2
- require 'bundler/gem_tasks'
3
-
4
2
  require 'rake'
5
3
  require 'rake/testtask'
6
4
  require 'rdoc/task'
@@ -24,3 +22,5 @@ Rake::RDocTask.new(:rdoc) do |rdoc|
24
22
  rdoc.rdoc_files.include('README.rdoc')
25
23
  rdoc.rdoc_files.include('lib/**/*.rb')
26
24
  end
25
+
26
+ require "bundler/gem_tasks"
@@ -1,9 +1,8 @@
1
- //= require uploader/tmpl
2
- //= require uploader/canvas-to-blob
3
- //= require uploader/load-image
1
+ //= require uploader/jquery.ui.widget
2
+ //= require uploader/locales/en
3
+ //= require uploader/tmpl.min
4
+ //= require uploader/load-image.min
5
+ //= require uploader/jquery.iframe-transport
4
6
  //= require uploader/jquery.fileupload
5
- //= require uploader/jquery.fileupload-process
6
- //= require uploader/jquery.fileupload-resize
7
- //= require uploader/jquery.fileupload-validate
8
7
  //= require uploader/jquery.fileupload-ui
9
8
 
@@ -1,27 +1,8 @@
1
- //= require uploader/tmpl
2
- //= require uploader/canvas-to-blob
3
- //= require uploader/load-image
1
+ //= require uploader/jquery.ui.widget
2
+ //= require uploader/jquery.ui.sortable
3
+ //= require uploader/locales/en
4
+ //= require uploader/tmpl.min
5
+ //= require uploader/load-image.min
6
+ //= require uploader/jquery.iframe-transport
4
7
  //= require uploader/jquery.fileupload
5
- //= require uploader/jquery.fileupload-process
6
- //= require uploader/jquery.fileupload-resize
7
- //= require uploader/jquery.fileupload-validate
8
8
  //= require uploader/jquery.fileupload-ui
9
-
10
- $(document).off('init.sort').on('init.sort', '.uploader-files', function() {
11
- var $t = $(this);
12
- $t.sortable({
13
- update: function(event, ui) {
14
- var sort = [];
15
- $t.children().each(function() {
16
- sort.push($(this).data('id'));
17
- });
18
- $.ajax({
19
- type: 'POST',
20
- url: $t.data('sortPath'),
21
- data: {sort: sort.join('|')}
22
- })
23
- }
24
- })
25
- });
26
-
27
- $('.uploader-dnd-area input[type=file]').trigger("init.uploader");
@@ -0,0 +1,2 @@
1
+ @import uploader/jquery.fileupload-ui
2
+ @import uploader/default
@@ -1,79 +1,57 @@
1
- # encoding: utf-8
2
1
  module Uploader
3
2
  class AttachmentsController < ActionController::Metal
4
3
  include AbstractController::Callbacks
5
-
4
+
6
5
  before_filter :find_klass
7
-
6
+ before_filter :find_asset, :only => [:destroy]
7
+
8
8
  def create
9
9
  @asset = @klass.new(params[:asset])
10
10
  @asset.uploader_create(params, request)
11
11
  render_resourse(@asset, 201)
12
12
  end
13
+
14
+ def update
15
+ @assets = Array.wrap(params[:assets] || [])
13
16
 
14
- def destroy
15
- begin
16
- @asset = @klass.find(params[:id])
17
- rescue
18
- @asset = @klass.where(guid: params[:guid])
19
- end
20
- @asset.uploader_destroy(params, request)
21
- render_resourse(@asset, 200)
22
- end
23
-
24
- def sort
25
- @model = params[:assetable_type].safe_constantize
26
-
27
- sort = params[:sort].split('|')
28
- if params[:assetable_id].blank?
29
- @finder = @klass.where(guid: params[:guid])
30
- else
31
- @finder = @klass.where(assetable_id: params[:assetable_id])
17
+ @assets.each_with_index do |id, index|
18
+ @klass.where(:id => id).update_all(:sort => index)
32
19
  end
33
20
 
34
- @finder.each do |asset|
35
- if asset.respond_to?(:sort=)
36
- asset.sort = sort.index(asset.id.to_s)
37
- asset.save!
38
- end
39
- end
40
-
41
- self.status = 200
42
- self.content_type = "application/json"
43
- self.response_body = '{"ok": true}'
21
+ render_json({files: []})
44
22
  end
45
23
 
24
+ def destroy
25
+ @asset.uploader_destroy(params, request)
26
+ render_json({success: true})
27
+ end
28
+
46
29
  protected
47
-
48
-
49
- def airbrake_request_data
50
- {
51
- :controller => params[:controller],
52
- :action => params[:action],
53
- }
54
- end
55
-
30
+
56
31
  def find_klass
57
- @klass = params[:klass].blank? ? nil : params[:klass].safe_constantize
32
+ @klass = Uploader.constantize(params[:klass])
58
33
  raise ActionController::RoutingError.new("Class not found #{params[:klass]}") if @klass.nil?
59
34
  end
60
35
 
36
+ def find_asset
37
+ @asset = @klass.where(:public_token => params[:id]).first
38
+ raise ActionController::RoutingError.new("Asset not found by guid #{params[:id]}") if @asset.nil?
39
+ end
40
+
61
41
  def render_resourse(record, status = 200)
62
42
  if record.errors.empty?
63
- if record.respond_to?(:to_jq_upload)
64
- render_json({'files' => Array.wrap(record.to_jq_upload)}.to_json, status)
65
- else
66
- render_json({'files' => Array.wrap(record)}.to_json, status)
67
- end
43
+ render_json({:files => [record.to_jq_upload]}, status)
68
44
  else
69
- render_json([record.errors].to_json, 422)
45
+ render_json(record.errors, 422)
70
46
  end
71
47
  end
48
+
49
+ def render_json(hash_or_object, status = 200)
50
+ ctype = env["HTTP_USER_AGENT"] && env["HTTP_USER_AGENT"].include?("Android") ? "text/plain" : "application/json"
72
51
 
73
- def render_json(body, status = 200)
74
52
  self.status = status
75
- self.content_type = "application/json"
76
- self.response_body = body
53
+ self.content_type = ctype
54
+ self.response_body = hash_or_object.to_json(:root => false)
77
55
  end
78
56
  end
79
57
  end