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:
@@ -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 />
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
})
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
9
packages/api-types/types/api.d.ts
vendored
9
packages/api-types/types/api.d.ts
vendored
@@ -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
|
||||
|
||||
51
packages/api-types/types/platform.d.ts
vendored
51
packages/api-types/types/platform.d.ts
vendored
@@ -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: {
|
||||
|
||||
Reference in New Issue
Block a user