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.
- checksums.yaml +5 -5
- data/{README.markdown → README.md} +0 -0
- data/Rakefile +1 -1
- data/app/assets/images/admin/photos/photo_albums_thumb.png +0 -0
- data/app/assets/javascripts/admin/photos/photos.js +387 -373
- data/app/assets/stylesheets/admin/photos/application.css.scss +49 -51
- data/app/controllers/admin/photo_albums_controller.rb +13 -17
- data/app/controllers/admin/photo_galleries_controller.rb +19 -20
- data/app/controllers/admin/photos_controller.rb +30 -24
- data/app/controllers/photo_albums_controller.rb +12 -18
- data/app/controllers/photo_galleries_controller.rb +1 -3
- data/app/helpers/admin/photos_helper.rb +2 -4
- data/app/models/spud_photo.rb +21 -18
- data/app/models/spud_photo_album.rb +16 -18
- data/app/models/spud_photo_albums_photo.rb +1 -1
- data/app/models/spud_photo_galleries_album.rb +1 -1
- data/app/models/spud_photo_gallery.rb +11 -15
- data/app/views/admin/photo_albums/_album.html.erb +5 -5
- data/app/views/admin/photo_albums/_form.html.erb +32 -23
- data/app/views/admin/photo_albums/index.html.erb +1 -1
- data/app/views/admin/photo_galleries/_album.html.erb +9 -0
- data/app/views/admin/photo_galleries/_form.html.erb +21 -21
- data/app/views/admin/photo_galleries/index.html.erb +6 -6
- data/app/views/admin/photos/_form.html.erb +11 -28
- data/app/views/admin/photos/_photo.html.erb +6 -6
- data/app/views/admin/photos/index.html.erb +1 -1
- data/app/views/admin/photos/show.js.erb +3 -3
- data/app/views/layouts/admin/spud_photos.html.erb +4 -4
- data/app/views/photo_albums/index.html.erb +2 -2
- data/app/views/photo_albums/show.html.erb +2 -2
- data/app/views/photo_galleries/index.html.erb +2 -2
- data/config/routes.rb +5 -7
- data/db/migrate/20120228232120_create_spud_photos.rb +2 -2
- data/db/migrate/20120228232329_create_spud_photo_albums.rb +4 -4
- data/db/migrate/20120228232344_create_spud_photo_galleries.rb +4 -4
- data/db/migrate/20120405042046_upgrade_photo_relationships.rb +4 -4
- data/db/migrate/20121127210314_rename_order_to_sort_order.rb +1 -1
- data/db/migrate/20140730201754_add_fingerprint_to_spud_photos.rb +6 -0
- data/lib/generators/spud/photos/views_generator.rb +1 -2
- data/lib/spud_photos/configuration.rb +8 -8
- data/lib/spud_photos/engine.rb +15 -20
- data/lib/spud_photos/version.rb +3 -3
- data/lib/tb_photos.rb +3 -3
- data/spec/dummy/config.ru +1 -1
- data/spec/dummy/config/application.rb +2 -3
- data/spec/dummy/config/boot.rb +1 -1
- data/spec/dummy/config/environments/test.rb +2 -2
- data/spec/dummy/config/routes.rb +1 -2
- data/spec/dummy/script/rails +2 -2
- data/spec/spec_helper.rb +6 -6
- metadata +35 -68
- data/app/assets/images/admin/photos/buttons/cog_16x16.png +0 -0
- data/app/assets/images/admin/photos/buttons/x_16x16.png +0 -0
- data/app/assets/images/admin/photos/photo_albums_thumb@2x.png +0 -0
- data/app/views/admin/photo_albums/destroy.js.erb +0 -1
- data/app/views/admin/photo_galleries/destroy.js.erb +0 -1
- data/app/views/admin/photos/destroy.js.erb +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 6312c612b6dea2c5a897ea003594296012b7068b4e988c60e01222f1677884c7
|
4
|
+
data.tar.gz: acefd2270d72b9f3973367277b05f065cea62aec278ad4f54a09755234957938
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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(
|
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
|
Binary file
|
@@ -1,418 +1,432 @@
|
|
1
1
|
(function(){
|
2
2
|
|
3
|
-
|
4
|
-
var self = spud.admin.photos;
|
3
|
+
var html5upload = false;
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
self.init = function(){
|
5
|
+
var self = tb.photos = {
|
6
|
+
init: function(){
|
9
7
|
// event handlers
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
$('body').on('submit', '#
|
14
|
-
$('body').on('
|
15
|
-
$('body').on('
|
16
|
-
$('body').on('click', '
|
17
|
-
$('body').on('click', '.
|
18
|
-
$('body').on('click', '
|
19
|
-
$('body').on('click', '
|
20
|
-
$('
|
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('
|
25
|
-
|
26
|
-
$('#
|
27
|
-
droparea.addEventListener('dragenter',
|
28
|
-
droparea.addEventListener('dragexit',
|
29
|
-
droparea.addEventListener('dragover',
|
30
|
-
droparea.addEventListener('drop',
|
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',
|
35
|
-
body.addEventListener('dragexit',
|
36
|
-
body.addEventListener('dragover',
|
37
|
-
body.addEventListener('drop',
|
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
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
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
|
-
|
105
|
-
|
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
|
-
|
112
|
-
var photo_album = $('#
|
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
|
-
|
119
|
-
var photo_gallery = $('#
|
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
|
-
|
70
|
+
/* Handle file uploads passed via iframe (legacy support)
|
71
|
+
* -------------------------------------------------------- */
|
72
|
+
photoLegacyUploadErrors: function(html){
|
73
|
+
$('#admin-photo-form').replaceWith(html);
|
74
|
+
},
|
130
75
|
|
131
|
-
|
132
|
-
|
76
|
+
photoLegacyUploadComplete: function(id, html){
|
77
|
+
var element = $('#admin-photo-' + id);
|
78
|
+
if(element.length > 0){
|
79
|
+
element.replaceWith(html);
|
133
80
|
}
|
134
|
-
|
135
|
-
|
136
|
-
|
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
|
-
|
140
|
-
|
141
|
-
|
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
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
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
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
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
|
-
|
160
|
-
|
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
|
-
|
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
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
});
|
275
|
-
|
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
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
'
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
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
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
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
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
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
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
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
|
})();
|