glebtv-rails-uploader 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +17 -10
  3. data/{vendor → app}/assets/images/uploader/but_del_tag2.png +0 -0
  4. data/{vendor → app}/assets/images/uploader/ico_attach.png +0 -0
  5. data/{vendor → app}/assets/images/uploader/preloader.gif +0 -0
  6. data/{vendor → app}/assets/images/uploader/progressBarFillBg.png +0 -0
  7. data/app/assets/javascripts/uploader/application.js +2 -2
  8. data/app/assets/javascripts/uploader/canvas-to-blob.js +95 -0
  9. data/app/assets/javascripts/uploader/jquery.fileupload-angular.js +348 -0
  10. data/app/assets/javascripts/uploader/jquery.fileupload-process.js +158 -0
  11. data/app/assets/javascripts/uploader/jquery.fileupload-resize.js +212 -0
  12. data/{vendor → app}/assets/javascripts/uploader/jquery.fileupload-ui.js +265 -269
  13. data/app/assets/javascripts/uploader/jquery.fileupload-validate.js +116 -0
  14. data/{vendor → app}/assets/javascripts/uploader/jquery.fileupload.js +655 -258
  15. data/{vendor → app}/assets/javascripts/uploader/jquery.iframe-transport.js +29 -9
  16. data/app/assets/javascripts/uploader/jquery.ui.widget.js +530 -0
  17. data/app/assets/javascripts/uploader/load-image.js +381 -0
  18. data/{vendor → app}/assets/javascripts/uploader/locales/en.js +0 -0
  19. data/{vendor → app}/assets/javascripts/uploader/locales/ru.js +0 -0
  20. data/{vendor → app}/assets/javascripts/uploader/locales/uk.js +0 -0
  21. data/app/assets/javascripts/uploader/rails_admin.js +26 -24
  22. data/app/assets/javascripts/uploader/tmpl.js +86 -0
  23. data/{vendor → app}/assets/stylesheets/uploader/default.css +0 -0
  24. data/{vendor → app}/assets/stylesheets/uploader/jquery.fileupload-ui.css +0 -0
  25. data/app/controllers/uploader/attachments_controller.rb +13 -10
  26. data/app/views/rails_admin/main/_form_rails_uploader.haml +9 -9
  27. data/app/views/uploader/default/_container.html.erb +1 -2
  28. data/app/views/uploader/default/_download.html.erb +1 -1
  29. data/lib/uploader/asset.rb +2 -2
  30. data/lib/uploader/engine.rb +4 -4
  31. data/lib/uploader/fileuploads.rb +18 -18
  32. data/lib/uploader/helpers/field_tag.rb +16 -17
  33. data/lib/uploader/helpers/form_builder.rb +1 -1
  34. data/lib/uploader/helpers/form_tag_helper.rb +1 -1
  35. data/lib/uploader/hooks/formtastic.rb +1 -2
  36. data/lib/uploader/rails_admin/field.rb +27 -27
  37. data/lib/uploader/version.rb +1 -1
  38. metadata +115 -131
  39. data/vendor/assets/javascripts/uploader/jquery.fileupload-ip.js +0 -160
  40. data/vendor/assets/javascripts/uploader/jquery.ui.widget.js +0 -282
  41. data/vendor/assets/javascripts/uploader/load-image.min.js +0 -1
  42. data/vendor/assets/javascripts/uploader/tmpl.min.js +0 -1
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7d583687777e18cb84615643e8d052d340b42fc2
4
+ data.tar.gz: 736689da394ccc26adb783a08ba1914f1a196a29
5
+ SHA512:
6
+ metadata.gz: 93268c2f5c15e9c184e389174e309dae458ddb0c776063e6cbc8f54d3b74e6ea78811e1bbc42719e3ad7063908a341a6ecf2c0eb0c7c0b1381c6e888c76cc96d
7
+ data.tar.gz: 19d7de68f7c36612dfcd58b3a195eab73787e3d6ef609b8ed084294fec1331b2da9ae441dac35aadfeb291f8eae8d25ecb308d253c2bdfea059332342b9c6ed7
data/README.md CHANGED
@@ -1,10 +1,10 @@
1
- # this fork adds mongoid and rails_admin support
1
+ ## this fork adds mongoid and rails_admin support
2
2
 
3
3
  This fork works when both simple form and formtastic are loaded
4
4
 
5
5
  Also nested associations are working
6
6
 
7
- # HTML5 File uploader for rails
7
+ ## HTML5 File uploader for rails
8
8
 
9
9
  This gem use https://github.com/blueimp/jQuery-File-Upload for upload files.
