SearchLimitSelect.jsx 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. "use client";
  2. import React from "react";
  3. import { ChevronDown } from "lucide-react";
  4. import {
  5. SEARCH_LIMITS,
  6. DEFAULT_SEARCH_LIMIT,
  7. } from "@/lib/frontend/search/urlState";
  8. import { Button } from "@/components/ui/button";
  9. import { Label } from "@/components/ui/label";
  10. import {
  11. DropdownMenu,
  12. DropdownMenuContent,
  13. DropdownMenuLabel,
  14. DropdownMenuRadioGroup,
  15. DropdownMenuRadioItem,
  16. DropdownMenuSeparator,
  17. DropdownMenuTrigger,
  18. } from "@/components/ui/dropdown-menu";
  19. export default function SearchLimitSelect({
  20. limit,
  21. onLimitChange,
  22. isSubmitting,
  23. }) {
  24. const normalizedLimit =
  25. Number.isInteger(limit) && SEARCH_LIMITS.includes(limit)
  26. ? limit
  27. : DEFAULT_SEARCH_LIMIT;
  28. return (
  29. <div className="grid gap-2">
  30. <Label>Treffer pro Seite</Label>
  31. <DropdownMenu>
  32. <DropdownMenuTrigger asChild>
  33. <Button
  34. type="button"
  35. variant="outline"
  36. disabled={isSubmitting}
  37. title="Treffer pro Seite auswählen"
  38. >
  39. {normalizedLimit}
  40. <ChevronDown className="h-4 w-4" />
  41. </Button>
  42. </DropdownMenuTrigger>
  43. <DropdownMenuContent align="start" className="min-w-[12rem]">
  44. <DropdownMenuLabel>Treffer pro Seite</DropdownMenuLabel>
  45. <DropdownMenuSeparator />
  46. <DropdownMenuRadioGroup
  47. value={String(normalizedLimit)}
  48. onValueChange={(value) => {
  49. const n = Number(value);
  50. if (!Number.isInteger(n)) return;
  51. onLimitChange(n);
  52. }}
  53. >
  54. {SEARCH_LIMITS.map((n) => (
  55. <DropdownMenuRadioItem key={n} value={String(n)}>
  56. {n}
  57. </DropdownMenuRadioItem>
  58. ))}
  59. </DropdownMenuRadioGroup>
  60. </DropdownMenuContent>
  61. </DropdownMenu>
  62. </div>
  63. );
  64. }