From 19cb7d28c02fc9ed2f86789f0453fe85766f53be Mon Sep 17 00:00:00 2001 From: Lukas Harbarth Date: Thu, 4 Sep 2025 13:37:07 +0200 Subject: [PATCH 1/3] fix(AnalyticalTable): safeguard extension, header & title height calc (#7715) Fixes #7681 --- .../src/components/AnalyticalTable/index.tsx | 20 ++++++++++-------- .../components/AnalyticalTable/util/index.ts | 21 +++++++++++++++++++ 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/packages/main/src/components/AnalyticalTable/index.tsx b/packages/main/src/components/AnalyticalTable/index.tsx index ab238a1a771..4dd61881ca4 100644 --- a/packages/main/src/components/AnalyticalTable/index.tsx +++ b/packages/main/src/components/AnalyticalTable/index.tsx @@ -85,7 +85,12 @@ import type { AnalyticalTableState, DivWithCustomScrollProp } from './types/index.js'; -import { getRowHeight, getSubRowsByString, tagNamesWhichShouldNotSelectARow } from './util/index.js'; +import { + getCombinedElementsHeight, + getRowHeight, + getSubRowsByString, + tagNamesWhichShouldNotSelectARow, +} from './util/index.js'; import { VerticalResizer } from './VerticalResizer.js'; // When a sorted column is removed from the visible columns array (e.g. when "popped-in"), it doesn't clean up the sorted columns leading to an undefined `sortType`. @@ -351,14 +356,11 @@ const AnalyticalTable = forwardRef(0); + const titleBarRef = useRef(null); + const extensionRef = useRef(null); + const headerRef = useRef(null); + const extensionsHeight = getCombinedElementsHeight(prevExtensionsHeight, titleBarRef, extensionRef, headerRef); const internalRowHeight = getRowHeight(rowHeight, tableRef); const internalHeaderRowHeight = headerRowHeight ?? internalRowHeight; diff --git a/packages/main/src/components/AnalyticalTable/util/index.ts b/packages/main/src/components/AnalyticalTable/util/index.ts index 8ce7bee2ec4..25cfd5d122e 100644 --- a/packages/main/src/components/AnalyticalTable/util/index.ts +++ b/packages/main/src/components/AnalyticalTable/util/index.ts @@ -169,3 +169,24 @@ export function getLeafHeaders(header) { recurseHeader(header); return leafHeaders; } + +export const getCombinedElementsHeight = ( + prevHeightRef: RefObject, + ...refs: RefObject[] +): number => { + const prevHeight = prevHeightRef.current; + let height = 0; + + for (const ref of refs) { + const el = ref.current; + if (!el) { + continue; + } + height += el.offsetHeight; + } + // Math.abs is required, because of subpixel rounding errors + const updatedHeight = Math.abs(prevHeight - height) > 1 ? height : prevHeight; + prevHeightRef.current = updatedHeight; + + return updatedHeight; +}; From b943276faf7793d18ce4bb70ff35c10f4d218344 Mon Sep 17 00:00:00 2001 From: Lukas Harbarth Date: Tue, 10 Mar 2026 14:18:50 +0100 Subject: [PATCH 2/3] Update index.ts --- packages/main/src/components/AnalyticalTable/util/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/main/src/components/AnalyticalTable/util/index.ts b/packages/main/src/components/AnalyticalTable/util/index.ts index 25cfd5d122e..44667603513 100644 --- a/packages/main/src/components/AnalyticalTable/util/index.ts +++ b/packages/main/src/components/AnalyticalTable/util/index.ts @@ -186,6 +186,7 @@ export const getCombinedElementsHeight = ( } // Math.abs is required, because of subpixel rounding errors const updatedHeight = Math.abs(prevHeight - height) > 1 ? height : prevHeight; + //@ts-expect-error: downport from v2 prevHeightRef.current = updatedHeight; return updatedHeight; From 98915a05a761c8c881eca7ad47c3b6104bccf610 Mon Sep 17 00:00:00 2001 From: Lukas Harbarth Date: Tue, 10 Mar 2026 14:32:55 +0100 Subject: [PATCH 3/3] lint --- packages/main/src/components/AnalyticalTable/index.tsx | 2 +- packages/main/src/components/MessageView/MessageView.cy.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/main/src/components/AnalyticalTable/index.tsx b/packages/main/src/components/AnalyticalTable/index.tsx index 4dd61881ca4..c212ee04a9b 100644 --- a/packages/main/src/components/AnalyticalTable/index.tsx +++ b/packages/main/src/components/AnalyticalTable/index.tsx @@ -89,7 +89,7 @@ import { getCombinedElementsHeight, getRowHeight, getSubRowsByString, - tagNamesWhichShouldNotSelectARow, + tagNamesWhichShouldNotSelectARow } from './util/index.js'; import { VerticalResizer } from './VerticalResizer.js'; diff --git a/packages/main/src/components/MessageView/MessageView.cy.tsx b/packages/main/src/components/MessageView/MessageView.cy.tsx index 291318951bb..62fb2515c11 100644 --- a/packages/main/src/components/MessageView/MessageView.cy.tsx +++ b/packages/main/src/components/MessageView/MessageView.cy.tsx @@ -1,8 +1,8 @@ import { useRef } from 'react'; import { ValueState } from '../../enums/index.js'; +import { Link } from '../../webComponents/Link/index.js'; import { MessageItem } from './MessageItem'; import { MessageView } from './index.js'; -import { Link } from '../../webComponents/Link/index.js'; describe('MessageView', () => { it('default & grouped', () => {