Files
thrilltrack-explorer/src-old/components/ui/month-year-picker.tsx

143 lines
4.0 KiB
TypeScript

import * as React from "react";
import { format } from "date-fns";
import { CalendarIcon, ChevronLeft, ChevronRight } from "lucide-react";
import { cn } from "@/lib/utils";
import { Button } from "@/components/ui/button";
import {
Popover,
PopoverContent,
PopoverTrigger,
} from "@/components/ui/popover";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
export interface MonthYearPickerProps {
date?: Date;
onSelect?: (date: Date | undefined) => void;
placeholder?: string;
disabled?: boolean;
className?: string;
fromYear?: number;
toYear?: number;
}
export function MonthYearPicker({
date,
onSelect,
placeholder = "Pick month and year",
disabled = false,
className,
fromYear = 1800,
toYear = new Date().getFullYear(),
}: MonthYearPickerProps) {
const [open, setOpen] = React.useState(false);
const [tempMonth, setTempMonth] = React.useState(date?.getMonth() ?? new Date().getMonth());
const [tempYear, setTempYear] = React.useState(date?.getFullYear() ?? new Date().getFullYear());
const months = [
"January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"
];
const years = Array.from(
{ length: toYear - fromYear + 1 },
(_, i) => toYear - i
);
const handleSelect = () => {
const newDate = new Date(tempYear, tempMonth, 1);
onSelect?.(newDate);
setOpen(false);
};
const handleClear = () => {
onSelect?.(undefined);
setOpen(false);
};
React.useEffect(() => {
if (date) {
setTempMonth(date.getMonth());
setTempYear(date.getFullYear());
}
}, [date]);
return (
<Popover open={open} onOpenChange={setOpen}>
<PopoverTrigger asChild>
<Button
variant="outline"
className={cn(
"w-full justify-start text-left font-normal",
!date && "text-muted-foreground",
className
)}
disabled={disabled}
>
<CalendarIcon className="mr-2 h-4 w-4" />
<span className="truncate">
{date ? format(date, "MMMM yyyy") : placeholder}
</span>
</Button>
</PopoverTrigger>
<PopoverContent className="w-auto p-4" align="start">
<div className="space-y-4">
<div className="grid grid-cols-2 gap-2">
<div className="space-y-2">
<label className="text-sm font-medium">Month</label>
<Select
value={tempMonth.toString()}
onValueChange={(value) => setTempMonth(parseInt(value))}
>
<SelectTrigger>
<SelectValue />
</SelectTrigger>
<SelectContent>
{months.map((month, index) => (
<SelectItem key={month} value={index.toString()}>
{month}
</SelectItem>
))}
</SelectContent>
</Select>
</div>
<div className="space-y-2">
<label className="text-sm font-medium">Year</label>
<Select
value={tempYear.toString()}
onValueChange={(value) => setTempYear(parseInt(value))}
>
<SelectTrigger>
<SelectValue />
</SelectTrigger>
<SelectContent className="max-h-[200px]">
{years.map((year) => (
<SelectItem key={year} value={year.toString()}>
{year}
</SelectItem>
))}
</SelectContent>
</Select>
</div>
</div>
<div className="flex gap-2">
<Button size="sm" onClick={handleSelect} className="flex-1">
Select
</Button>
<Button size="sm" variant="outline" onClick={handleClear}>
Clear
</Button>
</div>
</div>
</PopoverContent>
</Popover>
);
}