PluginProbe
Yatra – Travel Booking & Tour Operator Software / 3.0.3
Yatra – Travel Booking & Tour Operator Software v3.0.3
3.0.15 3.0.14 3.0.14.1 3.0.14.2 3.0.12 3.0.13 3.0.11 3.0.10 3.0.9 3.0.8 3.0.7 3.0.6 3.0.5 3.0.5.1 3.0.4 3.0.3 3.0.2.9 3.0.2.7 3.0.2.8 3.0.2.6 trunk 1.0.0 2.0.0 2.0.1 2.0.10 All 83 releases
yatra / resources / js / components / ui / date-picker.tsx

date-picker.tsx in Yatra – Travel Booking & Tour Operator Software 3.0.3, at resources/js/components/ui/date-picker.tsx

87 lines 2.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import * as React from "react";
2 import { format, parse } from "date-fns";
3 import { Calendar as CalendarIcon } from "lucide-react";
4 import { Calendar } from "./calendar";
5 import { Popover, PopoverContent, PopoverTrigger } from "./popover";
6 import { Button } from "./button";
7
8 export interface DatePickerProps {
9 value?: string; // YYYY-MM-DD format
10 onChange?: (value: string) => void;
11 placeholder?: string;
12 disabled?: boolean;
13 minDate?: Date;
14 maxDate?: Date;
15 className?: string;
16 error?: boolean;
17 }
18
19 export const DatePicker: React.FC<DatePickerProps> = ({
20 value,
21 onChange,
22 placeholder = "Select date",
23 disabled = false,
24 minDate,
25 maxDate,
26 className = "",
27 error = false,
28 }) => {
29 const [open, setOpen] = React.useState(false);
30
31 // Parse date safely - check if value is valid and parse correctly
32 let selectedDate: Date | undefined = undefined;
33 if (value && value.trim()) {
34 try {
35 const parsed = parse(value, "yyyy-MM-dd", new Date());
36 // Check if parsed date is valid
37 if (!isNaN(parsed.getTime())) {
38 selectedDate = parsed;
39 }
40 } catch (e) {
41 // Invalid date format, leave as undefined
42 selectedDate = undefined;
43 }
44 }
45
46 const handleSelect = (date: Date | undefined) => {
47 if (date) {
48 onChange?.(format(date, "yyyy-MM-dd"));
49 setOpen(false);
50 }
51 };
52
53 // Format display value safely
54 let displayValue = "";
55 if (selectedDate && !isNaN(selectedDate.getTime())) {
56 try {
57 displayValue = format(selectedDate, "MMM dd, yyyy");
58 } catch (e) {
59 displayValue = "";
60 }
61 }
62
63 return (
64 <Popover open={open} onOpenChange={setOpen}>
65 <PopoverTrigger asChild>
66 <Button
67 type="button"
68 variant="outline"
69 disabled={disabled}
70 className={`w-full justify-start text-left font-normal ${error ? "border-red-500" : ""} ${!displayValue ? "text-gray-500" : ""} ${className}`}
71 >
72 <CalendarIcon className="mr-2 h-4 w-4" />
73 {displayValue || <span className="text-gray-500">{placeholder}</span>}
74 </Button>
75 </PopoverTrigger>
76 <PopoverContent className="w-auto p-0" align="start">
77 <Calendar
78 selected={selectedDate}
79 onSelect={handleSelect}
80 minDate={minDate}
81 maxDate={maxDate}
82 />
83 </PopoverContent>
84 </Popover>
85 );
86 };
87