@atlaskit/datetime-picker 17.5.6 → 17.6.0

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 (44) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/cjs/components/date-picker.js +1 -0
  3. package/dist/cjs/components/date-time-picker-class.js +1 -0
  4. package/dist/cjs/components/date-time-picker-fc-new.js +479 -0
  5. package/dist/cjs/components/date-time-picker-fc-old.js +370 -0
  6. package/dist/cjs/components/date-time-picker-fc.js +8 -362
  7. package/dist/cjs/components/time-picker.js +1 -1
  8. package/dist/cjs/internal/date-picker-migration.js +2 -0
  9. package/dist/cjs/internal/menu.js +1 -0
  10. package/dist/cjs/internal/parse-date.js +2 -0
  11. package/dist/cjs/internal/single-value.js +2 -1
  12. package/dist/es2019/components/date-picker.js +2 -0
  13. package/dist/es2019/components/date-time-picker-class.js +1 -0
  14. package/dist/es2019/components/date-time-picker-fc-new.js +456 -0
  15. package/dist/es2019/components/date-time-picker-fc-old.compiled.css +6 -0
  16. package/dist/es2019/components/date-time-picker-fc-old.js +336 -0
  17. package/dist/es2019/components/date-time-picker-fc.js +5 -332
  18. package/dist/es2019/components/time-picker.js +2 -0
  19. package/dist/es2019/internal/date-picker-migration.js +1 -0
  20. package/dist/es2019/internal/menu.js +2 -0
  21. package/dist/es2019/internal/parse-date.js +1 -0
  22. package/dist/es2019/internal/single-value.js +2 -1
  23. package/dist/esm/components/date-picker.js +2 -0
  24. package/dist/esm/components/date-time-picker-class.js +1 -0
  25. package/dist/esm/components/date-time-picker-fc-new.compiled.css +6 -0
  26. package/dist/esm/components/date-time-picker-fc-new.js +473 -0
  27. package/dist/esm/components/date-time-picker-fc-old.compiled.css +6 -0
  28. package/dist/esm/components/date-time-picker-fc-old.js +364 -0
  29. package/dist/esm/components/date-time-picker-fc.js +7 -360
  30. package/dist/esm/components/time-picker.js +2 -0
  31. package/dist/esm/internal/date-picker-migration.js +1 -0
  32. package/dist/esm/internal/menu.js +2 -0
  33. package/dist/esm/internal/parse-date.js +1 -0
  34. package/dist/esm/internal/single-value.js +2 -1
  35. package/dist/types/components/date-time-picker-fc-new.d.ts +6 -0
  36. package/dist/types/components/date-time-picker-fc-old.d.ts +6 -0
  37. package/dist/types/components/date-time-picker-fc.d.ts +2 -6
  38. package/dist/types-ts4.5/components/date-time-picker-fc-new.d.ts +6 -0
  39. package/dist/types-ts4.5/components/date-time-picker-fc-old.d.ts +6 -0
  40. package/dist/types-ts4.5/components/date-time-picker-fc.d.ts +2 -6
  41. package/package.json +16 -9
  42. /package/dist/cjs/components/{date-time-picker-fc.compiled.css → date-time-picker-fc-new.compiled.css} +0 -0
  43. /package/dist/{es2019/components/date-time-picker-fc.compiled.css → cjs/components/date-time-picker-fc-old.compiled.css} +0 -0
  44. /package/dist/{esm/components/date-time-picker-fc.compiled.css → es2019/components/date-time-picker-fc-new.compiled.css} +0 -0
