@koi-design/uxd-ui 13.2.11 → 13.2.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -98,7 +98,7 @@ const _sfc_main = defineComponent({
98
98
  });
99
99
  onUpdated(() => {
100
100
  nextTick(() => {
101
- handleResize();
101
+ debouncedHandleResize();
102
102
  });
103
103
  });
104
104
  onBeforeUnmount(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"Table.mjs","sources":["../../../../src/components/Table/Table.vue"],"sourcesContent":["<template>\n <ResizeObserver @resize=\"debouncedHandleResize\">\n <div :class=\"[`${prefixCls}-wrapper`]\" :style=\"{ width: typeof width === 'number' ? `${width}px` : width }\">\n <div\n v-if=\"showPagination && pagination && (pagination.position === 'top' || pagination.position === 'both')\"\n :class=\"{\n [`${prefixCls}-pagination`]: true,\n [`${prefixCls}-pagination-top`]: true,\n [`${prefixCls}-pagination-right`]: pagination && pagination.align === 'right'\n }\"\n >\n <Pagination v-bind=\"paginationOptions\" :total=\"computedPageTotal\" @change=\"handlePageChange\" @page-size-change=\"handlePageSizeChange\" />\n </div>\n <div\n :ref=\"saveRef('table')\"\n :class=\"[\n prefixCls,\n `${prefixCls}-${size}`,\n {\n [`${prefixCls}-${variant}`]: !isBorder,\n [`${prefixCls}-border`]: !!isBorder,\n [`${prefixCls}-radius`]: variant !== 'ghost' && !border && radius,\n [`${prefixCls}-empty`]: !data.length,\n [`${prefixCls}-without-column-header`]: !showHeader,\n [`${prefixCls}-fixed-header`]: !!maxHeight,\n [`${prefixCls}-layout-fixed`]: true,\n [`${prefixCls}-scroll-position-left`]: scrollPosition === 'left' || scrollPosition === 'both',\n [`${prefixCls}-scroll-position-right`]: scrollPosition === 'right' || scrollPosition === 'both',\n [`${prefixCls}-dragging`]: showResizeLine,\n [`${prefixCls}-stripe`]: stripe\n }\n ]\"\n >\n <div v-if=\"$slots.title\" :class=\"`${prefixCls}-title`\">\n <slot name=\"title\" />\n </div>\n <div :class=\"`${prefixCls}-content`\">\n <TableBox :columns=\"updatedColumns\" @head-scroll=\"handleBodyScrollX\" @body-scroll=\"handleBodyScroll\" />\n <div v-if=\"!currentDatas.length\" :class=\"`${prefixCls}-placeholder`\">\n <slot name=\"empty\">\n {{ emptyText }}\n </slot>\n </div>\n </div>\n <div v-show=\"showResizeLine\" :ref=\"saveRef('resizeLine')\" :class=\"`${prefixCls}-resize-line`\" />\n <Spin v-if=\"loadingType === 'spinner'\" fix :loading=\"loading\" />\n </div>\n <div v-if=\"$slots.footer\" :class=\"`${prefixCls}-footer`\">\n <slot name=\"footer\" />\n </div>\n <div\n v-if=\"showPagination && ((pagination && pagination.position !== 'top') || !pagination)\"\n :class=\"{\n [`${prefixCls}-pagination`]: true,\n [`${prefixCls}-pagination-bottom`]: true,\n [`${prefixCls}-pagination-right`]: pagination && pagination.align === 'right'\n }\"\n >\n <Pagination v-bind=\"paginationOptions\" :total=\"computedPageTotal\" @change=\"handlePageChange\" @page-size-change=\"handlePageSizeChange\" />\n </div>\n </div>\n </ResizeObserver>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, provide, reactive, toRefs, ref, onMounted, nextTick, onBeforeUnmount, onUpdated, watch } from 'vue';\nimport Spin from '@uxd-ui/components/Spin';\nimport Pagination from '@uxd-ui/components/Pagination';\nimport { debounce } from '../../utils/tools';\n// import Container from '../base/Container';\nimport TableBox from './TableBox.vue';\nimport useGlobalConfig from '../base/hooks/useGlobalConfig';\nimport ResizeObserver from '../base/ResizeObserver';\nimport useUpdateColumns from './hooks/useUpdateColumns';\nimport useUpdateDatas from './hooks/useUpdateDatas';\nimport useTableResize from './hooks/useTableResize';\nimport useExpander from './hooks/useExpander';\nimport useSelection from './hooks/useSelection';\nimport useDraggable from './hooks/useDraggable';\nimport useFilterSortPage from './hooks/useFilterSortPage';\nimport { tableProps, tableEmits, type SaveRef, type TableRefs, type TableColumn, type InnerColumn } from './Table.type';\n\nexport default defineComponent({\n name: 'UTable',\n components: {\n TableBox,\n Spin,\n Pagination,\n ResizeObserver\n },\n props: tableProps,\n emits: tableEmits,\n setup(props, { slots, emit }) {\n const { prefixCls, config: globalConfig } = useGlobalConfig('table');\n const showResizeLine = ref(false);\n const tableRefs = reactive({} as TableRefs);\n const saveRef: SaveRef = (key: string) => {\n return (el: any) => {\n tableRefs[key] = el;\n };\n };\n\n const locale = computed(() => {\n return { ...globalConfig.locale.table, ...props.locale };\n });\n\n const isBorder = computed(() => {\n const b = props.variant === 'border' || props.border;\n return b;\n });\n\n // ============ datas ===============\n const { updatedDatas } = useUpdateDatas(props);\n\n // ============= sort & fitler =============\n const {\n hasAction,\n hasSorters,\n hasFilters,\n isSortColumn,\n isAscend,\n isDescend,\n hasAscend,\n hasDescend,\n toggleSortOrder,\n setColumnFilter,\n currentDatas,\n paginationOptions,\n computedPageTotal,\n handlePageChange,\n handlePageSizeChange\n } = useFilterSortPage(props, updatedDatas, emit);\n\n // ================ draggable ====================\n const { setRowRefs, draggableColumn } = useDraggable(props, tableRefs);\n\n // ================ expander ====================\n const {\n expandedRowKeys,\n showChildrenRowKeys,\n handleExpandChange,\n isRowExpanded,\n expandedRowRender,\n isTreeTable,\n expandColumn,\n expandIconColumnIndex\n } = useExpander(props, slots, currentDatas, emit);\n\n const { selectionColumn } = useSelection(props, updatedDatas, currentDatas, prefixCls, locale);\n\n // ============ columns ===============\n const { updatedColumns, isColumnFixed, isLeftFixed, isRightFixed, leftColumns, rightColumns } = useUpdateColumns(props, slots, {\n draggableColumn,\n expandColumn,\n selectionColumn\n });\n\n // ============ resize ==============\n // #region\n const {\n sizesMap,\n handleResize,\n isScrollX,\n // fixedHeadRowsHeight,\n // fixedBodyRowsHeight,\n scrollPosition,\n // syncFixedTableRowHeight,\n setScrollPositionClass,\n resetScrollX,\n tableWidth,\n clearResizeTimer,\n setResizeWidth\n } = useTableResize(updatedColumns, tableRefs, prefixCls, isColumnFixed, props);\n\n const debouncedHandleResize = debounce(handleResize, 150);\n\n onMounted(() => {\n nextTick(() => {\n setTimeout(() => {\n handleResize();\n resetScrollX();\n }, 0);\n });\n });\n\n onUpdated(() => {\n nextTick(() => {\n handleResize();\n });\n });\n\n onBeforeUnmount(() => {\n if (debouncedHandleResize) {\n debouncedHandleResize.cancel();\n }\n clearResizeTimer();\n });\n // #endregion\n\n // ============ scroll ===============\n // #region\n const scrollable = computed(() => {\n return props.maxHeight || isScrollX.value || isColumnFixed.value;\n });\n\n let lastScrollLeft = 0;\n const handleBodyScrollX = (e: any) => {\n if (e.currentTarget !== e.target) {\n return;\n }\n\n const { target } = e;\n const { bodyTable, headTable } = tableRefs;\n\n if (target.scrollLeft !== lastScrollLeft && isScrollX.value) {\n if (target === (bodyTable as any).wrapRef && headTable) {\n (headTable as any).setScrollLeft(target.scrollLeft);\n } else if (target === (headTable as any)?.wrapRef && bodyTable) {\n (bodyTable as any).setScrollLeft(target.scrollLeft);\n }\n setScrollPositionClass();\n }\n lastScrollLeft = target.scrollLeft;\n };\n\n const handleBodyScroll = (e: any) => {\n handleBodyScrollX(e);\n };\n\n watch(\n () => props.data,\n (val) => {\n if (val.length === 0 && isScrollX.value) {\n nextTick(() => {\n resetScrollX();\n });\n }\n }\n );\n // #endregion\n // ============ empty ================\n const emptyText = computed(() => {\n return props.data.length ? locale.value.notFoundText : locale.value.noDataText;\n });\n\n // ===========row hover & event ================\n // #region\n const currentHoverKey = ref(null);\n const onRowMouseEnter = (data: Record<string, any>, index: number, e: Event) => {\n emit('row-mouseenter', data, index, e);\n };\n const onRowMouseLeave = (data: Record<string, any>, index: number, e: Event) => {\n emit('row-mouseleave', data, index, e);\n };\n const onRowClick = (data: Record<string, any>, index: number, e: Event) => {\n emit('row-click', data, index, e);\n };\n const onRowDoubleClick = (data: Record<string, any>, index: number, e: Event) => {\n emit('row-doubleclick', data, index, e);\n };\n const onRowContextMenu = (data: Record<string, any>, index: number, e: Event) => {\n emit('row-contextmenu', data, index, e);\n };\n // #endregion\n\n // ============= other event =================\n // #region\n const onHeaderCellClick = (column: TableColumn, e: Event) => {\n emit('header-click', column, e);\n };\n\n const handleColumnResize = (columnWidth: number, changeWidth: number, column: InnerColumn, event: Event) => {\n emit('column-resize', columnWidth, changeWidth, column, event);\n };\n // #endregion\n\n // ============= provide =================\n\n const { showHeader, maxHeight, expandIcon, rowClassName, indentSize, showSummary, disabledHover, expandIndent, headerSticky, loading } =\n toRefs(props);\n\n provide('tableContext', {\n prefixCls,\n locale,\n data: currentDatas,\n saveRef,\n tableRefs,\n showResizeLine,\n props: {\n showHeader,\n maxHeight,\n expandIcon,\n rowClassName,\n indentSize,\n emptyText,\n showSummary,\n disabledHover,\n expandIndent,\n headerSticky,\n loading\n },\n slots,\n expand: {\n expandedRowRender,\n expandedRowKeys,\n showChildrenRowKeys,\n isRowExpanded,\n expandIconColumnIndex,\n handleExpandChange,\n isTreeTable\n },\n size: {\n tableWidth,\n sizesMap,\n isScrollX,\n setResizeWidth,\n handleColumnResize,\n debouncedHandleResize\n },\n fixed: {\n isColumnFixed,\n currentHoverKey\n },\n draggable: {\n setRowRefs\n },\n rowEvents: {\n onRowMouseEnter,\n onRowMouseLeave,\n onRowClick,\n onRowDoubleClick,\n onRowContextMenu\n },\n headerEvents: {\n onHeaderCellClick\n },\n filterAndSorter: {\n hasAction,\n hasSorters,\n hasFilters,\n isSortColumn,\n isAscend,\n isDescend,\n hasAscend,\n hasDescend,\n toggleSortOrder,\n setColumnFilter\n },\n pagination: paginationOptions\n });\n return {\n prefixCls,\n saveRef,\n showResizeLine,\n updatedColumns,\n currentDatas,\n paginationOptions,\n computedPageTotal,\n isBorder,\n isLeftFixed,\n leftColumns,\n isRightFixed,\n rightColumns,\n scrollable,\n scrollPosition,\n handleBodyScroll,\n handleBodyScrollX,\n emptyText,\n debouncedHandleResize,\n handlePageChange,\n handlePageSizeChange\n };\n }\n});\n</script>\n"],"names":["Spin","Pagination","useFilterSortPage","_createBlock","_createElementVNode","_normalizeClass","_normalizeStyle","_createElementBlock","_createVNode","_mergeProps","_renderSlot"],"mappings":"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"}
