index.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.default = void 0;
  7. var _vue = require("vue");
  8. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  9. var _ColGroup = _interopRequireDefault(require("../ColGroup"));
  10. var _TableContext = require("../context/TableContext");
  11. var _classNames = _interopRequireDefault(require("../../_util/classNames"));
  12. var _addEventListener = _interopRequireDefault(require("../../vc-util/Dom/addEventListener"));
  13. function useColumnWidth(colWidthsRef, columCountRef) {
  14. return (0, _vue.computed)(() => {
  15. const cloneColumns = [];
  16. const colWidths = colWidthsRef.value;
  17. const columCount = columCountRef.value;
  18. for (let i = 0; i < columCount; i += 1) {
  19. const val = colWidths[i];
  20. if (val !== undefined) {
  21. cloneColumns[i] = val;
  22. } else {
  23. return null;
  24. }
  25. }
  26. return cloneColumns;
  27. });
  28. }
  29. var _default = exports.default = (0, _vue.defineComponent)({
  30. name: 'FixedHolder',
  31. inheritAttrs: false,
  32. props: ['columns', 'flattenColumns', 'stickyOffsets', 'customHeaderRow', 'noData', 'maxContentScroll', 'colWidths', 'columCount', 'direction', 'fixHeader', 'stickyTopOffset', 'stickyBottomOffset', 'stickyClassName'],
  33. emits: ['scroll'],
  34. setup(props, _ref) {
  35. let {
  36. attrs,
  37. slots,
  38. emit
  39. } = _ref;
  40. const tableContext = (0, _TableContext.useInjectTable)();
  41. const combinationScrollBarSize = (0, _vue.computed)(() => tableContext.isSticky && !props.fixHeader ? 0 : tableContext.scrollbarSize);
  42. const scrollRef = (0, _vue.ref)();
  43. const onWheel = e => {
  44. const {
  45. currentTarget,
  46. deltaX
  47. } = e;
  48. if (deltaX) {
  49. emit('scroll', {
  50. currentTarget,
  51. scrollLeft: currentTarget.scrollLeft + deltaX
  52. });
  53. e.preventDefault();
  54. }
  55. };
  56. const wheelEvent = (0, _vue.ref)();
  57. (0, _vue.onMounted)(() => {
  58. (0, _vue.nextTick)(() => {
  59. wheelEvent.value = (0, _addEventListener.default)(scrollRef.value, 'wheel', onWheel);
  60. });
  61. });
  62. (0, _vue.onBeforeUnmount)(() => {
  63. var _a;
  64. (_a = wheelEvent.value) === null || _a === void 0 ? void 0 : _a.remove();
  65. });
  66. // Check if all flattenColumns has width
  67. const allFlattenColumnsWithWidth = (0, _vue.computed)(() => props.flattenColumns.every(column => column.width && column.width !== 0 && column.width !== '0px'));
  68. const columnsWithScrollbar = (0, _vue.ref)([]);
  69. const flattenColumnsWithScrollbar = (0, _vue.ref)([]);
  70. (0, _vue.watchEffect)(() => {
  71. // Add scrollbar column
  72. const lastColumn = props.flattenColumns[props.flattenColumns.length - 1];
  73. const ScrollBarColumn = {
  74. fixed: lastColumn ? lastColumn.fixed : null,
  75. scrollbar: true,
  76. customHeaderCell: () => ({
  77. class: `${tableContext.prefixCls}-cell-scrollbar`
  78. })
  79. };
  80. columnsWithScrollbar.value = combinationScrollBarSize.value ? [...props.columns, ScrollBarColumn] : props.columns;
  81. flattenColumnsWithScrollbar.value = combinationScrollBarSize.value ? [...props.flattenColumns, ScrollBarColumn] : props.flattenColumns;
  82. });
  83. // Calculate the sticky offsets
  84. const headerStickyOffsets = (0, _vue.computed)(() => {
  85. const {
  86. stickyOffsets,
  87. direction
  88. } = props;
  89. const {
  90. right,
  91. left
  92. } = stickyOffsets;
  93. return (0, _extends2.default)((0, _extends2.default)({}, stickyOffsets), {
  94. left: direction === 'rtl' ? [...left.map(width => width + combinationScrollBarSize.value), 0] : left,
  95. right: direction === 'rtl' ? right : [...right.map(width => width + combinationScrollBarSize.value), 0],
  96. isSticky: tableContext.isSticky
  97. });
  98. });
  99. const mergedColumnWidth = useColumnWidth((0, _vue.toRef)(props, 'colWidths'), (0, _vue.toRef)(props, 'columCount'));
  100. return () => {
  101. var _a;
  102. const {
  103. noData,
  104. columCount,
  105. stickyTopOffset,
  106. stickyBottomOffset,
  107. stickyClassName,
  108. maxContentScroll
  109. } = props;
  110. const {
  111. isSticky
  112. } = tableContext;
  113. return (0, _vue.createVNode)("div", {
  114. "style": (0, _extends2.default)({
  115. overflow: 'hidden'
  116. }, isSticky ? {
  117. top: `${stickyTopOffset}px`,
  118. bottom: `${stickyBottomOffset}px`
  119. } : {}),
  120. "ref": scrollRef,
  121. "class": (0, _classNames.default)(attrs.class, {
  122. [stickyClassName]: !!stickyClassName
  123. })
  124. }, [(0, _vue.createVNode)("table", {
  125. "style": {
  126. tableLayout: 'fixed',
  127. visibility: noData || mergedColumnWidth.value ? null : 'hidden'
  128. }
  129. }, [(!noData || !maxContentScroll || allFlattenColumnsWithWidth.value) && (0, _vue.createVNode)(_ColGroup.default, {
  130. "colWidths": mergedColumnWidth.value ? [...mergedColumnWidth.value, combinationScrollBarSize.value] : [],
  131. "columCount": columCount + 1,
  132. "columns": flattenColumnsWithScrollbar.value
  133. }, null), (_a = slots.default) === null || _a === void 0 ? void 0 : _a.call(slots, (0, _extends2.default)((0, _extends2.default)({}, props), {
  134. stickyOffsets: headerStickyOffsets.value,
  135. columns: columnsWithScrollbar.value,
  136. flattenColumns: flattenColumnsWithScrollbar.value
  137. }))])]);
  138. };
  139. }
  140. });