@@ -0,0 +1,336 @@
1
+ /* date-time-picker-fc-old.tsx generated by @compiled/babel-plugin v0.39.1 */
2
+ import _extends from "@babel/runtime/helpers/extends";
3
+ import "./date-time-picker-fc-old.compiled.css";
4
+ import { ax, ix } from "@compiled/react/runtime";
5
+ /// <reference types="node" />
6
+ // for typing `process`
7
+
8
+ import React, { forwardRef, useCallback, useEffect, useState } from 'react';
9
+
10
+ // oxlint-disable-next-line @atlassian/no-restricted-imports
11
+ import { format, isValid, parseISO } from 'date-fns';
12
+ import { usePlatformLeafEventHandler } from '@atlaskit/analytics-next';
13
+ import { IconButton } from '@atlaskit/button/new';
14
+ import SelectClearIcon from '@atlaskit/icon/core/cross-circle';
15
+ import { Box, Inline } from '@atlaskit/primitives/compiled';
16
+ import { mergeStyles } from '@atlaskit/select';
17
+ import { formatDateTimeZoneIntoIso } from '../internal';
18
+ import { DateTimePickerContainer } from '../internal/date-time-picker-container';
19
+ import { convertTokens } from '../internal/parse-tokens';
20
+ import DatePicker from './date-picker';
21
+ import TimePicker from './time-picker';
22
+ const packageName = "@atlaskit/datetime-picker";
23
+ const packageVersion = "0.0.0-development";
24
+ const analyticsAttributes = {
25
+ componentName: 'dateTimePicker',
26
+ packageName,
27
+ packageVersion
28
+ };
29
+ const compiledStyles = {
30
+ datePickerContainerStyles: "_i0dl1ssb _16jlkb7n _1o9zidpf",
31
+ timePickerContainerStyles: "_i0dl1ssb _16jlkb7n",
32
+ iconContainerStyles: "_1e0c1txw _4cvr1h6o _i0dl1kw7"
33
+ };
34
+
35
+ // react-select overrides (via @atlaskit/select).
36
+ const styles = {
37
+ control: style => ({
38
+ ...style,
39
+ backgroundColor: 'transparent',
40
+ border: 2,
41
+ borderRadius: 0,
42
+ paddingLeft: 0,
43
+ ':hover': {
44
+ backgroundColor: 'transparent',
45
+ cursor: 'inherit'
46
+ }
47
+ })
48
+ };
49
+ export const datePickerDefaultAriaLabel = 'Date';
50
+ export const timePickerDefaultAriaLabel = 'Time';
51
+ const DateTimePickerOld = /*#__PURE__*/forwardRef(({
52
+ 'aria-describedby': ariaDescribedBy,
53
+ appearance = 'default',
54
+ autoFocus = false,
55
+ clearControlLabel = 'clear',
56
+ datePickerProps: datePickerPropsWithSelectProps = {},
57
+ defaultValue = '',
58
+ id = '',
59
+ innerProps = {},
60
+ isDisabled = false,
61
+ isInvalid = false,
62
+ isRequired = false,
63
+ name = '',
64
+ // These disables are here for proper typing when used as defaults. They
65
+ // should *not* use the `noop` function.
66
+ /* eslint-disable @repo/internal/react/use-noop */
67
+ onBlur = _event => {},
68
+ onChange: onChangeProp = _value => {},
69
+ onFocus = _event => {},
70
+ /* eslint-enable @repo/internal/react/use-noop */
71
+ parseValue: providedParseValue,
72
+ spacing = 'default',
73
+ locale = 'en-US',
74
+ testId,
75
+ timePickerProps: timePickerPropsWithSelectProps = {},
76
+ value: providedValue
77
+ }, _ref) => {
78
+ const [dateValue, setDateValue] = useState((datePickerPropsWithSelectProps === null || datePickerPropsWithSelectProps === void 0 ? void 0 : datePickerPropsWithSelectProps.defaultValue) || '');
79
+ const [isFocused, setIsFocused] = useState(false);
80
+ const [timeValue, setTimeValue] = useState((timePickerPropsWithSelectProps === null || timePickerPropsWithSelectProps === void 0 ? void 0 : timePickerPropsWithSelectProps.defaultValue) || '');
81
+ const [value, setValue] = useState(defaultValue || '');
82
+ const [zoneValue, setZoneValue] = useState('');
83
+ useEffect(() => {
84
+ if (providedValue !== undefined) {
85
+ setValue(providedValue);
86
+ }
87
+ }, [providedValue]);
88
+ const parseValue = useCallback((value, providedDateValue, providedTimeValue, providedZoneValue) => {
89
+ if (providedParseValue) {
90
+ const parsedFromFn = providedParseValue(value, providedDateValue, providedTimeValue, providedZoneValue);
91
+ // This handles cases found in Jira where the parse function actually does
92
+ // nothing and returns undefined. The previous `getSafeState` function
93
+ // just spread the values over the state, but if it returned `undefined`,
94
+ // it would just rely on the previous state values. Considering this is
95
+ // what is input to this function anyway, this is a safe way to handle
96
+ // this, colocate the behavior, and not rely on `getSafeState`.
97
+ return parsedFromFn || {
98
+ dateValue: providedDateValue,
99
+ timeValue: providedTimeValue,
100
+ zoneValue: providedZoneValue
101
+ };
102
+ }
103
+ const parsed = parseISO(value);
104
+ return isValid(parsed) ? {
105
+ dateValue: format(parsed, convertTokens('YYYY-MM-DD')),
106
+ timeValue: format(parsed, convertTokens('HH:mm')),
107
+ zoneValue: format(parsed, convertTokens('ZZ'))
108
+ } : {
109
+ dateValue,
110
+ timeValue,
111
+ zoneValue
112
+ };
113
+ }, [providedParseValue, dateValue, timeValue, zoneValue]);
114
+ useEffect(() => {
115
+ const parsedValues = parseValue(value, dateValue, timeValue, zoneValue);
116
+ setDateValue(parsedValues.dateValue);
117
+ setTimeValue(parsedValues.timeValue);
118
+ setZoneValue(parsedValues.zoneValue);
119
+ }, [value, dateValue, timeValue, zoneValue, parseValue]);
120
+ const onDateBlur = event => {
121
+ setIsFocused(false);
122
+ onBlur(event);
123
+ if (datePickerPropsWithSelectProps !== null && datePickerPropsWithSelectProps !== void 0 && datePickerPropsWithSelectProps.onBlur) {
124
+ datePickerPropsWithSelectProps.onBlur(event);
125
+ }
126
+ };
127
+ const onTimeBlur = event => {
128
+ setIsFocused(false);
129
+ onBlur(event);
130
+ if (timePickerPropsWithSelectProps !== null && timePickerPropsWithSelectProps !== void 0 && timePickerPropsWithSelectProps.onBlur) {
131
+ timePickerPropsWithSelectProps.onBlur(event);
132
+ }
133
+ };
134
+ const onDateFocus = event => {
135
+ setIsFocused(false);
136
+ onFocus(event);
137
+ if (datePickerPropsWithSelectProps !== null && datePickerPropsWithSelectProps !== void 0 && datePickerPropsWithSelectProps.onFocus) {
138
+ datePickerPropsWithSelectProps.onFocus(event);
139
+ }
140
+ };
141
+ const onTimeFocus = event => {
142
+ setIsFocused(false);
143
+ onFocus(event);
144
+ if (timePickerPropsWithSelectProps !== null && timePickerPropsWithSelectProps !== void 0 && timePickerPropsWithSelectProps.onFocus) {
145
+ timePickerPropsWithSelectProps.onFocus(event);
146
+ }
147
+ };
148
+ const onDateChange = dateValue => {
149
+ const parsedValues = parseValue(value, dateValue, timeValue, zoneValue);
150
+ onValueChange({
151
+ providedDateValue: dateValue,
152
+ providedTimeValue: parsedValues.timeValue,
153
+ providedZoneValue: parsedValues.zoneValue
154
+ });
155
+ if (datePickerPropsWithSelectProps !== null && datePickerPropsWithSelectProps !== void 0 && datePickerPropsWithSelectProps.onChange) {
156
+ datePickerPropsWithSelectProps.onChange(dateValue);
157
+ }
158
+ };
159
+ const onTimeChange = timeValue => {
160
+ const parsedValues = parseValue(value, dateValue, timeValue, zoneValue);
161
+ onValueChange({
162
+ providedDateValue: parsedValues.dateValue,
163
+ providedTimeValue: timeValue,
164
+ providedZoneValue: parsedValues.zoneValue
165
+ });
166
+ if (timePickerPropsWithSelectProps !== null && timePickerPropsWithSelectProps !== void 0 && timePickerPropsWithSelectProps.onChange) {
167
+ timePickerPropsWithSelectProps.onChange(timeValue);
168
+ }
169
+ };
170
+ const onClear = () => {
171
+ const parsedValues = parseValue(value, dateValue, timeValue, zoneValue);
172
+ onValueChange({
173
+ providedDateValue: '',
174
+ providedTimeValue: '',
175
+ providedZoneValue: parsedValues.zoneValue
176
+ });
177
+ if (datePickerPropsWithSelectProps !== null && datePickerPropsWithSelectProps !== void 0 && datePickerPropsWithSelectProps.onChange) {
178
+ datePickerPropsWithSelectProps.onChange('');
179
+ }
180
+ if (timePickerPropsWithSelectProps !== null && timePickerPropsWithSelectProps !== void 0 && timePickerPropsWithSelectProps.onChange) {
181
+ timePickerPropsWithSelectProps.onChange('');
182
+ }
183
+ };
184
+ const onChangePropWithAnalytics = usePlatformLeafEventHandler({
185
+ fn: onChangeProp,
186
+ action: 'selectedDate',
187
+ actionSubject: 'datePicker',
188
+ ...analyticsAttributes
189
+ });
190
+ const onValueChange = ({
191
+ providedDateValue,
192
+ providedTimeValue,
193
+ providedZoneValue
194
+ }) => {
195
+ setDateValue(providedDateValue);
196
+ setTimeValue(providedTimeValue);
197
+ setZoneValue(providedZoneValue);
198
+ if (providedDateValue && providedTimeValue) {
199
+ const value = formatDateTimeZoneIntoIso(providedDateValue, providedTimeValue, providedZoneValue);
200
+ const {
201
+ zoneValue: parsedZone
202
+ } = parseValue(value, providedDateValue, providedTimeValue, providedZoneValue);
203
+ const valueWithValidZone = formatDateTimeZoneIntoIso(providedDateValue, providedTimeValue, parsedZone);
204
+ setValue(valueWithValidZone);
205
+ onChangePropWithAnalytics(valueWithValidZone);
206
+ // If the date or time value was cleared when there is an existing datetime value, then clear the value.
207
+ } else if (value) {
208
+ setValue('');
209
+ onChangePropWithAnalytics('');
210
+ }
211
+ };
212
+ const {
213
+ selectProps: datePickerSelectProps,
214
+ ...datePickerProps
215
+ } = datePickerPropsWithSelectProps;
216
+ const datePickerAriaDescribedBy = datePickerProps['aria-describedby'] || ariaDescribedBy;
217
+ const datePickerLabel = datePickerProps.label || datePickerDefaultAriaLabel;
218
+ const mergedDatePickerSelectProps = {
219
+ ...datePickerSelectProps,
220
+ styles: mergeStyles(styles, datePickerSelectProps === null || datePickerSelectProps === void 0 ? void 0 : datePickerSelectProps.styles)
221
+ };
222
+ const {
223
+ selectProps: timePickerSelectProps,
224
+ ...timePickerProps
225
+ } = timePickerPropsWithSelectProps;
226
+ const timePickerAriaDescribedBy = timePickerProps['aria-describedby'] || ariaDescribedBy;
227
+ const timePickerLabel = timePickerProps.label || timePickerDefaultAriaLabel;
228
+ const mergedTimePickerSelectProps = {
229
+ ...timePickerSelectProps,
230
+ styles: mergeStyles(styles, timePickerSelectProps === null || timePickerSelectProps === void 0 ? void 0 : timePickerSelectProps.styles)
231
+ };
232
+
233
+ // Render DateTimePicker's IconContainer when a value has been filled
234
+ // Don't use Date or TimePicker's because they can't be customised
235
+ const isClearable = Boolean(dateValue || timeValue);
236
+ return /*#__PURE__*/React.createElement(DateTimePickerContainer, {
237
+ appearance: appearance,
238
+ isDisabled: isDisabled,
239
+ isFocused: isFocused,
240
+ isInvalid: isInvalid,
241
+ testId: testId,
242
+ innerProps: innerProps
243
+ }, /*#__PURE__*/React.createElement("input", {
244
+ name: name,
245
+ type: "hidden",
246
+ value: value,
247
+ "data-testid": testId && `${testId}--input`
248
+ }), /*#__PURE__*/React.createElement(Box, {
249
+ xcss: compiledStyles.datePickerContainerStyles
250
+ }, /*#__PURE__*/React.createElement(DatePicker, {
251
+ appearance: appearance,
252
+ "aria-describedby": datePickerAriaDescribedBy,
253
+ autoFocus: datePickerProps.autoFocus || autoFocus,
254
+ dateFormat: datePickerProps.dateFormat,
255
+ defaultIsOpen: datePickerProps.defaultIsOpen,
256
+ defaultValue: datePickerProps.defaultValue,
257
+ disabled: datePickerProps.disabled,
258
+ disabledDateFilter: datePickerProps.disabledDateFilter,
259
+ formatDisplayLabel: datePickerProps.formatDisplayLabel,
260
+ hideIcon: datePickerProps.hideIcon || true,
261
+ icon: datePickerProps.icon,
262
+ id: datePickerProps.id || id,
263
+ innerProps: datePickerProps.innerProps,
264
+ inputLabel: datePickerProps.inputLabel,
265
+ inputLabelId: datePickerProps.inputLabelId,
266
+ isDisabled: datePickerProps.isDisabled || isDisabled,
267
+ isInvalid: datePickerProps.isInvalid || isInvalid,
268
+ isOpen: datePickerProps.isOpen,
269
+ isRequired: datePickerProps.isRequired || isRequired,
270
+ label: datePickerLabel,
271
+ locale: datePickerProps.locale || locale,
272
+ maxDate: datePickerProps.maxDate,
273
+ minDate: datePickerProps.minDate,
274
+ name: datePickerProps.name,
275
+ nextMonthLabel: datePickerProps.nextMonthLabel,
276
+ onBlur: onDateBlur,
277
+ onChange: onDateChange,
278
+ onFocus: onDateFocus,
279
+ openCalendarLabel: datePickerProps.openCalendarLabel,
280
+ parseInputValue: datePickerProps.parseInputValue,
281
+ placeholder: datePickerProps.placeholder,
282
+ previousMonthLabel: datePickerProps.previousMonthLabel,
283
+ selectProps: mergedDatePickerSelectProps,
284
+ shouldShowCalendarButton: datePickerProps.shouldShowCalendarButton,
285
+ spacing: datePickerProps.spacing || spacing,
286
+ testId: testId && `${testId}--datepicker` || datePickerProps.testId,
287
+ value: dateValue,
288
+ weekStartDay: datePickerProps.weekStartDay
289
+ })), /*#__PURE__*/React.createElement(Box, {
290
+ xcss: compiledStyles.timePickerContainerStyles
291
+ }, /*#__PURE__*/React.createElement(TimePicker, {
292
+ appearance: timePickerProps.appearance || appearance,
293
+ "aria-describedby": timePickerAriaDescribedBy,
294
+ autoFocus: timePickerProps.autoFocus,
295
+ defaultIsOpen: timePickerProps.defaultIsOpen,
296
+ defaultValue: timePickerProps.defaultValue,
297
+ formatDisplayLabel: timePickerProps.formatDisplayLabel,
298
+ hideIcon: timePickerProps.hideIcon || true,
299
+ id: timePickerProps.id,
300
+ innerProps: timePickerProps.innerProps,
301
+ isDisabled: timePickerProps.isDisabled || isDisabled,
302
+ isInvalid: timePickerProps.isInvalid || isInvalid,
303
+ isOpen: timePickerProps.isOpen,
304
+ isRequired: timePickerProps.isRequired || isRequired,
305
+ label: timePickerLabel,
306
+ locale: timePickerProps.locale || locale,
307
+ name: timePickerProps.name,
308
+ onBlur: onTimeBlur,
309
+ onChange: onTimeChange,
310
+ onFocus: onTimeFocus,
311
+ parseInputValue: timePickerProps.parseInputValue,
312
+ placeholder: timePickerProps.placeholder,
313
+ selectProps: mergedTimePickerSelectProps,
314
+ spacing: timePickerProps.spacing || spacing,
315
+ testId: timePickerProps.testId || testId && `${testId}--timepicker`,
316
+ timeFormat: timePickerProps.timeFormat,
317
+ timeIsEditable: timePickerProps.timeIsEditable,
318
+ times: timePickerProps.times,
319
+ value: timeValue
320
+ })), isClearable && !isDisabled ? /*#__PURE__*/React.createElement(Inline, {
321
+ xcss: compiledStyles.iconContainerStyles
322
+ }, /*#__PURE__*/React.createElement(IconButton, {
323
+ appearance: "subtle",
324
+ label: clearControlLabel,
325
+ icon: iconProps => /*#__PURE__*/React.createElement(SelectClearIcon, _extends({}, iconProps, {
326
+ color: "var(--ds-text-subtlest, #6B6E76)",
327
+ size: "small"
328
+ })),
329
+ onClick: onClear,
330
+ testId: testId && `${testId}--icon--container`,
331
+ tabIndex: -1
332
+ })) : null);
333
+ });
334
+
335
+ // eslint-disable-next-line @repo/internal/react/require-jsdoc
336
+ export default DateTimePickerOld;
@@ -1,51 +1,7 @@
1
- /* date-time-picker-fc.tsx generated by @compiled/babel-plugin v0.39.1 */
2
- import _extends from "@babel/runtime/helpers/extends";
3
- import "./date-time-picker-fc.compiled.css";
4
- import { ax, ix } from "@compiled/react/runtime";
5
- /// <reference types="node" />
6
- // for typing `process`
7
-
8
- import React, { forwardRef, useCallback, useEffect, useState } from 'react';
9
- import { format, isValid, parseISO } from 'date-fns';
10
- import { usePlatformLeafEventHandler } from '@atlaskit/analytics-next';
11
- import { IconButton } from '@atlaskit/button/new';
12
- import SelectClearIcon from '@atlaskit/icon/core/cross-circle';
13
- import { Box, Inline } from '@atlaskit/primitives/compiled';
14
- import { mergeStyles } from '@atlaskit/select';
15
- import { formatDateTimeZoneIntoIso } from '../internal';
16
- import { DateTimePickerContainer } from '../internal/date-time-picker-container';
17
- import { convertTokens } from '../internal/parse-tokens';
18
- import DatePicker from './date-picker';
19
- import TimePicker from './time-picker';
20
- const packageName = "@atlaskit/datetime-picker";
21
- const packageVersion = "0.0.0-development";
22
- const analyticsAttributes = {
23
- componentName: 'dateTimePicker',
24
- packageName,
25
- packageVersion
26
- };
27
- const compiledStyles = {
28
- datePickerContainerStyles: "_i0dl1ssb _16jlkb7n _1o9zidpf",
29
- timePickerContainerStyles: "_i0dl1ssb _16jlkb7n",
30
- iconContainerStyles: "_1e0c1txw _4cvr1h6o _i0dl1kw7"
31
- };
32
-
33
- // react-select overrides (via @atlaskit/select).
34
- const styles = {
35
- control: style => ({
36
- ...style,
37
- backgroundColor: 'transparent',
38
- border: 2,
39
- borderRadius: 0,
40
- paddingLeft: 0,
41
- ':hover': {
42
- backgroundColor: 'transparent',
43
- cursor: 'inherit'
44
- }
45
- })
46
- };
47
- export const datePickerDefaultAriaLabel = 'Date';
48
- export const timePickerDefaultAriaLabel = 'Time';
1
+ import { fg } from '@atlaskit/platform-feature-flags';
2
+ import { componentWithCondition } from '../internal/ff-component';
3
+ import DateTimePickerNew from './date-time-picker-fc-new';
4
+ import DateTimePickerOld from './date-time-picker-fc-old';
49
5
 
