tb_photos 1.0.4 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +5 -5
  2. data/{README.markdown → README.md} +0 -0
  3. data/Rakefile +1 -1
  4. data/app/assets/images/admin/photos/photo_albums_thumb.png +0 -0
  5. data/app/assets/javascripts/admin/photos/photos.js +387 -373
  6. data/app/assets/stylesheets/admin/photos/application.css.scss +49 -51
  7. data/app/controllers/admin/photo_albums_controller.rb +13 -17
  8. data/app/controllers/admin/photo_galleries_controller.rb +19 -20
  9. data/app/controllers/admin/photos_controller.rb +30 -24
  10. data/app/controllers/photo_albums_controller.rb +12 -18
  11. data/app/controllers/photo_galleries_controller.rb +1 -3
  12. data/app/helpers/admin/photos_helper.rb +2 -4
  13. data/app/models/spud_photo.rb +21 -18
  14. data/app/models/spud_photo_album.rb +16 -18
  15. data/app/models/spud_photo_albums_photo.rb +1 -1
  16. data/app/models/spud_photo_galleries_album.rb +1 -1
  17. data/app/models/spud_photo_gallery.rb +11 -15
  18. data/app/views/admin/photo_albums/_album.html.erb +5 -5
  19. data/app/views/admin/photo_albums/_form.html.erb +32 -23
  20. data/app/views/admin/photo_albums/index.html.erb +1 -1
  21. data/app/views/admin/photo_galleries/_album.html.erb +9 -0
  22. data/app/views/admin/photo_galleries/_form.html.erb +21 -21
  23. data/app/views/admin/photo_galleries/index.html.erb +6 -6
  24. data/app/views/admin/photos/_form.html.erb +11 -28
  25. data/app/views/admin/photos/_photo.html.erb +6 -6
  26. data/app/views/admin/photos/index.html.erb +1 -1
  27. data/app/views/admin/photos/show.js.erb +3 -3
  28. data/app/views/layouts/admin/spud_photos.html.erb +4 -4
  29. data/app/views/photo_albums/index.html.erb +2 -2
  30. data/app/views/photo_albums/show.html.erb +2 -2
  31. data/app/views/photo_galleries/index.html.erb +2 -2
  32. data/config/routes.rb +5 -7
  33. data/db/migrate/20120228232120_create_spud_photos.rb +2 -2
  34. data/db/migrate/20120228232329_create_spud_photo_albums.rb +4 -4
  35. data/db/migrate/20120228232344_create_spud_photo_galleries.rb +4 -4
  36. data/db/migrate/20120405042046_upgrade_photo_relationships.rb +4 -4
  37. data/db/migrate/20121127210314_rename_order_to_sort_order.rb +1 -1
  38. data/db/migrate/20140730201754_add_fingerprint_to_spud_photos.rb +6 -0
  39. data/lib/generators/spud/photos/views_generator.rb +1 -2
  40. data/lib/spud_photos/configuration.rb +8 -8
  41. data/lib/spud_photos/engine.rb +15 -20
  42. data/lib/spud_photos/version.rb +3 -3
  43. data/lib/tb_photos.rb +3 -3
  44. data/spec/dummy/config.ru +1 -1
  45. data/spec/dummy/config/application.rb +2 -3
  46. data/spec/dummy/config/boot.rb +1 -1
  47. data/spec/dummy/config/environments/test.rb +2 -2
  48. data/spec/dummy/config/routes.rb +1 -2
  49. data/spec/dummy/script/rails +2 -2
  50. data/spec/spec_helper.rb +6 -6
  51. metadata +35 -68
  52. data/app/assets/images/admin/photos/buttons/cog_16x16.png +0 -0
  53. data/app/assets/images/admin/photos/buttons/x_16x16.png +0 -0
  54. data/app/assets/images/admin/photos/photo_albums_thumb@2x.png +0 -0
  55. data/app/views/admin/photo_albums/destroy.js.erb +0 -1
  56. data/app/views/admin/photo_galleries/destroy.js.erb +0 -1
  57. data/app/views/admin/photos/destroy.js.erb +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: ae0e6a31cb45e6caa79125487e2ae8ac6c8ef670
4
- data.tar.gz: b28cb9982545758d4450e626bc29db55e0fea247
2
+ SHA256:
3
+ metadata.gz: 6312c612b6dea2c5a897ea003594296012b7068b4e988c60e01222f1677884c7
4
+ data.tar.gz: acefd2270d72b9f3973367277b05f065cea62aec278ad4f54a09755234957938
5
5
  SHA512:
