avatars_for_rails 0.2.2 → 0.2.3

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 (26) hide show
  1. data/{lib/generators/avatars_for_rails/templates/public → app/assets}/images/Jcrop.gif +0 -0
  2. data/{lib/generators/avatars_for_rails/templates/public → app/assets}/images/cancel.png +0 -0
  3. data/avatars_for_rails.gemspec +1 -1
  4. data/vendor/assets/javascripts/jquery.fileupload-ui.js +333 -63
  5. data/vendor/assets/javascripts/jquery.fileupload.js +654 -173
  6. data/vendor/assets/stylesheets/jquery.fileupload-ui.css +91 -21
  7. metadata +27 -46
  8. data/lib/generators/avatars_for_rails/templates/public/images/pbar-ani.gif +0 -0
  9. data/lib/generators/avatars_for_rails/templates/public/images/rails.png +0 -0
  10. data/lib/generators/avatars_for_rails/templates/public/javascripts/application.js +0 -2
  11. data/lib/generators/avatars_for_rails/templates/public/javascripts/avatars.js +0 -8
  12. data/lib/generators/avatars_for_rails/templates/public/javascripts/controls.js +0 -965
  13. data/lib/generators/avatars_for_rails/templates/public/javascripts/dragdrop.js +0 -974
  14. data/lib/generators/avatars_for_rails/templates/public/javascripts/effects.js +0 -1123
  15. data/lib/generators/avatars_for_rails/templates/public/javascripts/jquery-ui.min.js +0 -401
  16. data/lib/generators/avatars_for_rails/templates/public/javascripts/jquery.Jcrop.min.js +0 -163
  17. data/lib/generators/avatars_for_rails/templates/public/javascripts/jquery.fileupload-ui.js +0 -529
  18. data/lib/generators/avatars_for_rails/templates/public/javascripts/jquery.fileupload.js +0 -956
  19. data/lib/generators/avatars_for_rails/templates/public/javascripts/jquery.form.js +0 -815
  20. data/lib/generators/avatars_for_rails/templates/public/javascripts/jquery.js +0 -7179
  21. data/lib/generators/avatars_for_rails/templates/public/javascripts/prototype.js +0 -6001
  22. data/lib/generators/avatars_for_rails/templates/public/javascripts/rails.js +0 -158
  23. data/lib/generators/avatars_for_rails/templates/public/stylesheets/.gitkeep +0 -0
  24. data/lib/generators/avatars_for_rails/templates/public/stylesheets/avatars.css +0 -115
  25. data/lib/generators/avatars_for_rails/templates/public/stylesheets/jquery.Jcrop.css +0 -35
  26. data/lib/generators/avatars_for_rails/templates/public/stylesheets/jquery.fileupload-ui.css +0 -140
@@ -2,7 +2,7 @@
2
2
  # project in your rails apps through git.
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "avatars_for_rails"
5
- s.version = "0.2.2"
5
+ s.version = "0.2.3"
6
6
  s.authors = ["Jaime Castro Montero", "GING"]
7
7
  s.summary = "Avatar manager for rails apps."
8
8
  s.description = "A Rails engine that allows any model to act as avatarable, permitting it to have a complete avatar manager with a few options. Adapted to rails 3"
@@ -1,51 +1,142 @@
1
1
  /*
2
- * jQuery File Upload User Interface Plugin 3.2.2
2
+ * jQuery File Upload User Interface Plugin 4.4
3
+ * https://github.com/blueimp/jQuery-File-Upload
4
+ *
5
+ * Copyright 2010, Sebastian Tschan
6
+ * https://blueimp.net
3
7
  *
4
- * Copyright 2010, Sebastian Tschan, AQUANTUM
5
8
  * Licensed under the MIT license:
6
9
  * http://creativecommons.org/licenses/MIT/
7
- *
8
- * https://blueimp.net
9
- * http://www.aquantum.de
10
10
  */
11
11
 
12
12
  /*jslint browser: true */
