@atlaskit/datetime-picker 17.6.5 → 17.8.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 (149) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/date-picker/package.json +17 -0
  3. package/date-time-picker/package.json +17 -0
  4. package/dist/cjs/components/date-picker.js +20 -15
  5. package/dist/cjs/components/date-time-picker-class.js +7 -9
  6. package/dist/cjs/components/date-time-picker-fc.js +468 -7
  7. package/dist/cjs/components/time-picker.js +11 -8
  8. package/dist/cjs/entry-points/date-picker.js +13 -0
  9. package/dist/cjs/entry-points/date-time-picker.js +13 -0
  10. package/dist/cjs/entry-points/time-picker.js +13 -0
  11. package/dist/cjs/entry-points/types.js +1 -0
  12. package/dist/cjs/internal/convert-to24hr-time.js +66 -0
  13. package/dist/cjs/internal/default-date-format.js +7 -0
  14. package/dist/cjs/internal/default-times.js +7 -0
  15. package/dist/cjs/internal/empty-component.js +12 -0
  16. package/dist/cjs/internal/format-date-time-zone-into-iso.js +15 -0
  17. package/dist/cjs/internal/format-date.js +39 -0
  18. package/dist/cjs/internal/{date-picker-migration.js → get-parsed-iso.js} +4 -48
  19. package/dist/cjs/internal/get-placeholder.js +32 -0
  20. package/dist/cjs/internal/get-safe-calendar-value.js +18 -0
  21. package/dist/cjs/internal/get-short-iso-string.js +13 -0
  22. package/dist/cjs/internal/is-date-disabled.js +29 -0
  23. package/dist/cjs/internal/is-valid.js +39 -0
  24. package/dist/cjs/internal/pad-two.js +9 -0
  25. package/dist/cjs/internal/parse-date.js +31 -20
  26. package/dist/cjs/internal/parse-time.js +6 -102
  27. package/dist/cjs/internal/placeholder-date-time.js +9 -0
  28. package/dist/cjs/internal/remove-spacer.js +9 -0
  29. package/dist/es2019/components/date-picker.js +9 -4
  30. package/dist/es2019/components/date-time-picker-class.js +4 -6
  31. package/dist/es2019/components/date-time-picker-fc.js +451 -5
  32. package/dist/es2019/components/time-picker.js +5 -2
  33. package/dist/es2019/entry-points/date-picker.js +1 -0
  34. package/dist/es2019/entry-points/date-time-picker.js +1 -0
  35. package/dist/es2019/entry-points/time-picker.js +1 -0
  36. package/dist/es2019/entry-points/types.js +0 -0
  37. package/dist/es2019/internal/convert-to24hr-time.js +60 -0
  38. package/dist/es2019/internal/default-date-format.js +1 -0
  39. package/dist/es2019/internal/default-times.js +1 -0
  40. package/dist/es2019/internal/empty-component.js +4 -0
  41. package/dist/es2019/internal/format-date-time-zone-into-iso.js +9 -0
  42. package/dist/es2019/internal/format-date.js +34 -0
  43. package/dist/es2019/internal/{date-picker-migration.js → get-parsed-iso.js} +2 -54
  44. package/dist/es2019/internal/get-placeholder.js +28 -0
  45. package/dist/es2019/internal/get-safe-calendar-value.js +11 -0
  46. package/dist/es2019/internal/get-short-iso-string.js +6 -0
  47. package/dist/es2019/internal/is-date-disabled.js +25 -0
  48. package/dist/es2019/internal/is-valid.js +33 -0
  49. package/dist/es2019/internal/pad-two.js +3 -0
  50. package/dist/es2019/internal/parse-date.js +33 -18
  51. package/dist/es2019/internal/parse-time.js +3 -96
  52. package/dist/es2019/internal/placeholder-date-time.js +3 -0
  53. package/dist/es2019/internal/remove-spacer.js +3 -0
  54. package/dist/esm/components/date-picker.js +9 -4
  55. package/dist/esm/components/date-time-picker-class.js +4 -6
  56. package/dist/esm/components/date-time-picker-fc.js +468 -7
  57. package/dist/esm/components/time-picker.js +5 -2
  58. package/dist/esm/entry-points/date-picker.js +1 -0
  59. package/dist/esm/entry-points/date-time-picker.js +1 -0
  60. package/dist/esm/entry-points/time-picker.js +1 -0
  61. package/dist/esm/entry-points/types.js +0 -0
  62. package/dist/esm/internal/convert-to24hr-time.js +60 -0
  63. package/dist/esm/internal/default-date-format.js +1 -0
  64. package/dist/esm/internal/default-times.js +1 -0
  65. package/dist/esm/internal/empty-component.js +6 -0
  66. package/dist/esm/internal/format-date-time-zone-into-iso.js +9 -0
  67. package/dist/esm/internal/format-date.js +32 -0
  68. package/dist/esm/internal/{date-picker-migration.js → get-parsed-iso.js} +2 -46
  69. package/dist/esm/internal/get-placeholder.js +26 -0
  70. package/dist/esm/internal/get-safe-calendar-value.js +11 -0
  71. package/dist/esm/internal/get-short-iso-string.js +6 -0
  72. package/dist/esm/internal/is-date-disabled.js +23 -0
  73. package/dist/esm/internal/is-valid.js +33 -0
  74. package/dist/esm/internal/pad-two.js +3 -0
  75. package/dist/esm/internal/parse-date.js +31 -18
  76. package/dist/esm/internal/parse-time.js +3 -96
  77. package/dist/esm/internal/placeholder-date-time.js +3 -0
  78. package/dist/esm/internal/remove-spacer.js +3 -0
  79. package/dist/types/components/date-time-picker-class.d.ts +0 -2
  80. package/dist/types/components/date-time-picker-fc.d.ts +4 -2
  81. package/dist/types/entry-points/date-picker.d.ts +2 -0
  82. package/dist/types/entry-points/date-time-picker.d.ts +1 -0
  83. package/dist/types/entry-points/time-picker.d.ts +1 -0
  84. package/dist/types/entry-points/types.d.ts +1 -0
  85. package/dist/types/internal/convert-to24hr-time.d.ts +7 -0
  86. package/dist/types/internal/default-date-format.d.ts +1 -0
  87. package/dist/types/internal/default-times.d.ts +1 -0
  88. package/dist/types/internal/empty-component.d.ts +4 -0
  89. package/dist/types/internal/format-date-time-zone-into-iso.d.ts +4 -0
  90. package/dist/{types-ts4.5/internal/date-picker-migration.d.ts → types/internal/format-date.d.ts} +0 -28
  91. package/dist/types/internal/get-parsed-iso.d.ts +20 -0
  92. package/dist/types/internal/get-placeholder.d.ts +22 -0
  93. package/dist/types/internal/get-safe-calendar-value.d.ts +1 -0
  94. package/dist/types/internal/get-short-iso-string.d.ts +1 -0
  95. package/dist/types/internal/is-date-disabled.d.ts +20 -0
  96. package/dist/types/internal/is-valid.d.ts +1 -0
  97. package/dist/types/internal/pad-two.d.ts +1 -0
  98. package/dist/types/internal/parse-date.d.ts +26 -5
  99. package/dist/types/internal/parse-time.d.ts +0 -9
  100. package/dist/types/internal/placeholder-date-time.d.ts +1 -0
  101. package/dist/types/internal/remove-spacer.d.ts +1 -0
  102. package/dist/types-ts4.5/components/date-time-picker-class.d.ts +0 -2
  103. package/dist/types-ts4.5/components/date-time-picker-fc.d.ts +4 -2
  104. package/dist/types-ts4.5/entry-points/date-picker.d.ts +2 -0
  105. package/dist/types-ts4.5/entry-points/date-time-picker.d.ts +1 -0
  106. package/dist/types-ts4.5/entry-points/time-picker.d.ts +1 -0
  107. package/dist/types-ts4.5/entry-points/types.d.ts +1 -0
  108. package/dist/types-ts4.5/internal/convert-to24hr-time.d.ts +7 -0
  109. package/dist/types-ts4.5/internal/default-date-format.d.ts +1 -0
  110. package/dist/types-ts4.5/internal/default-times.d.ts +1 -0
  111. package/dist/types-ts4.5/internal/empty-component.d.ts +4 -0
  112. package/dist/types-ts4.5/internal/format-date-time-zone-into-iso.d.ts +4 -0
  113. package/dist/{types/internal/date-picker-migration.d.ts → types-ts4.5/internal/format-date.d.ts} +0 -28
  114. package/dist/types-ts4.5/internal/get-parsed-iso.d.ts +20 -0
  115. package/dist/types-ts4.5/internal/get-placeholder.d.ts +22 -0
  116. package/dist/types-ts4.5/internal/get-safe-calendar-value.d.ts +1 -0
  117. package/dist/types-ts4.5/internal/get-short-iso-string.d.ts +1 -0
  118. package/dist/types-ts4.5/internal/is-date-disabled.d.ts +20 -0
  119. package/dist/types-ts4.5/internal/is-valid.d.ts +1 -0
  120. package/dist/types-ts4.5/internal/pad-two.d.ts +1 -0
  121. package/dist/types-ts4.5/internal/parse-date.d.ts +26 -5
  122. package/dist/types-ts4.5/internal/parse-time.d.ts +0 -9
  123. package/dist/types-ts4.5/internal/placeholder-date-time.d.ts +1 -0
  124. package/dist/types-ts4.5/internal/remove-spacer.d.ts +1 -0
  125. package/package.json +11 -14
  126. package/time-picker/package.json +17 -0
  127. package/types/package.json +5 -5
  128. package/dist/cjs/components/date-time-picker-fc-new.js +0 -479
  129. package/dist/cjs/components/date-time-picker-fc-old.js +0 -370
  130. package/dist/cjs/internal/index.js +0 -31
  131. package/dist/es2019/components/date-time-picker-fc-new.js +0 -456
  132. package/dist/es2019/components/date-time-picker-fc-old.compiled.css +0 -6
  133. package/dist/es2019/components/date-time-picker-fc-old.js +0 -336
  134. package/dist/es2019/internal/index.js +0 -20
  135. package/dist/esm/components/date-time-picker-fc-new.compiled.css +0 -6
  136. package/dist/esm/components/date-time-picker-fc-new.js +0 -473
  137. package/dist/esm/components/date-time-picker-fc-old.compiled.css +0 -6
  138. package/dist/esm/components/date-time-picker-fc-old.js +0 -364
  139. package/dist/esm/internal/index.js +0 -22
  140. package/dist/types/components/date-time-picker-fc-new.d.ts +0 -6
  141. package/dist/types/components/date-time-picker-fc-old.d.ts +0 -6
  142. package/dist/types/internal/index.d.ts +0 -10
  143. package/dist/types-ts4.5/components/date-time-picker-fc-new.d.ts +0 -6
  144. package/dist/types-ts4.5/components/date-time-picker-fc-old.d.ts +0 -6
  145. package/dist/types-ts4.5/internal/index.d.ts +0 -10
  146. package/offerings.json +0 -98
  147. /package/dist/cjs/components/{date-time-picker-fc-new.compiled.css → date-time-picker-fc.compiled.css} +0 -0
  148. /package/dist/{cjs/components/date-time-picker-fc-old.compiled.css → es2019/components/date-time-picker-fc.compiled.css} +0 -0
  149. /package/dist/{es2019/components/date-time-picker-fc-new.compiled.css → esm/components/date-time-picker-fc.compiled.css} +0 -0
