Permissions() — supabase Function Reference
Architecture documentation for the Permissions() function in Permissions.tsx from the supabase codebase.
Entity Profile
Dependency Diagram
graph TD 6818be90_9692_2163_8616_b25f499b50de["Permissions()"] c0862479_54e7_f74a_d877_967767338e53["formatAccessText()"] 6818be90_9692_2163_8616_b25f499b50de -->|calls| c0862479_54e7_f74a_d877_967767338e53 d2b0fec5_5651_577d_ef04_f6a68dee510e["sortActions()"] 6818be90_9692_2163_8616_b25f499b50de -->|calls| d2b0fec5_5651_577d_ef04_f6a68dee510e style 6818be90_9692_2163_8616_b25f499b50de fill:#6366f1,stroke:#818cf8,color:#fff
Relationship Graph
Source Code
apps/studio/components/interfaces/Account/AccessTokens/Scoped/Form/Permissions/Permissions.tsx lines 19–172
export const Permissions = <TFormValues extends PermissionsFormValues = PermissionsFormValues>({
setValue,
watch,
resourceSearchOpen,
setResourceSearchOpen,
}: PermissionsProps<TFormValues>) => {
const permissionRows = (watch('permissionRows' as Path<TFormValues>) || []) as PermissionRow[]
return (
<div className="space-y-4 px-5 sm:px-6 py-6">
<div className="space-y-3">
<div className="flex justify-between items-center">
<span className="text-sm">Configure permissions</span>
<div className="flex items-center gap-2">
{permissionRows.length > 0 && (
<ButtonTooltip
type="default"
size="tiny"
className="p-1"
onClick={() => {
setValue(
'permissionRows' as Path<TFormValues>,
[] as PathValue<TFormValues, Path<TFormValues>>
)
}}
icon={<RotateCcw size={16} />}
tooltip={{
content: {
side: 'top',
align: 'center',
alignOffset: -10,
text: 'Reset all permissions',
},
}}
/>
)}
<PermissionResourceSelector
open={resourceSearchOpen}
onOpenChange={setResourceSearchOpen}
permissionRows={permissionRows}
setValue={setValue}
align="end"
/>
</div>
</div>
{permissionRows.length === 0 ? (
<div className="text-center py-8 border border-dashed border-border rounded-lg">
<p className="text-sm text-foreground-light">No permissions configured yet.</p>
</div>
) : (
<div className="border border-border rounded-lg">
{permissionRows.map((row, index) => {
const selectedResource = ACCESS_TOKEN_RESOURCES.find(
(r) => r.resource === row.resource
)
return (
<div key={row.resource ?? `resource-${index}`}>
<div className="flex items-center gap-3 p-3">
<div className="flex-1">
<div className="flex items-center gap-2">
<div className="flex flex-col">
<span className="text-sm font-medium truncate max-w-[36ch] capitalize">
{selectedResource?.title}
</span>
</div>
</div>
</div>
<div className="flex items-center gap-2">
{selectedResource && (
<Popover_Shadcn_>
<PopoverTrigger_Shadcn_ asChild>
<Button
type="default"
size="tiny"
className="w-[150px] flex text-sm justify-between h-7 "
iconRight={
<ChevronDown size={14} className="text-foreground-muted" />
}
>
{row.actions.length === 0 ? (
<span className="text-foreground-lighter">Select access</span>
) : row.actions.length === 1 ? (
formatAccessText(row.actions[0])
) : (
`${row.actions.length} selected`
)}
</Button>
</PopoverTrigger_Shadcn_>
<PopoverContent_Shadcn_ className="w-[180px] p-2" align="end">
<div className="space-y-2">
{sortActions(selectedResource.actions).map((action) => (
<label
key={action}
className="flex items-center gap-2 cursor-pointer"
>
<Checkbox_Shadcn_
checked={row.actions.includes(action)}
onCheckedChange={(checked) => {
const newActions = checked
? [...row.actions, action]
: row.actions.filter((a) => a !== action)
const newRows: PermissionRow[] = permissionRows.map((r, i) =>
i === index
? { resource: r.resource, actions: newActions }
: r
)
setValue(
'permissionRows' as Path<TFormValues>,
newRows as PathValue<TFormValues, Path<TFormValues>>,
{ shouldValidate: true, shouldDirty: true }
)
}}
/>
<span className="text-sm">{formatAccessText(action)}</span>
</label>
))}
</div>
</PopoverContent_Shadcn_>
</Popover_Shadcn_>
)}
<Button
type="text"
size="tiny"
className="p-1"
onClick={() => {
const newRows = permissionRows.filter((_, i) => i !== index)
setValue(
'permissionRows' as Path<TFormValues>,
newRows as PathValue<TFormValues, Path<TFormValues>>,
{ shouldValidate: true, shouldDirty: true }
)
}}
icon={<X size={16} />}
/>
</div>
</div>
{index < permissionRows.length - 1 && <div className="border-t border-border" />}
</div>
)
})}
</div>
)}
</div>
<div className="w-full flex gap-x-2 items-center">
<WarningIcon />
<span className="text-xs text-left text-foreground-lighter">
Once you've set these permissions, you cannot edit them.
</span>
</div>
</div>
)
}
Domain
Subdomains
Source
Frequently Asked Questions
What does Permissions() do?
Permissions() is a function in the supabase codebase.
What does Permissions() call?
Permissions() calls 2 function(s): formatAccessText, sortActions.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free