feat: add ability to copy executionId from deployment details page#2694
feat: add ability to copy executionId from deployment details page#2694rmnbrd wants to merge 1 commit into
Conversation
There was a problem hiding this comment.
Pull request overview
Adds a copy-to-clipboard interaction for the “execution id” shown in the deployment details header, providing quick access to the full ID directly from the UI.
Changes:
- Wraps the execution id badge in a clickable button that copies the current
deploymentIdto the clipboard. - Adds temporary “copied” feedback via icon transitions (code → copy on hover → check after click).
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| @@ -47,14 +58,50 @@ export function HeaderEnvironmentStages({ | |||
| {Math.floor(totalDurationSec / 60)}m : {totalDurationSec % 60}s | |||
| </span> | |||
| </Badge> | |||
| <Badge variant="surface" className="max-w-full whitespace-nowrap"> | |||
| <Tooltip side="bottom" content={<span>Execution id: {deploymentId}</span>}> | |||
| <span className="flex items-center gap-1.5 truncate"> | |||
| <Icon iconName="code" iconStyle="regular" className="text-sm text-neutral-subtle" /> | |||
| <span className="font-normal text-neutral">{trimId(deploymentId ?? '')}</span> | |||
| </span> | |||
| </Tooltip> | |||
| </Badge> | |||
| <Tooltip side="bottom" content={<span>Execution id: {deploymentId}</span>}> | |||
| <button | |||
| type="button" | |||
| aria-label="Copy execution id" | |||
| disabled={!deploymentId} | |||
| onClick={handleCopyExecutionId} | |||
| @@ -47,14 +58,50 @@ export function HeaderEnvironmentStages({ | |||
| {Math.floor(totalDurationSec / 60)}m : {totalDurationSec % 60}s | |||
| </span> | |||
| </Badge> | |||
| <Badge variant="surface" className="max-w-full whitespace-nowrap"> | |||
| <Tooltip side="bottom" content={<span>Execution id: {deploymentId}</span>}> | |||
| <span className="flex items-center gap-1.5 truncate"> | |||
| <Icon iconName="code" iconStyle="regular" className="text-sm text-neutral-subtle" /> | |||
| <span className="font-normal text-neutral">{trimId(deploymentId ?? '')}</span> | |||
| </span> | |||
| </Tooltip> | |||
| </Badge> | |||
| <Tooltip side="bottom" content={<span>Execution id: {deploymentId}</span>}> | |||
| <button | |||
| type="button" | |||
| aria-label="Copy execution id" | |||
| disabled={!deploymentId} | |||
| onClick={handleCopyExecutionId} | |||
| className="group inline-flex disabled:cursor-default" | |||
| > | |||
| <Badge | |||
| variant="surface" | |||
| className="max-w-full cursor-pointer whitespace-nowrap transition-colors hover:bg-surface-neutral-componentHover group-disabled:cursor-default group-disabled:hover:bg-surface-neutral-subtle" | |||
| > | |||
| <span className="flex items-center gap-1.5 truncate"> | |||
| <span className="relative flex size-4 shrink-0 items-center justify-center"> | |||
| <Icon | |||
| iconName="code" | |||
| iconStyle="regular" | |||
| className={clsx('absolute text-sm text-neutral-subtle transition-opacity', { | |||
| 'opacity-0': isCopied, | |||
| 'opacity-100 group-hover:opacity-0': !isCopied, | |||
| })} | |||
| /> | |||
| <Icon | |||
| iconName="copy" | |||
| iconStyle="regular" | |||
| className={clsx('absolute text-sm text-neutral-subtle transition-opacity', { | |||
| 'opacity-0': isCopied, | |||
| 'opacity-0 group-hover:opacity-100': !isCopied, | |||
| })} | |||
| /> | |||
| <Icon | |||
| iconName="check" | |||
| iconStyle="regular" | |||
| className={clsx('absolute text-sm text-neutral-subtle transition-opacity', { | |||
| 'opacity-100': isCopied, | |||
| 'opacity-0': !isCopied, | |||
| })} | |||
| /> | |||
| </span> | |||
| <span className="font-normal text-neutral">{trimId(deploymentId ?? '')}</span> | |||
| </span> | |||
| </Badge> | |||
| </button> | |||
| const handleCopyExecutionId = () => { | ||
| if (!deploymentId) return | ||
|
|
||
| copyToClipboard(deploymentId) | ||
| setIsCopied(true) | ||
| setTimeout(() => setIsCopied(false), 1000) | ||
| } |
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## staging #2694 +/- ##
===========================================
- Coverage 44.72% 35.87% -8.86%
===========================================
Files 1093 7 -1086
Lines 23121 131 -22990
Branches 6762 50 -6712
===========================================
- Hits 10342 47 -10295
+ Misses 10986 73 -10913
+ Partials 1793 11 -1782
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
Yes, but this one is plain text, the other is inside a Badge component with borders. |
|
@rmnbrd We can harmonize, and maybe put everything in the deployment logs in badge so we don't have the issue again. |


Summary
Issue: Slack thread
Screenshots / Recordings
Screen.Recording.2026-05-20.at.08.24.16.mov
Testing
yarn testoryarn test -u(if you need to regenerate snapshots)yarn formatyarn lintPR Checklist
.cursor/rules)feat(service): add new Terraform service) - required for semantic-release