SearchScopeSelect.jsx 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. "use client";
  2. import React from "react";
  3. import { ChevronDown } from "lucide-react";
  4. import { SEARCH_SCOPE } from "@/lib/frontend/search/urlState";
  5. import { Button } from "@/components/ui/button";
  6. import { Label } from "@/components/ui/label";
  7. import {
  8. DropdownMenu,
  9. DropdownMenuContent,
  10. DropdownMenuLabel,
  11. DropdownMenuRadioGroup,
  12. DropdownMenuRadioItem,
  13. DropdownMenuSeparator,
  14. DropdownMenuTrigger,
  15. } from "@/components/ui/dropdown-menu";
  16. const SCOPE_LABELS = Object.freeze({
  17. [SEARCH_SCOPE.SINGLE]: "Eine Niederlassung",
  18. [SEARCH_SCOPE.MULTI]: "Mehrere Niederlassungen",
  19. [SEARCH_SCOPE.ALL]: "Alle Niederlassungen",
  20. });
  21. export default function SearchScopeSelect({
  22. branch,
  23. scope,
  24. onScopeChange,
  25. isSubmitting,
  26. }) {
  27. const scopeLabel = SCOPE_LABELS[scope] || "Unbekannt";
  28. return (
  29. <div className="grid gap-2">
  30. <Label>Suchbereich</Label>
  31. <DropdownMenu>
  32. <DropdownMenuTrigger asChild>
  33. <Button
  34. type="button"
  35. variant="outline"
  36. disabled={isSubmitting}
  37. title="Suchbereich auswählen"
  38. >
  39. {scopeLabel}
  40. <ChevronDown className="h-4 w-4" />
  41. </Button>
  42. </DropdownMenuTrigger>
  43. <DropdownMenuContent align="start" className="min-w-[16rem]">
  44. <DropdownMenuLabel>Suchbereich</DropdownMenuLabel>
  45. <DropdownMenuSeparator />
  46. <DropdownMenuRadioGroup
  47. value={scope}
  48. onValueChange={(value) => onScopeChange(value)}
  49. >
  50. <DropdownMenuRadioItem value={SEARCH_SCOPE.SINGLE}>
  51. Diese Niederlassung ({branch})
  52. </DropdownMenuRadioItem>
  53. <DropdownMenuRadioItem value={SEARCH_SCOPE.MULTI}>
  54. Mehrere Niederlassungen
  55. </DropdownMenuRadioItem>
  56. <DropdownMenuRadioItem value={SEARCH_SCOPE.ALL}>
  57. Alle Niederlassungen
  58. </DropdownMenuRadioItem>
  59. </DropdownMenuRadioGroup>
  60. </DropdownMenuContent>
  61. </DropdownMenu>
  62. </div>
  63. );
  64. }