/**
* @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 : '138px',
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].isId) {
idColumn = options.columns[i];
break;
}
}
this.getter = idColumn.getter;
var html = [];
var table = new morpheus.Table(options);
this.table = table;
var html = [];
html.push('');
html.push('
');
html
.push('');
html.push('');
html.push('
');
html.push('
');
html.push('
');
var $div = $(html.join(''));
var $checkBoxResults = $div.find('[name=checkBoxResults]');
table.$gridDiv.before($div);
var $selectAll = $div.find('[name=selectAll]');
var $selectNone = $div.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();
});
$div.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 = {
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);
},
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);
}
});
// if (this.table.tableSearch) {
// this.table.tableSearch.$el.css('display',
// items.length <= 6 ? 'none' : '');
// }
this.table.setItems(items);
this.table.trigger('checkBoxSelectionChanged', {
source : this,
set : selection
});
}
};