/**
* @param {morpheus.Set} [] -
* options.set set of selected items
* @see morpheus.Table
*/
morpheus.CheckBoxList = function (options) {
var _this = this;
var set = options.set || new morpheus.Set();
options = $.extend(true, {}, {
height: '150px',
showHeader: false,
select: false,
search: true,
checkBoxSelectionOnTop: false,
rowHeader: function (item) {
var header = [];
// header
// .push('
');
header.push(' ');
header.push('');
// header
// .push('');
// header.push('
');
return header.join('');
// return ' '
}
}, options);
options = morpheus.Table.createOptions(options);
if (options.columns.length === 1) {
options.maxWidth = 583;
}
var idColumn = options.columns[0];
for (var i = 0; i < options.columns.length; i++) {
if (options.columns[i].idColumn) {
idColumn = options.columns[i];
break;
}
}
this.getter = idColumn.getter;
var html = [];
var table = new morpheus.Table(options);
if (options.columns.length === 1) {
options.$el.find('.slick-table-header').find('[name=right]').remove();
}
this.table = table;
var html = [];
html.push('');
html.push('
');
html
.push('');
html.push('');
html.push('
');
html.push('
');
html.push('
');
var $checkBoxEl = $(html.join(''));
table.$header.find('[name=left]').html($checkBoxEl);
var $checkBoxResults = $checkBoxEl.find('[name=checkBoxResults]');
var $selectAll = $checkBoxEl.find('[name=selectAll]');
var $selectNone = $checkBoxEl.find('[name=selectNone]');
$selectAll.on('click', function (e) {
var items = table.getItems();
for (var i = 0, nitems = items.length; i < nitems; i++) {
set.add(_this.getter(items[i]));
}
_this.table.trigger('checkBoxSelectionChanged', {
source: _this,
set: set
});
e.preventDefault();
_this.table.redraw();
});
$checkBoxEl.find('[name=invertSel]').on('click', function (e) {
// selected become unselected, unselected become selected
var items = table.getItems();
for (var i = 0, nitems = items.length; i < nitems; i++) {
var val = _this.getter(items[i]);
if (set.has(val)) {
set.remove(val);
} else {
set.add(val);
}
}
_this.table.trigger('checkBoxSelectionChanged', {
source: _this,
set: set
});
e.preventDefault();
_this.table.redraw();
});
$selectNone.on('click', function (e) {
var items = table.getItems();
for (var i = 0, nitems = items.length; i < nitems; i++) {
set.remove(_this.getter(items[i]));
}
_this.table.trigger('checkBoxSelectionChanged', {
source: _this,
set: set
});
e.preventDefault();
_this.table.redraw();
});
this.set = set;
this.table = table;
$checkBoxResults.html('selected ' + morpheus.Util.intFormat(set.size())
+ ' of ' + morpheus.Util.intFormat(table.getAllItemCount()));
var priorCount = 0;
this.table.on('checkBoxSelectionChanged', function () {
// if (options.checkBoxSelectionOnTop) {
// var selectedItems = set.values();
// selectedItems.sort();
// for (var i = 0, n = selectedItems.length; i < n; i++) {
// selectedItems[i].__selected = true;
// }
// var previousItems = _this.table.getItems();
// for (var i = 0, n = previousItems.length; i < n; i++) {
// var item = previousItems[i];
// if (!item.__selected) {
// selectedItems.push(item);
// }
// }
//
// var $viewport = table.$gridDiv.find('.slick-viewport');
// var top = $viewport.scrollTop();
//
// _this.table.setItems(selectedItems);
// $viewport.scrollTop(Math.max(0, top
// + (20 * (set.size() - priorCount))));
// priorCount = set.size();
// }
$checkBoxResults.html('selected ' + morpheus.Util.intFormat(set.size())
+ ' of ' + morpheus.Util.intFormat(table.getAllItemCount()));
_this.table.redraw();
});
table.on('click',
function (e) {
var $target = $(e.target);
var item = table.getItems()[e.row];
var value = _this.getter(item);
if ($target.is('.morpheus-hover-show')) { // only
set.clear();
set.add(value);
_this.table.trigger('checkBoxSelectionChanged', {
source: _this,
set: set
});
} else if (!options.select
|| ($target.is('[type=checkbox]') && $target
.attr('name') === 'toggle')) {
if (set.has(value)) {
set.remove(value);
} else {
set.add(value);
}
_this.table.trigger('checkBoxSelectionChanged', {
source: _this,
set: set
});
}
});
};
morpheus.CheckBoxList.prototype = {
searchWithPredicates: function (predicates) {
this.table.searchWithPredicates(predicates);
},
autocomplete: function (tokens, cb) {
this.table.autocomplete(tokens, cb);
},
setHeight: function (height) {
this.table.setHeight(height);
},
resize: function () {
this.table.resize();
},
setSearchVisible: function (visible) {
this.table.setSearchVisible(visible);
},
getSelectedRows: function () {
return this.table.getSelectedRows();
},
getSelectedItems: function () {
return this.table.getSelectedItems();
},
setSelectedRows: function (rows) {
this.table.setSelectedRows(rows);
},
getItems: function (items) {
return this.table.getItems();
},
getAllItemCount: function () {
return this.table.getAllItemCount();
},
getFilteredItemCount: function () {
return this.table.getFilteredItemCount();
},
setFilter: function (f) {
this.table.setFilter(f);
},
redraw: function () {
this.table.redraw();
},
getSelection: function () {
return this.set;
},
clearSelection: function (values) {
this.set.clear();
this.table.redraw();
},
setValue: function (values) {
this.setSelectedValues(values);
},
setSelectedValues: function (values) {
this.set.clear();
if (morpheus.Util.isArray(values)) {
for (var i = 0; i < values.length; i++) {
this.set.add(values[i]);
}
} else {
this.set.add(values);
}
this.table.redraw();
},
val: function () {
return this.set.values();
},
on: function (evtStr, handler) {
this.table.on(evtStr, handler);
return this;
},
off: function (evtStr, handler) {
this.table.off(evtStr, handler);
},
setItems: function (items) {
// remove items in selection that are not in new items
var newItems = new morpheus.Set();
var getter = this.getter;
for (var i = 0; i < items.length; i++) {
newItems.add(getter(items[i]));
}
var selection = this.set;
selection.forEach(function (val) {
if (!newItems.has(val)) {
selection.remove(val);
}
});
this.table.setItems(items);
this.table.trigger('checkBoxSelectionChanged', {
source: this,
set: selection
});
}
};