UNPKG

@arco-design/web-react

Version:

Arco Design React UI Library.

705 lines (704 loc) 36.8 kB
var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; import React, { useState, useRef, useContext, useImperativeHandle, forwardRef, useMemo, useCallback, } from 'react'; import debounce from 'lodash/debounce'; import throttle from 'lodash/throttle'; import BTween from 'b-tween'; import { isObject, isArray, isNumber } from '../_util/is'; import cs from '../_util/classNames'; import Spin from '../Spin'; import Thead from './thead/index'; import Tbody from './tbody/index'; import Tfoot from './tfoot/index'; import Pagination from '../Pagination'; import { on, off } from '../_util/dom'; import { ConfigContext } from '../ConfigProvider'; import { getScrollBarHeight, getScrollBarWidth, deepCloneData, getOriginData, getSorterFn, getSorterPriority, } from './utils'; import ColGroup from './colgroup'; import useExpand from './hooks/useExpand'; import useRowSelection from './hooks/useRowSelection'; import useComponent from './hooks/useComponent'; import useStickyOffsets from './hooks/useStickyOffsets'; import useStickyClassNames from './hooks/useStickyClassNames'; import useColumns from './hooks/useColumns'; import useUpdate from '../_util/hooks/useUpdate'; import ResizeObserver from '../_util/resizeObserver'; import useMergeProps from '../_util/hooks/useMergeProps'; import useIsomorphicLayoutEffect from '../_util/hooks/useIsomorphicLayoutEffect'; import { pickDataAttributes } from '../_util/pick'; import useSorter from './hooks/useSorter'; var EMPTY_DATA = []; var EMPTY_COLUMNS = []; var defaultProps = { showHeader: true, border: true, hover: true, rowKey: 'key', pagePosition: 'br', childrenColumnName: 'children', indentSize: 15, showSorterTooltip: true, }; function Table(baseProps, ref) { var _a, _b; var _c, _d; var _e = useContext(ConfigContext), getPrefixCls = _e.getPrefixCls, loadingElement = _e.loadingElement, ctxSize = _e.size, tablePagination = _e.tablePagination, renderEmpty = _e.renderEmpty, componentConfig = _e.componentConfig, rtl = _e.rtl; var props = useMergeProps(baseProps, defaultProps, componentConfig === null || componentConfig === void 0 ? void 0 : componentConfig.Table); // priority: props.pagination > ConfigProvider.tablePagination > ConfigProvider.Table.pagination var mergePagination = useMergeProps(isObject(baseProps === null || baseProps === void 0 ? void 0 : baseProps.pagination) ? baseProps === null || baseProps === void 0 ? void 0 : baseProps.pagination : {}, isObject((_c = componentConfig === null || componentConfig === void 0 ? void 0 : componentConfig.Table) === null || _c === void 0 ? void 0 : _c.pagination) ? (_d = componentConfig === null || componentConfig === void 0 ? void 0 : componentConfig.Table) === null || _d === void 0 ? void 0 : _d.pagination : {}, tablePagination || {}); var style = props.style, className = props.className, components = props.components, border = props.border, borderCell = props.borderCell, _f = props.columns, columns = _f === void 0 ? EMPTY_COLUMNS : _f, _g = props.data, data = _g === void 0 ? EMPTY_DATA : _g, scroll = props.scroll, noDataElement = props.noDataElement, showHeader = props.showHeader, stripe = props.stripe, hover = props.hover, pagination = props.pagination, onChange = props.onChange, pagePosition = props.pagePosition, childrenColumnName = props.childrenColumnName, indentSize = props.indentSize, rowSelection = props.rowSelection, tableLayoutFixed = props.tableLayoutFixed, footer = props.footer, virtualized = props.virtualized, renderPagination = props.renderPagination, summary = props.summary, rowKey = props.rowKey; var clonedData = useMemo(function () { return deepCloneData(data, childrenColumnName); }, [data, childrenColumnName]); var prefixCls = getPrefixCls('table'); // configProvider 提供的size可能和table size 不匹配,此时默认 'default' var size = props.size || (['default', 'middle', 'small', 'mini'].indexOf(ctxSize) > -1 ? ctxSize : 'default'); var refTableHead = useRef(null); var refTableBody = useRef(null); var refTBody = useRef(null); var refTableFoot = useRef(null); var refTable = useRef(null); var refVirtualList = useRef(null); // Not fixed header var refTableNF = useRef(null); var lastScrollLeft = useRef(0); var scrollbarChanged = useRef(false); var _h = __read(useColumns(props), 2), groupColumns = _h[0], flattenColumns = _h[1]; var _j = getDefaultFiltersAndSorters(), currentFilters = _j.currentFilters, defaultSorters = _j.defaultSorters; var _k = __read(useState(1), 2), currentPage = _k[0], setCurrentPage = _k[1]; var _l = __read(useState(mergePagination.pageSize || mergePagination.defaultPageSize || 10), 2), innerPageSize = _l[0], setInnerPageSize = _l[1]; var _m = __read(useState(currentFilters), 2), filters = _m[0], setFilters = _m[1]; var _o = __read(useState(0), 2), tableViewWidth = _o[0], setTableViewWidth = _o[1]; var _p = __read(useState([]), 2), columnWidths = _p[0], setColumnWidths = _p[1]; var stickyOffsets = useStickyOffsets(flattenColumns); var _q = __read(useStickyClassNames(groupColumns, flattenColumns, prefixCls), 2), groupStickyClassNames = _q[0], stickyClassNames = _q[1]; var _r = useSorter(flattenColumns, defaultSorters), currentSorter = _r.currentSorter, activeSorters = _r.activeSorters, getNextActiveSorters = _r.getNextActiveSorters, updateStateSorters = _r.updateStateSorters; var _s = useComponent(components), ComponentTable = _s.ComponentTable, ComponentBodyWrapper = _s.ComponentBodyWrapper, ComponentHeaderWrapper = _s.ComponentHeaderWrapper; var getRowKey = useMemo(function () { if (typeof rowKey === 'function') { return function (record) { return rowKey(getOriginData(record)); }; } return function (record) { return record[rowKey]; }; }, [rowKey]); function getDefaultFiltersAndSorters() { var currentFilters = {}; var defaultSorters = []; flattenColumns.forEach(function (column) { var innerDataIndex = column.key; if (column.defaultFilters) { currentFilters[innerDataIndex] = column.defaultFilters; } if (column.filteredValue) { currentFilters[innerDataIndex] = column.filteredValue; } var hasDefaultSortOrder = 'defaultSortOrder' in column && typeof column.defaultSortOrder !== 'undefined' && column.defaultSortOrder !== null; var hasSortOrder = 'sortOrder' in column && typeof column.sortOrder !== 'undefined' && column.sortOrder !== null; if (hasDefaultSortOrder || hasSortOrder) { var priority = getSorterPriority(column.sorter); var direction = hasSortOrder ? column.sortOrder : column.defaultSortOrder; // Only add sorter if direction is defined if (direction) { var sorter = { field: innerDataIndex, direction: direction, sorterFn: getSorterFn(column.sorter), priority: priority, }; if (isNumber(priority)) { if (defaultSorters.every(function (item) { return isNumber(item.priority) || !item.direction; })) { defaultSorters.push(sorter); } } else if (defaultSorters.every(function (item) { return !item.direction; })) { defaultSorters.push(sorter); } else { defaultSorters = [sorter]; } } } }); return { currentFilters: currentFilters, defaultSorters: defaultSorters }; } var controlledFilter = useMemo(function () { // 允许 filteredValue 设置为 undefined 表示不筛选 var flattenFilteredValueColumns = flattenColumns.filter(function (column) { return 'filteredValue' in column; }); var newFilters = {}; // 受控的筛选,当columns中的筛选发生改变时,更新state if (flattenFilteredValueColumns.length) { flattenFilteredValueColumns.forEach(function (column, index) { var innerDataIndex = column.key || column.dataIndex || index; if (innerDataIndex !== undefined) { newFilters[innerDataIndex] = column.filteredValue; } }); } return newFilters; }, [flattenColumns]); var innerFilters = useMemo(function () { return Object.keys(controlledFilter).length ? controlledFilter : filters; }, [filters, controlledFilter]); /** ----------- Sorter ----------- */ function onSort(direction, field) { var column = getColumnByUniqueKey(field); if (!column) { return; } var sorter = { direction: direction, field: field, sorterFn: getSorterFn(column.sorter), priority: getSorterPriority(column.sorter), }; var nextActiveSorters = getNextActiveSorters(sorter); updateStateSorters(sorter, nextActiveSorters); var newProcessedData = getProcessedData(sorter, nextActiveSorters, innerFilters); var currentData = getPageData(newProcessedData); onChange && onChange(getPaginationProps(newProcessedData), sorter, innerFilters, { currentData: getOriginData(currentData), currentAllData: getOriginData(newProcessedData), action: 'sort', }); } function compareFn(activeSorters) { var compare = function (fn, direction) { return function (a, b) { var result = fn(a, b); return direction === 'descend' ? -result : result; }; }; var sorters = __spreadArray([], __read(activeSorters), false); sorters.sort(function (a, b) { return b.priority - a.priority; }); return function (a, b) { for (var i = 0, l = sorters.length; i < l; i++) { var _a = sorters[i], sorterFn = _a.sorterFn, direction = _a.direction; if (typeof sorterFn !== 'function' || typeof direction === 'undefined' || direction === null) { continue; } var result = compare(sorterFn, direction)(a, b); if (result !== 0) { return result; } } return 0; }; } /** ----------- Sorter End ----------- */ /** ----------- Filters ----------- */ function onHandleFilter(column, filter) { var _a; var newFilters = __assign(__assign({}, innerFilters), (_a = {}, _a[column.dataIndex] = filter, _a)); var mergedFilters = __assign(__assign({}, newFilters), controlledFilter); if (isArray(filter) && filter.length) { setFilters(mergedFilters); var newProcessedData = getProcessedData(currentSorter, activeSorters, newFilters); var currentData = getPageData(newProcessedData); onChange && onChange(getPaginationProps(newProcessedData), activeSorters.length === 1 ? activeSorters[0] : activeSorters, newFilters, { currentData: getOriginData(currentData), currentAllData: getOriginData(newProcessedData), action: 'filter', }); } else if (isArray(filter) && !filter.length) { onHandleFilterReset(column); } } function onHandleFilterReset(_a) { var dataIndex = _a.dataIndex; var newFilters = __assign({}, innerFilters); delete newFilters[dataIndex]; setFilters(newFilters); var newProcessedData = getProcessedData(currentSorter, activeSorters, newFilters); var currentData = getPageData(newProcessedData); onChange && onChange(getPaginationProps(newProcessedData), activeSorters.length === 1 ? activeSorters[0] : activeSorters, newFilters, { currentData: getOriginData(currentData), currentAllData: getOriginData(newProcessedData), action: 'filter', }); } /** ----------- Filters End ----------- */ var hasFixedColumnLeft = !!flattenColumns.find(function (c) { return c.fixed === 'left'; }); var hasFixedColumnRight = !!flattenColumns.find(function (c) { return c.fixed === 'right'; }); var hasFixedColumn = hasFixedColumnLeft || hasFixedColumnRight; function getProcessedData(currentSorter, activeSorters, filters) { var _data = (clonedData || []).slice(); Object.keys(filters).forEach(function (field) { if (filters[field] && filters[field].length) { var column_1 = getColumnByUniqueKey(field); if (column_1 && typeof column_1.onFilter === 'function') { _data = _data.filter(function (row) { return filters[field].reduce(function (pre, cur) { return pre || column_1.onFilter(cur, row); }, false); }); } } }); var getSortData = function (d) { return d .slice() .sort(compareFn(activeSorters)) .map(function (item) { var _a; if (isArray(item[childrenColumnName])) { return __assign(__assign({}, item), (_a = {}, _a[childrenColumnName] = getSortData(item[childrenColumnName]), _a)); } return item; }); }; if ((currentSorter.direction && typeof currentSorter.sorterFn === 'function') || activeSorters.length) { return getSortData(_data); } return _data; } // 获得经过 sorter 和 filters 筛选之后的 data var processedData = getProcessedData(currentSorter, activeSorters, innerFilters); function getPaginationProps(_processedData) { if (_processedData === void 0) { _processedData = processedData; } var pageSize = mergePagination.pageSize || innerPageSize || 10; var paginationSize = size === 'middle' ? 'default' : size; var selectPopupPosition = 'top'; if (pagePosition === 'tl' || pagePosition === 'bl') { selectPopupPosition = 'bottom'; } else { selectPopupPosition = 'top'; } var total = isArray(_processedData) ? _processedData.length : 0; var current = Math.ceil(total / pageSize) < currentPage ? 1 : currentPage; if (current !== currentPage) { setCurrentPage(current); } var paginationProps = { size: paginationSize, total: total, pageSize: pageSize, current: current, selectProps: { triggerProps: { position: selectPopupPosition, }, }, }; if (typeof pagination === 'object' && pagination.selectProps) { paginationProps.selectProps = __assign(__assign({}, paginationProps.selectProps), pagination.selectProps); } if (isObject(pagination)) { paginationProps = __assign(__assign({}, paginationProps), pagination); } if (isObject(mergePagination)) { paginationProps = __assign(__assign({}, paginationProps), mergePagination); } paginationProps.onChange = onPaginationChange; return paginationProps; } var paginationProps = getPaginationProps(); var pageData = getPageData(); function getPageData(currentData, _paginationProps) { if (currentData === void 0) { currentData = processedData; } if (_paginationProps === void 0) { _paginationProps = paginationProps; } var _a = _paginationProps.current, current = _a === void 0 ? 0 : _a, _b = _paginationProps.pageSize, pageSize = _b === void 0 ? 10 : _b; if (pagination === false) { return currentData; } if (isObject(pagination) && data.length <= pageSize) { return currentData; } return currentData.slice((current - 1) * pageSize, current * pageSize); } var throttleResizeHandler = debounce(resizeHandler, 100); var fixedHeader = !!(scroll && scroll.y); var summaryNode = summary === null || summary === void 0 ? void 0 : summary(getOriginData(processedData)); var fixedFooterPosition = summary && React.isValidElement(summaryNode) && summaryNode.props.fixed; var fixedFooter = fixedHeader && fixedFooterPosition; useIsomorphicLayoutEffect(function () { resizeHandler(); on(window, 'resize', throttleResizeHandler); var tableHead = refTableHead.current; var tableBody = refTableBody.current; var tableFoot = refTableFoot.current; if (tableBody) { on(tableBody, 'scroll', tableScrollHandler); } var theadScrollContainer = tableHead && tableHead.parentNode; if (tableHead) { if (theadScrollContainer) { on(theadScrollContainer, 'scroll', tableScrollHandler); } } if (tableFoot) { on(tableFoot, 'scroll', tableScrollHandler); } return function () { off(window, 'resize', throttleResizeHandler); if (tableBody) { off(tableBody, 'scroll', tableScrollHandler); } if (theadScrollContainer) { off(theadScrollContainer, 'scroll', tableScrollHandler); } if (tableFoot) { off(tableFoot, 'scroll', tableScrollHandler); } }; }, [hasFixedColumnLeft, hasFixedColumnRight, scroll === null || scroll === void 0 ? void 0 : scroll.x, scroll === null || scroll === void 0 ? void 0 : scroll.y, flattenColumns.length, data]); useUpdate(function () { var _a = getPaginationProps(data), total = _a.total, pageSize = _a.pageSize; var maxPageNum = Math.ceil(total / pageSize); if (maxPageNum < currentPage) { setCurrentPage(1); } }, [data === null || data === void 0 ? void 0 : data.length]); useUpdate(function () { setFixedColumnClassNames(); }, [data, hasFixedColumnLeft, hasFixedColumnRight, rtl]); useImperativeHandle(ref, function () { return ({ getRootDomElement: getRootDomElement, scrollIntoView: function (dataIndex) { if (refVirtualList.current) { refVirtualList.current.scrollTo({ key: dataIndex }); } }, getRootDOMNode: getRootDomElement, }); }); function getRootDomElement() { return refTable.current; } function resizeHandler() { setFixedColumnClassNames(); var root = getRootDomElement(); if (root && (hasFixedColumn || (scroll && scroll.x))) { var ele = root.querySelector("." + prefixCls + "-body") || root.querySelector("." + prefixCls + "-content-inner"); var tableViewWidth_1 = ele.getBoundingClientRect().width; setTableViewWidth(tableViewWidth_1); } } var setPositionClassNames = useCallback(throttle(function () { var table = refTable.current; var tbody = (fixedHeader ? refTableBody.current : refTableNF.current && refTableNF.current.parentNode); if (tbody) { var scrollLeft = rtl ? -tbody.scrollLeft : tbody.scrollLeft; var alignLeft = scrollLeft === 0; // const alignRight = tbody.scrollLeft + tbody.clientWidth >= tbody.scrollWidth; var alignRight = scrollLeft + 1 >= tbody.children[0].getBoundingClientRect().width - tbody.getBoundingClientRect().width; if (alignLeft && alignRight) { setFixedColumnsClassList(table.classList, prefixCls + "-scroll-position-both"); } else if (alignLeft) { setFixedColumnsClassList(table.classList, prefixCls + "-scroll-position-" + (rtl ? 'right' : 'left')); } else if (alignRight) { setFixedColumnsClassList(table.classList, prefixCls + "-scroll-position-" + (rtl ? 'left' : 'right')); } else { setFixedColumnsClassList(table.classList, prefixCls + "-scroll-position-middle"); } } else { table && resetTableClassName(table.classList); } }, 100), [refTable.current, refTableBody.current, fixedHeader, rtl]); function setFixedColumnClassNames() { if (hasFixedColumn || (scroll && isObject(scroll) && scroll.x)) { var table = refTable.current; if (table) { if (hasFixedColumnLeft) { setTableFixedClassName(table.classList, prefixCls + "-has-fixed-col-left"); } if (hasFixedColumnRight) { setTableFixedClassName(table.classList, prefixCls + "-has-fixed-col-right"); } } setPositionClassNames(); } } function setTableFixedClassName(tableClassList, className) { if (!tableClassList.contains(className)) { tableClassList.add(className); } } function resetTableClassName(classList) { classList.remove(prefixCls + "-scroll-position-both"); classList.remove(prefixCls + "-scroll-position-left"); classList.remove(prefixCls + "-scroll-position-right"); classList.remove(prefixCls + "-scroll-position-middle"); } function setFixedColumnsClassList(classList, className) { if (!classList.contains(className)) { resetTableClassName(classList); classList.add(className); } } var _t = useRowSelection(props, pageData, clonedData, getRowKey), selectedRowKeys = _t.selectedRowKeys, indeterminateKeys = _t.indeterminateKeys, onCheckAll = _t.onCheckAll, onCheck = _t.onCheck, onCheckRadio = _t.onCheckRadio, setSelectedRowKeys = _t.setSelectedRowKeys, allSelectedRowKeys = _t.allSelectedRowKeys, flattenData = _t.flattenData; // flattenColumns 在构造时优先使用了 column.key 作为主键,在查询时使用 getColumnByDataIndex 方法可能会导致bug。 function getColumnByUniqueKey(key) { return flattenColumns.find(function (column, index) { if (typeof column.key !== 'undefined') { if (typeof column.key === 'number' && typeof key === 'string') { return column.key.toString() === key; } return column.key === key; } // unnecessary if (typeof column.dataIndex !== 'undefined') { return column.dataIndex === key; } if (typeof key === 'number') { return index === key; } return false; }); } function onPaginationChange(current, pageSize) { setCurrentPage(current); setInnerPageSize(pageSize); if (current !== currentPage) { scrollToTop(); } if (rowSelection && !rowSelection.checkCrossPage && selectedRowKeys.length) { setSelectedRowKeys([]); rowSelection.onChange && rowSelection.onChange([], []); } var newPaginationProps = __assign(__assign({}, getPaginationProps()), { current: current, pageSize: pageSize }); onChange && onChange(newPaginationProps, activeSorters.length === 1 ? activeSorters[0] : activeSorters, innerFilters, { currentData: getOriginData(getPageData(processedData, newPaginationProps)), currentAllData: getOriginData(processedData), action: 'paginate', }); mergePagination.onChange && mergePagination.onChange(current, pageSize); } function scrollToTop() { var tableBody = refTableBody.current; if (!tableBody) { return; } var scrollTop = refTableBody.current.scrollTop; var tween = new BTween({ from: { scrollTop: scrollTop }, to: { scrollTop: 0 }, easing: 'quintInOut', duration: 300, onUpdate: function (keys) { if (refTableBody.current) { refTableBody.current.scrollTop = keys.scrollTop; } }, }); tween.start(); } function tableScrollHandler(e) { var target = e.target; var tbody = refTableBody.current; var theadScrollContainer = refTableHead.current && refTableHead.current.parentNode; var tfoot = refTableFoot.current; if (target.scrollLeft !== lastScrollLeft.current) { if (theadScrollContainer) { theadScrollContainer.scrollLeft = target.scrollLeft; } if (tbody) { tbody.scrollLeft = target.scrollLeft; } if (tfoot) { tfoot.scrollLeft = target.scrollLeft; } setFixedColumnClassNames(); } lastScrollLeft.current = e.target.scrollLeft; } // isFixedHeader = false function tableScrollHandlerNF(e) { var target = e.target; var table = refTableNF.current; if (target.scrollLeft !== lastScrollLeft.current) { table.scrollLeft = target.scrollLeft; setFixedColumnClassNames(); } lastScrollLeft.current = e.target.scrollLeft; } var _u = __read(useExpand(props, flattenData, getRowKey), 2), expandedRowKeys = _u[0], onClickExpandBtn = _u[1]; var scrollStyleY = {}; var scrollStyleX = {}; if (scroll) { if (scroll.x && (typeof scroll.x === 'number' || typeof scroll.x === 'string')) { scrollStyleX = { width: scroll.x, }; } if (scroll.y && (typeof scroll.y === 'number' || typeof scroll.y === 'string')) { scrollStyleY = { maxHeight: scroll.y, }; } } function setScrollBarStyle() { var wrapper = refTableHead.current && refTableHead.current.parentNode; var scrollBarHeight = getScrollBarHeight(wrapper); if (scrollBarHeight && scrollBarHeight > 0) { wrapper.style.marginBottom = "-" + scrollBarHeight + "px"; wrapper.style.paddingBottom = '0px'; if (refTableFoot.current) { refTableFoot.current.style.marginBottom = "-" + scrollBarHeight + "px"; refTableFoot.current.style.paddingBottom = '0px'; } } // 根据 Tbody 决定 Thead 是否显示纵向滚动条 // TODO: Remove setTimeout(function () { var scrollWrapper = refTableBody.current; var scrollBarWidth = getScrollBarWidth(scrollWrapper); if (scrollBarWidth) { scrollbarChanged.current = true; if (wrapper) { wrapper.style.overflowY = 'scroll'; } if (refTableFoot.current) { refTableFoot.current.style.overflowY = 'scroll'; } } else if (wrapper && scrollbarChanged.current) { scrollbarChanged.current = false; wrapper.style.overflowY = 'auto'; if (refTableFoot.current) { refTableFoot.current.style.overflowY = 'auto'; } } }); } var theadNode = (React.createElement(Thead, __assign({}, props, { activeSorters: activeSorters, currentSorter: currentSorter, selectedRowKeys: selectedRowKeys, currentFilters: innerFilters, onCheckAll: onCheckAll, onSort: onSort, data: pageData, onHandleFilter: onHandleFilter, onHandleFilterReset: onHandleFilterReset, prefixCls: prefixCls, allSelectedRowKeys: allSelectedRowKeys, groupColumns: groupColumns, stickyOffsets: stickyOffsets, groupStickyClassNames: groupStickyClassNames }))); function renderThead() { var maxContentWidth = isObject(scroll) && scroll.x === 'max-content'; return fixedHeader || virtualized ? (React.createElement(ComponentHeaderWrapper, { className: prefixCls + "-header" }, React.createElement(ComponentTable, { ref: refTableHead, style: maxContentWidth ? {} : scrollStyleX }, React.createElement(ColGroup, { columns: flattenColumns, prefixCls: prefixCls, producer: false, columnWidths: maxContentWidth && scroll.y ? columnWidths : null }), theadNode))) : (theadNode); } var footerNode = summaryNode && (React.createElement(Tfoot, { prefixCls: prefixCls, summary: summary, data: pageData, columns: flattenColumns, stickyOffsets: stickyOffsets, stickyClassNames: stickyClassNames })); var tbodyNode = (React.createElement(Tbody, __assign({}, props, { saveRef: function (node) { return (refTBody.current = node); }, selectedRowKeys: selectedRowKeys, indeterminateKeys: indeterminateKeys, expandedRowKeys: expandedRowKeys, onCheck: onCheck, onCheckRadio: onCheckRadio, onClickExpandBtn: onClickExpandBtn, columns: flattenColumns, data: pageData, prefixCls: prefixCls, hasFixedColumn: hasFixedColumn, tableViewWidth: tableViewWidth, indentSize: indentSize, noDataElement: noDataElement || renderEmpty('Table'), activeSorters: activeSorters, currentSorter: currentSorter, stickyOffsets: stickyOffsets, stickyClassNames: stickyClassNames, getRowKey: getRowKey, saveVirtualListRef: function (ref) { if (virtualized) { refVirtualList.current = ref; refTableBody.current = ref === null || ref === void 0 ? void 0 : ref.dom; } } }))); var tbody = !virtualized && !fixedFooter ? (React.createElement(React.Fragment, null, tbodyNode, footerNode)) : (tbodyNode); function renderTbody() { var producer = isObject(scroll) && scroll.x === 'max-content' && !!scroll.y && isArray(data) && data.length > 0; return (React.createElement(ResizeObserver, { onResize: setScrollBarStyle, getTargetDOMNode: function () { return refTableBody.current || refTBody.current; } }, fixedHeader && !virtualized ? (React.createElement(ComponentBodyWrapper, { ref: refTableBody, className: prefixCls + "-body", style: scrollStyleY }, React.createElement(ComponentTable, { style: scrollStyleX }, React.createElement(ColGroup, { columns: flattenColumns, prefixCls: prefixCls, producer: producer, onSetColumnWidths: setColumnWidths, expandedRowKeys: expandedRowKeys, data: data }), tbody))) : (tbody))); } function renderTable() { var scrollStyle = {}; if (scroll && isObject(scroll) && scroll.x) { scrollStyle = { width: scroll.x, }; } var summaryTableNode = (React.createElement("div", { className: prefixCls + "-tfoot", ref: refTableFoot }, React.createElement(ComponentTable, { style: scrollStyle }, React.createElement(ColGroup, { columns: flattenColumns, prefixCls: prefixCls }), footerNode))); var summaryFixedTop = summaryNode && fixedHeader && fixedFooterPosition === 'top'; var summaryFixedBottom = summaryNode && fixedHeader && fixedFooterPosition === 'bottom'; var body = (React.createElement(React.Fragment, null, showHeader ? renderThead() : null, summaryFixedTop && summaryTableNode, renderTbody(), summaryFixedBottom && summaryTableNode)); return (React.createElement(React.Fragment, null, React.createElement("div", { className: prefixCls + "-container" }, React.createElement("div", { className: prefixCls + "-content-scroll" }, React.createElement("div", { className: prefixCls + "-content-inner", onScroll: !fixedHeader ? tableScrollHandlerNF : undefined }, fixedHeader || virtualized ? (body) : (React.createElement(ComponentTable, { ref: refTableNF, style: scrollStyle }, React.createElement(ColGroup, { prefixCls: prefixCls, columns: flattenColumns }), body))))), typeof footer === 'function' && (React.createElement("div", { className: prefixCls + "-footer" }, footer(pageData))))); } if (!columns.length) { return null; } var showWrapperBorder = isObject(border) ? border.wrapper : border; var showCellBorder = isObject(border) ? border.cell : borderCell; var showHeaderCellBorder = isObject(border) ? border.cell || border.headerCell : borderCell; var showBodyCellBorder = isObject(border) ? border.cell || border.bodyCell : borderCell; var classNames = cs(prefixCls, prefixCls + "-size-" + size, (_a = {}, _a[prefixCls + "-border"] = showWrapperBorder, _a[prefixCls + "-border-cell"] = showCellBorder, _a[prefixCls + "-border-header-cell"] = !showCellBorder && showHeaderCellBorder, _a[prefixCls + "-border-body-cell"] = !showCellBorder && showBodyCellBorder, _a[prefixCls + "-stripe"] = stripe, _a[prefixCls + "-hover"] = hover, _a[prefixCls + "-type-radio"] = rowSelection && rowSelection.type === 'radio', _a[prefixCls + "-layout-fixed"] = tableLayoutFixed || (scroll && (scroll.x || scroll.y)) || columns.find(function (col) { return col.ellipsis; }), _a[prefixCls + "-fixed-column"] = hasFixedColumn, _a[prefixCls + "-virtualized"] = virtualized, _a[prefixCls + "-rtl"] = rtl, _a), className); var isPaginationTop = pagePosition === 'tl' || pagePosition === 'tr' || pagePosition === 'topCenter'; var paginationClassName = cs(prefixCls + "-pagination", (_b = {}, _b[prefixCls + "-pagination-left"] = pagePosition === 'tl' || pagePosition === 'bl', _b[prefixCls + "-pagination-center"] = pagePosition === 'topCenter' || pagePosition === 'bottomCenter', _b[prefixCls + "-pagination-top"] = isPaginationTop, _b)); var loading = props.loading; if (typeof loading === 'boolean') { loading = { loading: loading }; } var customPagination = typeof renderPagination === 'function'; var paginationEle = customPagination ? (renderPagination(React.createElement(Pagination, __assign({}, paginationProps)))) : (React.createElement("div", { className: paginationClassName }, React.createElement(Pagination, __assign({}, paginationProps)))); var showPagination = pagination !== false && (processedData.length !== 0 || paginationProps.total > 0); return (React.createElement("div", __assign({ ref: refTable, style: style, className: classNames }, pickDataAttributes(props)), React.createElement(Spin, __assign({ element: loadingElement }, loading), showPagination && isPaginationTop && paginationEle, renderTable(), showPagination && !isPaginationTop && paginationEle))); } var TableComponent = forwardRef(Table); TableComponent.displayName = 'Table'; export default TableComponent;