Skip to content

Commit 8c72e70

Browse files
author
=
committed
add month picker to form components
1 parent 237430d commit 8c72e70

File tree

7 files changed

+115
-70
lines changed

7 files changed

+115
-70
lines changed
Lines changed: 42 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,60 @@
1-
import { DatePicker } from './DatePicker'
2-
import { DateRangePicker } from './DateRangePicker'
3-
import { MonthPicker } from './MonthPicker'
4-
import { getLocalTimeZone, today, parseDate } from '@internationalized/date'
5-
import { Meta, StoryObj } from '@storybook/react'
1+
import { getLocalTimeZone, parseDate, today } from '@internationalized/date';
2+
import { Meta, StoryObj } from '@storybook/react';
3+
4+
import { DatePicker } from './DatePicker';
5+
import { DateRangePicker } from './DateRangePicker';
6+
import { MonthPicker } from './MonthPicker';
67

78
/**
89
* A date picker combines a DateField and a Calendar popover to allow users to enter or select a date and time value.
910
*
1011
* Reference: https://react-spectrum.adobe.com/react-aria/useDatePicker.html
1112
*/
1213
const meta = {
13-
title: 'Components/DatePicker',
14-
component: DatePicker,
15-
} satisfies Meta<typeof DatePicker>
14+
title: 'Components/DatePicker',
15+
component: DatePicker,
16+
} satisfies Meta<typeof DatePicker>;
1617

17-
export default meta
18-
type Story = StoryObj<typeof meta>
18+
export default meta;
19+
type Story = StoryObj<typeof meta>;
1920

2021
const metaRange = {
21-
component: DateRangePicker,
22-
} satisfies Meta<typeof DateRangePicker>
23-
type StoryRange = StoryObj<typeof metaRange>
22+
component: DateRangePicker,
23+
} satisfies Meta<typeof DateRangePicker>;
24+
type StoryRange = StoryObj<typeof metaRange>;
2425

2526
export const Default: Story = {
26-
args: {
27-
label: 'Date Picker',
28-
},
29-
}
27+
args: {
28+
label: 'Date Picker',
29+
},
30+
};
3031

3132
export const Range: StoryRange = {
32-
render: ({ ...args }) => <DateRangePicker {...args} />,
33-
args: {
34-
label: 'Date Range Picker',
35-
onChange: (val) => console.log(val),
36-
},
37-
}
33+
render: ({ ...args }) => <DateRangePicker {...args} />,
34+
args: {
35+
label: 'Date Range Picker',
36+
onChange: (val) => console.log(val),
37+
},
38+
};
3839

3940
export const Month: Story = {
40-
render: ({ ...args }) => <MonthPicker {...args} />,
41-
args: {
42-
label: 'Month Picker',
43-
onChange: (val) => console.log(val),
44-
defaultValue: parseDate('2023-02-04'),
45-
},
46-
}
41+
render: ({ ...args }) => <MonthPicker {...args} />,
42+
args: {
43+
label: 'Month Picker',
44+
onChange: (val) => console.log(val),
45+
defaultValue: parseDate('2023-02-04'),
46+
},
47+
};
4748

4849
export const DisabledDates: StoryRange = {
49-
...Range,
50-
args: {
51-
label: 'Date Picker',
52-
minValue: today(getLocalTimeZone()),
53-
defaultValue: {
54-
start: parseDate('2022-02-04'),
55-
end: parseDate('2022-05-03'),
56-
},
57-
errorMessage: 'Date must be in the future',
58-
},
59-
}
50+
...Range,
51+
args: {
52+
label: 'Date Picker',
53+
minValue: today(getLocalTimeZone()),
54+
defaultValue: {
55+
start: parseDate('2022-02-04'),
56+
end: parseDate('2022-05-03'),
57+
},
58+
errorMessage: 'Date must be in the future',
59+
},
60+
};

packages/opub-ui/src/components/DatePicker/MonthPicker.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ export type DatePickerProps = {
2828
requiredIndicator?: boolean;
2929
/** Additional text to aide in use */
3030
helpText?: React.ReactNode;
31+
/** Default Value */
32+
defaultValue?: DateValue | null;
3133
} & (DatePickerState | AriaDatePickerProps<DateValue>);
3234

