UNPKG

choerodon-ui

Version:

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

377 lines (298 loc) 14.3 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _react = _interopRequireWildcard(require("react")); var _mobxReactLite = require("mobx-react-lite"); var _classnames = _interopRequireDefault(require("classnames")); var _omit = _interopRequireDefault(require("lodash/omit")); var _defaultTo = _interopRequireDefault(require("lodash/defaultTo")); var _dataset = require("choerodon-ui/dataset"); var _tree = _interopRequireDefault(require("../../../lib/tree")); var _UnitConvertor = require("../../../lib/_util/UnitConvertor"); var _Column = require("./Column"); var _TableContext = _interopRequireDefault(require("./TableContext")); var _utils = require("./utils"); var _enum = require("./enum"); var _TableCellInner = _interopRequireDefault(require("./TableCellInner")); var _AggregationButton = _interopRequireDefault(require("./AggregationButton")); var _treeUtils = require("../_util/treeUtils"); var _TableGroupCellInner = _interopRequireDefault(require("./TableGroupCellInner")); function getRowSpan(group, tableStore) { if (tableStore.headerTableGroups.length) { var subGroups = group.subGroups, subHGroups = group.subHGroups; if (subHGroups) { return _dataset.IteratorHelper.iteratorReduce(subHGroups.values(), function (rowSpan, group) { return Math.max(rowSpan, group.records.length); }, 0); } return subGroups.reduce(function (rowSpan, subGroup) { return rowSpan + (subGroup.subGroups.length ? getRowSpan(subGroup, tableStore) : 0) + subGroup.records.length; }, 0); } return group.expandedRecords.length; } var TableCell = function TableCell(props) { var _classNames3; 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, groupPath = props.groupPath, rowIndex = props.rowIndex; var column = columnGroup.column, key = columnGroup.key; var _useContext = (0, _react.useContext)(_TableContext["default"]), 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 = tableStore.getConfig('tableColumnOnCell'); var __tableGroup = column.__tableGroup; var _ref = __tableGroup && groupPath && groupPath.find(function (_ref3) { var _ref4 = (0, _slicedToArray2["default"])(_ref3, 1), path = _ref4[0]; return path.name === __tableGroup.name; }) || [undefined, false], _ref2 = (0, _slicedToArray2["default"])(_ref, 2), group = _ref2[0], isLast = _ref2[1]; var _ref5 = group || !groupPath || !groupPath.length ? [undefined, false] : groupPath[groupPath.length - 1], _ref6 = (0, _slicedToArray2["default"])(_ref5, 1), rowGroup = _ref6[0]; var getInnerNode = (0, _react.useCallback)(function (col, onCellStyle, inAggregation, headerGroup) { return record ? _react["default"].createElement(_TableCellInner["default"], { column: col, record: record, style: onCellStyle, disabled: disabled, inAggregation: inAggregation, prefixCls: cellPrefix, colSpan: colSpan, headerGroup: headerGroup, rowGroup: rowGroup }, children) : undefined; }, [record, disabled, children, cellPrefix, colSpan, rowGroup]); var getColumnsInnerNode = (0, _react.useCallback)(function (columns) { return record ? columns.map(function (colGroup) { var hidden = colGroup.hidden, col = colGroup.column; var hiddenInAggregation = col.hiddenInAggregation; if (!hidden && !(typeof hiddenInAggregation === 'function' ? hiddenInAggregation(record) : hiddenInAggregation)) { var columnKey = colGroup.key, headerGroup = colGroup.headerGroup; var _isBuiltInColumn = tableStore.isBuiltInColumn(col); var _columnOnCell = !_isBuiltInColumn && (col.onCell || tableColumnOnCell); var _cellExternalProps = typeof _columnOnCell === 'function' ? _columnOnCell({ dataSet: dataSet, record: record, column: col }) : {}; var header = (0, _utils.getHeader)((0, _objectSpread2["default"])({}, col, { dataSet: dataSet, aggregation: tableAggregation, group: headerGroup })); // 只有全局属性时候的样式可以继承给下级满足对td的样式能够一致表现 var _onCellStyle = !_isBuiltInColumn && tableColumnOnCell === _columnOnCell && typeof tableColumnOnCell === 'function' ? (0, _omit["default"])(_cellExternalProps.style, ['width', 'height']) : undefined; var childColumns = colGroup.children; if (childColumns) { var colGroups = childColumns.columns; if (colGroups.length) { return _react["default"].createElement(_tree["default"].TreeNode, (0, _extends2["default"])({}, _cellExternalProps, { key: columnKey, title: header }), getColumnsInnerNode(colGroups)); } } var innerNode = getInnerNode(col, _onCellStyle, true, headerGroup); return _react["default"].createElement(_tree["default"].TreeNode, (0, _extends2["default"])({}, _cellExternalProps, { key: columnKey, title: _react["default"].createElement(_react["default"].Fragment, null, _react["default"].createElement("span", { className: "".concat(cellPrefix, "-label") }, header), innerNode) })); } return undefined; }) : []; }, [tableStore, record, dataSet, cellPrefix, getInnerNode, tableColumnOnCell, tableAggregation]); var style = column.style, lock = column.lock, onCell = column.onCell, aggregation = column.aggregation; var columnLock = (0, _utils.isStickySupport)() && (0, _utils.getColumnLock)(lock); var baseStyle = function () { if (columnLock) { if (columnLock === _enum.ColumnLock.left) { return (0, _objectSpread2["default"])({}, style, { left: (0, _UnitConvertor.pxToRem)(columnGroup.left) }); } if (columnLock === _enum.ColumnLock.right) { return (0, _objectSpread2["default"])({}, style, { right: (0, _UnitConvertor.pxToRem)(colSpan && colSpan > 1 ? 0 : columnGroup.right) }); } } return style; }(); var baseClassName = (0, _classnames["default"])(cellPrefix, (0, _defineProperty2["default"])({}, "".concat(cellPrefix, "-fix-").concat(columnLock), columnLock)); if (!record) { return _react["default"].createElement("td", { className: baseClassName, style: baseStyle, "data-index": key, colSpan: colSpan }); } var indexInGroup = group ? group.expandedRecords.indexOf(record) : -1; var groupCell = indexInGroup === 0 || tableStore.virtual && indexInGroup > -1 && tableStore.virtualStartIndex === rowIndex; if (group && !groupCell) { return null; } var getAggregationList = function getAggregationList($aggregation) { if ($aggregation) { var childrenInAggregation = columnGroup.childrenInAggregation; if (childrenInAggregation) { var visibleChildren = childrenInAggregation.columns.filter(function (child) { return !child.hidden; }); var length = visibleChildren.length; if (length > 0) { var aggregationLimit = column.aggregationLimit, aggregationDefaultExpandedKeys = column.aggregationDefaultExpandedKeys, aggregationDefaultExpandAll = column.aggregationDefaultExpandAll, aggregationLimitDefaultExpanded = column.aggregationLimitDefaultExpanded; var expanded = (0, _defaultTo["default"])(tableStore.isAggregationCellExpanded(record, key), typeof aggregationLimitDefaultExpanded === 'function' ? aggregationLimitDefaultExpanded(record) : aggregationLimitDefaultExpanded) || false; var hasExpand = length > aggregationLimit; var nodes = hasExpand && !expanded ? visibleChildren.slice(0, aggregationLimit - 1) : visibleChildren; return _react["default"].createElement(_tree["default"], { prefixCls: "".concat(cellPrefix, "-tree"), virtual: false, focusable: false, defaultExpandedKeys: aggregationDefaultExpandedKeys, defaultExpandAll: aggregationDefaultExpandAll }, getColumnsInnerNode(nodes), hasExpand && _react["default"].createElement(_tree["default"].TreeNode, { title: _react["default"].createElement(_AggregationButton["default"], { expanded: expanded, record: record, columnGroup: columnGroup }) })); } } } }; var groupRowSpan = groupCell && group ? getRowSpan(group, tableStore) - indexInGroup : undefined; var rowSpan = groupRowSpan === 1 ? undefined : groupRowSpan; var renderInnerNode = function renderInnerNode($aggregation, onCellStyle) { if (expandIconAsCell && children) { return _react["default"].createElement("span", { className: (0, _classnames["default"])("".concat(cellPrefix, "-inner"), (0, _defineProperty2["default"])({}, "".concat(cellPrefix, "-inner-row-height-fixed"), rowHeight !== 'auto')), style: (0, _objectSpread2["default"])({ textAlign: 'center' }, onCellStyle) }, children); } var aggregationList = getAggregationList($aggregation); if (groupCell && group && __tableGroup) { return _react["default"].createElement(_TableGroupCellInner["default"], { rowSpan: rowSpan, group: group, column: column }, aggregationList); } if (aggregationList) { var _column$renderer = column.renderer, renderer = _column$renderer === void 0 ? _Column.defaultAggregationRenderer : _column$renderer; return _react["default"].createElement("span", { className: "".concat(cellPrefix, "-inner") }, renderer({ text: aggregationList, record: record, dataSet: dataSet, aggregation: tableAggregation, headerGroup: columnGroup.headerGroup, rowGroup: rowGroup })); } return getInnerNode(column, onCellStyle, undefined, columnGroup.headerGroup); }; var scope = groupCell ? 'row' : undefined; var TCell = scope ? 'th' : 'td'; if (inView === false || columnGroup.inView === false) { var hasEditor = aggregation ? (0, _treeUtils.treeSome)(column.children || [], function (node) { return !!(0, _utils.getEditorByColumnAndRecord)(node, record); }) : !!(0, _utils.getEditorByColumnAndRecord)(column, record); var emptyCellProps = { colSpan: colSpan, rowSpan: rowSpan, 'data-index': key, className: baseClassName, style: baseStyle, scope: scope }; if (hasEditor) { emptyCellProps.onFocus = function (e) { tableStore.activeEmptyCell = e.target; }; emptyCellProps.onBlur = function () { delete tableStore.activeEmptyCell; }; emptyCellProps.tabIndex = 0; } return _react["default"].createElement(TCell, (0, _extends2["default"])({}, emptyCellProps)); } var isBuiltInColumn = tableStore.isBuiltInColumn(column); var columnOnCell = !isBuiltInColumn && (onCell || tableColumnOnCell); var cellExternalProps = typeof columnOnCell === 'function' ? columnOnCell({ dataSet: dataSet, record: record, column: column }) : {}; var cellStyle = (0, _objectSpread2["default"])({}, baseStyle, {}, cellExternalProps.style, {}, provided && { cursor: 'move' }); var classString = (0, _classnames["default"])(baseClassName, (_classNames3 = {}, (0, _defineProperty2["default"])(_classNames3, "".concat(cellPrefix, "-aggregation"), aggregation), (0, _defineProperty2["default"])(_classNames3, "".concat(cellPrefix, "-last-group"), groupCell && isLast), _classNames3), 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' ? (0, _omit["default"])(cellExternalProps.style, ['width', 'height']) : undefined; return _react["default"].createElement(TCell, (0, _extends2["default"])({ colSpan: colSpan, rowSpan: rowSpan }, cellExternalProps, { className: classString, "data-index": key }, provided && provided.dragHandleProps, { style: (0, _objectSpread2["default"])({}, (0, _omit["default"])(cellStyle, ['width', 'height']), {}, widthDraggingStyle()), scope: scope }), renderInnerNode(aggregation, onCellStyle)); }; TableCell.displayName = 'TableCell'; var _default = (0, _mobxReactLite.observer)(TableCell); exports["default"] = _default; //# sourceMappingURL=TableCell.js.map