diff options
Diffstat (limited to 'plugins/slick.checkboxselectcolumn.js')
-rw-r--r-- | plugins/slick.checkboxselectcolumn.js | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/plugins/slick.checkboxselectcolumn.js b/plugins/slick.checkboxselectcolumn.js new file mode 100644 index 0000000..768d395 --- /dev/null +++ b/plugins/slick.checkboxselectcolumn.js @@ -0,0 +1,139 @@ +(function($) { + // register namespace + $.extend(true, window, { + "Slick": { + "CheckboxSelectColumn": CheckboxSelectColumn + } + }); + + + function CheckboxSelectColumn(options) { + var _grid; + var _self = this; + var _selectedRowsLookup = {}; + var _defaults = { + columnId: "_checkbox_selector", + cssClass: null, + toolTip: "Select/Deselect All", + width: 30 + }; + + var _options = $.extend(true,{},_defaults,options); + + function init(grid) { + _grid = grid; + _grid.onSelectedRowsChanged.subscribe(handleSelectedRowsChanged); + _grid.onClick.subscribe(handleClick); + _grid.onHeaderClick.subscribe(handleHeaderClick); + } + + function destroy() { + _grid.onSelectedRowsChanged.unsubscribe(handleSelectedRowsChanged); + _grid.onClick.unsubscribe(handleClick); + _grid.onHeaderClick.unsubscribe(handleHeaderClick); + } + + function handleSelectedRowsChanged(e, args) { + var selectedRows = _grid.getSelectedRows(); + var lookup = {}, row, i; + for (i = 0; i < selectedRows.length; i++) { + row = selectedRows[i]; + lookup[row] = true; + if (lookup[row] !== _selectedRowsLookup[row]) { + _grid.invalidateRow(row); + delete _selectedRowsLookup[row]; + } + } + for (i in _selectedRowsLookup) { + _grid.invalidateRow(i); + } + _selectedRowsLookup = lookup; + _grid.render(); + + if (selectedRows.length == _grid.getDataLength()) { + _grid.updateColumnHeader(_options.columnId, "<input type='checkbox' checked='checked'>", _options.toolTip); + } + else { + _grid.updateColumnHeader(_options.columnId, "<input type='checkbox'>", _options.toolTip); + } + } + + function handleClick(e, args) { + // clicking on a row select checkbox + if (_grid.getColumns()[args.cell].id === _options.columnId && $(e.target).is(":checkbox")) { + // if editing, try to commit + if (_grid.getEditorLock().isActive() && !_grid.getEditorLock().commitCurrentEdit()) { + e.preventDefault(); + e.stopImmediatePropagation(); + return; + } + + if (_selectedRowsLookup[args.row]) { + _grid.setSelectedRows($.grep(_grid.getSelectedRows(),function(n) { return n != args.row })); + } + else { + _grid.setSelectedRows(_grid.getSelectedRows().concat(args.row)); + } + e.stopPropagation(); + e.stopImmediatePropagation(); + } + } + + function handleHeaderClick(e, args) { + if (args.column.id == _options.columnId && $(e.target).is(":checkbox")) { + // if editing, try to commit + if (_grid.getEditorLock().isActive() && !_grid.getEditorLock().commitCurrentEdit()) { + e.preventDefault(); + e.stopImmediatePropagation(); + return; + } + + if ($(e.target).is(":checked")) { + var rows = []; + for (var i = 0; i < _grid.getDataLength(); i++) { + rows.push(i); + } + _grid.setSelectedRows(rows); + } + else { + _grid.setSelectedRows([]); + } + // could update the existing dom nodes instead, but whatever + _grid.invalidate(); + e.stopPropagation(); + e.stopImmediatePropagation(); + } + } + + function getColumnDefinition() { + return { + id: _options.columnId, + name: "<input type='checkbox'>", + toolTip: _options.toolTip, + field: "sel", + width: _options.width, + unselectable: true, + resizable: false, + sortable: false, + cssClass: _options.cssClass, + formatter: checkboxSelectionFormatter + }; + } + + function checkboxSelectionFormatter(row, cell, value, columnDef, dataContext) { + if (dataContext) { + return _selectedRowsLookup[row] + ? "<input type='checkbox' checked='checked'>" + : "<input type='checkbox'>"; + } + return null; + } + + $.extend(this, { + "init": init, + "destroy": destroy, + + "getColumnDefinition": getColumnDefinition + }); + } +})(jQuery);
\ No newline at end of file |