@@ -1,7 +1,71 @@
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';
1
+ /* date-time-picker-fc.tsx generated by @compiled/babel-plugin v0.39.1 */
2
+ import _extends from "@babel/runtime/helpers/extends";
3
+ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
4
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
5
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
6
+ var _excluded = ["selectProps"],
7
+ _excluded2 = ["selectProps"];
8
+ import "./date-time-picker-fc.compiled.css";
9
+ import { ax, ix } from "@compiled/react/runtime";
10
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
11
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
12
+ /// <reference types="node" />
13
+ // for typing `process`
14
+
15
+ import React, { forwardRef, useCallback, useEffect, useReducer, useState } from 'react';
16
+
17
+ // oxlint-disable-next-line @atlassian/no-restricted-imports
18
+ import { format, isValid, parseISO } from 'date-fns';
19
+ import { usePlatformLeafEventHandler } from '@atlaskit/analytics-next';
20
+ import { IconButton } from '@atlaskit/button/new';
21
+ import SelectClearIcon from '@atlaskit/icon/core/cross-circle';
22
+ import { Box, Inline } from '@atlaskit/primitives/compiled';
23
+ import { mergeStyles } from '@atlaskit/select';
24
+ import { DateTimePickerContainer } from '../internal/date-time-picker-container';
25
+ import { formatDateTimeZoneIntoIso } from '../internal/format-date-time-zone-into-iso';
26
+ import { convertTokens } from '../internal/parse-tokens';
27
+ import DatePicker from './date-picker';
28
+ import TimePicker from './time-picker';
29
+ var packageName = "@atlaskit/datetime-picker";
30
+ var packageVersion = "17.7.0";
31
+ var analyticsAttributes = {
32
+ componentName: 'dateTimePicker',
33
+ packageName: packageName,
34
+ packageVersion: packageVersion
35
+ };
36
+ var compiledStyles = {
37
+ datePickerContainerStyles: "_i0dl1ssb _16jlkb7n _1o9zidpf",
38
+ timePickerContainerStyles: "_i0dl1ssb _16jlkb7n",
39
+ iconContainerStyles: "_1e0c1txw _4cvr1h6o _i0dl1kw7"
40
+ };
41
+
42
+ // react-select overrides (via @atlaskit/select).
43
+ var styles = {
44
+ control: function control(style) {
45
+ return _objectSpread(_objectSpread({}, style), {}, {
46
+ backgroundColor: 'transparent',
47
+ border: 2,
48
+ borderRadius: 0,
49
+ paddingLeft: 0,
50
+ ':hover': {
51
+ backgroundColor: 'transparent',
52
+ cursor: 'inherit'
53
+ }
54
+ });
55
+ }
56
+ };
57
+
58
+ /**
59
+ * Two action types keep the reducer focused:
60
+ *
61
+ * - APPLY: used by user-interaction handlers. The handler computes the full
62
+ * next state (including the new ISO value) and applies it atomically. This
63
+ * guarantees a single re-render with no cascades regardless of React version.
64
+ *
65
+ * - SET_VALUE: used by the `providedValue` prop effect. The reducer owns all
66
+ * parsing logic for external value changes, including the empty-string case
67
+ * that the previous useState approach missed.
68
+ */
5
69
 
