authorgravatar for 136640686+MatthewFeroz@users.noreply.github.comMatthew Feroz <136640686+MatthewFeroz@users.noreply.github.com> 2026-09-05 18:57:13-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-09-06 04:27:13+05:30
log54441e63d824d4df11d031fc4811d1af9077e67f
treeb67237e814f22aaec103cbde16357fb4cc2496e7
parent5fe5c6fe9bb72c6e8ce9c1724a3887381d3f5cf7
signature Signed by PGP key B5690EEEBB952194

fix(web): copy provider update commands from compact rows (#9888)


1 files changed, 35 insertions(+), 9 deletions(-)

apps/web/src/components/settings/ProviderInstanceCard.tsx+35-9
...@@ -598,15 +598,19 @@ export function ProviderInstanceCard({...@@ -598,15 +598,19 @@ export function ProviderInstanceCard({
598 selected ? "bg-muted/45" : "hover:bg-muted/25",598 selected ? "bg-muted/45" : "hover:bg-muted/25",
599 )}599 )}
600 >600 >
601 <button601 <div
602 type="button"
603 className={cn(602 className={cn(
604 "flex min-w-0 flex-1 cursor-pointer items-start gap-3 rounded-md text-left outline-none transition-opacity focus-visible:ring-2 focus-visible:ring-ring",603 "pointer-events-none relative flex min-w-0 flex-1 items-start gap-3 rounded-md text-left transition-opacity",
605 !enabled && !selected && "opacity-60 group-hover:opacity-100",604 !enabled && !selected && "opacity-60 group-hover:opacity-100",
606 )}605 )}
607 onClick={onSelect}
608 aria-pressed={selected}
609 >606 >
607 <button
608 type="button"
609 className="pointer-events-auto absolute inset-0 cursor-pointer rounded-md outline-none focus-visible:ring-2 focus-visible:ring-ring"
610 onClick={onSelect}
611 aria-label={`Select ${displayName}`}
612 aria-pressed={selected}
613 />
610 {titleIconNode}614 {titleIconNode}
611 <span className="min-w-0 flex-1">615 <span className="min-w-0 flex-1">
612 <span className="flex min-w-0 items-center gap-2">616 <span className="flex min-w-0 items-center gap-2">
...@@ -622,9 +626,31 @@ export function ProviderInstanceCard({...@@ -622,9 +626,31 @@ export function ProviderInstanceCard({
622 </code>626 </code>
623 ) : null}627 ) : null}
624 {versionAdvisory ? (628 {versionAdvisory ? (
625 <span role="img" aria-label="Update available" className="inline-flex shrink-0">629 updateCommand ? (
626 <ArrowUpCircleIcon className="size-3.5 text-muted-foreground" />630 <Tooltip>
627 </span>631 <TooltipTrigger
632 render={
633 <Button
634 type="button"
635 size="icon-micro"
636 variant="ghost-muted"
637 className="pointer-events-auto relative shrink-0"
638 aria-label={`Copy ${displayName} update command`}
639 onClick={() =>
640 copyToClipboard(updateCommand, { providerName: displayName })
641 }
642 >
643 <ArrowUpCircleIcon className="size-3.5" />
644 </Button>
645 }
646 />
647 <TooltipPopup side="top">Copy update command</TooltipPopup>
648 </Tooltip>
649 ) : (
650 <span role="img" aria-label="Update available" className="inline-flex shrink-0">
651 <ArrowUpCircleIcon className="size-3.5 text-muted-foreground" />
652 </span>
653 )
628 ) : null}654 ) : null}
629 </span>655 </span>
630 <span className="mt-0.5 flex items-start gap-1.5 text-[13px] leading-[1.45] text-muted-foreground/80">656 <span className="mt-0.5 flex items-start gap-1.5 text-[13px] leading-[1.45] text-muted-foreground/80">
...@@ -637,7 +663,7 @@ export function ProviderInstanceCard({...@@ -637,7 +663,7 @@ export function ProviderInstanceCard({
637 </span>663 </span>
638 </span>664 </span>
639 </span>665 </span>
640 </button>666 </div>
641 <span className="flex h-5 shrink-0 items-center">667 <span className="flex h-5 shrink-0 items-center">
642 <Switch668 <Switch
643 checked={enabled}669 checked={enabled}