mirror of
https://github.com/supabase/supabase.git
synced 2026-10-16 22:59:11 +03:00
* update test * move back button, fix width issues on sidebar * update sidebar logic * Update ProjectLayout.tsx * lots of updates. layouts now streamlined. localstorage for tabs in use * moar * bunch of new tab logic * fix empty tab issue * Update tabs.ts * layouts switched * new pages now have fixed layouts * fix tabs * fix code bg * add tabs support for multiple project refs * intialization issue * update ID handling * fixed isOpened state for SQL snippets * remove old assistant because its bugging up panels * preview style works in sql editor * fix border * removes preview tab if there is one * fix background of loading skeleton * lots of issues with types/icons/redirect * new tab cards * snippets in empty state now work * moar stuff * tabs now in feature flags * Update tabs.ts * Update tabs.ts * moar * add feature previews * remove code not needed * Update next-env.d.ts * Delete FeaturePreviewModal.tsx * fix typescript errors. remove more explorer stuff * remove explorer files * fixed issues with templates and quickstarts tab * fixed active state when tabs are not opted in * logic error * fix open/highlight issue when opted out of tabs * templates/quickstarts now displayed with new cards * Update recent-items.tsx * Update new-tab.tsx * add icon back in * add old empty state back in * recent items updated to respect project ref * localstorage cleanup on deletion * moar * overflow tabs now working * correct tab names used for new sql templates/quickstarts * ongoing queries fix * cleanup * update images * Update RouteValidationWrapper.tsx * Update AppLayout.tsx * Update NavigationBar.tsx * add headers back into side panels * improve writing * tabs now drag and drop a billion times better * Update tabs.tsx * Update tabs.tsx * init issues on stores, which caused a race condition. * fix hydration error * init * init sidebars * init * Update app-default-navigation.tsx * user dropdown updates * moar layouts * init * moar * moar * updat * reverse top bar * some banners * moar * start adding account page * change styling of dropdowns * Update sidebar.tsx * fix new tab issue in sql * Update ProjectLayout.tsx * Update pnpm-lock.yaml * latest * Update pnpm-lock.yaml * moar layouts on account * getLayout updates * more fixes * force a cache build * moar * Update app-default-navigation.tsx * fix AI button animation * moar layout * account pages refactored * Update user-dropdown.tsx * Update new-tab.tsx * move EditorMenuListSkeleton * Fix type issues * fixes: DESIGN-87 fixes: DESIGN-87 * refactor sort/filter components * Update rules-set-button-text.tsx * remove discussions for now * small styling fixes * Update FeaturePreviewModal.tsx * Update FeaturePreviewModal.tsx * Update RouteValidationWrapper.tsx * revert * revert * revert * revert * revert * more revert * Update collapse-button.tsx * Update SQLEditorTreeViewItem.tsx * revert * Update SchemaGraph.tsx * Delete new-upcoming.tsx * revert * Update ProjectLayout.tsx * fix home link * Update table-editor.spec.ts * test update * Update projects.tsx * remove * Delete sidebar-open-top-banner.tsx * add organizations page * Update table-editor.spec.ts * Fix the playwright tests. * layout fixes * layout fix * revert sort/filter * Update LastSignInWrapper.tsx * revert * revert * remove * update file names * revert * revert * revert * advisor lint page tabs revert * revert * revert * revert * revert * revert * revert tabs * remove packages * add sidebar * sidebar docs added * add sidebar * fixed issues * fix mobile * fixes * add org side bar in * redirect updated * fix more layouts * move settings icon back down * remove old stuff * Delete SideBar.tsx * use ProfileImage component * spelling * Update ThemeSettings.tsx * Update ThemeSettings.tsx * Update Sidebar.tsx * layout udpate * Update Sidebar.tsx * fixes * Minor lints * Update Sidebar.tsx * create a alt user dropdown for self hosting and local * add fragment back in * Adds Theme Selector for local/self hosting * Update UserDropdown.tsx * fix theme selector for local self host * Update index.ts * Update DefaultLayout.tsx * now supports feature preview * remove old files * rename files * revert * Update LayoutHeader.tsx * clean * revert * revert * Update resource-banner.tsx * remove redundant side bar stuff * organizations action bar updated. removed hardcoded value * fix type errors * fix tests * Undo test changes * Fix account pages for when feature preview is off * Bug fixes 1 * Missing key in map of EmailTemplates * Fix missing border in StorageExplorer * fix missing header in performance advisor * Final clean up * Fix DefaultLayout re-rendering issue on auth pages * A couple of fixes * Redirect to /organizations if land on /projects with feature preview on * Route back to /projects if toggling preview off on /organizations * Add HomePageActions to /org/slug * make re-routing nicer * Moar fixes * Fix logging in redirect to /organizations irregardless of feature preview * Fix missing withAuth in OrganizationLayout * Minor clean upo * Fix branch dropdown not aligned * Add feature preview for update layout * update dropdowns to only be chevron triggered in new layout * Update content-query.ts * Update entity-types-infinite-query.ts * add IS_PLATFORM for org dropdown * Add IS_PLATFORM check for EnableBranchingDropdown in LayoutHeader * Midway fixing mobile nav * Mobile nav fixes * Address feedbacks --------- Co-authored-by: Joshen Lim <joshenlimek@gmail.com> Co-authored-by: Alaister Young <a@alaisteryoung.com> Co-authored-by: Ivan Vasilov <vasilov.ivan@gmail.com> Co-authored-by: Jordi Enric <jordi.err@gmail.com>
143 lines
4.6 KiB
TypeScript
143 lines
4.6 KiB
TypeScript
import Link from 'next/link'
|
|
import { useRouter } from 'next/router'
|
|
import { ReactNode } from 'react'
|
|
|
|
import { useParams } from 'common'
|
|
import { Button, cn, NavMenu, NavMenuItem } from 'ui'
|
|
import { ScaffoldContainer } from '../Scaffold'
|
|
import { PageHeader } from './PageHeader'
|
|
|
|
export interface NavigationItem {
|
|
id?: string
|
|
label: string
|
|
href?: string
|
|
icon?: ReactNode
|
|
onClick?: () => void
|
|
}
|
|
|
|
interface PageLayoutProps {
|
|
children?: ReactNode
|
|
title?: string
|
|
subtitle?: string
|
|
icon?: ReactNode
|
|
breadcrumbs?: Array<{
|
|
label?: string
|
|
href?: string
|
|
element?: ReactNode
|
|
}>
|
|
primaryActions?: ReactNode
|
|
secondaryActions?: ReactNode
|
|
navigationItems?: NavigationItem[]
|
|
className?: string
|
|
size?: 'default' | 'full' | 'large' | 'small'
|
|
isCompact?: boolean
|
|
}
|
|
|
|
/**
|
|
* For rendering a general single column based UI (which covers most of the dashboard's use case)
|
|
*
|
|
* Pages that would use this would for example be: Auth Sign In / Up, Project settings, Advisors, etc
|
|
*
|
|
* Pages that would deviate from this are those with dedicated UI, for example: Table Editor, SQL Editor, etc
|
|
*
|
|
* Handles rendering the following UI behaviors:
|
|
* - Page padding depending on the size property
|
|
* - Top level breadcrumbs (If applicable)
|
|
* - Top level page header (If applicable)
|
|
* - Top level tab navigations (If applicable)
|
|
* @param title - Title rendered in page header
|
|
* @param subtitle - Subtitle rendered in page header, below title
|
|
* @param icon - Icon rendered in Page header, to the left of title and subtitle
|
|
* @param breadcrumbs - Breadcrumbs rendered in page header, above title. Can be string labels with hrefs or custom elements
|
|
* @param primaryActions - TBD
|
|
* @param secondaryActions - TBD
|
|
* @param navigationItems - Tab navigation rendered below the page header
|
|
* @param className - Optional additional class names to be applied
|
|
* @param size - Controls padding of the page header only, padding for the content to be controlled by PageContainer (Default: 'default')
|
|
* @param isCompact - TBD (Default: false)
|
|
*/
|
|
export const PageLayout = ({
|
|
children,
|
|
title,
|
|
subtitle,
|
|
icon,
|
|
breadcrumbs = [],
|
|
primaryActions,
|
|
secondaryActions,
|
|
navigationItems = [],
|
|
className,
|
|
size = 'default',
|
|
isCompact = false,
|
|
}: PageLayoutProps) => {
|
|
const { ref } = useParams()
|
|
const router = useRouter()
|
|
|
|
return (
|
|
<div className="w-full min-h-full flex flex-col items-stretch">
|
|
<ScaffoldContainer
|
|
size={size}
|
|
className={cn(
|
|
'w-full mx-auto',
|
|
size === 'full' &&
|
|
(isCompact ? 'max-w-none !px-6 border-b' : 'max-w-none p!x-8 border-b'),
|
|
isCompact ? 'pt-4' : 'pt-12',
|
|
navigationItems.length === 0 && size === 'full' && (isCompact ? 'pb-4' : 'pb-8'),
|
|
className
|
|
)}
|
|
>
|
|
{/* Header section */}
|
|
{(title || subtitle || primaryActions || secondaryActions || breadcrumbs.length > 0) && (
|
|
<PageHeader
|
|
title={title}
|
|
subtitle={subtitle}
|
|
icon={icon}
|
|
breadcrumbs={breadcrumbs}
|
|
primaryActions={primaryActions}
|
|
secondaryActions={secondaryActions}
|
|
isCompact={isCompact}
|
|
/>
|
|
)}
|
|
|
|
{/* Navigation section */}
|
|
{navigationItems.length > 0 && (
|
|
<NavMenu className={cn(isCompact ? 'mt-2' : 'mt-4', size === 'full' && 'border-none')}>
|
|
{navigationItems.map((item) => (
|
|
<NavMenuItem key={item.label} active={router.asPath.split('?')[0] === item.href}>
|
|
{item.href ? (
|
|
<Link
|
|
href={
|
|
item.href.includes('[ref]') && !!ref
|
|
? item.href.replace('[ref]', ref)
|
|
: item.href
|
|
}
|
|
className={cn(
|
|
'inline-flex items-center gap-2',
|
|
router.asPath === item.href && 'text-foreground'
|
|
)}
|
|
onClick={item.onClick}
|
|
>
|
|
{item.icon && <span>{item.icon}</span>}
|
|
{item.label}
|
|
</Link>
|
|
) : (
|
|
<Button
|
|
type="link"
|
|
onClick={item.onClick}
|
|
className={cn(router.pathname === item.href && 'text-foreground font-medium')}
|
|
>
|
|
{item.icon && <span className="mr-2">{item.icon}</span>}
|
|
{item.label}
|
|
</Button>
|
|
)}
|
|
</NavMenuItem>
|
|
))}
|
|
</NavMenu>
|
|
)}
|
|
</ScaffoldContainer>
|
|
|
|
{/* Content section */}
|
|
{children}
|
|
</div>
|
|
)
|
|
}
|