10
10
 
@@ -37,8 +37,15 @@ mount Uploader::Engine => '/uploader'
37
37
 
38
38
  field :guid, type: String
39
39
  belongs_to :assetable, polymorphic: true
40
+
41
+ # this workaround is sometimes needed so IDs are ObjectIDs not strings before_save do
42
+ if !assetable_id.blank? && !assetable_id.class.name == "Moped::BSON::ObjectId" && Moped::BSON::ObjectId.legal?(assetable_id)
43
+ self.assetable_id = Moped::BSON::ObjectId.from_string(assetable_id)
44
+ end
45
+ true
40
46
  end
41
- ```
47
+ end
48
+ ```
42
49
 
43
50
  ### Your asset model
44
51
  ``` ruby
@@ -142,10 +149,10 @@ Architecture to store uploaded files (cancan integration):
142
149
  ``` ruby
143
150
  class Asset < ActiveRecord::Base
144
151
  include Uploader::Asset
145
-
152
+
146
153
  def uploader_create(params, request = nil)
147
154
  ability = Ability.new(request.env['warden'].user)
148
-
155
+
149
156
  if ability.can? :create, self
150
157
  self.user = request.env['warden'].user
151
158
  super
@@ -153,10 +160,10 @@ class Asset < ActiveRecord::Base
153
160
  errors.add(:id, :access_denied)
154
161
  end
155
162
  end
156
-
163
+
157
164
  def uploader_destroy(params, request = nil)
158
165
  ability = Ability.new(request.env['warden'].user)
159
-
166
+
160
167
  if ability.can? :delete, self
161
168
  super
162
169
  else
@@ -167,7 +174,7 @@ end
167
174
 
168
175
  class Picture < Asset
169
176
  mount_uploader :data, PictureUploader
170
-
177
+
171
178
  validates_integrity_of :data
172
179
  validates_filesize_of :data, :maximum => 2.megabytes.to_i
173
180
  end
@@ -178,7 +185,7 @@ For example user has one picture:
178
185
  ``` ruby
179
186
  class User < ActiveRecord::Base
180
187
  has_one :picture, :as => :assetable, :dependent => :destroy
181
-
188
+
182
189
  fileuploads :picture
183
190
 
184
191
  # If your don't use strong_parameters, uncomment next line
@@ -203,7 +210,7 @@ Javascripts:
203
210
  Stylesheets:
204
211
 
205
212
  ``` ruby
