add with data field to branch (#37451)

* add with data field to branch

* Fix types

---------

Co-authored-by: Joshen Lim <joshenlimek@gmail.com>
This commit is contained in:
Saxon Fletcher
2025-07-28 20:14:55 +10:00
committed by GitHub
parent d6fdb20a2a
commit 4bfdbe32ac
5 changed files with 78 additions and 19 deletions

View File

@@ -42,13 +42,16 @@ import {
Form_Shadcn_,
Input_Shadcn_,
Label_Shadcn_ as Label,
Switch,
cn,
} from 'ui'
import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
import { useCheckPermissions } from 'hooks/misc/useCheckPermissions'
import { PermissionAction } from '@supabase/shared-types/out/constants'
import { useFlag } from 'hooks/ui/useFlag'
export const CreateBranchModal = () => {
const allowDataBranching = useFlag('allowDataBranching')
const { ref } = useParams()
const router = useRouter()
const queryClient = useQueryClient()
@@ -141,6 +144,7 @@ export const CreateBranchModal = () => {
(val) => gitlessBranching || !githubConnection || (val && val.length > 0),
'Git branch name is required when GitHub is connected'
),
withData: z.boolean().default(false).optional(),
})
.superRefine(async (val, ctx) => {
if (val.gitBranchName && val.gitBranchName.length > 0 && githubConnection?.repository.id) {
@@ -164,7 +168,7 @@ export const CreateBranchModal = () => {
mode: 'onSubmit',
reValidateMode: 'onBlur',
resolver: zodResolver(FormSchema),
defaultValues: { branchName: '', gitBranchName: '' },
defaultValues: { branchName: '', gitBranchName: '', withData: false },
})
const canSubmit = !isCreating && !isChecking
@@ -184,6 +188,7 @@ export const CreateBranchModal = () => {
branchName: data.branchName,
is_default: false,
...(data.gitBranchName ? { gitBranch: data.gitBranchName } : {}),
...(allowDataBranching ? { withData: data.withData } : {}),
})
}
@@ -295,6 +300,7 @@ export const CreateBranchModal = () => {
)}
/>
)}
{isLoadingConnections && <GenericSkeletonLoader />}
{isErrorConnections && (
<AlertError
@@ -315,7 +321,7 @@ export const CreateBranchModal = () => {
</Badge>
)}
</div>
<p className="text-sm text-foreground-light">
<p className="text-sm text-foreground-lighter">
Keep this preview branch in sync with a chosen GitHub branch
</p>
</div>
@@ -326,6 +332,23 @@ export const CreateBranchModal = () => {
)}
</>
)}
{allowDataBranching && (
<FormField_Shadcn_
control={form.control}
name="withData"
render={({ field }) => (
<FormItemLayout
label="Include data"
layout="flex-row-reverse"
description="Clone production data into this branch"
>
<FormControl_Shadcn_>
<Switch checked={field.value} onCheckedChange={field.onChange} />
</FormControl_Shadcn_>
</FormItemLayout>
)}
/>
)}
</DialogSection>
<DialogSectionSeparator />

View File

