code/resources/assets/js/aggregation.js
(function ($) {
$.fn.aggregator = function() {
$(this).each(function() {
$(this).find('div.card').each(function() {
initAggregatorList($(this));
});
$(this).on('click', '.explode-aggregate', function() {
var container = $(this).closest('.card');
container.find('li').each(function() {
var cell = prependCell(container);
cell.find('ul').append($(this).clone());
});
container.remove();
});
$(this).submit(function(e) {
e.preventDefault();
var form = $(this);
form.find('button[type=submit]').prop('disabled', false);
var data = new Array();
form.find('.card').each(function() {
var a = {
id: $(this).attr('data-aggregate-id'),
orders: new Array()
};
$(this).find('li').each(function() {
a.orders.push($(this).attr('data-order-id'));
});
data.push(a);
});
$.ajax({
method: form.attr('method'),
url: form.attr('action'),
data: {
data: JSON.stringify(data)
},
dataType: 'json',
success: function(data) {
location.reload();
}
});
});
});
function prependCell(node) {
var cell = node.clone();
cell.attr('data-aggregate-id', 'new').find('ul').empty();
node.before(cell);
initAggregatorList(cell);
return cell;
}
function initAggregatorList(node) {
var items = node.find('li').length;
if (items < 2) {
node.find('.explode-aggregate').hide();
}
node.find('ul').sortable({
connectWith: '#orderAggregator div.card ul',
accept: 'li',
drop: function(event, ui) {
var items = $(this).find('li').length;
if (items == 0) {
prependCell($(this));
}
else if (items == 1) {
$(this).find('.explode-aggregate').show();
}
var source = ui.draggable.closest('.card');
var ex_items = source.find('li').length;
if (ex_items == 2) {
source.find('.explode-aggregate').hide();
}
ui.draggable.css('right', '').css('left', '').css('top', '').css('bottom', '').css('width', '').css('height', '');
$(this).find('ul').append(ui.draggable);
}
});
}
}
}(jQuery));