Reverted to commit 10950a4034

This commit is contained in:
gpt-engineer-app[bot]
2025-10-11 23:39:40 +00:00
parent c59ab9523f
commit 52e50ebb5e
8 changed files with 14 additions and 468 deletions

View File

@@ -1,10 +1,9 @@
import * as React from "react";
import { format, parse, isValid } from "date-fns";
import { format } from "date-fns";
import { CalendarIcon } from "lucide-react";
import { cn } from "@/lib/utils";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Calendar } from "@/components/ui/calendar";
import {
Popover,
@@ -22,9 +21,6 @@ export interface DatePickerProps {
disablePast?: boolean;
fromYear?: number;
toYear?: number;
allowTextEntry?: boolean;
dateFormat?: string;
enableYearGrid?: boolean;
}
export function DatePicker({
@@ -37,66 +33,12 @@ export function DatePicker({
disablePast = false,
fromYear,
toYear,
allowTextEntry = false,
dateFormat = "yyyy-MM-dd",
enableYearGrid = false,
}: DatePickerProps) {
const [open, setOpen] = React.useState(false);
const [textInput, setTextInput] = React.useState("");
const [isTyping, setIsTyping] = React.useState(false);
const parseDate = (input: string): Date | null => {
if (!input) return null;
// Try ISO format: 2005-06-15
let parsed = parse(input, "yyyy-MM-dd", new Date());
if (isValid(parsed)) return parsed;
// Try US format: 06/15/2005
parsed = parse(input, "MM/dd/yyyy", new Date());
if (isValid(parsed)) return parsed;
// Try European format: 15/06/2005
parsed = parse(input, "dd/MM/yyyy", new Date());
if (isValid(parsed)) return parsed;
// Try short format: 6/15/05
parsed = parse(input, "M/d/yy", new Date());
if (isValid(parsed)) return parsed;
// Try short year format: 2005-6-15
parsed = parse(input, "yyyy-M-d", new Date());
if (isValid(parsed)) return parsed;
return null;
};
const handleTextChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const value = e.target.value;
setTextInput(value);
setIsTyping(true);
const parsed = parseDate(value);
if (parsed) {
onSelect?.(parsed);
}
};
const handleBlur = () => {
setIsTyping(false);
if (date) {
setTextInput(format(date, dateFormat));
} else {
setTextInput("");
}
};
const handleSelect = (selectedDate: Date | undefined) => {
onSelect?.(selectedDate);
setOpen(false);
if (selectedDate) {
setTextInput(format(selectedDate, dateFormat));
}
};
const getDisabledDates = (date: Date) => {
@@ -106,49 +48,6 @@ export function DatePicker({
return false;
};
if (allowTextEntry) {
return (
<div className="relative flex gap-1">
<Input
type="text"
value={isTyping ? textInput : (date ? format(date, dateFormat) : "")}
onChange={handleTextChange}
onFocus={() => setIsTyping(true)}
onBlur={handleBlur}
placeholder={placeholder}
disabled={disabled}
className={cn("flex-1", className)}
/>
<Popover open={open} onOpenChange={setOpen}>
<PopoverTrigger asChild>
<Button
variant="outline"
size="icon"
disabled={disabled}
className="shrink-0"
type="button"
>
<CalendarIcon className="h-4 w-4" />
</Button>
</PopoverTrigger>
<PopoverContent className="w-auto p-0" align="start">
<Calendar
mode="single"
selected={date}
onSelect={handleSelect}
disabled={getDisabledDates}
initialFocus
className="p-3 pointer-events-auto"
fromYear={fromYear}
toYear={toYear}
enableYearGrid={enableYearGrid}
/>
</PopoverContent>
</Popover>
</div>
);
}
return (
<Popover open={open} onOpenChange={setOpen}>
<PopoverTrigger asChild>
@@ -160,7 +59,6 @@ export function DatePicker({
className
)}
disabled={disabled}
type="button"
>
<CalendarIcon className="mr-2 h-4 w-4" />
<span className="truncate">
@@ -178,7 +76,6 @@ export function DatePicker({
className="p-3 pointer-events-auto"
fromYear={fromYear}
toYear={toYear}
enableYearGrid={enableYearGrid}
/>
</PopoverContent>
</Popover>