2019-01-12 03:33:27 +00:00
|
|
|
|
import PropTypes from '../../_util/vue-types';
|
|
|
|
|
import classNames from 'classnames';
|
|
|
|
|
import ColGroup from './ColGroup';
|
|
|
|
|
import TableHeader from './TableHeader';
|
|
|
|
|
import TableRow from './TableRow';
|
|
|
|
|
import ExpandableRow from './ExpandableRow';
|
2020-01-18 08:14:42 +00:00
|
|
|
|
import { mergeProps, getListeners } from '../../_util/props-util';
|
2019-01-12 03:33:27 +00:00
|
|
|
|
import { connect } from '../../_util/store';
|
|
|
|
|
function noop() {}
|
2018-03-24 14:02:24 +00:00
|
|
|
|
const BaseTable = {
|
|
|
|
|
name: 'BaseTable',
|
|
|
|
|
props: {
|
2019-01-12 03:33:27 +00:00
|
|
|
|
fixed: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),
|
2018-03-24 14:02:24 +00:00
|
|
|
|
columns: PropTypes.array.isRequired,
|
|
|
|
|
tableClassName: PropTypes.string.isRequired,
|
|
|
|
|
hasHead: PropTypes.bool.isRequired,
|
|
|
|
|
hasBody: PropTypes.bool.isRequired,
|
|
|
|
|
store: PropTypes.object.isRequired,
|
|
|
|
|
expander: PropTypes.object.isRequired,
|
|
|
|
|
getRowKey: PropTypes.func,
|
|
|
|
|
isAnyColumnsFixed: PropTypes.bool,
|
|
|
|
|
},
|
|
|
|
|
inject: {
|
2019-01-28 13:09:13 +00:00
|
|
|
|
table: { default: () => ({}) },
|
2018-03-24 14:02:24 +00:00
|
|
|
|
},
|
|
|
|
|
methods: {
|
2019-01-12 03:33:27 +00:00
|
|
|
|
getColumns(cols) {
|
|
|
|
|
const { columns = [], fixed } = this.$props;
|
|
|
|
|
const { table } = this;
|
|
|
|
|
const { prefixCls } = table.$props;
|
2018-09-05 13:28:54 +00:00
|
|
|
|
return (cols || columns).map(column => ({
|
|
|
|
|
...column,
|
|
|
|
|
className:
|
|
|
|
|
!!column.fixed && !fixed
|
|
|
|
|
? classNames(`${prefixCls}-fixed-columns-in-body`, column.className || column.class)
|
|
|
|
|
: column.className || column.class,
|
2019-01-12 03:33:27 +00:00
|
|
|
|
}));
|
2018-09-05 13:28:54 +00:00
|
|
|
|
},
|
2019-01-12 03:33:27 +00:00
|
|
|
|
handleRowHover(isHover, key) {
|
2018-03-26 15:05:29 +00:00
|
|
|
|
this.store.setState({
|
2018-03-24 14:02:24 +00:00
|
|
|
|
currentHoverKey: isHover ? key : null,
|
2019-01-12 03:33:27 +00:00
|
|
|
|
});
|
2018-03-24 14:02:24 +00:00
|
|
|
|
},
|
|
|
|
|
|
2019-01-12 03:33:27 +00:00
|
|
|
|
renderRows(renderData, indent, ancestorKeys = []) {
|
2018-03-24 14:02:24 +00:00
|
|
|
|
const {
|
2019-01-12 03:33:27 +00:00
|
|
|
|
columnManager,
|
|
|
|
|
sComponents: components,
|
2018-03-24 14:02:24 +00:00
|
|
|
|
prefixCls,
|
|
|
|
|
childrenColumnName,
|
|
|
|
|
rowClassName,
|
2018-03-31 09:46:35 +00:00
|
|
|
|
customRow = noop,
|
2019-01-12 03:33:27 +00:00
|
|
|
|
} = this.table;
|
2020-01-18 08:14:42 +00:00
|
|
|
|
const {
|
|
|
|
|
rowClick: onRowClick = noop,
|
|
|
|
|
rowDoubleclick: onRowDoubleClick = noop,
|
|
|
|
|
rowContextmenu: onRowContextMenu = noop,
|
|
|
|
|
rowMouseenter: onRowMouseEnter = noop,
|
|
|
|
|
rowMouseleave: onRowMouseLeave = noop,
|
|
|
|
|
} = getListeners(this.table);
|
2019-01-12 03:33:27 +00:00
|
|
|
|
const { getRowKey, fixed, expander, isAnyColumnsFixed } = this;
|
2018-03-24 14:02:24 +00:00
|
|
|
|
|
2019-01-12 03:33:27 +00:00
|
|
|
|
const rows = [];
|
2018-09-29 07:08:24 +00:00
|
|
|
|
|
2020-03-07 11:45:13 +00:00
|
|
|
|
for (let i = 0; i < renderData.length; i += 1) {
|
2019-01-12 03:33:27 +00:00
|
|
|
|
const record = renderData[i];
|
|
|
|
|
const key = getRowKey(record, i);
|
|
|
|
|
const className =
|
|
|
|
|
typeof rowClassName === 'string' ? rowClassName : rowClassName(record, i, indent);
|
2018-03-24 14:02:24 +00:00
|
|
|
|
|
2019-01-12 03:33:27 +00:00
|
|
|
|
const onHoverProps = {};
|
2018-03-24 14:02:24 +00:00
|
|
|
|
if (columnManager.isAnyColumnsFixed()) {
|
2019-01-12 03:33:27 +00:00
|
|
|
|
onHoverProps.hover = this.handleRowHover;
|
2018-03-24 14:02:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2019-01-12 03:33:27 +00:00
|
|
|
|
let leafColumns;
|
2018-03-24 14:02:24 +00:00
|
|
|
|
if (fixed === 'left') {
|
2019-01-12 03:33:27 +00:00
|
|
|
|
leafColumns = columnManager.leftLeafColumns();
|
2018-03-24 14:02:24 +00:00
|
|
|
|
} else if (fixed === 'right') {
|
2019-01-12 03:33:27 +00:00
|
|
|
|
leafColumns = columnManager.rightLeafColumns();
|
2018-03-24 14:02:24 +00:00
|
|
|
|
} else {
|
2019-01-12 03:33:27 +00:00
|
|
|
|
leafColumns = this.getColumns(columnManager.leafColumns());
|
2018-03-24 14:02:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2019-01-12 03:33:27 +00:00
|
|
|
|
const rowPrefixCls = `${prefixCls}-row`;
|
2018-09-05 13:28:54 +00:00
|
|
|
|
|
2018-03-24 14:02:24 +00:00
|
|
|
|
const expandableRowProps = {
|
|
|
|
|
props: {
|
|
|
|
|
...expander.props,
|
|
|
|
|
fixed,
|
2018-09-29 07:08:24 +00:00
|
|
|
|
index: i,
|
2018-03-24 14:02:24 +00:00
|
|
|
|
prefixCls: rowPrefixCls,
|
|
|
|
|
record,
|
|
|
|
|
rowKey: key,
|
|
|
|
|
needIndentSpaced: expander.needIndentSpaced,
|
|
|
|
|
},
|
|
|
|
|
key,
|
|
|
|
|
on: {
|
2018-03-25 10:07:04 +00:00
|
|
|
|
// ...expander.on,
|
2018-03-24 14:02:24 +00:00
|
|
|
|
rowClick: onRowClick,
|
|
|
|
|
expandedChange: expander.handleExpandChange,
|
|
|
|
|
},
|
|
|
|
|
scopedSlots: {
|
2019-01-12 03:33:27 +00:00
|
|
|
|
default: expandableRow => {
|
|
|
|
|
const tableRowProps = mergeProps(
|
|
|
|
|
{
|
|
|
|
|
props: {
|
|
|
|
|
fixed,
|
|
|
|
|
indent,
|
|
|
|
|
record,
|
|
|
|
|
index: i,
|
|
|
|
|
prefixCls: rowPrefixCls,
|
2020-03-18 06:52:02 +00:00
|
|
|
|
childrenColumnName,
|
2019-01-12 03:33:27 +00:00
|
|
|
|
columns: leafColumns,
|
|
|
|
|
rowKey: key,
|
|
|
|
|
ancestorKeys,
|
|
|
|
|
components,
|
|
|
|
|
isAnyColumnsFixed,
|
|
|
|
|
customRow,
|
|
|
|
|
},
|
|
|
|
|
on: {
|
|
|
|
|
rowDoubleclick: onRowDoubleClick,
|
|
|
|
|
rowContextmenu: onRowContextMenu,
|
|
|
|
|
rowMouseenter: onRowMouseEnter,
|
|
|
|
|
rowMouseleave: onRowMouseLeave,
|
|
|
|
|
...onHoverProps,
|
|
|
|
|
},
|
|
|
|
|
class: className,
|
|
|
|
|
ref: `row_${i}_${indent}`,
|
2018-03-24 14:02:24 +00:00
|
|
|
|
},
|
2019-01-12 03:33:27 +00:00
|
|
|
|
expandableRow,
|
|
|
|
|
);
|
|
|
|
|
return <TableRow {...tableRowProps} />;
|
2018-03-24 14:02:24 +00:00
|
|
|
|
},
|
|
|
|
|
},
|
2019-01-12 03:33:27 +00:00
|
|
|
|
};
|
|
|
|
|
const row = <ExpandableRow {...expandableRowProps} />;
|
2018-03-24 14:02:24 +00:00
|
|
|
|
|
2019-01-12 03:33:27 +00:00
|
|
|
|
rows.push(row);
|
|
|
|
|
expander.renderRows(this.renderRows, rows, record, i, indent, fixed, key, ancestorKeys);
|
2018-03-24 14:02:24 +00:00
|
|
|
|
}
|
2019-01-12 03:33:27 +00:00
|
|
|
|
return rows;
|
2018-03-24 14:02:24 +00:00
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
2019-01-12 03:33:27 +00:00
|
|
|
|
render() {
|
|
|
|
|
const { sComponents: components, prefixCls, scroll, data, getBodyWrapper } = this.table;
|
2020-03-16 13:12:11 +00:00
|
|
|
|
const { expander, tableClassName, hasHead, hasBody, fixed, isAnyColumnsFixed } = this.$props;
|
2018-09-05 13:28:54 +00:00
|
|
|
|
|
2019-01-12 03:33:27 +00:00
|
|
|
|
const tableStyle = {};
|
2018-03-24 14:02:24 +00:00
|
|
|
|
|
|
|
|
|
if (!fixed && scroll.x) {
|
2020-03-16 13:12:11 +00:00
|
|
|
|
// 当有固定列时,width auto 会导致 body table 的宽度撑不开,从而固定列无法对齐
|
|
|
|
|
// 详情见:https://github.com/ant-design/ant-design/issues/22160
|
|
|
|
|
const tableWidthScrollX = isAnyColumnsFixed ? 'max-content' : 'auto';
|
|
|
|
|
// not set width, then use content fixed width
|
|
|
|
|
tableStyle.width = scroll.x === true ? tableWidthScrollX : scroll.x;
|
2020-03-07 11:45:13 +00:00
|
|
|
|
tableStyle.width =
|
|
|
|
|
typeof tableStyle.width === 'number' ? `${tableStyle.width}px` : tableStyle.width;
|
2018-03-24 14:02:24 +00:00
|
|
|
|
}
|
|
|
|
|
|
2019-01-12 03:33:27 +00:00
|
|
|
|
const Table = hasBody ? components.table : 'table';
|
|
|
|
|
const BodyWrapper = components.body.wrapper;
|
2018-03-24 14:02:24 +00:00
|
|
|
|
|
2019-01-12 03:33:27 +00:00
|
|
|
|
let body;
|
2018-03-24 14:02:24 +00:00
|
|
|
|
if (hasBody) {
|
2019-01-12 03:33:27 +00:00
|
|
|
|
body = <BodyWrapper class={`${prefixCls}-tbody`}>{this.renderRows(data, 0)}</BodyWrapper>;
|
2018-03-24 14:02:24 +00:00
|
|
|
|
if (getBodyWrapper) {
|
2019-01-12 03:33:27 +00:00
|
|
|
|
body = getBodyWrapper(body);
|
2018-03-24 14:02:24 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2019-01-12 03:33:27 +00:00
|
|
|
|
const columns = this.getColumns();
|
2018-03-24 14:02:24 +00:00
|
|
|
|
return (
|
2019-01-12 03:33:27 +00:00
|
|
|
|
<Table class={tableClassName} style={tableStyle} key="table">
|
2018-03-24 14:02:24 +00:00
|
|
|
|
<ColGroup columns={columns} fixed={fixed} />
|
2019-01-12 03:33:27 +00:00
|
|
|
|
{hasHead && <TableHeader expander={expander} columns={columns} fixed={fixed} />}
|
2018-03-24 14:02:24 +00:00
|
|
|
|
{body}
|
|
|
|
|
</Table>
|
2019-01-12 03:33:27 +00:00
|
|
|
|
);
|
2018-03-24 14:02:24 +00:00
|
|
|
|
},
|
2019-01-12 03:33:27 +00:00
|
|
|
|
};
|
2018-03-24 14:02:24 +00:00
|
|
|
|
|
2019-01-12 03:33:27 +00:00
|
|
|
|
export default connect()(BaseTable);
|