import React, { Children } from 'react';
import PropTypes from 'prop-types';
import classnames from 'classnames';
import Icon from '../icon';
import { KEYCODE } from '../util';
import RowComponent from './expanded/row';
import Col from './column';
import { statics } from './util';
const noop = () => {};
export default function expanded(BaseComponent) {
/** Table */
class ExpandedTable extends React.Component {
static ExpandedRow = RowComponent;
static propTypes = {
/**
* 额外渲染行的渲染函数
* @param {Object} record 该行所对应的数据
* @param {Number} index 该行所对应的序列
* @returns {Element}
*/
expandedRowRender: PropTypes.func,
/**
* 额外渲染行的缩进
*/
expandedRowIndent: PropTypes.array,
/**
* 默认情况下展开的渲染行或者Tree, 传入此属性为受控状态
*/
openRowKeys: PropTypes.array,
/**
* 是否显示点击展开额外渲染行的+号按钮
*/
hasExpandedRowCtrl: PropTypes.bool,
/**
* 设置额外渲染行的属性
*/
getExpandedColProps: PropTypes.func,
/**
* 在额外渲染行或者Tree展开或者收起的时候触发的事件
* @param {Array} openRowKeys 展开的渲染行的key
* @param {String} currentRowKey 当前点击的渲染行的key
* @param {Boolean} expanded 当前点击是展开还是收起
* @param {Object} currentRecord 当前点击额外渲染行的记录
*/
onRowOpen: PropTypes.func,
onExpandedRowClick: PropTypes.func,
locale: PropTypes.object,
...BaseComponent.propTypes,
};
static defaultProps = {
...BaseComponent.defaultProps,
getExpandedColProps: noop,
onRowOpen: noop,
hasExpandedRowCtrl: true,
components: {},
expandedRowIndent: [1, 0],
prefix: 'next-',
};
static childContextTypes = {
openRowKeys: PropTypes.array,
expandedRowRender: PropTypes.func,
expandedIndexSimulate: PropTypes.bool,
expandedRowIndent: PropTypes.array,
};
state = {
openRowKeys: this.props.openRowKeys || [],
};
getChildContext() {
return {
openRowKeys: this.state.openRowKeys,
expandedRowRender: this.props.expandedRowRender,
expandedIndexSimulate: this.props.expandedIndexSimulate,
expandedRowIndent: this.props.expandedRowIndent,
};
}
componentWillReceiveProps(nextProps) {
if ('openRowKeys' in nextProps) {
const { openRowKeys } = nextProps;
this.setState({
openRowKeys,
});
}
}
expandedKeydown = (value, record, index, e) => {
e.preventDefault();
e.stopPropagation();
if (e.keyCode === KEYCODE.ENTER) {
this.onExpandedClick(value, record, index, e);
}
};
renderExpandedCell = (value, index, record) => {
const { getExpandedColProps, prefix, locale } = this.props;
const { openRowKeys } = this.state,
{ primaryKey } = this.props,
hasExpanded = openRowKeys.indexOf(record[primaryKey]) > -1,
switchNode = hasExpanded ? (