Skip to content

Commit dc85636

Browse files
feat: support popover props in datepicker and rangepicker
1 parent c91602f commit dc85636

File tree

4 files changed

+30
-20
lines changed

4 files changed

+30
-20
lines changed

packages/raystack/components/calendar/calendar.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ function DropDown({
5454

5555
useEffect(() => {
5656
if (open && onDropdownOpen) onDropdownOpen();
57-
}, [open]);
57+
}, [open, onDropdownOpen]);
5858

5959
function handleChange(value: string) {
6060
if (onChange) {

packages/raystack/components/calendar/date-picker.tsx

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
'use client';
22

33
import { CalendarIcon } from '@radix-ui/react-icons';
4+
import { cx } from 'class-variance-authority';
45
import dayjs from 'dayjs';
56
import customParseFormat from 'dayjs/plugin/customParseFormat';
67
import { useCallback, useEffect, useRef, useState } from 'react';
78
import { PropsBase, PropsSingleRequired } from 'react-day-picker';
8-
99
import { InputField } from '../input-field';
1010
import { InputFieldProps } from '../input-field/input-field';
1111
import { Popover } from '../popover';
12+
import { PopoverContentProps } from '../popover/popover';
1213
import { Calendar } from './calendar';
1314
import styles from './calendar.module.css';
1415

1516
dayjs.extend(customParseFormat);
1617

1718
interface DatePickerProps {
18-
side?: 'top' | 'right' | 'bottom' | 'left';
1919
dateFormat?: string;
2020
inputFieldProps?: InputFieldProps;
2121
calendarProps?: PropsSingleRequired & PropsBase;
@@ -26,18 +26,19 @@ interface DatePickerProps {
2626
| ((props: { selectedDate: string }) => React.ReactNode);
2727
showCalendarIcon?: boolean;
2828
timeZone?: string;
29+
popoverProps?: PopoverContentProps;
2930
}
3031

3132
export function DatePicker({
32-
side = 'top',
3333
dateFormat = 'DD/MM/YYYY',
3434
inputFieldProps,
3535
calendarProps,
3636
value = new Date(),
3737
onSelect = () => {},
3838
children,
3939
showCalendarIcon = true,
40-
timeZone
40+
timeZone,
41+
popoverProps
4142
}: DatePickerProps) {
4243
const [showCalendar, setShowCalendar] = useState(false);
4344
const [selectedDate, setSelectedDate] = useState(value);
@@ -55,19 +56,22 @@ export function DatePicker({
5556
selectedDateRef.current = selectedDate;
5657
}, [selectedDate]);
5758

58-
function isElementOutside(el: HTMLElement) {
59+
const isElementOutside = useCallback((el: HTMLElement) => {
5960
return (
6061
!isDropdownOpenRef.current && // Month and Year dropdown from Date picker
6162
!inputFieldRef.current?.contains(el) && // InputField
6263
!contentRef.current?.contains(el)
6364
);
64-
}
65-
66-
const handleMouseDown = useCallback((event: MouseEvent) => {
67-
const el = event.target as HTMLElement | null;
68-
if (el && isElementOutside(el)) removeEventListeners();
6965
}, []);
7066

67+
const handleMouseDown = useCallback(
68+
(event: MouseEvent) => {
69+
const el = event.target as HTMLElement | null;
70+
if (el && isElementOutside(el)) removeEventListeners();
71+
},
72+
[isElementOutside]
73+
);
74+
7175
function registerEventListeners() {
7276
isInputFieldFocused.current = true;
7377
document.addEventListener('mouseup', handleMouseDown);
@@ -184,17 +188,17 @@ export function DatePicker({
184188
) : children ? (
185189
<div>{children}</div>
186190
) : (
187-
defaultTrigger
191+
<div>{defaultTrigger}</div>
188192
);
189193

190194
return (
191195
<Popover open={showCalendar} onOpenChange={onOpenChange}>
192196
<Popover.Trigger asChild>{trigger}</Popover.Trigger>
193-
194197
<Popover.Content
195-
side={side}
196-
className={styles.calendarPopover}
197198
ref={contentRef}
199+
{...popoverProps}
200+
className={cx(styles.calendarPopover, popoverProps?.className)}
201+
side={popoverProps?.side ?? 'top'}
198202
>
199203
<Calendar
200204
required={true}

packages/raystack/components/calendar/range-picker.tsx

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
'use client';
22

33
import { CalendarIcon } from '@radix-ui/react-icons';
4+
import { cx } from 'class-variance-authority';
45
import dayjs from 'dayjs';
56
import { useCallback, useMemo, useState } from 'react';
67
import { DateRange, PropsBase, PropsRangeRequired } from 'react-day-picker';
78
import { Flex } from '../flex';
89
import { InputField } from '../input-field';
910
import { InputFieldProps } from '../input-field/input-field';
1011
import { Popover } from '../popover';
12+
import { PopoverContentProps } from '../popover/popover';
1113
import { Calendar } from './calendar';
1214
import styles from './calendar.module.css';
1315

1416
interface RangePickerProps {
15-
side?: 'top' | 'right' | 'bottom' | 'left';
1617
dateFormat?: string;
1718
inputFieldsProps?: { startDate?: InputFieldProps; endDate?: InputFieldProps };
1819
calendarProps?: PropsRangeRequired & PropsBase;
@@ -26,12 +27,12 @@ interface RangePickerProps {
2627
showCalendarIcon?: boolean;
2728
footer?: React.ReactNode;
2829
timeZone?: string;
30+
popoverProps?: PopoverContentProps;
2931
}
3032

3133
type RangeFields = keyof DateRange;
3234

3335
export function RangePicker({
34-
side = 'top',
3536
dateFormat = 'DD/MM/YYYY',
3637
inputFieldsProps = {},
3738
calendarProps,
@@ -45,7 +46,8 @@ export function RangePicker({
4546
children,
4647
showCalendarIcon = true,
4748
footer,
48-
timeZone
49+
timeZone,
50+
popoverProps
4951
}: RangePickerProps) {
5052
const [showCalendar, setShowCalendar] = useState(false);
5153
const [currentRangeField, setCurrentRangeField] =
@@ -166,7 +168,11 @@ export function RangePicker({
166168
return (
167169
<Popover open={showCalendar} onOpenChange={setShowCalendar}>
168170
<Popover.Trigger asChild>{trigger}</Popover.Trigger>
169-
<Popover.Content side={side} className={styles.calendarPopover}>
171+
<Popover.Content
172+
{...popoverProps}
173+
className={cx(styles.calendarPopover, popoverProps?.className)}
174+
side={popoverProps?.side ?? 'top'}
175+
>
170176
<Calendar
171177
showOutsideDays={false}
172178
numberOfMonths={2}

packages/raystack/components/popover/popover.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import styles from './popover.module.css';
88

99
const popoverContent = cva(styles.popover);
1010

11-
interface PopoverContentProps
11+
export interface PopoverContentProps
1212
extends React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content> {
1313
ariaLabel?: string;
1414
}

0 commit comments

Comments
 (0)