mirror of
https://github.com/supabase/supabase.git
synced 2026-10-07 18:35:07 +03:00
* migrate some www components to tokens * consolidate InteractiveShimmerCard to Panel component * update tokens in blog * update tokens in careers page * update tokens in customers section * update tokens in open-source section * update tokens in Realtime page * update tokens in Storage and Vector * update tokens in SplitCodeBlockCarousel * update tokens in PGCharts * remove unused css files * update tokens in Card * update tokens in Pricing page * clean up priving page imports * remove hardcoded theme vars * migrate first half of defaultTheme.ts to tokens * migrate second half of defaultTheme.ts to tokens * improve inputs * add foreground to text-light and text-lighter * add foreground to text-light and text-lighter * migrate docs components with styling tokens * migrate docs components with styling tokens * fix broken Repos component * fix broken classes in blog * update tokens on Button and other components * update tokens on IconPanel * update studio main layout base styling tokens * update tokens across studio, docs and www * update tokens across studio, docs and www * update ui/Panel to styling tokens * update ExampleProject and TableEditorMenu tokens * www vector page tokens * update studio UI tokens * update other studio UI tokens * update more studio UI tokens * change tokens here, change tokens there * finish updating colors with tokens variables * add gui sandbox for theme experimentation * use common package for www, docs and studio and fix Command K tokens * provide light mode default tokens options * fix conflict leftover * update loading line * fix className typo * fix prettier * update themeSandbox preset default values * fix text-background0 * prettier * update warningBanner with warning color * switch all border-border with border-default * improve border-secondary and foreground-muted in light mode * force ring color on toggle * fix button bg color and border-muted light token * fix input bg color * fix dark button hover * fix homepage product card * fix code-hike table header colors * button dark border * remove tabIndex leftover from homepage main ctas --------- Co-authored-by: Kevin Grüneberg <k.grueneberg1994@gmail.com> Co-authored-by: Jonathan Summers-Muir <MildTomato@users.noreply.github.com>
167 lines
5.8 KiB
TypeScript
167 lines
5.8 KiB
TypeScript
import * as Tooltip from '@radix-ui/react-tooltip'
|
|
import { PermissionAction } from '@supabase/shared-types/out/constants'
|
|
import { includes, noop } from 'lodash'
|
|
import { observer } from 'mobx-react-lite'
|
|
import { useRouter } from 'next/router'
|
|
import {
|
|
Button,
|
|
DropdownMenu,
|
|
DropdownMenuContent,
|
|
DropdownMenuItem,
|
|
DropdownMenuTrigger,
|
|
IconCheck,
|
|
IconEdit3,
|
|
IconFileText,
|
|
IconMoreVertical,
|
|
IconTrash,
|
|
} from 'ui'
|
|
|
|
import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext'
|
|
import Table from 'components/to-be-cleaned/Table'
|
|
import { useCheckPermissions, useStore } from 'hooks'
|
|
|
|
interface FunctionListProps {
|
|
schema: string
|
|
filterString: string
|
|
isLocked: boolean
|
|
editFunction: (fn: any) => void
|
|
deleteFunction: (fn: any) => void
|
|
}
|
|
|
|
const FunctionList = ({
|
|
schema,
|
|
filterString,
|
|
isLocked,
|
|
editFunction = noop,
|
|
deleteFunction = noop,
|
|
}: FunctionListProps) => {
|
|
const router = useRouter()
|
|
const { meta } = useStore()
|
|
const { project: selectedProject } = useProjectContext()
|
|
|
|
const functions = meta.functions.list()
|
|
const filteredFunctions = functions.filter((x: any) =>
|
|
includes(x.name.toLowerCase(), filterString.toLowerCase())
|
|
)
|
|
const _functions = filteredFunctions.filter((x) => x.schema == schema)
|
|
const projectRef = selectedProject?.ref
|
|
|
|
const canUpdateFunctions = useCheckPermissions(
|
|
PermissionAction.TENANT_SQL_ADMIN_WRITE,
|
|
'functions'
|
|
)
|
|
|
|
if (_functions.length === 0 && filterString.length === 0) {
|
|
return (
|
|
<Table.tr key={schema}>
|
|
<Table.td colSpan={5}>
|
|
<p className="text-sm text-foreground">No functions created yet</p>
|
|
<p className="text-sm text-foreground-light">
|
|
There are no functions found in the schema "{schema}"
|
|
</p>
|
|
</Table.td>
|
|
</Table.tr>
|
|
)
|
|
}
|
|
|
|
if (_functions.length === 0 && filterString.length > 0) {
|
|
return (
|
|
<Table.tr key={schema}>
|
|
<Table.td colSpan={5}>
|
|
<p className="text-sm text-foreground">No results found</p>
|
|
<p className="text-sm text-foreground-light">
|
|
Your search for "{filterString}" did not return any results
|
|
</p>
|
|
</Table.td>
|
|
</Table.tr>
|
|
)
|
|
}
|
|
|
|
return (
|
|
<>
|
|
{_functions.map((x) => {
|
|
const isApiDocumentAvailable = schema == 'public' && x.return_type !== 'trigger'
|
|
|
|
return (
|
|
<Table.tr key={x.id}>
|
|
<Table.td className="truncate">
|
|
<p title={x.name}>{x.name}</p>
|
|
</Table.td>
|
|
<Table.td className="hidden md:table-cell md:overflow-auto">
|
|
<p title={x.argument_types}>{x.argument_types || '-'}</p>
|
|
</Table.td>
|
|
<Table.td className="hidden lg:table-cell">
|
|
<p title={x.return_type}>{x.return_type}</p>
|
|
</Table.td>
|
|
<Table.td className="hidden lg:table-cell">
|
|
{x.security_definer ? 'Definer' : 'Invoker'}
|
|
</Table.td>
|
|
<Table.td className="text-right">
|
|
{!isLocked && (
|
|
<div className="flex items-center justify-end">
|
|
{canUpdateFunctions ? (
|
|
<DropdownMenu>
|
|
<DropdownMenuTrigger>
|
|
<Button asChild type="default" icon={<IconMoreVertical />} className="px-1">
|
|
<span></span>
|
|
</Button>
|
|
</DropdownMenuTrigger>
|
|
<DropdownMenuContent side="left">
|
|
{isApiDocumentAvailable && (
|
|
<DropdownMenuItem
|
|
className="space-x-2"
|
|
onClick={() => router.push(`/project/${projectRef}/api?rpc=${x.name}`)}
|
|
>
|
|
<IconFileText size="tiny" />
|
|
<p>Client API docs</p>
|
|
</DropdownMenuItem>
|
|
)}
|
|
<DropdownMenuItem className="space-x-2" onClick={() => editFunction(x)}>
|
|
<IconEdit3 size="tiny" />
|
|
<p>Edit function</p>
|
|
</DropdownMenuItem>
|
|
<DropdownMenuItem className="space-x-2" onClick={() => deleteFunction(x)}>
|
|
<IconTrash stroke="red" size="tiny" />
|
|
<p>Delete function</p>
|
|
</DropdownMenuItem>
|
|
</DropdownMenuContent>
|
|
</DropdownMenu>
|
|
) : (
|
|
<Tooltip.Root delayDuration={0}>
|
|
<Tooltip.Trigger asChild>
|
|
<Button
|
|
disabled
|
|
type="default"
|
|
icon={<IconMoreVertical />}
|
|
className="px-1"
|
|
/>
|
|
</Tooltip.Trigger>
|
|
<Tooltip.Portal>
|
|
<Tooltip.Content side="left">
|
|
<Tooltip.Arrow className="radix-tooltip-arrow" />
|
|
<div
|
|
className={[
|
|
'rounded bg-alternative py-1 px-2 leading-none shadow',
|
|
'border border-background',
|
|
].join(' ')}
|
|
>
|
|
<span className="text-xs text-foreground">
|
|
You need additional permissions to update functions
|
|
</span>
|
|
</div>
|
|
</Tooltip.Content>
|
|
</Tooltip.Portal>
|
|
</Tooltip.Root>
|
|
)}
|
|
</div>
|
|
)}
|
|
</Table.td>
|
|
</Table.tr>
|
|
)
|
|
})}
|
|
</>
|
|
)
|
|
}
|
|
|
|
export default observer(FunctionList)
|