6
- metadata.gz: 309fdd963c7f4db518ef446f4061366880702c3956377bb30ade294e979030ae4cfe558fcd6cb0ea5d1e6ce7f2871eccb169825c907e68ebb631dcd60258d8a6
7
- data.tar.gz: b0ab591e05cd3a54f5bb7318a812909d6298136e33a758e39405358058d6c2f5fa202a01bd99ad859cef60cc5c02fafefd1bf39786b109b84018ca815ee97f21
6
+ metadata.gz: b2494ec2f3d04bf6fd51c28fca5e396bac7f0a40b85c023b02464406cb05be5119dda330f40bd3d4aa31a953d8d012ef2aa45396f66eecad8e6305b321499b0f
7
+ data.tar.gz: 3a0852322e35fc2cd01ca74dc0d6882d4e57cdfed47a1bee26e66f96f59b0abf9bd41db090a2b815628256e074ab9486a951d78e2ac46d92c92d484b6cfc311b
File without changes
data/Rakefile CHANGED
@@ -20,7 +20,7 @@ RDoc::Task.new(:rdoc) do |rdoc|
20
20
  rdoc.rdoc_files.include('lib/**/*.rb')
21
21
  end
22
22
 
23
- APP_RAKEFILE = File.expand_path("../spec/dummy/Rakefile", __FILE__)
23
+ APP_RAKEFILE = File.expand_path('../spec/dummy/Rakefile', __FILE__)
24
24
  load 'rails/tasks/engine.rake'
25
25
 
26
26
  Bundler::GemHelper.install_tasks
