rhf-date-range-field
shuip/rhf-date-range-fieldFreeComponent
shuip publishes no description for this item.
Install it
npx shadcn@latest add https://shuip.plvo.dev/r/rhf-date-range-field.jsonSource
1'use client';23import type { Lens } from '@hookform/lenses';4import type { Locale } from 'date-fns';5import { format } from 'date-fns';6import { CalendarIcon } from 'lucide-react';7import * as React from 'react';8import type { DateRange } from 'react-day-picker';9import { useController } from 'react-hook-form';10import { Button } from '@/components/ui/button';11import { Calendar } from '@/components/ui/calendar';12import { Field, FieldDescription, FieldError, FieldLabel } from '@/components/ui/field';13import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';14import { cn } from '@/lib/utils';1516export interface DateRangeFieldProps {17 lens: Lens<DateRange | undefined>;18 label?: string;19 description?: string;20 placeholder?: string;21 minDate?: Date;22 maxDate?: Date;23 locale?: Locale;24 disabled?: boolean;25}2627function formatRange(value: DateRange | undefined, locale: Locale | undefined): string | null {28 if (!value?.from) return null;29 const fromLabel = format(value.from, 'PPP', { locale });30 if (!value.to) return fromLabel;31 return `${fromLabel} – ${format(value.to, 'PPP', { locale })}`;32}3334export function DateRangeField({35 lens,36 label,37 description,38 placeholder = 'Pick a date range',39 minDate,40 maxDate,41 locale,42 disabled,43}: DateRangeFieldProps) {44 const { field, fieldState } = useController(lens.interop());45 const value = field.value as DateRange | undefined;46 const [open, setOpen] = React.useState(false);4748 const disabledMatcher = React.useMemo(() => {49 if (!minDate && !maxDate) return undefined;50 return { ...(minDate ? { before: minDate } : {}), ...(maxDate ? { after: maxDate } : {}) };51 }, [minDate, maxDate]);5253 const triggerLabel = formatRange(value, locale);5455 return (56 <Field className='gap-2' data-invalid={fieldState.invalid}>57 {label && <FieldLabel htmlFor={field.name}>{label}</FieldLabel>}58 <Popover open={open} onOpenChange={setOpen}>59 <PopoverTrigger asChild>60 <Button61 id={field.name}62 type='button'63 variant='outline'64 disabled={disabled}65 onBlur={field.onBlur}66 aria-invalid={fieldState.invalid}67 className={cn('w-full justify-between font-normal', !triggerLabel && 'text-muted-foreground')}68 >69 <span className='truncate'>{triggerLabel ?? placeholder}</span>70 <CalendarIcon className='size-4 opacity-60' />71 </Button>72 </PopoverTrigger>73// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from shuip
All 52 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| confirmation-dialogconfirmation-dialog | shuip | Components | Free | 1 dep | |
| copy-buttoncopy-button | shuip | Components | Free | 3 deps | |
| hover-revealhover-reveal | shuip | Components | Free | 1 dep | |
| rhf-address-fieldrhf-address-field | shuip | Components | Free | 5 deps · 2 files | |
| rhf-autocomplete-fieldrhf-autocomplete-field | shuip | Components | Free | 4 deps | |
| rhf-checkbox-fieldrhf-checkbox-field | shuip | Components | Free | 3 deps | |
| rhf-combobox-fieldrhf-combobox-field | shuip | Components | Free | 5 deps | |
| rhf-date-fieldrhf-date-field | shuip | Components | Free | 6 deps |
