spud_photos 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +7 -5
- data/app/assets/javascripts/spud/admin/photos.js +242 -85
- data/app/assets/stylesheets/spud/admin/photos.css +33 -6
- data/app/controllers/photo_albums_controller.rb +14 -4
- data/app/controllers/spud/admin/photo_albums_controller.rb +20 -3
- data/app/controllers/spud/admin/photos_controller.rb +10 -7
- data/app/helpers/spud/admin/photos_helper.rb +6 -1
- data/app/models/spud_photo.rb +7 -3
- data/app/models/spud_photo_album.rb +23 -8
- data/app/models/spud_photo_albums_photo.rb +5 -0
- data/app/models/spud_photo_galleries_album.rb +5 -0
- data/app/models/spud_photo_gallery.rb +11 -4
- data/app/views/spud/admin/photo_albums/_form.html.erb +17 -17
- data/app/views/spud/admin/photos/_form.html.erb +3 -5
- data/app/views/spud/admin/photos/_photo.html.erb +8 -4
- data/app/views/spud/admin/photos/index.html.erb +3 -12
- data/app/views/spud/admin/photos/show.js.erb +5 -0
- data/config/routes.rb +1 -0
- data/db/migrate/20120405042046_upgrade_photo_relationships.rb +8 -0
- data/lib/responds_to_parent.rb +69 -0
- data/lib/spud_photos.rb +1 -0
- data/lib/spud_photos/engine.rb +6 -6
- data/lib/spud_photos/version.rb +1 -1
- metadata +18 -13
data/README.markdown
CHANGED
@@ -6,14 +6,12 @@ Spud Photos is an engine for creating and managing photo galleries, designed for
|
|
6
6
|
|
7
7
|
1. In your Gemfile add the following
|
8
8
|
|
9
|
-
gem '
|
10
|
-
gem 'spud_photos', :git => "git://github.com/gregawoods/spud_photos.git"
|
9
|
+
gem 'spud_photos'
|
11
10
|
|
12
11
|
2. Run bundle install
|
13
12
|
3. Copy in database migrations to your new rails project
|
14
13
|
|
15
|
-
bundle exec rake
|
16
|
-
bundle exec rake spud_photos:install:migrations
|
14
|
+
bundle exec rake railties:install:migrations
|
17
15
|
rake db:migrate
|
18
16
|
|
19
17
|
4. Run a rails server instance and point your browser to /spud/admin
|
@@ -23,7 +21,7 @@ Spud Photos is an engine for creating and managing photo galleries, designed for
|
|
23
21
|
Spud Photos accepts the following configuration options:
|
24
22
|
|
25
23
|
Spud::Photos.configure do |config|
|
26
|
-
|
24
|
+
config.base_layout = 'application'
|
27
25
|
config.galleries_enabled = false
|
28
26
|
config.base_path = 'photos'
|
29
27
|
config.photo_styles = {
|
@@ -32,6 +30,10 @@ Spud Photos accepts the following configuration options:
|
|
32
30
|
:large => '400x400#',
|
33
31
|
:huge => '600x600'
|
34
32
|
}
|
33
|
+
self.paperclip_storage = :filesystem #use :s3 to use s3 storage (aws gem required)
|
34
|
+
config.s3_credentials = "#{Rails.root}/config/s3.yml"
|
35
|
+
config.storage_path = ":rails_root/public/system/spud_photos/:id/:style/:basename.:extension"
|
36
|
+
config.storage_url = "/system/spud_photos/:id/:style/:basename.:extension"
|
35
37
|
end
|
36
38
|
|
37
39
|
The `photo_styles` option will be passed to [Paperclip][2], so any valid paperclip styles can be added here.
|
@@ -6,64 +6,111 @@ Spud.Admin.Photos = new function(){
|
|
6
6
|
var self = this;
|
7
7
|
|
8
8
|
this.init = function(){
|
9
|
+
// event handlers
|
9
10
|
$('.spud_admin_photo_ui_thumbs_sortable').sortable({
|
10
11
|
connectWith:'.spud_admin_photo_ui_thumbs_sortable'
|
11
12
|
});
|
12
|
-
$('
|
13
|
-
$('
|
14
|
-
$('
|
15
|
-
$('
|
16
|
-
$('
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
13
|
+
$('body').on('submit', '#spud_admin_photo_album_form', self.submittedPhotoAlbumForm)
|
14
|
+
$('body').on('submit', '#spud_admin_photo_form', self.submittedPhotoForm);
|
15
|
+
$('body').on('click', '.spud_admin_photos_btn_remove', self.clickedPhotoRemoveFromLibrary)
|
16
|
+
$('body').on('click', '.spud_admin_photo_ui_thumbs_selectable .spud_admin_photo_ui_thumb', self.selectedPhotoUiThumb);
|
17
|
+
$('body').on('click', '#spud_admin_photo_album_action_library', self.clickedPhotoLibrary);
|
18
|
+
|
19
|
+
// html5 drag and drop file
|
20
|
+
var droparea = document.getElementById('spud_admin_photos_selected');
|
21
|
+
droparea.addEventListener('dragenter', self.stopDndPropagation, false);
|
22
|
+
droparea.addEventListener('dragexit', self.stopDndPropagation, false);
|
23
|
+
droparea.addEventListener('dragover', self.stopDndPropagation, false);
|
24
|
+
droparea.addEventListener('drop', self.droppedFile, false);
|
25
|
+
};
|
26
|
+
|
27
|
+
this.submittedPhotoAlbumForm = function(){
|
28
|
+
var ids = $('#spud_admin_photos_selected .spud_admin_photo_ui_thumb').map(function(i, el){ return $(el).attr('rel') } );
|
29
|
+
$('#spud_photo_album_order').val(ids.toArray().join());
|
30
|
+
};
|
31
|
+
|
32
|
+
this.clickedPhotoRemoveFromLibrary = function(e){
|
33
|
+
$(this).parents('.spud_admin_photo_ui_thumb').fadeOut(200, function(){
|
34
|
+
$(this).remove();
|
26
35
|
});
|
27
|
-
}
|
36
|
+
};
|
28
37
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
38
|
+
/* Handle file uploads passed via iframe (legacy support)
|
39
|
+
* -------------------------------------------------------- */
|
40
|
+
|
41
|
+
this.photoLegacyUploadErrors = function(html){
|
42
|
+
$('#spud_admin_photo_form').replaceWith(html);
|
43
|
+
};
|
44
|
+
|
45
|
+
this.photoLegacyUploadComplete = function(id, html){
|
46
|
+
var element = $('#spud_admin_photo_' + id);
|
47
|
+
if(element.length > 0){
|
48
|
+
element.replaceWith(htmlhtml);
|
49
|
+
}
|
50
|
+
else{
|
51
|
+
var target = $('#spud_admin_photos_selected .spud_admin_photo_ui_thumbs, #spud_admin_photos');
|
52
|
+
target.prepend(html).fadeIn(200);
|
53
|
+
}
|
54
|
+
$('#dialog').dialog('close');
|
55
|
+
};
|
56
|
+
|
57
|
+
this.selectedPhotoUiThumb = function(e){
|
58
|
+
var thumb = $(this);
|
59
|
+
if(thumb.hasClass('spud_admin_photo_ui_thumb_selected')){
|
60
|
+
$(this).removeClass('spud_admin_photo_ui_thumb_selected');
|
61
|
+
}
|
62
|
+
else{
|
63
|
+
$(this).addClass('spud_admin_photo_ui_thumb_selected');
|
64
|
+
}
|
65
|
+
};
|
66
|
+
|
67
|
+
this.markPhotoAsDeleted = function(photo_id){
|
68
|
+
var photo = $('#spud_admin_photo_' + photo_id);
|
69
|
+
photo.fadeOut(200, function(){
|
70
|
+
photo.remove();
|
71
|
+
});
|
72
|
+
};
|
73
|
+
|
74
|
+
this.markPhotoAlbumAsDeleted = function(photo_album_id){
|
75
|
+
var photo_album = $('#spud_admin_photo_album_' + photo_album_id);
|
76
|
+
photo_album.fadeOut(200, function(){
|
77
|
+
photo_album.remove();
|
78
|
+
});
|
79
|
+
};
|
80
|
+
|
81
|
+
this.markPhotoGalleryAsDeleted = function(photo_gallery_id){
|
82
|
+
var photo_gallery = $('#spud_admin_photo_gallery_' + photo_gallery_id);
|
83
|
+
photo_gallery.fadeOut(200, function(){
|
84
|
+
photo_gallery.remove();
|
33
85
|
});
|
34
|
-
$.ajax({
|
35
|
-
type: 'POST',
|
36
|
-
url: $(this).attr('href'),
|
37
|
-
data: {spud_photo_ids:ids},
|
38
|
-
success: function(data, textStatus, jqXHR){
|
39
|
-
$('.spud_admin_photo_ui_thumb_selected').fadeOut(200, function(){
|
40
|
-
$(this).remove();
|
41
|
-
});
|
42
|
-
},
|
43
|
-
error: function(jqXHR, textStatus, errorThrown){
|
44
|
-
console.log('An error occurred:')
|
45
|
-
console.log(arguments);
|
46
|
-
}
|
47
|
-
})
|
48
86
|
};
|
49
87
|
|
88
|
+
/*
|
89
|
+
* Single-Photo Form Upload
|
90
|
+
-------------------------------- */
|
91
|
+
|
50
92
|
this.submittedPhotoForm = function(e){
|
51
93
|
if(FormData && XMLHttpRequest){
|
52
94
|
// create a FormData object and attach form values
|
53
95
|
var fd = new FormData();
|
54
96
|
var form = $(this);
|
97
|
+
var file = form.find('#spud_photo_photo')[0].files[0];
|
55
98
|
fd.append('_method', form.find('[name=_method]').val());
|
56
99
|
fd.append('authenticity_token', form.find('[name=authenticity_token]').val());
|
57
|
-
fd.append('spud_photo[photo]',
|
100
|
+
fd.append('spud_photo[photo]', file);
|
58
101
|
fd.append('spud_photo[title]', form.find('#spud_photo_title').val());
|
59
102
|
fd.append('spud_photo[caption]', form.find('#spud_photo_caption').val());
|
60
103
|
|
104
|
+
// progress bar to send events to
|
105
|
+
var progressBar = self.progressBarForUpload(file.fileName);
|
106
|
+
form.find('.form-actions').before(progressBar);
|
107
|
+
|
61
108
|
// send FormData object as ajax request
|
62
109
|
var xhr = new XMLHttpRequest();
|
63
|
-
xhr.upload.addEventListener('progress', self.
|
64
|
-
xhr.addEventListener('load', self.
|
65
|
-
xhr.addEventListener('error', self.
|
66
|
-
xhr.addEventListener('abort', self.
|
110
|
+
xhr.upload.addEventListener('progress', function(e){ self.onPhotoUploadProgress(e, progressBar) }, false);
|
111
|
+
xhr.addEventListener('load', function(e){ self.onPhotoUploadComplete(e, progressBar); }, false);
|
112
|
+
xhr.addEventListener('error', function(e){ self.onPhotoUploadFailure(e, progressBar); }, false);
|
113
|
+
xhr.addEventListener('abort', function(e){ self.onPhotoUploadCancel(e, progressBar); }, false);
|
67
114
|
xhr.open('POST', form.attr('action'));
|
68
115
|
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
|
69
116
|
xhr.send(fd);
|
@@ -71,23 +118,44 @@ Spud.Admin.Photos = new function(){
|
|
71
118
|
}
|
72
119
|
};
|
73
120
|
|
74
|
-
|
121
|
+
/*
|
122
|
+
* Upload Progress Monitoring
|
123
|
+
-------------------------------- */
|
124
|
+
|
125
|
+
this.progressBarForUpload = function(fileName){
|
126
|
+
return $('\
|
127
|
+
<div class="spud_admin_photo_progress" \
|
128
|
+
<h6> \
|
129
|
+
<span class="spud_admin_photo_progress_filename">'+fileName+'</span>: \
|
130
|
+
<span class="spud_admin_photo_progress_status">Uploading</span> \
|
131
|
+
</h6> \
|
132
|
+
<div class="progress progress-striped active"> \
|
133
|
+
<div class="bar" style="width: 0;"></div> \
|
134
|
+
</div> \
|
135
|
+
</div>');
|
136
|
+
};
|
137
|
+
|
138
|
+
this.onPhotoUploadProgress = function(e, progressBar){
|
75
139
|
var percent = Math.round(e.loaded * 100 / e.total);
|
76
|
-
|
77
|
-
|
78
|
-
|
140
|
+
progressBar.find('.bar').css({width: percent + '%'});
|
141
|
+
if(percent == 100){
|
142
|
+
progressBar.find('.progress').addClass('progress-success');
|
143
|
+
progressBar.find('.spud_admin_photo_progress_status').text('Processing');
|
144
|
+
}
|
79
145
|
};
|
80
146
|
|
81
|
-
this.
|
147
|
+
this.onPhotoUploadComplete = function(e, progressBar){
|
82
148
|
// success
|
83
149
|
var photo = $.parseJSON(e.target.response);
|
84
150
|
if(e.target.status == 200){
|
151
|
+
progressBar.find('.spud_admin_photo_progress_status').text('Done!');
|
152
|
+
progressBar.find('.progress').removeClass('progress-striped active');
|
85
153
|
var element = $('#spud_admin_photo_' + photo.id);
|
86
154
|
if(element.length > 0){
|
87
155
|
element.replaceWith(photo.html);
|
88
156
|
}
|
89
157
|
else{
|
90
|
-
var target = $('#spud_admin_photos_selected
|
158
|
+
var target = $('#spud_admin_photos_selected, #spud_admin_photos');
|
91
159
|
target.prepend(photo.html).fadeIn(200);
|
92
160
|
}
|
93
161
|
$('#dialog').dialog('close');
|
@@ -98,61 +166,150 @@ Spud.Admin.Photos = new function(){
|
|
98
166
|
}
|
99
167
|
};
|
100
168
|
|
101
|
-
this.
|
102
|
-
console.log('fail!');
|
103
|
-
console.log(e);
|
104
|
-
}
|
169
|
+
this.onPhotoUploadCancel = function(e, progressBar){
|
105
170
|
|
106
|
-
|
107
|
-
console.log('cancel');
|
108
|
-
};
|
171
|
+
};
|
109
172
|
|
110
|
-
|
111
|
-
|
112
|
-
|
173
|
+
this.onPhotoUploadCancel = function(e, progressBar){
|
174
|
+
progressBar.find('.spud_admin_photo_progress_status').text('Done!');
|
175
|
+
progressBar.find('.progress').addClass('progress-danger');
|
113
176
|
};
|
114
177
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
}
|
178
|
+
/*
|
179
|
+
* Add From Photo Library
|
180
|
+
------------------------------- */
|
181
|
+
|
182
|
+
this.clickedPhotoLibrary = function(e){
|
183
|
+
var url = this.href;
|
184
|
+
$.ajax({
|
185
|
+
url:url,
|
186
|
+
success:self.photoLibraryLoaded
|
187
|
+
});
|
188
|
+
return false;
|
127
189
|
};
|
128
190
|
|
129
|
-
this.
|
130
|
-
$(
|
131
|
-
|
132
|
-
|
133
|
-
|
191
|
+
this.photoLibraryLoaded = function(html){
|
192
|
+
var dialog = $("#dialog");
|
193
|
+
if(dialog.length == 0){
|
194
|
+
dialog = $('<div id="dialog" style="display:hidden;"></div>').appendTo('body');
|
195
|
+
}
|
196
|
+
dialog.html(html);
|
197
|
+
$('#spud_admin_photos_selected .spud_admin_photo_ui_thumb').each(function(){
|
198
|
+
var id = $(this).attr('id');
|
199
|
+
var dupe = dialog.find('#'+id);
|
200
|
+
if(dupe){
|
201
|
+
dupe.remove();
|
202
|
+
}
|
203
|
+
});
|
204
|
+
dialog.dialog({
|
205
|
+
width: 660,
|
206
|
+
modal: true,
|
207
|
+
height: 450,
|
208
|
+
title: 'My Photo Library',
|
209
|
+
buttons: {
|
210
|
+
'Add Selected': self.addSelectedPhotosFromLibrary,
|
211
|
+
'Delete Selected': self.deleteSelectedPhotosFromLibrary
|
134
212
|
}
|
135
213
|
});
|
136
214
|
};
|
137
215
|
|
138
|
-
this.
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
216
|
+
this.addSelectedPhotosFromLibrary = function(e){
|
217
|
+
$('#spud_admin_photo_library .spud_admin_photo_ui_thumb_selected')
|
218
|
+
.removeClass('spud_admin_photo_ui_thumb_selected')
|
219
|
+
.prependTo('#spud_admin_photos_selected')
|
220
|
+
.hide()
|
221
|
+
.fadeIn(200);
|
222
|
+
$(this).dialog('close');
|
143
223
|
};
|
144
224
|
|
145
|
-
this.
|
146
|
-
var
|
147
|
-
|
148
|
-
photo_album.remove();
|
225
|
+
this.deleteSelectedPhotosFromLibrary = function(e){
|
226
|
+
var ids = $.map($('.spud_admin_photo_ui_thumb_selected'), function(val, i){
|
227
|
+
return $(val).attr('rel');
|
149
228
|
});
|
229
|
+
$.ajax({
|
230
|
+
type: 'POST',
|
231
|
+
url: '/spud/admin/photos/mass_destroy',
|
232
|
+
data: {spud_photo_ids:ids},
|
233
|
+
success: function(data, textStatus, jqXHR){
|
234
|
+
$('.spud_admin_photo_ui_thumb_selected').fadeOut(200, function(){
|
235
|
+
$(this).remove();
|
236
|
+
});
|
237
|
+
},
|
238
|
+
error: function(jqXHR, textStatus, errorThrown){
|
239
|
+
console.log('An error occurred:')
|
240
|
+
console.log(arguments);
|
241
|
+
}
|
242
|
+
})
|
243
|
+
|
150
244
|
};
|
151
245
|
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
246
|
+
/*
|
247
|
+
* Drag & Drop File Upload Queue
|
248
|
+
-------------------------------- */
|
249
|
+
|
250
|
+
this.fileQueue = [];
|
251
|
+
this.fileQueueStarted = false;
|
252
|
+
|
253
|
+
// prevent default browser behavior of opening the dropped file
|
254
|
+
this.stopDndPropagation = function(e){
|
255
|
+
e.stopPropagation();
|
256
|
+
e.preventDefault();
|
257
|
+
}
|
258
|
+
|
259
|
+
// add files to queue. starts queue if not started already
|
260
|
+
this.droppedFile = function(e){
|
261
|
+
e.stopPropagation();
|
262
|
+
e.preventDefault();
|
263
|
+
$('#spud_admin_photo_upload_queue').show();
|
264
|
+
var files = e.dataTransfer.files;
|
265
|
+
var i = 0;
|
266
|
+
while(i < files.length){
|
267
|
+
self.fileQueue.push(files[i]);
|
268
|
+
i++;
|
269
|
+
}
|
270
|
+
self.updateQueueCountLabel();
|
271
|
+
if(!this.fileQueueStarted){
|
272
|
+
self.uploadNextPhoto();
|
273
|
+
if(self.fileQueue.length > 0){
|
274
|
+
self.uploadNextPhoto();
|
275
|
+
}
|
276
|
+
}
|
277
|
+
};
|
278
|
+
|
279
|
+
this.updateQueueCountLabel = function(){
|
280
|
+
$('#spud_admin_photo_upload_queue_label span').text(self.fileQueue.length);
|
281
|
+
};
|
282
|
+
|
283
|
+
this.uploadNextPhoto = function(){
|
284
|
+
if(self.fileQueue.length == 0){
|
285
|
+
self.fileQueueStarted = false;
|
286
|
+
return;
|
287
|
+
}
|
288
|
+
|
289
|
+
// formdata object
|
290
|
+
self.fileQueueStarted = true;
|
291
|
+
var file = self.fileQueue.pop();
|
292
|
+
var fd = new FormData();
|
293
|
+
fd.append('spud_photo[photo]', file);
|
294
|
+
|
295
|
+
// create a progress bar
|
296
|
+
var progressBar = self.progressBarForUpload(file.fileName);
|
297
|
+
$('#spud_admin_photo_upload_queue_bars').prepend(progressBar);
|
298
|
+
|
299
|
+
// send formdata as xhr
|
300
|
+
var xhr = new XMLHttpRequest();
|
301
|
+
xhr.upload.addEventListener('progress', function(e){ self.onPhotoUploadProgress(e, progressBar); }, false);
|
302
|
+
xhr.addEventListener('load', function(e){ self.onQueuedPhotoUploadComplete(e, progressBar) }, false);
|
303
|
+
xhr.addEventListener('error', function(e){ self.onPhotoUploadFailure(e, progressBar); }, false);
|
304
|
+
xhr.addEventListener('abort', function(e){ self.onPhotoUploadCancel(e, progressBar); }, false);
|
305
|
+
xhr.open('POST', '/spud/admin/photos');
|
306
|
+
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
|
307
|
+
xhr.send(fd);
|
308
|
+
};
|
309
|
+
|
310
|
+
this.onQueuedPhotoUploadComplete = function(e, progressBar){
|
311
|
+
self.onPhotoUploadComplete(e, progressBar);
|
312
|
+
self.updateQueueCountLabel();
|
313
|
+
self.uploadNextPhoto();
|
157
314
|
};
|
158
315
|
};
|
@@ -12,7 +12,7 @@
|
|
12
12
|
margin: 15px 0;
|
13
13
|
}
|
14
14
|
.spud_admin_photo_ui_thumbs{
|
15
|
-
height:
|
15
|
+
height: 300px;
|
16
16
|
padding: 0;
|
17
17
|
border: 1px solid #cacaca;
|
18
18
|
margin: 15px 0;
|
@@ -50,16 +50,19 @@
|
|
50
50
|
.spud_admin_photo_ui_thumbs_selectable .spud_admin_photo_ui_thumb{
|
51
51
|
cursor: pointer;
|
52
52
|
}
|
53
|
+
.spud_admin_photo_ui_thumbs_selectable .spud_admin_photo_ui_thumb_controls{
|
54
|
+
display: none;
|
55
|
+
}
|
53
56
|
.spud_admin_photo_ui_thumb_selected{
|
54
57
|
border: 3px solid #006CCC;
|
55
|
-
margin:
|
58
|
+
margin: 13px;
|
59
|
+
}
|
60
|
+
.spud_admin_photo_ui_thumb_small.spud_admin_photo_ui_thumb_selected{
|
61
|
+
margin: 9px;
|
56
62
|
}
|
57
63
|
.spud_admin_photo_ui_thumbs_sortable .spud_admin_photo_ui_thumb{
|
58
64
|
cursor: move;
|
59
65
|
}
|
60
|
-
.spud_admin_photo_ui_thumb_selected:nth-child(6n){
|
61
|
-
margin-right: -3px;
|
62
|
-
}
|
63
66
|
.spud_admin_photo_ui_thumb h5{
|
64
67
|
font-size: 12px;
|
65
68
|
color: white;
|
@@ -86,7 +89,7 @@
|
|
86
89
|
background: rgba(0,0,0,0.5);
|
87
90
|
border-bottom-right-radius: 15px;
|
88
91
|
}
|
89
|
-
.spud_admin_photos_btn_delete{
|
92
|
+
.spud_admin_photos_btn_remove, .spud_admin_photos_btn_delete{
|
90
93
|
background: url('/assets/spud/photos/buttons/x_16x16.png');
|
91
94
|
height: 16px;
|
92
95
|
width: 16px;
|
@@ -109,4 +112,28 @@
|
|
109
112
|
position: absolute;
|
110
113
|
top: 0;
|
111
114
|
right: 0;
|
115
|
+
}
|
116
|
+
|
117
|
+
#spud_admin_photo_album_actions{
|
118
|
+
|
119
|
+
}
|
120
|
+
|
121
|
+
/* Upload Queue
|
122
|
+
---------------------------- */
|
123
|
+
#spud_admin_photo_album_form{
|
124
|
+
|
125
|
+
}
|
126
|
+
.spud_admin_photo_progress{
|
127
|
+
margin: 10px 0;
|
128
|
+
}
|
129
|
+
#spud_admin_photo_upload_queue{
|
130
|
+
display: none;
|
131
|
+
background: white;
|
132
|
+
padding: 15px;
|
133
|
+
margin: 0 0 0 10px;
|
134
|
+
width: 250px;
|
135
|
+
height: 270px;
|
136
|
+
float: right;
|
137
|
+
border: 1px solid #cacaca;
|
138
|
+
overflow-y: scroll;
|
112
139
|
}
|
@@ -6,10 +6,11 @@ class PhotoAlbumsController < ApplicationController
|
|
6
6
|
def index
|
7
7
|
if params[:photo_gallery_id]
|
8
8
|
@photo_gallery = SpudPhotoGallery.find_by_url_name(params[:photo_gallery_id])
|
9
|
-
if @photo_gallery
|
10
|
-
|
9
|
+
if @photo_gallery.blank?
|
10
|
+
flash[:error] = 'Photo gallery could not be found!'
|
11
|
+
redirect_to photo_galleries_path and return false
|
11
12
|
else
|
12
|
-
@photo_albums =
|
13
|
+
@photo_albums = @photo_gallery.albums.order('created_at desc')
|
13
14
|
end
|
14
15
|
else
|
15
16
|
@photo_albums = SpudPhotoAlbum.order('created_at desc')
|
@@ -19,7 +20,16 @@ class PhotoAlbumsController < ApplicationController
|
|
19
20
|
|
20
21
|
def show
|
21
22
|
@photo_album = SpudPhotoAlbum.find_by_url_name(params[:id])
|
22
|
-
|
23
|
+
if @photo_album.blank?
|
24
|
+
flash[:error] = "Post not found!"
|
25
|
+
if params[:photo_gallery_id]
|
26
|
+
redirect_to photo_gallery_photo_albums_path(params[:photo_gallery_id])
|
27
|
+
else
|
28
|
+
redirect_to photo_albums_path
|
29
|
+
end
|
30
|
+
else
|
31
|
+
respond_with @photo_album
|
32
|
+
end
|
23
33
|
end
|
24
34
|
|
25
35
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
class Spud::Admin::PhotoAlbumsController < Spud::Admin::ApplicationController
|
2
2
|
|
3
|
-
before_filter :get_album, :only => [:show, :edit, :update, :destroy]
|
3
|
+
before_filter :get_album, :only => [:show, :edit, :update, :destroy, :library]
|
4
4
|
respond_to :html, :json, :xml
|
5
5
|
layout 'spud/admin/spud_photos'
|
6
6
|
|
@@ -20,7 +20,10 @@ class Spud::Admin::PhotoAlbumsController < Spud::Admin::ApplicationController
|
|
20
20
|
|
21
21
|
def create
|
22
22
|
@photo_album = SpudPhotoAlbum.new(params[:spud_photo_album])
|
23
|
-
|
23
|
+
if @photo_album.save
|
24
|
+
set_photo_order
|
25
|
+
@photo_album.spud_photo_albums_photos = photo_albums_photos
|
26
|
+
end
|
24
27
|
respond_with @photo_album, :location => spud_admin_photo_albums_path
|
25
28
|
end
|
26
29
|
|
@@ -30,7 +33,10 @@ class Spud::Admin::PhotoAlbumsController < Spud::Admin::ApplicationController
|
|
30
33
|
|
31
34
|
def update
|
32
35
|
@photo_album.update_attributes(params[:spud_photo_album])
|
33
|
-
|
36
|
+
if @photo_album.save
|
37
|
+
set_photo_order
|
38
|
+
flash[:notice] = 'SpudPhotoAlbum updated successfully'
|
39
|
+
end
|
34
40
|
respond_with @photo_album, :location => spud_admin_photo_albums_path
|
35
41
|
end
|
36
42
|
|
@@ -43,4 +49,15 @@ class Spud::Admin::PhotoAlbumsController < Spud::Admin::ApplicationController
|
|
43
49
|
@photo_album = SpudPhotoAlbum.find(params[:id])
|
44
50
|
end
|
45
51
|
|
52
|
+
private
|
53
|
+
|
54
|
+
def set_photo_order
|
55
|
+
order_ids = params[:spud_photo_album_order].split(',')
|
56
|
+
@photo_album.spud_photo_albums_photos.each do |obj|
|
57
|
+
logger.debug "##### ID: #{obj.spud_photo_id.to_s}"
|
58
|
+
index = order_ids.index(obj.spud_photo_id.to_s)
|
59
|
+
obj.update_attribute(:order, index)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
46
63
|
end
|
@@ -1,11 +1,10 @@
|
|
1
1
|
class Spud::Admin::PhotosController < Spud::Admin::ApplicationController
|
2
2
|
|
3
|
+
include RespondsToParent
|
4
|
+
|
3
5
|
before_filter :get_photo, :only => [:show, :edit, :update, :destroy]
|
4
6
|
respond_to :html, :json, :xml, :js
|
5
|
-
layout
|
6
|
-
|
7
|
-
add_breadcrumb 'Photos', :spud_admin_photos_path
|
8
|
-
belongs_to_spud_app :photos
|
7
|
+
layout false
|
9
8
|
|
10
9
|
def index
|
11
10
|
@photos = SpudPhoto.all
|
@@ -32,7 +31,9 @@ class Spud::Admin::PhotosController < Spud::Admin::ApplicationController
|
|
32
31
|
if request.xhr?
|
33
32
|
render json_for_photo(success)
|
34
33
|
else
|
35
|
-
|
34
|
+
respond_to_parent do
|
35
|
+
render 'show.js'
|
36
|
+
end
|
36
37
|
end
|
37
38
|
end
|
38
39
|
|
@@ -51,10 +52,12 @@ class Spud::Admin::PhotosController < Spud::Admin::ApplicationController
|
|
51
52
|
if request.xhr?
|
52
53
|
render json_for_photo(success)
|
53
54
|
else
|
54
|
-
|
55
|
+
respond_to_parent do
|
56
|
+
render 'show.js'
|
57
|
+
end
|
55
58
|
end
|
56
59
|
end
|
57
|
-
|
60
|
+
|
58
61
|
def destroy
|
59
62
|
flash[:notice] = 'SpudPhoto deleted successfully' if @photo.destroy
|
60
63
|
respond_with @photo, :location => spud_admin_photos_path
|
data/app/models/spud_photo.rb
CHANGED
@@ -1,7 +1,11 @@
|
|
1
1
|
class SpudPhoto < ActiveRecord::Base
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
|
3
|
+
attr_accessible :title, :caption, :photo
|
4
|
+
|
5
|
+
has_many :spud_photo_albums_photos
|
6
|
+
has_many :albums,
|
7
|
+
:through => :spud_photo_albums_photos,
|
8
|
+
:source => :spud_photo_album
|
5
9
|
|
6
10
|
has_attached_file :photo,
|
7
11
|
:styles => lambda { |attachment| attachment.instance.dynamic_styles },
|
@@ -1,15 +1,22 @@
|
|
1
1
|
class SpudPhotoAlbum < ActiveRecord::Base
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
:
|
8
|
-
:
|
2
|
+
|
3
|
+
attr_accessible :title, :url_name, :photos, :photo_ids
|
4
|
+
|
5
|
+
has_many :spud_photo_albums_photos
|
6
|
+
has_many :photos,
|
7
|
+
:through => :spud_photo_albums_photos,
|
8
|
+
:source => :spud_photo,
|
9
|
+
:order => 'spud_photo_albums_photos.order asc'
|
10
|
+
|
11
|
+
has_many :spud_photo_galleries_albums
|
12
|
+
has_many :galleries,
|
13
|
+
:through => :spud_photo_galleries_albums,
|
14
|
+
:source => :spud_photo_gallery
|
15
|
+
|
9
16
|
validates_presence_of :title, :url_name
|
10
17
|
validates_uniqueness_of :title, :url_name
|
11
18
|
before_validation :set_url_name
|
12
|
-
|
19
|
+
after_save :update_photo_order
|
13
20
|
|
14
21
|
def top_photo_url(style)
|
15
22
|
unless photos.empty?
|
@@ -31,4 +38,12 @@ class SpudPhotoAlbum < ActiveRecord::Base
|
|
31
38
|
self.url_name = self.title.parameterize
|
32
39
|
end
|
33
40
|
|
41
|
+
def update_photo_order
|
42
|
+
# order = 0
|
43
|
+
# self.photos.each do |p|
|
44
|
+
# p.update_attribute(:order, order)
|
45
|
+
# order += 1
|
46
|
+
# end
|
47
|
+
end
|
48
|
+
|
34
49
|
end
|
@@ -1,7 +1,12 @@
|
|
1
1
|
class SpudPhotoGallery < ActiveRecord::Base
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
|
3
|
+
attr_accessible :title, :url_name, :albums, :album_ids
|
4
|
+
|
5
|
+
has_many :spud_photo_galleries_albums
|
6
|
+
has_many :albums,
|
7
|
+
:through => :spud_photo_galleries_albums,
|
8
|
+
:source => :spud_photo_album
|
9
|
+
|
5
10
|
validates_presence_of :title, :url_name
|
6
11
|
validates_uniqueness_of :title, :url_name
|
7
12
|
before_validation :set_url_name
|
@@ -23,7 +28,9 @@ class SpudPhotoGallery < ActiveRecord::Base
|
|
23
28
|
private
|
24
29
|
|
25
30
|
def set_url_name
|
26
|
-
|
31
|
+
if self.title
|
32
|
+
self.url_name = self.title.parameterize
|
33
|
+
end
|
27
34
|
end
|
28
35
|
|
29
36
|
end
|
@@ -2,30 +2,30 @@
|
|
2
2
|
|
3
3
|
<%= error_messages_for(f.object) %>
|
4
4
|
|
5
|
+
<%= hidden_field_tag :spud_photo_album_order %>
|
6
|
+
|
5
7
|
<fieldset>
|
6
8
|
<legend>Photo Album Info</legend>
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
</div>
|
9
|
+
<div class="control-group">
|
10
|
+
<%= f.label :title, :class => "control-label" %>
|
11
|
+
<div class="controls">
|
12
|
+
<%= f.text_field :title %>
|
12
13
|
</div>
|
14
|
+
</div>
|
13
15
|
</fieldset>
|
14
16
|
|
15
17
|
<fieldset class="spud_admin_photos_album_fieldset">
|
16
|
-
|
17
|
-
<
|
18
|
-
|
19
|
-
|
20
|
-
<div class="spud_admin_photo_ui_thumbs spud_admin_photo_ui_thumbs_sortable">
|
21
|
-
<%= render :partial => '/spud/admin/photos/photo', :collection => @photo_album.photos %>
|
22
|
-
</div>
|
18
|
+
<legend>Selected Photos</legend>
|
19
|
+
<div id="spud_admin_photo_album_actions" class="control-group">
|
20
|
+
<%= link_to "Photo Library", spud_admin_photos_path, :class => "btn btn-primary", :id => 'spud_admin_photo_album_action_library' %>
|
21
|
+
<%= link_to "Upload Photo", new_spud_admin_photo_path, :class => "ajax btn btn-primary", :title => "New Photo" %>
|
23
22
|
</div>
|
24
|
-
<div id="
|
25
|
-
<
|
26
|
-
<div
|
27
|
-
|
28
|
-
|
23
|
+
<div id="spud_admin_photo_upload_queue">
|
24
|
+
<h5 id="spud_admin_photo_upload_queue_label">Queued Uploads: <span>0</span></h5>
|
25
|
+
<div id="spud_admin_photo_upload_queue_bars"></div>
|
26
|
+
</div>
|
27
|
+
<div id="spud_admin_photos_selected" class="control-group spud_admin_photo_ui_thumbs spud_admin_photo_ui_thumbs_sortable">
|
28
|
+
<%= render :partial => '/spud/admin/photos/photo', :collection => @photo_album.photos %>
|
29
29
|
</div>
|
30
30
|
</fieldset>
|
31
31
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<%= form_for @photo, :url => (@photo.new_record? ? spud_admin_photos_path : spud_admin_photo_path(@photo)), :html => {:id => 'spud_admin_photo_form', :class => 'form-horizontal'} do |f| %>
|
1
|
+
<%= form_for @photo, :url => (@photo.new_record? ? spud_admin_photos_path : spud_admin_photo_path(@photo)), :html => {:id => 'spud_admin_photo_form', :target => 'spud_admin_photo_form_target', :class => 'form-horizontal'} do |f| %>
|
2
2
|
|
3
3
|
<%=error_messages_for(f.object)%>
|
4
4
|
|
@@ -36,13 +36,11 @@
|
|
36
36
|
<% end %>
|
37
37
|
</fieldset>
|
38
38
|
|
39
|
-
<div class="progress progress-striped active" style="display:none;">
|
40
|
-
<div class="bar" style="width: 0;"></div>
|
41
|
-
</div>
|
42
|
-
|
43
39
|
<div class="form-actions">
|
44
40
|
<%= f.submit "Save Photo", :class=>"btn btn-primary form-btn", "data-loading-text" => "Saving..." %>
|
45
41
|
<!--or <%=link_to "cancel", request.referer, :class => "btn" %> -->
|
46
42
|
</div>
|
47
43
|
|
44
|
+
<iframe id="spud_admin_photo_form_target" name="spud_admin_photo_form_target" style="display:none;"></iframe>
|
45
|
+
|
48
46
|
<% end %>
|
@@ -1,9 +1,13 @@
|
|
1
|
-
|
1
|
+
<%= content_tag :div,
|
2
|
+
:rel => photo.id,
|
3
|
+
:id => "spud_admin_photo_#{photo.id}",
|
4
|
+
:style => "background-image:url('#{photo.photo.url(:spud_admin_small)}')",
|
5
|
+
:class => "spud_admin_photo_ui_thumb spud_admin_photo_ui_thumb_small" do %>
|
2
6
|
<div style="display:none;">
|
3
|
-
<%=
|
7
|
+
<%= hidden_field_tag 'spud_photo_album[photo_ids][]', photo.id %>
|
4
8
|
</div>
|
5
9
|
<div class="spud_admin_photo_ui_thumb_controls">
|
6
10
|
<%= link_to 'Edit', edit_spud_admin_photo_path(photo), :class => 'ajax spud_admin_photos_btn_edit' %>
|
7
|
-
<%= link_to 'Delete',
|
11
|
+
<%= link_to 'Delete', '#', :class => 'spud_admin_photos_btn_remove' %>
|
8
12
|
</div>
|
9
|
-
|
13
|
+
<% end %>
|
@@ -1,12 +1,3 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
-->
|
5
|
-
<%= link_to "New Photo", new_spud_admin_photo_path, :class => "spud_admin_photo_create ajax btn btn-primary", :title => "New Photo" %>
|
6
|
-
<% end %>
|
7
|
-
|
8
|
-
<%= content_for :detail do %>
|
9
|
-
<div id="spud_admin_photos" class="spud_admin_photo_ui_thumbs">
|
10
|
-
<%= render :partial => 'photo', :collection => @photos %>
|
11
|
-
<div>
|
12
|
-
<% end %>
|
1
|
+
<div id="spud_admin_photo_library" class="spud_admin_photo_ui_thumbs spud_admin_photo_ui_thumbs_selectable">
|
2
|
+
<%= render :partial => 'photo', :collection => @photos %>
|
3
|
+
<div>
|
@@ -0,0 +1,5 @@
|
|
1
|
+
<% if @photo.errors.any? %>
|
2
|
+
Spud.Admin.Photos.photoLegacyUploadErrors("<%= escape_javascript(render 'form') %>");
|
3
|
+
<% else %>
|
4
|
+
Spud.Admin.Photos.photoLegacyUploadComplete(<%= @photo.id %>, "<%= escape_javascript(render :partial => 'photo', :locals => {:photo => @photo}) %>");
|
5
|
+
<% end %>
|
data/config/routes.rb
CHANGED
@@ -0,0 +1,8 @@
|
|
1
|
+
class UpgradePhotoRelationships < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
add_column :spud_photo_albums_photos, :id, :primary_key
|
4
|
+
add_column :spud_photo_albums_photos, :order, :integer, :default => 0
|
5
|
+
add_column :spud_photo_galleries_albums, :id, :primary_key
|
6
|
+
add_column :spud_photo_galleries_albums, :order, :integer, :default => 0
|
7
|
+
end
|
8
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# Copyright (c) 2006 Sean Treadway
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
# the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
|
23
|
+
# Module containing the methods useful for child IFRAME to parent window communication
|
24
|
+
module RespondsToParent
|
25
|
+
|
26
|
+
# Executes the response body as JavaScript in the context of the parent window.
|
27
|
+
# Use this method of you are posting a form to a hidden IFRAME or if you would like
|
28
|
+
# to use IFRAME base RPC.
|
29
|
+
def responds_to_parent(&block)
|
30
|
+
yield
|
31
|
+
|
32
|
+
if performed?
|
33
|
+
# We're returning HTML instead of JS or XML now
|
34
|
+
response.headers['Content-Type'] = 'text/html; charset=UTF-8'
|
35
|
+
|
36
|
+
# Either pull out a redirect or the request body
|
37
|
+
script = if response.headers['Location']
|
38
|
+
#TODO: erase_redirect_results is missing in rails 3.0 has to be implemented
|
39
|
+
# erase redirect
|
40
|
+
"document.location.href = #{location.to_s.inspect}"
|
41
|
+
else
|
42
|
+
response.body
|
43
|
+
end
|
44
|
+
|
45
|
+
# Escape quotes, linebreaks and slashes, maintaining previously escaped slashes
|
46
|
+
# Suggestions for improvement?
|
47
|
+
script = (script || '').
|
48
|
+
gsub('\\', '\\\\\\').
|
49
|
+
gsub(/\r\n|\r|\n/, '\\n').
|
50
|
+
gsub(/['"]/, '\\\\\&').
|
51
|
+
gsub('</script>','</scr"+"ipt>')
|
52
|
+
|
53
|
+
# Clear out the previous render to prevent double render
|
54
|
+
response.request.env['action_controller.instance'].instance_variable_set(:@_response_body, nil)
|
55
|
+
|
56
|
+
# Eval in parent scope and replace document location of this frame
|
57
|
+
# so back button doesn't replay action on targeted forms
|
58
|
+
# loc = document.location to be set after parent is updated for IE
|
59
|
+
# with(window.parent) - pull in variables from parent window
|
60
|
+
# setTimeout - scope the execution in the windows parent for safari
|
61
|
+
# window.eval - legal eval for Opera
|
62
|
+
render :text => "<html><body><script type='text/javascript' charset='utf-8'>
|
63
|
+
var loc = document.location;
|
64
|
+
with(window.parent) { setTimeout(function() { window.eval('#{script}'); if (typeof(loc) !== 'undefined') loc.replace('about:blank'); }, 1) };
|
65
|
+
</script></body></html>".html_safe
|
66
|
+
end
|
67
|
+
end
|
68
|
+
alias respond_to_parent responds_to_parent
|
69
|
+
end
|
data/lib/spud_photos.rb
CHANGED
data/lib/spud_photos/engine.rb
CHANGED
@@ -15,12 +15,12 @@ module Spud
|
|
15
15
|
:url => '/spud/admin/photo_albums',
|
16
16
|
:retina => true,
|
17
17
|
:order => 82
|
18
|
-
},{
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
18
|
+
# },{
|
19
|
+
# :name => 'Photos',
|
20
|
+
# :thumbnail => 'spud/photos/photo_albums_thumb.png',
|
21
|
+
# :url => '/spud/admin/photos',
|
22
|
+
# :retina => true,
|
23
|
+
# :order => 83
|
24
24
|
}]
|
25
25
|
if Spud::Photos.config.galleries_enabled
|
26
26
|
Spud::Core.config.admin_applications += [{
|
data/lib/spud_photos/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spud_photos
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-04-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
16
|
-
requirement: &
|
16
|
+
requirement: &70189045047420 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 3.2.2
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70189045047420
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: spud_core
|
27
|
-
requirement: &
|
27
|
+
requirement: &70189045046840 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -35,10 +35,10 @@ dependencies:
|
|
35
35
|
version: 0.9.0
|
36
36
|
type: :runtime
|
37
37
|
prerelease: false
|
38
|
-
version_requirements: *
|
38
|
+
version_requirements: *70189045046840
|
39
39
|
- !ruby/object:Gem::Dependency
|
40
40
|
name: paperclip
|
41
|
-
requirement: &
|
41
|
+
requirement: &70189045045960 !ruby/object:Gem::Requirement
|
42
42
|
none: false
|
43
43
|
requirements:
|
44
44
|
- - ! '>='
|
@@ -46,10 +46,10 @@ dependencies:
|
|
46
46
|
version: '0'
|
47
47
|
type: :runtime
|
48
48
|
prerelease: false
|
49
|
-
version_requirements: *
|
49
|
+
version_requirements: *70189045045960
|
50
50
|
- !ruby/object:Gem::Dependency
|
51
51
|
name: mysql2
|
52
|
-
requirement: &
|
52
|
+
requirement: &70189045045160 !ruby/object:Gem::Requirement
|
53
53
|
none: false
|
54
54
|
requirements:
|
55
55
|
- - ! '>='
|
@@ -57,7 +57,7 @@ dependencies:
|
|
57
57
|
version: '0'
|
58
58
|
type: :development
|
59
59
|
prerelease: false
|
60
|
-
version_requirements: *
|
60
|
+
version_requirements: *70189045045160
|
61
61
|
description: Spud Photos is a feature complete photo management/gallery for the spud
|
62
62
|
engine. Manage multiple galleries, albums, and photos. Use HTML 5 to drag and drop
|
63
63
|
many images at once.
|
@@ -89,6 +89,8 @@ files:
|
|
89
89
|
- app/helpers/spud/admin/photos_helper.rb
|
90
90
|
- app/models/spud_photo.rb
|
91
91
|
- app/models/spud_photo_album.rb
|
92
|
+
- app/models/spud_photo_albums_photo.rb
|
93
|
+
- app/models/spud_photo_galleries_album.rb
|
92
94
|
- app/models/spud_photo_gallery.rb
|
93
95
|
- app/views/layouts/spud/admin/spud_photos.html.erb
|
94
96
|
- app/views/photo_albums/index.html.erb
|
@@ -111,11 +113,14 @@ files:
|
|
111
113
|
- app/views/spud/admin/photos/edit.html.erb
|
112
114
|
- app/views/spud/admin/photos/index.html.erb
|
113
115
|
- app/views/spud/admin/photos/new.html.erb
|
116
|
+
- app/views/spud/admin/photos/show.js.erb
|
114
117
|
- config/routes.rb
|
115
118
|
- db/migrate/20120228232120_create_spud_photos.rb
|
116
119
|
- db/migrate/20120228232329_create_spud_photo_albums.rb
|
117
120
|
- db/migrate/20120228232344_create_spud_photo_galleries.rb
|
121
|
+
- db/migrate/20120405042046_upgrade_photo_relationships.rb
|
118
122
|
- lib/generators/spud/photos/views_generator.rb
|
123
|
+
- lib/responds_to_parent.rb
|
119
124
|
- lib/spud_photos/configuration.rb
|
120
125
|
- lib/spud_photos/engine.rb
|
121
126
|
- lib/spud_photos/version.rb
|
@@ -166,7 +171,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
166
171
|
version: '0'
|
167
172
|
segments:
|
168
173
|
- 0
|
169
|
-
hash:
|
174
|
+
hash: 4384740055791320075
|
170
175
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
171
176
|
none: false
|
172
177
|
requirements:
|
@@ -175,10 +180,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
175
180
|
version: '0'
|
176
181
|
segments:
|
177
182
|
- 0
|
178
|
-
hash:
|
183
|
+
hash: 4384740055791320075
|
179
184
|
requirements: []
|
180
185
|
rubyforge_project:
|
181
|
-
rubygems_version: 1.8.
|
186
|
+
rubygems_version: 1.8.10
|
182
187
|
signing_key:
|
183
188
|
specification_version: 3
|
184
189
|
summary: Spud Photos Engine
|