mirror of
https://github.com/supabase/supabase.git
synced 2026-06-11 06:19:22 +08:00
## What kind of change does this PR introduce? New shared component + docs. ## What is the current behavior? `AdvancedConfiguration` and `InternalOnlyConfiguration` in the New Project form each contain bespoke `<Collapsible>` markup. There's no reusable collapsible section component available to other card/panel forms. ## What is the new behavior? - Extracts a shared `CollapsibleCardSection` into `packages/ui-patterns`, exported via `ui-patterns/CollapsibleCardSection` - Refactors `AdvancedConfiguration` and `InternalOnlyConfiguration` to use it - Adds design system docs with a live demo at `/docs/fragments/collapsible-card-section` This is a prereq for #45707 and #46187, which both consume this component. | Example Usage | | --- | | <img width="1464" height="500" alt="CleanShot 2026-05-22 at 15 20 38@2x" src="https://github.com/user-attachments/assets/5b88ef8d-3f9a-4454-b246-5bbaf53e027a" /> | ## To test - [ ] Check that [the Design System page](https://design-system-git-dnywh-collapsible-card-section-supabase.vercel.app/design-system/docs/fragments/collapsible-card-section) makes sense - [ ] Check that the [new project form](https://studio-staging-git-dnywh-collapsible-card-section-supabase.vercel.app/dashboard/new/) collapsible sections work as expected <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit ## Release Notes * **New Features** * Introduced CollapsibleCardSection component as a reusable UI pattern for collapsible card-based content with customizable title, description, and open state. * Refactored project configuration interfaces to use the new component for improved visual consistency. * **Documentation** * Added comprehensive documentation with interactive examples and multiple usage patterns for CollapsibleCardSection. <!-- review_stack_entry_start --> [](https://app.coderabbit.ai/change-stack/supabase/supabase/pull/46250?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack) <!-- review_stack_entry_end --> <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Joshen Lim <joshenlimek@gmail.com>
123 lines
4.9 KiB
TypeScript
123 lines
4.9 KiB
TypeScript
import { useFlag } from 'common'
|
|
import { UseFormReturn } from 'react-hook-form'
|
|
import {
|
|
Badge,
|
|
Card,
|
|
CardContent,
|
|
cn,
|
|
FormControl,
|
|
FormField,
|
|
FormItem,
|
|
RadioGroupStacked,
|
|
RadioGroupStackedItem,
|
|
Tooltip,
|
|
TooltipContent,
|
|
TooltipTrigger,
|
|
} from 'ui'
|
|
import { Admonition } from 'ui-patterns'
|
|
import { CollapsibleCardSection } from 'ui-patterns/CollapsibleCardSection'
|
|
import { FormItemLayout } from 'ui-patterns/form/FormItemLayout/FormItemLayout'
|
|
|
|
import { CreateProjectForm } from './ProjectCreation.schema'
|
|
import { DocsButton } from '@/components/ui/DocsButton'
|
|
import { DOCS_URL } from '@/lib/constants'
|
|
|
|
interface AdvancedConfigurationProps {
|
|
form: UseFormReturn<CreateProjectForm>
|
|
}
|
|
|
|
export const AdvancedConfiguration = ({ form }: AdvancedConfigurationProps) => {
|
|
const disableOrioleProjectCreation = useFlag('disableOrioleProjectCreation')
|
|
|
|
return (
|
|
<Card className="border-0 border-b rounded-none">
|
|
<CardContent>
|
|
<CollapsibleCardSection
|
|
title="Advanced Configuration"
|
|
description="These settings cannot be changed after the project is created"
|
|
>
|
|
<FormField
|
|
name="useOrioleDb"
|
|
control={form.control}
|
|
render={({ field }) => (
|
|
<>
|
|
<FormItemLayout
|
|
layout="horizontal"
|
|
label="Postgres Type"
|
|
className="[&>div>label]:break-normal!"
|
|
>
|
|
<FormControl>
|
|
<RadioGroupStacked
|
|
// Due to radio group not supporting boolean values
|
|
// value is converted to boolean
|
|
onValueChange={(value) => field.onChange(value === 'true')}
|
|
defaultValue={field.value.toString()}
|
|
>
|
|
<FormItem asChild>
|
|
<FormControl>
|
|
<RadioGroupStackedItem
|
|
value="false"
|
|
// @ts-ignore
|
|
label={
|
|
<>
|
|
Postgres
|
|
<Badge>Default</Badge>
|
|
</>
|
|
}
|
|
description="Recommended for production workloads"
|
|
className="[&>div>div>p]:text-left [&>div>div>p]:text-xs [&>div>div>label]:flex [&>div>div>label]:items-center [&>div>div>label]:gap-x-2"
|
|
/>
|
|
</FormControl>
|
|
</FormItem>
|
|
<FormItem asChild>
|
|
<FormControl>
|
|
<Tooltip>
|
|
<TooltipTrigger asChild>
|
|
<RadioGroupStackedItem
|
|
value="true"
|
|
// @ts-ignore
|
|
label={
|
|
<>
|
|
Postgres with OrioleDB
|
|
<Badge variant="warning">Alpha</Badge>
|
|
</>
|
|
}
|
|
description="Not recommended for production workloads"
|
|
className={cn(
|
|
'[&>div>div>p]:text-left [&>div>div>p]:text-xs [&>div>div>label]:flex [&>div>div>label]:items-center [&>div>div>label]:gap-x-2',
|
|
form.getValues('useOrioleDb') ? 'rounded-b-none!' : ''
|
|
)}
|
|
disabled={disableOrioleProjectCreation}
|
|
/>
|
|
</TooltipTrigger>
|
|
{disableOrioleProjectCreation && (
|
|
<TooltipContent side="right" className="w-60 text-center">
|
|
OrioleDB is temporarily disabled for new projects. Please try again
|
|
later.
|
|
</TooltipContent>
|
|
)}
|
|
</Tooltip>
|
|
</FormControl>
|
|
</FormItem>
|
|
</RadioGroupStacked>
|
|
</FormControl>
|
|
{form.getValues('useOrioleDb') && (
|
|
<Admonition
|
|
type="warning"
|
|
className="rounded-t-none [&>div]:text-xs"
|
|
title="OrioleDB is not production ready"
|
|
description="Postgres with OrioleDB extension is currently in Public Alpha and not recommended for production usage yet."
|
|
>
|
|
<DocsButton className="mt-2" href={`${DOCS_URL}/guides/database/orioledb`} />
|
|
</Admonition>
|
|
)}
|
|
</FormItemLayout>
|
|
</>
|
|
)}
|
|
/>
|
|
</CollapsibleCardSection>
|
|
</CardContent>
|
|
</Card>
|
|
)
|
|
}
|