6
70
  /**
7
71
  * __Date time picker__
@@ -12,6 +76,403 @@ import DateTimePickerOld from './date-time-picker-fc-old';
12
76
  * - [Code](https://atlassian.design/components/datetime-picker/code)
13
77
  * - [Usage](https://atlassian.design/components/datetime-picker/usage)
14
78
  */
15
- export default componentWithCondition(function () {
16
- return fg('dst-a11y_fix-dtp-value-calculation');
17
- }, DateTimePickerNew, DateTimePickerOld);
79
+ var DateTimePicker = /*#__PURE__*/forwardRef(function (_ref2, _ref) {
80
+ var ariaDescribedBy = _ref2['aria-describedby'],
81
+ _ref2$appearance = _ref2.appearance,
82
+ appearance = _ref2$appearance === void 0 ? 'default' : _ref2$appearance,
83
+ _ref2$autoFocus = _ref2.autoFocus,
84
+ autoFocus = _ref2$autoFocus === void 0 ? false : _ref2$autoFocus,
85
+ _ref2$clearControlLab = _ref2.clearControlLabel,
86
+ clearControlLabel = _ref2$clearControlLab === void 0 ? 'clear' : _ref2$clearControlLab,
87
+ _ref2$datePickerProps = _ref2.datePickerProps,
88
+ datePickerPropsWithSelectProps = _ref2$datePickerProps === void 0 ? {} : _ref2$datePickerProps,
89
+ _ref2$defaultValue = _ref2.defaultValue,
90
+ defaultValue = _ref2$defaultValue === void 0 ? '' : _ref2$defaultValue,
91
+ _ref2$id = _ref2.id,
92
+ id = _ref2$id === void 0 ? '' : _ref2$id,
93
+ _ref2$innerProps = _ref2.innerProps,
94
+ innerProps = _ref2$innerProps === void 0 ? {} : _ref2$innerProps,
95
+ _ref2$isDisabled = _ref2.isDisabled,
96
+ isDisabled = _ref2$isDisabled === void 0 ? false : _ref2$isDisabled,
97
+ _ref2$isInvalid = _ref2.isInvalid,
98
+ isInvalid = _ref2$isInvalid === void 0 ? false : _ref2$isInvalid,
99
+ _ref2$isRequired = _ref2.isRequired,
100
+ isRequired = _ref2$isRequired === void 0 ? false : _ref2$isRequired,
101
+ _ref2$name = _ref2.name,
102
+ name = _ref2$name === void 0 ? '' : _ref2$name,
103
+ _ref2$onBlur = _ref2.onBlur,
104
+ onBlur = _ref2$onBlur === void 0 ? function (_event) {} : _ref2$onBlur,
105
+ _ref2$onChange = _ref2.onChange,
106
+ onChangeProp = _ref2$onChange === void 0 ? function (_value) {} : _ref2$onChange,
107
+ _ref2$onFocus = _ref2.onFocus,
108
+ onFocus = _ref2$onFocus === void 0 ? function (_event) {} : _ref2$onFocus,
109
+ providedParseValue = _ref2.parseValue,
110
+ _ref2$spacing = _ref2.spacing,
111
+ spacing = _ref2$spacing === void 0 ? 'default' : _ref2$spacing,
112
+ _ref2$locale = _ref2.locale,
113
+ locale = _ref2$locale === void 0 ? 'en-US' : _ref2$locale,
114
+ testId = _ref2.testId,
115
+ _ref2$timePickerProps = _ref2.timePickerProps,
116
+ timePickerPropsWithSelectProps = _ref2$timePickerProps === void 0 ? {} : _ref2$timePickerProps,
117
+ providedValue = _ref2.value;
118
+ var _useState = useState(false),
119
+ _useState2 = _slicedToArray(_useState, 2),
120
+ isFocused = _useState2[0],
121
+ setIsFocused = _useState2[1];
122
+
123
+ /**
124
+ * Defined inside the component so the reducer closes over `providedParseValue`
125
+ * without needing to smuggle it through every action payload. React always
126
+ * calls the reducer from the latest render, so stale-closure is not a concern.
127
+ */
128
+ var reducer = function reducer(state, action) {
129
+ switch (action.type) {
130
+ case 'APPLY':
131
+ return action.payload;
132
+ case 'SET_VALUE':
133
+ {
134
+ var newValue = action.payload;
135
+
136
+ // Explicit empty-string handling: clear all sub-fields so the date
137
+ // and time pickers visually reset when a controlled value is cleared.
138
+ if (!newValue) {
139
+ return {
140
+ value: '',
141
+ dateValue: '',
142
+ timeValue: '',
143
+ zoneValue: ''
144
+ };
145
+ }
146
+ if (providedParseValue) {
147
+ var _parsed = providedParseValue(newValue, state.dateValue, state.timeValue, state.zoneValue);
148
+ return _parsed ? _objectSpread({
149
+ value: newValue
150
+ }, _parsed) : {
151
+ value: newValue,
152
+ dateValue: state.dateValue,
153
+ timeValue: state.timeValue,
154
+ zoneValue: state.zoneValue
155
+ };
156
+ }
157
+ var parsed = parseISO(newValue);
158
+ return isValid(parsed) ? {
159
+ value: newValue,
160
+ dateValue: format(parsed, convertTokens('YYYY-MM-DD')),
161
+ timeValue: format(parsed, convertTokens('HH:mm')),
162
+ zoneValue: format(parsed, convertTokens('ZZ'))
163
+ } : {
164
+ value: newValue,
165
+ dateValue: '',
166
+ timeValue: '',
167
+ zoneValue: ''
168
+ };
169
+ }
170
+ default:
171
+ return state;
172
+ }
173
+ };
174
+ var _useReducer = useReducer(reducer, null, function () {
175
+ var initialValue = providedValue || defaultValue || '';
176
+ var initialDate = (datePickerPropsWithSelectProps === null || datePickerPropsWithSelectProps === void 0 ? void 0 : datePickerPropsWithSelectProps.defaultValue) || '';
177
+ var initialTime = (timePickerPropsWithSelectProps === null || timePickerPropsWithSelectProps === void 0 ? void 0 : timePickerPropsWithSelectProps.defaultValue) || '';
178
+ if (!initialValue) {
179
+ return {
180
+ value: '',
181
+ dateValue: initialDate,
182
+ timeValue: initialTime,
183
+ zoneValue: ''
184
+ };
185
+ }
186
+ if (providedParseValue) {
187
+ var _parsed2 = providedParseValue(initialValue, initialDate, initialTime, '');
188
+ return _parsed2 ? _objectSpread({
189
+ value: initialValue
190
+ }, _parsed2) : {
191
+ value: initialValue,
192
+ dateValue: initialDate,
193
+ timeValue: initialTime,
194
+ zoneValue: ''
195
+ };
196
+ }
197
+ var parsed = parseISO(initialValue);
198
+ return isValid(parsed) ? {
199
+ value: initialValue,
200
+ dateValue: format(parsed, convertTokens('YYYY-MM-DD')),
201
+ timeValue: format(parsed, convertTokens('HH:mm')),
202
+ zoneValue: format(parsed, convertTokens('ZZ'))
203
+ } : {
204
+ value: initialValue,
205
+ dateValue: initialDate,
206
+ timeValue: initialTime,
207
+ zoneValue: ''
208
+ };
209
+ }),
210
+ _useReducer2 = _slicedToArray(_useReducer, 2),
211
+ dtState = _useReducer2[0],
212
+ dispatch = _useReducer2[1];
213
+ useEffect(function () {
214
+ if (providedValue !== undefined) {
215
+ dispatch({
216
+ type: 'SET_VALUE',
217
+ payload: providedValue
218
+ });
219
+ }
220
+ // eslint-disable-next-line react-hooks/exhaustive-deps
221
+ }, [providedValue]);
222
+ var parseValue = useCallback(function (value, providedDateValue, providedTimeValue, providedZoneValue) {
223
+ if (providedParseValue) {
224
+ var parsedFromFn = providedParseValue(value, providedDateValue, providedTimeValue, providedZoneValue);
225
+ // This handles cases found in Jira where the parse function actually does
226
+ // nothing and returns undefined. The previous `getSafeState` function
227
+ // just spread the values over the state, but if it returned `undefined`,
228
+ // it would just rely on the previous state values. Considering this is
229
+ // what is input to this function anyway, this is a safe way to handle
230
+ // this, colocate the behavior, and not rely on `getSafeState`.
231
+ return parsedFromFn || {
232
+ dateValue: providedDateValue,
233
+ timeValue: providedTimeValue,
234
+ zoneValue: providedZoneValue
235
+ };
236
+ }
237
+ var parsed = parseISO(value);
238
+ return isValid(parsed) ? {
239
+ dateValue: format(parsed, convertTokens('YYYY-MM-DD')),
240
+ timeValue: format(parsed, convertTokens('HH:mm')),
241
+ zoneValue: format(parsed, convertTokens('ZZ'))
242
+ } : {
243
+ dateValue: dtState.dateValue,
244
+ timeValue: dtState.timeValue,
245
+ zoneValue: dtState.zoneValue
246
+ };
247
+ }, [providedParseValue, dtState.dateValue, dtState.timeValue, dtState.zoneValue]);
248
+ var onDateBlur = function onDateBlur(event) {
249
+ setIsFocused(false);
250
+ onBlur(event);
251
+ if (datePickerPropsWithSelectProps !== null && datePickerPropsWithSelectProps !== void 0 && datePickerPropsWithSelectProps.onBlur) {
252
+ datePickerPropsWithSelectProps.onBlur(event);
253
+ }
254
+ };
255
+ var onTimeBlur = function onTimeBlur(event) {
256
+ setIsFocused(false);
257
+ onBlur(event);
258
+ if (timePickerPropsWithSelectProps !== null && timePickerPropsWithSelectProps !== void 0 && timePickerPropsWithSelectProps.onBlur) {
259
+ timePickerPropsWithSelectProps.onBlur(event);
260
+ }
261
+ };
262
+ var onDateFocus = function onDateFocus(event) {
263
+ setIsFocused(false);
264
+ onFocus(event);
265
+ if (datePickerPropsWithSelectProps !== null && datePickerPropsWithSelectProps !== void 0 && datePickerPropsWithSelectProps.onFocus) {
266
+ datePickerPropsWithSelectProps.onFocus(event);
267
+ }
268
+ };
269
+ var onTimeFocus = function onTimeFocus(event) {
270
+ setIsFocused(false);
271
+ onFocus(event);
272
+ if (timePickerPropsWithSelectProps !== null && timePickerPropsWithSelectProps !== void 0 && timePickerPropsWithSelectProps.onFocus) {
273
+ timePickerPropsWithSelectProps.onFocus(event);
274
+ }
275
+ };
276
+ var onDateChange = function onDateChange(newDateValue) {
277
+ var parsedValues = parseValue(dtState.value, newDateValue, dtState.timeValue, dtState.zoneValue);
278
+ onValueChange({
279
+ providedDateValue: newDateValue,
280
+ providedTimeValue: parsedValues.timeValue,
281
+ providedZoneValue: parsedValues.zoneValue
282
+ });
283
+ if (datePickerPropsWithSelectProps !== null && datePickerPropsWithSelectProps !== void 0 && datePickerPropsWithSelectProps.onChange) {
284
+ datePickerPropsWithSelectProps.onChange(newDateValue);
285
+ }
286
+ };
287
+ var onTimeChange = function onTimeChange(newTimeValue) {
288
+ var parsedValues = parseValue(dtState.value, dtState.dateValue, newTimeValue, dtState.zoneValue);
289
+ onValueChange({
290
+ providedDateValue: parsedValues.dateValue,
291
+ providedTimeValue: newTimeValue,
292
+ providedZoneValue: parsedValues.zoneValue
293
+ });
294
+ if (timePickerPropsWithSelectProps !== null && timePickerPropsWithSelectProps !== void 0 && timePickerPropsWithSelectProps.onChange) {
295
+ timePickerPropsWithSelectProps.onChange(newTimeValue);
296
+ }
297
+ };
298
+ var onClear = function onClear() {
299
+ var parsedValues = parseValue(dtState.value, dtState.dateValue, dtState.timeValue, dtState.zoneValue);
300
+ onValueChange({
301
+ providedDateValue: '',
302
+ providedTimeValue: '',
303
+ providedZoneValue: parsedValues.zoneValue
304
+ });
305
+ if (datePickerPropsWithSelectProps !== null && datePickerPropsWithSelectProps !== void 0 && datePickerPropsWithSelectProps.onChange) {
306
+ datePickerPropsWithSelectProps.onChange('');
307
+ }
308
+ if (timePickerPropsWithSelectProps !== null && timePickerPropsWithSelectProps !== void 0 && timePickerPropsWithSelectProps.onChange) {
309
+ timePickerPropsWithSelectProps.onChange('');
310
+ }
311
+ };
312
+ var onChangePropWithAnalytics = usePlatformLeafEventHandler(_objectSpread({
313
+ fn: onChangeProp,
314
+ action: 'selectedDate',
315
+ actionSubject: 'datePicker'
316
+ }, analyticsAttributes));
317
+ var onValueChange = function onValueChange(_ref3) {
318
+ var providedDateValue = _ref3.providedDateValue,
319
+ providedTimeValue = _ref3.providedTimeValue,
320
+ providedZoneValue = _ref3.providedZoneValue;
321
+ if (providedDateValue && providedTimeValue) {
322
+ var isoValue = formatDateTimeZoneIntoIso(providedDateValue, providedTimeValue, providedZoneValue);
323
+ var _parseValue = parseValue(isoValue, providedDateValue, providedTimeValue, providedZoneValue),
324
+ parsedZone = _parseValue.zoneValue;
325
+ var valueWithValidZone = formatDateTimeZoneIntoIso(providedDateValue, providedTimeValue, parsedZone);
326
+ dispatch({
327
+ type: 'APPLY',
328
+ payload: {
329
+ value: valueWithValidZone,
330
+ dateValue: providedDateValue,
331
+ timeValue: providedTimeValue,
332
+ zoneValue: parsedZone
333
+ }
334
+ });
335
+ onChangePropWithAnalytics(valueWithValidZone);
336
+ // If the date or time value was cleared when there is an existing datetime value, then clear the value.
337
+ } else if (dtState.value) {
338
+ dispatch({
339
+ type: 'APPLY',
340
+ payload: {
341
+ value: '',
342
+ dateValue: providedDateValue,
343
+ timeValue: providedTimeValue,
344
+ zoneValue: providedZoneValue
345
+ }
346
+ });
347
+ onChangePropWithAnalytics('');
348
+ } else {
349
+ dispatch({
350
+ type: 'APPLY',
351
+ payload: {
352
+ value: '',
353
+ dateValue: providedDateValue,
354
+ timeValue: providedTimeValue,
355
+ zoneValue: providedZoneValue
356
+ }
357
+ });
358
+ }
359
+ };
360
+ var datePickerSelectProps = datePickerPropsWithSelectProps.selectProps,
361
+ datePickerProps = _objectWithoutProperties(datePickerPropsWithSelectProps, _excluded);
362
+ var datePickerAriaDescribedBy = datePickerProps['aria-describedby'] || ariaDescribedBy;
363
+ var datePickerLabel = datePickerProps.label || 'Date';
364
+ var mergedDatePickerSelectProps = _objectSpread(_objectSpread({}, datePickerSelectProps), {}, {
365
+ styles: mergeStyles(styles, datePickerSelectProps === null || datePickerSelectProps === void 0 ? void 0 : datePickerSelectProps.styles)
366
+ });
367
+ var timePickerSelectProps = timePickerPropsWithSelectProps.selectProps,
368
+ timePickerProps = _objectWithoutProperties(timePickerPropsWithSelectProps, _excluded2);
369
+ var timePickerAriaDescribedBy = timePickerProps['aria-describedby'] || ariaDescribedBy;
370
+ var timePickerLabel = timePickerProps.label || 'Time';
371
+ var mergedTimePickerSelectProps = _objectSpread(_objectSpread({}, timePickerSelectProps), {}, {
372
+ styles: mergeStyles(styles, timePickerSelectProps === null || timePickerSelectProps === void 0 ? void 0 : timePickerSelectProps.styles)
373
+ });
374
+
375
+ // Render DateTimePicker's IconContainer when a value has been filled
376
+ // Don't use Date or TimePicker's because they can't be customised
377
+ var isClearable = Boolean(dtState.dateValue || dtState.timeValue);
378
+ return /*#__PURE__*/React.createElement(DateTimePickerContainer, {
379
+ appearance: appearance,
380
+ isDisabled: isDisabled,
381
+ isFocused: isFocused,
382
+ isInvalid: isInvalid,
383
+ testId: testId,
384
+ innerProps: innerProps
385
+ }, /*#__PURE__*/React.createElement("input", {
386
+ name: name,
387
+ type: "hidden",
388
+ value: dtState.value,
389
+ "data-testid": testId && "".concat(testId, "--input")
390
+ }), /*#__PURE__*/React.createElement(Box, {
391
+ xcss: compiledStyles.datePickerContainerStyles
392
+ }, /*#__PURE__*/React.createElement(DatePicker, {
393
+ appearance: appearance,
394
+ "aria-describedby": datePickerAriaDescribedBy,
395
+ autoFocus: datePickerProps.autoFocus || autoFocus,
396
+ dateFormat: datePickerProps.dateFormat,
397
+ defaultIsOpen: datePickerProps.defaultIsOpen,
398
+ defaultValue: datePickerProps.defaultValue,
399
+ disabled: datePickerProps.disabled,
400
+ disabledDateFilter: datePickerProps.disabledDateFilter,
401
+ formatDisplayLabel: datePickerProps.formatDisplayLabel,
402
+ hideIcon: datePickerProps.hideIcon || true,
403
+ icon: datePickerProps.icon,
404
+ id: datePickerProps.id || id,
405
+ innerProps: datePickerProps.innerProps,
406
+ inputLabel: datePickerProps.inputLabel,
407
+ inputLabelId: datePickerProps.inputLabelId,
408
+ isDisabled: datePickerProps.isDisabled || isDisabled,
409
+ isInvalid: datePickerProps.isInvalid || isInvalid,
410
+ isOpen: datePickerProps.isOpen,
411
+ isRequired: datePickerProps.isRequired || isRequired,
412
+ label: datePickerLabel,
413
+ locale: datePickerProps.locale || locale,
414
+ maxDate: datePickerProps.maxDate,
415
+ minDate: datePickerProps.minDate,
416
+ name: datePickerProps.name,
417
+ nextMonthLabel: datePickerProps.nextMonthLabel,
418
+ onBlur: onDateBlur,
419
+ onChange: onDateChange,
420
+ onFocus: onDateFocus,
421
+ openCalendarLabel: datePickerProps.openCalendarLabel,
422
+ parseInputValue: datePickerProps.parseInputValue,
423
+ placeholder: datePickerProps.placeholder,
424
+ previousMonthLabel: datePickerProps.previousMonthLabel,
425
+ selectProps: mergedDatePickerSelectProps,
426
+ shouldShowCalendarButton: datePickerProps.shouldShowCalendarButton,
427
+ spacing: datePickerProps.spacing || spacing,
428
+ testId: testId && "".concat(testId, "--datepicker") || datePickerProps.testId,
429
+ value: dtState.dateValue,
430
+ weekStartDay: datePickerProps.weekStartDay
431
+ })), /*#__PURE__*/React.createElement(Box, {
432
+ xcss: compiledStyles.timePickerContainerStyles
433
+ }, /*#__PURE__*/React.createElement(TimePicker, {
434
+ appearance: timePickerProps.appearance || appearance,
435
+ "aria-describedby": timePickerAriaDescribedBy,
436
+ autoFocus: timePickerProps.autoFocus,
437
+ defaultIsOpen: timePickerProps.defaultIsOpen,
438
+ defaultValue: timePickerProps.defaultValue,
439
+ formatDisplayLabel: timePickerProps.formatDisplayLabel,
440
+ hideIcon: timePickerProps.hideIcon || true,
441
+ id: timePickerProps.id,
442
+ innerProps: timePickerProps.innerProps,
443
+ isDisabled: timePickerProps.isDisabled || isDisabled,
444
+ isInvalid: timePickerProps.isInvalid || isInvalid,
445
+ isOpen: timePickerProps.isOpen,
446
+ isRequired: timePickerProps.isRequired || isRequired,
447
+ label: timePickerLabel,
448
+ locale: timePickerProps.locale || locale,
449
+ name: timePickerProps.name,
450
+ onBlur: onTimeBlur,
451
+ onChange: onTimeChange,
452
+ onFocus: onTimeFocus,
453
+ parseInputValue: timePickerProps.parseInputValue,
454
+ placeholder: timePickerProps.placeholder,
455
+ selectProps: mergedTimePickerSelectProps,
456
+ spacing: timePickerProps.spacing || spacing,
457
+ testId: timePickerProps.testId || testId && "".concat(testId, "--timepicker"),
458
+ timeFormat: timePickerProps.timeFormat,
459
+ timeIsEditable: timePickerProps.timeIsEditable,
460
+ times: timePickerProps.times,
461
+ value: dtState.timeValue
462
+ })), isClearable && !isDisabled ? /*#__PURE__*/React.createElement(Inline, {
463
+ xcss: compiledStyles.iconContainerStyles
464
+ }, /*#__PURE__*/React.createElement(IconButton, {
465
+ appearance: "subtle",
466
+ label: clearControlLabel,
467
+ icon: function icon(iconProps) {
468
+ return /*#__PURE__*/React.createElement(SelectClearIcon, _extends({}, iconProps, {
469
+ color: "var(--ds-text-subtlest, #6B6E76)",
470
+ size: "small"
471
+ }));
472
+ },
473
+ onClick: onClear,
474
+ testId: testId && "".concat(testId, "--icon--container"),
475
+ tabIndex: -1
476
+ })) : null);
477
+ });
478
+ export default DateTimePicker;
@@ -13,13 +13,16 @@ import { usePlatformLeafEventHandler } from '@atlaskit/analytics-next';
13
13
  import __noop from '@atlaskit/ds-lib/noop';
