@hyphen/hyphen-components 6.14.0 → 7.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Calendar/Calendar.d.ts +5 -0
- package/dist/components/Calendar/Calendar.stories.d.ts +12 -0
- package/dist/components/Modal/components/ModalHeader/ModalHeader.d.ts +6 -1
- package/dist/css/index.css +2 -3
- package/dist/css/utilities.css +8 -0
- package/dist/hyphen-components.cjs.development.js +633 -788
- package/dist/hyphen-components.cjs.development.js.map +1 -1
- package/dist/hyphen-components.cjs.production.min.js +1 -1
- package/dist/hyphen-components.cjs.production.min.js.map +1 -1
- package/dist/hyphen-components.esm.js +634 -787
- package/dist/hyphen-components.esm.js.map +1 -1
- package/dist/index.d.ts +1 -2
- package/package.json +2 -3
- package/src/components/Calendar/Calendar.mdx +28 -0
- package/src/components/Calendar/Calendar.stories.tsx +217 -0
- package/src/components/Calendar/Calendar.tsx +117 -0
- package/src/components/Formik/Formik.stories.tsx +10 -21
- package/src/components/Modal/Modal.stories.tsx +3 -1
- package/src/components/Modal/components/ModalHeader/ModalHeader.tsx +27 -9
- package/src/index.ts +1 -2
- package/src/styles/utilities.scss +8 -0
- package/dist/components/DateInput/DateInput.d.ts +0 -57
- package/dist/components/DateInput/DateInput.stories.d.ts +0 -11
- package/dist/components/DatePicker/DatePicker.d.ts +0 -86
- package/dist/components/DatePicker/DatePicker.stories.d.ts +0 -13
- package/src/components/DateInput/DateInput.mdx +0 -61
- package/src/components/DateInput/DateInput.stories.tsx +0 -168
- package/src/components/DateInput/DateInput.test.tsx +0 -176
- package/src/components/DateInput/DateInput.tsx +0 -212
- package/src/components/DatePicker/DatePicker.mdx +0 -52
- package/src/components/DatePicker/DatePicker.module.scss +0 -603
- package/src/components/DatePicker/DatePicker.stories.tsx +0 -199
- package/src/components/DatePicker/DatePicker.test.tsx +0 -26
- package/src/components/DatePicker/DatePicker.tsx +0 -138
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
import React, { FC, useState } from 'react';
|
|
2
|
-
import format from 'date-fns/format';
|
|
3
|
-
import { DatePicker, DatePickerProps } from '../DatePicker/DatePicker';
|
|
4
|
-
import { TextInput, TextInputProps } from '../TextInput/TextInput';
|
|
5
|
-
import {
|
|
6
|
-
Popover,
|
|
7
|
-
PopoverContent,
|
|
8
|
-
PopoverPortal,
|
|
9
|
-
PopoverTrigger,
|
|
10
|
-
} from '../Popover/Popover';
|
|
11
|
-
import { useOpenClose } from '../../hooks';
|
|
12
|
-
|
|
13
|
-
export interface DateInputProps {
|
|
14
|
-
/**
|
|
15
|
-
* Props object for DatePicker component.
|
|
16
|
-
*/
|
|
17
|
-
datePickerProps: DatePickerProps;
|
|
18
|
-
/**
|
|
19
|
-
* Props object for TextInput component.
|
|
20
|
-
*/
|
|
21
|
-
textInputProps: Omit<TextInputProps, 'onChange'>;
|
|
22
|
-
/**
|
|
23
|
-
* Format for final date to be displayed.
|
|
24
|
-
* Relies on date-fns/format --> https://date-fns.org/v1.9.0/docs/format
|
|
25
|
-
*/
|
|
26
|
-
dateFormat?: string;
|
|
27
|
-
/**
|
|
28
|
-
* Additional settings for formatting date.
|
|
29
|
-
*/
|
|
30
|
-
dateOptions?: {
|
|
31
|
-
/**
|
|
32
|
-
* The user's locale.
|
|
33
|
-
*/
|
|
34
|
-
locale?: globalThis.Locale | undefined;
|
|
35
|
-
/**
|
|
36
|
-
* Start of week.
|
|
37
|
-
*/
|
|
38
|
-
weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | undefined;
|
|
39
|
-
/**
|
|
40
|
-
* Should determine which week is week 1 of a new year.
|
|
41
|
-
*/
|
|
42
|
-
firstWeekContainsDate?: number | undefined;
|
|
43
|
-
/**
|
|
44
|
-
* Whether to accept unicode tokens in format.
|
|
45
|
-
* See here --> https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md
|
|
46
|
-
*/
|
|
47
|
-
useAdditionalWeekYearTokens?: boolean | undefined;
|
|
48
|
-
/**
|
|
49
|
-
* Whether to accept unicode tokens in format.
|
|
50
|
-
* See here --> https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md
|
|
51
|
-
*/
|
|
52
|
-
useAdditionalDayOfYearTokens?: boolean | undefined;
|
|
53
|
-
};
|
|
54
|
-
/**
|
|
55
|
-
* Props to pass down to the Popover component.
|
|
56
|
-
*/
|
|
57
|
-
popoverProps?: {
|
|
58
|
-
side: 'top' | 'bottom' | 'left' | 'right';
|
|
59
|
-
align: 'start' | 'center' | 'end';
|
|
60
|
-
};
|
|
61
|
-
/**
|
|
62
|
-
* Additional props to be spread to the `TextInput` element.
|
|
63
|
-
*/
|
|
64
|
-
[x: string]: any; // eslint-disable-line
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
const defaultDatePickerProps: Omit<DatePickerProps, 'onChange'> = {
|
|
68
|
-
selected: null,
|
|
69
|
-
selectsRange: false,
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
const defaultPopoverProps = {
|
|
73
|
-
align: 'start',
|
|
74
|
-
side: 'bottom',
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
const defaultTextInputProps: Omit<TextInputProps, 'id'> = {
|
|
78
|
-
label: 'Select Date',
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
export const DateInput: FC<DateInputProps> = ({
|
|
82
|
-
datePickerProps,
|
|
83
|
-
textInputProps,
|
|
84
|
-
dateFormat = 'MM/dd/yyyy',
|
|
85
|
-
dateOptions = undefined,
|
|
86
|
-
popoverProps = { ...defaultPopoverProps },
|
|
87
|
-
}) => {
|
|
88
|
-
const { isOpen, handleClose, handleOpen } = useOpenClose();
|
|
89
|
-
|
|
90
|
-
// Internal state for selected date if not controlled
|
|
91
|
-
const isControlled = datePickerProps.selected !== undefined;
|
|
92
|
-
const [internalSelected, setInternalSelected] = useState<Date | null>(
|
|
93
|
-
Array.isArray(datePickerProps.selected)
|
|
94
|
-
? datePickerProps.selected[0] ?? null
|
|
95
|
-
: datePickerProps.selected ?? null
|
|
96
|
-
);
|
|
97
|
-
|
|
98
|
-
// Use controlled or internal state
|
|
99
|
-
const selectedDate = isControlled
|
|
100
|
-
? datePickerProps.selected
|
|
101
|
-
: internalSelected;
|
|
102
|
-
|
|
103
|
-
const mergedDatePickerProps = {
|
|
104
|
-
...defaultDatePickerProps,
|
|
105
|
-
...datePickerProps,
|
|
106
|
-
selected: selectedDate,
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
const mergedPopoverProps = {
|
|
110
|
-
...defaultPopoverProps,
|
|
111
|
-
...popoverProps,
|
|
112
|
-
side: (popoverProps?.side ?? defaultPopoverProps.side) as
|
|
113
|
-
| 'top'
|
|
114
|
-
| 'bottom'
|
|
115
|
-
| 'left'
|
|
116
|
-
| 'right',
|
|
117
|
-
align: (popoverProps?.align ?? defaultPopoverProps.align) as
|
|
118
|
-
| 'start'
|
|
119
|
-
| 'center'
|
|
120
|
-
| 'end',
|
|
121
|
-
onInteractOutside: handleClose,
|
|
122
|
-
};
|
|
123
|
-
|
|
124
|
-
const mergedTextInputProps = {
|
|
125
|
-
...defaultTextInputProps,
|
|
126
|
-
...textInputProps,
|
|
127
|
-
};
|
|
128
|
-
|
|
129
|
-
const getTextInputValue = () => {
|
|
130
|
-
const { selectsRange, startDate, endDate, selected } =
|
|
131
|
-
mergedDatePickerProps;
|
|
132
|
-
// If selectsRange and selected is an array, use it for start/end
|
|
133
|
-
let rangeStart = startDate;
|
|
134
|
-
let rangeEnd = endDate;
|
|
135
|
-
if (selectsRange && Array.isArray(selected)) {
|
|
136
|
-
rangeStart = selected[0] ?? null;
|
|
137
|
-
rangeEnd = selected[1] ?? null;
|
|
138
|
-
}
|
|
139
|
-
const formattedStartDate = rangeStart
|
|
140
|
-
? format(rangeStart, dateFormat, dateOptions)
|
|
141
|
-
: '';
|
|
142
|
-
const formattedEndDate = rangeEnd
|
|
143
|
-
? format(rangeEnd, dateFormat, dateOptions)
|
|
144
|
-
: '';
|
|
145
|
-
const formattedSelectedDate =
|
|
146
|
-
selected && !selectsRange && !Array.isArray(selected)
|
|
147
|
-
? format(selected, dateFormat, dateOptions)
|
|
148
|
-
: '';
|
|
149
|
-
if (selectsRange) {
|
|
150
|
-
return `${formattedStartDate}${
|
|
151
|
-
formattedStartDate || formattedEndDate ? ' - ' : ''
|
|
152
|
-
}${formattedEndDate}`;
|
|
153
|
-
}
|
|
154
|
-
return formattedSelectedDate;
|
|
155
|
-
};
|
|
156
|
-
|
|
157
|
-
const handleDatePickerChange = (
|
|
158
|
-
date: Date | [Date, Date] | null,
|
|
159
|
-
event?: React.SyntheticEvent<any, Event>
|
|
160
|
-
) => {
|
|
161
|
-
if (datePickerProps.onChange) {
|
|
162
|
-
datePickerProps.onChange(date, event);
|
|
163
|
-
}
|
|
164
|
-
if (!isControlled) {
|
|
165
|
-
// If not controlled, update internal state
|
|
166
|
-
if (Array.isArray(date)) {
|
|
167
|
-
setInternalSelected(date[0] ?? null);
|
|
168
|
-
} else {
|
|
169
|
-
setInternalSelected(date);
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
// Close popover when a date is selected (single) or when end date is selected (range)
|
|
173
|
-
if (mergedDatePickerProps.selectsRange) {
|
|
174
|
-
if (Array.isArray(date) && date[0] && date[1]) {
|
|
175
|
-
handleClose();
|
|
176
|
-
}
|
|
177
|
-
} else if (date) {
|
|
178
|
-
handleClose();
|
|
179
|
-
}
|
|
180
|
-
};
|
|
181
|
-
|
|
182
|
-
return (
|
|
183
|
-
<Popover open={isOpen}>
|
|
184
|
-
<PopoverTrigger asChild>
|
|
185
|
-
<TextInput
|
|
186
|
-
id={mergedTextInputProps.id}
|
|
187
|
-
name={mergedTextInputProps.name}
|
|
188
|
-
label={mergedTextInputProps.label}
|
|
189
|
-
value={getTextInputValue()}
|
|
190
|
-
readOnly
|
|
191
|
-
onClick={handleOpen}
|
|
192
|
-
inputProps={{ className: 'text-align-left' }}
|
|
193
|
-
type="text"
|
|
194
|
-
onChange={() =>
|
|
195
|
-
null
|
|
196
|
-
} /* Empty function since we hijack the onChange event */
|
|
197
|
-
{...mergedTextInputProps}
|
|
198
|
-
/>
|
|
199
|
-
</PopoverTrigger>
|
|
200
|
-
<PopoverPortal>
|
|
201
|
-
<PopoverContent {...mergedPopoverProps}>
|
|
202
|
-
<DatePicker
|
|
203
|
-
{...mergedDatePickerProps}
|
|
204
|
-
onChange={handleDatePickerChange}
|
|
205
|
-
selected={selectedDate}
|
|
206
|
-
selectsRange={mergedDatePickerProps.selectsRange}
|
|
207
|
-
/>
|
|
208
|
-
</PopoverContent>
|
|
209
|
-
</PopoverPortal>
|
|
210
|
-
</Popover>
|
|
211
|
-
);
|
|
212
|
-
};
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { Canvas, Meta, ArgTypes } from '@storybook/addon-docs/blocks';
|
|
2
|
-
import { DatePicker } from './DatePicker';
|
|
3
|
-
import * as Stories from './DatePicker.stories';
|
|
4
|
-
|
|
5
|
-
<Meta of={Stories} />
|
|
6
|
-
|
|
7
|
-
# DatePicker
|
|
8
|
-
|
|
9
|
-
The Datepicker lets users select a date by showing them a calendar.
|
|
10
|
-
|
|
11
|
-
It is also used in combination with an input and popover by the [DateInput component](/?path=/docs/components-dateinput-overview--basic-usage).
|
|
12
|
-
|
|
13
|
-
### It can be used for:
|
|
14
|
-
|
|
15
|
-
- selecting a single date
|
|
16
|
-
- selecting a start and end date
|
|
17
|
-
|
|
18
|
-
## Props
|
|
19
|
-
|
|
20
|
-
<ArgTypes of={DatePicker} />
|
|
21
|
-
|
|
22
|
-
## Basic Example
|
|
23
|
-
|
|
24
|
-
<Canvas of={Stories.BasicExample} />
|
|
25
|
-
|
|
26
|
-
## Date Range
|
|
27
|
-
|
|
28
|
-
<Canvas of={Stories.DateRange} />
|
|
29
|
-
|
|
30
|
-
## Min/Max Dates
|
|
31
|
-
|
|
32
|
-
<Canvas of={Stories.MinAndMaxDates} />
|
|
33
|
-
|
|
34
|
-
## Month Picker
|
|
35
|
-
|
|
36
|
-
<Canvas of={Stories.MonthPicker} />
|
|
37
|
-
|
|
38
|
-
## Show Multiple Months
|
|
39
|
-
|
|
40
|
-
<Canvas of={Stories.ShowMultipleMonths} />
|
|
41
|
-
|
|
42
|
-
## With Time Picker
|
|
43
|
-
|
|
44
|
-
<Canvas of={Stories.WithTimePicker} />
|
|
45
|
-
|
|
46
|
-
## Open by default on a specific date
|
|
47
|
-
|
|
48
|
-
<Canvas of={Stories.OpenByDefaultOnASpecificDate} />
|
|
49
|
-
|
|
50
|
-
## With Children
|
|
51
|
-
|
|
52
|
-
<Canvas of={Stories.WithChildren} />
|