From 9a8332b28a904ca1c559879865860d966412a9af Mon Sep 17 00:00:00 2001 From: saller Date: Thu, 25 Jan 2024 22:36:35 +0800 Subject: [PATCH] fix(comp:table): inconsecutive fixed columns are not fixed (#1835) --- .../table/src/composables/useColumns.ts | 43 +++++++++++-------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/packages/components/table/src/composables/useColumns.ts b/packages/components/table/src/composables/useColumns.ts index 614e79aef..ad47dab1c 100644 --- a/packages/components/table/src/composables/useColumns.ts +++ b/packages/components/table/src/composables/useColumns.ts @@ -291,17 +291,20 @@ function useFixedColumns(flattedColumnsWithScrollBar: ComputedRef<(TableColumnMe const fixedColumns = computed(() => { const fixedStartColumns: (TableColumnMerged | TableColumnScrollBar)[] = [] const fixedEndColumns: (TableColumnMerged | TableColumnScrollBar)[] = [] + const fixedColumnIndexMap: Record = {} - flattedColumnsWithScrollBar.value.forEach(column => { - const { fixed } = column + flattedColumnsWithScrollBar.value.forEach((column, index) => { + const { key, fixed } = column if (fixed === 'start') { fixedStartColumns.push(column) + fixedColumnIndexMap[key] = index } else if (fixed === 'end') { fixedEndColumns.push(column) + fixedColumnIndexMap[key] = index } }) - return { fixedStartColumns, fixedEndColumns } + return { fixedStartColumns, fixedEndColumns, fixedColumnIndexMap } }) const fixedColumnKeys = computed(() => { const { fixedStartColumns, fixedEndColumns } = fixedColumns.value @@ -344,32 +347,38 @@ function useColumnOffsets( fixedColumns: ComputedRef<{ fixedStartColumns: (TableColumnMerged | TableColumnScrollBar)[] fixedEndColumns: (TableColumnMerged | TableColumnScrollBar)[] + fixedColumnIndexMap: Record }>, columnWidthsMap: Ref>, columnCount: Ref, ) { - const columnOffsets = computed(() => - calculateOffsets( - fixedColumns.value.fixedStartColumns, - fixedColumns.value.fixedEndColumns.filter(column => column.type !== 'scroll-bar'), + const columnOffsets = computed(() => { + const { fixedStartColumns, fixedEndColumns, fixedColumnIndexMap } = fixedColumns.value + return calculateOffsets( + fixedStartColumns, + fixedEndColumns.filter(column => column.type !== 'scroll-bar'), + fixedColumnIndexMap, columnWidthsMap.value, columnCount.value - 1, - ), - ) - const columnOffsetsWithScrollBar = computed(() => - calculateOffsets( - fixedColumns.value.fixedStartColumns, - fixedColumns.value.fixedEndColumns, + ) + }) + const columnOffsetsWithScrollBar = computed(() => { + const { fixedStartColumns, fixedEndColumns, fixedColumnIndexMap } = fixedColumns.value + return calculateOffsets( + fixedStartColumns, + fixedEndColumns, + fixedColumnIndexMap, columnWidthsMap.value, columnCount.value, - ), - ) + ) + }) return { columnOffsets, columnOffsetsWithScrollBar } } function calculateOffsets( startColumns: (TableColumnMerged | TableColumnScrollBar)[], endColumns: (TableColumnMerged | TableColumnScrollBar)[], + columnIndexMap: Record, columnWidthsMap: Record, columnCount: number, ) { @@ -383,7 +392,7 @@ function calculateOffsets( const column = startColumns[index] const width = columnWidthsMap[column.key] ?? column.width ?? 0 - startOffsets[column.key] = { index, offset: startOffset } + startOffsets[column.key] = { index: columnIndexMap[column.key] ?? index, offset: startOffset } startOffset += width } @@ -391,7 +400,7 @@ function calculateOffsets( const column = endColumns[endColumns.length - index - 1] const width = columnWidthsMap[column.key] ?? column.width ?? 0 - endOffsets[column.key] = { index: columnCount - index - 1, offset: endOffset } + endOffsets[column.key] = { index: columnIndexMap[column.key] ?? columnCount - index - 1, offset: endOffset } endOffset += width }