Skip to content

Commit 36c84ad

Browse files
committed
Fixed HeaderRow getHeaderRenderer that was causing a bug for sortable filterable grids
1 parent 1621116 commit 36c84ad

File tree

5 files changed

+50
-8
lines changed

5 files changed

+50
-8
lines changed

Diff for: src/Header.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,8 @@ const Header = React.createClass({
9595
height={row.height || this.props.height}
9696
columns={columnMetrics.columns}
9797
resizing={resizeColumn}
98-
headerCellRenderer={row.headerCellRenderer}
98+
filterable={row.filterable}
99+
onFilterChange={row.onFilterChange}
99100
sortColumn={this.props.sortColumn}
100101
sortDirection={this.props.sortDirection}
101102
onSort={this.props.onSort}

Diff for: src/HeaderCellType.js

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
const HeaderCellType = {
2+
SORTABLE: 0,
3+
FILTERABLE: 1,
4+
NONE: 2
5+
};
6+
7+
module.exports = HeaderCellType;

Diff for: src/HeaderRow.js

+37-4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ const getScrollbarSize = require('./getScrollbarSize');
55
const ExcelColumn = require('./addons/grids/ExcelColumn');
66
const ColumnUtilsMixin = require('./ColumnUtils');
77
const SortableHeaderCell = require('./addons/cells/headerCells/SortableHeaderCell');
8+
const FilterableHeaderCell = require('./addons/cells/headerCells/FilterableHeaderCell');
9+
const HeaderCellType = require('./HeaderCellType');
10+
811
const PropTypes = React.PropTypes;
912

1013
const HeaderRowStyle = {
@@ -29,6 +32,8 @@ const HeaderRow = React.createClass({
2932
sortDirection: React.PropTypes.oneOf(DEFINE_SORT),
3033
cellRenderer: PropTypes.func,
3134
headerCellRenderer: PropTypes.func,
35+
filterable: PropTypes.bool,
36+
onFilterChange: PropTypes.func,
3237
resizing: PropTypes.func
3338
},
3439

@@ -45,13 +50,41 @@ const HeaderRow = React.createClass({
4550
);
4651
},
4752

53+
getHeaderCellType(column) {
54+
if (column.filterable) {
55+
if (this.props.filterable) return HeaderCellType.FILTERABLE;
56+
}
57+
58+
if (column.sortable) return HeaderCellType.SORTABLE;
59+
60+
return HeaderCellType.NONE;
61+
},
62+
63+
getFilterableHeaderCell() {
64+
return <FilterableHeaderCell onChange={this.props.onFilterChange} />;
65+
},
66+
67+
getSortableHeaderCell(column) {
68+
let sortDirection = (this.props.sortColumn === column.key) ? this.props.sortDirection : DEFINE_SORT.NONE;
69+
return <SortableHeaderCell columnKey={column.key} onSort={this.props.onSort} sortDirection={sortDirection}/>;
70+
},
71+
4872
getHeaderRenderer(column) {
49-
if (column.sortable) {
50-
let sortDirection = (this.props.sortColumn === column.key) ? this.props.sortDirection : DEFINE_SORT.NONE;
51-
return <SortableHeaderCell columnKey={column.key} onSort={this.props.onSort} sortDirection={sortDirection}/>;
73+
let headerCellType = this.getHeaderCellType(column);
74+
let renderer;
75+
76+
switch (headerCellType) {
77+
case HeaderCellType.SORTABLE:
78+
renderer = this.getSortableHeaderCell(column);
79+
break;
80+
case HeaderCellType.FILTERABLE:
81+
renderer = this.getFilterableHeaderCell();
82+
break;
83+
default:
84+
break;
5285
}
5386

54-
return this.props.headerCellRenderer || column.headerRenderer || this.props.cellRenderer;
87+
return renderer;
5588
},
5689

5790
getStyle(): HeaderRowStyle {

Diff for: src/addons/grids/ExcelColumn.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ const React = require('react');
44
const ExcelColumnShape = {
55
name: React.PropTypes.string.isRequired,
66
key: React.PropTypes.string.isRequired,
7-
width: React.PropTypes.number.isRequired
7+
width: React.PropTypes.number.isRequired,
8+
filterable: React.PropTypes.bool
89
};
910

1011
module.exports = ExcelColumnShape;

Diff for: src/addons/grids/ReactDataGrid.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ const Row = require('../../Row');
1010
const ExcelColumn = require('./ExcelColumn');
1111
const KeyboardHandlerMixin = require('../../KeyboardHandlerMixin');
1212
const CheckboxEditor = require('../editors/CheckboxEditor');
13-
const FilterableHeaderCell = require('../cells/headerCells/FilterableHeaderCell');
1413
const cloneWithProps = require('react/lib/cloneWithProps');
1514
const DOMMetrics = require('../../DOMMetrics');
1615
const ColumnMetricsMixin = require('../../ColumnMetricsMixin');
@@ -343,7 +342,8 @@ const ReactDataGrid = React.createClass({
343342
if (this.state.canFilter === true) {
344343
rows.push({
345344
ref: 'filterRow',
346-
headerCellRenderer: <FilterableHeaderCell onChange={this.props.onAddFilter} />,
345+
filterable: true,
346+
onFilterChange: this.props.onAddFilter,
347347
height: 45
348348
});
349349
}

0 commit comments

Comments
 (0)