EdgeFunctionsSortDropdown.tsx 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import { ArrowDownNarrowWide, ArrowDownWideNarrow } from 'lucide-react'
  2. import {
  3. Button,
  4. DropdownMenu,
  5. DropdownMenuContent,
  6. DropdownMenuRadioGroup,
  7. DropdownMenuRadioItem,
  8. DropdownMenuSub,
  9. DropdownMenuSubContent,
  10. DropdownMenuSubTrigger,
  11. DropdownMenuTrigger,
  12. } from 'ui'
  13. export const EDGE_FUNCTIONS_SORT_VALUES = [
  14. 'name:asc',
  15. 'name:desc',
  16. 'created_at:asc',
  17. 'created_at:desc',
  18. 'updated_at:asc',
  19. 'updated_at:desc',
  20. ] as const
  21. export type EdgeFunctionsSort = (typeof EDGE_FUNCTIONS_SORT_VALUES)[number]
  22. export type EdgeFunctionsSortColumn = EdgeFunctionsSort extends `${infer Column}:${string}`
  23. ? Column
  24. : unknown
  25. export type EdgeFunctionsSortOrder = EdgeFunctionsSort extends `${string}:${infer Order}`
  26. ? Order
  27. : unknown
  28. interface EdgeFunctionsSortDropdownProps {
  29. value: EdgeFunctionsSort
  30. onChange: (value: EdgeFunctionsSort) => void
  31. }
  32. function getSortLabel(value: EdgeFunctionsSort) {
  33. const [sortCol] = value.split(':')
  34. return sortCol.replace('_', ' ')
  35. }
  36. export const EdgeFunctionsSortDropdown = ({ value, onChange }: EdgeFunctionsSortDropdownProps) => {
  37. return (
  38. <DropdownMenu>
  39. <DropdownMenuTrigger asChild>
  40. <Button
  41. type="default"
  42. icon={
  43. value.includes('desc') ? (
  44. <ArrowDownWideNarrow size={14} />
  45. ) : (
  46. <ArrowDownNarrowWide size={14} />
  47. )
  48. }
  49. >
  50. Sorted by {getSortLabel(value)}
  51. </Button>
  52. </DropdownMenuTrigger>
  53. <DropdownMenuContent align="start" className="w-48">
  54. <DropdownMenuRadioGroup
  55. value={value}
  56. onValueChange={(val) => onChange(val as EdgeFunctionsSort)}
  57. >
  58. <DropdownMenuSub>
  59. <DropdownMenuSubTrigger>Sort by name</DropdownMenuSubTrigger>
  60. <DropdownMenuSubContent>
  61. <DropdownMenuRadioItem value="name:asc">Ascending</DropdownMenuRadioItem>
  62. <DropdownMenuRadioItem value="name:desc">Descending</DropdownMenuRadioItem>
  63. </DropdownMenuSubContent>
  64. </DropdownMenuSub>
  65. <DropdownMenuSub>
  66. <DropdownMenuSubTrigger>Sort by created at</DropdownMenuSubTrigger>
  67. <DropdownMenuSubContent>
  68. <DropdownMenuRadioItem value="created_at:asc">Ascending</DropdownMenuRadioItem>
  69. <DropdownMenuRadioItem value="created_at:desc">Descending</DropdownMenuRadioItem>
  70. </DropdownMenuSubContent>
  71. </DropdownMenuSub>
  72. <DropdownMenuSub>
  73. <DropdownMenuSubTrigger>Sort by updated at</DropdownMenuSubTrigger>
  74. <DropdownMenuSubContent>
  75. <DropdownMenuRadioItem value="updated_at:asc">Ascending</DropdownMenuRadioItem>
  76. <DropdownMenuRadioItem value="updated_at:desc">Descending</DropdownMenuRadioItem>
  77. </DropdownMenuSubContent>
  78. </DropdownMenuSub>
  79. </DropdownMenuRadioGroup>
  80. </DropdownMenuContent>
  81. </DropdownMenu>
  82. )
  83. }