Skip to content

Commit 344308f

Browse files
author
rajaramg
committed
implemented new feature Expand/Collapse All header cell
1 parent 3ce59bf commit 344308f

File tree

5 files changed

+95
-13
lines changed

5 files changed

+95
-13
lines changed

css/react-bootstrap-table.css

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,11 @@ td.react-bs-table-expand-cell {
261261
cursor: pointer;
262262
}
263263

264+
th.react-bs-table-expand-cell {
265+
cursor: pointer;
266+
}
267+
268+
264269
@keyframes shake {
265270
from, to {
266271
transform: translate3d(0, 0, 0);

examples/js/expandRow/custom-expand-indicator.js

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,19 @@ export default class ExpandRow extends React.Component {
8181
);
8282
}
8383

84+
expandedColumnHeaderComponent({ expandAllChilds }) {
85+
const content = (expandAllChilds ? '(-)' : '(+)' );
86+
return (
87+
<div>
88+
{ content }
89+
</div>
90+
);
91+
}
92+
8493
render() {
8594
const options = {
86-
expandRowBgColor: 'rgb(242, 255, 163)'
95+
expandRowBgColor: 'rgb(242, 255, 163)',
96+
expandAllChilds: false
8797
};
8898
return (
8999
<BootstrapTable data={ products }
@@ -93,7 +103,8 @@ export default class ExpandRow extends React.Component {
93103
expandColumnOptions={ {
94104
expandColumnVisible: true,
95105
expandColumnComponent: this.expandColumnComponent,
96-
columnWidth: 50
106+
columnWidth: 50,
107+
expandedColumnHeaderComponent: this.expandedColumnHeaderComponent
97108
} }
98109
search>
99110
<TableHeaderColumn dataField='id' isKey={ true }>Product ID</TableHeaderColumn>

src/BootstrapTable.js

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,24 @@ class BootstrapTable extends Component {
4444
this._adjustHeaderWidth = this._adjustHeaderWidth.bind(this);
4545
this._adjustHeight = this._adjustHeight.bind(this);
4646
this._adjustTable = this._adjustTable.bind(this);
47+
this.toggleExpandAllChilds = this.toggleExpandAllChilds.bind(this);
48+
49+
let expandedKeys = [];
50+
if (this.props.options.expandAllChilds !== null &&
51+
this.props.options.expandAllChilds !== undefined && this.props.options.expandAllChilds) {
52+
expandedKeys = this.store.getAllRowkey();
53+
} else if (this.props.options.expanding !== undefined && this.props.options.expanding !== null) {
54+
expandedKeys = this.props.options.expanding;
55+
}
4756

4857
this.state = {
4958
data: this.getTableData(),
5059
currPage: currPage,
51-
expanding: this.props.options.expanding || [],
60+
expanding: expandedKeys,
5261
sizePerPage: this.props.options.sizePerPage || Const.SIZE_PER_PAGE_LIST[0],
5362
selectedRowKeys: this.store.getSelectedRowKeys(),
5463
reset: false,
64+
expandAllChilds: this.props.options.expandAllChilds,
5565
x: this.props.keyBoardNav ? 0 : -1,
5666
y: this.props.keyBoardNav ? 0 : -1
5767
};
@@ -467,6 +477,9 @@ class BootstrapTable extends Component {
467477
reset={ this.state.reset }
468478
expandColumnVisible={ expandColumnOptions.expandColumnVisible }
469479
expandColumnComponent={ expandColumnOptions.expandColumnComponent }
480+
expandedColumnHeaderComponent={ expandColumnOptions.expandedColumnHeaderComponent }
481+
expandAllChilds={ this.state.expandAllChilds }
482+
toggleExpandAllChilds={ this.toggleExpandAllChilds }
470483
expandColumnBeforeSelectColumn={ expandColumnOptions.expandColumnBeforeSelectColumn }>
471484
{ this.props.children }
472485
</TableHeader>
@@ -616,6 +629,28 @@ class BootstrapTable extends Component {
616629
});
617630
}
618631

632+
toggleExpandAllChilds() {
633+
const { expandAllChilds } = this.state;
634+
const compScope = this;
635+
if (expandAllChilds) {
636+
this.setState(() => {
637+
return {
638+
expanding: [],
639+
expandAllChilds: !expandAllChilds,
640+
reset: false
641+
};
642+
});
643+
} else {
644+
this.setState(() => {
645+
return {
646+
expanding: compScope.store.getAllRowkey(),
647+
expandAllChilds: !expandAllChilds,
648+
reset: false
649+
};
650+
});
651+
}
652+
}
653+
619654
handlePaginationData = (page, sizePerPage) => {
620655
const { onPageChange, pageStartIndex } = this.props.options;
621656
const emptyTable = this.store.isEmpty();
@@ -1691,7 +1726,8 @@ BootstrapTable.propTypes = {
16911726
beforeShowError: PropTypes.func,
16921727
printToolBar: PropTypes.bool,
16931728
insertFailIndicator: PropTypes.string,
1694-
noAutoBOM: PropTypes.bool
1729+
noAutoBOM: PropTypes.bool,
1730+
expandAllChilds: PropTypes.bool
16951731
}),
16961732
fetchInfo: PropTypes.shape({
16971733
dataTotalSize: PropTypes.number
@@ -1710,6 +1746,7 @@ BootstrapTable.propTypes = {
17101746
columnWidth: PropTypes.oneOfType([ PropTypes.number, PropTypes.string ]),
17111747
expandColumnVisible: PropTypes.bool,
17121748
expandColumnComponent: PropTypes.func,
1749+
expandedColumnHeaderComponent: PropTypes.func,
17131750
expandColumnBeforeSelectColumn: PropTypes.bool
17141751
}),
17151752
footer: PropTypes.bool
@@ -1723,6 +1760,7 @@ BootstrapTable.defaultProps = {
17231760
expandColumnOptions: {
17241761
expandColumnVisible: false,
17251762
expandColumnComponent: undefined,
1763+
expandedColumnHeaderComponent: undefined,
17261764
expandColumnBeforeSelectColumn: true
17271765
},
17281766
height: '100%',
@@ -1858,7 +1896,8 @@ BootstrapTable.defaultProps = {
18581896
beforeShowError: undefined,
18591897
printToolBar: true,
18601898
insertFailIndicator: Const.INSERT_FAIL_INDICATOR,
1861-
noAutoBOM: true
1899+
noAutoBOM: true,
1900+
expandAllChilds: false
18621901
},
18631902
fetchInfo: {
18641903
dataTotalSize: 0

src/ExpandRowHeaderColumn.js

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,35 @@ import PropTypes from 'prop-types';
33

44
class ExpandRowHeaderColumn extends Component {
55

6+
constructor(props) {
7+
super(props);
8+
this.toggleExpandAllChilds = this.toggleExpandAllChilds.bind(this);
9+
}
10+
11+
toggleExpandAllChilds() {
12+
this.props.toggleExpandAllChilds();
13+
}
14+
615
render() {
16+
const { expandedColumnHeaderComponent, expandAllChilds } = this.props;
17+
const defaultExpandedHeaderComponent = (expandAllChilds ? '(-)' : '(+)' );
18+
const ExpandedColumnHeaderComponent = expandedColumnHeaderComponent;
19+
720
return (
821
<th rowSpan={ this.props.rowCount } style={ { textAlign: 'center' } }
922
className='react-bs-table-expand-cell'
10-
data-is-only-head={ false }>
11-
{ this.props.children }
23+
data-is-only-head={ false } onClick={ this.toggleExpandAllChilds }>
24+
{ this.props.expandedColumnHeaderComponent ?
25+
<ExpandedColumnHeaderComponent
26+
expandAllChilds={ this.props.expandAllChilds } /> : defaultExpandedHeaderComponent }
1227
</th>
1328
);
1429
}
1530
}
1631
ExpandRowHeaderColumn.propTypes = {
17-
children: PropTypes.node,
18-
rowCount: PropTypes.number
32+
expandedColumnHeaderComponent: PropTypes.func,
33+
rowCount: PropTypes.number,
34+
expandAllChilds: PropTypes.bool,
35+
toggleExpandAllChilds: PropTypes.func
1936
};
2037
export default ExpandRowHeaderColumn;

src/TableHeader.js

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ function getSortOrder(sortList, field, enableSort) {
3838
class TableHeader extends Component {
3939

4040
render() {
41-
const { sortIndicator, sortList, onSort, reset, version, condensed, bordered } = this.props;
41+
const { sortIndicator, sortList, onSort, reset, version, condensed, bordered,
42+
expandedColumnHeaderComponent, expandAllChilds, toggleExpandAllChilds } = this.props;
4243
const containerClasses = classSet(
4344
'react-bs-container-header',
4445
'table-header-wrapper',
@@ -64,13 +65,19 @@ class TableHeader extends Component {
6465
rows[0].push( [
6566
this.props.expandColumnVisible &&
6667
this.props.expandColumnBeforeSelectColumn &&
67-
<ExpandRowHeaderColumn key='expandCol' rowCount={ rowCount + 1 }/>
68+
<ExpandRowHeaderColumn key='expandCol' rowCount={ rowCount + 1 }
69+
expandedColumnHeaderComponent={ expandedColumnHeaderComponent }
70+
expandAllChilds={ expandAllChilds }
71+
toggleExpandAllChilds={ toggleExpandAllChilds }/>
6872
], [
6973
this.renderSelectRowHeader(rowCount + 1, rowKey++)
7074
], [
7175
this.props.expandColumnVisible &&
7276
!this.props.expandColumnBeforeSelectColumn &&
73-
<ExpandRowHeaderColumn key='expandCol' rowCount={ rowCount + 1 }/>
77+
<ExpandRowHeaderColumn key='expandCol' rowCount={ rowCount + 1 }
78+
expandedColumnHeaderComponent={ expandedColumnHeaderComponent }
79+
expandAllChilds={ expandAllChilds }
80+
toggleExpandAllChilds={ toggleExpandAllChilds }/>
7481
]);
7582

7683
React.Children.forEach(this.props.children, (elm) => {
@@ -166,8 +173,11 @@ TableHeader.propTypes = {
166173
reset: PropTypes.bool,
167174
expandColumnVisible: PropTypes.bool,
168175
expandColumnComponent: PropTypes.func,
176+
expandedColumnHeaderComponent: PropTypes.func,
169177
expandColumnBeforeSelectColumn: PropTypes.bool,
170-
version: PropTypes.string
178+
version: PropTypes.string,
179+
expandAllChilds: PropTypes.bool,
180+
toggleExpandAllChilds: PropTypes.func
171181
};
172182

173183
export default TableHeader;

0 commit comments

Comments
 (0)