@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.
- package/CHANGELOG.md +17 -0
- package/dist/cjs/components/date-picker.js +1 -0
- package/dist/cjs/components/date-time-picker-class.js +1 -0
- package/dist/cjs/components/date-time-picker-fc-new.js +479 -0
- package/dist/cjs/components/date-time-picker-fc-old.js +370 -0
- package/dist/cjs/components/date-time-picker-fc.js +8 -362
- package/dist/cjs/components/time-picker.js +1 -1
- package/dist/cjs/internal/date-picker-migration.js +2 -0
- package/dist/cjs/internal/menu.js +1 -0
- package/dist/cjs/internal/parse-date.js +2 -0
- package/dist/cjs/internal/single-value.js +2 -1
- package/dist/es2019/components/date-picker.js +2 -0
- package/dist/es2019/components/date-time-picker-class.js +1 -0
- package/dist/es2019/components/date-time-picker-fc-new.js +456 -0
- package/dist/es2019/components/date-time-picker-fc-old.compiled.css +6 -0
- package/dist/es2019/components/date-time-picker-fc-old.js +336 -0
- package/dist/es2019/components/date-time-picker-fc.js +5 -332
- package/dist/es2019/components/time-picker.js +2 -0
- package/dist/es2019/internal/date-picker-migration.js +1 -0
- package/dist/es2019/internal/menu.js +2 -0
- package/dist/es2019/internal/parse-date.js +1 -0
- package/dist/es2019/internal/single-value.js +2 -1
- package/dist/esm/components/date-picker.js +2 -0
- package/dist/esm/components/date-time-picker-class.js +1 -0
- package/dist/esm/components/date-time-picker-fc-new.compiled.css +6 -0
- package/dist/esm/components/date-time-picker-fc-new.js +473 -0
- package/dist/esm/components/date-time-picker-fc-old.compiled.css +6 -0
- package/dist/esm/components/date-time-picker-fc-old.js +364 -0
- package/dist/esm/components/date-time-picker-fc.js +7 -360
- package/dist/esm/components/time-picker.js +2 -0
- package/dist/esm/internal/date-picker-migration.js +1 -0
- package/dist/esm/internal/menu.js +2 -0
- package/dist/esm/internal/parse-date.js +1 -0
- package/dist/esm/internal/single-value.js +2 -1
- package/dist/types/components/date-time-picker-fc-new.d.ts +6 -0
- package/dist/types/components/date-time-picker-fc-old.d.ts +6 -0
- package/dist/types/components/date-time-picker-fc.d.ts +2 -6
- package/dist/types-ts4.5/components/date-time-picker-fc-new.d.ts +6 -0
- package/dist/types-ts4.5/components/date-time-picker-fc-old.d.ts +6 -0
- package/dist/types-ts4.5/components/date-time-picker-fc.d.ts +2 -6
- package/package.json +16 -9
- /package/dist/cjs/components/{date-time-picker-fc.compiled.css → date-time-picker-fc-new.compiled.css} +0 -0
- /package/dist/{es2019/components/date-time-picker-fc.compiled.css → cjs/components/date-time-picker-fc-old.compiled.css} +0 -0
- /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
|
-
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
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
|
-
|
|
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';
|