diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterDivider.test.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterDivider.test.tsx index 6aae27fc5edd..8491c93d8fa1 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterDivider.test.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterDivider.test.tsx @@ -59,6 +59,7 @@ test('horizontal mode, title', () => { orientation={FilterBarOrientation.HORIZONTAL} title={SAMPLE_TITLE} description="" + overflow />, ); @@ -88,9 +89,7 @@ test('horizontal mode, title and description', async () => { const descriptionIcon = screen.getByTestId('divider-description-icon'); expect(descriptionIcon).toBeVisible(); userEvent.hover(descriptionIcon); - const tooltip = await screen.findByRole('tooltip', { - name: SAMPLE_DESCRIPTION, - }); + const tooltip = await screen.findByRole('tooltip'); expect(tooltip).toBeInTheDocument(); expect(tooltip).toHaveTextContent(SAMPLE_DESCRIPTION); diff --git a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterDivider.tsx b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterDivider.tsx index 522bd977aaa6..4cdeed54c0fa 100644 --- a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterDivider.tsx +++ b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/FilterDivider.tsx @@ -35,7 +35,7 @@ const VerticalDivider = ({ title, description }: FilterDividerProps) => ( const HorizontalDivider = ({ title, description }: FilterDividerProps) => { const theme = useTheme(); const [titleRef, titleIsTruncated] = - useCSSTextTruncation(title); + useCSSTextTruncation(); const tooltipOverlay = ( <> @@ -95,10 +95,10 @@ const HorizontalOverflowDivider = ({ }: FilterDividerProps) => { const theme = useTheme(); const [titleRef, titleIsTruncated] = - useCSSTextTruncation(title); + useCSSTextTruncation(); const [descriptionRef, descriptionIsTruncated] = - useCSSTextTruncation(description); + useCSSTextTruncation(); return (
( - text: string, -): [React.RefObject, boolean] => { - const ref = useRef(null); +const useCSSTextTruncation = (): [ + React.RefObject, + boolean, +] => { const [isTruncated, setIsTruncated] = useState(true); + const ref = useRef(null); + const { offsetWidth, scrollWidth } = ref.current ?? {}; + const prevWidths = useRef({ offsetWidth, scrollWidth }); + const { offsetWidth: prevOffsetWidth, scrollWidth: prevScrollWidth } = + prevWidths.current; + useEffect(() => { - if (ref.current) { - setIsTruncated(ref.current.offsetWidth < ref.current.scrollWidth); + if ( + offsetWidth && + scrollWidth && + (offsetWidth !== prevOffsetWidth || scrollWidth !== prevScrollWidth) + ) { + prevWidths.current = { offsetWidth, scrollWidth }; + setIsTruncated(offsetWidth < scrollWidth); } - }, [text]); + }, [offsetWidth, prevOffsetWidth, prevScrollWidth, scrollWidth]); return [ref, isTruncated]; };