13
- /*global jQuery */
13
+ /*global jQuery, FileReader, URL, webkitURL */
14
14
 
15
15
  (function ($) {
16
+ 'use strict';
16
17
 
17
- var UploadHandler,
18
- methods;
18
+ var undef = 'undefined',
19
+ func = 'function',
20
+ UploadHandler,
21
+ methods,
22
+
23
+ MultiLoader = function (callBack) {
24
+ var loaded = 0,
25
+ list = [];
26
+ this.complete = function () {
27
+ loaded += 1;
28
+ if (loaded === list.length + 1) {
29
+ // list.length * onComplete + 1 * onLoadAll
30
+ callBack(list);
31
+ loaded = 0;
32
+ list = [];
33
+ }
34
+ };
35
+ this.push = function (item) {
36
+ list.push(item);
37
+ };
38
+ this.getList = function () {
39
+ return list;
40
+ };
41
+ };
19
42
 
20
43
  UploadHandler = function (container, options) {
21
44
  var uploadHandler = this,
22
- undef = 'undefined',
23
- func = 'function',
24
45
  dragOverTimeout,
25
- isDropZoneEnlarged;
46
+ isDropZoneEnlarged,
47
+ multiLoader = new MultiLoader(function (list) {
48
+ uploadHandler.hideProgressBarAll(function () {
49
+ uploadHandler.resetProgressBarAll();
50
+ if (typeof uploadHandler.onCompleteAll === func) {
51
+ uploadHandler.onCompleteAll(list);
52
+ }
53
+ });
54
+ }),
55
+ getUploadTable = function (handler) {
56
+ return typeof handler.uploadTable === func ?
57
+ handler.uploadTable(handler) : handler.uploadTable;
58
+ },
59
+ getDownloadTable = function (handler) {
60
+ return typeof handler.downloadTable === func ?
61
+ handler.downloadTable(handler) : handler.downloadTable;
62
+ };
26
63
 
64
+ this.requestHeaders = {'Accept': 'application/json, text/javascript, */*; q=0.01'};
27
65
  this.dropZone = container;
66
+ this.imageTypes = /^image\/(gif|jpeg|png)$/;
67
+ this.previewMaxWidth = this.previewMaxHeight = 80;
68
+ this.previewLoadDelay = 100;
69
+ this.previewAsCanvas = true;
70
+ this.previewSelector = '.file_upload_preview';
28
71
  this.progressSelector = '.file_upload_progress div';
29
- this.cancelSelector = '.file_upload_cancel div';
72
+ this.cancelSelector = '.file_upload_cancel button';
30
73
  this.cssClassSmall = 'file_upload_small';
31
74
  this.cssClassLarge = 'file_upload_large';
32
75
  this.cssClassHighlight = 'file_upload_highlight';
33
76
  this.dropEffect = 'highlight';
34
- this.uploadTable = this.downloadTable = $();
35
-
36
- this.buildUploadRow = this.buildDownloadRow = function () {
37
- return null;
77
+ this.uploadTable = this.downloadTable = null;
78
+ this.buildUploadRow = this.buildDownloadRow = null;
79
+ this.progressAllNode = null;
80
+
81
+ this.loadImage = function (file, callBack, maxWidth, maxHeight, imageTypes, noCanvas) {
82
+ var img,
83
+ scaleImage,
84
+ urlAPI,
85
+ fileReader;
86
+ if (imageTypes && !imageTypes.test(file.type)) {
87
+ return null;
88
+ }
89
+ scaleImage = function (img) {
90
+ var canvas = document.createElement('canvas'),
91
+ scale = Math.min(
92
+ (maxWidth || img.width) / img.width,
93
+ (maxHeight || img.height) / img.height
94
+ );
95
+ if (scale > 1) {
96
+ scale = 1;
97
+ }
98
+ img.width = parseInt(img.width * scale, 10);
99
+ img.height = parseInt(img.height * scale, 10);
100
+ if (noCanvas || typeof canvas.getContext !== func) {
101
+ return img;
102
+ }
103
+ canvas.width = img.width;
104
+ canvas.height = img.height;
105
+ canvas.getContext('2d').drawImage(img, 0, 0, img.width, img.height);
106
+ return canvas;
107
+ };
108
+ img = document.createElement('img');
109
+ urlAPI = typeof URL !== undef ? URL : typeof webkitURL !== undef ? webkitURL : null;
110
+ if (urlAPI && typeof urlAPI.createObjectURL === func) {
111
+ img.onload = function () {
112
+ urlAPI.revokeObjectURL(this.src);
113
+ callBack(scaleImage(img));
114
+ };
115
+ img.src = urlAPI.createObjectURL(file);
116
+ } else if (typeof FileReader !== undef &&
117
+ typeof FileReader.prototype.readAsDataURL === func) {
118
+ img.onload = function () {
119
+ callBack(scaleImage(img));
120
+ };
121
+ fileReader = new FileReader();
122
+ fileReader.onload = function (e) {
123
+ img.src = e.target.result;
124
+ };
125
+ fileReader.readAsDataURL(file);
126
+ } else {
127
+ callBack(null);
128
+ }
38
129
  };
39
130
 
40
131
  this.addNode = function (parentNode, node, callBack) {
41
- if (node) {
132
+ if (parentNode && parentNode.length && node && node.length) {
42
133
  node.css('display', 'none').appendTo(parentNode).fadeIn(function () {
43
134
  if (typeof callBack === func) {
44
135
  try {
45
136
  callBack();
46
137
  } catch (e) {
47
138
  // Fix endless exception loop:
48
- $(this).stop();
139
+ node.stop();
49
140
  throw e;
50
141
  }
51
142
  }
@@ -56,15 +147,15 @@
56
147
  };
57
148
 
58
149
  this.removeNode = function (node, callBack) {
59
- if (node) {
150
+ if (node && node.length) {
60
151
  node.fadeOut(function () {
61
- $(this).remove();
152
+ node.remove();
62
153
  if (typeof callBack === func) {
63
154
  try {
64
155
  callBack();
65
156
  } catch (e) {
66
157
  // Fix endless exception loop:
67
- $(this).stop();
158
+ node.stop();
68
159
  throw e;
69
160
  }
70
161
  }
@@ -73,68 +164,204 @@
73
164
  callBack();
74
165
  }
75
166
  };
167
+
168
+ this.replaceNode = function (oldNode, newNode, callBack) {
169
+ if (oldNode && newNode) {
170
+ oldNode.fadeOut(function () {
171
+ newNode.css('display', 'none');
172
+ oldNode.replaceWith(newNode);
173
+ newNode.fadeIn(function () {
174
+ if (typeof callBack === func) {
175
+ try {
176
+ callBack();
177
+ } catch (e) {
178
+ // Fix endless exception loop:
179
+ oldNode.stop();
180
+ newNode.stop();
181
+ throw e;
182
+ }
183
+ }
184
+ });
185
+ });
186
+ } else if (typeof callBack === func) {
187
+ callBack();
188
+ }
189
+ };
190
+
191
+ this.resetProgressBarAll = function () {
192
+ if (uploadHandler.progressbarAll) {
193
+ uploadHandler.progressbarAll.progressbar(
194
+ 'value',
195
+ 0
196
+ );
197
+ }
198
+ };
199
+
200
+ this.hideProgressBarAll = function (callBack) {
201
+ if (uploadHandler.progressbarAll && !$(getUploadTable(uploadHandler))
202
+ .find(uploadHandler.progressSelector + ':visible:first').length) {
203
+ uploadHandler.progressbarAll.fadeOut(callBack);
204
+ } else if (typeof callBack === func) {
205
+ callBack();
206
+ }
207
+ };
76
208
 
77
209
  this.onAbort = function (event, files, index, xhr, handler) {
78
- uploadHandler.removeNode(handler.uploadRow);
210
+ handler.removeNode(handler.uploadRow, handler.hideProgressBarAll);
79
211
  };
80
212
 
81
213
  this.cancelUpload = function (event, files, index, xhr, handler) {
82
214
  var readyState = xhr.readyState;
83
215
  xhr.abort();
84
216
  // If readyState is below 2, abort() has no effect:
85
- if (isNaN(readyState) || readyState < 2) {
217
+ if (typeof readyState !== 'number' || readyState < 2) {
86
218
  handler.onAbort(event, files, index, xhr, handler);
87
219
  }
88
220
  };
89
221
 
90
222
  this.initProgressBar = function (node, value) {
223
+ if (!node || !node.length) {
224
+ return null;
225
+ }
91
226
  if (typeof node.progressbar === func) {
92
227
  return node.progressbar({
93
228
  value: value
94
229
  });
95
230
  } else {
96
- var progressbar = $('<progress value="' + value + '" max="100"/>').appendTo(node);
97
- progressbar.progressbar = function (key, value) {
98
- progressbar.attr('value', value);
99
- };
100
- return progressbar;
231
+ node.addClass('progressbar')
232
+ .append($('<div/>').css('width', value + '%'))
233
+ .progressbar = function (key, value) {
234
+ return this.each(function () {
235
+ if (key === 'destroy') {
236
+ $(this).removeClass('progressbar').empty();
237
+ } else {
238
+ $(this).children().css('width', value + '%');
239
+ }
240
+ });
241
+ };
242
+ return node;
101
243
  }
102
244
  };
103
245
 
104
- this.initUploadRow = function (event, files, index, xhr, handler, callBack) {
105
- var uploadRow = handler.uploadRow = uploadHandler.buildUploadRow(files, index);
106
- if (uploadRow) {
107
- handler.progressbar = uploadHandler.initProgressBar(
108
- uploadRow.find(uploadHandler.progressSelector),
109
- (xhr.upload ? 0 : 100)
110
- );
111
- uploadRow.find(uploadHandler.cancelSelector).click(function (e) {
112
- uploadHandler.cancelUpload(e, files, index, xhr, handler);
113
- });
246
+ this.destroyProgressBar = function (node) {
247
+ if (!node || !node.length) {
248
+ return null;
114
249
  }
115
- uploadHandler.addNode(uploadHandler.uploadTable, uploadRow, callBack);
250
+ return node.progressbar('destroy');
116
251
  };
117
252
 
118
- this.initUpload = function (event, files, index, xhr, handler, callBack) {
119
- uploadHandler.initUploadRow(event, files, index, xhr, handler, function () {
120
- if (typeof uploadHandler.beforeSend === func) {
121
- uploadHandler.beforeSend(event, files, index, xhr, handler, callBack);
122
- } else {
123
- callBack();
124
- }
125
- });
253
+ this.initUploadProgress = function (xhr, handler) {
254
+ if (!xhr.upload && handler.progressbar) {
255
+ handler.progressbar.progressbar(
256
+ 'value',
257
+ 100 // indeterminate progress displayed by a full animated progress bar
258
+ );
259
+ }
126
260
  };
127
-
261
+
262
+ this.initUploadProgressAll = function () {
263
+ if (uploadHandler.progressbarAll && uploadHandler.progressbarAll.is(':hidden')) {
264
+ uploadHandler.progressbarAll.fadeIn();
265
+ }
266
+ };
267
+
268
+ this.onSend = function (event, files, index, xhr, handler) {
269
+ handler.initUploadProgress(xhr, handler);
270
+ };
271
+
128
272
  this.onProgress = function (event, files, index, xhr, handler) {
129
- if (handler.progressbar) {
273
+ if (handler.progressbar && event.lengthComputable) {
130
274
  handler.progressbar.progressbar(
131
275
  'value',
132
276
  parseInt(event.loaded / event.total * 100, 10)
133
277
  );
134
278
  }
135
279
  };
280
+
281
+ this.onProgressAll = function (event, list) {
282
+ if (uploadHandler.progressbarAll && event.lengthComputable) {
283
+ uploadHandler.progressbarAll.progressbar(
284
+ 'value',
285
+ parseInt(event.loaded / event.total * 100, 10)
286
+ );
287
+ }
288
+ };
289
+
290
+ this.onLoadAll = function (list) {
291
+ multiLoader.complete();
292
+ };
293
+
294
+ this.initProgressBarAll = function () {
295
+ if (!uploadHandler.progressbarAll) {
296
+ uploadHandler.progressbarAll = uploadHandler.initProgressBar(
297
+ (typeof uploadHandler.progressAllNode === func ?
298
+ uploadHandler.progressAllNode(uploadHandler) : uploadHandler.progressAllNode),
299
+ 0
300
+ );
301
+ }
302
+ };
303
+
304
+ this.destroyProgressBarAll = function () {
305
+ uploadHandler.destroyProgressBar(uploadHandler.progressbarAll);
306
+ };
307
+
308
+ this.loadPreviewImage = function (files, index, handler) {
309
+ index = index || 0;
310
+ handler.uploadRow.find(handler.previewSelector).each(function () {
311
+ var previewNode = $(this),
312
+ file = files[index];
313
+ setTimeout(function () {
314
+ handler.loadImage(
315
+ file,
316
+ function (img) {
317
+ handler.addNode(
318
+ previewNode,
319
+ $(img)
320
+ );
321
+ },
322
+ handler.previewMaxWidth,
323
+ handler.previewMaxHeight,
324
+ handler.imageTypes,
325
+ !handler.previewAsCanvas
326
+ );
327
+ }, handler.previewLoadDelay);
328
+ index += 1;
329
+ });
330
+ };
331
+
332
+ this.initUploadRow = function (event, files, index, xhr, handler) {
333
+ var uploadRow = handler.uploadRow = (typeof handler.buildUploadRow === func ?
334
+ handler.buildUploadRow(files, index, handler) : null);
335
+ if (uploadRow) {
336
+ handler.progressbar = handler.initProgressBar(
337
+ uploadRow.find(handler.progressSelector),
338
+ 0
339
+ );
340
+ uploadRow.find(handler.cancelSelector).click(function (e) {
341
+ handler.cancelUpload(e, files, index, xhr, handler);
342
+ e.preventDefault();
343
+ });
344
+ handler.loadPreviewImage(files, index, handler);
345
+ }
346
+ };
136
347
 
137
- this.parseResponse = function (xhr) {
348
+ this.initUpload = function (event, files, index, xhr, handler, callBack) {
349
+ handler.initUploadRow(event, files, index, xhr, handler);
350
+ handler.addNode(
351
+ getUploadTable(handler),
352
+ handler.uploadRow,
353
+ function () {
354
+ if (typeof handler.beforeSend === func) {
355
+ handler.beforeSend(event, files, index, xhr, handler, callBack);
356
+ } else {
357
+ callBack();
358
+ }
359
+ }
360
+ );
361
+ handler.initUploadProgressAll();
362
+ };
363
+
364
+ this.parseResponse = function (xhr, handler) {
138
365
  if (typeof xhr.responseText !== undef) {
139
366
  return $.parseJSON(xhr.responseText);
140
367
  } else {
@@ -143,30 +370,44 @@
143
370
  }
144
371
  };
145
372
 
146
- this.initDownloadRow = function (event, files, index, xhr, handler, callBack) {
373
+ this.initDownloadRow = function (event, files, index, xhr, handler) {
147
374
  var json, downloadRow;
148
375
  try {
149
- json = handler.response = uploadHandler.parseResponse(xhr);
150
- downloadRow = handler.downloadRow = uploadHandler.buildDownloadRow(json);
151
- uploadHandler.addNode(uploadHandler.downloadTable, downloadRow, callBack);
376
+ json = handler.response = handler.parseResponse(xhr, handler);
152
377
  } catch (e) {
153
- if (typeof uploadHandler.onError === func) {
378
+ if (typeof handler.onError === func) {
154
379
  handler.originalEvent = event;
155
- uploadHandler.onError(e, files, index, xhr, handler);
380
+ handler.onError(e, files, index, xhr, handler);
156
381
  } else {
157
382
  throw e;
158
383
  }
159
384
  }
385
+ downloadRow = handler.downloadRow = (typeof handler.buildDownloadRow === func ?
386
+ handler.buildDownloadRow(json, handler) : null);
160
387
  };
161
388
 
162
389
  this.onLoad = function (event, files, index, xhr, handler) {
163
- uploadHandler.removeNode(handler.uploadRow, function () {
164
- uploadHandler.initDownloadRow(event, files, index, xhr, handler, function () {
165
- if (typeof uploadHandler.onComplete === func) {
166
- uploadHandler.onComplete(event, files, index, xhr, handler);
390
+ var uploadTable = getUploadTable(handler),
391
+ downloadTable = getDownloadTable(handler),
392
+ callBack = function () {
393
+ if (typeof handler.onComplete === func) {
394
+ handler.onComplete(event, files, index, xhr, handler);
167
395
  }
396
+ multiLoader.complete();
397
+ };
398
+ multiLoader.push(Array.prototype.slice.call(arguments, 1));
399
+ handler.initDownloadRow(event, files, index, xhr, handler);
400
+ if (uploadTable && (!downloadTable || uploadTable.get(0) === downloadTable.get(0))) {
401
+ handler.replaceNode(handler.uploadRow, handler.downloadRow, callBack);
402
+ } else {
403
+ handler.removeNode(handler.uploadRow, function () {
404
+ handler.addNode(
405
+ downloadTable,
406
+ handler.downloadRow,
407
+ callBack
408
+ );
168
409
  });
169
- });
410
+ }
170
411
  };
171
412
 
172
413
  this.dropZoneEnlarge = function () {
@@ -229,6 +470,20 @@
229
470
  }
230
471
  };
231
472
 
473
+ this.init = function () {
474
+ uploadHandler.initProgressBarAll();
475
+ if (typeof uploadHandler.initExtended === func) {
476
+ uploadHandler.initExtended();
477
+ }
478
+ };
479
+
480
+ this.destroy = function () {
481
+ if (typeof uploadHandler.destroyExtended === func) {
482
+ uploadHandler.destroyExtended();
483
+ }
484
+ uploadHandler.destroyProgressBarAll();
485
+ };
486
+
232
487
  $.extend(this, options);
233
488
  };
234
489
 
@@ -238,11 +493,26 @@
238
493
  $(this).fileUpload(new UploadHandler($(this), options));
239
494
  });
240
495
  },
241
-
496
+
497
+ option: function (option, value, namespace) {
498
+ if (!option || (typeof option === 'string' && typeof value === undef)) {
499
+ return $(this).fileUpload('option', option, value, namespace);
500
+ }
501
+ return this.each(function () {
502
+ $(this).fileUpload('option', option, value, namespace);
503
+ });
504
+ },
505
+
242
506
  destroy : function (namespace) {
243
507
  return this.each(function () {
244
508
  $(this).fileUpload('destroy', namespace);
245
509
  });
510
+ },
511
+
512
+ upload: function (files, namespace) {
513
+ return this.each(function () {
514
+ $(this).fileUpload('upload', files, namespace);
515
+ });
246
516
  }
247
517
  };
248
518
 
@@ -252,7 +522,7 @@
252
522
  } else if (typeof method === 'object' || !method) {
253
523
  return methods.init.apply(this, arguments);
254
524
  } else {
255
- $.error('Method ' + method + ' does not exist on jQuery.fileUploadUI');
525
+ $.error('Method "' + method + '" does not exist on jQuery.fileUploadUI');
256
526
  }
257
527
  };
258
528