From 4a340c714bb6006a30c447eeba4fd44ceca1e379 Mon Sep 17 00:00:00 2001 From: AllenFang Date: Sat, 23 Nov 2019 14:35:45 +0800 Subject: [PATCH 1/2] fix #1168 --- .../src/props-resolver/column-resolver.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/react-bootstrap-table2/src/props-resolver/column-resolver.js b/packages/react-bootstrap-table2/src/props-resolver/column-resolver.js index 11fb652..b747c73 100644 --- a/packages/react-bootstrap-table2/src/props-resolver/column-resolver.js +++ b/packages/react-bootstrap-table2/src/props-resolver/column-resolver.js @@ -1,7 +1,13 @@ export default ExtendBase => class ColumnResolver extends ExtendBase { visibleColumnSize(includeSelectColumn = true) { - let columnLen = this.props.columns.filter(c => !c.hidden).length; + let columnLen; + if (this.props.columnToggle && this.props.columnToggle.toggles) { + const columns = this.props.columnToggle.toggles; + columnLen = Object.keys(columns).filter(name => columns[name]).length; + } else { + columnLen = this.props.columns.filter(c => !c.hidden).length; + } if (!includeSelectColumn) return columnLen; if (this.props.selectRow && !this.props.selectRow.hideSelectColumn) { columnLen += 1; From 8ecdbf611bf7e715d95511a731032d5028759799 Mon Sep 17 00:00:00 2001 From: AllenFang Date: Sat, 23 Nov 2019 15:56:14 +0800 Subject: [PATCH 2/2] fix #1169 --- .../examples/column-filter/filter-position.js | 21 +++++++ .../src/bootstrap-table.js | 2 + .../react-bootstrap-table2/src/filters.js | 51 +++++++++------ packages/react-bootstrap-table2/src/footer.js | 62 +++++++------------ .../src/row/row-template.js | 48 ++++++++++++++ .../test/footer.test.js | 6 +- 6 files changed, 129 insertions(+), 61 deletions(-) create mode 100644 packages/react-bootstrap-table2/src/row/row-template.js diff --git a/packages/react-bootstrap-table2-example/examples/column-filter/filter-position.js b/packages/react-bootstrap-table2-example/examples/column-filter/filter-position.js index 431db8d..661ef3d 100644 --- a/packages/react-bootstrap-table2-example/examples/column-filter/filter-position.js +++ b/packages/react-bootstrap-table2-example/examples/column-filter/filter-position.js @@ -71,6 +71,23 @@ const columns = [{ /> `; +const selectRow = { + mode: 'checkbox', + clickToSelect: true +}; + +const expandRow = { + renderer: row => ( +
+

{ `This Expand row is belong to rowKey ${row.id}` }

+

You can render anything here, also you can add additional data on every row object

+

expandRow.renderer callback will pass the origin row object to you

