From 4760c1af77ee53e46ffbc62cbeeb63aee0120a41 Mon Sep 17 00:00:00 2001 From: Danny White <3104761+dnywh@users.noreply.github.com> Date: Tue, 18 Aug 2026 14:25:42 +1000 Subject: [PATCH 01/21] feat(studio): polish PrivateLink connection UI (#49164) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## What kind of change does this PR introduce? Polish for the AWS PrivateLink integrations UI. ## What is the current behavior? The add/view sheet labels the optional nickname field as "Description", delete confirmation always shows the AWS account ID, list admonitions use generic copy, and delete uses a fire-and-forget mutation. ## What is the new behavior? - Rename the optional nickname field to **Name**, with helper copy explaining it appears on the connections list - Tighten list admonition copy to reference connections below and pluralise share wording - Rename `showAcceptLink` to `shouldShowAcceptLink` - Delete confirmation uses the connection name (or account ID when unnamed) and clearer read replica fallback copy - Delete uses `mutateAsync` so the dialog can await the mutation | Before | After | | --- | --- | | Integrations Settings Chisel
Toolshed Supabase | Integrations Settings Chisel
Toolshed Supabase | ## To test 1. Open **Project settings → Integrations → AWS PrivateLink** on a project with PrivateLink access 2. Click **Add connection** and confirm the optional field is labelled **Name** with helper copy underneath 3. Add a connection with a name (e.g. `Production VPC`) and confirm the list row shows that title 4. If you have a waiting or expired connection, confirm the list admonition copy references shares below 5. Open a named connection, click **Delete**, and confirm the dialog uses the connection name rather than always showing the raw account ID 6. Cancel delete and confirm the sheet stays open ## Summary by CodeRabbit * **Improvements** * Updated AWS PrivateLink connection messages with clearer singular and plural wording. * Improved guidance for expired and pending connections, including acceptance-instruction links. * Renamed the account field to “Name,” marked it optional, and clarified its purpose and default behavior. * Enhanced deletion confirmations with clearer connection names and AWS account identifiers. * Improved deletion handling to provide more reliable feedback. --- .../AWSPrivateLink.utils.test.ts | 6 ++- .../AWSPrivateLink/AWSPrivateLink.utils.ts | 15 +++--- .../AWSPrivateLinkAttentionAdmonition.tsx | 2 +- .../AWSPrivateLink/AWSPrivateLinkForm.tsx | 7 ++- .../AWSPrivateLink/AWSPrivateLinkSection.tsx | 54 ++++++++++++------- 5 files changed, 52 insertions(+), 32 deletions(-) diff --git a/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLink.utils.test.ts b/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLink.utils.test.ts index 5e184b8399e62..753f200f5f595 100644 --- a/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLink.utils.test.ts +++ b/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLink.utils.test.ts @@ -60,14 +60,16 @@ describe('getConnectionsAttentionCopy', () => { const copy = getConnectionsAttentionCopy({ waitingCount: 1, expiredCount: 0 }) expect(copy?.type).toBe('warning') expect(copy?.title).toBe('Waiting for the AWS account owner') - expect(copy?.showAcceptLink).toBe(true) + expect(copy?.description).toBe('Accept the resource share in AWS within 12 hours.') + expect(copy?.shouldShowAcceptLink).toBe(true) }) it('uses destructive copy when only expired', () => { const copy = getConnectionsAttentionCopy({ waitingCount: 0, expiredCount: 2 }) expect(copy?.type).toBe('destructive') expect(copy?.title).toBe('Connection requests expired') - expect(copy?.showAcceptLink).toBe(false) + expect(copy?.description).toBe('AWS can no longer accept these shares.') + expect(copy?.shouldShowAcceptLink).toBe(false) }) it('counts statuses from a list', () => { diff --git a/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLink.utils.ts b/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLink.utils.ts index 8820e95f2877a..74fe7930ab9a5 100644 --- a/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLink.utils.ts +++ b/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLink.utils.ts @@ -73,7 +73,7 @@ export function getConnectionsAttentionCopy(attention: ConnectionsAttention): { type: 'warning' | 'destructive' title: string description: string - showAcceptLink: boolean + shouldShowAcceptLink: boolean } | null { const { waitingCount, expiredCount } = attention if (waitingCount === 0 && expiredCount === 0) return null @@ -82,8 +82,8 @@ export function getConnectionsAttentionCopy(attention: ConnectionsAttention): { return { type: 'destructive', title: expiredCount === 1 ? 'A connection request expired' : 'Connection requests expired', - description: 'Add a new connection to try again. AWS can no longer accept this share.', - showAcceptLink: false, + description: `AWS can no longer accept ${expiredCount === 1 ? 'this share' : 'these shares'}.`, + shouldShowAcceptLink: false, } } @@ -91,9 +91,8 @@ export function getConnectionsAttentionCopy(attention: ConnectionsAttention): { return { type: 'warning', title: 'Some connections need attention', - description: - 'Accept waiting resource shares in AWS within 12 hours. Expired requests need a new connection.', - showAcceptLink: true, + description: `Accept the waiting resource share${waitingCount === 1 ? '' : 's'} in AWS within 12 hours.`, + shouldShowAcceptLink: true, } } @@ -101,7 +100,7 @@ export function getConnectionsAttentionCopy(attention: ConnectionsAttention): { type: 'warning', title: waitingCount === 1 ? 'Waiting for the AWS account owner' : 'Waiting for AWS account owners', - description: 'Accept the resource share in AWS within 12 hours.', - showAcceptLink: true, + description: `Accept the resource share${waitingCount === 1 ? '' : 's'} in AWS within 12 hours.`, + shouldShowAcceptLink: true, } } diff --git a/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLinkAttentionAdmonition.tsx b/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLinkAttentionAdmonition.tsx index 70e00e5c023c5..f2d4258d9fc9f 100644 --- a/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLinkAttentionAdmonition.tsx +++ b/apps/studio/components/interfaces/Settings/Integrations/AWSPrivateLink/AWSPrivateLinkAttentionAdmonition.tsx @@ -25,7 +25,7 @@ export function AWSPrivateLinkAttentionAdmonition({ description={copy.description} className={className} actions={ - copy.showAcceptLink && ( + copy.shouldShowAcceptLink && (