209 lines
7.7 KiB
JavaScript
209 lines
7.7 KiB
JavaScript
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = void 0;
|
|
var _context = require("@rc-component/context");
|
|
var _clsx = require("clsx");
|
|
var React = _interopRequireWildcard(require("react"));
|
|
var _TableContext = _interopRequireDefault(require("../context/TableContext"));
|
|
var _useRenderTimes = _interopRequireDefault(require("../hooks/useRenderTimes"));
|
|
var _useCellRender = _interopRequireDefault(require("./useCellRender"));
|
|
var _useHoverState = _interopRequireDefault(require("./useHoverState"));
|
|
var _util = require("@rc-component/util");
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
const getTitleFromCellRenderChildren = ({
|
|
ellipsis,
|
|
rowType,
|
|
children
|
|
}) => {
|
|
let title;
|
|
const ellipsisConfig = ellipsis === true ? {
|
|
showTitle: true
|
|
} : ellipsis;
|
|
if (ellipsisConfig && (ellipsisConfig.showTitle || rowType === 'header')) {
|
|
if (typeof children === 'string' || typeof children === 'number') {
|
|
title = children.toString();
|
|
} else if ( /*#__PURE__*/React.isValidElement(children) && typeof children.props?.children === 'string') {
|
|
title = children.props?.children;
|
|
}
|
|
}
|
|
return title;
|
|
};
|
|
const Cell = props => {
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
(0, _useRenderTimes.default)(props);
|
|
}
|
|
const {
|
|
component: Component,
|
|
children,
|
|
ellipsis,
|
|
scope,
|
|
// Style
|
|
prefixCls,
|
|
className,
|
|
style,
|
|
align,
|
|
// Value
|
|
record,
|
|
render,
|
|
dataIndex,
|
|
renderIndex,
|
|
shouldCellUpdate,
|
|
// Row
|
|
index,
|
|
rowType,
|
|
// Span
|
|
colSpan,
|
|
rowSpan,
|
|
// Fixed
|
|
fixStart,
|
|
fixEnd,
|
|
fixedStartShadow,
|
|
fixedEndShadow,
|
|
offsetFixedStartShadow,
|
|
offsetFixedEndShadow,
|
|
zIndex,
|
|
zIndexReverse,
|
|
// Private
|
|
appendNode,
|
|
additionalProps = {},
|
|
isSticky
|
|
} = props;
|
|
const cellPrefixCls = `${prefixCls}-cell`;
|
|
const {
|
|
allColumnsFixedLeft,
|
|
rowHoverable
|
|
} = (0, _context.useContext)(_TableContext.default, ['allColumnsFixedLeft', 'rowHoverable']);
|
|
|
|
// ====================== Value =======================
|
|
const [childNode, legacyCellProps] = (0, _useCellRender.default)(record, dataIndex, renderIndex, children, render, shouldCellUpdate);
|
|
|
|
// ====================== Fixed =======================
|
|
const fixedStyle = {};
|
|
const isFixStart = typeof fixStart === 'number' && !allColumnsFixedLeft;
|
|
const isFixEnd = typeof fixEnd === 'number' && !allColumnsFixedLeft;
|
|
const [showFixStartShadow, showFixEndShadow] = (0, _context.useContext)(_TableContext.default, ({
|
|
scrollInfo
|
|
}) => {
|
|
if (!isFixStart && !isFixEnd) {
|
|
return [false, false];
|
|
}
|
|
const [absScroll, scrollWidth] = scrollInfo;
|
|
const showStartShadow = (isFixStart && fixedStartShadow && absScroll) -
|
|
// For precision, we not show shadow by default which has better user experience.
|
|
offsetFixedStartShadow >= 1;
|
|
const showEndShadow = (isFixEnd && fixedEndShadow && scrollWidth - absScroll) -
|
|
// Same as above
|
|
offsetFixedEndShadow > 1;
|
|
return [showStartShadow, showEndShadow];
|
|
});
|
|
if (isFixStart) {
|
|
fixedStyle.insetInlineStart = fixStart;
|
|
fixedStyle['--z-offset'] = zIndex;
|
|
fixedStyle['--z-offset-reverse'] = zIndexReverse;
|
|
}
|
|
if (isFixEnd) {
|
|
fixedStyle.insetInlineEnd = fixEnd;
|
|
fixedStyle['--z-offset'] = zIndex;
|
|
fixedStyle['--z-offset-reverse'] = zIndexReverse;
|
|
}
|
|
|
|
// ================ RowSpan & ColSpan =================
|
|
const mergedColSpan = legacyCellProps?.colSpan ?? additionalProps.colSpan ?? colSpan ?? 1;
|
|
const mergedRowSpan = legacyCellProps?.rowSpan ?? additionalProps.rowSpan ?? rowSpan ?? 1;
|
|
|
|
// ====================== Hover =======================
|
|
const [hovering, onHover] = (0, _useHoverState.default)(index, mergedRowSpan);
|
|
const onMouseEnter = (0, _util.useEvent)(event => {
|
|
if (record) {
|
|
onHover(index, index + mergedRowSpan - 1);
|
|
}
|
|
additionalProps?.onMouseEnter?.(event);
|
|
});
|
|
const onMouseLeave = (0, _util.useEvent)(event => {
|
|
if (record) {
|
|
onHover(-1, -1);
|
|
}
|
|
additionalProps?.onMouseLeave?.(event);
|
|
});
|
|
|
|
// ====================== Render ======================
|
|
if (mergedColSpan === 0 || mergedRowSpan === 0) {
|
|
return null;
|
|
}
|
|
|
|
// >>>>> Title
|
|
const title = additionalProps.title ?? getTitleFromCellRenderChildren({
|
|
rowType,
|
|
ellipsis,
|
|
children: childNode
|
|
});
|
|
|
|
// >>>>> ClassName
|
|
const mergedClassName = (0, _clsx.clsx)(cellPrefixCls, className, {
|
|
// Fixed
|
|
[`${cellPrefixCls}-fix`]: isFixStart || isFixEnd,
|
|
[`${cellPrefixCls}-fix-start`]: isFixStart,
|
|
[`${cellPrefixCls}-fix-end`]: isFixEnd,
|
|
// Fixed shadow
|
|
[`${cellPrefixCls}-fix-start-shadow`]: fixedStartShadow,
|
|
[`${cellPrefixCls}-fix-start-shadow-show`]: fixedStartShadow && showFixStartShadow,
|
|
[`${cellPrefixCls}-fix-end-shadow`]: fixedEndShadow,
|
|
[`${cellPrefixCls}-fix-end-shadow-show`]: fixedEndShadow && showFixEndShadow,
|
|
[`${cellPrefixCls}-ellipsis`]: ellipsis,
|
|
[`${cellPrefixCls}-with-append`]: appendNode,
|
|
[`${cellPrefixCls}-fix-sticky`]: (isFixStart || isFixEnd) && isSticky,
|
|
[`${cellPrefixCls}-row-hover`]: !legacyCellProps && hovering
|
|
}, additionalProps.className, legacyCellProps?.className);
|
|
|
|
// >>>>> Style
|
|
const alignStyle = {};
|
|
if (align) {
|
|
alignStyle.textAlign = align;
|
|
}
|
|
|
|
// The order is important since user can overwrite style.
|
|
// For example ant-design/ant-design#51763
|
|
const mergedStyle = {
|
|
...legacyCellProps?.style,
|
|
...fixedStyle,
|
|
...alignStyle,
|
|
...additionalProps.style,
|
|
...style
|
|
};
|
|
|
|
// >>>>> Children Node
|
|
let mergedChildNode = childNode;
|
|
|
|
// Not crash if final `childNode` is not validate ReactNode
|
|
if (typeof mergedChildNode === 'object' && !Array.isArray(mergedChildNode) && ! /*#__PURE__*/React.isValidElement(mergedChildNode)) {
|
|
mergedChildNode = null;
|
|
}
|
|
if (ellipsis && (fixedStartShadow || fixedEndShadow)) {
|
|
mergedChildNode = /*#__PURE__*/React.createElement("span", {
|
|
className: `${cellPrefixCls}-content`
|
|
}, mergedChildNode);
|
|
}
|
|
return /*#__PURE__*/React.createElement(Component, _extends({}, legacyCellProps, additionalProps, {
|
|
className: mergedClassName,
|
|
style: mergedStyle
|
|
// A11y
|
|
,
|
|
title: title,
|
|
scope: scope
|
|
// Hover
|
|
,
|
|
onMouseEnter: rowHoverable ? onMouseEnter : undefined,
|
|
onMouseLeave: rowHoverable ? onMouseLeave : undefined
|
|
//Span
|
|
,
|
|
colSpan: mergedColSpan !== 1 ? mergedColSpan : null,
|
|
rowSpan: mergedRowSpan !== 1 ? mergedRowSpan : null
|
|
}), appendNode, mergedChildNode);
|
|
};
|
|
var _default = exports.default = /*#__PURE__*/React.memo(Cell); |