3335
const MonthPicker = React.forwardRef(

packages/opub-ui/src/components/Form/Form.module.scss

Lines changed: 0 additions & 14 deletions
This file was deleted.

packages/opub-ui/src/components/Form/Form.stories.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
DateRangePicker,
1616
DropZone,
1717
Input,
18+
MonthPicker,
1819
RadioGroup,
1920
RadioItem,
2021
RangeSlider,
@@ -75,6 +76,7 @@ const defaultValBase = {
7576
end: '2020-02-10',
7677
},
7778
time: '04:45',
79+
month: '2020-02-06',
7880
combobox: 'Apple',
7981
comboboxMulti: [
8082
{
@@ -171,8 +173,8 @@ export const FormBase = ({ ...args }) => {
171173
<FormLayout.Group>
172174
<DateField name="date" label="Choose Date" />
173175
<DatePicker name="date-picker" label="Choose Birthday" />
174-
175176
<TimeField name="time" label="Choose Time" />
177+
<MonthPicker name="month" label="Choose Month" />
176178
</FormLayout.Group>
177179
<DateRangePicker name="date-range" label="Choose Range" />
178180
<FormLayout.Group>

packages/opub-ui/src/components/Form/components/DatePicker.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
'use client';
22

3+
import { parseDate } from '@internationalized/date';
4+
import { DateValue } from '@react-types/datepicker';
5+
import { RangeValue } from '@react-types/shared';
6+
import { Controller, useFormContext } from 'react-hook-form';
7+
38
import {
49
DatePicker as DatePickerBase,
510
DatePickerProps,
611
DateRangePicker as DateRangePickerBase,
712
RangePickerProps,
813
} from '../../DatePicker';
9-
import { parseDate } from '@internationalized/date';
10-
import { DateValue } from '@react-types/datepicker';
11-
import { RangeValue } from '@react-types/shared';
12-
import { Controller, useFormContext } from 'react-hook-form';
1314

1415
type PickerProps = {
1516
name: string;
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
'use client';
2+
3+
import { parseDate } from '@internationalized/date';
4+
import { DateValue } from '@react-types/datepicker';
5+
import { Controller, useFormContext } from 'react-hook-form';
6+
7+
import {
8+
MonthPicker as MonthBase,
9+
type DatePickerProps,
10+
} from '../../DatePicker/MonthPicker';
11+
12+
type FieldProps = {
13+
name: string;
14+
onChange?: (val: any, name: string) => void;
15+
defaultValue?: DateValue;
16+
required?: boolean;
17+
} & DatePickerProps;
18+
19+
const MonthPicker = ({ required, error, ...props }: FieldProps) => {
20+
const method = useFormContext();
21+
22+
if (method) {
23+
return (
24+
<Controller
25+
{...props}
26+
control={method.control}
27+
rules={{ required: required }}
28+
render={({ field }) => (
29+
<MonthBase
30+
{...field}
31+
{...props}
32+
value={
33+
(field.value && parseDate(field.value)) ||
34+
props.value ||
35+
props.defaultValue
36+
}
37+
onChange={(val) => {
38+
if (val) {
39+
props.onChange && props.onChange(val.toString(), props.name);
40+
field.onChange(val.toString());
41+
}
42+
}}
43+
/>
44+
)}
45+
/>
46+
);
47+
}
48+
49+
return <MonthBase {...props} />;
50+
};
51+
52+
export { MonthPicker };
Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
export { Checkbox, CheckboxGroup } from "./Checkbox";
2-
export { Combobox } from "./Combobox";
3-
export { DateField } from "./DateField";
4-
export { DatePicker, DateRangePicker } from "./DatePicker";
5-
export { DropZone } from "./DropZone";
6-
export { Input } from "./Input";
7-
export * from "./RadioGroup";
8-
export { RangeSlider } from "./RangeSlider";
9-
export { Select } from "./Select";
10-
export { TimeField } from "./TimeField";
1+
export { Checkbox, CheckboxGroup } from './Checkbox';
2+
export { Combobox } from './Combobox';
3+
export { DateField } from './DateField';
4+
export { DatePicker, DateRangePicker } from './DatePicker';
5+
export { DropZone } from './DropZone';
6+
export { Input } from './Input';
7+
export { MonthPicker } from './MonthPicker';
8+
export * from './RadioGroup';
9+
export { RangeSlider } from './RangeSlider';
10+
export { Select } from './Select';
11+
export { TimeField } from './TimeField';

0 commit comments

Comments
 (0)