SortDropdown.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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. import { ButtonTooltip } from '@/components/ui/ButtonTooltip'
  14. interface SortDropdownProps {
  15. specificFilterColumn: string
  16. sortColumn: string
  17. sortOrder: string
  18. sortByValue: string
  19. showSortByEmail: boolean
  20. showSortByPhone: boolean
  21. setSortByValue: (value: string) => void
  22. improvedSearchEnabled: boolean
  23. }
  24. /** [Joshen] To refactor to use the SortDropdown component in components/ui */
  25. export const SortDropdown = ({
  26. specificFilterColumn,
  27. sortColumn,
  28. sortOrder,
  29. sortByValue,
  30. showSortByEmail,
  31. showSortByPhone,
  32. setSortByValue,
  33. improvedSearchEnabled = false,
  34. }: SortDropdownProps) => {
  35. if (specificFilterColumn !== 'freeform' && !improvedSearchEnabled) {
  36. return (
  37. <ButtonTooltip
  38. disabled
  39. type="default"
  40. icon={<ArrowDownNarrowWide />}
  41. tooltip={{
  42. content: {
  43. side: 'bottom',
  44. className: 'w-80 text-center',
  45. text: (
  46. <>
  47. Sorting cannot be changed when searching on a specific column. If you'd like to sort
  48. on other columns, change the search to{' '}
  49. <span className="text-warning">unified search</span> from the search dropdown.
  50. </>
  51. ),
  52. },
  53. }}
  54. >
  55. Sorted by user ID
  56. </ButtonTooltip>
  57. )
  58. }
  59. return (
  60. <DropdownMenu>
  61. <DropdownMenuTrigger asChild>
  62. <Button icon={sortOrder === 'desc' ? <ArrowDownWideNarrow /> : <ArrowDownNarrowWide />}>
  63. Sorted by {sortColumn === 'id' ? 'user ID' : sortColumn.replaceAll('_', ' ')}
  64. </Button>
  65. </DropdownMenuTrigger>
  66. <DropdownMenuContent className="w-44" align="start">
  67. <DropdownMenuRadioGroup value={sortByValue} onValueChange={setSortByValue}>
  68. <DropdownMenuSub>
  69. <DropdownMenuSubTrigger>Sort by user ID</DropdownMenuSubTrigger>
  70. <DropdownMenuSubContent>
  71. <DropdownMenuRadioItem value="id:asc">Ascending</DropdownMenuRadioItem>
  72. <DropdownMenuRadioItem value="id:desc">Descending</DropdownMenuRadioItem>
  73. </DropdownMenuSubContent>
  74. </DropdownMenuSub>
  75. <DropdownMenuSub>
  76. <DropdownMenuSubTrigger>Sort by created at</DropdownMenuSubTrigger>
  77. <DropdownMenuSubContent>
  78. <DropdownMenuRadioItem value="created_at:asc">Ascending</DropdownMenuRadioItem>
  79. <DropdownMenuRadioItem value="created_at:desc">Descending</DropdownMenuRadioItem>
  80. </DropdownMenuSubContent>
  81. </DropdownMenuSub>
  82. <DropdownMenuSub>
  83. <DropdownMenuSubTrigger>Sort by last sign in at</DropdownMenuSubTrigger>
  84. <DropdownMenuSubContent>
  85. <DropdownMenuRadioItem value="last_sign_in_at:asc">Ascending</DropdownMenuRadioItem>
  86. <DropdownMenuRadioItem value="last_sign_in_at:desc">Descending</DropdownMenuRadioItem>
  87. </DropdownMenuSubContent>
  88. </DropdownMenuSub>
  89. {showSortByEmail && (
  90. <DropdownMenuSub>
  91. <DropdownMenuSubTrigger>Sort by email</DropdownMenuSubTrigger>
  92. <DropdownMenuSubContent>
  93. <DropdownMenuRadioItem value="email:asc">Ascending</DropdownMenuRadioItem>
  94. <DropdownMenuRadioItem value="email:desc">Descending</DropdownMenuRadioItem>
  95. </DropdownMenuSubContent>
  96. </DropdownMenuSub>
  97. )}
  98. {showSortByPhone && (
  99. <DropdownMenuSub>
  100. <DropdownMenuSubTrigger>Sort by phone</DropdownMenuSubTrigger>
  101. <DropdownMenuSubContent>
  102. <DropdownMenuRadioItem value="phone:asc">Ascending</DropdownMenuRadioItem>
  103. <DropdownMenuRadioItem value="phone:desc">Descending</DropdownMenuRadioItem>
  104. </DropdownMenuSubContent>
  105. </DropdownMenuSub>
  106. )}
  107. </DropdownMenuRadioGroup>
  108. </DropdownMenuContent>
  109. </DropdownMenu>
  110. )
  111. }