From b1af15baf7cf344071ef22c6adaf19182557ee82 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Thu, 27 Aug 2026 19:29:16 -0700 Subject: [PATCH] improvement(tables): simplify column dropdown --- .../column-config-sidebar/column-types.ts | 4 +- .../components/column-config-sidebar/index.ts | 7 +-- .../column-dropdown/column-dropdown.test.tsx | 58 +++++++++++++++++++ .../column-dropdown.tsx} | 24 +++----- .../components/column-dropdown/index.ts | 1 + .../tables/[tableId]/components/index.ts | 2 +- .../components/new-column-dropdown/index.ts | 1 - .../components/table-grid/table-grid.tsx | 20 +++++-- .../[workspaceId]/tables/[tableId]/table.tsx | 4 +- 9 files changed, 88 insertions(+), 33 deletions(-) create mode 100644 apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/column-dropdown/column-dropdown.test.tsx rename apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/{new-column-dropdown/new-column-dropdown.tsx => column-dropdown/column-dropdown.tsx} (82%) create mode 100644 apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/column-dropdown/index.ts delete mode 100644 apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/new-column-dropdown/index.ts diff --git a/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/column-config-sidebar/column-types.ts b/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/column-config-sidebar/column-types.ts index 2f235137f17..a6ea0ba2ac1 100644 --- a/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/column-config-sidebar/column-types.ts +++ b/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/column-config-sidebar/column-types.ts @@ -8,9 +8,9 @@ import { ALL_COLUMN_TYPES } from '@/lib/table/column-types' * "+ New column" dropdown to spawn a workflow group; the resulting columns are * stored as scalar types under the hood (none carry `'workflow'`). */ -export type SidebarColumnType = ColumnDefinition['type'] | 'workflow' +type SidebarColumnType = ColumnDefinition['type'] | 'workflow' -export interface ColumnTypeOption { +interface ColumnTypeOption { type: SidebarColumnType label: string icon: React.ComponentType<{ className?: string }> diff --git a/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/column-config-sidebar/index.ts b/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/column-config-sidebar/index.ts index e458001136d..0308447977f 100644 --- a/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/column-config-sidebar/index.ts +++ b/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/column-config-sidebar/index.ts @@ -1,8 +1,3 @@ export type { ColumnConfig } from './column-config-sidebar' export { ColumnConfigSidebar } from './column-config-sidebar' -export { - COLUMN_TYPE_OPTIONS, - type ColumnTypeOption, - PLAIN_COLUMN_TYPE_OPTIONS, - type SidebarColumnType, -} from './column-types' +export { COLUMN_TYPE_OPTIONS, PLAIN_COLUMN_TYPE_OPTIONS } from './column-types' diff --git a/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/column-dropdown/column-dropdown.test.tsx b/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/column-dropdown/column-dropdown.test.tsx new file mode 100644 index 00000000000..6409eb7f513 --- /dev/null +++ b/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/column-dropdown/column-dropdown.test.tsx @@ -0,0 +1,58 @@ +/** + * @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 { COLUMN_TYPE_OPTIONS } from '@/app/workspace/[workspaceId]/tables/[tableId]/components/column-config-sidebar' +import { ColumnDropdown } from '@/app/workspace/[workspaceId]/tables/[tableId]/components/column-dropdown/column-dropdown' + +let container: HTMLDivElement +let root: Root + +beforeEach(() => { + globalThis.IS_REACT_ACT_ENVIRONMENT = true + container = document.createElement('div') + document.body.appendChild(container) + root = createRoot(container) +}) + +afterEach(() => { + act(() => root.unmount()) + container.remove() +}) + +describe('ColumnDropdown', () => { + it('lists Enrichments as a regular entry after the column options', () => { + const onPickEnrichment = vi.fn() + + act(() => { + root.render( + + ) + }) + act(() => { + container + .querySelector('button') + ?.dispatchEvent(new MouseEvent('pointerdown', { bubbles: true, button: 0 })) + }) + + const items = [...document.body.querySelectorAll('[role="menuitem"]')] + expect(items.map((item) => item.textContent)).toEqual([ + ...COLUMN_TYPE_OPTIONS.map((option) => option.label), + 'Enrichments', + ]) + expect(document.body.querySelector('[role="separator"]')).toBeNull() + + act(() => items.at(-1)?.click()) + expect(onPickEnrichment).toHaveBeenCalledOnce() + }) +}) diff --git a/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/new-column-dropdown/new-column-dropdown.tsx b/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/column-dropdown/column-dropdown.tsx similarity index 82% rename from apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/new-column-dropdown/new-column-dropdown.tsx rename to apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/column-dropdown/column-dropdown.tsx index 2e9b21332dc..c1829b3febe 100644 --- a/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/new-column-dropdown/new-column-dropdown.tsx +++ b/apps/sim/app/workspace/[workspaceId]/tables/[tableId]/components/column-dropdown/column-dropdown.tsx @@ -8,7 +8,6 @@ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, - DropdownMenuSeparator, DropdownMenuTrigger, Plus, } from '@sim/emcn' @@ -19,7 +18,7 @@ import { COLUMN_TYPE_OPTIONS } from '../column-config-sidebar' const CELL_HEADER = 'border-[var(--border)] border-r border-b bg-[var(--bg)] px-2 py-[7px] text-left align-middle' -interface NewColumnDropdownProps { +interface ColumnDropdownProps { /** `'header'` renders the page-header trigger (subtle Button); `'inline-header'` renders * the in-table column-header `` trigger. Same dropdown content either way. */ trigger: 'header' | 'inline-header' @@ -42,7 +41,7 @@ interface NewColumnDropdownProps { * Lists every column type plus "Workflow" and "Enrichments"; picking a type * opens the right sidebar pre-seeded. */ -export function NewColumnDropdown({ +export function ColumnDropdown({ trigger, disabled, onPickType, @@ -50,7 +49,7 @@ export function NewColumnDropdown({ onPickEnrichment, blocked, onBlocked, -}: NewColumnDropdownProps) { +}: ColumnDropdownProps) { const triggerButton = trigger === 'header' ? (