@@ -1,418 +1,432 @@
1
1
  (function(){
2
2
 
3
- spud.admin.photos = {};
4
- var self = spud.admin.photos;
3
+ var html5upload = false;
5
4
 
6
- self.html5upload = false;
7
-
8
- self.init = function(){
5
+ var self = tb.photos = {
6
+ init: function(){
9
7
  // event handlers
10
- $('.spud_admin_photo_ui_thumbs_sortable').sortable({
11
- connectWith:'.spud_admin_photo_ui_thumbs_sortable'
12
- });
13
- $('body').on('submit', '#spud_admin_photo_album_form', self.submittedPhotoAlbumForm);
14
- $('body').on('submit', '#spud_admin_photo_gallery_form', self.submittedPhotoGalleryForm);
15
- $('body').on('submit', '#spud_admin_photo_form', self.submittedPhotoForm);
16
- $('body').on('click', '.spud_admin_photos_btn_remove', self.clickedPhotoRemoveFromAlbum);
17
- $('body').on('click', '.spud_admin_photo_ui_thumbs_selectable .spud_admin_photo_ui_thumb', self.selectedPhotoUiThumb);
18
- $('body').on('click', '#spud_admin_photo_album_action_library', self.clickedPhotoLibrary);
19
- $('body').on('click', '#spud_admin_photo_album_action_upload, .spud_admin_photo .spud_admin_photos_btn_edit', self.clickedPhotoAddOrEdit);
20
- $('body').on('click', '.spud_admin_photo_library_add_selected', self.addSelectedPhotosFromLibrary);
21
- $('body').on('click', '.spud_admin_photo_library_delete_selected', self.deleteSelectedPhotosFromLibrary);
8
+ Sortable.create(document.querySelector('#admin-photos-selected'));
9
+ $('body').on('submit', '#admin-photo-album-form', submittedPhotoAlbumForm);
10
+ $('body').on('submit', '#admin-photo-gallery-form', submittedPhotoGalleryForm);
11
+ $('body').on('submit', '#admin-photo-form', submittedPhotoForm);
12
+ $('body').on('click', '.admin-photos-btn-remove', clickedPhotoRemoveFromAlbum);
13
+ $('body').on('click', '.admin-photo-ui-thumbs-selectable .admin-photo-ui-thumb', selectedPhotoUiThumb);
14
+ $('body').on('click', '#admin-photo-album-action-library', clickedPhotoLibrary);
15
+ $('body').on('click', '#admin-photo-album-action-upload, .admin-photo .admin-photos-btn-edit', clickedPhotoAddOrEdit);
16
+ $('body').on('click', '.admin-photo-library-add-selected', addSelectedPhotosFromLibrary);
17
+ $('body').on('click', '.admin-photo-library-delete-selected', deleteSelectedPhotosFromLibrary);
18
+ $('#admin-photo-gallery-form').on('click', '.admin-photos-btn-delete', clickedDeleteAlbumFromGallery);
22
19
 
23
20
  // html5 drag and drop file
24
- if(typeof(FormData) != 'undefined' && typeof(XMLHttpRequest) != 'undefined' && (droparea = document.getElementById('spud_admin_photo_upload_queue'))){
25
- self.html5upload = true;
26
- $('#spud_admin_photo_upload_queue').show();
27
- droparea.addEventListener('dragenter', self.stopDndPropagation, false);
28
- droparea.addEventListener('dragexit', self.stopDndPropagation, false);
29
- droparea.addEventListener('dragover', self.stopDndPropagation, false);
30
- droparea.addEventListener('drop', self.droppedFile, false);
21
+ if(typeof(FormData) != 'undefined' && typeof(XMLHttpRequest) != 'undefined' && (droparea = document.getElementById('admin-photo-upload-queue'))){
22
+ html5upload = true;
23
+ $('#admin-photo-upload-queue').show();
24
+ droparea.addEventListener('dragenter', stopDndPropagation, false);
25
+ droparea.addEventListener('dragexit', stopDndPropagation, false);
26
+ droparea.addEventListener('dragover', stopDndPropagation, false);
27
+ droparea.addEventListener('drop', droppedFile, false);
31
28
 
32
29
  // prevent accidental drops outside the queue
33
30
  var body = document.getElementsByTagName("body")[0];
34
- body.addEventListener('dragenter', self.stopDndPropagation, false);
35
- body.addEventListener('dragexit', self.stopDndPropagation, false);
36
- body.addEventListener('dragover', self.stopDndPropagation, false);
37
- body.addEventListener('drop', self.stopDndPropagation, false);
31
+ body.addEventListener('dragenter', stopDndPropagation, false);
32
+ body.addEventListener('dragexit', stopDndPropagation, false);
33
+ body.addEventListener('dragover', stopDndPropagation, false);
34
+ body.addEventListener('drop', stopDndPropagation, false);
38
35
  }
39
- };
40
-
41
- self.submittedPhotoAlbumForm = function(e){
42
-
43
- };
44
-
45
- self.submittedPhotoGalleryForm = function(e){
46
- $('#spud_admin_photo_albums_available .spud_admin_photo_ui_thumb').remove();
47
- };
48
-
49
- self.clickedPhotoRemoveFromAlbum = function(e){
50
- $(this).parents('.spud_admin_photo_ui_thumb').fadeOut(200, function(){
51
- $(this).remove();
52
- });
53
- return false;
54
- };
55
-
56
- self.validatePhoto = function(file) {
57
- var errors = [];
36
+ },
58
37
 
59
- if(file) {
60
- var allowedTypes = ["image/jpeg", "image/png", "image/gif", "image/bmp"];
61
- if(allowedTypes.indexOf(file.type) < 0) {
62
- errors.push("Unsupported file format");
63
- }
64
- var maxAllowedSize = spud.admin.photos.max_image_upload_size_bytes;
65
- if(maxAllowedSize && file.size > maxAllowedSize) {
66
- errors.push("Your file size of " + self.getFileSizeHumanized(file.size) + " exceeded the maximum limit of " + spud.admin.photos.max_image_upload_size_humanized);
67
- }
68
- }
69
- else {
70
- errors.push("No file found");
71
- }
72
- return errors;
73
- };
74
-
75
- /* Handle file uploads passed via iframe (legacy support)
76
- * -------------------------------------------------------- */
77
-
78
- self.photoLegacyUploadErrors = function(html){
79
- $('#spud_admin_photo_form').replaceWith(html);
80
- };
81
-
82
- self.photoLegacyUploadComplete = function(id, html){
83
- var element = $('#spud_admin_photo_' + id);
84
- if(element.length > 0){
85
- element.replaceWith(html);
86
- }
87
- else{
88
- var target = $('#spud_admin_photos_selected, #spud_admin_photos');
89
- target.prepend(html);
90
- }
91
- hideModalDialog();
92
- };
93
-
94
- self.selectedPhotoUiThumb = function(e){
95
- var thumb = $(this);
96
- if(thumb.hasClass('spud_admin_photo_ui_thumb_selected')){
97
- $(this).removeClass('spud_admin_photo_ui_thumb_selected');
98
- }
99
- else{
100
- $(this).addClass('spud_admin_photo_ui_thumb_selected');
38
+ getFileSizeHumanized: function(bytes) {
39
+ var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
40
+ if(bytes === 0){
41
+ return 'n/a';
101
42
  }
102
- };
43
+ var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)), 10);
44
+ return (bytes / Math.pow(1024, i)).toFixed(1) + ' ' + sizes[i];
45
+ },
103
46
 
104
- self.markPhotoAsDeleted = function(photo_id){
105
- var photo = $('#spud_admin_photo_' + photo_id);
47
+ /* Ajax Callbacks
48
+ -------------------*/
49
+ markPhotoAsDeleted: function(photo_id){
50
+ var photo = $('#admin-photo-' + photo_id);
106
51
  photo.fadeOut(200, function(){
107
52
  photo.remove();
108
53
  });
109
- };
54
+ },
110
55
 
111
- self.markPhotoAlbumAsDeleted = function(photo_album_id){
112
- var photo_album = $('#spud_admin_photo_album_' + photo_album_id);
56
+ markPhotoAlbumAsDeleted: function(photo_album_id){
57
+ var photo_album = $('#admin-photo-album-' + photo_album_id);
113
58
  photo_album.fadeOut(200, function(){
114
59
  photo_album.remove();
115
60
  });
116
- };
61
+ },
117
62
 
118
- self.markPhotoGalleryAsDeleted = function(photo_gallery_id){
119
- var photo_gallery = $('#spud_admin_photo_gallery_' + photo_gallery_id);
63
+ markPhotoGalleryAsDeleted: function(photo_gallery_id){
64
+ var photo_gallery = $('#admin-photo-gallery-' + photo_gallery_id);
120
65
  photo_gallery.fadeOut(200, function(){
121
66
  photo_gallery.remove();
122
67
  });
123
- };
124
-
125
- /*
126
- * Single-Photo Form Upload
127
- -------------------------------- */
68
+ },
128
69
 
129
- self.generateFileUploadErrors = function(errors, opts) {
70
+ /* Handle file uploads passed via iframe (legacy support)
71
+ * -------------------------------------------------------- */
72
+ photoLegacyUploadErrors: function(html){
73
+ $('#admin-photo-form').replaceWith(html);
74
+ },
130
75
 
131
- if(typeof errors == "string") {
132
- errors = [errors];
76
+ photoLegacyUploadComplete: function(id, html){
77
+ var element = $('#admin-photo-' + id);
78
+ if(element.length > 0){
79
+ element.replaceWith(html);
133
80
  }
134
- var totalErrors = errors.length;
135
- var errorMsg = totalErrors + " errors prohibited you from saving:";
136
- if(totalErrors == 1) {
137
- errorMsg = "1 error prohibited you from saving:";
81
+ else{
82
+ var target = $('#admin-photos-selected, #admin-photos');
83
+ target.prepend(html);
138
84
  }
139
- if(opts && opts.showAsDialog) {
140
- alert(errorMsg + '\n\t' + errors.join('\n\t'));
141
- return false;
85
+ tb.modal.hide();
86
+ }
87
+ };
88
+
89
+ var submittedPhotoAlbumForm = function(e){
90
+
91
+ };
92
+
93
+ var submittedPhotoGalleryForm = function(e){
94
+ $('.admin-photo-albums-available input').remove();
95
+ };
96
+
97
+ var clickedDeleteAlbumFromGallery = function(e){
98
+ e.preventDefault();
99
+ var thumb = $(this).parents('.admin-photo-ui-thumb');
100
+ thumb.remove();
101
+ $('.admin-photo-albums-available').append(thumb);
102
+ };
103
+
104
+ var clickedPhotoRemoveFromAlbum = function(e){
105
+ $(this).parents('.admin-photo-ui-thumb').fadeOut(200, function(){
106
+ $(this).remove();
107
+ });
108
+ return false;
109
+ };
110
+
111
+ var validatePhoto = function(file) {
112
+ var errors = [];
113
+ if(file) {
114
+ var allowedTypes = ["image/jpeg", "image/png", "image/gif", "image/bmp"];
115
+ if(allowedTypes.indexOf(file.type) < 0) {
116
+ errors.push("Unsupported file format");
142
117
  }
143
-
144
- $(".spud_admin_form_error_list").remove();
145
- $("#spud_admin_photo_form").find("[for=spud_photo_photo]").css("color","black");
146
- $("#spud_admin_photo_form").before('<div class="spud_admin_form_error_list"><ul><h4>' + errorMsg +'</h4></ul></div>');
147
- $("#spud_admin_photo_form").find("[for=spud_photo_photo]").css("color","red");
148
- for(var i = 0; i < errors.length; i++) {
149
- $(".spud_admin_form_error_list > ul").append("<li>"+ errors[i] + "</li>");
118
+ var maxAllowedSize = tb.photos.max_image_upload_size_bytes;
119
+ if(maxAllowedSize && file.size > maxAllowedSize) {
120
+ errors.push("Your file size of " + self.getFileSizeHumanized(file.size) + " exceeded the maximum limit of " + tb.photos.max_image_upload_size_humanized);
121
+ }
122
+ }
123
+ else{
124
+ if($('.admin-photo-form-current-photo').length === 0){
125
+ errors.push("No file found");
150
126
  }
127
+ }
128
+ return errors;
129
+ };
130
+
131
+ var selectedPhotoUiThumb = function(e){
132
+ var thumb = $(this);
133
+ if(thumb.hasClass('admin-photo-ui-thumb-selected')){
134
+ $(this).removeClass('admin-photo-ui-thumb-selected');
135
+ }
136
+ else{
137
+ $(this).addClass('admin-photo-ui-thumb-selected');
138
+ }
139
+ };
140
+
141
+ /*
142
+ * Single-Photo Form Upload
143
+ -------------------------------- */
144
+
145
+ var generateFileUploadErrors = function(errors, opts) {
146
+
147
+ if(typeof errors == "string") {
148
+ errors = [errors];
149
+ }
150
+ var totalErrors = errors.length;
151
+ var errorMsg = totalErrors + " errors prohibited you from saving:";
152
+ if(totalErrors == 1) {
153
+ errorMsg = "1 error prohibited you from saving:";
154
+ }
155
+ if(opts && opts.showAsDialog) {
156
+ alert(errorMsg + '\n\t' + errors.join('\n\t'));
151
157
  return false;
152
- };
153
-
154
- self.getFileSizeHumanized = function(bytes) {
155
- var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
156
- if(bytes === 0){
157
- return 'n/a';
158
+ }
159
+
160
+ $(".form-errors").remove();
161
+ $("#admin-photo-form").find("[for=spud_photo_photo]").css("color","black");
162
+ $("#admin-photo-form").before('<div class="form-errors"><h4>' + errorMsg +'</h4><ul></ul></div>');
163
+ $("#admin-photo-form").find("[for=spud_photo_photo]").css("color","red");
164
+ for(var i = 0; i < errors.length; i++) {
165
+ $(".form-errors > ul").append("<li>"+ errors[i] + "</li>");
166
+ }
167
+ return false;
168
+ };
169
+
170
+ var submittedPhotoForm = function(e){
171
+ if(html5upload){
172
+ // create a FormData object and attach form values
173
+ var fd = new FormData();
174
+ var form = $(this);
175
+ fd.append('_method', form.find('[name=_method]').val());
176
+ fd.append('authenticity_token', form.find('[name=authenticity_token]').val());
177
+ fd.append('spud_photo[title]', form.find('#spud_photo_title').val());
178
+ fd.append('spud_photo[caption]', form.find('#spud_photo_caption').val());
179
+
180
+ // progress bar to send events to
181
+ var progressBar;
182
+ var file = form.find('#spud_photo_photo')[0].files[0];
183
+ var photoValidationErrors = validatePhoto(file);
184
+ if(photoValidationErrors.length) {
185
+ return generateFileUploadErrors(photoValidationErrors);
158
186
  }
159
- var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)), 10);
160
- return (bytes / Math.pow(1024, i)).toFixed(1) + ' ' + sizes[i];
161
- };
162
-
163
- self.submittedPhotoForm = function(e){
164
- // disable submit button
165
- // not working in updated bootstrap!
166
- // var submit = $(this).find('input[type=submit]');
167
- // submit.attr('disabled', 'disabled').val(submit.attr('data-loading-text'));
168
-
169
- if(self.html5upload){
170
- // create a FormData object and attach form values
171
- var fd = new FormData();
172
- var form = $(this);
173
- fd.append('_method', form.find('[name=_method]').val());
174
- fd.append('authenticity_token', form.find('[name=authenticity_token]').val());
175
- fd.append('spud_photo[title]', form.find('#spud_photo_title').val());
176
- fd.append('spud_photo[caption]', form.find('#spud_photo_caption').val());
177
-
178
- // progress bar to send events to
179
- var progressBar;
180
- var file = form.find('#spud_photo_photo')[0].files[0];
181
- var photoValidationErrors = self.validatePhoto(file);
182
- if(photoValidationErrors.length) {
183
- return self.generateFileUploadErrors(photoValidationErrors);
184
- }
185
-
186
- progressBar = self.progressBarForUpload(file.name);
187
+
188
+ if(file){
189
+ progressBar = progressBarForUpload(file.name);
187
190
  fd.append('spud_photo[photo]', file);
188
191
  form.append(progressBar);
189
-
190
- // send FormData object as ajax request
191
- var xhr = new XMLHttpRequest();
192
- xhr.upload.addEventListener('progress', function(e){ self.onPhotoUploadProgress(e, progressBar); }, false);
193
- xhr.addEventListener('load', function(e){ self.onPhotoUploadComplete(e, progressBar); }, false);
194
- xhr.addEventListener('error', function(e){ self.onPhotoUploadFailure(e, progressBar); }, false);
195
- xhr.addEventListener('abort', function(e){ self.onPhotoUploadCancel(e, progressBar); }, false);
196
- xhr.open('POST', form.attr('action'));
197
- xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
198
- xhr.send(fd);
199
- return false;
200
- }
201
- };
202
-
203
- /*
204
- * Upload Progress Monitoring
205
- -------------------------------- */
206
-
207
- self.progressBarForUpload = function(fileName){
208
- var html = [
209
- '<div class="spud_admin_photo_progress">',
210
- '<h6>',
211
- '<span class="spud_admin_photo_progress_filename">'+fileName+'</span>: ',
212
- '<span class="spud_admin_photo_progress_status">Uploading</span>',
213
- '</h6>',
214
- '<div class="progress progress-striped active">',
215
- '<div class="bar" style="width: 0;"></div>',
216
- '</div>',
217
- '</div>'
218
- ].join('');
219
- return $(html);
220
- };
221
-
222
- self.onPhotoUploadProgress = function(e, progressBar){
223
- var percent = Math.round(e.loaded * 100 / e.total);
224
- progressBar.find('.bar').css({width: percent + '%'});
225
- if(percent == 100){
226
- progressBar.find('.progress').addClass('progress-success');
227
- progressBar.find('.spud_admin_photo_progress_status').text('Processing');
228
- }
229
- };
230
-
231
- self.onPhotoUploadComplete = function(e, progressBar){
232
- // success
233
- var photo = $.parseJSON(e.target.response);
234
- if(e.target.status == 200){
235
- progressBar.find('.spud_admin_photo_progress_status').text('Done!');
236
- progressBar.find('.progress').removeClass('progress-striped active');
237
- var element = $('#spud_admin_photo_' + photo.id);
238
- if(element.length > 0){
239
- element.replaceWith(photo.html);
240
- }
241
- else{
242
- var target = $('#spud_admin_photos_selected, #spud_admin_photos');
243
- target.prepend(photo.html).fadeIn(200);
244
- }
245
- hideModalDialog();
246
192
  }
247
- // validation error
248
193
  else{
249
- $("#modal_window .modal-body").html(photo.html);
194
+ progressBar = progressBarForUpload('');
250
195
  }
251
- };
252
-
253
- self.onPhotoUploadCancel = function(e, progressBar){
254
- progressBar.find('.spud_admin_photo_progress_status').text('Done!');
255
- progressBar.find('.progress').addClass('progress-danger');
256
- };
257
-
258
- /*
259
- * Photo Upload/Edit Form
260
- ------------------------------- */
261
- self.clickedPhotoAddOrEdit = function(e){
262
- var url = this.href;
263
- $.ajax({
264
- url:url,
265
- success:self.photoUploadFormLoaded
266
- });
267
- return false;
268
- };
269
196
 
270
- self.photoUploadFormLoaded = function(html){
271
- displayModalDialogWithOptions({
272
- title: 'Upload Photo',
273
- html: html
274
- });
275
- $("#fileUploadSizeLegend").html('File Upload <span class="split-pane-item-meta">max allowed size : '+ spud.admin.photos.max_image_upload_size_humanized +'</span>');
276
- };
277
-
278
- /*
279
- * Add From Photo Library
280
- ------------------------------- */
281
-
282
- self.clickedPhotoLibrary = function(e){
283
- var url = this.href;
284
- $.ajax({
285
- url:url,
286
- success:self.photoLibraryLoaded
287
- });
197
+ // send FormData object as ajax request
198
+ var xhr = new XMLHttpRequest();
199
+ xhr.upload.addEventListener('progress', function(e){ onPhotoUploadProgress(e, progressBar); }, false);
200
+ xhr.addEventListener('load', function(e){ onPhotoUploadComplete(e, progressBar); }, false);
201
+ xhr.addEventListener('error', function(e){ onPhotoUploadFailure(e, progressBar); }, false);
202
+ xhr.addEventListener('abort', function(e){ onPhotoUploadCancel(e, progressBar); }, false);
203
+ xhr.open('POST', form.attr('action'));
204
+ xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
205
+ xhr.send(fd);
288
206
  return false;
289
- };
290
-
291
- self.photoLibraryLoaded = function(html){
292
- var dialog = $('#modal_window');
293
- $('#spud_admin_photos_selected .spud_admin_photo_ui_thumb').each(function(){
294
- var id = $(this).attr('id');
295
- var dupe = dialog.find('#'+id);
296
- if(dupe){
297
- dupe.remove();
298
- }
299
- });
300
- displayModalDialogWithOptions({
301
- title: 'My Photo Library',
302
- html: html,
303
- buttons:{
304
- 'spud_admin_photo_library_add_selected btn-primary': 'Add Selected',
305
- 'spud_admin_photo_library_delete_selected btn-danger': 'Delete Selected'
306
- }
307
- });
308
- };
309
-
310
- self.addSelectedPhotosFromLibrary = function(e){
311
- $('#spud_admin_photo_library .spud_admin_photo_ui_thumb_selected')
312
- .removeClass('spud_admin_photo_ui_thumb_selected')
313
- .prependTo('#spud_admin_photos_selected')
314
- .hide()
315
- .fadeIn(200);
316
- hideModalDialog();
317
- };
318
-
319
- self.deleteSelectedPhotosFromLibrary = function(e){
320
- var ids = $.map($('.spud_admin_photo_ui_thumb_selected'), function(val, i){
321
- return $(val).attr('rel');
322
- });
323
- $.ajax({
324
- type: 'POST',
325
- url: '/admin/photos/mass_destroy',
326
- data: {spud_photo_ids:ids},
327
- success: function(data, textStatus, jqXHR){
328
- $('.spud_admin_photo_ui_thumb_selected').fadeOut(200, function(){
329
- $(this).remove();
330
- });
331
- },
332
- error: function(jqXHR, textStatus, errorThrown){
333
- console.log('An error occurred:');
334
- console.log(arguments);
335
- }
336
- });
337
-
338
- };
339
-
340
- /*
341
- * Drag & Drop File Upload Queue
342
- -------------------------------- */
343
-
344
- self.fileQueue = [];
345
- self.fileQueueStarted = false;
346
-
347
- // prevent default browser behavior of opening the dropped file
348
- self.stopDndPropagation = function(e){
349
- e.stopPropagation();
350
- e.preventDefault();
351
- };
352
-
353
- // add files to queue. starts queue if not started already
354
- self.droppedFile = function(e){
355
- e.stopPropagation();
356
- e.preventDefault();
357
- $('#spud_admin_photo_upload_queue').show();
358
- var files = e.dataTransfer.files;
359
- var i = 0;
360
- while(i < files.length){
361
- var file = files[i];
362
- var photoValidationErrors = self.validatePhoto(file);
363
- if(photoValidationErrors.length) {
364
- return self.generateFileUploadErrors(photoValidationErrors, {showAsDialog: true});
365
- }
366
- self.fileQueue.push(file);
367
- i++;
207
+ }
208
+ };
209
+
210
+ /*
211
+ * Upload Progress Monitoring
212
+ -------------------------------- */
213
+
214
+ var progressBarForUpload = function(fileName){
215
+ var html = [
216
+ '<div class="admin-photo-progress">',
217
+ '<h6>',
218
+ '<span class="admin-photo-progress_filename">'+fileName+'</span>: ',
219
+ '<span class="admin-photo-progress_status">Uploading</span>',
220
+ '</h6>',
221
+ '<div class="progress">',
222
+ '<div class="progress-bar progress-bar-striped active" style="width: 0;"></div>',
223
+ '</div>',
224
+ '</div>'
225
+ ].join('');
226
+ return $(html);
227
+ };
228
+
229
+ var onPhotoUploadProgress = function(e, progressBar){
230
+ var percent = Math.round(e.loaded * 100 / e.total);
231
+ progressBar.find('.progress-bar').css({width: percent + '%'});
232
+ if(percent == 100){
233
+ progressBar.find('.admin-photo-progress_status').text('Processing');
234
+ }
235
+ };
236
+
237
+ var onPhotoUploadComplete = function(e, progressBar){
238
+ // success
239
+ var photo = $.parseJSON(e.target.response);
240
+ if(e.target.status == 200){
241
+ progressBar.find('.admin-photo-progress_status').text('Done!');
242
+ progressBar.find('.progress-bar').removeClass('progress-bar-striped active').addClass('progress-bar-success');
243
+ var element = $('#admin-photo-' + photo.id);
244
+ if(element.length > 0){
245
+ element.replaceWith(photo.html);
368
246
  }
369
- self.updateQueueCountLabel();
370
- if(!this.fileQueueStarted){
371
- self.uploadNextPhoto();
372
- if(self.fileQueue.length > 0){
373
- self.uploadNextPhoto();
247
+ else{
248
+ var target = $('#admin-photos-selected, #admin-photos');
249
+ target.prepend(photo.html).fadeIn(200);
250
+ }
251
+ tb.modal.hide();
252
+ }
253
+ // validation error
254
+ else{
255
+ $("#modal_window .modal-body").html(photo.html);
256
+ }
257
+ };
258
+
259
+ var onPhotoUploadCancel = function(e, progressBar){
260
+ progressBar.find('.admin-photo-progress_status').text('Done!');
261
+ progressBar.find('.progress').addClass('progress-danger');
262
+ };
263
+
264
+ var onPhotoUploadFailure = function(e, progressBar){
265
+ if(typeof(console) == 'object'){
266
+ console.error('An unexpected error occurred during upload', e);
267
+ }
268
+ };
269
+
270
+ /*
271
+ * Photo Upload/Edit Form
272
+ ------------------------------- */
273
+ var clickedPhotoAddOrEdit = function(e){
274
+ var url = this.href;
275
+ $.ajax({
276
+ url:url,
277
+ success:photoUploadFormLoaded
278
+ });
279
+ return false;
280
+ };
281
+
282
+ var photoUploadFormLoaded = function(html){
283
+ tb.modal.displayWithOptions({
284
+ title: 'Upload Photo',
285
+ html: html
286
+ });
287
+ $(".admin-photo-form-max-size").text('Maximum upload size: '+ tb.photos.max_image_upload_size_humanized);
288
+ };
289
+
290
+ /*
291
+ * Add From Photo Library
292
+ ------------------------------- */
293
+
294
+ var clickedPhotoLibrary = function(e){
295
+ var url = this.href;
296
+ $.ajax({
297
+ url:url,
298
+ success:photoLibraryLoaded
299
+ });
300
+ return false;
301
+ };
302
+
303
+ var photoLibraryLoaded = function(html){
304
+ var dialog = $('#modal_window');
305
+ $('#admin-photos-selected .admin-photo-ui-thumb').each(function(){
306
+ var id = $(this).attr('id');
307
+ var dupe = dialog.find('#'+id);
308
+ if(dupe){
309
+ dupe.remove();
310
+ }
311
+ });
312
+ tb.modal.displayWithOptions({
313
+ title: 'My Photo Library',
314
+ html: html,
315
+ buttons:{
316
+ 'admin-photo-library-add-selected btn-primary': 'Add Selected',
317
+ 'admin-photo-library-delete-selected btn-danger': 'Delete Selected'
318
+ }
319
+ });
320
+ };
321
+
322
+ var addSelectedPhotosFromLibrary = function(e){
323
+ $('#admin-photo-library .admin-photo-ui-thumb-selected')
324
+ .removeClass('admin-photo-ui-thumb-selected')
325
+ .prependTo('#admin-photos-selected')
326
+ .hide()
327
+ .fadeIn(200);
328
+ tb.modal.hide();
329
+ };
330
+
331
+ var deleteSelectedPhotosFromLibrary = function(e){
332
+ var ids = $.map($('.admin-photo-ui-thumb-selected'), function(val, i){
333
+ return $(val).attr('rel');
334
+ });
335
+ $.ajax({
336
+ type: 'POST',
337
+ url: '/admin/photos/mass_destroy',
338
+ data: {spud_photo_ids:ids},
339
+ success: function(data, textStatus, jqXHR){
340
+ $('.admin-photo-ui-thumb-selected').fadeOut(200, function(){
341
+ $(this).remove();
342
+ });
343
+ for(var i=0; i<ids.length; i++){
344
+ tb.photos.markPhotoAsDeleted(ids[i]);
374
345
  }
346
+ },
347
+ error: function(jqXHR, textStatus, errorThrown){
348
+ console.log('An error occurred:');
349
+ console.log(arguments);
375
350
  }
376
- };
377
-
378
- self.updateQueueCountLabel = function(){
379
- $('#spud_admin_photo_upload_queue_label span').text(self.fileQueue.length);
380
- };
381
-
382
- self.uploadNextPhoto = function(){
383
- if(self.fileQueue.length === 0){
384
- self.fileQueueStarted = false;
385
- return;
351
+ });
352
+ };
353
+
354
+ /*
355
+ * Drag & Drop File Upload Queue
356
+ -------------------------------- */
357
+
358
+ var fileQueue = [];
359
+ var fileQueueStarted = false;
360
+
361
+ // prevent default browser behavior of opening the dropped file
362
+ var stopDndPropagation = function(e){
363
+ e.stopPropagation();
364
+ e.preventDefault();
365
+ };
366
+
367
+ // add files to queue. starts queue if not started already
368
+ var droppedFile = function(e){
369
+ e.stopPropagation();
370
+ e.preventDefault();
371
+ $('#admin-photo-upload-queue').show();
372
+ var files = e.dataTransfer.files;
373
+ var i = 0;
374
+ while(i < files.length){
375
+ var file = files[i];
376
+ var photoValidationErrors = validatePhoto(file);
377
+ if(photoValidationErrors.length) {
378
+ return generateFileUploadErrors(photoValidationErrors, {showAsDialog: true});
386
379
  }
387
-
388
- // formdata object
389
- self.fileQueueStarted = true;
390
- var file = self.fileQueue.pop();
391
- var fd = new FormData();
392
- fd.append('spud_photo[photo]', file);
393
-
394
- var csrf = $('meta[name=csrf-token]').prop('content');
395
- fd.append('authenticity_token', csrf);
396
-
397
- // create a progress bar
398
- var progressBar = self.progressBarForUpload(file.name);
399
- $('#spud_admin_photo_upload_queue_bars').prepend(progressBar);
400
-
401
- // send formdata as xhr
402
- var xhr = new XMLHttpRequest();
403
- xhr.upload.addEventListener('progress', function(e){ self.onPhotoUploadProgress(e, progressBar); }, false);
404
- xhr.addEventListener('load', function(e){ self.onQueuedPhotoUploadComplete(e, progressBar); }, false);
405
- xhr.addEventListener('error', function(e){ self.onPhotoUploadFailure(e, progressBar); }, false);
406
- xhr.addEventListener('abort', function(e){ self.onPhotoUploadCancel(e, progressBar); }, false);
407
- xhr.open('POST', '/admin/photos');
408
- xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
409
- xhr.send(fd);
410
- };
411
-
412
- self.onQueuedPhotoUploadComplete = function(e, progressBar){
413
- self.onPhotoUploadComplete(e, progressBar);
414
- self.updateQueueCountLabel();
415
- self.uploadNextPhoto();
416
- };
380
+ fileQueue.push(file);
381
+ i++;
382
+ }
383
+ updateQueueCountLabel();
384
+ if(!this.fileQueueStarted){
385
+ uploadNextPhoto();
386
+ if(fileQueue.length > 0){
387
+ uploadNextPhoto();
388
+ }
389
+ }
390
+ };
391
+
392
+ var updateQueueCountLabel = function(){
393
+ $('#admin-photo-upload-queue_label span').text(fileQueue.length);
394
+ };
395
+
396
+ var uploadNextPhoto = function(){
397
+ if(fileQueue.length === 0){
398
+ fileQueueStarted = false;
399
+ return;
400
+ }
401
+
402
+ // formdata object
403
+ fileQueueStarted = true;
404
+ var file = fileQueue.pop();
405
+ var fd = new FormData();
406
+ fd.append('spud_photo[photo]', file);
407
+
408
+ var csrf = $('meta[name=csrf-token]').prop('content');
409
+ fd.append('authenticity_token', csrf);
410
+
411
+ // create a progress bar
412
+ var progressBar = progressBarForUpload(file.name);
413
+ $('#admin-photo-upload-queue_bars').prepend(progressBar);
414
+
415
+ // send formdata as xhr
416
+ var xhr = new XMLHttpRequest();
417
+ xhr.upload.addEventListener('progress', function(e){ onPhotoUploadProgress(e, progressBar); }, false);
418
+ xhr.addEventListener('load', function(e){ onQueuedPhotoUploadComplete(e, progressBar); }, false);
419
+ xhr.addEventListener('error', function(e){ onPhotoUploadFailure(e, progressBar); }, false);
420
+ xhr.addEventListener('abort', function(e){ onPhotoUploadCancel(e, progressBar); }, false);
421
+ xhr.open('POST', '/admin/photos');
422
+ xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
423
+ xhr.send(fd);
424
+ };
425
+
426
+ var onQueuedPhotoUploadComplete = function(e, progressBar){
427
+ onPhotoUploadComplete(e, progressBar);
428
+ updateQueueCountLabel();
429
+ uploadNextPhoto();
430
+ };
417
431
 
418
432
  })();