subman-nextjs/src/app/ui/forms/genrePicker.tsx

86 lines
2.4 KiB
TypeScript
Raw Normal View History

2024-06-26 17:32:18 +00:00
import { FormField, FormItem, FormLabel, FormMessage, FormControl } from "@/components/ui/form"
2024-06-26 16:19:44 +00:00
import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"
import { Button } from "@/components/ui/button"
import { Badge } from "@/components/ui/badge"
2024-06-26 17:32:18 +00:00
import { Checkbox } from "@/components/ui/checkbox"
2024-06-26 16:19:44 +00:00
import { cn } from "@/lib/utils"
2024-07-23 15:40:35 +00:00
import { ComponentProps } from "react"
import { Genre } from "@prisma/client"
import { UseFormReturn } from "react-hook-form"
2024-06-26 16:19:44 +00:00
2024-07-23 15:40:35 +00:00
export default function GenrePicker({ genres, form }: ComponentProps<"div"> & { genres: Genre[], form: UseFormReturn }) {
2024-06-26 16:19:44 +00:00
return (
2024-06-26 17:32:18 +00:00
<Popover modal={true}>
<FormField
control={form.control}
name="genres"
render={({ field }) => (
<FormItem className="flex flex-col">
<FormLabel className="h-5">Genres</FormLabel>
2024-06-26 16:19:44 +00:00
<PopoverTrigger asChild>
<Button
variant={"outline"}
className={cn(
2024-09-27 09:11:03 +00:00
"min-w-fit max-w-60 pl-3 text-left font-normal flex-wrap gap-y-1 h-fit min-h-10",
2024-06-26 16:19:44 +00:00
!field.value && "text-muted-foreground"
)}
>
{field.value.length !== 0 ? (
2024-06-26 17:32:18 +00:00
field.value.map((e, i) => (<Badge key={i}>{genres.find(f => e === f.id).name}</Badge>))
2024-06-26 16:19:44 +00:00
) : (
<p>Select</p>
)}
</Button>
</PopoverTrigger>
<PopoverContent align="start">
{genres.map((item) => (
2024-06-26 17:32:18 +00:00
< FormField
2024-06-26 16:19:44 +00:00
key={item.id}
control={form.control}
name="genres"
render={({ field }) => {
return (
2024-06-26 17:32:18 +00:00
<FormItem
key={item.id}
className="flex flex-row items-start space-x-3 space-y-0"
>
<FormControl>
<Checkbox
checked={field.value?.includes(item.id)}
onCheckedChange={(checked) => {
return checked
? field.onChange([...field.value, item.id])
: field.onChange(
field.value?.filter(
(value) => value !== item.id
)
)
}}
/>
</FormControl>
<FormLabel className="text-sm font-normal">
{item.name}
</FormLabel>
</FormItem>
2024-06-26 16:19:44 +00:00
)
}}
/>
))}
<Button variant="link" className="p-0" onClick={() => form.setValue("genres", [])}>Clear</Button>
</PopoverContent>
2024-06-26 17:32:18 +00:00
<FormMessage />
</FormItem>
)}
/>
</Popover>
2024-06-26 16:19:44 +00:00
)
}