mirror of
https://github.com/gosticks/react-bootstrap-table2.git
synced 2025-10-16 11:55:39 +00:00
Merge pull request #991 from react-bootstrap-table/develop
20190625 release
This commit is contained in:
commit
03f2ce4792
188
packages/react-bootstrap-table2-example/examples/columns/row-expand-with-formatted-dummy-column.js
vendored
Normal file
188
packages/react-bootstrap-table2-example/examples/columns/row-expand-with-formatted-dummy-column.js
vendored
Normal file
@ -0,0 +1,188 @@
|
||||
/* eslint no-param-reassign: 0 */
|
||||
import React from 'react';
|
||||
import BootstrapTable from 'react-bootstrap-table-next';
|
||||
import Code from 'components/common/code-block';
|
||||
import { productsGenerator } from 'utils/common';
|
||||
|
||||
const products = productsGenerator();
|
||||
|
||||
const sourceCode = `\
|
||||
import BootstrapTable from 'react-bootstrap-table-next';
|
||||
|
||||
class DummyColumnWithRowExpand extends React.Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
|
||||
this.state = {
|
||||
hoverIdx: null
|
||||
};
|
||||
}
|
||||
|
||||
expandRow = {
|
||||
renderer: () => (
|
||||
<div style={ { width: '100%', height: '20px' } }>Content</div>
|
||||
),
|
||||
showExpandColumn: true,
|
||||
expandByColumnOnly: true
|
||||
};
|
||||
|
||||
actionFormater = (cell, row, rowIndex, { hoverIdx }) => {
|
||||
if ((hoverIdx !== null || hoverIdx !== undefined) && hoverIdx === rowIndex) {
|
||||
return (
|
||||
<div
|
||||
style={ { width: '20px', height: '20px', backgroundColor: 'orange' } }
|
||||
/>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<div
|
||||
style={ { width: '20px', height: '20px' } }
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
rowEvents = {
|
||||
onMouseEnter: (e, row, rowIndex) => {
|
||||
this.setState({ hoverIdx: rowIndex });
|
||||
},
|
||||
onMouseLeave: () => {
|
||||
this.setState({ hoverIdx: null });
|
||||
}
|
||||
}
|
||||
|
||||
rowStyle = (row, rowIndex) => {
|
||||
row.index = rowIndex;
|
||||
const style = {};
|
||||
if (rowIndex % 2 === 0) {
|
||||
style.backgroundColor = 'transparent';
|
||||
} else {
|
||||
style.backgroundColor = 'rgba(54, 163, 173, .10)';
|
||||
}
|
||||
style.borderTop = 'none';
|
||||
|
||||
return style;
|
||||
}
|
||||
|
||||
render() {
|
||||
const columns = [{
|
||||
dataField: 'id',
|
||||
text: 'Product ID'
|
||||
}, {
|
||||
dataField: 'name',
|
||||
text: 'Product Name'
|
||||
}, {
|
||||
dataField: 'price',
|
||||
text: 'Product Price'
|
||||
}, {
|
||||
text: '',
|
||||
isDummyField: true,
|
||||
formatter: this.actionFormater,
|
||||
formatExtraData: { hoverIdx: this.state.hoverIdx },
|
||||
headerStyle: { width: '50px' },
|
||||
style: { height: '30px' }
|
||||
}];
|
||||
return (
|
||||
<div>
|
||||
<BootstrapTable
|
||||
keyField="id"
|
||||
data={ products }
|
||||
columns={ columns }
|
||||
noDataIndication="There is no data"
|
||||
classes="table"
|
||||
rowStyle={ this.rowStyle }
|
||||
rowEvents={ this.rowEvents }
|
||||
expandRow={ this.expandRow }
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
export default class DummyColumnWithRowExpand extends React.Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
|
||||
this.state = {
|
||||
hoverIdx: null
|
||||
};
|
||||
}
|
||||
|
||||
expandRow = {
|
||||
renderer: () => (
|
||||
<div style={ { width: '100%', height: '20px' } }>Content</div>
|
||||
),
|
||||
showExpandColumn: true,
|
||||
expandByColumnOnly: true
|
||||
};
|
||||
|
||||
actionFormater = (cell, row, rowIndex, { hoverIdx }) => {
|
||||
if ((hoverIdx !== null || hoverIdx !== undefined) && hoverIdx === rowIndex) {
|
||||
return (
|
||||
<div
|
||||
style={ { width: '20px', height: '20px', backgroundColor: 'orange' } }
|
||||
/>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<div
|
||||
style={ { width: '20px', height: '20px' } }
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
rowEvents = {
|
||||
onMouseEnter: (e, row, rowIndex) => {
|
||||
this.setState({ hoverIdx: rowIndex });
|
||||
},
|
||||
onMouseLeave: () => {
|
||||
this.setState({ hoverIdx: null });
|
||||
}
|
||||
}
|
||||
|
||||
rowStyle = (row, rowIndex) => {
|
||||
row.index = rowIndex;
|
||||
const style = {};
|
||||
if (rowIndex % 2 === 0) {
|
||||
style.backgroundColor = 'transparent';
|
||||
} else {
|
||||
style.backgroundColor = 'rgba(54, 163, 173, .10)';
|
||||
}
|
||||
style.borderTop = 'none';
|
||||
|
||||
return style;
|
||||
}
|
||||
|
||||
render() {
|
||||
const columns = [{
|
||||
dataField: 'id',
|
||||
text: 'Product ID'
|
||||
}, {
|
||||
dataField: 'name',
|
||||
text: 'Product Name'
|
||||
}, {
|
||||
dataField: 'price',
|
||||
text: 'Product Price'
|
||||
}, {
|
||||
isDummyField: true,
|
||||
text: '',
|
||||
formatter: this.actionFormater,
|
||||
formatExtraData: { hoverIdx: this.state.hoverIdx },
|
||||
headerStyle: { width: '50px' },
|
||||
style: { height: '30px' }
|
||||
}];
|
||||
return (
|
||||
<div>
|
||||
<BootstrapTable
|
||||
keyField="id"
|
||||
data={ products }
|
||||
columns={ columns }
|
||||
rowStyle={ this.rowStyle }
|
||||
rowEvents={ this.rowEvents }
|
||||
expandRow={ this.expandRow }
|
||||
/>
|
||||
<Code>{ sourceCode }</Code>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -74,7 +74,7 @@ const options = {
|
||||
// hidePageListOnlyOnePage: true, // Hide the pagination list when only one page
|
||||
firstPageText: 'First',
|
||||
prePageText: 'Back',
|
||||
nextPageText: 'Next',
|
||||
nextPageText: <span>Next</span>,
|
||||
lastPageText: 'Last',
|
||||
nextPageTitle: 'First page',
|
||||
prePageTitle: 'Pre page',
|
||||
|
||||
@ -35,6 +35,7 @@ import ColumnEventTable from 'examples/columns/column-event-table';
|
||||
import ColumnHiddenTable from 'examples/columns/column-hidden-table';
|
||||
import ColumnAttrsTable from 'examples/columns/column-attrs-table';
|
||||
import DummyColumnTable from 'examples/columns/dummy-column-table';
|
||||
import RowExpandWithFormattedDummyColumn from 'examples/columns/row-expand-with-formatted-dummy-column.js';
|
||||
|
||||
// work on header columns
|
||||
import HeaderColumnFormatTable from 'examples/header-columns/column-format-table';
|
||||
@ -273,7 +274,8 @@ storiesOf('Work on Columns', module)
|
||||
.add('Customize Column Class', () => <ColumnClassTable />)
|
||||
.add('Customize Column Style', () => <ColumnStyleTable />)
|
||||
.add('Customize Column HTML attribute', () => <ColumnAttrsTable />)
|
||||
.add('Dummy Column', () => <DummyColumnTable />);
|
||||
.add('Dummy Column', () => <DummyColumnTable />)
|
||||
.add('Row Expand with Dummy Column Formatter', () => <RowExpandWithFormattedDummyColumn />);
|
||||
|
||||
storiesOf('Work on Header Columns', module)
|
||||
.addDecorator(bootstrapStyle())
|
||||
|
||||
@ -18,8 +18,18 @@ function optionsEquals(currOpts, prevOpts) {
|
||||
return Object.keys(currOpts).length === Object.keys(prevOpts).length;
|
||||
}
|
||||
|
||||
const getSelections = container =>
|
||||
Array.from(container.selectedOptions).map(item => item.value);
|
||||
const getSelections = (container) => {
|
||||
if (container.selectedOptions) {
|
||||
return Array.from(container.selectedOptions).map(item => item.value);
|
||||
}
|
||||
const selections = [];
|
||||
const totalLen = container.options.length;
|
||||
for (let i = 0; i < totalLen; i += 1) {
|
||||
const option = container.options.item(i);
|
||||
if (option.selected) selections.push(option.value);
|
||||
}
|
||||
return selections;
|
||||
};
|
||||
|
||||
class MultiSelectFilter extends Component {
|
||||
constructor(props) {
|
||||
|
||||
@ -39,7 +39,11 @@ class PageButton extends Component {
|
||||
|
||||
PageButton.propTypes = {
|
||||
onPageChange: PropTypes.func.isRequired,
|
||||
page: PropTypes.oneOfType([PropTypes.number, PropTypes.string]).isRequired,
|
||||
page: PropTypes.oneOfType([
|
||||
PropTypes.node,
|
||||
PropTypes.number,
|
||||
PropTypes.string
|
||||
]).isRequired,
|
||||
active: PropTypes.bool.isRequired,
|
||||
disabled: PropTypes.bool.isRequired,
|
||||
className: PropTypes.string,
|
||||
|
||||
@ -27,7 +27,11 @@ const PaginatonList = props => (
|
||||
|
||||
PaginatonList.propTypes = {
|
||||
pages: PropTypes.arrayOf(PropTypes.shape({
|
||||
page: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
|
||||
page: PropTypes.oneOfType([
|
||||
PropTypes.node,
|
||||
PropTypes.number,
|
||||
PropTypes.string
|
||||
]),
|
||||
active: PropTypes.bool,
|
||||
disable: PropTypes.bool,
|
||||
title: PropTypes.string
|
||||
|
||||
@ -100,10 +100,10 @@ Pagination.propTypes = {
|
||||
sizePerPageRenderer: PropTypes.func,
|
||||
paginationTotalRenderer: PropTypes.func,
|
||||
sizePerPageOptionRenderer: PropTypes.func,
|
||||
firstPageText: PropTypes.string,
|
||||
prePageText: PropTypes.string,
|
||||
nextPageText: PropTypes.string,
|
||||
lastPageText: PropTypes.string,
|
||||
firstPageText: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
|
||||
prePageText: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
|
||||
nextPageText: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
|
||||
lastPageText: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
|
||||
nextPageTitle: PropTypes.string,
|
||||
prePageTitle: PropTypes.string,
|
||||
firstPageTitle: PropTypes.string,
|
||||
|
||||
@ -1,3 +1,5 @@
|
||||
import _ from './utils';
|
||||
|
||||
const events = [
|
||||
'onClick',
|
||||
'onDoubleClick',
|
||||
@ -23,7 +25,7 @@ export default ExtendBase =>
|
||||
delegate(attrs = {}) {
|
||||
const newAttrs = { ...attrs };
|
||||
Object.keys(attrs).forEach((attr) => {
|
||||
if (events.includes(attr)) {
|
||||
if (_.contains(events, attr)) {
|
||||
newAttrs[attr] = this.createDefaultEventHandler(attrs[attr]);
|
||||
}
|
||||
});
|
||||
|
||||
@ -20,7 +20,7 @@ class RowExpandProvider extends React.Component {
|
||||
if (nextProps.expandRow) {
|
||||
const nextExpanded = nextProps.expandRow.expanded || this.state.expanded;
|
||||
const isClosing = this.state.expanded.reduce((acc, cur) => {
|
||||
if (!nextExpanded.includes(cur)) {
|
||||
if (!_.contains(nextExpanded, cur)) {
|
||||
acc.push(cur);
|
||||
}
|
||||
return acc;
|
||||
@ -42,7 +42,7 @@ class RowExpandProvider extends React.Component {
|
||||
|
||||
handleRowExpand = (rowKey, expanded, rowIndex, e) => {
|
||||
const { data, keyField, expandRow: { onExpand, onlyOneExpanding, nonExpandable } } = this.props;
|
||||
if (nonExpandable && nonExpandable.includes(rowKey)) {
|
||||
if (nonExpandable && _.contains(nonExpandable, rowKey)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@ -22,7 +22,7 @@ export default ExtendBase =>
|
||||
if (!hiddenRows || hiddenRows.length === 0) return data;
|
||||
return data.filter((row) => {
|
||||
const key = _.get(row, keyField);
|
||||
return !hiddenRows.includes(key);
|
||||
return !_.contains(hiddenRows, key);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
@ -1,15 +1,16 @@
|
||||
/* eslint react/prop-types: 0 */
|
||||
import React from 'react';
|
||||
import ExpandRow from './expand-row';
|
||||
import _ from '../utils';
|
||||
import ExpansionContext from '../contexts/row-expand-context';
|
||||
|
||||
export default (Component) => {
|
||||
const renderWithExpansion = (props, expandRow) => {
|
||||
const key = props.value;
|
||||
|
||||
const expanded = expandRow.expanded.includes(key);
|
||||
const isClosing = expandRow.isClosing.includes(key);
|
||||
const expandable = !expandRow.nonExpandable || !expandRow.nonExpandable.includes(key);
|
||||
const expanded = _.contains(expandRow.expanded, key);
|
||||
const isClosing = _.contains(expandRow.isClosing, key);
|
||||
const expandable = !expandRow.nonExpandable || !_.contains(expandRow.nonExpandable, key);
|
||||
return [
|
||||
<Component
|
||||
{ ...props }
|
||||
|
||||
@ -7,8 +7,8 @@ import SelectionContext from '../contexts/selection-context';
|
||||
export default (Component) => {
|
||||
const renderWithSelection = (props, selectRow) => {
|
||||
const key = props.value;
|
||||
const selected = selectRow.selected.includes(key);
|
||||
const selectable = !selectRow.nonSelectable || !selectRow.nonSelectable.includes(key);
|
||||
const selected = _.contains(selectRow.selected, key);
|
||||
const selectable = !selectRow.nonSelectable || !_.contains(selectRow.nonSelectable, key);
|
||||
|
||||
let {
|
||||
style,
|
||||
|
||||
@ -37,10 +37,10 @@ export default class RowAggregator extends shouldUpdater(eventDelegater(React.Co
|
||||
this.props.selectable !== nextProps.selectable ||
|
||||
this.shouldUpdatedBySelfProps(nextProps)
|
||||
) {
|
||||
this.shouldUpdateRowContent = this.shouldUpdateChild(nextProps);
|
||||
this.shouldUpdateRowContent = this.shouldRowContentUpdate(nextProps);
|
||||
return true;
|
||||
}
|
||||
this.shouldUpdateRowContent = this.shouldUpdateChild(nextProps);
|
||||
this.shouldUpdateRowContent = this.shouldRowContentUpdate(nextProps);
|
||||
|
||||
return this.shouldUpdateRowContent;
|
||||
}
|
||||
|
||||
@ -74,7 +74,7 @@ export default ExtendBase =>
|
||||
delegate(attrs = {}) {
|
||||
const newAttrs = { ...attrs };
|
||||
Object.keys(attrs).forEach((attr) => {
|
||||
if (events.includes(attr)) {
|
||||
if (_.contains(events, attr)) {
|
||||
newAttrs[attr] = this.createDefaultEventHandler(attrs[attr]);
|
||||
}
|
||||
});
|
||||
|
||||
@ -48,4 +48,9 @@ export default ExtendBase =>
|
||||
return this.shouldUpdateByCellEditing(nextProps) ||
|
||||
this.shouldUpdatedByNormalProps(nextProps);
|
||||
}
|
||||
|
||||
shouldRowContentUpdate(nextProps) {
|
||||
return this.shouldUpdateChild(nextProps) ||
|
||||
this.shouldUpdateByColumnsForSimpleCheck(nextProps);
|
||||
}
|
||||
};
|
||||
|
||||
@ -15,8 +15,7 @@ class SimpleRow extends shouldUpdater(eventDelegater(Component)) {
|
||||
|
||||
shouldComponentUpdate(nextProps) {
|
||||
this.shouldUpdateRowContent = false;
|
||||
this.shouldUpdateRowContent =
|
||||
this.shouldUpdateChild(nextProps) || this.shouldUpdateByColumnsForSimpleCheck(nextProps);
|
||||
this.shouldUpdateRowContent = this.shouldRowContentUpdate(nextProps);
|
||||
if (this.shouldUpdateRowContent) return true;
|
||||
|
||||
return this.shouldUpdatedBySelfProps(nextProps);
|
||||
|
||||
@ -20,7 +20,7 @@ export const expandableKeys = (data, keyField, skips = []) => {
|
||||
return data.map(row => _.get(row, keyField));
|
||||
}
|
||||
return data
|
||||
.filter(row => !skips.includes(_.get(row, keyField)))
|
||||
.filter(row => !_.contains(skips, _.get(row, keyField)))
|
||||
.map(row => _.get(row, keyField));
|
||||
};
|
||||
|
||||
|
||||
@ -29,7 +29,7 @@ export const selectableKeys = (data, keyField, skips = []) => {
|
||||
return data.map(row => _.get(row, keyField));
|
||||
}
|
||||
return data
|
||||
.filter(row => !skips.includes(_.get(row, keyField)))
|
||||
.filter(row => !_.contains(skips, _.get(row, keyField)))
|
||||
.map(row => _.get(row, keyField));
|
||||
};
|
||||
|
||||
@ -37,7 +37,7 @@ export const unSelectableKeys = (selected, skips = []) => {
|
||||
if (skips.length === 0) {
|
||||
return [];
|
||||
}
|
||||
return selected.filter(x => skips.includes(x));
|
||||
return selected.filter(x => _.contains(skips, x));
|
||||
};
|
||||
|
||||
export const getSelectedRows = (data, keyField, selected) =>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user