I'm using sortable to sort different width x height divs and masonry to clean up the empty spaces. How can I pass the class of the div being sorted to the placeholder so they are the same size?
The boxes have the classes single-single, double-single, etc... to determine the size.
The problem is the classes are not being passed. Sortable adds the class when it doesn't recognize the placeholder option but it sets visibility to hidden.
//The extra ajax stuff is to save the sort order to WordPress menu order.
$(document).ready(function() {
$('#edit').click(function() {
var itemList = $('.sortable');
itemList.sortable({
start: function(event, ui) {
var plus = ui.item.hasClass('double-single') ? 'double-single' : 'single-single';
var placeholder =
itemList.sortable("option", "placeholder", 'placeholder ' + plus );
},
update: function(event, ui) {
$('#loading-animation').show(); // Show the animate loading gif while waiting
opts = {
url: MyAjax.ajaxurl,
// ajaxurl is defined by WordPress and points to /wp-admin/admin-ajax.php
type: 'POST',
async: true,
cache: false,
dataType: 'json',
data: {
action: 'item_sort',
// Tell WordPress how to handle this ajax request
order: itemList.sortable('toArray').toString() // Passes ID's of list items in 1,3,2 format
},
success: function(response) {
$('#loading-animation').hide(); // Hide the loading animation
return;
},
error: function(xhr, textStatus, e) { // This can be expanded to provide more information
alert(e);
// alert('There was an error saving the updates');
$('#loading-animation').hide(); // Hide the loading animation
return;
}
};
$.ajax(opts);
}
});
});
$('.sortable').disableSelection();
});
$(function() {
$('#sort').click(function() {
$('#sortable1').masonry({
columnWidth: 325,
itemSelector: '.ui-state-default'
});
});
});
You can't do it on the create event, that fires whenever you initialize the sortable. Instead you can set placeholder:'placeholder', and use the start event to add an extra class to ui.placeholder to make it the proper size:
itemList.sortable({
placeholder: 'placeholder',
start: function(event, ui) {
var plus;
if(ui.item.hasClass('single-single')) plus = 'single-single'; else
if(ui.item.hasClass('single-double')) plus = 'single-double'; else
if(ui.item.hasClass('single-triple')) plus = 'single-triple'; else
if(ui.item.hasClass('double-single')) plus = 'double-single'; else
if(ui.item.hasClass('double-double')) plus = 'double-double'; else
if(ui.item.hasClass('double-triple')) plus = 'double-triple'; else
plus = 'single-single';
ui.placeholder.addClass(plus);
}});
You might want to implement a more sophisticated class detection method, it's just a quick copy-paste so I could test it.
Here's the demo: http://jsfiddle.net/fTBbc/24/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With