50
6
  /**
51
7
  * __Date time picker__
@@ -56,287 +12,4 @@ export const timePickerDefaultAriaLabel = 'Time';
56
12
  * - [Code](https://atlassian.design/components/datetime-picker/code)
57
13
  * - [Usage](https://atlassian.design/components/datetime-picker/usage)
58
14
  */
59
- const DateTimePicker = /*#__PURE__*/forwardRef(({
60
- 'aria-describedby': ariaDescribedBy,
61
- appearance = 'default',
62
- autoFocus = false,
63
- clearControlLabel = 'clear',
64
- datePickerProps: datePickerPropsWithSelectProps = {},
65
- defaultValue = '',
66
- id = '',
67
- innerProps = {},
68
- isDisabled = false,
69
- isInvalid = false,
70
- isRequired = false,
71
- name = '',
72
- // These disables are here for proper typing when used as defaults. They
73
- // should *not* use the `noop` function.
74
- /* eslint-disable @repo/internal/react/use-noop */
75
- onBlur = _event => {},
76
- onChange: onChangeProp = _value => {},
77
- onFocus = _event => {},
78
- /* eslint-enable @repo/internal/react/use-noop */
79
- parseValue: providedParseValue,
80
- spacing = 'default',
81
- locale = 'en-US',
82
- testId,
83
- timePickerProps: timePickerPropsWithSelectProps = {},
84
- value: providedValue
85
- }, _ref) => {
86
- const [dateValue, setDateValue] = useState((datePickerPropsWithSelectProps === null || datePickerPropsWithSelectProps === void 0 ? void 0 : datePickerPropsWithSelectProps.defaultValue) || '');
87
- const [isFocused, setIsFocused] = useState(false);
88
- const [timeValue, setTimeValue] = useState((timePickerPropsWithSelectProps === null || timePickerPropsWithSelectProps === void 0 ? void 0 : timePickerPropsWithSelectProps.defaultValue) || '');
89
- const [value, setValue] = useState(defaultValue || '');
90
- const [zoneValue, setZoneValue] = useState('');
91
- useEffect(() => {
92
- if (providedValue !== undefined) {
93
- setValue(providedValue);
94
- }
95
- }, [providedValue]);
96
- const parseValue = useCallback((value, providedDateValue, providedTimeValue, providedZoneValue) => {
97
- if (providedParseValue) {
98
- const parsedFromFn = providedParseValue(value, providedDateValue, providedTimeValue, providedZoneValue);
99
- // This handles cases found in Jira where the parse function actually does
100
- // nothing and returns undefined. The previous `getSafeState` function
101
- // just spread the values over the state, but if it returned `undefined`,
102
- // it would just rely on the previous state values. Considering this is
103
- // what is input to this function anyway, this is a safe way to handle
104
- // this, colocate the behavior, and not rely on `getSafeState`.
105
- return parsedFromFn || {
106
- dateValue: providedDateValue,
107
- timeValue: providedTimeValue,
108
- zoneValue: providedZoneValue
109
- };
110
- }
111
- const parsed = parseISO(value);
112
- return isValid(parsed) ? {
113
- dateValue: format(parsed, convertTokens('YYYY-MM-DD')),
114
- timeValue: format(parsed, convertTokens('HH:mm')),
115
- zoneValue: format(parsed, convertTokens('ZZ'))
116
- } : {
117
- dateValue,
118
- timeValue,
119
- zoneValue
120
- };
121
- }, [providedParseValue, dateValue, timeValue, zoneValue]);
122
- useEffect(() => {
123
- const parsedValues = parseValue(value, dateValue, timeValue, zoneValue);
124
- setDateValue(parsedValues.dateValue);
125
- setTimeValue(parsedValues.timeValue);
126
- setZoneValue(parsedValues.zoneValue);
127
- }, [value, dateValue, timeValue, zoneValue, parseValue]);
128
- const onDateBlur = event => {
129
- setIsFocused(false);
130
- onBlur(event);
131
- if (datePickerPropsWithSelectProps !== null && datePickerPropsWithSelectProps !== void 0 && datePickerPropsWithSelectProps.onBlur) {
132
- datePickerPropsWithSelectProps.onBlur(event);
133
- }
134
- };
135
- const onTimeBlur = event => {
136
- setIsFocused(false);
137
- onBlur(event);
138
- if (timePickerPropsWithSelectProps !== null && timePickerPropsWithSelectProps !== void 0 && timePickerPropsWithSelectProps.onBlur) {
139
- timePickerPropsWithSelectProps.onBlur(event);
140
- }
141
- };
142
- const onDateFocus = event => {
143
- setIsFocused(false);
144
- onFocus(event);
145
- if (datePickerPropsWithSelectProps !== null && datePickerPropsWithSelectProps !== void 0 && datePickerPropsWithSelectProps.onFocus) {
146
- datePickerPropsWithSelectProps.onFocus(event);
147
- }
148
- };
149
- const onTimeFocus = event => {
150
- setIsFocused(false);
151
- onFocus(event);
152
- if (timePickerPropsWithSelectProps !== null && timePickerPropsWithSelectProps !== void 0 && timePickerPropsWithSelectProps.onFocus) {
153
- timePickerPropsWithSelectProps.onFocus(event);
154
- }
155
- };
156
- const onDateChange = dateValue => {
157
- const parsedValues = parseValue(value, dateValue, timeValue, zoneValue);
158
- onValueChange({
159
- providedDateValue: dateValue,
160
- providedTimeValue: parsedValues.timeValue,
161
- providedZoneValue: parsedValues.zoneValue
162
- });
163
- if (datePickerPropsWithSelectProps !== null && datePickerPropsWithSelectProps !== void 0 && datePickerPropsWithSelectProps.onChange) {
164
- datePickerPropsWithSelectProps.onChange(dateValue);
165
- }
166
- };
167
- const onTimeChange = timeValue => {
168
- const parsedValues = parseValue(value, dateValue, timeValue, zoneValue);
169
- onValueChange({
170
- providedDateValue: parsedValues.dateValue,
171
- providedTimeValue: timeValue,
172
- providedZoneValue: parsedValues.zoneValue
173
- });
174
- if (timePickerPropsWithSelectProps !== null && timePickerPropsWithSelectProps !== void 0 && timePickerPropsWithSelectProps.onChange) {
175
- timePickerPropsWithSelectProps.onChange(timeValue);
176
- }
177
- };
178
- const onClear = () => {
179
- const parsedValues = parseValue(value, dateValue, timeValue, zoneValue);
180
- onValueChange({
181
- providedDateValue: '',
182
- providedTimeValue: '',
183
- providedZoneValue: parsedValues.zoneValue
184
- });
185
- if (datePickerPropsWithSelectProps !== null && datePickerPropsWithSelectProps !== void 0 && datePickerPropsWithSelectProps.onChange) {
186
- datePickerPropsWithSelectProps.onChange('');
187
- }
188
- if (timePickerPropsWithSelectProps !== null && timePickerPropsWithSelectProps !== void 0 && timePickerPropsWithSelectProps.onChange) {
189
- timePickerPropsWithSelectProps.onChange('');
190
- }
191
- };
192
- const onChangePropWithAnalytics = usePlatformLeafEventHandler({
193
- fn: onChangeProp,
194
- action: 'selectedDate',
195
- actionSubject: 'datePicker',
196
- ...analyticsAttributes
197
- });
198
- const onValueChange = ({
199
- providedDateValue,
200
- providedTimeValue,
201
- providedZoneValue
202
- }) => {
203
- setDateValue(providedDateValue);
204
- setTimeValue(providedTimeValue);
205
- setZoneValue(providedZoneValue);
206
- if (providedDateValue && providedTimeValue) {
207
- const value = formatDateTimeZoneIntoIso(providedDateValue, providedTimeValue, providedZoneValue);
208
- const {
209
- zoneValue: parsedZone
210
- } = parseValue(value, providedDateValue, providedTimeValue, providedZoneValue);
211
- const valueWithValidZone = formatDateTimeZoneIntoIso(providedDateValue, providedTimeValue, parsedZone);
212
- setValue(valueWithValidZone);
213
- onChangePropWithAnalytics(valueWithValidZone);
214
- // If the date or time value was cleared when there is an existing datetime value, then clear the value.
215
- } else if (value) {
216
- setValue('');
217
- onChangePropWithAnalytics('');
218
- }
219
- };
220
- const {
221
- selectProps: datePickerSelectProps,
222
- ...datePickerProps
223
- } = datePickerPropsWithSelectProps;
224
- const datePickerAriaDescribedBy = datePickerProps['aria-describedby'] || ariaDescribedBy;
225
- const datePickerLabel = datePickerProps.label || datePickerDefaultAriaLabel;
226
- const mergedDatePickerSelectProps = {
227
- ...datePickerSelectProps,
228
- styles: mergeStyles(styles, datePickerSelectProps === null || datePickerSelectProps === void 0 ? void 0 : datePickerSelectProps.styles)
229
- };
230
- const {
231
- selectProps: timePickerSelectProps,
232
- ...timePickerProps
233
- } = timePickerPropsWithSelectProps;
234
- const timePickerAriaDescribedBy = timePickerProps['aria-describedby'] || ariaDescribedBy;
235
- const timePickerLabel = timePickerProps.label || timePickerDefaultAriaLabel;
236
- const mergedTimePickerSelectProps = {
237
- ...timePickerSelectProps,
238
- styles: mergeStyles(styles, timePickerSelectProps === null || timePickerSelectProps === void 0 ? void 0 : timePickerSelectProps.styles)
239
- };
240
-
241
- // Render DateTimePicker's IconContainer when a value has been filled
242
- // Don't use Date or TimePicker's because they can't be customised
243
- const isClearable = Boolean(dateValue || timeValue);
244
- return /*#__PURE__*/React.createElement(DateTimePickerContainer, {
245
- appearance: appearance,
246
- isDisabled: isDisabled,
247
- isFocused: isFocused,
248
- isInvalid: isInvalid,
249
- testId: testId,
250
- innerProps: innerProps
251
- }, /*#__PURE__*/React.createElement("input", {
252
- name: name,
253
- type: "hidden",
254
- value: value,
255
- "data-testid": testId && `${testId}--input`
256
- }), /*#__PURE__*/React.createElement(Box, {
257
- xcss: compiledStyles.datePickerContainerStyles
258
- }, /*#__PURE__*/React.createElement(DatePicker, {
259
- appearance: appearance,
260
- "aria-describedby": datePickerAriaDescribedBy,
261
- autoFocus: datePickerProps.autoFocus || autoFocus,
262
- dateFormat: datePickerProps.dateFormat,
263
- defaultIsOpen: datePickerProps.defaultIsOpen,
264
- defaultValue: datePickerProps.defaultValue,
265
- disabled: datePickerProps.disabled,
266
- disabledDateFilter: datePickerProps.disabledDateFilter,
267
- formatDisplayLabel: datePickerProps.formatDisplayLabel,
268
- hideIcon: datePickerProps.hideIcon || true,
269
- icon: datePickerProps.icon,
270
- id: datePickerProps.id || id,
271
- innerProps: datePickerProps.innerProps,
272
- inputLabel: datePickerProps.inputLabel,
273
- inputLabelId: datePickerProps.inputLabelId,
274
- isDisabled: datePickerProps.isDisabled || isDisabled,
275
- isInvalid: datePickerProps.isInvalid || isInvalid,
276
- isOpen: datePickerProps.isOpen,
277
- isRequired: datePickerProps.isRequired || isRequired,
278
- label: datePickerLabel,
279
- locale: datePickerProps.locale || locale,
280
- maxDate: datePickerProps.maxDate,
281
- minDate: datePickerProps.minDate,
282
- name: datePickerProps.name,
283
- nextMonthLabel: datePickerProps.nextMonthLabel,
284
- onBlur: onDateBlur,
285
- onChange: onDateChange,
286
- onFocus: onDateFocus,
287
- openCalendarLabel: datePickerProps.openCalendarLabel,
288
- parseInputValue: datePickerProps.parseInputValue,
289
- placeholder: datePickerProps.placeholder,
290
- previousMonthLabel: datePickerProps.previousMonthLabel,
291
- selectProps: mergedDatePickerSelectProps,
292
- shouldShowCalendarButton: datePickerProps.shouldShowCalendarButton,
293
- spacing: datePickerProps.spacing || spacing,
294
- testId: testId && `${testId}--datepicker` || datePickerProps.testId,
295
- value: dateValue,
296
- weekStartDay: datePickerProps.weekStartDay
297
- })), /*#__PURE__*/React.createElement(Box, {
298
- xcss: compiledStyles.timePickerContainerStyles
299
- }, /*#__PURE__*/React.createElement(TimePicker, {
300
- appearance: timePickerProps.appearance || appearance,
301
- "aria-describedby": timePickerAriaDescribedBy,
302
- autoFocus: timePickerProps.autoFocus,
303
- defaultIsOpen: timePickerProps.defaultIsOpen,
304
- defaultValue: timePickerProps.defaultValue,
305
- formatDisplayLabel: timePickerProps.formatDisplayLabel,
306
- hideIcon: timePickerProps.hideIcon || true,
307
- id: timePickerProps.id,
308
- innerProps: timePickerProps.innerProps,
309
- isDisabled: timePickerProps.isDisabled || isDisabled,
310
- isInvalid: timePickerProps.isInvalid || isInvalid,
311
- isOpen: timePickerProps.isOpen,
312
- isRequired: timePickerProps.isRequired || isRequired,
313
- label: timePickerLabel,
314
- locale: timePickerProps.locale || locale,
315
- name: timePickerProps.name,
316
- onBlur: onTimeBlur,
317
- onChange: onTimeChange,
318
- onFocus: onTimeFocus,
319
- parseInputValue: timePickerProps.parseInputValue,
320
- placeholder: timePickerProps.placeholder,
321
- selectProps: mergedTimePickerSelectProps,
322
- spacing: timePickerProps.spacing || spacing,
323
- testId: timePickerProps.testId || testId && `${testId}--timepicker`,
324
- timeFormat: timePickerProps.timeFormat,
325
- timeIsEditable: timePickerProps.timeIsEditable,
326
- times: timePickerProps.times,
327
- value: timeValue
328
- })), isClearable && !isDisabled ? /*#__PURE__*/React.createElement(Inline, {
329
- xcss: compiledStyles.iconContainerStyles
330
- }, /*#__PURE__*/React.createElement(IconButton, {
331
- appearance: "subtle",
332
- label: clearControlLabel,
333
- icon: iconProps => /*#__PURE__*/React.createElement(SelectClearIcon, _extends({}, iconProps, {
334
- color: "var(--ds-text-subtlest, #6B6E76)",
335
- size: "small"
336
- })),
337
- onClick: onClear,
338
- testId: testId && `${testId}--icon--container`,
339
- tabIndex: -1
340
- })) : null);
341
- });
342
- export default DateTimePicker;
15
+ export default componentWithCondition(() => fg('dst-a11y_fix-dtp-value-calculation'), DateTimePickerNew, DateTimePickerOld);
@@ -1,5 +1,7 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  import React, { forwardRef, useCallback, useEffect, useReducer, useState } from 'react';
3
+
4
+ // oxlint-disable-next-line @atlassian/no-restricted-imports
3
5
  import { format, isValid } from 'date-fns';
4
6
  import { usePlatformLeafEventHandler } from '@atlaskit/analytics-next';
5
7
  import __noop from '@atlaskit/ds-lib/noop';