@@ -11,6 +11,7 @@ export type BranchCreateVariables = {
branchName: string
gitBranch?: string
region?: string
withData?: boolean
}
export async function createBranch({
@@ -19,6 +20,7 @@ export async function createBranch({
branchName,
gitBranch,
region,
withData,
}: BranchCreateVariables) {
const { data, error } = await post('/v1/projects/{ref}/branches', {
params: {
@@ -29,6 +31,7 @@ export async function createBranch({
branch_name: branchName,
git_branch: gitBranch,
region: region,
with_data: withData,
},
})

View File

@@ -19,6 +19,9 @@ const WHITELIST_ERRORS = [
'already exists in your organization.',
]
type CreateProjectBody = components['schemas']['CreateProjectBody']
type CloudProvider = CreateProjectBody['cloud_provider']
export type ProjectCreateVariables = {
name: string
organizationSlug: string
@@ -51,8 +54,8 @@ export async function createProject({
postgresEngine,
releaseChannel,
}: ProjectCreateVariables) {
const body: components['schemas']['CreateProjectBody'] = {
cloud_provider: cloudProvider,
const body: CreateProjectBody = {
cloud_provider: cloudProvider as CloudProvider,
organization_slug: organizationSlug,
name,
db_pass: dbPass,

View File

@@ -2450,6 +2450,11 @@ export interface components {
grant_type?: 'authorization_code' | 'refresh_token'
redirect_uri?: string
refresh_token?: string
/**
* @description Resource indicator for MCP (Model Context Protocol) clients
* @enum {string}
*/
resource?: 'http://localhost:8080/mcp'
}
OAuthTokenResponse: {
access_token: string
@@ -3697,7 +3702,11 @@ export interface operations {
client_id: string
code_challenge?: string
code_challenge_method?: 'plain' | 'sha256' | 'S256'
/** @description Organization slug */
organization_slug?: string
redirect_uri: string
/** @description Resource indicator for MCP (Model Context Protocol) clients */
resource?: 'http://localhost:8080/mcp'
response_mode?: string
response_type: 'code' | 'token' | 'id_token token'
scope?: string

View File

@@ -4702,7 +4702,8 @@ export interface components {
}
CreateProjectBody: {
auth_site_url?: string
cloud_provider: string
/** @enum {string} */
cloud_provider: 'AWS' | 'FLY' | 'AWS_K8S'
custom_supabase_internal_requests?: {
ami: {
search_tags?: {
@@ -5091,7 +5092,7 @@ export interface components {
}
DatabaseDetailResponse: {
/** @enum {string} */
cloud_provider: 'AWS' | 'AWS_K8S' | 'FLY'
cloud_provider: 'AWS' | 'FLY' | 'AWS_K8S'
/** @default null */
connection_string_read_only?: string | null
/** @default null */
@@ -5295,10 +5296,6 @@ export interface components {
file_url: string
fileUrl: string
}
GetAvailableRegionsBody: {
cloud_provider: string
organization_slug: string
}
GetContentCountResponse: {
count: number
}
@@ -6390,7 +6387,8 @@ export interface components {
}[]
}
OrganizationSlugAvailableVersionsBody: {
provider: string
/** @enum {string} */
provider: 'AWS' | 'FLY' | 'AWS_K8S'
region: string
}
OrganizationSlugAvailableVersionsResponse: {
@@ -7290,7 +7288,7 @@ export interface components {
code: string
name: string
/** @enum {string} */
provider: 'AWS' | 'AWS_K8S' | 'FLY'
provider: 'AWS' | 'FLY' | 'AWS_K8S'
/** @enum {string} */
status?: 'capacity' | 'other'
/** @enum {string} */
@@ -7309,7 +7307,7 @@ export interface components {
code: string
name: string
/** @enum {string} */
provider: 'AWS' | 'AWS_K8S' | 'FLY'
provider: 'AWS' | 'FLY' | 'AWS_K8S'
/** @enum {string} */
status?: 'capacity' | 'other'
/** @enum {string} */
@@ -11775,6 +11773,12 @@ export interface operations {
'application/json': components['schemas']['InvitationResponse']
}
}
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Failed to get organization invitations */
500: {
headers: {
@@ -11806,6 +11810,12 @@ export interface operations {
}
content?: never
}
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Failed to create organization invitation */
500: {
headers: {
@@ -18180,6 +18190,12 @@ export interface operations {
}
content?: never
}
403: {
headers: {
[name: string]: unknown
}
content?: never
}
/** @description Failed to get project's status */
500: {
headers: {
@@ -18253,16 +18269,15 @@ export interface operations {
}
ProjectsController_getRegions: {
parameters: {
query?: never
query: {
cloud_provider: 'AWS' | 'FLY' | 'AWS_K8S'
organization_slug: string
}
header?: never
path?: never
cookie?: never
}
requestBody: {
content: {
'application/json': components['schemas']['GetAvailableRegionsBody']
}
}
requestBody?: never
responses: {
200: {
headers: {
@@ -18293,6 +18308,12 @@ export interface operations {
'application/json': components['schemas']['GetProjectByFlyExtensionIdResponse']
}
}
403: {
headers: {
[name: string]: unknown
}
content?: never
}
}
}
ReplicationDestinationsController_getDestinations: {