14
14
  import { createLocalizationProvider } from '@atlaskit/locale';
15
15
  import Select, { CreatableSelect, mergeStyles } from '@atlaskit/select';
16
- import { defaultTimeFormat, defaultTimes, EmptyComponent, placeholderDatetime } from '../internal';
16
+ import { defaultTimes } from '../internal/default-times';
17
+ import { EmptyComponent } from '../internal/empty-component';
17
18
  import { FixedLayerMenu } from '../internal/fixed-layer-menu';
18
19
  import parseTime from '../internal/parse-time';
19
20
  import { convertTokens } from '../internal/parse-tokens';
21
+ import { placeholderDatetime } from '../internal/placeholder-date-time';
20
22
  import { makeSingleValue } from '../internal/single-value';
21
23
  var packageName = "@atlaskit/datetime-picker";
22
- var packageVersion = "17.6.5";
24
+ var packageVersion = "17.7.0";
25
+ var defaultTimeFormat = 'h:mma';
23
26
  var menuStyles = {
24
27
  /* Need to remove default absolute positioning as that causes issues with position fixed */
25
28
  position: 'static',
@@ -0,0 +1 @@
1
+ export { default } from '../components/date-picker';
@@ -0,0 +1 @@
1
+ export { default } from '../components/date-time-picker';
@@ -0,0 +1 @@
1
+ export { default } from '../components/time-picker';
File without changes
@@ -0,0 +1,60 @@
1
+ var map24 = {
2
+ '12': '12',
3
+ '01': '13',
4
+ '02': '14',
5
+ '03': '15',
6
+ '04': '16',
7
+ '05': '17',
8
+ '06': '18',
9
+ '07': '19',
10
+ '08': '20',
11
+ '09': '21',
12
+ '10': '22',
13
+ '11': '23'
14
+ };
15
+ function formatSemi24(time) {
16
+ if (time.length === 1) {
17
+ return "0".concat(time, "00");
18
+ }
19
+ if (time.length === 2) {
20
+ return "".concat(time, "00");
21
+ }
22
+ if (time.length === 3 || time.length === 5) {
23
+ return "0".concat(time);
24
+ }
25
+ return time;
26
+ }
27
+ function checkHour(hour, meridiem) {
28
+ if (hour > '24') {
29
+ return null;
30
+ }
31
+ if (hour === '12' && meridiem === 'a') {
32
+ return '00';
33
+ }
34
+ if (hour < '12' && meridiem === 'p') {
35
+ return map24[hour];
36
+ }
37
+ return hour;
38
+ }
39
+ function checkMinuteSecond(value) {
40
+ if (value > '59') {
41
+ return null;
42
+ }
43
+ return value;
44
+ }
45
+ export function convertTo24hrTime(time) {
46
+ var timeArray = time.toLowerCase().split(/(p|a)/i);
47
+ var meridiem = timeArray[1];
48
+ var semi24 = formatSemi24(timeArray[0].trim());
49
+ var hour = checkHour(semi24.substring(0, 2), meridiem);
50
+ var minute = checkMinuteSecond(semi24.substring(2, 4));
51
+ var seconds = semi24.length === 6 && checkMinuteSecond(semi24.substring(4, 6));
52
+ if (!hour || !minute) {
53
+ return null;
54
+ }
55
+ return {
56
+ hour: parseInt(hour, 10),
57
+ minute: parseInt(minute, 10),
58
+ seconds: parseInt(seconds || '0', 10) || 0
59
+ };
60
+ }
@@ -0,0 +1 @@
1
+ export var defaultDateFormat = 'YYYY/MM/DD';
@@ -0,0 +1 @@
1
+ export var defaultTimes = ['09:00', '09:30', '10:00', '10:30', '11:00', '11:30', '12:00', '12:30', '13:00', '13:30', '14:00', '14:30', '15:00', '15:30', '16:00', '16:30', '17:00', '17:30', '18:00'];
@@ -0,0 +1,6 @@
1
+ /**
2
+ * This component is used to hide portions of Select component.
3
+ */
4
+ export var EmptyComponent = function EmptyComponent() {
5
+ return null;
6
+ };
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Formats a date, time, and zone into a ISO string.
3
+ */
4
+ export function formatDateTimeZoneIntoIso(date, time, zone) {
5
+ // 12:00 => 12:00, 1:00 => 01:00
6
+ var needsLeadingZero = /^\d:/;
7
+ var sanitizedTime = needsLeadingZero.test(time) ? "0".concat(time) : time;
8
+ return "".concat(date, "T").concat(sanitizedTime).concat(zone);
9
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Everything in this file is to smooth out the migration of the new date picker
3
+ * (https://product-fabric.atlassian.net/browse/DSP-20682). When that ticket is
4
+ * complete, all of these functions will ilkely be merged back into the date
5
+ * picker. Please do not pre-optimize and put these back into the date picker
6
+ * unless you are working on the DTP Refresh and you have a good reason to do
7
+ * so, thank you!
8
+ *
9
+ * All variables within the `di` objects are dependency injections. They should
10
+ * be read from within the component at the end of the day. But because we are
11
+ * extracting them, we have to inject them in every place manually. When we
12
+ * re-introduce them to the components, we can likely remove the `di` variables
13
+ * and instead use internal variables.
14
+ *
15
+ * If component _only_ has injected variables, it is fully internal and was
16
+ * broken out to be it's own function.
17
+ */
18
+
19
+ // oxlint-disable-next-line @atlassian/no-restricted-imports
20
+ import { format, parseISO } from 'date-fns';
21
+ import { defaultDateFormat } from './default-date-format';
22
+ import { convertTokens } from './parse-tokens';
23
+ export var formatDate = function formatDate(value, di) {
24
+ var formatDisplayLabel = di.formatDisplayLabel,
25
+ dateFormat = di.dateFormat,
26
+ l10n = di.l10n;
27
+ if (formatDisplayLabel) {
28
+ return formatDisplayLabel(value, dateFormat || defaultDateFormat);
29
+ }
30
+ var date = parseISO(value);
31
+ return dateFormat ? format(date, convertTokens(dateFormat)) : l10n.formatDate(date);
32
+ };