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
@@ -1,95 +0,0 @@
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));
@@ -1,348 +0,0 @@
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
- }());
@@ -1,158 +0,0 @@
1
- /*
2
- * jQuery File Upload Processing Plugin 1.1
3
- * https://github.com/blueimp/jQuery-File-Upload
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
-
12
- /*jslint nomen: true, unparam: true */
13
- /*global define, window */
14
-
15
- (function (factory) {
16
- 'use strict';
17
- if (typeof define === 'function' && define.amd) {
18
- // Register as an anonymous AMD module:
19
- define([
20
- 'jquery',
21
- './jquery.fileupload'
22
- ], factory);
23
- } else {
24
- // Browser globals:
25
- factory(
26
- window.jQuery
27
- );
28
- }
29
- }(function ($) {
30
- 'use strict';
31
-
32
- var originalAdd = $.blueimp.fileupload.prototype.options.add;
33
-
34
- // The File Upload Processing plugin extends the fileupload widget
35
- // with file processing functionality:
36
- $.widget('blueimp.fileupload', $.blueimp.fileupload, {
37
-
38
- options: {
39
- // The list of processing actions:
40
- processQueue: [
41
- /*
42
- {
43
- action: 'log',
44
- type: 'debug'
45
- }
46
- */
47
- ],
48
- add: function (e, data) {
49
- var $this = $(this);
50
- data.process(function () {
51
- return $this.fileupload('process', data);
52
- });
53
- originalAdd.call(this, e, data);
54
- }
55
- },
56
-
57
- processActions: {
58
- /*
59
- log: function (data, options) {
60
- console[options.type](
61
- 'Processing "' + data.files[data.index].name + '"'
62
- );
63
- }
64
- */
65
- },
66
-
67
- _processFile: function (data) {
68
- var that = this,
69
- dfd = $.Deferred().resolveWith(that, [data]),
70
- chain = dfd.promise();
71
- this._trigger('process', null, data);
72
- $.each(data.processQueue, function (i, settings) {
73
- var func = function (data) {
74
- return that.processActions[settings.action].call(
75
- that,
76
- data,
77
- settings
78
- );
79
- };
80
- chain = chain.pipe(func, settings.always && func);
81
- });
82
- chain
83
- .done(function () {
84
- that._trigger('processdone', null, data);
85
- that._trigger('processalways', null, data);
86
- })
87
- .fail(function () {
88
- that._trigger('processfail', null, data);
89
- that._trigger('processalways', null, data);
90
- });
91
- return chain;
92
- },
93
-
94
- // Replaces the settings of each processQueue item that
95
- // are strings starting with an "@", using the remaining
96
- // substring as key for the option map,
97
- // e.g. "@autoUpload" is replaced with options.autoUpload:
98
- _transformProcessQueue: function (options) {
99
- var processQueue = [];
100
- $.each(options.processQueue, function () {
101
- var settings = {};
102
- $.each(this, function (key, value) {
103
- if ($.type(value) === 'string' &&
104
- value.charAt(0) === '@') {
105
- settings[key] = options[value.slice(1)];
106
- } else {
107
- settings[key] = value;
108
- }
109
- });
110
- processQueue.push(settings);
111
- });
112
- options.processQueue = processQueue;
113
- },
114
-
115
- // Returns the number of files currently in the processsing queue:
116
- processing: function () {
117
- return this._processing;
118
- },
119
-
120
- // Processes the files given as files property of the data parameter,
121
- // returns a Promise object that allows to bind callbacks:
122
- process: function (data) {
123
- var that = this,
124
- options = $.extend({}, this.options, data);
125
- if (options.processQueue && options.processQueue.length) {
126
- this._transformProcessQueue(options);
127
- if (this._processing === 0) {
128
- this._trigger('processstart');
129
- }
130
- $.each(data.files, function (index, file) {
131
- var opts = index ? $.extend({}, options) : options,
132
- func = function () {
133
- return that._processFile(opts);
134
- };
135
- opts.index = index;
136
- that._processing += 1;
137
- that._processingQueue = that._processingQueue.pipe(func, func)
138
- .always(function () {
139
- that._processing -= 1;
140
- if (that._processing === 0) {
141
- that._trigger('processstop');
142
- }
143
- });
144
- });
145
- }
146
- return this._processingQueue;
147
- },
148
-
149
- _create: function () {
150
- this._super();
151
- this._processing = 0;
152
- this._processingQueue = $.Deferred().resolveWith(this)
153
- .promise();
154
- }
155
-
156
- });
157
-
158
- }));