@superdispatch/dates 0.21.13 → 0.21.14

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.
Files changed (62) hide show
  1. package/LICENSE +21 -0
  2. package/package.json +13 -39
  3. package/.babelrc.js +0 -5
  4. package/.turbo/turbo-version.log +0 -26
  5. package/pkg/README.md +0 -10
  6. package/pkg/package.json +0 -32
  7. package/playroom.ts +0 -10
  8. package/src/__tests__/index.spec.ts +0 -48
  9. package/src/base-date-picker/BaseDatePicker.tsx +0 -145
  10. package/src/calendar/Calendar.playroom.tsx +0 -28
  11. package/src/calendar/Calendar.spec.tsx +0 -531
  12. package/src/calendar/Calendar.stories.tsx +0 -50
  13. package/src/calendar/Calendar.tsx +0 -534
  14. package/src/calendar/CalendarQuickSelection.tsx +0 -34
  15. package/src/calendar/InternalCalendarComponents.tsx +0 -79
  16. package/src/date-config/DateConfig.spec.tsx +0 -23
  17. package/src/date-config/DateConfig.tsx +0 -60
  18. package/src/date-field/DateField.playroom.tsx +0 -21
  19. package/src/date-field/DateField.spec.tsx +0 -350
  20. package/src/date-field/DateField.stories.tsx +0 -47
  21. package/src/date-field/DateField.tsx +0 -155
  22. package/src/date-range-field/DateRangeField.playroom.tsx +0 -24
  23. package/src/date-range-field/DateRangeField.spec.tsx +0 -318
  24. package/src/date-range-field/DateRangeField.stories.tsx +0 -51
  25. package/src/date-range-field/DateRangeField.tsx +0 -277
  26. package/src/date-time-utils/DateTimeUtils.spec.ts +0 -652
  27. package/src/date-time-utils/DateTimeUtils.ts +0 -339
  28. package/src/date-utils/DateUtils.spec.ts +0 -234
  29. package/src/date-utils/DateUtils.ts +0 -333
  30. package/src/formatted-date/FormattedDate.spec.tsx +0 -103
  31. package/src/formatted-date/FormattedDate.ts +0 -42
  32. package/src/formatted-relative-time/FormattedRelativeTime.spec.tsx +0 -93
  33. package/src/formatted-relative-time/FormattedRelativeTime.ts +0 -60
  34. package/src/index.ts +0 -12
  35. package/src/time-field/TimeField.playroom.tsx +0 -21
  36. package/src/time-field/TimeField.stories.tsx +0 -35
  37. package/src/time-field/TimeField.tsx +0 -221
  38. package/src/use-date-time/useDateTime.spec.ts +0 -45
  39. package/src/use-date-time/useDateTime.ts +0 -31
  40. package/src/use-date-time-range/useDateTimeRange.spec.ts +0 -53
  41. package/src/use-date-time-range/useDateTimeRange.ts +0 -24
  42. package/tsconfig.json +0 -19
  43. /package/{pkg/dist-node → dist-node}/index.js +0 -0
  44. /package/{pkg/dist-node → dist-node}/index.js.map +0 -0
  45. /package/{pkg/dist-src → dist-src}/base-date-picker/BaseDatePicker.js +0 -0
  46. /package/{pkg/dist-src → dist-src}/calendar/Calendar.js +0 -0
  47. /package/{pkg/dist-src → dist-src}/calendar/CalendarQuickSelection.js +0 -0
  48. /package/{pkg/dist-src → dist-src}/calendar/InternalCalendarComponents.js +0 -0
  49. /package/{pkg/dist-src → dist-src}/date-config/DateConfig.js +0 -0
  50. /package/{pkg/dist-src → dist-src}/date-field/DateField.js +0 -0
  51. /package/{pkg/dist-src → dist-src}/date-range-field/DateRangeField.js +0 -0
  52. /package/{pkg/dist-src → dist-src}/date-time-utils/DateTimeUtils.js +0 -0
  53. /package/{pkg/dist-src → dist-src}/date-utils/DateUtils.js +0 -0
  54. /package/{pkg/dist-src → dist-src}/formatted-date/FormattedDate.js +0 -0
  55. /package/{pkg/dist-src → dist-src}/formatted-relative-time/FormattedRelativeTime.js +0 -0
  56. /package/{pkg/dist-src → dist-src}/index.js +0 -0
  57. /package/{pkg/dist-src → dist-src}/time-field/TimeField.js +0 -0
  58. /package/{pkg/dist-src → dist-src}/use-date-time/useDateTime.js +0 -0
  59. /package/{pkg/dist-src → dist-src}/use-date-time-range/useDateTimeRange.js +0 -0
  60. /package/{pkg/dist-types → dist-types}/index.d.ts +0 -0
  61. /package/{pkg/dist-web → dist-web}/index.js +0 -0
  62. /package/{pkg/dist-web → dist-web}/index.js.map +0 -0
