mirror of
https://github.com/supabase/supabase.git
synced 2026-10-16 22:59:11 +03:00
## Context This is largely just a mechanical change here: Opting to use lucide icons with the `Icon` suffix across all icon imports within `studio` - so that it’s clearer which components are icons + reduces the possibility of name collision with our own components - e.g <User /> vs <UserIcon /> Also added a eslint rule for this: <img width="1069" height="167" alt="image" src="https://github.com/user-attachments/assets/7f36f443-5ca2-4bf6-8d22-86e774513bfc" /> And updated `AGENTS.md` as such: ``` Icons come from `lucide-react`, always imported with the `Icon` suffix (`import { CheckIcon, Trash2Icon } from 'lucide-react'`) — never the bare names (`Check`) or `Check as CheckIcon` aliases (lint-enforced). ```
88 lines
2.9 KiB
TypeScript
88 lines
2.9 KiB
TypeScript
import { ArrowDownNarrowWideIcon, ArrowDownWideNarrowIcon } from 'lucide-react'
|
|
import {
|
|
Button,
|
|
DropdownMenu,
|
|
DropdownMenuContent,
|
|
DropdownMenuRadioGroup,
|
|
DropdownMenuRadioItem,
|
|
DropdownMenuSub,
|
|
DropdownMenuSubContent,
|
|
DropdownMenuSubTrigger,
|
|
DropdownMenuTrigger,
|
|
} from 'ui'
|
|
|
|
export const EDGE_FUNCTIONS_SORT_VALUES = [
|
|
'name:asc',
|
|
'name:desc',
|
|
'created_at:asc',
|
|
'created_at:desc',
|
|
'updated_at:asc',
|
|
'updated_at:desc',
|
|
] as const
|
|
|
|
export type EdgeFunctionsSort = (typeof EDGE_FUNCTIONS_SORT_VALUES)[number]
|
|
export type EdgeFunctionsSortColumn = EdgeFunctionsSort extends `${infer Column}:${string}`
|
|
? Column
|
|
: unknown
|
|
export type EdgeFunctionsSortOrder = EdgeFunctionsSort extends `${string}:${infer Order}`
|
|
? Order
|
|
: unknown
|
|
|
|
interface EdgeFunctionsSortDropdownProps {
|
|
value: EdgeFunctionsSort
|
|
onChange: (value: EdgeFunctionsSort) => void
|
|
}
|
|
|
|
function getSortLabel(value: EdgeFunctionsSort) {
|
|
const [sortCol] = value.split(':')
|
|
return sortCol.replace('_', ' ')
|
|
}
|
|
|
|
export const EdgeFunctionsSortDropdown = ({ value, onChange }: EdgeFunctionsSortDropdownProps) => {
|
|
return (
|
|
<DropdownMenu>
|
|
<DropdownMenuTrigger asChild>
|
|
<Button
|
|
icon={
|
|
value.includes('desc') ? (
|
|
<ArrowDownWideNarrowIcon size={14} />
|
|
) : (
|
|
<ArrowDownNarrowWideIcon size={14} />
|
|
)
|
|
}
|
|
>
|
|
Sorted by {getSortLabel(value)}
|
|
</Button>
|
|
</DropdownMenuTrigger>
|
|
<DropdownMenuContent align="start" className="w-48">
|
|
<DropdownMenuRadioGroup
|
|
value={value}
|
|
onValueChange={(val) => onChange(val as EdgeFunctionsSort)}
|
|
>
|
|
<DropdownMenuSub>
|
|
<DropdownMenuSubTrigger>Sort by name</DropdownMenuSubTrigger>
|
|
<DropdownMenuSubContent>
|
|
<DropdownMenuRadioItem value="name:asc">Ascending</DropdownMenuRadioItem>
|
|
<DropdownMenuRadioItem value="name:desc">Descending</DropdownMenuRadioItem>
|
|
</DropdownMenuSubContent>
|
|
</DropdownMenuSub>
|
|
<DropdownMenuSub>
|
|
<DropdownMenuSubTrigger>Sort by created at</DropdownMenuSubTrigger>
|
|
<DropdownMenuSubContent>
|
|
<DropdownMenuRadioItem value="created_at:asc">Ascending</DropdownMenuRadioItem>
|
|
<DropdownMenuRadioItem value="created_at:desc">Descending</DropdownMenuRadioItem>
|
|
</DropdownMenuSubContent>
|
|
</DropdownMenuSub>
|
|
<DropdownMenuSub>
|
|
<DropdownMenuSubTrigger>Sort by updated at</DropdownMenuSubTrigger>
|
|
<DropdownMenuSubContent>
|
|
<DropdownMenuRadioItem value="updated_at:asc">Ascending</DropdownMenuRadioItem>
|
|
<DropdownMenuRadioItem value="updated_at:desc">Descending</DropdownMenuRadioItem>
|
|
</DropdownMenuSubContent>
|
|
</DropdownMenuSub>
|
|
</DropdownMenuRadioGroup>
|
|
</DropdownMenuContent>
|
|
</DropdownMenu>
|
|
)
|
|
}
|