From cf5e29e05b43aa985025c577ef88099c739244ce Mon Sep 17 00:00:00 2001 From: Bill Leoutsakos Date: Wed, 29 Jul 2026 10:13:24 -0700 Subject: [PATCH] fix(tables): truncate sort option labels --- .../resource-options.test.tsx | 70 +++++++++++++++++++ .../resource-options/resource-options.tsx | 2 +- 2 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 apps/sim/app/workspace/[workspaceId]/components/resource/components/resource-options/resource-options.test.tsx diff --git a/apps/sim/app/workspace/[workspaceId]/components/resource/components/resource-options/resource-options.test.tsx b/apps/sim/app/workspace/[workspaceId]/components/resource/components/resource-options/resource-options.test.tsx new file mode 100644 index 00000000000..7a8e6682153 --- /dev/null +++ b/apps/sim/app/workspace/[workspaceId]/components/resource/components/resource-options/resource-options.test.tsx @@ -0,0 +1,70 @@ +/** + * @vitest-environment jsdom + */ +import { act } from 'react' +import { createRoot, type Root } from 'react-dom/client' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { SortDropdown } from '@/app/workspace/[workspaceId]/components/resource/components/resource-options/resource-options' + +const LONG_COLUMN_LABEL = 'highest_current_champion_role_across_the_entire_company' + +function ColumnIcon() { + return +} + +class ResizeObserverMock { + observe = vi.fn() + unobserve = vi.fn() + disconnect = vi.fn() +} + +let container: HTMLDivElement +let root: Root + +beforeEach(() => { + vi.stubGlobal('ResizeObserver', ResizeObserverMock) + container = document.createElement('div') + document.body.appendChild(container) + root = createRoot(container) +}) + +afterEach(() => { + act(() => root.unmount()) + container.remove() + vi.unstubAllGlobals() +}) + +describe('SortDropdown', () => { + it('renders long option labels in the truncatable span between both icons', () => { + act(() => { + root.render( + + ) + }) + + const item = document.body.querySelector('[role="menuitem"]') + expect(item).not.toBeNull() + expect(item).toHaveAccessibleName(LONG_COLUMN_LABEL) + + const label = item?.querySelector('span') + expect(label).not.toBeNull() + expect(label).toHaveTextContent(LONG_COLUMN_LABEL) + expect(label).toHaveClass('min-w-0', 'block', 'truncate') + expect(item?.querySelector('[data-testid="column-icon"]')).not.toBeNull() + expect(item?.querySelectorAll('svg')).toHaveLength(2) + }) +}) diff --git a/apps/sim/app/workspace/[workspaceId]/components/resource/components/resource-options/resource-options.tsx b/apps/sim/app/workspace/[workspaceId]/components/resource/components/resource-options/resource-options.tsx index af98a4ccfbf..1ef14e3478c 100644 --- a/apps/sim/app/workspace/[workspaceId]/components/resource/components/resource-options/resource-options.tsx +++ b/apps/sim/app/workspace/[workspaceId]/components/resource/components/resource-options/resource-options.tsx @@ -287,7 +287,7 @@ export const SortDropdown = memo(function SortDropdown({ }} > {Icon && } - {option.label} + {DirectionIcon && ( )}