Ftech Built-in Modules
Clean, modern building modules. Copy and paste into your apps. Works with all React frameworks. Open Source. Free forever.
components/form/date-range.tsx
"use client"
import * as React from "react"
import { format } from "date-fns"
import { CalendarIcon } from "lucide-react"
import { DateRange } from "react-day-picker"
import { cn } from "@/lib/utils"
import { Button } from "@/components/ui/button"
import { Calendar } from "@/components/ui/calendar"
import {
Popover,
PopoverContent,
PopoverTrigger,
} from "@/components/ui/popover"
interface DatePickerWithRangeProps
extends React.HTMLAttributes<HTMLDivElement> {
date?: DateRange
onDateChange: (date: DateRange | undefined) => void
placeholder?: string
}
export function DatePickerWithRange({
className,
date,
onDateChange,
placeholder = "Pick a date",
}: DatePickerWithRangeProps) {
return (
<div className={cn("grid gap-2", className)}>
<Popover>
<PopoverTrigger asChild>
<Button
id="date"
variant={"outline"}
className={cn(
"w-[300px] justify-start text-left font-normal",
!date && "text-muted-foreground"
)}
>
<CalendarIcon />
{date?.from ? (
date.to ? (
<>
{format(date.from, "LLL dd, y")} -{" "}
{format(date.to, "LLL dd, y")}
</>
) : (
format(date.from, "LLL dd, y")
)
) : (
<span>{placeholder}</span>
)}
</Button>
</PopoverTrigger>
<PopoverContent className="w-auto p-0" align="start">
<Calendar
initialFocus
mode="range"
defaultMonth={date?.from}
selected={date}
onSelect={onDateChange}
numberOfMonths={2}
/>
</PopoverContent>
</Popover>
</div>
)
}

