UNPKG

choerodon-ui

Version:

An enterprise-class UI design language and React-based implementation

230 lines (197 loc) 8.84 kB
import _objectSpread from "@babel/runtime/helpers/objectSpread2"; import _defineProperty from "@babel/runtime/helpers/defineProperty"; import _extends from "@babel/runtime/helpers/extends"; import React, { useCallback, useContext } from 'react'; import { observer } from 'mobx-react-lite'; import classNames from 'classnames'; import omit from 'lodash/omit'; import Tree from '../../../es/tree'; import { getConfig } from '../../../es/configure'; import { pxToRem } from '../../../es/_util/UnitConvertor'; import { defaultAggregationRenderer } from './Column'; import TableContext from './TableContext'; import { getColumnKey, getColumnLock, getHeader, isStickySupport } from './utils'; import { ColumnLock } from './enum'; import TableCellInner from './TableCellInner'; import AggregationButton from './AggregationButton'; var TableCell = observer(function TableCell(props) { var columnGroup = props.columnGroup, record = props.record, isDragging = props.isDragging, provided = props.provided, colSpan = props.colSpan, className = props.className, children = props.children, disabled = props.disabled, inView = props.inView; var column = columnGroup.column, key = columnGroup.key; var _useContext = useContext(TableContext), tableStore = _useContext.tableStore, prefixCls = _useContext.prefixCls, dataSet = _useContext.dataSet, expandIconAsCell = _useContext.expandIconAsCell, tableAggregation = _useContext.aggregation, rowHeight = _useContext.rowHeight; var cellPrefix = "".concat(prefixCls, "-cell"); var tableColumnOnCell = getConfig('tableColumnOnCell'); var getInnerNode = useCallback(function (col, onCellStyle, inAggregation) { return React.createElement(TableCellInner, { column: col, record: record, style: onCellStyle, disabled: disabled, inAggregation: inAggregation, prefixCls: cellPrefix, colSpan: colSpan }, children); }, [record, disabled, children, cellPrefix, colSpan]); var getColumnsInnerNode = useCallback(function (columns) { return columns.map(function (col) { var hidden = col.hidden, hiddenInAggregation = col.hiddenInAggregation; if (!hidden && !(typeof hiddenInAggregation === 'function' ? hiddenInAggregation(record) : hiddenInAggregation)) { var _onCell = col.onCell; var _isBuiltInColumn = tableStore.isBuiltInColumn(col); var _columnOnCell = !_isBuiltInColumn && (_onCell || tableColumnOnCell); var _cellExternalProps = typeof _columnOnCell === 'function' ? _columnOnCell({ dataSet: dataSet, record: record, column: col }) : {}; var columnKey = getColumnKey(col); var header = getHeader(col, dataSet, tableAggregation); // 只有全局属性时候的样式可以继承给下级满足对td的样式能够一致表现 var _onCellStyle = !_isBuiltInColumn && tableColumnOnCell === _columnOnCell && typeof tableColumnOnCell === 'function' ? omit(_cellExternalProps.style, ['width', 'height']) : undefined; var childColumns = col.children; if (childColumns && childColumns.length) { return React.createElement(Tree.TreeNode, _extends({}, _cellExternalProps, { key: columnKey, title: header }), getColumnsInnerNode(childColumns)); } var innerNode = getInnerNode(col, _onCellStyle, true); return React.createElement(Tree.TreeNode, _extends({}, _cellExternalProps, { key: columnKey, title: React.createElement(React.Fragment, null, React.createElement("span", { className: "".concat(cellPrefix, "-label") }, header), innerNode) })); } return undefined; }); }, [tableStore, record, dataSet, cellPrefix, getInnerNode, tableColumnOnCell, tableAggregation]); var renderInnerNode = function renderInnerNode(aggregation, onCellStyle) { if (expandIconAsCell && children) { return React.createElement("span", { className: classNames("".concat(cellPrefix, "-inner"), _defineProperty({}, "".concat(cellPrefix, "-inner-row-height-fixed"), rowHeight !== 'auto')), style: _objectSpread({ textAlign: 'center' }, onCellStyle) }, children); } if (aggregation) { var childColumns = columnGroup.column.children; if (childColumns) { var visibleChildren = childColumns.filter(function (child) { return !child.hidden; }); var length = visibleChildren.length; if (length > 0) { var _column$renderer = column.renderer, renderer = _column$renderer === void 0 ? defaultAggregationRenderer : _column$renderer, aggregationLimit = column.aggregationLimit, aggregationDefaultExpandedKeys = column.aggregationDefaultExpandedKeys, aggregationDefaultExpandAll = column.aggregationDefaultExpandAll; var expanded = tableStore.isAggregationCellExpanded(record, key); var hasExpand = length > aggregationLimit; var nodes = hasExpand && !expanded ? visibleChildren.slice(0, aggregationLimit - 1) : visibleChildren; var text = React.createElement(Tree, { prefixCls: "".concat(cellPrefix, "-tree"), virtual: false, focusable: false, defaultExpandedKeys: aggregationDefaultExpandedKeys, defaultExpandAll: aggregationDefaultExpandAll }, getColumnsInnerNode(nodes), hasExpand && React.createElement(Tree.TreeNode, { title: React.createElement(AggregationButton, { expanded: expanded, record: record, columnGroup: columnGroup }) })); return React.createElement("div", { className: "".concat(cellPrefix, "-inner") }, renderer({ text: text, record: record, dataSet: dataSet, aggregation: tableAggregation })); } } } return getInnerNode(column, onCellStyle); }; var style = column.style, lock = column.lock; var columnLock = isStickySupport() && getColumnLock(lock); var baseStyle = function () { if (columnLock) { if (columnLock === ColumnLock.left) { return _objectSpread({}, style, { left: pxToRem(columnGroup.left) }); } if (columnLock === ColumnLock.right) { return _objectSpread({}, style, { right: pxToRem(colSpan && colSpan > 1 ? 0 : columnGroup.right) }); } } return style; }(); var baseClassName = classNames(cellPrefix, _defineProperty({}, "".concat(cellPrefix, "-fix-").concat(columnLock), columnLock)); if (inView === false || columnGroup.inView === false) { return React.createElement("td", { colSpan: colSpan, "data-index": key, className: baseClassName, style: baseStyle }); } var onCell = column.onCell, aggregation = column.aggregation; var isBuiltInColumn = tableStore.isBuiltInColumn(column); var columnOnCell = !isBuiltInColumn && (onCell || tableColumnOnCell); var cellExternalProps = typeof columnOnCell === 'function' ? columnOnCell({ dataSet: record.dataSet, record: record, column: column }) : {}; var cellStyle = _objectSpread({}, baseStyle, {}, cellExternalProps.style, {}, provided && { cursor: 'move' }); var classString = classNames(baseClassName, _defineProperty({}, "".concat(cellPrefix, "-aggregation"), aggregation), column.className, className, cellExternalProps.className); var widthDraggingStyle = function widthDraggingStyle() { var draggingStyle = {}; if (isDragging) { var dom = tableStore.node.element.querySelector(".".concat(prefixCls, "-tbody .").concat(prefixCls, "-cell[data-index=\"").concat(key, "\"]")); if (dom) { draggingStyle.width = dom.clientWidth; draggingStyle.whiteSpace = 'nowrap'; } } return draggingStyle; }; // 只有全局属性时候的样式可以继承给下级满足对td的样式能够一致表现 var onCellStyle = !isBuiltInColumn && tableColumnOnCell === columnOnCell && typeof tableColumnOnCell === 'function' ? omit(cellExternalProps.style, ['width', 'height']) : undefined; return React.createElement("td", _extends({ colSpan: colSpan }, cellExternalProps, { className: classString, "data-index": key }, provided && provided.dragHandleProps, { style: _objectSpread({}, omit(cellStyle, ['width', 'height']), {}, widthDraggingStyle()) }), renderInnerNode(aggregation, onCellStyle)); }); TableCell.displayName = 'TableCell'; export default TableCell; //# sourceMappingURL=TableCell.js.map