mirror of
https://github.com/supabase/supabase.git
synced 2026-10-19 08:09:11 +03:00
* fix: update Permission params * fix: upgrade check permission hook to support project level role * fix: usePermissionsLoaded * fix: Permission params can be undefined * Scaffold new access management UI * Add validation * Update roles view * Add tooltip * Add button to apply role to all projects * Update UI to select projects first instead of roles * Merge master update UI * Midway trying to implementation project level perms API * First pass implementating updating project level permissions * Add client side validation for assigning/removing roles * Midway implementing new invites * Integrate most of the project level permissions functionality * fix: filter out org-level permissions before checking * Add relevant UI guards in org level pages for project role POV * Minor refactors * Small refactors * More fixes * Moar refactors * More fixes * More fixes * Refactor update role logic and smack some test cases on it * Fixes * Fix type issue * Fix type * more fixes, refactors, adding checks... * MORE fixes * Add perms checking for replicas * Add ButtonTooltip component and use them to prevent repetition of pointer events auto for buttons with tooltips * Convert all buttons with tooltips to use ButtonTooltip * refactor * PRettier * Small fix * Remove commented out code in organization-invitation-accept-mutation * fix: switch to use the platform oauth authorizations routes * Add perms checking for org audit logs and org oauth apps * PRettier * Fix incorrect URL for oauth app flow * Fix incorrect URL for oauth app flow * Fix * Add perms checking for warehouse related UI * Update roles helper icon * remove unused lib * Update package lock... again * Update package lock... again * Smalllll update * Update some checks * Add gate for project level permissions * Last fix * update codegen * Update warehouse endpoint routes * Fix --------- Co-authored-by: phamhieu <phamhieu1998@gmail.com> Co-authored-by: Alaister Young <a@alaisteryoung.com>
168 lines
4.8 KiB
TypeScript
168 lines
4.8 KiB
TypeScript
import React from 'react'
|
|
import { cn } from 'ui'
|
|
|
|
const maxWidthClasses = 'mx-auto w-full max-w-[1600px]'
|
|
const paddingClasses = 'px-6 lg:px-14 xl:px-24 2xl:px-32'
|
|
const maxWidthClassesColumn = 'min-w-[420px]'
|
|
|
|
const ScaffoldHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
|
|
({ className, ...props }, ref) => {
|
|
return (
|
|
<header
|
|
{...props}
|
|
ref={ref}
|
|
className={cn('w-full', 'flex-col gap-3 py-6', className)}
|
|
></header>
|
|
)
|
|
}
|
|
)
|
|
|
|
const ScaffoldTitle = React.forwardRef<
|
|
HTMLHeadingElement,
|
|
React.HTMLAttributes<HTMLHeadingElement>
|
|
>(({ className, ...props }, ref) => {
|
|
return <h1 ref={ref} {...props} className={cn('text-2xl', className)} />
|
|
})
|
|
|
|
const ScaffoldDescription = React.forwardRef<
|
|
HTMLHeadingElement,
|
|
React.HTMLAttributes<HTMLHeadingElement>
|
|
>(({ className, ...props }, ref) => {
|
|
return <span ref={ref} {...props} className={cn('text-sm text-foreground-light', className)} />
|
|
})
|
|
|
|
const ScaffoldContainer = React.forwardRef<
|
|
HTMLDivElement,
|
|
React.HTMLAttributes<HTMLDivElement> & { bottomPadding?: boolean }
|
|
>(({ className, bottomPadding, ...props }, ref) => {
|
|
return (
|
|
<div
|
|
ref={ref}
|
|
{...props}
|
|
className={cn(maxWidthClasses, paddingClasses, bottomPadding && 'pb-16', className)}
|
|
/>
|
|
)
|
|
})
|
|
|
|
const ScaffoldDivider = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
|
|
({ className, ...props }, ref) => {
|
|
return <div ref={ref} {...props} className={cn('w-full h-px bg-border', className)} />
|
|
}
|
|
)
|
|
|
|
const ScaffoldSection = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
|
|
({ className, ...props }, ref) => {
|
|
return (
|
|
<div
|
|
ref={ref}
|
|
{...props}
|
|
className={cn('flex flex-col gap-3 py-6', 'lg:grid md:grid-cols-12 lg:py-12', className)}
|
|
/>
|
|
)
|
|
}
|
|
)
|
|
|
|
const ScaffoldColumn = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
|
|
({ className, ...props }, ref) => {
|
|
return (
|
|
<div
|
|
ref={ref}
|
|
{...props}
|
|
className={cn('flex flex-col gap-3', maxWidthClassesColumn, className)}
|
|
/>
|
|
)
|
|
}
|
|
)
|
|
|
|
const ScaffoldSectionDetail = React.forwardRef<
|
|
HTMLDivElement,
|
|
React.HTMLAttributes<HTMLDivElement>
|
|
>(({ className, children, title, ...props }, ref) => {
|
|
return (
|
|
<div ref={ref} {...props} className={cn('col-span-4 xl:col-span-5 prose text-sm', className)}>
|
|
{title && <h2>{title}</h2>}
|
|
{children}
|
|
</div>
|
|
)
|
|
})
|
|
|
|
const ScaffoldSectionContent = React.forwardRef<
|
|
HTMLDivElement,
|
|
React.HTMLAttributes<HTMLDivElement>
|
|
>(({ className, ...props }, ref) => {
|
|
return (
|
|
<div
|
|
ref={ref}
|
|
{...props}
|
|
className={cn('col-span-8 xl:col-span-7', 'flex flex-col gap-6', className)}
|
|
/>
|
|
)
|
|
})
|
|
|
|
// Table and filters
|
|
const ScaffoldFilterAndContent = React.forwardRef<
|
|
HTMLDivElement,
|
|
React.HTMLAttributes<HTMLDivElement>
|
|
>(({ className, ...props }, ref) => {
|
|
return <div ref={ref} {...props} className={cn('flex flex-col gap-3 items-center', className)} />
|
|
})
|
|
|
|
// Actions Group
|
|
const ScaffoldActionsContainer = React.forwardRef<
|
|
HTMLDivElement,
|
|
React.HTMLAttributes<HTMLDivElement>
|
|
>(({ className, ...props }, ref) => {
|
|
return <div ref={ref} {...props} className={cn('flex w-full items-center', className)} />
|
|
})
|
|
|
|
// Actions Group
|
|
const ScaffoldActionsGroup = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(
|
|
({ className, ...props }, ref) => {
|
|
return <div ref={ref} {...props} className={cn('flex flex-row gap-3', className)} />
|
|
}
|
|
)
|
|
|
|
// For older layouts
|
|
const ScaffoldContainerLegacy = React.forwardRef<
|
|
HTMLDivElement,
|
|
React.HTMLAttributes<HTMLDivElement>
|
|
>(({ className, ...props }, ref) => {
|
|
return (
|
|
<div
|
|
ref={ref}
|
|
{...props}
|
|
className={cn(maxWidthClasses, paddingClasses, 'my-8 flex flex-col gap-8', className)}
|
|
/>
|
|
)
|
|
})
|
|
|
|
ScaffoldHeader.displayName = 'ScaffoldHeader'
|
|
ScaffoldTitle.displayName = 'ScaffoldTitle'
|
|
ScaffoldDescription.displayName = 'ScaffoldDescription'
|
|
ScaffoldContainer.displayName = 'ScaffoldContainer'
|
|
ScaffoldDivider.displayName = 'ScaffoldDivider'
|
|
ScaffoldSection.displayName = 'ScaffoldSection'
|
|
ScaffoldColumn.displayName = 'ScaffoldColumn'
|
|
ScaffoldSectionDetail.displayName = 'ScaffoldSectionDetail'
|
|
ScaffoldSectionContent.displayName = 'ScaffoldSectionContent'
|
|
ScaffoldFilterAndContent.displayName = 'ScaffoldFilterAndContent'
|
|
ScaffoldActionsContainer.displayName = 'ScaffoldActionsContainer'
|
|
ScaffoldActionsGroup.displayName = 'ScaffoldActionsGroup'
|
|
ScaffoldContainerLegacy.displayName = 'ScaffoldContainerLegacy'
|
|
|
|
export {
|
|
ScaffoldHeader,
|
|
ScaffoldTitle,
|
|
ScaffoldDescription,
|
|
ScaffoldContainer,
|
|
ScaffoldDivider,
|
|
ScaffoldSection,
|
|
ScaffoldColumn,
|
|
ScaffoldSectionDetail,
|
|
ScaffoldSectionContent,
|
|
ScaffoldFilterAndContent,
|
|
ScaffoldActionsContainer,
|
|
ScaffoldActionsGroup,
|
|
ScaffoldContainerLegacy,
|
|
}
|