206
- *= require uploader/application
213
+ *= require uploader/application
207
214
  ```
208
215
 
209
216
  ### Views
@@ -1,6 +1,6 @@
1
1
  //= require uploader/locales/en
2
- //= require uploader/tmpl.min
3
- //= require uploader/load-image.min
2
+ //= require uploader/tmpl
3
+ //= require uploader/load-image
4
4
  //= require uploader/jquery.ui.widget
5
5
  //= require uploader/jquery.iframe-transport
6
6
  //= require uploader/jquery.fileupload
@@ -0,0 +1,95 @@
1
+ /*
2
+ * JavaScript Canvas to Blob 2.0.5
3
+ * https://github.com/blueimp/JavaScript-Canvas-to-Blob
4
+ *
5
+ * Copyright 2012, Sebastian Tschan
6
+ * https://blueimp.net
7
+ *
8
+ * Licensed under the MIT license:
9
+ * http://www.opensource.org/licenses/MIT
10
+ *
11
+ * Based on stackoverflow user Stoive's code snippet:
12
+ * http://stackoverflow.com/q/4998908
13
+ */
14
+
15
+ /*jslint nomen: true, regexp: true */
16
+ /*global window, atob, Blob, ArrayBuffer, Uint8Array, define */
17
+
18
+ (function (window) {
19
+ 'use strict';
20
+ var CanvasPrototype = window.HTMLCanvasElement &&
21
+ window.HTMLCanvasElement.prototype,
22
+ hasBlobConstructor = window.Blob && (function () {
23
+ try {
24
+ return Boolean(new Blob());
25
+ } catch (e) {
26
+ return false;
27
+ }
28
+ }()),
29
+ hasArrayBufferViewSupport = hasBlobConstructor && window.Uint8Array &&
30
+ (function () {
31
+ try {
32
+ return new Blob([new Uint8Array(100)]).size === 100;
33
+ } catch (e) {
34
+ return false;
35
+ }
36
+ }()),
37
+ BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder ||
38
+ window.MozBlobBuilder || window.MSBlobBuilder,
39
+ dataURLtoBlob = (hasBlobConstructor || BlobBuilder) && window.atob &&
40
+ window.ArrayBuffer && window.Uint8Array && function (dataURI) {
41
+ var byteString,
42
+ arrayBuffer,
43
+ intArray,
44
+ i,
45
+ mimeString,
46
+ bb;
47
+ if (dataURI.split(',')[0].indexOf('base64') >= 0) {
48
+ // Convert base64 to raw binary data held in a string:
49
+ byteString = atob(dataURI.split(',')[1]);
50
+ } else {
51
+ // Convert base64/URLEncoded data component to raw binary data:
52
+ byteString = decodeURIComponent(dataURI.split(',')[1]);
53
+ }
54
+ // Write the bytes of the string to an ArrayBuffer:
55
+ arrayBuffer = new ArrayBuffer(byteString.length);
56
+ intArray = new Uint8Array(arrayBuffer);
57
+ for (i = 0; i < byteString.length; i += 1) {
58
+ intArray[i] = byteString.charCodeAt(i);
59
+ }
60
+ // Separate out the mime component:
61
+ mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
62
+ // Write the ArrayBuffer (or ArrayBufferView) to a blob:
63
+ if (hasBlobConstructor) {
64
+ return new Blob(
65
+ [hasArrayBufferViewSupport ? intArray : arrayBuffer],
66
+ {type: mimeString}
67
+ );
68
+ }
69
+ bb = new BlobBuilder();
70
+ bb.append(arrayBuffer);
71
+ return bb.getBlob(mimeString);
72
+ };
73
+ if (window.HTMLCanvasElement && !CanvasPrototype.toBlob) {
74
+ if (CanvasPrototype.mozGetAsFile) {
75
+ CanvasPrototype.toBlob = function (callback, type, quality) {
76
+ if (quality && CanvasPrototype.toDataURL && dataURLtoBlob) {
77
+ callback(dataURLtoBlob(this.toDataURL(type, quality)));
78
+ } else {
79
+ callback(this.mozGetAsFile('blob', type));
80
+ }
81
+ };
82
+ } else if (CanvasPrototype.toDataURL && dataURLtoBlob) {
83
+ CanvasPrototype.toBlob = function (callback, type, quality) {
84
+ callback(dataURLtoBlob(this.toDataURL(type, quality)));
85
+ };
86
+ }
87
+ }
88
+ if (typeof define === 'function' && define.amd) {
89
+ define(function () {
90
+ return dataURLtoBlob;
91
+ });
92
+ } else {
93
+ window.dataURLtoBlob = dataURLtoBlob;
94
+ }
95
+ }(this));
@@ -0,0 +1,348 @@
1
+ /*
2
+ * jQuery File Upload AngularJS Plugin 1.0.1
3
+ * https://github.com/blueimp/jQuery-File-Upload
4
+ *
5
+ * Copyright 2013, Sebastian Tschan
6
+ * https://blueimp.net
7
+ *
8
+ * Licensed under the MIT license:
9
+ * http://www.opensource.org/licenses/MIT
10
+ */
11
+
12
+ /*jslint nomen: true, unparam: true */
13
+ /*global angular */
14
+
15
+ (function () {
16
+ 'use strict';
17
+
18
+ angular.module('blueimp.fileupload', [])
19
+
20
+ .provider('fileUpload', function () {
21
+ var scopeApply = function () {
22
+ var scope = angular.element(this)
23
+ .fileupload('option', 'scope')();
24
+ if (!scope.$$phase) {
25
+ scope.$apply();
26
+ }
27
+ },
28
+ $config;
29
+ $config = this.defaults = {
30
+ handleResponse: function (e, data) {
31
+ var files = data.result && data.result.files;
32
+ if (files) {
33
+ data.scope().replace(data.files, files);
34
+ } else if (data.errorThrown ||
35
+ data.textStatus === 'error') {
36
+ data.files[0].error = data.errorThrown ||
37
+ data.textStatus;
38
+ }
39
+ },
40
+ add: function (e, data) {
41
+ var scope = data.scope();
42
+ data.process(function () {
43
+ return scope.process(data);
44
+ }).always(
45
+ function () {
46
+ var file = data.files[0],
47
+ submit = function () {
48
+ return data.submit();
49
+ };
50
+ file.$cancel = function () {
51
+ scope.clear(data.files);
52
+ return data.abort();
53
+ };
54
+ file.$state = function () {
55
+ return data.state();
56
+ };
57
+ file.$progress = function () {
58
+ return data.progress();
59
+ };
60
+ file.$response = function () {
61
+ return data.response();
62
+ };
63
+ if (file.$state() === 'rejected') {
64
+ file._$submit = submit;
65
+ } else {
66
+ file.$submit = submit;
67
+ }
68
+ scope.$apply(function () {
69
+ var method = scope.option('prependFiles') ?
70
+ 'unshift' : 'push';
71
+ Array.prototype[method].apply(
72
+ scope.queue,
73
+ data.files
74
+ );
75
+ if (file.$submit &&
76
+ (scope.option('autoUpload') ||
77
+ data.autoUpload) &&
78
+ data.autoUpload !== false) {
79
+ file.$submit();
80
+ }
81
+ });
82
+ }
83
+ );
84
+ },
85
+ progress: function (e, data) {
86
+ data.scope().$apply();
87
+ },
88
+ done: function (e, data) {
89
+ var that = this;
90
+ data.scope().$apply(function () {
91
+ data.handleResponse.call(that, e, data);
92
+ });
93
+ },
94
+ fail: function (e, data) {
95
+ var that = this;
96
+ if (data.errorThrown === 'abort') {
97
+ return;
98
+ }
99
+ if (data.dataType.indexOf('json') === data.dataType.length - 4) {
100
+ try {
101
+ data.result = angular.fromJson(data.jqXHR.responseText);
102
+ } catch (err) {}
103
+ }
104
+ data.scope().$apply(function () {
105
+ data.handleResponse.call(that, e, data);
106
+ });
107
+ },
108
+ stop: scopeApply,
109
+ processstart: scopeApply,
110
+ processstop: scopeApply,
111
+ getNumberOfFiles: function () {
112
+ return this.scope().queue.length;
113
+ },
114
+ dataType: 'json',
115
+ prependFiles: true,
116
+ autoUpload: false
117
+ };
118
+ this.$get = [
119
+ function () {
120
+ return {
121
+ defaults: $config
122
+ };
123
+ }
124
+ ];
125
+ })
126
+
127
+ .provider('formatFileSizeFilter', function () {
128
+ var $config = this.defaults = {
129
+ // Byte units following the IEC format
130
+ // http://en.wikipedia.org/wiki/Kilobyte
131
+ units: [
132
+ {size: 1000000000, suffix: ' GB'},
133
+ {size: 1000000, suffix: ' MB'},
134
+ {size: 1000, suffix: ' KB'}
135
+ ]
136
+ };
137
+ this.$get = function () {
138
+ return function (bytes) {
139
+ if (!angular.isNumber(bytes)) {
140
+ return '';
141
+ }
142
+ var unit = true,
143
+ i = -1;
144
+ while (unit) {
145
+ unit = $config.units[i += 1];
146
+ if (i === $config.units.length - 1 || bytes >= unit.size) {
147
+ return (bytes / unit.size).toFixed(2) + unit.suffix;
148
+ }
149
+ }
150
+ };
151
+ };
152
+ })
153
+
154
+ .controller('FileUploadController', [
155
+ '$scope', '$element', '$attrs', 'fileUpload',
156
+ function ($scope, $element, $attrs, fileUpload) {
157
+ $scope.disabled = angular.element('<input type="file">')
158
+ .prop('disabled');
159
+ $scope.queue = $scope.queue || [];
160
+ $scope.clear = function (files) {
161
+ var queue = this.queue,
162
+ i = queue.length,
163
+ file = files,
164
+ length = 1;
165
+ if (angular.isArray(files)) {
166
+ file = files[0];
167
+ length = files.length;
168
+ }
169
+ while (i) {
170
+ if (queue[i -= 1] === file) {
171
+ return queue.splice(i, length);
172
+ }
173
+ }
174
+ };
175
+ $scope.replace = function (oldFiles, newFiles) {
176
+ var queue = this.queue,
177
+ file = oldFiles[0],
178
+ i,
179
+ j;
180
+ for (i = 0; i < queue.length; i += 1) {
181
+ if (queue[i] === file) {
182
+ for (j = 0; j < newFiles.length; j += 1) {
183
+ queue[i + j] = newFiles[j];
184
+ }
185
+ return;
186
+ }
187
+ }
188
+ };
189
+ $scope.progress = function () {
190
+ return $element.fileupload('progress');
191
+ };
192
+ $scope.active = function () {
193
+ return $element.fileupload('active');
194
+ };
195
+ $scope.option = function (option, data) {
196
+ return $element.fileupload('option', option, data);
197
+ };
198
+ $scope.add = function (data) {
199
+ return $element.fileupload('add', data);
200
+ };
201
+ $scope.send = function (data) {
202
+ return $element.fileupload('send', data);
203
+ };
204
+ $scope.process = function (data) {
205
+ return $element.fileupload('process', data);
206
+ };
207
+ $scope.processing = function (data) {
208
+ return $element.fileupload('processing', data);
209
+ };
210
+ $scope.applyOnQueue = function (method) {
211
+ var list = this.queue.slice(0),
212
+ i,
213
+ file;
214
+ for (i = 0; i < list.length; i += 1) {
215
+ file = list[i];
216
+ if (file[method]) {
217
+ file[method]();
218
+ }
219
+ }
220
+ };
221
+ $scope.submit = function () {
222
+ this.applyOnQueue('$submit');
223
+ };
224
+ $scope.cancel = function () {
225
+ this.applyOnQueue('$cancel');
226
+ };
227
+ // The fileupload widget will initialize with
228
+ // the options provided via "data-"-parameters,
229
+ // as well as those given via options object:
230
+ $element.fileupload(angular.extend(
231
+ {scope: function () {
232
+ return $scope;
233
+ }},
234
+ fileUpload.defaults
235
+ )).on('fileuploadadd', function (e, data) {
236
+ data.scope = $scope.option('scope');
237
+ }).on([
238
+ 'fileuploadadd',
239
+ 'fileuploadsubmit',
240
+ 'fileuploadsend',
241
+ 'fileuploaddone',
242
+ 'fileuploadfail',
243
+ 'fileuploadalways',
244
+ 'fileuploadprogress',
245
+ 'fileuploadprogressall',
246
+ 'fileuploadstart',
247
+ 'fileuploadstop',
248
+ 'fileuploadchange',
249
+ 'fileuploadpaste',
250
+ 'fileuploaddrop',
251
+ 'fileuploaddragover',
252
+ 'fileuploadchunksend',
253
+ 'fileuploadchunkdone',
254
+ 'fileuploadchunkfail',
255
+ 'fileuploadchunkalways',
256
+ 'fileuploadprocessstart',
257
+ 'fileuploadprocess',
258
+ 'fileuploadprocessdone',
259
+ 'fileuploadprocessfail',
260
+ 'fileuploadprocessalways',
261
+ 'fileuploadprocessstop'
262
+ ].join(' '), function (e, data) {
263
+ $scope.$emit(e.type, data);
264
+ });
265
+ // Observe option changes:
266
+ $scope.$watch(
267
+ $attrs.fileupload,
268
+ function (newOptions, oldOptions) {
269
+ if (newOptions) {
270
+ $element.fileupload('option', newOptions);
271
+ }
272
+ }
273
+ );
274
+ }
275
+ ])
276
+
277
+ .controller('FileUploadProgressController', [
278
+ '$scope', '$attrs', '$parse',
279
+ function ($scope, $attrs, $parse) {
280
+ var fn = $parse($attrs.progress),
281
+ update = function () {
282
+ var progress = fn($scope);
283
+ if (!progress || !progress.total) {
284
+ return;
285
+ }
286
+ $scope.num = Math.floor(
287
+ progress.loaded / progress.total * 100
288
+ );
289
+ };
290
+ update();
291
+ $scope.$watch(
292
+ $attrs.progress + '.loaded',
293
+ function (newValue, oldValue) {
294
+ if (newValue !== oldValue) {
295
+ update();
296
+ }
297
+ }
298
+ );
299
+ }
300
+ ])
301
+
302
+ .controller('FileUploadPreviewController', [
303
+ '$scope', '$element', '$attrs', '$parse',
304
+ function ($scope, $element, $attrs, $parse) {
305
+ var fn = $parse($attrs.preview),
306
+ file = fn($scope);
307
+ if (file.preview) {
308
+ $element.append(file.preview);
309
+ }
310
+ }
311
+ ])
312
+
313
+ .directive('fileupload', function () {
314
+ return {
315
+ controller: 'FileUploadController'
316
+ };
317
+ })
318
+
319
+ .directive('progress', function () {
320
+ return {
321
+ controller: 'FileUploadProgressController'
322
+ };
323
+ })
324
+
325
+ .directive('preview', function () {
326
+ return {
327
+ controller: 'FileUploadPreviewController'
328
+ };
329
+ })
330
+
331
+ .directive('download', function () {
332
+ return function (scope, elm, attrs) {
333
+ elm.on('dragstart', function (e) {
334
+ try {
335
+ e.originalEvent.dataTransfer.setData(
336
+ 'DownloadURL',
337
+ [
338
+ 'application/octet-stream',
339
+ elm.prop('download'),
340
+ elm.prop('href')
341
+ ].join(':')
342
+ );
343
+ } catch (err) {}
344
+ });
345
+ };
346
+ });
347
+
348
+ }());