Skip to content

Commit

Permalink
feat(checkbox): add way to show Checbox Selector in Filter Row
Browse files Browse the repository at this point in the history
- add a way to show the Checkbox Selector (select all) inside the Header Row (aka Filter row) via a new flag boolean "showInFilterHeaderRow" false by defaults
- keep previous behavior of showing Checkbox Select in the Column Header Title Row, via a new flag "showInColumnTitleRow", true by default
- both flags can be used (and tested) together, but most often used separately
  • Loading branch information
ghiscoding committed Dec 20, 2018
1 parent d747468 commit 27cbbca
Show file tree
Hide file tree
Showing 3 changed files with 220 additions and 21 deletions.
170 changes: 170 additions & 0 deletions examples/example-checkbox-header-row.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link rel="shortcut icon" type="image/ico" href="favicon.ico" />
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.11.3.custom.css" type="text/css"/>
<link rel="stylesheet" href="../slick.grid.css" type="text/css"/>
<link rel="stylesheet" href="examples.css" type="text/css"/>
<style>
.slick-headerrow-column {
background: #87ceeb;
text-overflow: clip;
-moz-box-sizing: border-box;
box-sizing: border-box;
}

.slick-headerrow-column input {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
</style>
</head>
<body>
<div style="position:relative">
<div style="width:600px;">
<div id="myGrid" style="width:100%;height:500px;"></div>
</div>

<div class="options-panel">
<h2>Demonstrates:</h2>
<ul>
<li>Using a fixed header row to implement column-level filters with Checkbox Selector</li>
<li>Type numbers in textboxes to filter grid data</li>
<li>Checkbox row select column</li>
<p>
<button onclick="toggleHideSelectAllCheckbox()">Toggle show/hide "Select All" checkbox</button>
</p>
</ul>
<h2>View Source:</h2>
<ul>
<li><A href="https://github.com/6pac/SlickGrid/blob/master/examples/example-header-row.html" target="_sourcewindow"> View the source for this example on Github</a></li>
</ul>
</div>
</div>

<script src="../lib/firebugx.js"></script>

<script src="../lib/jquery-1.11.2.min.js"></script>
<script src="../lib/jquery-ui-1.11.3.min.js"></script>
<script src="../lib/jquery.event.drag-2.3.0.js"></script>

<script src="../plugins/slick.checkboxselectcolumn.js"></script>
<script src="../plugins/slick.rowselectionmodel.js"></script>
<script src="../controls/slick.columnpicker.js"></script>

<script src="../slick.core.js"></script>
<script src="../slick.dataview.js"></script>
<script src="../slick.grid.js"></script>

<script>
var dataView;
var grid;
var data = [];
var options = {
enableCellNavigation: true,
showHeaderRow: true,
headerRowHeight: 30,
explicitInitialization: true
};
var columns = [];
var columnFilters = {};
var checkboxSelector3;
var isSelectAllCheckbox3Hidden = false;

checkboxSelector3 = new Slick.CheckboxSelectColumn({
cssClass: "slick-cell-checkboxsel",
showInColumnTitleRow: false,
showInFilterHeaderRow: true
});

columns.push(checkboxSelector3.getColumnDefinition());

for (var i = 0; i < 10; i++) {
columns.push({
id: i,
name: String.fromCharCode("A".charCodeAt(0) + i),
field: i,
width: 60
});
}

function filter(item) {
for (var columnId in columnFilters) {
if (columnId !== undefined && columnFilters[columnId] !== "") {
var c = grid.getColumns()[grid.getColumnIndex(columnId)];
if (item[c.field] != columnFilters[columnId]) {
return false;
}
}
}
return true;
}

function toggleHideSelectAllCheckbox() {
isSelectAllCheckbox3Hidden = !isSelectAllCheckbox3Hidden;
checkboxSelector3.setOptions({ hideSelectAllCheckbox: isSelectAllCheckbox3Hidden });
}

$(function () {
for (var i = 0; i < 100; i++) {
var d = (data[i] = {});
d["id"] = i;
for (var j = 0; j < columns.length; j++) {
d[j] = Math.round(Math.random() * 10);
}
}



dataView = new Slick.Data.DataView();
grid = new Slick.Grid("#myGrid", dataView, columns, options);
grid.setSelectionModel(new Slick.RowSelectionModel({selectActiveRow: false}));
grid.registerPlugin(checkboxSelector3);

var columnpicker = new Slick.Controls.ColumnPicker(columns, grid, options);


dataView.onRowCountChanged.subscribe(function (e, args) {
grid.updateRowCount();
grid.render();
});

dataView.onRowsChanged.subscribe(function (e, args) {
grid.invalidateRows(args.rows);
grid.render();
});


$(grid.getHeaderRow()).on("change keyup", ":input", function (e) {
var columnId = $(this).data("columnId");
if (columnId != null) {
columnFilters[columnId] = $.trim($(this).val());
dataView.refresh();
}
});

grid.onHeaderRowCellRendered.subscribe(function(e, args) {
if (args.column.field !== "sel") {
$(args.node).empty();
$("<input type='text'>")
.data("columnId", args.column.id)
.val(columnFilters[args.column.id])
.appendTo(args.node);
}
});

grid.init();

dataView.beginUpdate();
dataView.setItems(data);
dataView.setFilter(filter);
dataView.endUpdate();
})
</script>
</body>
</html>
2 changes: 1 addition & 1 deletion examples/example-checkbox-row-select.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<link rel="stylesheet" href="../css/smoothness/jquery-ui-1.11.3.custom.css" type="text/css"/>
<link rel="stylesheet" href="examples.css" type="text/css"/>
<link rel="stylesheet" href="../controls/slick.columnpicker.css" type="text/css"/>
<link rel="stylesheet" href="https://opensource.keycdn.com/fontawesome/4.7.0/font-awesome.min.css" integrity="sha384-dNpIIXE8U05kAbPhy3G1cz+yZmTzA6CY8Vg/u2L9xRnHjJiAK76m2BIEaSEV+/aU" crossorigin="anonymous">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" crossorigin="anonymous">
<style>
.slick-cell-checkboxsel {
background: #f0f0f0;
Expand Down
69 changes: 49 additions & 20 deletions plugins/slick.checkboxselectcolumn.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,17 @@

function CheckboxSelectColumn(options) {
var _grid;
var _self = this;
var _selectAll_UID = createUID();
var _handler = new Slick.EventHandler();
var _selectedRowsLookup = {};
var _defaults = {
columnId: "_checkbox_selector",
cssClass: null,
hideSelectAllCheckbox: false,
toolTip: "Select/Deselect All",
width: 30
width: 30,
showInColumnTitleRow: true,
showInFilterHeaderRow: false
};
var _isSelectAllChecked = false;

Expand All @@ -26,36 +28,48 @@
function init(grid) {
_grid = grid;
_handler
.subscribe(_grid.onSelectedRowsChanged, handleSelectedRowsChanged)
.subscribe(_grid.onClick, handleClick)
.subscribe(_grid.onHeaderClick, handleHeaderClick)
.subscribe(_grid.onKeyDown, handleKeyDown);
.subscribe(_grid.onSelectedRowsChanged, handleSelectedRowsChanged)
.subscribe(_grid.onClick, handleClick)
.subscribe(_grid.onKeyDown, handleKeyDown);

if (_options.showInFilterHeaderRow) {
addCheckboxToFilterHeaderRow(grid);
}
if (_options.showInColumnTitleRow) {
_handler.subscribe(_grid.onHeaderClick, handleHeaderClick)
}
}

function destroy() {
_handler.unsubscribeAll();
}

function getOptions(options) {
function getOptions() {
return _options;
}

function setOptions(options) {
_options = $.extend(true, {}, _options, options);

if (_options.hideSelectAllCheckbox) {
_grid.updateColumnHeader(_options.columnId, "", "");
$("#header-filter-selector" + _selectAll_UID).hide();
} else {
var UID = createUID();
if (_isSelectAllChecked) {
_grid.updateColumnHeader(_options.columnId, "<input id='header-selector" + UID + "' type='checkbox' checked='checked'><label for='header-selector" + UID + "'></label>", _options.toolTip);
} else {
_grid.updateColumnHeader(_options.columnId, "<input id='header-selector" + UID + "' type='checkbox'><label for='header-selector" + UID + "'></label>", _options.toolTip);
if (_options.showInColumnTitleRow) {
if (_isSelectAllChecked) {
_grid.updateColumnHeader(_options.columnId, "<input id='header-selector" + _selectAll_UID + "' type='checkbox' checked='checked'><label for='header-selector" + _selectAll_UID + "'></label>", _options.toolTip);
} else {
_grid.updateColumnHeader(_options.columnId, "<input id='header-selector" + _selectAll_UID + "' type='checkbox'><label for='header-selector" + _selectAll_UID + "'></label>", _options.toolTip);
}
}
}
if (_options.showInFilterHeaderRow) {
var selectAllElm = $("#header-filter-selector" + _selectAll_UID).show();
selectAllElm.prop("checked", _isSelectAllChecked);
}
}
}

function handleSelectedRowsChanged(e, args) {
var UID = createUID();
var selectedRows = _grid.getSelectedRows();
var lookup = {}, row, i;
for (i = 0; i < selectedRows.length; i++) {
Expand All @@ -73,12 +87,16 @@
_grid.render();
_isSelectAllChecked = selectedRows.length && selectedRows.length == _grid.getDataLength();

if (!_options.hideSelectAllCheckbox) {
if (_options.showInColumnTitleRow && !_options.hideSelectAllCheckbox) {
if (_isSelectAllChecked) {
_grid.updateColumnHeader(_options.columnId, "<input id='header-selector" + UID + "' type='checkbox' checked='checked'><label for='header-selector" + UID + "'></label>", _options.toolTip);
_grid.updateColumnHeader(_options.columnId, "<input id='header-selector" + _selectAll_UID + "' type='checkbox' checked='checked'><label for='header-selector" + _selectAll_UID + "'></label>", _options.toolTip);
} else {
_grid.updateColumnHeader(_options.columnId, "<input id='header-selector" + UID + "' type='checkbox'><label for='header-selector" + UID + "'></label>", _options.toolTip);
_grid.updateColumnHeader(_options.columnId, "<input id='header-selector" + _selectAll_UID + "' type='checkbox'><label for='header-selector" + _selectAll_UID + "'></label>", _options.toolTip);
}
}
if (_options.showInFilterHeaderRow) {
var selectAllElm = $("#header-filter-selector" + _selectAll_UID);
selectAllElm.prop("checked", _isSelectAllChecked);
}
}

Expand Down Expand Up @@ -184,11 +202,9 @@
}

function getColumnDefinition() {
var UID = createUID();

return {
id: _options.columnId,
name: _options.hideSelectAllCheckbox ? "" : "<input id='header-selector" + UID + "' type='checkbox'><label for='header-selector" + UID + "'></label>",
name: (_options.hideSelectAllCheckbox || !_options.showInColumnTitleRow) ? "" : "<input id='header-selector" + _selectAll_UID + "' type='checkbox'><label for='header-selector" + _selectAll_UID + "'></label>",
toolTip: _options.toolTip,
field: "sel",
width: _options.width,
Expand All @@ -200,6 +216,19 @@
};
}

function addCheckboxToFilterHeaderRow(grid) {
grid.onHeaderRowCellRendered.subscribe(function(e, args) {
if (args.column.field === "sel") {
$(args.node).empty();
$("<input id='header-filter-selector" + _selectAll_UID + "' type='checkbox'><label for='header-selector" + _selectAll_UID + "'></label>")
.appendTo(args.node)
.on('click', function(evnt) {
handleHeaderClick(evnt, args)
});
}
});
}

function createUID() {
return Math.round(10000000 * Math.random());
}
Expand Down

0 comments on commit 27cbbca

Please sign in to comment.