1
+ {"version":3,"file":"Table.mjs","sources":["../../../../src/components/Table/Table.vue"],"sourcesContent":["<template>\n <ResizeObserver @resize=\"debouncedHandleResize\">\n <div :class=\"[`${prefixCls}-wrapper`]\" :style=\"{ width: typeof width === 'number' ? `${width}px` : width }\">\n <div\n v-if=\"showPagination && pagination && (pagination.position === 'top' || pagination.position === 'both')\"\n :class=\"{\n [`${prefixCls}-pagination`]: true,\n [`${prefixCls}-pagination-top`]: true,\n [`${prefixCls}-pagination-right`]: pagination && pagination.align === 'right'\n }\"\n >\n <Pagination v-bind=\"paginationOptions\" :total=\"computedPageTotal\" @change=\"handlePageChange\" @page-size-change=\"handlePageSizeChange\" />\n </div>\n <div\n :ref=\"saveRef('table')\"\n :class=\"[\n prefixCls,\n `${prefixCls}-${size}`,\n {\n [`${prefixCls}-${variant}`]: !isBorder,\n [`${prefixCls}-border`]: !!isBorder,\n [`${prefixCls}-radius`]: variant !== 'ghost' && !border && radius,\n [`${prefixCls}-empty`]: !data.length,\n [`${prefixCls}-without-column-header`]: !showHeader,\n [`${prefixCls}-fixed-header`]: !!maxHeight,\n [`${prefixCls}-layout-fixed`]: true,\n [`${prefixCls}-scroll-position-left`]: scrollPosition === 'left' || scrollPosition === 'both',\n [`${prefixCls}-scroll-position-right`]: scrollPosition === 'right' || scrollPosition === 'both',\n [`${prefixCls}-dragging`]: showResizeLine,\n [`${prefixCls}-stripe`]: stripe\n }\n ]\"\n >\n <div v-if=\"$slots.title\" :class=\"`${prefixCls}-title`\">\n <slot name=\"title\" />\n </div>\n <div :class=\"`${prefixCls}-content`\">\n <TableBox :columns=\"updatedColumns\" @head-scroll=\"handleBodyScrollX\" @body-scroll=\"handleBodyScroll\" />\n <div v-if=\"!currentDatas.length\" :class=\"`${prefixCls}-placeholder`\">\n <slot name=\"empty\">\n {{ emptyText }}\n </slot>\n </div>\n </div>\n <div v-show=\"showResizeLine\" :ref=\"saveRef('resizeLine')\" :class=\"`${prefixCls}-resize-line`\" />\n <Spin v-if=\"loadingType === 'spinner'\" fix :loading=\"loading\" />\n </div>\n <div v-if=\"$slots.footer\" :class=\"`${prefixCls}-footer`\">\n <slot name=\"footer\" />\n </div>\n <div\n v-if=\"showPagination && ((pagination && pagination.position !== 'top') || !pagination)\"\n :class=\"{\n [`${prefixCls}-pagination`]: true,\n [`${prefixCls}-pagination-bottom`]: true,\n [`${prefixCls}-pagination-right`]: pagination && pagination.align === 'right'\n }\"\n >\n <Pagination v-bind=\"paginationOptions\" :total=\"computedPageTotal\" @change=\"handlePageChange\" @page-size-change=\"handlePageSizeChange\" />\n </div>\n </div>\n </ResizeObserver>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, provide, reactive, toRefs, ref, onMounted, nextTick, onBeforeUnmount, onUpdated, watch } from 'vue';\nimport Spin from '@uxd-ui/components/Spin';\nimport Pagination from '@uxd-ui/components/Pagination';\nimport { debounce } from '../../utils/tools';\n// import Container from '../base/Container';\nimport TableBox from './TableBox.vue';\nimport useGlobalConfig from '../base/hooks/useGlobalConfig';\nimport ResizeObserver from '../base/ResizeObserver';\nimport useUpdateColumns from './hooks/useUpdateColumns';\nimport useUpdateDatas from './hooks/useUpdateDatas';\nimport useTableResize from './hooks/useTableResize';\nimport useExpander from './hooks/useExpander';\nimport useSelection from './hooks/useSelection';\nimport useDraggable from './hooks/useDraggable';\nimport useFilterSortPage from './hooks/useFilterSortPage';\nimport { tableProps, tableEmits, type SaveRef, type TableRefs, type TableColumn, type InnerColumn } from './Table.type';\n\nexport default defineComponent({\n name: 'UTable',\n components: {\n TableBox,\n Spin,\n Pagination,\n ResizeObserver\n },\n props: tableProps,\n emits: tableEmits,\n setup(props, { slots, emit }) {\n const { prefixCls, config: globalConfig } = useGlobalConfig('table');\n const showResizeLine = ref(false);\n const tableRefs = reactive({} as TableRefs);\n const saveRef: SaveRef = (key: string) => {\n return (el: any) => {\n tableRefs[key] = el;\n };\n };\n\n const locale = computed(() => {\n return { ...globalConfig.locale.table, ...props.locale };\n });\n\n const isBorder = computed(() => {\n const b = props.variant === 'border' || props.border;\n return b;\n });\n\n // ============ datas ===============\n const { updatedDatas } = useUpdateDatas(props);\n\n // ============= sort & fitler =============\n const {\n hasAction,\n hasSorters,\n hasFilters,\n isSortColumn,\n isAscend,\n isDescend,\n hasAscend,\n hasDescend,\n toggleSortOrder,\n setColumnFilter,\n currentDatas,\n paginationOptions,\n computedPageTotal,\n handlePageChange,\n handlePageSizeChange\n } = useFilterSortPage(props, updatedDatas, emit);\n\n // ================ draggable ====================\n const { setRowRefs, draggableColumn } = useDraggable(props, tableRefs);\n\n // ================ expander ====================\n const {\n expandedRowKeys,\n showChildrenRowKeys,\n handleExpandChange,\n isRowExpanded,\n expandedRowRender,\n isTreeTable,\n expandColumn,\n expandIconColumnIndex\n } = useExpander(props, slots, currentDatas, emit);\n\n const { selectionColumn } = useSelection(props, updatedDatas, currentDatas, prefixCls, locale);\n\n // ============ columns ===============\n const { updatedColumns, isColumnFixed, isLeftFixed, isRightFixed, leftColumns, rightColumns } = useUpdateColumns(props, slots, {\n draggableColumn,\n expandColumn,\n selectionColumn\n });\n\n // ============ resize ==============\n // #region\n const {\n sizesMap,\n handleResize,\n isScrollX,\n // fixedHeadRowsHeight,\n // fixedBodyRowsHeight,\n scrollPosition,\n // syncFixedTableRowHeight,\n setScrollPositionClass,\n resetScrollX,\n tableWidth,\n clearResizeTimer,\n setResizeWidth\n } = useTableResize(updatedColumns, tableRefs, prefixCls, isColumnFixed, props);\n\n const debouncedHandleResize = debounce(handleResize, 150);\n\n onMounted(() => {\n nextTick(() => {\n setTimeout(() => {\n handleResize();\n resetScrollX();\n }, 0);\n });\n });\n\n // Debounce onUpdated resize to avoid tight feedback loops:\n // handleResize mutating sizesMap -> re-render -> onUpdated -> handleResize.\n // Actual no-op short-circuit lives in useTableResize.syncColumnsWidth.\n onUpdated(() => {\n nextTick(() => {\n debouncedHandleResize();\n });\n });\n\n onBeforeUnmount(() => {\n if (debouncedHandleResize) {\n debouncedHandleResize.cancel();\n }\n clearResizeTimer();\n });\n // #endregion\n\n // ============ scroll ===============\n // #region\n const scrollable = computed(() => {\n return props.maxHeight || isScrollX.value || isColumnFixed.value;\n });\n\n let lastScrollLeft = 0;\n const handleBodyScrollX = (e: any) => {\n if (e.currentTarget !== e.target) {\n return;\n }\n\n const { target } = e;\n const { bodyTable, headTable } = tableRefs;\n\n if (target.scrollLeft !== lastScrollLeft && isScrollX.value) {\n if (target === (bodyTable as any).wrapRef && headTable) {\n (headTable as any).setScrollLeft(target.scrollLeft);\n } else if (target === (headTable as any)?.wrapRef && bodyTable) {\n (bodyTable as any).setScrollLeft(target.scrollLeft);\n }\n setScrollPositionClass();\n }\n lastScrollLeft = target.scrollLeft;\n };\n\n const handleBodyScroll = (e: any) => {\n handleBodyScrollX(e);\n };\n\n watch(\n () => props.data,\n (val) => {\n if (val.length === 0 && isScrollX.value) {\n nextTick(() => {\n resetScrollX();\n });\n }\n }\n );\n // #endregion\n // ============ empty ================\n const emptyText = computed(() => {\n return props.data.length ? locale.value.notFoundText : locale.value.noDataText;\n });\n\n // ===========row hover & event ================\n // #region\n const currentHoverKey = ref(null);\n const onRowMouseEnter = (data: Record<string, any>, index: number, e: Event) => {\n emit('row-mouseenter', data, index, e);\n };\n const onRowMouseLeave = (data: Record<string, any>, index: number, e: Event) => {\n emit('row-mouseleave', data, index, e);\n };\n const onRowClick = (data: Record<string, any>, index: number, e: Event) => {\n emit('row-click', data, index, e);\n };\n const onRowDoubleClick = (data: Record<string, any>, index: number, e: Event) => {\n emit('row-doubleclick', data, index, e);\n };\n const onRowContextMenu = (data: Record<string, any>, index: number, e: Event) => {\n emit('row-contextmenu', data, index, e);\n };\n // #endregion\n\n // ============= other event =================\n // #region\n const onHeaderCellClick = (column: TableColumn, e: Event) => {\n emit('header-click', column, e);\n };\n\n const handleColumnResize = (columnWidth: number, changeWidth: number, column: InnerColumn, event: Event) => {\n emit('column-resize', columnWidth, changeWidth, column, event);\n };\n // #endregion\n\n // ============= provide =================\n\n const { showHeader, maxHeight, expandIcon, rowClassName, indentSize, showSummary, disabledHover, expandIndent, headerSticky, loading } =\n toRefs(props);\n\n provide('tableContext', {\n prefixCls,\n locale,\n data: currentDatas,\n saveRef,\n tableRefs,\n showResizeLine,\n props: {\n showHeader,\n maxHeight,\n expandIcon,\n rowClassName,\n indentSize,\n emptyText,\n showSummary,\n disabledHover,\n expandIndent,\n headerSticky,\n loading\n },\n slots,\n expand: {\n expandedRowRender,\n expandedRowKeys,\n showChildrenRowKeys,\n isRowExpanded,\n expandIconColumnIndex,\n handleExpandChange,\n isTreeTable\n },\n size: {\n tableWidth,\n sizesMap,\n isScrollX,\n setResizeWidth,\n handleColumnResize,\n debouncedHandleResize\n },\n fixed: {\n isColumnFixed,\n currentHoverKey\n },\n draggable: {\n setRowRefs\n },\n rowEvents: {\n onRowMouseEnter,\n onRowMouseLeave,\n onRowClick,\n onRowDoubleClick,\n onRowContextMenu\n },\n headerEvents: {\n onHeaderCellClick\n },\n filterAndSorter: {\n hasAction,\n hasSorters,\n hasFilters,\n isSortColumn,\n isAscend,\n isDescend,\n hasAscend,\n hasDescend,\n toggleSortOrder,\n setColumnFilter\n },\n pagination: paginationOptions\n });\n return {\n prefixCls,\n saveRef,\n showResizeLine,\n updatedColumns,\n currentDatas,\n paginationOptions,\n computedPageTotal,\n isBorder,\n isLeftFixed,\n leftColumns,\n isRightFixed,\n rightColumns,\n scrollable,\n scrollPosition,\n handleBodyScroll,\n handleBodyScrollX,\n emptyText,\n debouncedHandleResize,\n handlePageChange,\n handlePageSizeChange\n };\n }\n});\n</script>\n"],"names":["Spin","Pagination","useFilterSortPage","_createBlock","_createElementVNode","_normalizeClass","_normalizeStyle","_createElementBlock","_createVNode","_mergeProps","_renderSlot"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { reactive, ref, computed } from 'vue';
2
+ import { shallowequal } from '../../../utils/tools.mjs';
2
3
  import { getLeafColumns, getColumnKey, getMinWidth } from '../utils.mjs';
3
4
 
4
5
  function getWidth(width, tableWidth) {
@@ -15,20 +16,35 @@ function getWidth(width, tableWidth) {
15
16
  }
16
17
  return _width;
17
18
  }
19
+ function applySizesMap(sizesMap, nextSizesMap) {
20
+ Object.keys(sizesMap).forEach((key) => {
21
+ if (!(key in nextSizesMap)) {
22
+ delete sizesMap[key];
23
+ }
24
+ });
25
+ Object.keys(nextSizesMap).forEach((key) => {
26
+ if (sizesMap[key] !== nextSizesMap[key]) {
27
+ sizesMap[key] = nextSizesMap[key];
28
+ }
29
+ });
30
+ }
18
31
  function useTableResize(updatedColumns, tableRefs, prefixCls, isColumnFixed, props) {
19
32
  const sizesMap = reactive({});
20
33
  const tableWidth = ref(void 0);
34
+ let lastWrapWidth;
35
+ const WRAP_WIDTH_TOLERANCE = 1;
21
36
  const syncColumnsWidth = () => {
22
37
  const { bodyTable } = tableRefs;
23
38
  if (!bodyTable || bodyTable.getWidth() === void 0) {
24
- return;
39
+ return false;
40
+ }
41
+ let wrapWidth = bodyTable.getWidth();
42
+ if (lastWrapWidth !== void 0 && Math.abs(wrapWidth - lastWrapWidth) <= WRAP_WIDTH_TOLERANCE) {
43
+ wrapWidth = lastWrapWidth;
25
44
  }
26
- const wrapWidth = bodyTable.getWidth();
27
45
  const columns = getLeafColumns(updatedColumns.value);
28
46
  let usedWidth = 0;
29
- Object.keys(sizesMap).forEach((key) => {
30
- delete sizesMap[key];
31
- });
47
+ const nextSizesMap = {};
32
48
  const minWidthColumns = [];
33
49
  const maxWidthColumns = [];
34
50
  const nothingColumns = [];
@@ -37,15 +53,15 @@ function useTableResize(updatedColumns, tableRefs, prefixCls, isColumnFixed, pro
37
53
  if (c.width) {
38
54
  const _width = getWidth(c.width, wrapWidth);
39
55
  usedWidth += _width;
40
- sizesMap[colKey] = _width;
56
+ nextSizesMap[colKey] = _width;
41
57
  } else if (c.minWidth) {
42
58
  const _width = getWidth(c.minWidth, wrapWidth);
43
59
  usedWidth += _width;
44
- sizesMap[colKey] = _width;
60
+ nextSizesMap[colKey] = _width;
45
61
  minWidthColumns.push(c);
46
62
  } else {
47
63
  const minWidth = getMinWidth(c);
48
- sizesMap[colKey] = minWidth;
64
+ nextSizesMap[colKey] = minWidth;
49
65
  usedWidth += minWidth;
50
66
  if (c.maxWidth) {
51
67
  maxWidthColumns.push(c);
@@ -61,10 +77,10 @@ function useTableResize(updatedColumns, tableRefs, prefixCls, isColumnFixed, pro
61
77
  maxWidthColumns.forEach((mc) => {
62
78
  avgWidth = Math.floor(unUsedWidth / length);
63
79
  if (getWidth(mc.maxWidth, wrapWidth) < avgWidth) {
64
- sizesMap[mc.key] = getWidth(mc.maxWidth, wrapWidth);
80
+ nextSizesMap[mc.key] = getWidth(mc.maxWidth, wrapWidth);
65
81
  unUsedWidth -= getWidth(mc.maxWidth, wrapWidth) - getMinWidth(mc);
66
82
  } else {
67
- sizesMap[mc.key] += avgWidth;
83
+ nextSizesMap[mc.key] += avgWidth;
68
84
  unUsedWidth -= avgWidth;
69
85
  }
70
86
  length -= 1;
@@ -73,25 +89,32 @@ function useTableResize(updatedColumns, tableRefs, prefixCls, isColumnFixed, pro
73
89
  if (avgWidth > 50 || nothingColumns.length === 0) {
74
90
  [...minWidthColumns, ...nothingColumns].forEach((c, i) => {
75
91
  if (i < length - 1) {
76
- sizesMap[c.key] += avgWidth;
92
+ nextSizesMap[c.key] += avgWidth;
77
93
  unUsedWidth -= avgWidth;
78
94
  } else {
79
- sizesMap[c.key] += unUsedWidth;
95
+ nextSizesMap[c.key] += unUsedWidth;
80
96
  }
81
97
  });
82
98
  } else {
83
99
  avgWidth = Math.floor(unUsedWidth / nothingColumns.length);
84
100
  nothingColumns.forEach((c, i) => {
85
101
  if (i < nothingColumns.length - 1) {
86
- sizesMap[c.key] += avgWidth;
102
+ nextSizesMap[c.key] += avgWidth;
87
103
  unUsedWidth -= avgWidth;
88
104
  } else {
89
- sizesMap[c.key] += unUsedWidth;
105
+ nextSizesMap[c.key] += unUsedWidth;
90
106
  }
91
107
  });
92
108
  }
93
109
  }
94
- tableWidth.value = Object.keys(sizesMap).reduce((sum, key) => sum + sizesMap[key], 0);
110
+ const nextTableWidth = Object.keys(nextSizesMap).reduce((sum, key) => sum + nextSizesMap[key], 0);
111
+ lastWrapWidth = wrapWidth;
112
+ if (shallowequal(sizesMap, nextSizesMap) && tableWidth.value === nextTableWidth) {
113
+ return false;
114
+ }
115
+ applySizesMap(sizesMap, nextSizesMap);
116
+ tableWidth.value = nextTableWidth;
117
+ return true;
95
118
  };
96
119
  let syncHeightTimer = null;
97
120
  let updateBodyTableTimer = null;
@@ -105,20 +128,23 @@ function useTableResize(updatedColumns, tableRefs, prefixCls, isColumnFixed, pro
105
128
  if (!bodyDom) {
106
129
  return;
107
130
  }
108
- const scrollToLeft = bodyDom.scrollLeft === 0;
109
- const scrollToRight = bodyDom.scrollLeft + 1 >= bodyDom.children[0].getBoundingClientRect().width - bodyDom.getBoundingClientRect().width;
131
+ const { scrollLeft, scrollWidth, clientWidth } = bodyDom;
132
+ const scrollToLeft = scrollLeft <= 0;
133
+ const scrollToRight = scrollLeft + 1 >= scrollWidth - clientWidth;
134
+ let nextPosition = "middle";
110
135
  if (scrollToLeft && scrollToRight) {
111
- scrollPosition.value = "both";
136
+ nextPosition = "both";
112
137
  } else if (scrollToLeft) {
113
- scrollPosition.value = "left";
138
+ nextPosition = "left";
114
139
  } else if (scrollToRight) {
115
- scrollPosition.value = "right";
116
- } else {
117
- scrollPosition.value = "middle";
140
+ nextPosition = "right";
141
+ }
142
+ if (scrollPosition.value !== nextPosition) {
143
+ scrollPosition.value = nextPosition;
118
144
  }
119
145
  };
120
146
  const handleResize = () => {
121
- syncColumnsWidth();
147
+ const changed = syncColumnsWidth();
122
148
  if (isColumnFixed.value) {
123
149
  if (syncHeightTimer) {
124
150
  clearTimeout(syncHeightTimer);
@@ -128,6 +154,9 @@ function useTableResize(updatedColumns, tableRefs, prefixCls, isColumnFixed, pro
128
154
  setScrollPositionClass();
129
155
  }, 0);
130
156
  }
157
+ if (!changed) {
158
+ return;
159
+ }
131
160
  if (updateBodyTableTimer) {
132
161
  clearTimeout(updateBodyTableTimer);
133
162
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useTableResize.mjs","sources":["../../../../../src/components/Table/hooks/useTableResize.ts"],"sourcesContent":["import { computed, reactive, ref } from 'vue';\nimport type { ComputedRef, Ref } from 'vue';\nimport { getLeafColumns, getColumnKey, getMinWidth } from '../utils';\n// import { shallowequal } from '../../../utils/tools';\nimport type { InnerColumn, TableProps, TableRefs } from '../Table.type';\n\nexport function getWidth(width: string | number, tableWidth: number) {\n let _width = 0;\n if (typeof width === 'number') {\n _width = width;\n } else if (/^\\d*px$/.test(width)) {\n _width = Number(width.replace('px', ''));\n } else if (/^[\\d.]*%$/.test(width)) {\n const percent = Number(width.replace('%', ''));\n if (!Number.isNaN(percent)) {\n _width = Math.floor((percent / 100) * tableWidth);\n }\n }\n return _width;\n}\nexport default function useTableResize(\n updatedColumns: Ref<InnerColumn[]>,\n tableRefs: TableRefs,\n prefixCls: Ref<string>,\n isColumnFixed: ComputedRef<boolean>,\n props: TableProps\n) {\n const sizesMap = reactive({} as Record<string, number>);\n const tableWidth = ref<number | undefined>(undefined);\n\n const syncColumnsWidth = () => {\n const { bodyTable } = tableRefs;\n if (!bodyTable || (bodyTable as any).getWidth() === undefined) {\n return;\n }\n // const wrapWidth = props.border ? bodyTable.clientWidth - 1 : bodyTable.clientWidth;\n const wrapWidth = (bodyTable as any).getWidth();\n\n const columns = getLeafColumns(updatedColumns.value);\n let usedWidth = 0;\n // clear the sizesMap.\n Object.keys(sizesMap).forEach((key) => {\n delete sizesMap[key];\n });\n const minWidthColumns: InnerColumn[] = [];\n const maxWidthColumns: InnerColumn[] = [];\n const nothingColumns: InnerColumn[] = [];\n columns.forEach((c) => {\n const colKey = getColumnKey(c);\n if (c.width) {\n const _width = getWidth(c.width, wrapWidth);\n usedWidth += _width;\n sizesMap[colKey] = _width;\n } else if (c.minWidth) {\n const _width = getWidth(c.minWidth, wrapWidth);\n usedWidth += _width;\n sizesMap[colKey] = _width;\n minWidthColumns.push(c);\n } else {\n const minWidth = getMinWidth(c);\n sizesMap[colKey] = minWidth;\n usedWidth += minWidth;\n if (c.maxWidth) {\n maxWidthColumns.push(c);\n } else {\n nothingColumns.push(c);\n }\n }\n });\n let unUsedWidth = wrapWidth - usedWidth;\n let length = minWidthColumns.length + maxWidthColumns.length + nothingColumns.length;\n if (unUsedWidth > 0 && length > 0) {\n let avgWidth: number;\n maxWidthColumns.forEach((mc) => {\n avgWidth = Math.floor(unUsedWidth / length);\n if (getWidth(mc.maxWidth as number, wrapWidth) < avgWidth) {\n sizesMap[mc.key] = getWidth(mc.maxWidth as number, wrapWidth);\n unUsedWidth -= getWidth(mc.maxWidth as number, wrapWidth) - getMinWidth(mc);\n } else {\n sizesMap[mc.key] += avgWidth;\n unUsedWidth -= avgWidth;\n }\n length -= 1;\n });\n avgWidth = Math.floor(unUsedWidth / length);\n if (avgWidth > 50 || nothingColumns.length === 0) {\n [...minWidthColumns, ...nothingColumns].forEach((c, i) => {\n if (i < length - 1) {\n sizesMap[c.key] += avgWidth;\n unUsedWidth -= avgWidth;\n } else {\n sizesMap[c.key] += unUsedWidth;\n }\n });\n } else {\n avgWidth = Math.floor(unUsedWidth / nothingColumns.length);\n nothingColumns.forEach((c, i) => {\n if (i < nothingColumns.length - 1) {\n sizesMap[c.key] += avgWidth;\n unUsedWidth -= avgWidth;\n } else {\n sizesMap[c.key] += unUsedWidth;\n }\n });\n }\n }\n tableWidth.value = Object.keys(sizesMap).reduce((sum, key) => sum + sizesMap[key], 0);\n };\n\n let syncHeightTimer: ReturnType<typeof setTimeout> | null = null;\n let updateBodyTableTimer: ReturnType<typeof setTimeout> | null = null;\n const scrollPosition = ref('left');\n\n const setScrollPositionClass = () => {\n const { bodyTable } = tableRefs;\n if (!bodyTable) {\n return;\n }\n const bodyDom = (bodyTable as any).wrapRef;\n if (!bodyDom) {\n return;\n }\n\n const scrollToLeft = bodyDom.scrollLeft === 0;\n const scrollToRight = bodyDom.scrollLeft + 1 >= bodyDom.children[0].getBoundingClientRect().width - bodyDom.getBoundingClientRect().width;\n if (scrollToLeft && scrollToRight) {\n scrollPosition.value = 'both';\n } else if (scrollToLeft) {\n scrollPosition.value = 'left';\n } else if (scrollToRight) {\n scrollPosition.value = 'right';\n } else {\n scrollPosition.value = 'middle';\n }\n };\n const handleResize = () => {\n syncColumnsWidth();\n\n if (isColumnFixed.value) {\n if (syncHeightTimer) {\n clearTimeout(syncHeightTimer);\n }\n syncHeightTimer = setTimeout(() => {\n syncHeightTimer = null;\n setScrollPositionClass();\n }, 0);\n }\n if (updateBodyTableTimer) {\n clearTimeout(updateBodyTableTimer);\n }\n updateBodyTableTimer = setTimeout(() => {\n updateBodyTableTimer = null;\n const bt = tableRefs.bodyTable as any;\n if (bt?.update) {\n bt.update();\n }\n }, 0);\n };\n\n const setResizeWidth = (column: InnerColumn, width: number) => {\n const columns = getLeafColumns(updatedColumns.value);\n const _column = columns.find((c) => c === column || getColumnKey(c) === getColumnKey(column));\n if (_column) {\n _column.width = width;\n handleResize();\n }\n };\n const isScrollX = computed(() => {\n const { table } = tableRefs;\n if (table) {\n const wrapWidth = props.border ? table.offsetWidth - 1 : table.offsetWidth;\n return tableWidth.value && tableWidth.value > wrapWidth;\n }\n return false;\n });\n\n const resetScrollX = () => {\n const { bodyTable, headTable } = tableRefs;\n if (bodyTable) {\n (bodyTable as any).setScrollLeft(0);\n }\n if (headTable) {\n (headTable as any).setScrollLeft(0);\n }\n };\n const clearResizeTimer = () => {\n if (syncHeightTimer) {\n clearTimeout(syncHeightTimer);\n syncHeightTimer = null;\n }\n if (updateBodyTableTimer) {\n clearTimeout(updateBodyTableTimer);\n updateBodyTableTimer = null;\n }\n };\n return {\n sizesMap,\n tableWidth,\n isScrollX,\n scrollPosition,\n handleResize,\n setScrollPositionClass,\n resetScrollX,\n clearResizeTimer,\n setResizeWidth\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useTableResize.mjs","sources":["../../../../../src/components/Table/hooks/useTableResize.ts"],"sourcesContent":["import { computed, reactive, ref } from 'vue';\nimport type { ComputedRef, Ref } from 'vue';\nimport { shallowequal } from '../../../utils/tools';\nimport { getLeafColumns, getColumnKey, getMinWidth } from '../utils';\nimport type { InnerColumn, TableProps, TableRefs } from '../Table.type';\n\nexport function getWidth(width: string | number, tableWidth: number) {\n let _width = 0;\n if (typeof width === 'number') {\n _width = width;\n } else if (/^\\d*px$/.test(width)) {\n _width = Number(width.replace('px', ''));\n } else if (/^[\\d.]*%$/.test(width)) {\n const percent = Number(width.replace('%', ''));\n if (!Number.isNaN(percent)) {\n _width = Math.floor((percent / 100) * tableWidth);\n }\n }\n return _width;\n}\n\nfunction applySizesMap(sizesMap: Record<string, number>, nextSizesMap: Record<string, number>) {\n Object.keys(sizesMap).forEach((key) => {\n if (!(key in nextSizesMap)) {\n delete sizesMap[key];\n }\n });\n Object.keys(nextSizesMap).forEach((key) => {\n if (sizesMap[key] !== nextSizesMap[key]) {\n sizesMap[key] = nextSizesMap[key];\n }\n });\n}\n\nexport default function useTableResize(\n updatedColumns: Ref<InnerColumn[]>,\n tableRefs: TableRefs,\n prefixCls: Ref<string>,\n isColumnFixed: ComputedRef<boolean>,\n props: TableProps\n) {\n const sizesMap = reactive({} as Record<string, number>);\n const tableWidth = ref<number | undefined>(undefined);\n let lastWrapWidth: number | undefined;\n // Ignore 1px wrap width flicker from subpixel / scrollbar edge cases.\n const WRAP_WIDTH_TOLERANCE = 1;\n\n const syncColumnsWidth = (): boolean => {\n const { bodyTable } = tableRefs;\n if (!bodyTable || (bodyTable as any).getWidth() === undefined) {\n return false;\n }\n let wrapWidth = (bodyTable as any).getWidth() as number;\n if (lastWrapWidth !== undefined && Math.abs(wrapWidth - lastWrapWidth) <= WRAP_WIDTH_TOLERANCE) {\n wrapWidth = lastWrapWidth;\n }\n\n const columns = getLeafColumns(updatedColumns.value);\n let usedWidth = 0;\n const nextSizesMap: Record<string, number> = {};\n const minWidthColumns: InnerColumn[] = [];\n const maxWidthColumns: InnerColumn[] = [];\n const nothingColumns: InnerColumn[] = [];\n columns.forEach((c) => {\n const colKey = getColumnKey(c);\n if (c.width) {\n const _width = getWidth(c.width, wrapWidth);\n usedWidth += _width;\n nextSizesMap[colKey] = _width;\n } else if (c.minWidth) {\n const _width = getWidth(c.minWidth, wrapWidth);\n usedWidth += _width;\n nextSizesMap[colKey] = _width;\n minWidthColumns.push(c);\n } else {\n const minWidth = getMinWidth(c);\n nextSizesMap[colKey] = minWidth;\n usedWidth += minWidth;\n if (c.maxWidth) {\n maxWidthColumns.push(c);\n } else {\n nothingColumns.push(c);\n }\n }\n });\n let unUsedWidth = wrapWidth - usedWidth;\n let length = minWidthColumns.length + maxWidthColumns.length + nothingColumns.length;\n if (unUsedWidth > 0 && length > 0) {\n let avgWidth: number;\n maxWidthColumns.forEach((mc) => {\n avgWidth = Math.floor(unUsedWidth / length);\n if (getWidth(mc.maxWidth as number, wrapWidth) < avgWidth) {\n nextSizesMap[mc.key] = getWidth(mc.maxWidth as number, wrapWidth);\n unUsedWidth -= getWidth(mc.maxWidth as number, wrapWidth) - getMinWidth(mc);\n } else {\n nextSizesMap[mc.key] += avgWidth;\n unUsedWidth -= avgWidth;\n }\n length -= 1;\n });\n avgWidth = Math.floor(unUsedWidth / length);\n if (avgWidth > 50 || nothingColumns.length === 0) {\n [...minWidthColumns, ...nothingColumns].forEach((c, i) => {\n if (i < length - 1) {\n nextSizesMap[c.key] += avgWidth;\n unUsedWidth -= avgWidth;\n } else {\n nextSizesMap[c.key] += unUsedWidth;\n }\n });\n } else {\n avgWidth = Math.floor(unUsedWidth / nothingColumns.length);\n nothingColumns.forEach((c, i) => {\n if (i < nothingColumns.length - 1) {\n nextSizesMap[c.key] += avgWidth;\n unUsedWidth -= avgWidth;\n } else {\n nextSizesMap[c.key] += unUsedWidth;\n }\n });\n }\n }\n const nextTableWidth = Object.keys(nextSizesMap).reduce((sum, key) => sum + nextSizesMap[key], 0);\n lastWrapWidth = wrapWidth;\n\n if (shallowequal(sizesMap, nextSizesMap) && tableWidth.value === nextTableWidth) {\n return false;\n }\n\n applySizesMap(sizesMap, nextSizesMap);\n tableWidth.value = nextTableWidth;\n return true;\n };\n\n let syncHeightTimer: ReturnType<typeof setTimeout> | null = null;\n let updateBodyTableTimer: ReturnType<typeof setTimeout> | null = null;\n const scrollPosition = ref('left');\n\n const setScrollPositionClass = () => {\n const { bodyTable } = tableRefs;\n if (!bodyTable) {\n return;\n }\n const bodyDom = (bodyTable as any).wrapRef as HTMLElement | undefined;\n if (!bodyDom) {\n return;\n }\n\n // Prefer scrollWidth/clientWidth over getBoundingClientRect to avoid subpixel flicker\n // flipping fixed-column shadow classes (left/right/both).\n const { scrollLeft, scrollWidth, clientWidth } = bodyDom;\n const scrollToLeft = scrollLeft <= 0;\n const scrollToRight = scrollLeft + 1 >= scrollWidth - clientWidth;\n let nextPosition = 'middle';\n if (scrollToLeft && scrollToRight) {\n nextPosition = 'both';\n } else if (scrollToLeft) {\n nextPosition = 'left';\n } else if (scrollToRight) {\n nextPosition = 'right';\n }\n if (scrollPosition.value !== nextPosition) {\n scrollPosition.value = nextPosition;\n }\n };\n const handleResize = () => {\n const changed = syncColumnsWidth();\n\n if (isColumnFixed.value) {\n if (syncHeightTimer) {\n clearTimeout(syncHeightTimer);\n }\n syncHeightTimer = setTimeout(() => {\n syncHeightTimer = null;\n setScrollPositionClass();\n }, 0);\n }\n // Skip scrollbar metric refresh when column sizes did not change, to avoid\n // onUpdated -> handleResize feedback loops that cause layout jitter.\n if (!changed) {\n return;\n }\n if (updateBodyTableTimer) {\n clearTimeout(updateBodyTableTimer);\n }\n updateBodyTableTimer = setTimeout(() => {\n updateBodyTableTimer = null;\n const bt = tableRefs.bodyTable as any;\n if (bt?.update) {\n bt.update();\n }\n }, 0);\n };\n\n const setResizeWidth = (column: InnerColumn, width: number) => {\n const columns = getLeafColumns(updatedColumns.value);\n const _column = columns.find((c) => c === column || getColumnKey(c) === getColumnKey(column));\n if (_column) {\n _column.width = width;\n handleResize();\n }\n };\n const isScrollX = computed(() => {\n const { table } = tableRefs;\n if (table) {\n const wrapWidth = props.border ? table.offsetWidth - 1 : table.offsetWidth;\n return tableWidth.value && tableWidth.value > wrapWidth;\n }\n return false;\n });\n\n const resetScrollX = () => {\n const { bodyTable, headTable } = tableRefs;\n if (bodyTable) {\n (bodyTable as any).setScrollLeft(0);\n }\n if (headTable) {\n (headTable as any).setScrollLeft(0);\n }\n };\n const clearResizeTimer = () => {\n if (syncHeightTimer) {\n clearTimeout(syncHeightTimer);\n syncHeightTimer = null;\n }\n if (updateBodyTableTimer) {\n clearTimeout(updateBodyTableTimer);\n updateBodyTableTimer = null;\n }\n };\n return {\n sizesMap,\n tableWidth,\n isScrollX,\n scrollPosition,\n handleResize,\n setScrollPositionClass,\n resetScrollX,\n clearResizeTimer,\n setResizeWidth\n };\n}\n"],"names":[],"mappings":"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"}
@@ -102,7 +102,7 @@ const _sfc_main = vue.defineComponent({
102
102
  });
103
103
  vue.onUpdated(() => {
104
104
  vue.nextTick(() => {
105
- handleResize();
105
+ debouncedHandleResize();
106
106
  });
107
107
  });
108
108
  vue.onBeforeUnmount(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"Table.js","sources":["../../../../src/components/Table/Table.vue"],"sourcesContent":["<template>\n <ResizeObserver @resize=\"debouncedHandleResize\">\n <div :class=\"[`${prefixCls}-wrapper`]\" :style=\"{ width: typeof width === 'number' ? `${width}px` : width }\">\n <div\n v-if=\"showPagination && pagination && (pagination.position === 'top' || pagination.position === 'both')\"\n :class=\"{\n [`${prefixCls}-pagination`]: true,\n [`${prefixCls}-pagination-top`]: true,\n [`${prefixCls}-pagination-right`]: pagination && pagination.align === 'right'\n }\"\n >\n <Pagination v-bind=\"paginationOptions\" :total=\"computedPageTotal\" @change=\"handlePageChange\" @page-size-change=\"handlePageSizeChange\" />\n </div>\n <div\n :ref=\"saveRef('table')\"\n :class=\"[\n prefixCls,\n `${prefixCls}-${size}`,\n {\n [`${prefixCls}-${variant}`]: !isBorder,\n [`${prefixCls}-border`]: !!isBorder,\n [`${prefixCls}-radius`]: variant !== 'ghost' && !border && radius,\n [`${prefixCls}-empty`]: !data.length,\n [`${prefixCls}-without-column-header`]: !showHeader,\n [`${prefixCls}-fixed-header`]: !!maxHeight,\n [`${prefixCls}-layout-fixed`]: true,\n [`${prefixCls}-scroll-position-left`]: scrollPosition === 'left' || scrollPosition === 'both',\n [`${prefixCls}-scroll-position-right`]: scrollPosition === 'right' || scrollPosition === 'both',\n [`${prefixCls}-dragging`]: showResizeLine,\n [`${prefixCls}-stripe`]: stripe\n }\n ]\"\n >\n <div v-if=\"$slots.title\" :class=\"`${prefixCls}-title`\">\n <slot name=\"title\" />\n </div>\n <div :class=\"`${prefixCls}-content`\">\n <TableBox :columns=\"updatedColumns\" @head-scroll=\"handleBodyScrollX\" @body-scroll=\"handleBodyScroll\" />\n <div v-if=\"!currentDatas.length\" :class=\"`${prefixCls}-placeholder`\">\n <slot name=\"empty\">\n {{ emptyText }}\n </slot>\n </div>\n </div>\n <div v-show=\"showResizeLine\" :ref=\"saveRef('resizeLine')\" :class=\"`${prefixCls}-resize-line`\" />\n <Spin v-if=\"loadingType === 'spinner'\" fix :loading=\"loading\" />\n </div>\n <div v-if=\"$slots.footer\" :class=\"`${prefixCls}-footer`\">\n <slot name=\"footer\" />\n </div>\n <div\n v-if=\"showPagination && ((pagination && pagination.position !== 'top') || !pagination)\"\n :class=\"{\n [`${prefixCls}-pagination`]: true,\n [`${prefixCls}-pagination-bottom`]: true,\n [`${prefixCls}-pagination-right`]: pagination && pagination.align === 'right'\n }\"\n >\n <Pagination v-bind=\"paginationOptions\" :total=\"computedPageTotal\" @change=\"handlePageChange\" @page-size-change=\"handlePageSizeChange\" />\n </div>\n </div>\n </ResizeObserver>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, provide, reactive, toRefs, ref, onMounted, nextTick, onBeforeUnmount, onUpdated, watch } from 'vue';\nimport Spin from '@uxd-ui/components/Spin';\nimport Pagination from '@uxd-ui/components/Pagination';\nimport { debounce } from '../../utils/tools';\n// import Container from '../base/Container';\nimport TableBox from './TableBox.vue';\nimport useGlobalConfig from '../base/hooks/useGlobalConfig';\nimport ResizeObserver from '../base/ResizeObserver';\nimport useUpdateColumns from './hooks/useUpdateColumns';\nimport useUpdateDatas from './hooks/useUpdateDatas';\nimport useTableResize from './hooks/useTableResize';\nimport useExpander from './hooks/useExpander';\nimport useSelection from './hooks/useSelection';\nimport useDraggable from './hooks/useDraggable';\nimport useFilterSortPage from './hooks/useFilterSortPage';\nimport { tableProps, tableEmits, type SaveRef, type TableRefs, type TableColumn, type InnerColumn } from './Table.type';\n\nexport default defineComponent({\n name: 'UTable',\n components: {\n TableBox,\n Spin,\n Pagination,\n ResizeObserver\n },\n props: tableProps,\n emits: tableEmits,\n setup(props, { slots, emit }) {\n const { prefixCls, config: globalConfig } = useGlobalConfig('table');\n const showResizeLine = ref(false);\n const tableRefs = reactive({} as TableRefs);\n const saveRef: SaveRef = (key: string) => {\n return (el: any) => {\n tableRefs[key] = el;\n };\n };\n\n const locale = computed(() => {\n return { ...globalConfig.locale.table, ...props.locale };\n });\n\n const isBorder = computed(() => {\n const b = props.variant === 'border' || props.border;\n return b;\n });\n\n // ============ datas ===============\n const { updatedDatas } = useUpdateDatas(props);\n\n // ============= sort & fitler =============\n const {\n hasAction,\n hasSorters,\n hasFilters,\n isSortColumn,\n isAscend,\n isDescend,\n hasAscend,\n hasDescend,\n toggleSortOrder,\n setColumnFilter,\n currentDatas,\n paginationOptions,\n computedPageTotal,\n handlePageChange,\n handlePageSizeChange\n } = useFilterSortPage(props, updatedDatas, emit);\n\n // ================ draggable ====================\n const { setRowRefs, draggableColumn } = useDraggable(props, tableRefs);\n\n // ================ expander ====================\n const {\n expandedRowKeys,\n showChildrenRowKeys,\n handleExpandChange,\n isRowExpanded,\n expandedRowRender,\n isTreeTable,\n expandColumn,\n expandIconColumnIndex\n } = useExpander(props, slots, currentDatas, emit);\n\n const { selectionColumn } = useSelection(props, updatedDatas, currentDatas, prefixCls, locale);\n\n // ============ columns ===============\n const { updatedColumns, isColumnFixed, isLeftFixed, isRightFixed, leftColumns, rightColumns } = useUpdateColumns(props, slots, {\n draggableColumn,\n expandColumn,\n selectionColumn\n });\n\n // ============ resize ==============\n // #region\n const {\n sizesMap,\n handleResize,\n isScrollX,\n // fixedHeadRowsHeight,\n // fixedBodyRowsHeight,\n scrollPosition,\n // syncFixedTableRowHeight,\n setScrollPositionClass,\n resetScrollX,\n tableWidth,\n clearResizeTimer,\n setResizeWidth\n } = useTableResize(updatedColumns, tableRefs, prefixCls, isColumnFixed, props);\n\n const debouncedHandleResize = debounce(handleResize, 150);\n\n onMounted(() => {\n nextTick(() => {\n setTimeout(() => {\n handleResize();\n resetScrollX();\n }, 0);\n });\n });\n\n onUpdated(() => {\n nextTick(() => {\n handleResize();\n });\n });\n\n onBeforeUnmount(() => {\n if (debouncedHandleResize) {\n debouncedHandleResize.cancel();\n }\n clearResizeTimer();\n });\n // #endregion\n\n // ============ scroll ===============\n // #region\n const scrollable = computed(() => {\n return props.maxHeight || isScrollX.value || isColumnFixed.value;\n });\n\n let lastScrollLeft = 0;\n const handleBodyScrollX = (e: any) => {\n if (e.currentTarget !== e.target) {\n return;\n }\n\n const { target } = e;\n const { bodyTable, headTable } = tableRefs;\n\n if (target.scrollLeft !== lastScrollLeft && isScrollX.value) {\n if (target === (bodyTable as any).wrapRef && headTable) {\n (headTable as any).setScrollLeft(target.scrollLeft);\n } else if (target === (headTable as any)?.wrapRef && bodyTable) {\n (bodyTable as any).setScrollLeft(target.scrollLeft);\n }\n setScrollPositionClass();\n }\n lastScrollLeft = target.scrollLeft;\n };\n\n const handleBodyScroll = (e: any) => {\n handleBodyScrollX(e);\n };\n\n watch(\n () => props.data,\n (val) => {\n if (val.length === 0 && isScrollX.value) {\n nextTick(() => {\n resetScrollX();\n });\n }\n }\n );\n // #endregion\n // ============ empty ================\n const emptyText = computed(() => {\n return props.data.length ? locale.value.notFoundText : locale.value.noDataText;\n });\n\n // ===========row hover & event ================\n // #region\n const currentHoverKey = ref(null);\n const onRowMouseEnter = (data: Record<string, any>, index: number, e: Event) => {\n emit('row-mouseenter', data, index, e);\n };\n const onRowMouseLeave = (data: Record<string, any>, index: number, e: Event) => {\n emit('row-mouseleave', data, index, e);\n };\n const onRowClick = (data: Record<string, any>, index: number, e: Event) => {\n emit('row-click', data, index, e);\n };\n const onRowDoubleClick = (data: Record<string, any>, index: number, e: Event) => {\n emit('row-doubleclick', data, index, e);\n };\n const onRowContextMenu = (data: Record<string, any>, index: number, e: Event) => {\n emit('row-contextmenu', data, index, e);\n };\n // #endregion\n\n // ============= other event =================\n // #region\n const onHeaderCellClick = (column: TableColumn, e: Event) => {\n emit('header-click', column, e);\n };\n\n const handleColumnResize = (columnWidth: number, changeWidth: number, column: InnerColumn, event: Event) => {\n emit('column-resize', columnWidth, changeWidth, column, event);\n };\n // #endregion\n\n // ============= provide =================\n\n const { showHeader, maxHeight, expandIcon, rowClassName, indentSize, showSummary, disabledHover, expandIndent, headerSticky, loading } =\n toRefs(props);\n\n provide('tableContext', {\n prefixCls,\n locale,\n data: currentDatas,\n saveRef,\n tableRefs,\n showResizeLine,\n props: {\n showHeader,\n maxHeight,\n expandIcon,\n rowClassName,\n indentSize,\n emptyText,\n showSummary,\n disabledHover,\n expandIndent,\n headerSticky,\n loading\n },\n slots,\n expand: {\n expandedRowRender,\n expandedRowKeys,\n showChildrenRowKeys,\n isRowExpanded,\n expandIconColumnIndex,\n handleExpandChange,\n isTreeTable\n },\n size: {\n tableWidth,\n sizesMap,\n isScrollX,\n setResizeWidth,\n handleColumnResize,\n debouncedHandleResize\n },\n fixed: {\n isColumnFixed,\n currentHoverKey\n },\n draggable: {\n setRowRefs\n },\n rowEvents: {\n onRowMouseEnter,\n onRowMouseLeave,\n onRowClick,\n onRowDoubleClick,\n onRowContextMenu\n },\n headerEvents: {\n onHeaderCellClick\n },\n filterAndSorter: {\n hasAction,\n hasSorters,\n hasFilters,\n isSortColumn,\n isAscend,\n isDescend,\n hasAscend,\n hasDescend,\n toggleSortOrder,\n setColumnFilter\n },\n pagination: paginationOptions\n });\n return {\n prefixCls,\n saveRef,\n showResizeLine,\n updatedColumns,\n currentDatas,\n paginationOptions,\n computedPageTotal,\n isBorder,\n isLeftFixed,\n leftColumns,\n isRightFixed,\n rightColumns,\n scrollable,\n scrollPosition,\n handleBodyScroll,\n handleBodyScrollX,\n emptyText,\n debouncedHandleResize,\n handlePageChange,\n handlePageSizeChange\n };\n }\n});\n</script>\n"],"names":["defineComponent","TableBox","Spin","Pagination","ResizeObserver","tableProps","tableEmits","useGlobalConfig","ref","reactive","computed","useUpdateDatas","useFilterSortPage","useDraggable","useExpander","useSelection","useUpdateColumns","useTableResize","debounce","toRefs","_createBlock","_createElementVNode","_normalizeClass","_normalizeStyle","_createElementBlock","_createVNode","_mergeProps","_renderSlot"],"mappings":"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"}
1
+ {"version":3,"file":"Table.js","sources":["../../../../src/components/Table/Table.vue"],"sourcesContent":["<template>\n <ResizeObserver @resize=\"debouncedHandleResize\">\n <div :class=\"[`${prefixCls}-wrapper`]\" :style=\"{ width: typeof width === 'number' ? `${width}px` : width }\">\n <div\n v-if=\"showPagination && pagination && (pagination.position === 'top' || pagination.position === 'both')\"\n :class=\"{\n [`${prefixCls}-pagination`]: true,\n [`${prefixCls}-pagination-top`]: true,\n [`${prefixCls}-pagination-right`]: pagination && pagination.align === 'right'\n }\"\n >\n <Pagination v-bind=\"paginationOptions\" :total=\"computedPageTotal\" @change=\"handlePageChange\" @page-size-change=\"handlePageSizeChange\" />\n </div>\n <div\n :ref=\"saveRef('table')\"\n :class=\"[\n prefixCls,\n `${prefixCls}-${size}`,\n {\n [`${prefixCls}-${variant}`]: !isBorder,\n [`${prefixCls}-border`]: !!isBorder,\n [`${prefixCls}-radius`]: variant !== 'ghost' && !border && radius,\n [`${prefixCls}-empty`]: !data.length,\n [`${prefixCls}-without-column-header`]: !showHeader,\n [`${prefixCls}-fixed-header`]: !!maxHeight,\n [`${prefixCls}-layout-fixed`]: true,\n [`${prefixCls}-scroll-position-left`]: scrollPosition === 'left' || scrollPosition === 'both',\n [`${prefixCls}-scroll-position-right`]: scrollPosition === 'right' || scrollPosition === 'both',\n [`${prefixCls}-dragging`]: showResizeLine,\n [`${prefixCls}-stripe`]: stripe\n }\n ]\"\n >\n <div v-if=\"$slots.title\" :class=\"`${prefixCls}-title`\">\n <slot name=\"title\" />\n </div>\n <div :class=\"`${prefixCls}-content`\">\n <TableBox :columns=\"updatedColumns\" @head-scroll=\"handleBodyScrollX\" @body-scroll=\"handleBodyScroll\" />\n <div v-if=\"!currentDatas.length\" :class=\"`${prefixCls}-placeholder`\">\n <slot name=\"empty\">\n {{ emptyText }}\n </slot>\n </div>\n </div>\n <div v-show=\"showResizeLine\" :ref=\"saveRef('resizeLine')\" :class=\"`${prefixCls}-resize-line`\" />\n <Spin v-if=\"loadingType === 'spinner'\" fix :loading=\"loading\" />\n </div>\n <div v-if=\"$slots.footer\" :class=\"`${prefixCls}-footer`\">\n <slot name=\"footer\" />\n </div>\n <div\n v-if=\"showPagination && ((pagination && pagination.position !== 'top') || !pagination)\"\n :class=\"{\n [`${prefixCls}-pagination`]: true,\n [`${prefixCls}-pagination-bottom`]: true,\n [`${prefixCls}-pagination-right`]: pagination && pagination.align === 'right'\n }\"\n >\n <Pagination v-bind=\"paginationOptions\" :total=\"computedPageTotal\" @change=\"handlePageChange\" @page-size-change=\"handlePageSizeChange\" />\n </div>\n </div>\n </ResizeObserver>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, provide, reactive, toRefs, ref, onMounted, nextTick, onBeforeUnmount, onUpdated, watch } from 'vue';\nimport Spin from '@uxd-ui/components/Spin';\nimport Pagination from '@uxd-ui/components/Pagination';\nimport { debounce } from '../../utils/tools';\n// import Container from '../base/Container';\nimport TableBox from './TableBox.vue';\nimport useGlobalConfig from '../base/hooks/useGlobalConfig';\nimport ResizeObserver from '../base/ResizeObserver';\nimport useUpdateColumns from './hooks/useUpdateColumns';\nimport useUpdateDatas from './hooks/useUpdateDatas';\nimport useTableResize from './hooks/useTableResize';\nimport useExpander from './hooks/useExpander';\nimport useSelection from './hooks/useSelection';\nimport useDraggable from './hooks/useDraggable';\nimport useFilterSortPage from './hooks/useFilterSortPage';\nimport { tableProps, tableEmits, type SaveRef, type TableRefs, type TableColumn, type InnerColumn } from './Table.type';\n\nexport default defineComponent({\n name: 'UTable',\n components: {\n TableBox,\n Spin,\n Pagination,\n ResizeObserver\n },\n props: tableProps,\n emits: tableEmits,\n setup(props, { slots, emit }) {\n const { prefixCls, config: globalConfig } = useGlobalConfig('table');\n const showResizeLine = ref(false);\n const tableRefs = reactive({} as TableRefs);\n const saveRef: SaveRef = (key: string) => {\n return (el: any) => {\n tableRefs[key] = el;\n };\n };\n\n const locale = computed(() => {\n return { ...globalConfig.locale.table, ...props.locale };\n });\n\n const isBorder = computed(() => {\n const b = props.variant === 'border' || props.border;\n return b;\n });\n\n // ============ datas ===============\n const { updatedDatas } = useUpdateDatas(props);\n\n // ============= sort & fitler =============\n const {\n hasAction,\n hasSorters,\n hasFilters,\n isSortColumn,\n isAscend,\n isDescend,\n hasAscend,\n hasDescend,\n toggleSortOrder,\n setColumnFilter,\n currentDatas,\n paginationOptions,\n computedPageTotal,\n handlePageChange,\n handlePageSizeChange\n } = useFilterSortPage(props, updatedDatas, emit);\n\n // ================ draggable ====================\n const { setRowRefs, draggableColumn } = useDraggable(props, tableRefs);\n\n // ================ expander ====================\n const {\n expandedRowKeys,\n showChildrenRowKeys,\n handleExpandChange,\n isRowExpanded,\n expandedRowRender,\n isTreeTable,\n expandColumn,\n expandIconColumnIndex\n } = useExpander(props, slots, currentDatas, emit);\n\n const { selectionColumn } = useSelection(props, updatedDatas, currentDatas, prefixCls, locale);\n\n // ============ columns ===============\n const { updatedColumns, isColumnFixed, isLeftFixed, isRightFixed, leftColumns, rightColumns } = useUpdateColumns(props, slots, {\n draggableColumn,\n expandColumn,\n selectionColumn\n });\n\n // ============ resize ==============\n // #region\n const {\n sizesMap,\n handleResize,\n isScrollX,\n // fixedHeadRowsHeight,\n // fixedBodyRowsHeight,\n scrollPosition,\n // syncFixedTableRowHeight,\n setScrollPositionClass,\n resetScrollX,\n tableWidth,\n clearResizeTimer,\n setResizeWidth\n } = useTableResize(updatedColumns, tableRefs, prefixCls, isColumnFixed, props);\n\n const debouncedHandleResize = debounce(handleResize, 150);\n\n onMounted(() => {\n nextTick(() => {\n setTimeout(() => {\n handleResize();\n resetScrollX();\n }, 0);\n });\n });\n\n // Debounce onUpdated resize to avoid tight feedback loops:\n // handleResize mutating sizesMap -> re-render -> onUpdated -> handleResize.\n // Actual no-op short-circuit lives in useTableResize.syncColumnsWidth.\n onUpdated(() => {\n nextTick(() => {\n debouncedHandleResize();\n });\n });\n\n onBeforeUnmount(() => {\n if (debouncedHandleResize) {\n debouncedHandleResize.cancel();\n }\n clearResizeTimer();\n });\n // #endregion\n\n // ============ scroll ===============\n // #region\n const scrollable = computed(() => {\n return props.maxHeight || isScrollX.value || isColumnFixed.value;\n });\n\n let lastScrollLeft = 0;\n const handleBodyScrollX = (e: any) => {\n if (e.currentTarget !== e.target) {\n return;\n }\n\n const { target } = e;\n const { bodyTable, headTable } = tableRefs;\n\n if (target.scrollLeft !== lastScrollLeft && isScrollX.value) {\n if (target === (bodyTable as any).wrapRef && headTable) {\n (headTable as any).setScrollLeft(target.scrollLeft);\n } else if (target === (headTable as any)?.wrapRef && bodyTable) {\n (bodyTable as any).setScrollLeft(target.scrollLeft);\n }\n setScrollPositionClass();\n }\n lastScrollLeft = target.scrollLeft;\n };\n\n const handleBodyScroll = (e: any) => {\n handleBodyScrollX(e);\n };\n\n watch(\n () => props.data,\n (val) => {\n if (val.length === 0 && isScrollX.value) {\n nextTick(() => {\n resetScrollX();\n });\n }\n }\n );\n // #endregion\n // ============ empty ================\n const emptyText = computed(() => {\n return props.data.length ? locale.value.notFoundText : locale.value.noDataText;\n });\n\n // ===========row hover & event ================\n // #region\n const currentHoverKey = ref(null);\n const onRowMouseEnter = (data: Record<string, any>, index: number, e: Event) => {\n emit('row-mouseenter', data, index, e);\n };\n const onRowMouseLeave = (data: Record<string, any>, index: number, e: Event) => {\n emit('row-mouseleave', data, index, e);\n };\n const onRowClick = (data: Record<string, any>, index: number, e: Event) => {\n emit('row-click', data, index, e);\n };\n const onRowDoubleClick = (data: Record<string, any>, index: number, e: Event) => {\n emit('row-doubleclick', data, index, e);\n };\n const onRowContextMenu = (data: Record<string, any>, index: number, e: Event) => {\n emit('row-contextmenu', data, index, e);\n };\n // #endregion\n\n // ============= other event =================\n // #region\n const onHeaderCellClick = (column: TableColumn, e: Event) => {\n emit('header-click', column, e);\n };\n\n const handleColumnResize = (columnWidth: number, changeWidth: number, column: InnerColumn, event: Event) => {\n emit('column-resize', columnWidth, changeWidth, column, event);\n };\n // #endregion\n\n // ============= provide =================\n\n const { showHeader, maxHeight, expandIcon, rowClassName, indentSize, showSummary, disabledHover, expandIndent, headerSticky, loading } =\n toRefs(props);\n\n provide('tableContext', {\n prefixCls,\n locale,\n data: currentDatas,\n saveRef,\n tableRefs,\n showResizeLine,\n props: {\n showHeader,\n maxHeight,\n expandIcon,\n rowClassName,\n indentSize,\n emptyText,\n showSummary,\n disabledHover,\n expandIndent,\n headerSticky,\n loading\n },\n slots,\n expand: {\n expandedRowRender,\n expandedRowKeys,\n showChildrenRowKeys,\n isRowExpanded,\n expandIconColumnIndex,\n handleExpandChange,\n isTreeTable\n },\n size: {\n tableWidth,\n sizesMap,\n isScrollX,\n setResizeWidth,\n handleColumnResize,\n debouncedHandleResize\n },\n fixed: {\n isColumnFixed,\n currentHoverKey\n },\n draggable: {\n setRowRefs\n },\n rowEvents: {\n onRowMouseEnter,\n onRowMouseLeave,\n onRowClick,\n onRowDoubleClick,\n onRowContextMenu\n },\n headerEvents: {\n onHeaderCellClick\n },\n filterAndSorter: {\n hasAction,\n hasSorters,\n hasFilters,\n isSortColumn,\n isAscend,\n isDescend,\n hasAscend,\n hasDescend,\n toggleSortOrder,\n setColumnFilter\n },\n pagination: paginationOptions\n });\n return {\n prefixCls,\n saveRef,\n showResizeLine,\n updatedColumns,\n currentDatas,\n paginationOptions,\n computedPageTotal,\n isBorder,\n isLeftFixed,\n leftColumns,\n isRightFixed,\n rightColumns,\n scrollable,\n scrollPosition,\n handleBodyScroll,\n handleBodyScrollX,\n emptyText,\n debouncedHandleResize,\n handlePageChange,\n handlePageSizeChange\n };\n }\n});\n</script>\n"],"names":["defineComponent","TableBox","Spin","Pagination","ResizeObserver","tableProps","tableEmits","useGlobalConfig","ref","reactive","computed","useUpdateDatas","useFilterSortPage","useDraggable","useExpander","useSelection","useUpdateColumns","useTableResize","debounce","toRefs","_createBlock","_createElementVNode","_normalizeClass","_normalizeStyle","_createElementBlock","_createVNode","_mergeProps","_renderSlot"],"mappings":"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"}
@@ -3,6 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var vue = require('vue');
6
+ var tools = require('../../../utils/tools.js');
6
7
  var utils = require('../utils.js');
7
8
 
8
9
  function getWidth(width, tableWidth) {
@@ -19,20 +20,35 @@ function getWidth(width, tableWidth) {
19
20
  }
20
21
  return _width;
21
22
  }
23
+ function applySizesMap(sizesMap, nextSizesMap) {
24
+ Object.keys(sizesMap).forEach((key) => {
25
+ if (!(key in nextSizesMap)) {
26
+ delete sizesMap[key];
27
+ }
28
+ });
29
+ Object.keys(nextSizesMap).forEach((key) => {
30
+ if (sizesMap[key] !== nextSizesMap[key]) {
31
+ sizesMap[key] = nextSizesMap[key];
32
+ }
33
+ });
34
+ }
22
35
  function useTableResize(updatedColumns, tableRefs, prefixCls, isColumnFixed, props) {
23
36
  const sizesMap = vue.reactive({});
24
37
  const tableWidth = vue.ref(void 0);
38
+ let lastWrapWidth;
39
+ const WRAP_WIDTH_TOLERANCE = 1;
25
40
  const syncColumnsWidth = () => {
26
41
  const { bodyTable } = tableRefs;
27
42
  if (!bodyTable || bodyTable.getWidth() === void 0) {
28
- return;
43
+ return false;
44
+ }
45
+ let wrapWidth = bodyTable.getWidth();
46
+ if (lastWrapWidth !== void 0 && Math.abs(wrapWidth - lastWrapWidth) <= WRAP_WIDTH_TOLERANCE) {
47
+ wrapWidth = lastWrapWidth;
29
48
  }
30
- const wrapWidth = bodyTable.getWidth();
31
49
  const columns = utils.getLeafColumns(updatedColumns.value);
32
50
  let usedWidth = 0;
33
- Object.keys(sizesMap).forEach((key) => {
34
- delete sizesMap[key];
35
- });
51
+ const nextSizesMap = {};
36
52
  const minWidthColumns = [];
37
53
  const maxWidthColumns = [];
38
54
  const nothingColumns = [];
@@ -41,15 +57,15 @@ function useTableResize(updatedColumns, tableRefs, prefixCls, isColumnFixed, pro
41
57
  if (c.width) {
42
58
  const _width = getWidth(c.width, wrapWidth);
43
59
  usedWidth += _width;
44
- sizesMap[colKey] = _width;
60
+ nextSizesMap[colKey] = _width;
45
61
  } else if (c.minWidth) {
46
62
  const _width = getWidth(c.minWidth, wrapWidth);
47
63
  usedWidth += _width;
48
- sizesMap[colKey] = _width;
64
+ nextSizesMap[colKey] = _width;
49
65
  minWidthColumns.push(c);
50
66
  } else {
51
67
  const minWidth = utils.getMinWidth(c);
52
- sizesMap[colKey] = minWidth;
68
+ nextSizesMap[colKey] = minWidth;
53
69
  usedWidth += minWidth;
54
70
  if (c.maxWidth) {
55
71
  maxWidthColumns.push(c);
@@ -65,10 +81,10 @@ function useTableResize(updatedColumns, tableRefs, prefixCls, isColumnFixed, pro
65
81
  maxWidthColumns.forEach((mc) => {
66
82
  avgWidth = Math.floor(unUsedWidth / length);
67
83
  if (getWidth(mc.maxWidth, wrapWidth) < avgWidth) {
68
- sizesMap[mc.key] = getWidth(mc.maxWidth, wrapWidth);
84
+ nextSizesMap[mc.key] = getWidth(mc.maxWidth, wrapWidth);
69
85
  unUsedWidth -= getWidth(mc.maxWidth, wrapWidth) - utils.getMinWidth(mc);
70
86
  } else {
71
- sizesMap[mc.key] += avgWidth;
87
+ nextSizesMap[mc.key] += avgWidth;
72
88
  unUsedWidth -= avgWidth;
73
89
  }
74
90
  length -= 1;
@@ -77,25 +93,32 @@ function useTableResize(updatedColumns, tableRefs, prefixCls, isColumnFixed, pro
77
93
  if (avgWidth > 50 || nothingColumns.length === 0) {
78
94
  [...minWidthColumns, ...nothingColumns].forEach((c, i) => {
79
95
  if (i < length - 1) {
80
- sizesMap[c.key] += avgWidth;
96
+ nextSizesMap[c.key] += avgWidth;
81
97
  unUsedWidth -= avgWidth;
82
98
  } else {
83
- sizesMap[c.key] += unUsedWidth;
99
+ nextSizesMap[c.key] += unUsedWidth;
84
100
  }
85
101
  });
86
102
  } else {
87
103
  avgWidth = Math.floor(unUsedWidth / nothingColumns.length);
88
104
  nothingColumns.forEach((c, i) => {
89
105
  if (i < nothingColumns.length - 1) {
90
- sizesMap[c.key] += avgWidth;
106
+ nextSizesMap[c.key] += avgWidth;
91
107
  unUsedWidth -= avgWidth;
92
108
  } else {
93
- sizesMap[c.key] += unUsedWidth;
109
+ nextSizesMap[c.key] += unUsedWidth;
94
110
  }
95
111
  });
96
112
  }
97
113
  }
98
- tableWidth.value = Object.keys(sizesMap).reduce((sum, key) => sum + sizesMap[key], 0);
114
+ const nextTableWidth = Object.keys(nextSizesMap).reduce((sum, key) => sum + nextSizesMap[key], 0);
115
+ lastWrapWidth = wrapWidth;
116
+ if (tools.shallowequal(sizesMap, nextSizesMap) && tableWidth.value === nextTableWidth) {
117
+ return false;
118
+ }
119
+ applySizesMap(sizesMap, nextSizesMap);
120
+ tableWidth.value = nextTableWidth;
121
+ return true;
99
122
  };
100
123
  let syncHeightTimer = null;
101
124
  let updateBodyTableTimer = null;
@@ -109,20 +132,23 @@ function useTableResize(updatedColumns, tableRefs, prefixCls, isColumnFixed, pro
109
132
  if (!bodyDom) {
110
133
  return;
111
134
  }
112
- const scrollToLeft = bodyDom.scrollLeft === 0;
113
- const scrollToRight = bodyDom.scrollLeft + 1 >= bodyDom.children[0].getBoundingClientRect().width - bodyDom.getBoundingClientRect().width;
135
+ const { scrollLeft, scrollWidth, clientWidth } = bodyDom;
136
+ const scrollToLeft = scrollLeft <= 0;
137
+ const scrollToRight = scrollLeft + 1 >= scrollWidth - clientWidth;
138
+ let nextPosition = "middle";
114
139
  if (scrollToLeft && scrollToRight) {
115
- scrollPosition.value = "both";
140
+ nextPosition = "both";
116
141
  } else if (scrollToLeft) {
117
- scrollPosition.value = "left";
142
+ nextPosition = "left";
118
143
  } else if (scrollToRight) {
119
- scrollPosition.value = "right";
120
- } else {
121
- scrollPosition.value = "middle";
144
+ nextPosition = "right";
145
+ }
146
+ if (scrollPosition.value !== nextPosition) {
147
+ scrollPosition.value = nextPosition;
122
148
  }
123
149
  };
124
150
  const handleResize = () => {
125
- syncColumnsWidth();
151
+ const changed = syncColumnsWidth();
126
152
  if (isColumnFixed.value) {
127
153
  if (syncHeightTimer) {
128
154
  clearTimeout(syncHeightTimer);
@@ -132,6 +158,9 @@ function useTableResize(updatedColumns, tableRefs, prefixCls, isColumnFixed, pro
132
158
  setScrollPositionClass();
133
159
  }, 0);
134
160
  }
161
+ if (!changed) {
162
+ return;
163
+ }
135
164
  if (updateBodyTableTimer) {
136
165
  clearTimeout(updateBodyTableTimer);
137
166
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useTableResize.js","sources":["../../../../../src/components/Table/hooks/useTableResize.ts"],"sourcesContent":["import { computed, reactive, ref } from 'vue';\nimport type { ComputedRef, Ref } from 'vue';\nimport { getLeafColumns, getColumnKey, getMinWidth } from '../utils';\n// import { shallowequal } from '../../../utils/tools';\nimport type { InnerColumn, TableProps, TableRefs } from '../Table.type';\n\nexport function getWidth(width: string | number, tableWidth: number) {\n let _width = 0;\n if (typeof width === 'number') {\n _width = width;\n } else if (/^\\d*px$/.test(width)) {\n _width = Number(width.replace('px', ''));\n } else if (/^[\\d.]*%$/.test(width)) {\n const percent = Number(width.replace('%', ''));\n if (!Number.isNaN(percent)) {\n _width = Math.floor((percent / 100) * tableWidth);\n }\n }\n return _width;\n}\nexport default function useTableResize(\n updatedColumns: Ref<InnerColumn[]>,\n tableRefs: TableRefs,\n prefixCls: Ref<string>,\n isColumnFixed: ComputedRef<boolean>,\n props: TableProps\n) {\n const sizesMap = reactive({} as Record<string, number>);\n const tableWidth = ref<number | undefined>(undefined);\n\n const syncColumnsWidth = () => {\n const { bodyTable } = tableRefs;\n if (!bodyTable || (bodyTable as any).getWidth() === undefined) {\n return;\n }\n // const wrapWidth = props.border ? bodyTable.clientWidth - 1 : bodyTable.clientWidth;\n const wrapWidth = (bodyTable as any).getWidth();\n\n const columns = getLeafColumns(updatedColumns.value);\n let usedWidth = 0;\n // clear the sizesMap.\n Object.keys(sizesMap).forEach((key) => {\n delete sizesMap[key];\n });\n const minWidthColumns: InnerColumn[] = [];\n const maxWidthColumns: InnerColumn[] = [];\n const nothingColumns: InnerColumn[] = [];\n columns.forEach((c) => {\n const colKey = getColumnKey(c);\n if (c.width) {\n const _width = getWidth(c.width, wrapWidth);\n usedWidth += _width;\n sizesMap[colKey] = _width;\n } else if (c.minWidth) {\n const _width = getWidth(c.minWidth, wrapWidth);\n usedWidth += _width;\n sizesMap[colKey] = _width;\n minWidthColumns.push(c);\n } else {\n const minWidth = getMinWidth(c);\n sizesMap[colKey] = minWidth;\n usedWidth += minWidth;\n if (c.maxWidth) {\n maxWidthColumns.push(c);\n } else {\n nothingColumns.push(c);\n }\n }\n });\n let unUsedWidth = wrapWidth - usedWidth;\n let length = minWidthColumns.length + maxWidthColumns.length + nothingColumns.length;\n if (unUsedWidth > 0 && length > 0) {\n let avgWidth: number;\n maxWidthColumns.forEach((mc) => {\n avgWidth = Math.floor(unUsedWidth / length);\n if (getWidth(mc.maxWidth as number, wrapWidth) < avgWidth) {\n sizesMap[mc.key] = getWidth(mc.maxWidth as number, wrapWidth);\n unUsedWidth -= getWidth(mc.maxWidth as number, wrapWidth) - getMinWidth(mc);\n } else {\n sizesMap[mc.key] += avgWidth;\n unUsedWidth -= avgWidth;\n }\n length -= 1;\n });\n avgWidth = Math.floor(unUsedWidth / length);\n if (avgWidth > 50 || nothingColumns.length === 0) {\n [...minWidthColumns, ...nothingColumns].forEach((c, i) => {\n if (i < length - 1) {\n sizesMap[c.key] += avgWidth;\n unUsedWidth -= avgWidth;\n } else {\n sizesMap[c.key] += unUsedWidth;\n }\n });\n } else {\n avgWidth = Math.floor(unUsedWidth / nothingColumns.length);\n nothingColumns.forEach((c, i) => {\n if (i < nothingColumns.length - 1) {\n sizesMap[c.key] += avgWidth;\n unUsedWidth -= avgWidth;\n } else {\n sizesMap[c.key] += unUsedWidth;\n }\n });\n }\n }\n tableWidth.value = Object.keys(sizesMap).reduce((sum, key) => sum + sizesMap[key], 0);\n };\n\n let syncHeightTimer: ReturnType<typeof setTimeout> | null = null;\n let updateBodyTableTimer: ReturnType<typeof setTimeout> | null = null;\n const scrollPosition = ref('left');\n\n const setScrollPositionClass = () => {\n const { bodyTable } = tableRefs;\n if (!bodyTable) {\n return;\n }\n const bodyDom = (bodyTable as any).wrapRef;\n if (!bodyDom) {\n return;\n }\n\n const scrollToLeft = bodyDom.scrollLeft === 0;\n const scrollToRight = bodyDom.scrollLeft + 1 >= bodyDom.children[0].getBoundingClientRect().width - bodyDom.getBoundingClientRect().width;\n if (scrollToLeft && scrollToRight) {\n scrollPosition.value = 'both';\n } else if (scrollToLeft) {\n scrollPosition.value = 'left';\n } else if (scrollToRight) {\n scrollPosition.value = 'right';\n } else {\n scrollPosition.value = 'middle';\n }\n };\n const handleResize = () => {\n syncColumnsWidth();\n\n if (isColumnFixed.value) {\n if (syncHeightTimer) {\n clearTimeout(syncHeightTimer);\n }\n syncHeightTimer = setTimeout(() => {\n syncHeightTimer = null;\n setScrollPositionClass();\n }, 0);\n }\n if (updateBodyTableTimer) {\n clearTimeout(updateBodyTableTimer);\n }\n updateBodyTableTimer = setTimeout(() => {\n updateBodyTableTimer = null;\n const bt = tableRefs.bodyTable as any;\n if (bt?.update) {\n bt.update();\n }\n }, 0);\n };\n\n const setResizeWidth = (column: InnerColumn, width: number) => {\n const columns = getLeafColumns(updatedColumns.value);\n const _column = columns.find((c) => c === column || getColumnKey(c) === getColumnKey(column));\n if (_column) {\n _column.width = width;\n handleResize();\n }\n };\n const isScrollX = computed(() => {\n const { table } = tableRefs;\n if (table) {\n const wrapWidth = props.border ? table.offsetWidth - 1 : table.offsetWidth;\n return tableWidth.value && tableWidth.value > wrapWidth;\n }\n return false;\n });\n\n const resetScrollX = () => {\n const { bodyTable, headTable } = tableRefs;\n if (bodyTable) {\n (bodyTable as any).setScrollLeft(0);\n }\n if (headTable) {\n (headTable as any).setScrollLeft(0);\n }\n };\n const clearResizeTimer = () => {\n if (syncHeightTimer) {\n clearTimeout(syncHeightTimer);\n syncHeightTimer = null;\n }\n if (updateBodyTableTimer) {\n clearTimeout(updateBodyTableTimer);\n updateBodyTableTimer = null;\n }\n };\n return {\n sizesMap,\n tableWidth,\n isScrollX,\n scrollPosition,\n handleResize,\n setScrollPositionClass,\n resetScrollX,\n clearResizeTimer,\n setResizeWidth\n };\n}\n"],"names":["reactive","ref","getLeafColumns","getColumnKey","getMinWidth","computed"],"mappings":"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"}
1
+ {"version":3,"file":"useTableResize.js","sources":["../../../../../src/components/Table/hooks/useTableResize.ts"],"sourcesContent":["import { computed, reactive, ref } from 'vue';\nimport type { ComputedRef, Ref } from 'vue';\nimport { shallowequal } from '../../../utils/tools';\nimport { getLeafColumns, getColumnKey, getMinWidth } from '../utils';\nimport type { InnerColumn, TableProps, TableRefs } from '../Table.type';\n\nexport function getWidth(width: string | number, tableWidth: number) {\n let _width = 0;\n if (typeof width === 'number') {\n _width = width;\n } else if (/^\\d*px$/.test(width)) {\n _width = Number(width.replace('px', ''));\n } else if (/^[\\d.]*%$/.test(width)) {\n const percent = Number(width.replace('%', ''));\n if (!Number.isNaN(percent)) {\n _width = Math.floor((percent / 100) * tableWidth);\n }\n }\n return _width;\n}\n\nfunction applySizesMap(sizesMap: Record<string, number>, nextSizesMap: Record<string, number>) {\n Object.keys(sizesMap).forEach((key) => {\n if (!(key in nextSizesMap)) {\n delete sizesMap[key];\n }\n });\n Object.keys(nextSizesMap).forEach((key) => {\n if (sizesMap[key] !== nextSizesMap[key]) {\n sizesMap[key] = nextSizesMap[key];\n }\n });\n}\n\nexport default function useTableResize(\n updatedColumns: Ref<InnerColumn[]>,\n tableRefs: TableRefs,\n prefixCls: Ref<string>,\n isColumnFixed: ComputedRef<boolean>,\n props: TableProps\n) {\n const sizesMap = reactive({} as Record<string, number>);\n const tableWidth = ref<number | undefined>(undefined);\n let lastWrapWidth: number | undefined;\n // Ignore 1px wrap width flicker from subpixel / scrollbar edge cases.\n const WRAP_WIDTH_TOLERANCE = 1;\n\n const syncColumnsWidth = (): boolean => {\n const { bodyTable } = tableRefs;\n if (!bodyTable || (bodyTable as any).getWidth() === undefined) {\n return false;\n }\n let wrapWidth = (bodyTable as any).getWidth() as number;\n if (lastWrapWidth !== undefined && Math.abs(wrapWidth - lastWrapWidth) <= WRAP_WIDTH_TOLERANCE) {\n wrapWidth = lastWrapWidth;\n }\n\n const columns = getLeafColumns(updatedColumns.value);\n let usedWidth = 0;\n const nextSizesMap: Record<string, number> = {};\n const minWidthColumns: InnerColumn[] = [];\n const maxWidthColumns: InnerColumn[] = [];\n const nothingColumns: InnerColumn[] = [];\n columns.forEach((c) => {\n const colKey = getColumnKey(c);\n if (c.width) {\n const _width = getWidth(c.width, wrapWidth);\n usedWidth += _width;\n nextSizesMap[colKey] = _width;\n } else if (c.minWidth) {\n const _width = getWidth(c.minWidth, wrapWidth);\n usedWidth += _width;\n nextSizesMap[colKey] = _width;\n minWidthColumns.push(c);\n } else {\n const minWidth = getMinWidth(c);\n nextSizesMap[colKey] = minWidth;\n usedWidth += minWidth;\n if (c.maxWidth) {\n maxWidthColumns.push(c);\n } else {\n nothingColumns.push(c);\n }\n }\n });\n let unUsedWidth = wrapWidth - usedWidth;\n let length = minWidthColumns.length + maxWidthColumns.length + nothingColumns.length;\n if (unUsedWidth > 0 && length > 0) {\n let avgWidth: number;\n maxWidthColumns.forEach((mc) => {\n avgWidth = Math.floor(unUsedWidth / length);\n if (getWidth(mc.maxWidth as number, wrapWidth) < avgWidth) {\n nextSizesMap[mc.key] = getWidth(mc.maxWidth as number, wrapWidth);\n unUsedWidth -= getWidth(mc.maxWidth as number, wrapWidth) - getMinWidth(mc);\n } else {\n nextSizesMap[mc.key] += avgWidth;\n unUsedWidth -= avgWidth;\n }\n length -= 1;\n });\n avgWidth = Math.floor(unUsedWidth / length);\n if (avgWidth > 50 || nothingColumns.length === 0) {\n [...minWidthColumns, ...nothingColumns].forEach((c, i) => {\n if (i < length - 1) {\n nextSizesMap[c.key] += avgWidth;\n unUsedWidth -= avgWidth;\n } else {\n nextSizesMap[c.key] += unUsedWidth;\n }\n });\n } else {\n avgWidth = Math.floor(unUsedWidth / nothingColumns.length);\n nothingColumns.forEach((c, i) => {\n if (i < nothingColumns.length - 1) {\n nextSizesMap[c.key] += avgWidth;\n unUsedWidth -= avgWidth;\n } else {\n nextSizesMap[c.key] += unUsedWidth;\n }\n });\n }\n }\n const nextTableWidth = Object.keys(nextSizesMap).reduce((sum, key) => sum + nextSizesMap[key], 0);\n lastWrapWidth = wrapWidth;\n\n if (shallowequal(sizesMap, nextSizesMap) && tableWidth.value === nextTableWidth) {\n return false;\n }\n\n applySizesMap(sizesMap, nextSizesMap);\n tableWidth.value = nextTableWidth;\n return true;\n };\n\n let syncHeightTimer: ReturnType<typeof setTimeout> | null = null;\n let updateBodyTableTimer: ReturnType<typeof setTimeout> | null = null;\n const scrollPosition = ref('left');\n\n const setScrollPositionClass = () => {\n const { bodyTable } = tableRefs;\n if (!bodyTable) {\n return;\n }\n const bodyDom = (bodyTable as any).wrapRef as HTMLElement | undefined;\n if (!bodyDom) {\n return;\n }\n\n // Prefer scrollWidth/clientWidth over getBoundingClientRect to avoid subpixel flicker\n // flipping fixed-column shadow classes (left/right/both).\n const { scrollLeft, scrollWidth, clientWidth } = bodyDom;\n const scrollToLeft = scrollLeft <= 0;\n const scrollToRight = scrollLeft + 1 >= scrollWidth - clientWidth;\n let nextPosition = 'middle';\n if (scrollToLeft && scrollToRight) {\n nextPosition = 'both';\n } else if (scrollToLeft) {\n nextPosition = 'left';\n } else if (scrollToRight) {\n nextPosition = 'right';\n }\n if (scrollPosition.value !== nextPosition) {\n scrollPosition.value = nextPosition;\n }\n };\n const handleResize = () => {\n const changed = syncColumnsWidth();\n\n if (isColumnFixed.value) {\n if (syncHeightTimer) {\n clearTimeout(syncHeightTimer);\n }\n syncHeightTimer = setTimeout(() => {\n syncHeightTimer = null;\n setScrollPositionClass();\n }, 0);\n }\n // Skip scrollbar metric refresh when column sizes did not change, to avoid\n // onUpdated -> handleResize feedback loops that cause layout jitter.\n if (!changed) {\n return;\n }\n if (updateBodyTableTimer) {\n clearTimeout(updateBodyTableTimer);\n }\n updateBodyTableTimer = setTimeout(() => {\n updateBodyTableTimer = null;\n const bt = tableRefs.bodyTable as any;\n if (bt?.update) {\n bt.update();\n }\n }, 0);\n };\n\n const setResizeWidth = (column: InnerColumn, width: number) => {\n const columns = getLeafColumns(updatedColumns.value);\n const _column = columns.find((c) => c === column || getColumnKey(c) === getColumnKey(column));\n if (_column) {\n _column.width = width;\n handleResize();\n }\n };\n const isScrollX = computed(() => {\n const { table } = tableRefs;\n if (table) {\n const wrapWidth = props.border ? table.offsetWidth - 1 : table.offsetWidth;\n return tableWidth.value && tableWidth.value > wrapWidth;\n }\n return false;\n });\n\n const resetScrollX = () => {\n const { bodyTable, headTable } = tableRefs;\n if (bodyTable) {\n (bodyTable as any).setScrollLeft(0);\n }\n if (headTable) {\n (headTable as any).setScrollLeft(0);\n }\n };\n const clearResizeTimer = () => {\n if (syncHeightTimer) {\n clearTimeout(syncHeightTimer);\n syncHeightTimer = null;\n }\n if (updateBodyTableTimer) {\n clearTimeout(updateBodyTableTimer);\n updateBodyTableTimer = null;\n }\n };\n return {\n sizesMap,\n tableWidth,\n isScrollX,\n scrollPosition,\n handleResize,\n setScrollPositionClass,\n resetScrollX,\n clearResizeTimer,\n setResizeWidth\n };\n}\n"],"names":["reactive","ref","getLeafColumns","getColumnKey","getMinWidth","shallowequal","computed"],"mappings":"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"}