/** * @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('
'); 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 }); } };