From a44e15ff6e290bcb7672276af8967cb225eee2fb Mon Sep 17 00:00:00 2001 From: Francesco Sansalvadore Date: Thu, 19 Mar 2026 16:17:32 +0100 Subject: [PATCH] studio ide prototype init --- .../app/dashboard/v2/[projectRef]/page.tsx | 10 + .../app/dashboard/v2/org/[orgSlug]/page.tsx | 58 ++++ .../v2/project/[projectRef]/ProjectShell.tsx | 32 +++ .../[projectRef]/data/buckets/page.tsx | 5 + .../[projectRef]/data/channels/page.tsx | 5 + .../[projectRef]/data/edge-functions/page.tsx | 5 + .../[projectRef]/data/extensions/page.tsx | 5 + .../[projectRef]/data/functions/page.tsx | 5 + .../[projectRef]/data/indexes/page.tsx | 5 + .../[projectRef]/data/oauth-apps/page.tsx | 5 + .../[projectRef]/data/providers/page.tsx | 5 + .../[projectRef]/data/publications/page.tsx | 5 + .../project/[projectRef]/data/roles/page.tsx | 5 + .../data/tables/[tableId]/data/page.tsx | 5 + .../data/tables/[tableId]/indexes/page.tsx | 5 + .../data/tables/[tableId]/layout.tsx | 54 ++++ .../data/tables/[tableId]/page.tsx | 10 + .../data/tables/[tableId]/policies/page.tsx | 5 + .../data/tables/[tableId]/schema/page.tsx | 5 + .../data/tables/[tableId]/settings/page.tsx | 5 + .../project/[projectRef]/data/tables/page.tsx | 5 + .../project/[projectRef]/data/types/page.tsx | 5 + .../project/[projectRef]/data/users/page.tsx | 5 + .../v2/project/[projectRef]/layout.tsx | 9 + .../project/[projectRef]/obs/alerts/page.tsx | 5 + .../[projectRef]/obs/logs/api/page.tsx | 5 + .../[projectRef]/obs/logs/auth/page.tsx | 5 + .../v2/project/[projectRef]/obs/logs/page.tsx | 5 + .../[projectRef]/obs/logs/postgres/page.tsx | 5 + .../obs/metrics/connections/page.tsx | 5 + .../[projectRef]/obs/metrics/cpu/page.tsx | 5 + .../[projectRef]/obs/metrics/disk/page.tsx | 5 + .../[projectRef]/obs/metrics/memory/page.tsx | 5 + .../v2/project/[projectRef]/page.tsx | 10 + .../[projectRef]/settings/api-keys/page.tsx | 5 + .../[projectRef]/settings/auth/page.tsx | 5 + .../[projectRef]/settings/billing/page.tsx | 5 + .../[projectRef]/settings/branches/page.tsx | 5 + .../[projectRef]/settings/compute/page.tsx | 5 + .../[projectRef]/settings/functions/page.tsx | 5 + .../[projectRef]/settings/general/page.tsx | 5 + .../[projectRef]/settings/members/page.tsx | 5 + .../settings/merge-requests/page.tsx | 5 + .../[projectRef]/settings/network/page.tsx | 5 + .../[projectRef]/settings/realtime/page.tsx | 5 + .../[projectRef]/settings/storage/page.tsx | 5 + apps/studio/app/layout.tsx | 46 ++++ apps/studio/app/v2/AppRouterProviders.tsx | 35 +++ apps/studio/app/v2/V2ParamsContext.tsx | 51 ++++ apps/studio/app/v2/layout.tsx | 3 + .../ui/AIAssistantPanel/AIAssistant.tsx | 4 +- .../AIAssistantPanel/DisplayBlockRenderer.tsx | 6 +- .../ui/AIAssistantPanel/ModelSelector.tsx | 2 +- .../ui/HelpPanel/HelpOptionsList.tsx | 4 +- .../components/ui/HelpPanel/HelpPanel.tsx | 7 +- apps/studio/components/v2/ActivityBar.tsx | 145 ++++++++++ apps/studio/components/v2/AdvisorsPanel.tsx | 53 ++++ apps/studio/components/v2/AssistantPanel.tsx | 32 +++ apps/studio/components/v2/BrowserPanel.tsx | 257 ++++++++++++++++++ apps/studio/components/v2/EditorFrame.tsx | 44 +++ .../studio/components/v2/RightActivityBar.tsx | 27 ++ apps/studio/components/v2/RightPanel.tsx | 43 +++ apps/studio/components/v2/Shell.tsx | 49 ++++ apps/studio/components/v2/SqlPanel.tsx | 58 ++++ apps/studio/components/v2/StaticTitle.tsx | 16 ++ apps/studio/components/v2/TabBar.tsx | 92 +++++++ apps/studio/components/v2/TopBar.tsx | 48 ++++ .../studio/components/v2/V2BranchSelector.tsx | 119 ++++++++ apps/studio/components/v2/V2EditorFooter.tsx | 20 ++ .../components/v2/V2LayoutSidebarProvider.tsx | 52 ++++ .../components/v2/V2OrgProjectSelector.tsx | 101 +++++++ apps/studio/components/v2/useV2DataCounts.ts | 70 +++++ .../components/v2/views/V2PlaceholderView.tsx | 10 + .../components/v2/views/V2TableDetailView.tsx | 48 ++++ .../components/v2/views/V2TablesList.tsx | 125 +++++++++ .../data/telemetry/send-event-mutation.ts | 6 +- apps/studio/lib/telemetry/track.ts | 8 +- apps/studio/stores/v2-dashboard.tsx | 128 +++++++++ .../ui/src/components/shadcn/ui/resizable.tsx | 40 ++- 79 files changed, 2107 insertions(+), 20 deletions(-) create mode 100644 apps/studio/app/dashboard/v2/[projectRef]/page.tsx create mode 100644 apps/studio/app/dashboard/v2/org/[orgSlug]/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/ProjectShell.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/data/buckets/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/data/channels/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/data/edge-functions/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/data/extensions/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/data/functions/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/data/indexes/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/data/oauth-apps/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/data/providers/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/data/publications/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/data/roles/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/data/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/indexes/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/layout.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/policies/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/schema/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/settings/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/data/types/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/data/users/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/layout.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/obs/alerts/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/obs/logs/api/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/obs/logs/auth/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/obs/logs/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/obs/logs/postgres/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/obs/metrics/connections/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/obs/metrics/cpu/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/obs/metrics/disk/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/obs/metrics/memory/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/settings/api-keys/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/settings/auth/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/settings/billing/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/settings/branches/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/settings/compute/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/settings/functions/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/settings/general/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/settings/members/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/settings/merge-requests/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/settings/network/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/settings/realtime/page.tsx create mode 100644 apps/studio/app/dashboard/v2/project/[projectRef]/settings/storage/page.tsx create mode 100644 apps/studio/app/layout.tsx create mode 100644 apps/studio/app/v2/AppRouterProviders.tsx create mode 100644 apps/studio/app/v2/V2ParamsContext.tsx create mode 100644 apps/studio/app/v2/layout.tsx create mode 100644 apps/studio/components/v2/ActivityBar.tsx create mode 100644 apps/studio/components/v2/AdvisorsPanel.tsx create mode 100644 apps/studio/components/v2/AssistantPanel.tsx create mode 100644 apps/studio/components/v2/BrowserPanel.tsx create mode 100644 apps/studio/components/v2/EditorFrame.tsx create mode 100644 apps/studio/components/v2/RightActivityBar.tsx create mode 100644 apps/studio/components/v2/RightPanel.tsx create mode 100644 apps/studio/components/v2/Shell.tsx create mode 100644 apps/studio/components/v2/SqlPanel.tsx create mode 100644 apps/studio/components/v2/StaticTitle.tsx create mode 100644 apps/studio/components/v2/TabBar.tsx create mode 100644 apps/studio/components/v2/TopBar.tsx create mode 100644 apps/studio/components/v2/V2BranchSelector.tsx create mode 100644 apps/studio/components/v2/V2EditorFooter.tsx create mode 100644 apps/studio/components/v2/V2LayoutSidebarProvider.tsx create mode 100644 apps/studio/components/v2/V2OrgProjectSelector.tsx create mode 100644 apps/studio/components/v2/useV2DataCounts.ts create mode 100644 apps/studio/components/v2/views/V2PlaceholderView.tsx create mode 100644 apps/studio/components/v2/views/V2TableDetailView.tsx create mode 100644 apps/studio/components/v2/views/V2TablesList.tsx create mode 100644 apps/studio/stores/v2-dashboard.tsx diff --git a/apps/studio/app/dashboard/v2/[projectRef]/page.tsx b/apps/studio/app/dashboard/v2/[projectRef]/page.tsx new file mode 100644 index 00000000000..17d7d1fad2a --- /dev/null +++ b/apps/studio/app/dashboard/v2/[projectRef]/page.tsx @@ -0,0 +1,10 @@ +import { redirect } from 'next/navigation' + +export default async function V2ProjectShortcutPage({ + params, +}: { + params: Promise<{ projectRef: string }> +}) { + const { projectRef } = await params + redirect(`/dashboard/v2/project/${projectRef}`) +} diff --git a/apps/studio/app/dashboard/v2/org/[orgSlug]/page.tsx b/apps/studio/app/dashboard/v2/org/[orgSlug]/page.tsx new file mode 100644 index 00000000000..ec05a7b19fb --- /dev/null +++ b/apps/studio/app/dashboard/v2/org/[orgSlug]/page.tsx @@ -0,0 +1,58 @@ +'use client' + +import Link from 'next/link' +import { useParams } from 'next/navigation' +import { useOrgProjectsInfiniteQuery } from 'data/projects/org-projects-infinite-query' +import { useOrganizationsQuery } from 'data/organizations/organizations-query' +import { ShimmeringLoader } from 'ui-patterns/ShimmeringLoader' + +import { V2OrgParamsProvider } from '@/app/v2/V2ParamsContext' + +function OrgDashboardContent() { + const params = useParams() + const orgSlug = params?.orgSlug as string | undefined + + const { data: org } = useOrganizationsQuery({ + select: (orgs) => orgs?.find((o) => o.slug === orgSlug), + }) + const { data: projectsData, isPending } = useOrgProjectsInfiniteQuery( + { slug: orgSlug, limit: 50 }, + { enabled: Boolean(orgSlug) } + ) + const projects = projectsData?.pages?.flatMap((p) => p.projects) ?? [] + + if (!orgSlug) { + return

Select an organization.

+ } + + return ( +
+

{org?.name ?? orgSlug}

+

Projects

+ {isPending ? ( + + ) : ( +
    + {projects.map((proj) => ( +
  • + + {proj.name} + +
  • + ))} +
+ )} +
+ ) +} + +export default function V2OrgPage() { + return ( + + + + ) +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/ProjectShell.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/ProjectShell.tsx new file mode 100644 index 00000000000..174d4db8f5e --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/ProjectShell.tsx @@ -0,0 +1,32 @@ +'use client' + +import { useParams } from 'next/navigation' +import { useMemo } from 'react' + +import { V2ParamsProvider } from '@/app/v2/V2ParamsContext' +import { Shell } from '@/components/v2/Shell' +import { useOrganizationsQuery } from 'data/organizations/organizations-query' +import { useProjectDetailQuery } from 'data/projects/project-detail-query' + +export function ProjectShell({ children }: { children: React.ReactNode }) { + const params = useParams() + const projectRef = params?.projectRef as string | undefined + + const { data: project } = useProjectDetailQuery( + { ref: projectRef }, + { enabled: Boolean(projectRef) } + ) + const { data: organizations } = useOrganizationsQuery() + + const orgSlug = useMemo(() => { + if (!project?.organization_id || !organizations) return undefined + const org = organizations.find((o) => o.id === project.organization_id) + return org?.slug + }, [project?.organization_id, organizations]) + + return ( + + {children} + + ) +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/data/buckets/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/data/buckets/page.tsx new file mode 100644 index 00000000000..72ec5997b4f --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/data/buckets/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function DataBucketsPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/data/channels/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/data/channels/page.tsx new file mode 100644 index 00000000000..90f8a6e6f81 --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/data/channels/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function DataChannelsPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/data/edge-functions/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/data/edge-functions/page.tsx new file mode 100644 index 00000000000..df8dcfe2125 --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/data/edge-functions/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function DataEdgeFunctionsPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/data/extensions/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/data/extensions/page.tsx new file mode 100644 index 00000000000..ae8745bd11f --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/data/extensions/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function DataExtensionsPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/data/functions/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/data/functions/page.tsx new file mode 100644 index 00000000000..86d8e57617c --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/data/functions/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function DataFunctionsPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/data/indexes/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/data/indexes/page.tsx new file mode 100644 index 00000000000..ef6d011283e --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/data/indexes/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function DataIndexesPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/data/oauth-apps/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/data/oauth-apps/page.tsx new file mode 100644 index 00000000000..27a3d7d38c5 --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/data/oauth-apps/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function DataOAuthAppsPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/data/providers/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/data/providers/page.tsx new file mode 100644 index 00000000000..2c9b9b2175c --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/data/providers/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function DataProvidersPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/data/publications/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/data/publications/page.tsx new file mode 100644 index 00000000000..96688665f86 --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/data/publications/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function DataPublicationsPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/data/roles/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/data/roles/page.tsx new file mode 100644 index 00000000000..bd6617a547f --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/data/roles/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function DataRolesPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/data/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/data/page.tsx new file mode 100644 index 00000000000..dc96fc53e5d --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/data/page.tsx @@ -0,0 +1,5 @@ +import { V2TableDetailView } from '@/components/v2/views/V2TableDetailView' + +export default function TableDataPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/indexes/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/indexes/page.tsx new file mode 100644 index 00000000000..48aaeb8ec08 --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/indexes/page.tsx @@ -0,0 +1,5 @@ +import { V2TableDetailView } from '@/components/v2/views/V2TableDetailView' + +export default function TableIndexesPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/layout.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/layout.tsx new file mode 100644 index 00000000000..fbaafaea94a --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/layout.tsx @@ -0,0 +1,54 @@ +'use client' + +import Link from 'next/link' +import { useParams, usePathname } from 'next/navigation' +import { cn } from 'ui' + +import { useV2Params } from '@/app/v2/V2ParamsContext' + +const SUB_TABS = [ + { slug: 'data', label: 'Data' }, + { slug: 'schema', label: 'Schema' }, + { slug: 'policies', label: 'Policies' }, + { slug: 'indexes', label: 'Indexes' }, + { slug: 'settings', label: 'Settings' }, +] + +export default function TableDetailLayout({ + children, +}: { + children: React.ReactNode +}) { + const params = useParams() + const pathname = usePathname() + const { projectRef } = useV2Params() + const tableId = params?.tableId as string + + const base = projectRef ? `/dashboard/v2/project/${projectRef}/data/tables/${tableId}` : '' + + return ( +
+
+ {SUB_TABS.map((tab) => { + const href = `${base}/${tab.slug}` + const isActive = pathname === href || pathname?.startsWith(href + '/') + return ( + + {tab.label} + + ) + })} +
+
{children}
+
+ ) +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/page.tsx new file mode 100644 index 00000000000..ad763a45ee7 --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/page.tsx @@ -0,0 +1,10 @@ +import { redirect } from 'next/navigation' + +export default async function TableDetailPage({ + params, +}: { + params: Promise<{ projectRef: string; tableId: string }> +}) { + const { projectRef, tableId } = await params + redirect(`/dashboard/v2/project/${projectRef}/data/tables/${tableId}/data`) +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/policies/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/policies/page.tsx new file mode 100644 index 00000000000..db18ae596a1 --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/policies/page.tsx @@ -0,0 +1,5 @@ +import { V2TableDetailView } from '@/components/v2/views/V2TableDetailView' + +export default function TablePoliciesPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/schema/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/schema/page.tsx new file mode 100644 index 00000000000..b80f6301261 --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/schema/page.tsx @@ -0,0 +1,5 @@ +import { V2TableDetailView } from '@/components/v2/views/V2TableDetailView' + +export default function TableSchemaPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/settings/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/settings/page.tsx new file mode 100644 index 00000000000..0bc59d9b30c --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/[tableId]/settings/page.tsx @@ -0,0 +1,5 @@ +import { V2TableDetailView } from '@/components/v2/views/V2TableDetailView' + +export default function TableSettingsPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/page.tsx new file mode 100644 index 00000000000..10084a7aeda --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/data/tables/page.tsx @@ -0,0 +1,5 @@ +import { V2TablesList } from '@/components/v2/views/V2TablesList' + +export default function DataTablesPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/data/types/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/data/types/page.tsx new file mode 100644 index 00000000000..b59e212011d --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/data/types/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function DataTypesPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/data/users/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/data/users/page.tsx new file mode 100644 index 00000000000..f3a410d2e77 --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/data/users/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function DataUsersPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/layout.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/layout.tsx new file mode 100644 index 00000000000..99d16fa2341 --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/layout.tsx @@ -0,0 +1,9 @@ +import { ProjectShell } from './ProjectShell' + +export default function ProjectLayout({ + children, +}: { + children: React.ReactNode +}) { + return {children} +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/obs/alerts/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/obs/alerts/page.tsx new file mode 100644 index 00000000000..38bf2643be8 --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/obs/alerts/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function ObsAlertsPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/obs/logs/api/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/obs/logs/api/page.tsx new file mode 100644 index 00000000000..c6407030269 --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/obs/logs/api/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function ObsLogsApiPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/obs/logs/auth/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/obs/logs/auth/page.tsx new file mode 100644 index 00000000000..6228bfc536f --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/obs/logs/auth/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function ObsLogsAuthPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/obs/logs/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/obs/logs/page.tsx new file mode 100644 index 00000000000..fc548badbb0 --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/obs/logs/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function ObsLogsPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/obs/logs/postgres/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/obs/logs/postgres/page.tsx new file mode 100644 index 00000000000..45c70583532 --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/obs/logs/postgres/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function ObsLogsPostgresPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/obs/metrics/connections/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/obs/metrics/connections/page.tsx new file mode 100644 index 00000000000..30cdf6e0a2c --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/obs/metrics/connections/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function ObsMetricsConnectionsPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/obs/metrics/cpu/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/obs/metrics/cpu/page.tsx new file mode 100644 index 00000000000..513055b5969 --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/obs/metrics/cpu/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function ObsMetricsCpuPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/obs/metrics/disk/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/obs/metrics/disk/page.tsx new file mode 100644 index 00000000000..2301a7e4dd3 --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/obs/metrics/disk/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function ObsMetricsDiskPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/obs/metrics/memory/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/obs/metrics/memory/page.tsx new file mode 100644 index 00000000000..5fe6a1620f4 --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/obs/metrics/memory/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function ObsMetricsMemoryPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/page.tsx new file mode 100644 index 00000000000..5fce7ef4e58 --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/page.tsx @@ -0,0 +1,10 @@ +import { redirect } from 'next/navigation' + +export default async function V2ProjectPage({ + params, +}: { + params: Promise<{ projectRef: string }> +}) { + const { projectRef } = await params + redirect(`/dashboard/v2/project/${projectRef}/data/tables`) +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/settings/api-keys/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/settings/api-keys/page.tsx new file mode 100644 index 00000000000..8c62569a565 --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/settings/api-keys/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function SettingsApiKeysPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/settings/auth/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/settings/auth/page.tsx new file mode 100644 index 00000000000..e90d25ad538 --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/settings/auth/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function SettingsAuthPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/settings/billing/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/settings/billing/page.tsx new file mode 100644 index 00000000000..7f01294d722 --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/settings/billing/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function SettingsBillingPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/settings/branches/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/settings/branches/page.tsx new file mode 100644 index 00000000000..9e4addbe973 --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/settings/branches/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function SettingsBranchesPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/settings/compute/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/settings/compute/page.tsx new file mode 100644 index 00000000000..e08b892a0a7 --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/settings/compute/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function SettingsComputePage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/settings/functions/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/settings/functions/page.tsx new file mode 100644 index 00000000000..c6183b6674f --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/settings/functions/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function SettingsFunctionsPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/settings/general/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/settings/general/page.tsx new file mode 100644 index 00000000000..e4f3696280d --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/settings/general/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function SettingsGeneralPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/settings/members/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/settings/members/page.tsx new file mode 100644 index 00000000000..8665362dd2e --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/settings/members/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function SettingsMembersPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/settings/merge-requests/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/settings/merge-requests/page.tsx new file mode 100644 index 00000000000..7f2da09c9aa --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/settings/merge-requests/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function SettingsMergeRequestsPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/settings/network/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/settings/network/page.tsx new file mode 100644 index 00000000000..8fec1e08546 --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/settings/network/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function SettingsNetworkPage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/settings/realtime/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/settings/realtime/page.tsx new file mode 100644 index 00000000000..5dd95007e14 --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/settings/realtime/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function SettingsRealtimePage() { + return +} diff --git a/apps/studio/app/dashboard/v2/project/[projectRef]/settings/storage/page.tsx b/apps/studio/app/dashboard/v2/project/[projectRef]/settings/storage/page.tsx new file mode 100644 index 00000000000..ed0eb19cf5f --- /dev/null +++ b/apps/studio/app/dashboard/v2/project/[projectRef]/settings/storage/page.tsx @@ -0,0 +1,5 @@ +import { V2PlaceholderView } from '@/components/v2/views/V2PlaceholderView' + +export default function SettingsStoragePage() { + return +} diff --git a/apps/studio/app/layout.tsx b/apps/studio/app/layout.tsx new file mode 100644 index 00000000000..6f7fe9e284f --- /dev/null +++ b/apps/studio/app/layout.tsx @@ -0,0 +1,46 @@ +import type { Metadata } from 'next' + +import { AppRouterProviders } from '@/app/v2/AppRouterProviders' +import { genFaviconData } from 'common/MetaFavicons/app-router' +import 'react-data-grid/lib/styles.css' +import 'styles/code.scss' +import 'styles/contextMenu.scss' +import 'styles/editor.scss' +import 'styles/focus.scss' +import 'styles/graphiql-base.scss' +import 'styles/grid.scss' +import 'styles/main.scss' +import 'styles/markdown-preview.scss' +import 'styles/monaco.scss' +import 'styles/react-data-grid-logs.scss' +import 'styles/reactflow.scss' +import 'styles/storage.scss' +import 'styles/stripe.scss' +import 'styles/toast.scss' +import 'styles/typography.scss' +import 'styles/ui.scss' +import 'ui-patterns/ShimmeringLoader/index.css' +import 'ui/build/css/themes/dark.css' +import 'ui/build/css/themes/light.css' + +const BASE_PATH = process.env.NEXT_PUBLIC_BASE_PATH ?? '' + +export const metadata: Metadata = { + applicationName: 'Supabase Studio', + title: 'Supabase', + icons: genFaviconData(BASE_PATH), +} + +export default function RootLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( + + + {children} + + + ) +} diff --git a/apps/studio/app/v2/AppRouterProviders.tsx b/apps/studio/app/v2/AppRouterProviders.tsx new file mode 100644 index 00000000000..562ca655fab --- /dev/null +++ b/apps/studio/app/v2/AppRouterProviders.tsx @@ -0,0 +1,35 @@ +'use client' + +import { QueryClientProvider } from '@tanstack/react-query' +import { ThemeProvider } from 'common' +import { useRootQueryClient } from 'data/query-client' +import { customFont, sourceCodePro } from 'fonts' +import { AuthProvider } from 'lib/auth' +import { ReactNode } from 'react' +import { TooltipProvider } from 'ui' + +export function AppRouterProviders({ children }: { children: ReactNode }) { + const queryClient = useRootQueryClient() + + return ( + + +