diff --git a/packages/react-bootstrap-table2/package.json b/packages/react-bootstrap-table2/package.json index 61e0c18..f6c22a5 100644 --- a/packages/react-bootstrap-table2/package.json +++ b/packages/react-bootstrap-table2/package.json @@ -37,6 +37,7 @@ ], "dependencies": { "classnames": "2.2.5", + "react-transition-group": "2.5.3", "underscore": "1.9.1" }, "peerDependencies": { diff --git a/packages/react-bootstrap-table2/src/contexts/row-expand-context.js b/packages/react-bootstrap-table2/src/contexts/row-expand-context.js index 9c038ab..601c338 100644 --- a/packages/react-bootstrap-table2/src/contexts/row-expand-context.js +++ b/packages/react-bootstrap-table2/src/contexts/row-expand-context.js @@ -10,18 +10,31 @@ class RowExpandProvider extends React.Component { children: PropTypes.node.isRequired, data: PropTypes.array.isRequired, keyField: PropTypes.string.isRequired - } + }; - state = { expanded: this.props.expandRow.expanded || [] }; + state = { expanded: this.props.expandRow.expanded || [], + isClosing: this.props.expandRow.isClosing || [] }; componentWillReceiveProps(nextProps) { if (nextProps.expandRow) { + const isClosing = this.state.expanded.reduce((acc, cur) => { + if (!nextProps.expandRow.expanded.includes(cur)) { + acc.push(cur); + } + return acc; + }, []); + this.setState(() => ({ expanded: nextProps.expandRow.expanded, isClosing })); + } else { this.setState(() => ({ - expanded: nextProps.expandRow.expanded || this.state.expanded + expanded: this.state.expanded })); } } + onClosed = (closedRow) => { + this.setState({ isClosing: this.state.isClosing.filter(value => value !== closedRow) }); + }; + handleRowExpand = (rowKey, expanded, rowIndex, e) => { const { data, keyField, expandRow: { onExpand, onlyOneExpanding, nonExpandable } } = this.props; if (nonExpandable && nonExpandable.includes(rowKey)) { @@ -29,11 +42,15 @@ class RowExpandProvider extends React.Component { } let currExpanded = [...this.state.expanded]; + let isClosing = [...this.state.isClosing]; if (expanded) { - if (onlyOneExpanding) currExpanded = [rowKey]; - else currExpanded.push(rowKey); + if (onlyOneExpanding) { + isClosing = isClosing.concat(currExpanded); + currExpanded = [rowKey]; + } else currExpanded.push(rowKey); } else { + isClosing.push(rowKey); currExpanded = currExpanded.filter(value => value !== rowKey); } @@ -41,8 +58,8 @@ class RowExpandProvider extends React.Component { const row = dataOperator.getRowByRowId(data, keyField, rowKey); onExpand(row, expanded, rowIndex, e); } - this.setState(() => ({ expanded: currExpanded })); - } + this.setState(() => ({ expanded: currExpanded, isClosing })); + }; handleAllRowExpand = (e, expandAll) => { const { @@ -68,7 +85,7 @@ class RowExpandProvider extends React.Component { } this.setState(() => ({ expanded: currExpanded })); - } + }; render() { const { data, keyField } = this.props; @@ -78,6 +95,8 @@ class RowExpandProvider extends React.Component { ...this.props.expandRow, nonExpandable: this.props.expandRow.nonExpandable, expanded: this.state.expanded, + isClosing: this.state.isClosing, + onClosed: this.onClosed, isAnyExpands: dataOperator.isAnyExpands(data, keyField, this.state.expanded), onRowExpand: this.handleRowExpand, onAllRowExpand: this.handleAllRowExpand diff --git a/packages/react-bootstrap-table2/src/row-expand/expand-row.js b/packages/react-bootstrap-table2/src/row-expand/expand-row.js index 0a89628..3699ada 100644 --- a/packages/react-bootstrap-table2/src/row-expand/expand-row.js +++ b/packages/react-bootstrap-table2/src/row-expand/expand-row.js @@ -1,18 +1,37 @@ import React from 'react'; import PropTypes from 'prop-types'; +import { CSSTransition } from 'react-transition-group'; -const ExpandRow = ({ children, ...rest }) => ( -