Skip to content

Instantly share code, notes, and snippets.

@jacekd
Created December 4, 2012 22:03
Show Gist options
  • Save jacekd/4209295 to your computer and use it in GitHub Desktop.
Save jacekd/4209295 to your computer and use it in GitHub Desktop.
mselect jquery plugin
(function($){
function collect(a, b) {
return (a == b ? 0 : (a < b ? -1 : 1));
}
function moveSelected(from, to) {
to.append(from.children('option:selected').remove());
}
function moveUpDown(select, direction) {
selected = select.children('option:selected');
if(direction == 'up') {
selected.first().prev().before(selected);
} else {
selected.last().next().after(selected);
}
}
function reorder(target) {
objects = target.find('option');
sorted = objects.sort(function(a, b) {
return collect(a.innerHTML, b.innerHTML);
});
target.html(sorted);
}
function setSelected(jsonURL, left, right) {
$.getJSON(jsonURL, function(data){
$.each(data, function(key, value) {
right.append(left.children('option[value=' + value + ']').remove());
});
});
}
$.fn.mselect = function(options) {
// define settings
var settings = $.extend({
sort: true, autoSize: false, getJSON: false
}, options);
this.each(function() {
var object = $(this);
// find selects
var selects = object.find('select');
// set multiple attribute
selects.attr('multiple', true);
// find buttons
var buttonsLeftRight = object.find('button.moveLeftRight'),
buttonsUpDown = object.find('button.moveUpDown');
// define select inputs and buttons
var left = selects.eq(0),
right = selects.eq(1),
button_left = buttonsLeftRight.eq(0),
button_right = buttonsLeftRight.eq(1),
button_up = buttonsUpDown.eq(0),
button_down = buttonsUpDown.eq(1);
// initial alphabetic order
reorder(left);
// finally some action
var moveSelectedRight = function() {
moveSelected(left, right);
};
button_left.click(moveSelectedRight);
left.dblclick(moveSelectedRight);
var moveSelectedLeft = function() {
moveSelected(right, left);
reorder(left);
};
button_right.click(moveSelectedLeft);
right.dblclick(moveSelectedLeft);
var moveSelectedUp = function() {
moveUpDown(right, 'up');
};
button_up.click(moveSelectedUp);
var moveSelectedDown = function() {
moveUpDown(right, 'down');
};
button_down.click(moveSelectedDown);
// autosize
if (settings.autoSize) {
w = ((x = left.width()) > (y = right.width()) ? x : y);
h = ((x = left.height()) > (y = right.height()) ? x : y);
selects.width(w+10);
selects.height(h+40);
}
if(settings.getJSON) {
setSelected(settings.getJSON, left, right);
}
// upon post send only selected
object.parents('form').submit(function() {
right.find('option').attr('selected', true);
});
});
};
})( jQuery );
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment