Skip to content

Commit 5ae2471

Browse files
authored
fix(webapp): use native selectable row controls (#4700)
## Summary Use native controls for sortable columns and selectable prompt versions. Table headers keep filter actions separate from sort buttons, prompt version rows expose pressed state, and a redundant deployment click interceptor is removed. Base: [#4699](#4699)
1 parent 3d65024 commit 5ae2471

3 files changed

Lines changed: 21 additions & 12 deletions

File tree

  • apps/webapp/app
    • components/code
    • routes
      • _app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.deployments
      • _app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.prompts.$promptSlug

apps/webapp/app/components/code/TSQLResultsTable.tsx

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -927,6 +927,8 @@ function HeaderCellContent({
927927

928928
const sortHighlighted = isCellHovered && !isFilterHovered;
929929

930+
/* oxlint-disable jsx-a11y/click-events-have-key-events -- The sortable header contains separate tooltip and filter controls that cannot be nested in a button. */
931+
/* oxlint-disable jsx-a11y/no-static-element-interactions -- Preserve the existing full-header pointer target rather than nesting its child controls. */
930932
return (
931933
<div
932934
className={cn(
@@ -946,7 +948,7 @@ function HeaderCellContent({
946948
})}
947949
>
948950
<span className="truncate text-left">{children}</span>
949-
<span className="flex shrink-0">
951+
<span className="flex shrink-0" onClick={(event) => event.stopPropagation()}>
950952
<InfoIconTooltip
951953
content={tooltip}
952954
contentClassName="normal-case tracking-normal"
@@ -958,11 +960,17 @@ function HeaderCellContent({
958960
) : (
959961
<span className="min-w-0 flex-1 truncate text-left">{children}</span>
960962
)}
961-
{/* Sort indicator */}
963+
{/* The full header remains a pointer target, while this dedicated control makes sorting keyboard-accessible without nesting the tooltip or filter controls. */}
962964
{canSort && (
963-
<span
965+
<button
966+
type="button"
967+
aria-label="Toggle sort"
968+
onClick={(event) => {
969+
event.stopPropagation();
970+
onSortClick?.(event);
971+
}}
964972
className={cn(
965-
"shrink-0 transition-colors",
973+
"shrink-0 rounded transition-colors focus-custom",
966974
sortHighlighted ? "text-text-bright" : "text-text-dimmed"
967975
)}
968976
>
@@ -973,7 +981,7 @@ function HeaderCellContent({
973981
) : (
974982
<ChevronUpDownIcon className="size-4" />
975983
)}
976-
</span>
984+
</button>
977985
)}
978986
{onFilterClick && (
979987
<button
@@ -993,6 +1001,8 @@ function HeaderCellContent({
9931001
</div>
9941002
);
9951003
}
1004+
/* oxlint-enable jsx-a11y/click-events-have-key-events */
1005+
/* oxlint-enable jsx-a11y/no-static-element-interactions */
9961006

9971007
/**
9981008
* Filter input cell for the filter row

apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.deployments/route.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -340,10 +340,7 @@ export default function Page() {
340340
{hasVercelIntegration && (
341341
<TableCell isSelected={isSelected}>
342342
{deployment.vercelDeploymentUrl ? (
343-
<div
344-
className="-ml-1 flex items-center"
345-
onClick={(e) => e.stopPropagation()}
346-
>
343+
<div className="-ml-1 flex items-center">
347344
<VercelLink
348345
vercelDeploymentUrl={deployment.vercelDeploymentUrl}
349346
/>

apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.prompts.$promptSlug/route.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2093,11 +2093,13 @@ function VersionsTab({
20932093
const isOverride = v.labels.includes("override");
20942094

20952095
return (
2096-
<div
2096+
<button
2097+
type="button"
2098+
aria-pressed={isSelected}
20972099
key={v.id}
20982100
onClick={() => onSelectVersion(v.version)}
20992101
className={cn(
2100-
"flex cursor-pointer items-center gap-3 px-3 py-3 text-sm transition",
2102+
"flex w-full cursor-pointer items-center gap-3 px-3 py-3 text-left text-sm transition focus-custom",
21012103
isSelected
21022104
? "bg-indigo-500/10 hover:bg-indigo-500/[0.07]"
21032105
: "hover:bg-background-hover"
@@ -2143,7 +2145,7 @@ function VersionsTab({
21432145
<span className="shrink-0 text-xs text-text-dimmed">
21442146
<DateTime date={v.createdAt} />
21452147
</span>
2146-
</div>
2148+
</button>
21472149
);
21482150
})}
21492151
</div>

0 commit comments

Comments
 (0)