Skip to content

Commit 03f2ce4

Browse files
authored
Merge pull request #991 from react-bootstrap-table/develop
20190625 release
2 parents 40c5ae7 + 7382010 commit 03f2ce4

File tree

18 files changed

+242
-27
lines changed

18 files changed

+242
-27
lines changed
Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
/* eslint no-param-reassign: 0 */
2+
import React from 'react';
3+
import BootstrapTable from 'react-bootstrap-table-next';
4+
import Code from 'components/common/code-block';
5+
import { productsGenerator } from 'utils/common';
6+
7+
const products = productsGenerator();
8+
9+
const sourceCode = `\
10+
import BootstrapTable from 'react-bootstrap-table-next';
11+
12+
class DummyColumnWithRowExpand extends React.Component {
13+
constructor(props) {
14+
super(props);
15+
16+
this.state = {
17+
hoverIdx: null
18+
};
19+
}
20+
21+
expandRow = {
22+
renderer: () => (
23+
<div style={ { width: '100%', height: '20px' } }>Content</div>
24+
),
25+
showExpandColumn: true,
26+
expandByColumnOnly: true
27+
};
28+
29+
actionFormater = (cell, row, rowIndex, { hoverIdx }) => {
30+
if ((hoverIdx !== null || hoverIdx !== undefined) && hoverIdx === rowIndex) {
31+
return (
32+
<div
33+
style={ { width: '20px', height: '20px', backgroundColor: 'orange' } }
34+
/>
35+
);
36+
}
37+
return (
38+
<div
39+
style={ { width: '20px', height: '20px' } }
40+
/>
41+
);
42+
}
43+
44+
rowEvents = {
45+
onMouseEnter: (e, row, rowIndex) => {
46+
this.setState({ hoverIdx: rowIndex });
47+
},
48+
onMouseLeave: () => {
49+
this.setState({ hoverIdx: null });
50+
}
51+
}
52+
53+
rowStyle = (row, rowIndex) => {
54+
row.index = rowIndex;
55+
const style = {};
56+
if (rowIndex % 2 === 0) {
57+
style.backgroundColor = 'transparent';
58+
} else {
59+
style.backgroundColor = 'rgba(54, 163, 173, .10)';
60+
}
61+
style.borderTop = 'none';
62+
63+
return style;
64+
}
65+
66+
render() {
67+
const columns = [{
68+
dataField: 'id',
69+
text: 'Product ID'
70+
}, {
71+
dataField: 'name',
72+
text: 'Product Name'
73+
}, {
74+
dataField: 'price',
75+
text: 'Product Price'
76+
}, {
77+
text: '',
78+
isDummyField: true,
79+
formatter: this.actionFormater,
80+
formatExtraData: { hoverIdx: this.state.hoverIdx },
81+
headerStyle: { width: '50px' },
82+
style: { height: '30px' }
83+
}];
84+
return (
85+
<div>
86+
<BootstrapTable
87+
keyField="id"
88+
data={ products }
89+
columns={ columns }
90+
noDataIndication="There is no data"
91+
classes="table"
92+
rowStyle={ this.rowStyle }
93+
rowEvents={ this.rowEvents }
94+
expandRow={ this.expandRow }
95+
/>
96+
</div>
97+
);
98+
}
99+
}
100+
`;
101+
102+
export default class DummyColumnWithRowExpand extends React.Component {
103+
constructor(props) {
104+
super(props);
105+
106+
this.state = {
107+
hoverIdx: null
108+
};
109+
}
110+
111+
expandRow = {
112+
renderer: () => (
113+
<div style={ { width: '100%', height: '20px' } }>Content</div>
114+
),
115+
showExpandColumn: true,
116+
expandByColumnOnly: true
117+
};
118+
119+
actionFormater = (cell, row, rowIndex, { hoverIdx }) => {
120+
if ((hoverIdx !== null || hoverIdx !== undefined) && hoverIdx === rowIndex) {
121+
return (
122+
<div
123+
style={ { width: '20px', height: '20px', backgroundColor: 'orange' } }
124+
/>
125+
);
126+
}
127+
return (
128+
<div
129+
style={ { width: '20px', height: '20px' } }
130+
/>
131+
);
132+
}
133+
134+
rowEvents = {
135+
onMouseEnter: (e, row, rowIndex) => {
136+
this.setState({ hoverIdx: rowIndex });
137+
},
138+
onMouseLeave: () => {
139+
this.setState({ hoverIdx: null });
140+
}
141+
}
142+
143+
rowStyle = (row, rowIndex) => {
144+
row.index = rowIndex;
145+
const style = {};
146+
if (rowIndex % 2 === 0) {
147+
style.backgroundColor = 'transparent';
148+
} else {
149+
style.backgroundColor = 'rgba(54, 163, 173, .10)';
150+
}
151+
style.borderTop = 'none';
152+
153+
return style;
154+
}
155+
156+
render() {
157+
const columns = [{
158+
dataField: 'id',
159+
text: 'Product ID'
160+
}, {
161+
dataField: 'name',
162+
text: 'Product Name'
163+
}, {
164+
dataField: 'price',
165+
text: 'Product Price'
166+
}, {
167+
isDummyField: true,
168+
text: '',
169+
formatter: this.actionFormater,
170+
formatExtraData: { hoverIdx: this.state.hoverIdx },
171+
headerStyle: { width: '50px' },
172+
style: { height: '30px' }
173+
}];
174+
return (
175+
<div>
176+
<BootstrapTable
177+
keyField="id"
178+
data={ products }
179+
columns={ columns }
180+
rowStyle={ this.rowStyle }
181+
rowEvents={ this.rowEvents }
182+
expandRow={ this.expandRow }
183+
/>
184+
<Code>{ sourceCode }</Code>
185+
</div>
186+
);
187+
}
188+
}

