From c9eb33abc7a53c4647a589213bf64ae0aab71618 Mon Sep 17 00:00:00 2001 From: Riccardo Busetti Date: Wed, 15 Jul 2026 08:20:59 +0200 Subject: [PATCH] feat(pipelines): Add new cost estimation dialog (#47915) --- .../AnalyticsBucket/AnalyticsBucket.utils.ts | 8 +- .../AnalyticsBucket/Fields.tsx | 8 +- .../BigQuery/BigQuery.utils.ts | 2 +- .../DestinationForm/BigQuery/Fields.tsx | 2 +- .../DestinationForm/DestinationForm.schema.ts | 19 +- .../DestinationForm.utils.test.ts | 38 +-- .../DuckLake/DuckLake.utils.ts | 14 +- .../DestinationForm/DuckLake/Fields.tsx | 8 +- .../DestinationForm/PipelineCostDialog.tsx | 248 ++++++++++++++++++ .../DestinationForm/index.tsx | 116 ++++---- .../ReadReplicaPricingDialog.tsx | 79 +++--- .../Database/Replication/DestinationRow.tsx | 12 +- .../Database/Replication/Destinations.tsx | 18 +- .../Organization/Usage/Usage.constants.tsx | 14 +- .../Usage/UsageSection/DiskUsage.tsx | 108 ++++---- .../data/replication/cost-estimate-query.ts | 57 ++++ apps/studio/data/replication/keys.ts | 14 + packages/api-types/types/platform.d.ts | 150 +++++++++++ 18 files changed, 723 insertions(+), 192 deletions(-) create mode 100644 apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/PipelineCostDialog.tsx create mode 100644 apps/studio/data/replication/cost-estimate-query.ts diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/AnalyticsBucket/AnalyticsBucket.utils.ts b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/AnalyticsBucket/AnalyticsBucket.utils.ts index f516a8ba8ec..3aeb5cd9060 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/AnalyticsBucket/AnalyticsBucket.utils.ts +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/AnalyticsBucket/AnalyticsBucket.utils.ts @@ -22,8 +22,8 @@ type AnalyticsBucketValidationOptions = { // Fields that are always required regardless of the namespace / access key selections. const ANALYTICS_BUCKET_REQUIRED_FIELDS: AnalyticsBucketValidationIssue[] = [ { path: 'warehouseName', message: 'Bucket is required' }, - { path: 's3Region', message: 'S3 Region is required' }, - { path: 's3AccessKeyId', message: 'S3 Access Key ID is required' }, + { path: 's3Region', message: 'S3 region is required' }, + { path: 's3AccessKeyId', message: 'S3 access key ID is required' }, ] export const getAnalyticsBucketValidationIssues = ( @@ -53,7 +53,7 @@ export const getAnalyticsBucketValidationIssues = ( data.s3SecretAccessKey?.trim().length && !data.s3AccessKeyId?.trim().length ) { - issues.push({ path: 's3AccessKeyId', message: 'S3 Access Key ID is required' }) + issues.push({ path: 's3AccessKeyId', message: 'S3 access key ID is required' }) } const currentS3AccessKeyId = data.s3AccessKeyId?.trim() @@ -69,7 +69,7 @@ export const getAnalyticsBucketValidationIssues = ( (!options.secretsOptional || hasChangedStoredS3AccessKey) && !data.s3SecretAccessKey?.trim().length ) { - issues.push({ path: 's3SecretAccessKey', message: 'S3 Secret Access Key is required' }) + issues.push({ path: 's3SecretAccessKey', message: 'S3 secret access key is required' }) } return issues diff --git a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/AnalyticsBucket/Fields.tsx b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/AnalyticsBucket/Fields.tsx index ad102265009..eb674d27ea5 100644 --- a/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/AnalyticsBucket/Fields.tsx +++ b/apps/studio/components/interfaces/Database/Replication/DestinationPanel/DestinationForm/AnalyticsBucket/Fields.tsx @@ -255,7 +255,7 @@ export const AnalyticsBucketFields = ({ name="newNamespaceName" render={({ field }) => ( @@ -273,7 +273,7 @@ export const AnalyticsBucketFields = ({ render={({ field }) => (