authorgravatar for maria@kuuro.netmaria <maria@kuuro.net> 2026-09-03 17:44:05-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-09-03 17:44:05-04:00
log373be93e68bf3d32207471b27e976ac84bff806a
treed9749ee68bb09c00699fb4b669d3d661df66a003
parent03728361aa7beb9c13da320097450e6fe65aac3e
signature Signed by PGP key B5690EEEBB952194

fix(web): move workflow approval beside checks (#9465)

Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com>

1 files changed, 50 insertions(+), 47 deletions(-)

apps/web/src/components/pullRequest/PullRequestDetailPanel.tsx+50-47
...@@ -1478,41 +1478,6 @@ export function PullRequestDetailPanel({...@@ -1478,41 +1478,6 @@ export function PullRequestDetailPanel({
1478 </MenuPopup>1478 </MenuPopup>
1479 </Menu>1479 </Menu>
1480 ) : null}1480 ) : null}
1481 {workflowApprovalsRequired > 0 && can("approve-workflows") ? (
1482 <Tooltip>
1483 <TooltipTrigger
1484 render={
1485 <span className="inline-flex shrink-0">
1486 <Button
1487 size="xs"
1488 variant="warning-outline"
1489 disabled={actionPending}
1490 onClick={() =>
1491 setConfirmation({ open: true, action: "approve-workflows" })
1492 }
1493 aria-label={
1494 pendingAction === "approve-workflows"
1495 ? "Approving..."
1496 : "Approve workflows to run"
1497 }
1498 >
1499 <PlayIcon aria-hidden className="size-3.5" />
1500 <span className="@max-[40rem]/pr-header:hidden">
1501 {pendingAction === "approve-workflows"
1502 ? "Approving..."
1503 : "Approve workflows to run"}
1504 </span>
1505 </Button>
1506 </span>
1507 }
1508 />
1509 <TooltipPopup side="top">
1510 {pendingAction === "approve-workflows"
1511 ? "Approving..."
1512 : "Approve workflows to run"}
1513 </TooltipPopup>
1514 </Tooltip>
1515 ) : null}
1516 {/* Said where the Merge button is, because it is the answer to why nobody has1481 {/* Said where the Merge button is, because it is the answer to why nobody has
1517 pressed it: the merge is already asked for, and the host is holding it. */}1482 pressed it: the merge is already asked for, and the host is holding it. */}
1518 {autoMergeArmed && primaryAction !== "auto-merge-armed" ? (1483 {autoMergeArmed && primaryAction !== "auto-merge-armed" ? (
...@@ -2165,20 +2130,58 @@ export function PullRequestDetailPanel({...@@ -2165,20 +2130,58 @@ export function PullRequestDetailPanel({
2165 ))}2130 ))}
2166 </ToggleGroup>2131 </ToggleGroup>
2167 {tab === "summary" ? (2132 {tab === "summary" ? (
2168 <span2133 <span className="ml-auto inline-flex shrink-0 items-center">
2169 className="ml-auto inline-flex shrink-0 items-center gap-1.5 text-xs text-muted-foreground"2134 {workflowApprovalsRequired > 0 && can("approve-workflows") ? (
2170 aria-label={checksSummary ? `Checks: ${checksSummary}` : "Checks"}2135 <Tooltip>
2171 >2136 <TooltipTrigger
2172 {checksState !== null ? (2137 render={
2173 <PullRequestChecksPopover2138 <span className="inline-flex shrink-0">
2174 checks={detail.checks}2139 <Button
2175 checksState={checksState}2140 size="xs"
2176 threadRef={threadRef}2141 variant="warning-outline"
2177 />2142 disabled={actionPending}
2143 onClick={() =>
2144 setConfirmation({ open: true, action: "approve-workflows" })
2145 }
2146 aria-label={
2147 pendingAction === "approve-workflows"
2148 ? "Approving..."
2149 : "Approve workflows to run"
2150 }
2151 >
2152 <PlayIcon aria-hidden className="size-3.5" />
2153 <span>
2154 {pendingAction === "approve-workflows"
2155 ? "Approving..."
2156 : "Approve workflows to run"}
2157 </span>
2158 </Button>
2159 </span>
2160 }
2161 />
2162 <TooltipPopup side="top">
2163 {pendingAction === "approve-workflows"
2164 ? "Approving..."
2165 : "Approve workflows to run"}
2166 </TooltipPopup>
2167 </Tooltip>
2178 ) : (2168 ) : (
2179 <CircleDotIcon aria-hidden className="size-3.5" />2169 <span
2170 className="inline-flex items-center gap-1.5 text-xs text-muted-foreground"
2171 aria-label={checksSummary ? `Checks: ${checksSummary}` : "Checks"}
2172 >
2173 {checksState !== null ? (
2174 <PullRequestChecksPopover
2175 checks={detail.checks}
2176 checksState={checksState}
2177 threadRef={threadRef}
2178 />
2179 ) : (
2180 <CircleDotIcon aria-hidden className="size-3.5" />
2181 )}
2182 {checksSummary}
2183 </span>
2180 )}2184 )}
2181 {checksSummary}
2182 </span>2185 </span>
2183 ) : tab === "timeline" ? (2186 ) : tab === "timeline" ? (
2184 <div className="ml-auto flex shrink-0 items-center gap-2 text-xs text-muted-foreground">2187 <div className="ml-auto flex shrink-0 items-center gap-2 text-xs text-muted-foreground">