Table.js 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = exports.INTERNAL_HOOKS = void 0;
  7. var _vue = require("vue");
  8. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  9. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  10. var _Header = _interopRequireDefault(require("./Header/Header"));
  11. var _Body = _interopRequireDefault(require("./Body"));
  12. var _useColumns = _interopRequireDefault(require("./hooks/useColumns"));
  13. var _useFrame = require("./hooks/useFrame");
  14. var _valueUtil = require("./utils/valueUtil");
  15. var _useStickyOffsets = _interopRequireDefault(require("./hooks/useStickyOffsets"));
  16. var _ColGroup = _interopRequireDefault(require("./ColGroup"));
  17. var _Panel = _interopRequireDefault(require("./Panel"));
  18. var _Footer = _interopRequireDefault(require("./Footer"));
  19. var _expandUtil = require("./utils/expandUtil");
  20. var _fixUtil = require("./utils/fixUtil");
  21. var _stickyScrollBar = _interopRequireDefault(require("./stickyScrollBar"));
  22. var _useSticky = _interopRequireDefault(require("./hooks/useSticky"));
  23. var _FixedHolder = _interopRequireDefault(require("./FixedHolder"));
  24. var _warning = require("../vc-util/warning");
  25. var _reactivePick = require("../_util/reactivePick");
  26. var _useState = _interopRequireDefault(require("../_util/hooks/useState"));
  27. var _util = require("../_util/util");
  28. var _isVisible = _interopRequireDefault(require("../vc-util/Dom/isVisible"));
  29. var _getScrollBarSize = require("../_util/getScrollBarSize");
  30. var _classNames = _interopRequireDefault(require("../_util/classNames"));
  31. var _vcResizeObserver = _interopRequireDefault(require("../vc-resize-observer"));
  32. var _TableContext = require("./context/TableContext");
  33. var _BodyContext = require("./context/BodyContext");
  34. var _ResizeContext = require("./context/ResizeContext");
  35. var _StickyContext = require("./context/StickyContext");
  36. var _pickAttrs = _interopRequireDefault(require("../_util/pickAttrs"));
  37. var _ExpandedRowContext = require("./context/ExpandedRowContext");
  38. // Used for conditions cache
  39. const EMPTY_DATA = [];
  40. // Used for customize scroll
  41. const EMPTY_SCROLL_TARGET = {};
  42. const INTERNAL_HOOKS = exports.INTERNAL_HOOKS = 'rc-table-internal-hook';
  43. var _default = exports.default = (0, _vue.defineComponent)({
  44. name: 'VcTable',
  45. inheritAttrs: false,
  46. props: ['prefixCls', 'data', 'columns', 'rowKey', 'tableLayout', 'scroll', 'rowClassName', 'title', 'footer', 'id', 'showHeader', 'components', 'customRow', 'customHeaderRow', 'direction', 'expandFixed', 'expandColumnWidth', 'expandedRowKeys', 'defaultExpandedRowKeys', 'expandedRowRender', 'expandRowByClick', 'expandIcon', 'onExpand', 'onExpandedRowsChange', 'onUpdate:expandedRowKeys', 'defaultExpandAllRows', 'indentSize', 'expandIconColumnIndex', 'expandedRowClassName', 'childrenColumnName', 'rowExpandable', 'sticky', 'transformColumns', 'internalHooks', 'internalRefs', 'canExpandable', 'onUpdateInternalRefs', 'transformCellText'],
  47. emits: ['expand', 'expandedRowsChange', 'updateInternalRefs', 'update:expandedRowKeys'],
  48. setup(props, _ref) {
  49. let {
  50. attrs,
  51. slots,
  52. emit
  53. } = _ref;
  54. const mergedData = (0, _vue.computed)(() => props.data || EMPTY_DATA);
  55. const hasData = (0, _vue.computed)(() => !!mergedData.value.length);
  56. // ==================== Customize =====================
  57. const mergedComponents = (0, _vue.computed)(() => (0, _valueUtil.mergeObject)(props.components, {}));
  58. const getComponent = (path, defaultComponent) => (0, _valueUtil.getPathValue)(mergedComponents.value, path) || defaultComponent;
  59. const getRowKey = (0, _vue.computed)(() => {
  60. const rowKey = props.rowKey;
  61. if (typeof rowKey === 'function') {
  62. return rowKey;
  63. }
  64. return record => {
  65. const key = record && record[rowKey];
  66. if (process.env.NODE_ENV !== 'production') {
  67. (0, _warning.warning)(key !== undefined, 'Each record in table should have a unique `key` prop, or set `rowKey` to an unique primary key.');
  68. }
  69. return key;
  70. };
  71. });
  72. // ====================== Expand ======================
  73. const mergedExpandIcon = (0, _vue.computed)(() => props.expandIcon || _expandUtil.renderExpandIcon);
  74. const mergedChildrenColumnName = (0, _vue.computed)(() => props.childrenColumnName || 'children');
  75. const expandableType = (0, _vue.computed)(() => {
  76. if (props.expandedRowRender) {
  77. return 'row';
  78. }
  79. /* eslint-disable no-underscore-dangle */
  80. /**
  81. * Fix https://github.com/ant-design/ant-design/issues/21154
  82. * This is a workaround to not to break current behavior.
  83. * We can remove follow code after final release.
  84. *
  85. * To other developer:
  86. * Do not use `__PARENT_RENDER_ICON__` in prod since we will remove this when refactor
  87. */
  88. if (props.canExpandable || mergedData.value.some(record => record && typeof record === 'object' && record[mergedChildrenColumnName.value])) {
  89. return 'nest';
  90. }
  91. /* eslint-enable */
  92. return false;
  93. });
  94. const innerExpandedKeys = (0, _vue.shallowRef)([]);
  95. const stop = (0, _vue.watchEffect)(() => {
  96. if (props.defaultExpandedRowKeys) {
  97. innerExpandedKeys.value = props.defaultExpandedRowKeys;
  98. }
  99. if (props.defaultExpandAllRows) {
  100. innerExpandedKeys.value = (0, _expandUtil.findAllChildrenKeys)(mergedData.value, getRowKey.value, mergedChildrenColumnName.value);
  101. }
  102. });
  103. // defalutXxxx 仅仅第一次生效
  104. stop();
  105. const mergedExpandedKeys = (0, _vue.computed)(() => new Set(props.expandedRowKeys || innerExpandedKeys.value || []));
  106. const onTriggerExpand = record => {
  107. const key = getRowKey.value(record, mergedData.value.indexOf(record));
  108. let newExpandedKeys;
  109. const hasKey = mergedExpandedKeys.value.has(key);
  110. if (hasKey) {
  111. mergedExpandedKeys.value.delete(key);
  112. newExpandedKeys = [...mergedExpandedKeys.value];
  113. } else {
  114. newExpandedKeys = [...mergedExpandedKeys.value, key];
  115. }
  116. innerExpandedKeys.value = newExpandedKeys;
  117. emit('expand', !hasKey, record);
  118. emit('update:expandedRowKeys', newExpandedKeys);
  119. emit('expandedRowsChange', newExpandedKeys);
  120. };
  121. // Warning if use `expandedRowRender` and nest children in the same time
  122. if (process.env.NODE_ENV !== 'production' && props.expandedRowRender && mergedData.value.some(record => {
  123. return Array.isArray(record === null || record === void 0 ? void 0 : record[mergedChildrenColumnName.value]);
  124. })) {
  125. (0, _warning.warning)(false, '`expandedRowRender` should not use with nested Table');
  126. }
  127. const componentWidth = (0, _vue.ref)(0);
  128. const [columns, flattenColumns] = (0, _useColumns.default)((0, _extends2.default)((0, _extends2.default)({}, (0, _vue.toRefs)(props)), {
  129. // children,
  130. expandable: (0, _vue.computed)(() => !!props.expandedRowRender),
  131. expandedKeys: mergedExpandedKeys,
  132. getRowKey,
  133. onTriggerExpand,
  134. expandIcon: mergedExpandIcon
  135. }), (0, _vue.computed)(() => props.internalHooks === INTERNAL_HOOKS ? props.transformColumns : null));
  136. const columnContext = (0, _vue.computed)(() => ({
  137. columns: columns.value,
  138. flattenColumns: flattenColumns.value
  139. }));
  140. // ====================== Scroll ======================
  141. const fullTableRef = (0, _vue.ref)();
  142. const scrollHeaderRef = (0, _vue.ref)();
  143. const scrollBodyRef = (0, _vue.ref)();
  144. const scrollBodySizeInfo = (0, _vue.ref)({
  145. scrollWidth: 0,
  146. clientWidth: 0
  147. });
  148. const scrollSummaryRef = (0, _vue.ref)();
  149. const [pingedLeft, setPingedLeft] = (0, _useState.default)(false);
  150. const [pingedRight, setPingedRight] = (0, _useState.default)(false);
  151. const [colsWidths, updateColsWidths] = (0, _useFrame.useLayoutState)(new Map());
  152. // Convert map to number width
  153. const colsKeys = (0, _vue.computed)(() => (0, _valueUtil.getColumnsKey)(flattenColumns.value));
  154. const colWidths = (0, _vue.computed)(() => colsKeys.value.map(columnKey => colsWidths.value.get(columnKey)));
  155. const columnCount = (0, _vue.computed)(() => flattenColumns.value.length);
  156. const stickyOffsets = (0, _useStickyOffsets.default)(colWidths, columnCount, (0, _vue.toRef)(props, 'direction'));
  157. const fixHeader = (0, _vue.computed)(() => props.scroll && (0, _valueUtil.validateValue)(props.scroll.y));
  158. const horizonScroll = (0, _vue.computed)(() => props.scroll && (0, _valueUtil.validateValue)(props.scroll.x) || Boolean(props.expandFixed));
  159. const fixColumn = (0, _vue.computed)(() => horizonScroll.value && flattenColumns.value.some(_ref2 => {
  160. let {
  161. fixed
  162. } = _ref2;
  163. return fixed;
  164. }));
  165. // Sticky
  166. const stickyRef = (0, _vue.ref)();
  167. const stickyState = (0, _useSticky.default)((0, _vue.toRef)(props, 'sticky'), (0, _vue.toRef)(props, 'prefixCls'));
  168. const summaryFixedInfos = (0, _vue.reactive)({});
  169. const fixFooter = (0, _vue.computed)(() => {
  170. const info = Object.values(summaryFixedInfos)[0];
  171. return (fixHeader.value || stickyState.value.isSticky) && info;
  172. });
  173. const summaryCollect = (uniKey, fixed) => {
  174. if (fixed) {
  175. summaryFixedInfos[uniKey] = fixed;
  176. } else {
  177. delete summaryFixedInfos[uniKey];
  178. }
  179. };
  180. // Scroll
  181. const scrollXStyle = (0, _vue.ref)({});
  182. const scrollYStyle = (0, _vue.ref)({});
  183. const scrollTableStyle = (0, _vue.ref)({});
  184. (0, _vue.watchEffect)(() => {
  185. if (fixHeader.value) {
  186. scrollYStyle.value = {
  187. overflowY: 'scroll',
  188. maxHeight: (0, _util.toPx)(props.scroll.y)
  189. };
  190. }
  191. if (horizonScroll.value) {
  192. scrollXStyle.value = {
  193. overflowX: 'auto'
  194. };
  195. // When no vertical scrollbar, should hide it
  196. // https://github.com/ant-design/ant-design/pull/20705
  197. // https://github.com/ant-design/ant-design/issues/21879
  198. if (!fixHeader.value) {
  199. scrollYStyle.value = {
  200. overflowY: 'hidden'
  201. };
  202. }
  203. scrollTableStyle.value = {
  204. width: props.scroll.x === true ? 'auto' : (0, _util.toPx)(props.scroll.x),
  205. minWidth: '100%'
  206. };
  207. }
  208. });
  209. const onColumnResize = (columnKey, width) => {
  210. if ((0, _isVisible.default)(fullTableRef.value)) {
  211. updateColsWidths(widths => {
  212. if (widths.get(columnKey) !== width) {
  213. const newWidths = new Map(widths);
  214. newWidths.set(columnKey, width);
  215. return newWidths;
  216. }
  217. return widths;
  218. });
  219. }
  220. };
  221. const [setScrollTarget, getScrollTarget] = (0, _useFrame.useTimeoutLock)(null);
  222. function forceScroll(scrollLeft, target) {
  223. if (!target) {
  224. return;
  225. }
  226. if (typeof target === 'function') {
  227. target(scrollLeft);
  228. return;
  229. }
  230. const domTarget = target.$el || target;
  231. if (domTarget.scrollLeft !== scrollLeft) {
  232. // eslint-disable-next-line no-param-reassign
  233. domTarget.scrollLeft = scrollLeft;
  234. }
  235. }
  236. const onScroll = _ref3 => {
  237. let {
  238. currentTarget,
  239. scrollLeft
  240. } = _ref3;
  241. var _a;
  242. const isRTL = props.direction === 'rtl';
  243. const mergedScrollLeft = typeof scrollLeft === 'number' ? scrollLeft : currentTarget.scrollLeft;
  244. const compareTarget = currentTarget || EMPTY_SCROLL_TARGET;
  245. if (!getScrollTarget() || getScrollTarget() === compareTarget) {
  246. setScrollTarget(compareTarget);
  247. forceScroll(mergedScrollLeft, scrollHeaderRef.value);
  248. forceScroll(mergedScrollLeft, scrollBodyRef.value);
  249. forceScroll(mergedScrollLeft, scrollSummaryRef.value);
  250. forceScroll(mergedScrollLeft, (_a = stickyRef.value) === null || _a === void 0 ? void 0 : _a.setScrollLeft);
  251. }
  252. if (currentTarget) {
  253. const {
  254. scrollWidth,
  255. clientWidth
  256. } = currentTarget;
  257. if (isRTL) {
  258. setPingedLeft(-mergedScrollLeft < scrollWidth - clientWidth);
  259. setPingedRight(-mergedScrollLeft > 0);
  260. } else {
  261. setPingedLeft(mergedScrollLeft > 0);
  262. setPingedRight(mergedScrollLeft < scrollWidth - clientWidth);
  263. }
  264. }
  265. };
  266. const triggerOnScroll = () => {
  267. if (horizonScroll.value && scrollBodyRef.value) {
  268. onScroll({
  269. currentTarget: scrollBodyRef.value
  270. });
  271. } else {
  272. setPingedLeft(false);
  273. setPingedRight(false);
  274. }
  275. };
  276. let timtout;
  277. const updateWidth = width => {
  278. if (width !== componentWidth.value) {
  279. triggerOnScroll();
  280. componentWidth.value = fullTableRef.value ? fullTableRef.value.offsetWidth : width;
  281. }
  282. };
  283. const onFullTableResize = _ref4 => {
  284. let {
  285. width
  286. } = _ref4;
  287. clearTimeout(timtout);
  288. if (componentWidth.value === 0) {
  289. updateWidth(width);
  290. return;
  291. }
  292. timtout = setTimeout(() => {
  293. updateWidth(width);
  294. }, 100);
  295. };
  296. (0, _vue.watch)([horizonScroll, () => props.data, () => props.columns], () => {
  297. if (horizonScroll.value) {
  298. triggerOnScroll();
  299. }
  300. }, {
  301. flush: 'post'
  302. });
  303. const [scrollbarSize, setScrollbarSize] = (0, _useState.default)(0);
  304. (0, _StickyContext.useProvideSticky)();
  305. (0, _vue.onMounted)(() => {
  306. (0, _vue.nextTick)(() => {
  307. var _a, _b;
  308. triggerOnScroll();
  309. setScrollbarSize((0, _getScrollBarSize.getTargetScrollBarSize)(scrollBodyRef.value).width);
  310. scrollBodySizeInfo.value = {
  311. scrollWidth: ((_a = scrollBodyRef.value) === null || _a === void 0 ? void 0 : _a.scrollWidth) || 0,
  312. clientWidth: ((_b = scrollBodyRef.value) === null || _b === void 0 ? void 0 : _b.clientWidth) || 0
  313. };
  314. });
  315. });
  316. (0, _vue.onUpdated)(() => {
  317. (0, _vue.nextTick)(() => {
  318. var _a, _b;
  319. const scrollWidth = ((_a = scrollBodyRef.value) === null || _a === void 0 ? void 0 : _a.scrollWidth) || 0;
  320. const clientWidth = ((_b = scrollBodyRef.value) === null || _b === void 0 ? void 0 : _b.clientWidth) || 0;
  321. if (scrollBodySizeInfo.value.scrollWidth !== scrollWidth || scrollBodySizeInfo.value.clientWidth !== clientWidth) {
  322. scrollBodySizeInfo.value = {
  323. scrollWidth,
  324. clientWidth
  325. };
  326. }
  327. });
  328. });
  329. (0, _vue.watchEffect)(() => {
  330. if (props.internalHooks === INTERNAL_HOOKS && props.internalRefs) {
  331. props.onUpdateInternalRefs({
  332. body: scrollBodyRef.value ? scrollBodyRef.value.$el || scrollBodyRef.value : null
  333. });
  334. }
  335. }, {
  336. flush: 'post'
  337. });
  338. // Table layout
  339. const mergedTableLayout = (0, _vue.computed)(() => {
  340. if (props.tableLayout) {
  341. return props.tableLayout;
  342. }
  343. // https://github.com/ant-design/ant-design/issues/25227
  344. // When scroll.x is max-content, no need to fix table layout
  345. // it's width should stretch out to fit content
  346. if (fixColumn.value) {
  347. return props.scroll.x === 'max-content' ? 'auto' : 'fixed';
  348. }
  349. if (fixHeader.value || stickyState.value.isSticky || flattenColumns.value.some(_ref5 => {
  350. let {
  351. ellipsis
  352. } = _ref5;
  353. return ellipsis;
  354. })) {
  355. return 'fixed';
  356. }
  357. return 'auto';
  358. });
  359. const emptyNode = () => {
  360. var _a;
  361. return hasData.value ? null : ((_a = slots.emptyText) === null || _a === void 0 ? void 0 : _a.call(slots)) || 'No Data';
  362. };
  363. (0, _TableContext.useProvideTable)((0, _vue.reactive)((0, _extends2.default)((0, _extends2.default)({}, (0, _vue.toRefs)((0, _reactivePick.reactivePick)(props, 'prefixCls', 'direction', 'transformCellText'))), {
  364. getComponent,
  365. scrollbarSize,
  366. fixedInfoList: (0, _vue.computed)(() => flattenColumns.value.map((_, colIndex) => (0, _fixUtil.getCellFixedInfo)(colIndex, colIndex, flattenColumns.value, stickyOffsets.value, props.direction))),
  367. isSticky: (0, _vue.computed)(() => stickyState.value.isSticky),
  368. summaryCollect
  369. })));
  370. (0, _BodyContext.useProvideBody)((0, _vue.reactive)((0, _extends2.default)((0, _extends2.default)({}, (0, _vue.toRefs)((0, _reactivePick.reactivePick)(props, 'rowClassName', 'expandedRowClassName', 'expandRowByClick', 'expandedRowRender', 'expandIconColumnIndex', 'indentSize'))), {
  371. columns,
  372. flattenColumns,
  373. tableLayout: mergedTableLayout,
  374. expandIcon: mergedExpandIcon,
  375. expandableType,
  376. onTriggerExpand
  377. })));
  378. (0, _ResizeContext.useProvideResize)({
  379. onColumnResize
  380. });
  381. (0, _ExpandedRowContext.useProvideExpandedRow)({
  382. componentWidth,
  383. fixHeader,
  384. fixColumn,
  385. horizonScroll
  386. });
  387. // Body
  388. const bodyTable = () => (0, _vue.createVNode)(_Body.default, {
  389. "data": mergedData.value,
  390. "measureColumnWidth": fixHeader.value || horizonScroll.value || stickyState.value.isSticky,
  391. "expandedKeys": mergedExpandedKeys.value,
  392. "rowExpandable": props.rowExpandable,
  393. "getRowKey": getRowKey.value,
  394. "customRow": props.customRow,
  395. "childrenColumnName": mergedChildrenColumnName.value
  396. }, {
  397. emptyNode
  398. });
  399. const bodyColGroup = () => (0, _vue.createVNode)(_ColGroup.default, {
  400. "colWidths": flattenColumns.value.map(_ref6 => {
  401. let {
  402. width
  403. } = _ref6;
  404. return width;
  405. }),
  406. "columns": flattenColumns.value
  407. }, null);
  408. return () => {
  409. var _a;
  410. const {
  411. prefixCls,
  412. scroll,
  413. tableLayout,
  414. direction,
  415. // Additional Part
  416. title = slots.title,
  417. footer = slots.footer,
  418. // Customize
  419. id,
  420. showHeader,
  421. customHeaderRow
  422. } = props;
  423. const {
  424. isSticky,
  425. offsetHeader,
  426. offsetSummary,
  427. offsetScroll,
  428. stickyClassName,
  429. container
  430. } = stickyState.value;
  431. const TableComponent = getComponent(['table'], 'table');
  432. const customizeScrollBody = getComponent(['body']);
  433. const summaryNode = (_a = slots.summary) === null || _a === void 0 ? void 0 : _a.call(slots, {
  434. pageData: mergedData.value
  435. });
  436. let groupTableNode = () => null;
  437. // Header props
  438. const headerProps = {
  439. colWidths: colWidths.value,
  440. columCount: flattenColumns.value.length,
  441. stickyOffsets: stickyOffsets.value,
  442. customHeaderRow,
  443. fixHeader: fixHeader.value,
  444. scroll
  445. };
  446. if (process.env.NODE_ENV !== 'production' && typeof customizeScrollBody === 'function' && hasData.value && !fixHeader.value) {
  447. (0, _warning.warning)(false, '`components.body` with render props is only work on `scroll.y`.');
  448. }
  449. if (fixHeader.value || isSticky) {
  450. // >>>>>> Fixed Header
  451. let bodyContent = () => null;
  452. if (typeof customizeScrollBody === 'function') {
  453. bodyContent = () => customizeScrollBody(mergedData.value, {
  454. scrollbarSize: scrollbarSize.value,
  455. ref: scrollBodyRef,
  456. onScroll
  457. });
  458. headerProps.colWidths = flattenColumns.value.map((_ref7, index) => {
  459. let {
  460. width
  461. } = _ref7;
  462. const colWidth = index === columns.value.length - 1 ? width - scrollbarSize.value : width;
  463. if (typeof colWidth === 'number' && !Number.isNaN(colWidth)) {
  464. return colWidth;
  465. }
  466. (0, _warning.warning)(false, 'When use `components.body` with render props. Each column should have a fixed `width` value.');
  467. return 0;
  468. });
  469. } else {
  470. bodyContent = () => (0, _vue.createVNode)("div", {
  471. "style": (0, _extends2.default)((0, _extends2.default)({}, scrollXStyle.value), scrollYStyle.value),
  472. "onScroll": onScroll,
  473. "ref": scrollBodyRef,
  474. "class": (0, _classNames.default)(`${prefixCls}-body`)
  475. }, [(0, _vue.createVNode)(TableComponent, {
  476. "style": (0, _extends2.default)((0, _extends2.default)({}, scrollTableStyle.value), {
  477. tableLayout: mergedTableLayout.value
  478. })
  479. }, {
  480. default: () => [bodyColGroup(), bodyTable(), !fixFooter.value && summaryNode && (0, _vue.createVNode)(_Footer.default, {
  481. "stickyOffsets": stickyOffsets.value,
  482. "flattenColumns": flattenColumns.value
  483. }, {
  484. default: () => [summaryNode]
  485. })]
  486. })]);
  487. }
  488. // Fixed holder share the props
  489. const fixedHolderProps = (0, _extends2.default)((0, _extends2.default)((0, _extends2.default)({
  490. noData: !mergedData.value.length,
  491. maxContentScroll: horizonScroll.value && scroll.x === 'max-content'
  492. }, headerProps), columnContext.value), {
  493. direction,
  494. stickyClassName,
  495. onScroll
  496. });
  497. groupTableNode = () => (0, _vue.createVNode)(_vue.Fragment, null, [showHeader !== false && (0, _vue.createVNode)(_FixedHolder.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, fixedHolderProps), {}, {
  498. "stickyTopOffset": offsetHeader,
  499. "class": `${prefixCls}-header`,
  500. "ref": scrollHeaderRef
  501. }), {
  502. default: fixedHolderPassProps => (0, _vue.createVNode)(_vue.Fragment, null, [(0, _vue.createVNode)(_Header.default, fixedHolderPassProps, null), fixFooter.value === 'top' && (0, _vue.createVNode)(_Footer.default, fixedHolderPassProps, {
  503. default: () => [summaryNode]
  504. })])
  505. }), bodyContent(), fixFooter.value && fixFooter.value !== 'top' && (0, _vue.createVNode)(_FixedHolder.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, fixedHolderProps), {}, {
  506. "stickyBottomOffset": offsetSummary,
  507. "class": `${prefixCls}-summary`,
  508. "ref": scrollSummaryRef
  509. }), {
  510. default: fixedHolderPassProps => (0, _vue.createVNode)(_Footer.default, fixedHolderPassProps, {
  511. default: () => [summaryNode]
  512. })
  513. }), isSticky && scrollBodyRef.value && (0, _vue.createVNode)(_stickyScrollBar.default, {
  514. "ref": stickyRef,
  515. "offsetScroll": offsetScroll,
  516. "scrollBodyRef": scrollBodyRef,
  517. "onScroll": onScroll,
  518. "container": container,
  519. "scrollBodySizeInfo": scrollBodySizeInfo.value
  520. }, null)]);
  521. } else {
  522. // >>>>>> Unique table
  523. groupTableNode = () => (0, _vue.createVNode)("div", {
  524. "style": (0, _extends2.default)((0, _extends2.default)({}, scrollXStyle.value), scrollYStyle.value),
  525. "class": (0, _classNames.default)(`${prefixCls}-content`),
  526. "onScroll": onScroll,
  527. "ref": scrollBodyRef
  528. }, [(0, _vue.createVNode)(TableComponent, {
  529. "style": (0, _extends2.default)((0, _extends2.default)({}, scrollTableStyle.value), {
  530. tableLayout: mergedTableLayout.value
  531. })
  532. }, {
  533. default: () => [bodyColGroup(), showHeader !== false && (0, _vue.createVNode)(_Header.default, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, headerProps), columnContext.value), null), bodyTable(), summaryNode && (0, _vue.createVNode)(_Footer.default, {
  534. "stickyOffsets": stickyOffsets.value,
  535. "flattenColumns": flattenColumns.value
  536. }, {
  537. default: () => [summaryNode]
  538. })]
  539. })]);
  540. }
  541. const ariaProps = (0, _pickAttrs.default)(attrs, {
  542. aria: true,
  543. data: true
  544. });
  545. const fullTable = () => (0, _vue.createVNode)("div", (0, _objectSpread2.default)((0, _objectSpread2.default)({}, ariaProps), {}, {
  546. "class": (0, _classNames.default)(prefixCls, {
  547. [`${prefixCls}-rtl`]: direction === 'rtl',
  548. [`${prefixCls}-ping-left`]: pingedLeft.value,
  549. [`${prefixCls}-ping-right`]: pingedRight.value,
  550. [`${prefixCls}-layout-fixed`]: tableLayout === 'fixed',
  551. [`${prefixCls}-fixed-header`]: fixHeader.value,
  552. /** No used but for compatible */
  553. [`${prefixCls}-fixed-column`]: fixColumn.value,
  554. [`${prefixCls}-scroll-horizontal`]: horizonScroll.value,
  555. [`${prefixCls}-has-fix-left`]: flattenColumns.value[0] && flattenColumns.value[0].fixed,
  556. [`${prefixCls}-has-fix-right`]: flattenColumns.value[columnCount.value - 1] && flattenColumns.value[columnCount.value - 1].fixed === 'right',
  557. [attrs.class]: attrs.class
  558. }),
  559. "style": attrs.style,
  560. "id": id,
  561. "ref": fullTableRef
  562. }), [title && (0, _vue.createVNode)(_Panel.default, {
  563. "class": `${prefixCls}-title`
  564. }, {
  565. default: () => [title(mergedData.value)]
  566. }), (0, _vue.createVNode)("div", {
  567. "class": `${prefixCls}-container`
  568. }, [groupTableNode()]), footer && (0, _vue.createVNode)(_Panel.default, {
  569. "class": `${prefixCls}-footer`
  570. }, {
  571. default: () => [footer(mergedData.value)]
  572. })]);
  573. if (horizonScroll.value) {
  574. return (0, _vue.createVNode)(_vcResizeObserver.default, {
  575. "onResize": onFullTableResize
  576. }, {
  577. default: fullTable
  578. });
  579. }
  580. return fullTable();
  581. };
  582. }
  583. });