+
+ ), + showExpandColumn: true, + expandColumnPosition: 'right' +}; + export default () => (
( columns={ columns } filter={ filterFactory() } filterPosition="top" + expandRow={ expandRow } + selectRow={ selectRow } /> { sourceCode1 } ( columns={ columns } filter={ filterFactory() } filterPosition="bottom" + expandRow={ expandRow } + selectRow={ selectRow } /> { sourceCode2 }
diff --git a/packages/react-bootstrap-table2/src/bootstrap-table.js b/packages/react-bootstrap-table2/src/bootstrap-table.js index d93252e..a69e396 100644 --- a/packages/react-bootstrap-table2/src/bootstrap-table.js +++ b/packages/react-bootstrap-table2/src/bootstrap-table.js @@ -111,6 +111,8 @@ class BootstrapTable extends PropsBaseResolver(Component) { currFilters={ this.props.currFilters } filterPosition={ this.props.filterPosition } onExternalFilter={ this.props.onExternalFilter } + selectRow={ selectRow } + expandRow={ expandRow } /> )} { const { @@ -12,28 +13,33 @@ const Filters = (props) => { currFilters, filterPosition, onExternalFilter, - className + className, + selectRow, + expandRow } = props; - const filterColumns = []; - let showFiltersRow = false; + function renderContent() { + const filterColumns = []; + let showFiltersRow = false; - columns.forEach((column, i) => { - filterColumns.push(); + columns.forEach((column, i) => { + filterColumns.push(); - if (column.filterRenderer || column.filter) { - if (!showFiltersRow) { - showFiltersRow = true; + if (column.filterRenderer || column.filter) { + if (!showFiltersRow) { + showFiltersRow = true; + } } - } - }); + }); + return filterColumns; + } return ( { : 'table-footer-group' } } > - {filterColumns} + ); }; @@ -60,7 +71,9 @@ Filters.propTypes = { ]), currFilters: PropTypes.object, onExternalFilter: PropTypes.func, - className: PropTypes.string + className: PropTypes.string, + selectRow: PropTypes.object, + expandRow: PropTypes.object }; Filters.defaultProps = { diff --git a/packages/react-bootstrap-table2/src/footer.js b/packages/react-bootstrap-table2/src/footer.js index 5cb542d..84040df 100644 --- a/packages/react-bootstrap-table2/src/footer.js +++ b/packages/react-bootstrap-table2/src/footer.js @@ -2,57 +2,41 @@ import React from 'react'; import PropTypes from 'prop-types'; -import Const from './const'; +import RowTemplate from './row/row-template'; import FooterCell from './footer-cell'; import _ from './utils'; const Footer = (props) => { const { data, className, columns, selectRow, expandRow } = props; - const SelectionFooterCellComp = () => ; - const ExpansionFooterCellComp = () => ; - const isRenderFunctionColumnInLeft = ( - position = Const.INDICATOR_POSITION_LEFT - ) => position === Const.INDICATOR_POSITION_LEFT; + function renderContent() { + return columns.map((column, i) => { + if (column.footer === undefined || column.footer === null) { + return false; + } - const childrens = columns.map((column, i) => { - if (column.footer === undefined || column.footer === null) { - return false; - } + const columnData = _.pluck(data, column.dataField); - const columnData = _.pluck(data, column.dataField); - - return ( - - ); - }); - - if (selectRow && selectRow.hideSelectColumn !== true) { - if (isRenderFunctionColumnInLeft(selectRow.selectColumnPosition)) { - childrens.unshift(); - } else { - childrens.push(); - } - } - - if (expandRow.showExpandColumn) { - if (isRenderFunctionColumnInLeft(expandRow.expandColumnPosition)) { - childrens.unshift(); - } else { - childrens.push(); - } + return ( + + ); + }); } return ( - - { childrens } - + ); }; diff --git a/packages/react-bootstrap-table2/src/row/row-template.js b/packages/react-bootstrap-table2/src/row/row-template.js new file mode 100644 index 0000000..7aa4683 --- /dev/null +++ b/packages/react-bootstrap-table2/src/row/row-template.js @@ -0,0 +1,48 @@ +/* eslint react/require-default-props: 0 */ +import React from 'react'; +import PropTypes from 'prop-types'; + +import Const from '../const'; + +const RowTemplate = (props) => { + const { + renderContent, + selectRow, + expandRow, + cellEl, + ...rest + } = props; + + const isRenderFunctionColumnInLeft = ( + position = Const.INDICATOR_POSITION_LEFT + ) => position === Const.INDICATOR_POSITION_LEFT; + + const childrens = renderContent() || []; + + if (selectRow && selectRow.hideSelectColumn !== true) { + if (isRenderFunctionColumnInLeft(selectRow.selectColumnPosition)) { + childrens.unshift(React.createElement(cellEl, { key: 'selection' })); + } else { + childrens.push(React.createElement(cellEl, { key: 'selection' })); + } + } + + if (expandRow.showExpandColumn) { + if (isRenderFunctionColumnInLeft(expandRow.expandColumnPosition)) { + childrens.unshift(React.createElement(cellEl, { key: 'expansion' })); + } else { + childrens.push(React.createElement(cellEl, { key: 'expansion' })); + } + } + + return { childrens }; +}; + +RowTemplate.propTypes = { + renderContent: PropTypes.func.isRequired, + cellEl: PropTypes.string.isRequired, + selectRow: PropTypes.object, + expandRow: PropTypes.object +}; + +export default RowTemplate; diff --git a/packages/react-bootstrap-table2/test/footer.test.js b/packages/react-bootstrap-table2/test/footer.test.js index 3812a49..8d651d6 100644 --- a/packages/react-bootstrap-table2/test/footer.test.js +++ b/packages/react-bootstrap-table2/test/footer.test.js @@ -48,7 +48,7 @@ describe('Footer', () => { describe('simplest footer', () => { beforeEach(() => { - wrapper = shallow( + wrapper = render(