Skip to content

Commit bb0f9f6

Browse files
authored
Merge pull request #303 from ury-erp/feat/calendar
Feat/calendar
2 parents 5c108db + b709902 commit bb0f9f6

6 files changed

Lines changed: 481 additions & 179 deletions

File tree

Lines changed: 6 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -1,106 +1,14 @@
1-
import { useState } from "react";
2-
import {
3-
DayPicker,
4-
type DateRange,
5-
} from "react-day-picker";
6-
import "react-day-picker/style.css";
7-
import {
8-
endOfDay,
9-
endOfMonth,
10-
endOfWeek,
11-
format,
12-
startOfDay,
13-
startOfMonth,
14-
startOfWeek,
15-
} from "date-fns";
1+
import { UryDateRangePicker, type DateRangeValue } from '../setup/DatePicker';
162

17-
export interface DateRangeValue {
18-
from: Date;
19-
to: Date;
20-
}
3+
export type { DateRangeValue };
214

225
export interface DateRangeFilterProps {
236
value: DateRangeValue;
247
onChange: (range: DateRangeValue) => void;
8+
className?: string;
259
}
2610

27-
const PRESETS = [
28-
{
29-
label: "Today",
30-
getRange: (): DateRangeValue => {
31-
const today = new Date();
32-
return { from: startOfDay(today), to: endOfDay(today) };
33-
},
34-
},
35-
{
36-
label: "This Week",
37-
getRange: (): DateRangeValue => {
38-
const today = new Date();
39-
return { from: startOfWeek(today), to: endOfWeek(today) };
40-
},
41-
},
42-
{
43-
label: "This Month",
44-
getRange: (): DateRangeValue => {
45-
const today = new Date();
46-
return { from: startOfMonth(today), to: endOfMonth(today) };
47-
},
48-
},
49-
];
50-
51-
export function DateRangeFilter({ value, onChange }: DateRangeFilterProps) {
52-
const [open, setOpen] = useState(false);
53-
54-
const selectedRange: DateRange = { from: value.from, to: value.to };
55-
56-
const handleSelect = (range: DateRange | undefined) => {
57-
if (range?.from && range?.to) {
58-
onChange({ from: range.from, to: range.to });
59-
}
60-
};
61-
62-
const applyPreset = (range: DateRangeValue) => {
63-
onChange(range);
64-
setOpen(false);
65-
};
66-
67-
const label = `${format(value.from, "MMM d, yyyy")} - ${format(
68-
value.to,
69-
"MMM d, yyyy"
70-
)}`;
71-
72-
return (
73-
<div className="relative inline-block">
74-
<button
75-
type="button"
76-
onClick={() => setOpen((prev) => !prev)}
77-
className="inline-flex items-center justify-between gap-2 rounded-md border border-input bg-muted px-3 py-2 text-sm font-medium text-muted-foreground hover:bg-muted/80"
78-
>
79-
<span>{label}</span>
80-
<span aria-hidden="true"></span>
81-
</button>
82-
83-
{open && (
84-
<div className="absolute z-10 mt-2 w-auto min-w-[20rem] rounded-md border bg-white p-3 shadow-md">
85-
<div className="mb-3 flex flex-wrap gap-2">
86-
{PRESETS.map((preset) => (
87-
<button
88-
key={preset.label}
89-
type="button"
90-
onClick={() => applyPreset(preset.getRange())}
91-
className="rounded-md border bg-muted px-2.5 py-1 text-xs font-medium text-muted-foreground hover:bg-muted/80"
92-
>
93-
{preset.label}
94-
</button>
95-
))}
96-
</div>
97-
<DayPicker
98-
mode="range"
99-
selected={selectedRange}
100-
onSelect={handleSelect}
101-
/>
102-
</div>
103-
)}
104-
</div>
105-
);
11+
export function DateRangeFilter({ value, onChange, className }: DateRangeFilterProps) {
12+
return <UryDateRangePicker value={value} onChange={onChange} className={className} />;
10613
}
14+

0 commit comments

Comments
 (0)