packages/react-bootstrap-table2-example/examples/pagination/custom-pagination.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ const options = {
7474
// hidePageListOnlyOnePage: true, // Hide the pagination list when only one page
7575
firstPageText: 'First',
7676
prePageText: 'Back',
77-
nextPageText: 'Next',
77+
nextPageText: <span>Next</span>,
7878
lastPageText: 'Last',
7979
nextPageTitle: 'First page',
8080
prePageTitle: 'Pre page',

packages/react-bootstrap-table2-example/stories/index.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import ColumnEventTable from 'examples/columns/column-event-table';
3535
import ColumnHiddenTable from 'examples/columns/column-hidden-table';
3636
import ColumnAttrsTable from 'examples/columns/column-attrs-table';
3737
import DummyColumnTable from 'examples/columns/dummy-column-table';
38+
import RowExpandWithFormattedDummyColumn from 'examples/columns/row-expand-with-formatted-dummy-column.js';
3839

3940
// work on header columns
4041
import HeaderColumnFormatTable from 'examples/header-columns/column-format-table';
@@ -273,7 +274,8 @@ storiesOf('Work on Columns', module)
273274
.add('Customize Column Class', () => <ColumnClassTable />)
274275
.add('Customize Column Style', () => <ColumnStyleTable />)
275276
.add('Customize Column HTML attribute', () => <ColumnAttrsTable />)
276-
.add('Dummy Column', () => <DummyColumnTable />);
277+
.add('Dummy Column', () => <DummyColumnTable />)
278+
.add('Row Expand with Dummy Column Formatter', () => <RowExpandWithFormattedDummyColumn />);
277279

278280
storiesOf('Work on Header Columns', module)
279281
.addDecorator(bootstrapStyle())

packages/react-bootstrap-table2-filter/src/components/multiselect.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,18 @@ function optionsEquals(currOpts, prevOpts) {
1818
return Object.keys(currOpts).length === Object.keys(prevOpts).length;
1919
}
2020

21-
const getSelections = container =>
22-
Array.from(container.selectedOptions).map(item => item.value);
21+
const getSelections = (container) => {
22+
if (container.selectedOptions) {
23+
return Array.from(container.selectedOptions).map(item => item.value);
24+
}
25+
const selections = [];
26+
const totalLen = container.options.length;
27+
for (let i = 0; i < totalLen; i += 1) {
28+
const option = container.options.item(i);
29+
if (option.selected) selections.push(option.value);
30+
}
31+
return selections;
32+
};
2333

2434
class MultiSelectFilter extends Component {
2535
constructor(props) {

packages/react-bootstrap-table2-paginator/src/page-button.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,11 @@ class PageButton extends Component {
3939

4040
PageButton.propTypes = {
4141
onPageChange: PropTypes.func.isRequired,
42-
page: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,
42+
page: PropTypes.oneOfType([
43+
PropTypes.node,
44+
PropTypes.number,
45+
PropTypes.string
46+
]).isRequired,
4347
active: PropTypes.bool.isRequired,
4448
disabled: PropTypes.bool.isRequired,
4549
className: PropTypes.string,

packages/react-bootstrap-table2-paginator/src/pagination-list.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ const PaginatonList = props => (
2727

2828
PaginatonList.propTypes = {
2929
pages: PropTypes.arrayOf(PropTypes.shape({
30-
page: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
30+
page: PropTypes.oneOfType([
31+
PropTypes.node,
32+
PropTypes.number,
33+
PropTypes.string
34+
]),
3135
active: PropTypes.bool,
3236
disable: PropTypes.bool,
3337
title: PropTypes.string

packages/react-bootstrap-table2-paginator/src/pagination.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,10 +100,10 @@ Pagination.propTypes = {
100100
sizePerPageRenderer: PropTypes.func,
101101
paginationTotalRenderer: PropTypes.func,
102102
sizePerPageOptionRenderer: PropTypes.func,
103-
firstPageText: PropTypes.string,
104-
prePageText: PropTypes.string,
105-
nextPageText: PropTypes.string,
106-
lastPageText: PropTypes.string,
103+
firstPageText: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
104+
prePageText: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
105+
nextPageText: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
106+
lastPageText: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
107107
nextPageTitle: PropTypes.string,
108108
prePageTitle: PropTypes.string,
109109
firstPageTitle: PropTypes.string,

packages/react-bootstrap-table2/src/cell-event-delegater.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import _ from './utils';
2+
13
const events = [
24
'onClick',
35
'onDoubleClick',
@@ -23,7 +25,7 @@ export default ExtendBase =>
2325
delegate(attrs = {}) {
2426
const newAttrs = { ...attrs };
2527
Object.keys(attrs).forEach((attr) => {
26-
if (events.includes(attr)) {
28+
if (_.contains(events, attr)) {
2729
newAttrs[attr] = this.createDefaultEventHandler(attrs[attr]);
2830
}
2931
});

packages/react-bootstrap-table2/src/contexts/row-expand-context.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class RowExpandProvider extends React.Component {
2020
if (nextProps.expandRow) {
2121
const nextExpanded = nextProps.expandRow.expanded || this.state.expanded;
2222
const isClosing = this.state.expanded.reduce((acc, cur) => {
23-
if (!nextExpanded.includes(cur)) {
23+
if (!_.contains(nextExpanded, cur)) {
2424
acc.push(cur);
2525
}
2626
return acc;
@@ -42,7 +42,7 @@ class RowExpandProvider extends React.Component {
4242

4343
handleRowExpand = (rowKey, expanded, rowIndex, e) => {
4444
const { data, keyField, expandRow: { onExpand, onlyOneExpanding, nonExpandable } } = this.props;
45-
if (nonExpandable && nonExpandable.includes(rowKey)) {
45+
if (nonExpandable && _.contains(nonExpandable, rowKey)) {
4646
return;
4747
}
4848

packages/react-bootstrap-table2/src/props-resolver/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export default ExtendBase =>
2222
if (!hiddenRows || hiddenRows.length === 0) return data;
2323
return data.filter((row) => {
2424
const key = _.get(row, keyField);
25-
return !hiddenRows.includes(key);
25+
return !_.contains(hiddenRows, key);
2626
});
2727
}
2828
};

0 commit comments

Comments
 (0)