@@ -1,60 +0,0 @@
1
- import { FixedOffsetZone, Settings } from 'luxon';
2
- import {
3
- createContext,
4
- ReactElement,
5
- ReactNode,
6
- useContext,
7
- useMemo,
8
- } from 'react';
9
-
10
- export function setDefaultTimeZone(offset: number | 'local'): string {
11
- if (offset === 'local') {
12
- Settings.defaultZoneName = offset;
13
- } else {
14
- const zone = FixedOffsetZone.instance(offset);
15
-
16
- if (zone.isValid) {
17
- Settings.defaultZoneName = zone.name;
18
- }
19
- }
20
-
21
- return Settings.defaultZoneName;
22
- }
23
-
24
- export function useDefaultTimeZone(offset: number | 'local'): string {
25
- return useMemo(() => setDefaultTimeZone(offset), [offset]);
26
- }
27
-
28
- export type DateFormat = 'DateISO' | 'DateTimeISO' | 'JodaISO';
29
-
30
- export interface DateConfig {
31
- readonly format: DateFormat;
32
- }
33
-
34
- export const defaultDateConfig: DateConfig = { format: 'DateTimeISO' };
35
-
36
- const Context = createContext(defaultDateConfig);
37
-
38
- export function useDateConfig(options: Partial<DateConfig> = {}): DateConfig {
39
- const config = useContext(Context);
40
- const { format = config.format } = options;
41
-
42
- return useMemo<DateConfig>(() => ({ format }), [format]);
43
- }
44
-
45
- export interface DateConfigProviderProps extends Partial<DateConfig> {
46
- children?: ReactNode;
47
- }
48
-
49
- export function DateConfigProvider({
50
- format,
51
- children,
52
- }: DateConfigProviderProps): ReactElement {
53
- const prev = useDateConfig();
54
- const ctx = useMemo(
55
- (): DateConfig => ({ format: format || prev.format }),
56
- [format, prev.format],
57
- );
58
-
59
- return <Context.Provider value={ctx}>{children}</Context.Provider>;
60
- }
@@ -1,21 +0,0 @@
1
- import { forwardRef, useState } from 'react';
2
- import { NullableDateInput } from '../date-time-utils/DateTimeUtils';
3
- import { DateField as SDDateField, DateFieldProps } from './DateField';
4
-
5
- export const DateField = forwardRef<HTMLDivElement, DateFieldProps>(
6
- ({ value, onChange, ...props }, ref) => {
7
- const [state, setState] = useState<NullableDateInput>();
8
-
9
- return (
10
- <SDDateField
11
- {...props}
12
- ref={ref}
13
- value={value || state}
14
- onChange={(date) => {
15
- onChange?.(date);
16
- setState(date.stringValue);
17
- }}
18
- />
19
- );
20
- },
21
- );
@@ -1,350 +0,0 @@
1
- import { InputAdornment } from '@material-ui/core';
2
- import { mockDate, renderComponent } from '@superdispatch/ui-testutils';
3
- import { fireEvent, screen } from '@testing-library/react';
4
- import userEvent from '@testing-library/user-event';
5
- import { DateTime } from 'luxon';
6
- import { useState } from 'react';
7
- import {
8
- DateConfigProvider,
9
- DateFormat,
10
- defaultDateConfig,
11
- } from '../date-config/DateConfig';
12
- import {
13
- DatePayload,
14
- DateString,
15
- NullableDateString,
16
- } from '../date-time-utils/DateTimeUtils';
17
- import { DateField, DateFieldProps } from './DateField';
18
-
19
- beforeEach(() => {
20
- mockDate();
21
- });
22
-
23
- function UncontrolledDateField(props: DateFieldProps) {
24
- const [info, setInfo] = useState<DatePayload>();
25
-
26
- return <DateField {...props} onChange={setInfo} value={info?.stringValue} />;
27
- }
28
-
29
- test('basic', () => {
30
- const onChange = jest.fn();
31
- renderComponent(<DateField onChange={onChange} />);
32
-
33
- expect(screen.queryByRole('grid')).toBeNull();
34
- expect(screen.getByRole('textbox')).toHaveValue('');
35
-
36
- userEvent.click(screen.getByRole('textbox'));
37
-
38
- expect(onChange).not.toHaveBeenCalled();
39
- userEvent.click(screen.getByRole('gridcell', { name: /May 24/ }));
40
- expect(onChange).toHaveBeenCalledTimes(1);
41
- expect(onChange).toHaveBeenLastCalledWith({
42
- config: defaultDateConfig,
43
- dateValue: expect.any(DateTime),
44
- stringValue: '2019-05-24T00:00:00.000-05:00',
45
- });
46
-
47
- expect(screen.queryByRole('grid')).toBeNull();
48
- expect(screen.getByRole('textbox')).toHaveValue('');
49
- });
50
-
51
- test('uncontrolled', () => {
52
- renderComponent(<UncontrolledDateField />);
53
-
54
- expect(screen.getByRole('textbox')).toHaveValue('');
55
-
56
- userEvent.click(screen.getByRole('textbox'));
57
- userEvent.click(screen.getByRole('gridcell', { name: /May 24/ }));
58
-
59
- expect(screen.getByRole('textbox')).toHaveValue('May 24, 2019');
60
- });
61
-
62
- test.each<
63
- [
64
- contextFormat: undefined | DateFormat,
65
- propsFormat: undefined | DateFormat,
66
- input: NullableDateString,
67
- inputValue: string,
68
- expectedFormat: DateFormat,
69
- expectedValue: DateString,
70
- ]
71
- >([
72
- [
73
- undefined,
74
- undefined,
75
- '2019-05-20',
76
- 'May 20, 2019',
77
- 'DateTimeISO',
78
- '2019-05-24T00:00:00.000-05:00',
79
- ],
80
-
81
- [
82
- 'JodaISO',
83
- undefined,
84
- '2019-05-20T00:00:00.000-0500',
85
- 'May 20, 2019',
86
- 'JodaISO',
87
- '2019-05-24T00:00:00.000-0500',
88
- ],
89
-
90
- ['JodaISO', 'DateISO', '2019-05-20', 'May 20, 2019', 'DateISO', '2019-05-24'],
91
- ])(
92
- 'DateConfig format={%p}: DateField format={%p} value={%p}',
93
- (
94
- contextFormat,
95
- propsFormat,
96
- input,
97
- inputValue,
98
- expectedFormat,
99
- expectedValue,
100
- ) => {
101
- const onChange = jest.fn();
102
- renderComponent(
103
- <DateConfigProvider format={contextFormat}>
104
- <DateField value={input} onChange={onChange} format={propsFormat} />
105
- </DateConfigProvider>,
106
- );
107
-
108
- expect(screen.getByRole('textbox')).toHaveValue(inputValue);
109
-
110
- userEvent.click(screen.getByRole('textbox'));
111
- userEvent.click(screen.getByRole('gridcell', { name: /May 24/ }));
112
-
113
- expect(onChange).toHaveBeenLastCalledWith({
114
- dateValue: expect.any(DateTime),
115
- stringValue: expectedValue,
116
- config: { format: expectedFormat },
117
- });
118
- },
119
- );
120
-
121
- test('close on select', () => {
122
- renderComponent(<DateField />);
123
-
124
- expect(screen.queryByRole('grid')).toBeNull();
125
-
126
- userEvent.click(screen.getByRole('textbox'));
127
- userEvent.click(screen.getByRole('gridcell', { name: /May 25/ }));
128
-
129
- expect(screen.queryByRole('grid')).toBeNull();
130
- });
131
-
132
- test('onClick', () => {
133
- let prevent = false;
134
-
135
- renderComponent(
136
- <DateField
137
- onClick={(event) => {
138
- if (prevent) event.preventDefault();
139
- }}
140
- />,
141
- );
142
-
143
- expect(screen.queryByRole('grid')).toBeNull();
144
-
145
- userEvent.click(screen.getByRole('textbox'));
146
- userEvent.click(screen.getByRole('gridcell', { name: /May 25/ }));
147
-
148
- expect(screen.queryByRole('grid')).toBeNull();
149
-
150
- prevent = true;
151
-
152
- userEvent.click(screen.getByRole('textbox'));
153
- expect(screen.queryByRole('grid')).toBeNull();
154
- });
155
-
156
- test('onKeyDown', () => {
157
- let prevent = false;
158
-
159
- renderComponent(
160
- <DateField
161
- onKeyDown={(event) => {
162
- if (prevent) event.preventDefault();
163
- }}
164
- />,
165
- );
166
-
167
- expect(screen.queryByRole('grid')).toBeNull();
168
-
169
- fireEvent.keyDown(screen.getByRole('textbox'), { key: ' ' });
170
-
171
- userEvent.click(screen.getByRole('gridcell', { name: /May 24/ }));
172
-
173
- expect(screen.queryByRole('grid')).toBeNull();
174
-
175
- fireEvent.keyDown(screen.getByRole('textbox'), { key: 'Enter' });
176
-
177
- userEvent.click(screen.getByRole('gridcell', { name: /May 25/ }));
178
-
179
- expect(screen.queryByRole('grid')).toBeNull();
180
-
181
- prevent = true;
182
-
183
- fireEvent.keyDown(screen.getByRole('textbox'), { key: ' ' });
184
-
185
- expect(screen.queryByRole('grid')).toBeNull();
186
-
187
- fireEvent.keyDown(screen.getByRole('textbox'), { key: 'Enter' });
188
-
189
- expect(screen.queryByRole('grid')).toBeNull();
190
- });
191
-
192
- test('disabled', () => {
193
- renderComponent(<DateField disabled={true} />);
194
-
195
- expect(screen.queryByRole('grid')).toBeNull();
196
-
197
- userEvent.click(screen.getByRole('textbox'));
198
-
199
- expect(screen.queryByRole('grid')).toBeNull();
200
-
201
- fireEvent.keyDown(screen.getByRole('textbox'), { key: ' ' });
202
-
203
- expect(screen.queryByRole('grid')).toBeNull();
204
-
205
- fireEvent.keyDown(screen.getByRole('textbox'), { key: 'Enter' });
206
-
207
- expect(screen.queryByRole('grid')).toBeNull();
208
- });
209
-
210
- test('disabledDays', () => {
211
- const onChange = jest.fn();
212
- const onDayClick = jest.fn();
213
-
214
- renderComponent(
215
- <DateField
216
- onChange={onChange}
217
- CalendarProps={{
218
- onDayClick,
219
- disabledDays: ({ dateValue }) => dateValue.day >= 24,
220
- }}
221
- />,
222
- );
223
-
224
- userEvent.click(screen.getByRole('textbox'));
225
-
226
- expect(onChange).not.toHaveBeenCalled();
227
- expect(onDayClick).not.toHaveBeenCalled();
228
-
229
- expect(screen.getByRole('gridcell', { name: /May 24/ })).toHaveClass(
230
- 'SD-Calendar-disabled',
231
- );
232
-
233
- userEvent.click(screen.getByRole('gridcell', { name: /May 24/ }));
234
-
235
- expect(onChange).not.toHaveBeenCalled();
236
- expect(onDayClick).toHaveBeenCalledTimes(1);
237
- });
238
-
239
- test('enableClearable', () => {
240
- const onChange = jest.fn();
241
- const view = renderComponent(<DateField enableClearable={true} />);
242
-
243
- expect(screen.queryByRole('button', { name: 'clear' })).toBeNull();
244
-
245
- view.rerender(
246
- <DateField value={Date.now()} onChange={onChange} enableClearable={true} />,
247
- );
248
-
249
- expect(onChange).not.toHaveBeenCalled();
250
-
251
- userEvent.click(screen.getByRole('button', { name: 'clear' }));
252
-
253
- expect(onChange).toHaveBeenCalledTimes(1);
254
- expect(onChange).toHaveBeenLastCalledWith({
255
- config: defaultDateConfig,
256
- stringValue: null,
257
- dateValue: expect.any(DateTime),
258
- });
259
-
260
- view.rerender(
261
- <DateField
262
- label="Custom Label"
263
- value={Date.now()}
264
- onChange={onChange}
265
- enableClearable={true}
266
- />,
267
- );
268
-
269
- expect(screen.queryByRole('button', { name: 'clear' })).toBeNull();
270
-
271
- userEvent.click(screen.getByRole('button', { name: 'clear Custom Label' }));
272
-
273
- expect(onChange).toHaveBeenCalledTimes(2);
274
- expect(onChange).toHaveBeenLastCalledWith({
275
- config: defaultDateConfig,
276
- stringValue: null,
277
- dateValue: expect.any(DateTime),
278
- });
279
- });
280
-
281
- test('disableCloseOnSelect', () => {
282
- const onChange = jest.fn();
283
- const view = renderComponent(<DateField onChange={onChange} />);
284
-
285
- expect(screen.queryByRole('grid')).toBeNull();
286
-
287
- userEvent.click(screen.getByRole('textbox'));
288
- userEvent.click(screen.getByRole('gridcell', { name: /May 24/ }));
289
-
290
- expect(screen.queryByRole('grid')).toBeNull();
291
- expect(onChange).toHaveBeenCalledTimes(1);
292
- expect(onChange).toHaveBeenLastCalledWith(
293
- expect.objectContaining({ stringValue: '2019-05-24T00:00:00.000-05:00' }),
294
- );
295
-
296
- view.rerender(<DateField onChange={onChange} disableCloseOnSelect={true} />);
297
-
298
- expect(screen.queryByRole('grid')).toBeNull();
299
-
300
- userEvent.click(screen.getByRole('textbox'));
301
- userEvent.click(screen.getByRole('gridcell', { name: /May 25/ }));
302
-
303
- expect(screen.getByRole('grid')).toBeInTheDocument();
304
- expect(onChange).toHaveBeenCalledTimes(2);
305
- expect(onChange).toHaveBeenLastCalledWith(
306
- expect.objectContaining({ stringValue: '2019-05-25T00:00:00.000-05:00' }),
307
- );
308
-
309
- userEvent.click(screen.getByRole('gridcell', { name: /May 26/ }));
310
-
311
- expect(screen.getByRole('grid')).toBeInTheDocument();
312
- expect(onChange).toHaveBeenCalledTimes(3);
313
- expect(onChange).toHaveBeenLastCalledWith(
314
- expect.objectContaining({ stringValue: '2019-05-26T00:00:00.000-05:00' }),
315
- );
316
-
317
- fireEvent.keyDown(screen.getByRole('presentation'), { key: 'Escape' });
318
-
319
- expect(screen.queryByRole('grid')).toBeNull();
320
- expect(onChange).toHaveBeenCalledTimes(3);
321
- });
322
-
323
- test('startAdornment', () => {
324
- renderComponent(
325
- <DateField
326
- InputProps={{
327
- 'aria-labelledby': 'label',
328
- startAdornment: (
329
- <InputAdornment id="label" position="start">
330
- Start Adornment
331
- </InputAdornment>
332
- ),
333
- }}
334
- />,
335
- );
336
-
337
- expect(screen.queryByRole('grid')).toBeNull();
338
-
339
- userEvent.click(screen.getByLabelText('Start Adornment'));
340
-
341
- expect(screen.getByRole('grid')).toBeInTheDocument();
342
-
343
- fireEvent.keyDown(screen.getByRole('presentation'), { key: 'Escape' });
344
-
345
- expect(screen.queryByRole('grid')).toBeNull();
346
-
347
- userEvent.click(screen.getByText('Start Adornment'));
348
-
349
- expect(screen.getByRole('grid')).toBeInTheDocument();
350
- });
@@ -1,47 +0,0 @@
1
- import { InputAdornment } from '@material-ui/core';
2
- import { Meta } from '@storybook/react';
3
- import { DateField } from './DateField.playroom';
4
-
5
- export default {
6
- title: 'Dates/DateField',
7
- component: DateField,
8
- } as Meta;
9
-
10
- export const basic = () => <DateField />;
11
-
12
- export const advanced = () => (
13
- <DateField label="Label" placeholder="Placeholder" helperText="Helper Text" />
14
- );
15
-
16
- export const errorState = () => (
17
- <DateField
18
- label="Label"
19
- error={true}
20
- placeholder="Placeholder"
21
- helperText="Error Text"
22
- />
23
- );
24
-
25
- export const adornment = () => (
26
- <DateField
27
- InputProps={{
28
- startAdornment: (
29
- <InputAdornment position="start">Start Adornment:</InputAdornment>
30
- ),
31
- }}
32
- />
33
- );
34
-
35
- export const fullWidth = () => <DateField fullWidth={true} />;
36
-
37
- export const disabled = () => <DateField disabled={true} />;
38
-
39
- export const enableClearable = () => <DateField enableClearable={true} />;
40
-
41
- export const disableCloseOnSelect = () => (
42
- <DateField disableCloseOnSelect={true} />
43
- );
44
-
45
- export const customEmptyText = () => (
46
- <DateField fallback="Never" enableClearable={true} />
47
- );
@@ -1,155 +0,0 @@
1
- import { BaseTextFieldProps, InputBaseProps } from '@material-ui/core';
2
- import { forwardRef, ReactNode, useMemo, useRef } from 'react';
3
- import {
4
- BaseDatePicker,
5
- InternalBaseDateFieldAPI,
6
- } from '../base-date-picker/BaseDatePicker';
7
- import { Calendar, CalendarProps } from '../calendar/Calendar';
8
- import { DateFormat, useDateConfig } from '../date-config/DateConfig';
9
- import {
10
- DateDisplayVariant,
11
- DatePayload,
12
- NullableDateInput,
13
- stringifyDate,
14
- toDatePayload,
15
- } from '../date-time-utils/DateTimeUtils';
16
- import { useFormattedDate } from '../formatted-date/FormattedDate';
17
- import { useDateTime } from '../use-date-time/useDateTime';
18
-
19
- export interface DateFieldAPI extends DatePayload {
20
- close: () => void;
21
- change: (value: NullableDateInput) => void;
22
- }
23
-
24
- export interface DateFieldProps
25
- extends Pick<
26
- BaseTextFieldProps,
27
- | 'disabled'
28
- | 'error'
29
- | 'fullWidth'
30
- | 'helperText'
31
- | 'id'
32
- | 'label'
33
- | 'name'
34
- | 'onClick'
35
- | 'onKeyDown'
36
- | 'placeholder'
37
- | 'required'
38
- > {
39
- format?: DateFormat;
40
- value?: NullableDateInput;
41
-
42
- onBlur?: () => void;
43
- onFocus?: () => void;
44
- onChange?: (event: DatePayload) => void;
45
-
46
- fallback?: string;
47
- variant?: DateDisplayVariant;
48
- enableClearable?: boolean;
49
- disableCloseOnSelect?: boolean;
50
- renderFooter?: (api: DateFieldAPI) => ReactNode;
51
- renderQuickSelection?: (api: DateFieldAPI) => ReactNode;
52
-
53
- InputProps?: Pick<
54
- InputBaseProps,
55
- 'aria-label' | 'aria-labelledby' | 'startAdornment'
56
- >;
57
- CalendarProps?: Omit<
58
- CalendarProps,
59
- | 'classes'
60
- | 'footer'
61
- | 'initialMonth'
62
- | 'numberOfMonths'
63
- | 'quickSelection'
64
- | 'selectedDays'
65
- >;
66
- }
67
-
68
- export const DateField = forwardRef<HTMLDivElement, DateFieldProps>(
69
- (
70
- {
71
- onBlur,
72
- onFocus,
73
- onChange,
74
- renderFooter,
75
- renderQuickSelection,
76
-
77
- value: valueProp,
78
- format: formatProp,
79
-
80
- fallback = '',
81
- variant = 'Date',
82
-
83
- enableClearable,
84
- disableCloseOnSelect,
85
-
86
- CalendarProps: { onDayClick, ...calendarProps } = {},
87
- ...textFieldProps
88
- },
89
- ref,
90
- ) => {
91
- const config = useDateConfig({ format: formatProp });
92
- const apiRef = useRef<InternalBaseDateFieldAPI>(null);
93
-
94
- const date = useDateTime(valueProp, config);
95
- const displayValue = useFormattedDate(date, {
96
- variant,
97
- fallback,
98
- ...config,
99
- });
100
- const dateString = useMemo(
101
- () => stringifyDate(date, config),
102
- [date, config],
103
- );
104
-
105
- function handleClose(): void {
106
- apiRef.current?.close();
107
- }
108
-
109
- function handleChange(nextInput: NullableDateInput): void {
110
- if (onChange) {
111
- onChange(toDatePayload(nextInput, config));
112
- }
113
-
114
- if (!disableCloseOnSelect) {
115
- handleClose();
116
- }
117
- }
118
-
119
- const api: DateFieldAPI = {
120
- config,
121
- dateValue: date,
122
- stringValue: dateString,
123
- close: handleClose,
124
- change: handleChange,
125
- };
126
-
127
- return (
128
- <BaseDatePicker
129
- {...textFieldProps}
130
- ref={ref}
131
- api={apiRef}
132
- onClose={onBlur}
133
- value={displayValue || fallback}
134
- enableClearable={enableClearable && date.isValid}
135
- onClear={() => {
136
- handleChange(undefined);
137
- }}
138
- >
139
- <Calendar
140
- {...calendarProps}
141
- initialMonth={date}
142
- footer={renderFooter?.(api)}
143
- quickSelection={renderQuickSelection?.(api)}
144
- selectedDays={({ dateValue }) => date.hasSame(dateValue, 'day')}
145
- onDayClick={(event) => {
146
- onDayClick?.(event);
147
- if (!event.disabled) {
148
- handleChange(event.dateValue);
149
- }
150
- }}
151
- />
152
- </BaseDatePicker>
153
- );
154
- },
155
- );
@@ -1,24 +0,0 @@
1
- import { forwardRef, useState } from 'react';
2
- import { DateStringRange } from '../date-time-utils/DateTimeUtils';
3
- import {
4
- DateRangeField as SDDateRangeField,
5
- DateRangeFieldProps,
6
- } from './DateRangeField';
7
-
8
- export const DateRangeField = forwardRef<HTMLDivElement, DateRangeFieldProps>(
9
- ({ value, onChange, ...props }, ref) => {
10
- const [state, setState] = useState<DateStringRange>();
11
-
12
- return (
13
- <SDDateRangeField
14
- {...props}
15
- ref={ref}
16
- value={value || state}
17
- onChange={(date) => {
18
- onChange?.(date);
19
- setState(date.stringValue);
20
- }}
21
- />
22
- );
23
- },
24
- );