SearchResultsToolbar.jsx 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. "use client";
  2. import React from "react";
  3. import { SlidersHorizontal } from "lucide-react";
  4. import { SEARCH_RESULTS_SORT } from "@/lib/frontend/search/resultsSorting";
  5. import { Button } from "@/components/ui/button";
  6. import {
  7. DropdownMenu,
  8. DropdownMenuContent,
  9. DropdownMenuLabel,
  10. DropdownMenuRadioGroup,
  11. DropdownMenuRadioItem,
  12. DropdownMenuSeparator,
  13. DropdownMenuTrigger,
  14. } from "@/components/ui/dropdown-menu";
  15. export default function SearchResultsToolbar({
  16. countLoaded,
  17. total,
  18. sortMode,
  19. onSortModeChange,
  20. }) {
  21. const hasTotal = typeof total === "number" && Number.isFinite(total);
  22. const label = hasTotal
  23. ? `${countLoaded} von ${total} Treffern geladen`
  24. : `${countLoaded} Treffer (aktuell geladen)`;
  25. return (
  26. <div className="flex flex-wrap items-center justify-between gap-2">
  27. <div className="text-xs text-muted-foreground">{label}</div>
  28. <DropdownMenu>
  29. <DropdownMenuTrigger asChild>
  30. <Button variant="outline" size="sm" type="button">
  31. <SlidersHorizontal className="h-4 w-4" />
  32. Sortierung
  33. </Button>
  34. </DropdownMenuTrigger>
  35. <DropdownMenuContent align="end" className="min-w-[16rem]">
  36. <DropdownMenuLabel>Sortierung</DropdownMenuLabel>
  37. <DropdownMenuSeparator />
  38. <DropdownMenuRadioGroup
  39. value={sortMode}
  40. onValueChange={(value) => onSortModeChange(value)}
  41. >
  42. <DropdownMenuRadioItem value={SEARCH_RESULTS_SORT.RELEVANCE}>
  43. Relevanz
  44. </DropdownMenuRadioItem>
  45. <DropdownMenuRadioItem value={SEARCH_RESULTS_SORT.DATE_DESC}>
  46. Datum (neueste zuerst)
  47. </DropdownMenuRadioItem>
  48. <DropdownMenuRadioItem value={SEARCH_RESULTS_SORT.FILENAME_ASC}>
  49. Dateiname (A–Z)
  50. </DropdownMenuRadioItem>
  51. </DropdownMenuRadioGroup>
  52. </DropdownMenuContent>
  53. </DropdownMenu>
  54. </div>
  55. );
  56. }