@atlaskit/datetime-picker 15.1.3 → 15.2.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.
@@ -14,22 +14,29 @@ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.
14
14
  * @jsxRuntime classic
15
15
  * @jsx jsx
16
16
  */
17
- import { Component } from 'react';
17
+ import { Component, createRef } from 'react';
18
18
 
19
19
  // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
20
- import { jsx } from '@emotion/react';
20
+ import { css, jsx } from '@emotion/react';
21
21
  import { isValid, parseISO } from 'date-fns';
22
+ // This is a deprecated component but we will be able to use the actual hook
23
+ // version very soon from converting this to functional. And also React 18 is on
24
+ // the horizon
25
+ import { UID } from 'react-uid';
22
26
  import { createAndFireEvent, withAnalyticsContext, withAnalyticsEvents } from '@atlaskit/analytics-next';
23
27
  import CalendarIcon from '@atlaskit/icon/glyph/calendar';
24
28
  import { createLocalizationProvider } from '@atlaskit/locale';
29
+ import { Pressable, xcss } from '@atlaskit/primitives';
25
30
  import Select, { mergeStyles } from '@atlaskit/select';
31
+ import { N500, N70 } from '@atlaskit/theme/colors';
32
+ import VisuallyHidden from '@atlaskit/visually-hidden';
26
33
  import { EmptyComponent } from '../internal';
27
34
  import { formatDate, getParsedISO, getPlaceholder, isDateDisabled, parseDate } from '../internal/date-picker-migration';
28
35
  import { Menu } from '../internal/menu';
29
36
  import { getSafeCalendarValue, getShortISOString } from '../internal/parse-date';
30
37
  import { makeSingleValue } from '../internal/single-value';
31
38
  var packageName = "@atlaskit/datetime-picker";
32
- var packageVersion = "15.1.3";
39
+ var packageVersion = "15.2.0";
33
40
  var datePickerDefaultProps = {
34
41
  defaultIsOpen: false,
35
42
  defaultValue: '',
@@ -48,6 +55,38 @@ var datePickerDefaultProps = {
48
55
  // Not including a default prop for value as it will
49
56
  // Make the component a controlled component
50
57
  };
58
+ var pickerContainerStyles = css({
59
+ position: 'relative'
60
+ });
61
+ var iconContainerStyles = css({
62
+ display: 'flex',
63
+ height: '100%',
64
+ position: 'absolute',
65
+ alignItems: 'center',
66
+ flexBasis: 'inherit',
67
+ color: "var(--ds-text-subtlest, ".concat(N70, ")"),
68
+ insetBlockStart: 0,
69
+ insetInlineEnd: 0,
70
+ transition: "color 150ms",
71
+ '&:hover': {
72
+ color: "var(--ds-text-subtle, ".concat(N500, ")")
73
+ }
74
+ });
75
+ var iconSpacingWithClearButtonStyles = css({
76
+ marginInlineEnd: "var(--ds-space-400, 2rem)"
77
+ });
78
+ var iconSpacingWithoutClearButtonStyles = css({
79
+ marginInlineEnd: "var(--ds-space-025, 0.125rem)"
80
+ });
81
+ var calendarButtonStyles = xcss({
82
+ borderRadius: 'border.radius',
83
+ ':hover': {
84
+ backgroundColor: 'color.background.neutral.subtle.hovered'
85
+ },
86
+ ':active': {
87
+ backgroundColor: 'color.background.neutral.subtle.pressed'
88
+ }
89
+ });
51
90
  var DatePickerComponent = /*#__PURE__*/function (_Component) {
52
91
  _inherits(DatePickerComponent, _Component);
53
92
  var _super = _createSuper(DatePickerComponent);
@@ -57,6 +96,8 @@ var DatePickerComponent = /*#__PURE__*/function (_Component) {
57
96
  _classCallCheck(this, DatePickerComponent);
58
97
  _this = _super.call(this, props);
59
98
  _defineProperty(_assertThisInitialized(_this), "containerRef", null);
99
+ _defineProperty(_assertThisInitialized(_this), "calendarRef", /*#__PURE__*/createRef());
100
+ _defineProperty(_assertThisInitialized(_this), "calendarButtonRef", /*#__PURE__*/createRef());
60
101
  // All state needs to be accessed via this function so that the state is mapped from props
61
102
  // correctly to allow controlled/uncontrolled usage.
62
103
  _defineProperty(_assertThisInitialized(_this), "getValue", function () {
@@ -76,23 +117,30 @@ var DatePickerComponent = /*#__PURE__*/function (_Component) {
76
117
  });
77
118
  });
78
119
  _defineProperty(_assertThisInitialized(_this), "onCalendarSelect", function (_ref2) {
79
- var _this$containerRef;
80
120
  var iso = _ref2.iso;
81
121
  _this.setState({
82
122
  selectInputValue: '',
83
123
  isOpen: false,
84
124
  calendarValue: iso,
85
- value: iso
125
+ value: iso,
126
+ wasOpenedFromCalendarButton: false
86
127
  });
87
128
  _this.props.onChange(iso);
88
129
 
89
- // Not ideal, and the alternative is to place a ref on the inner input of the Select
90
- // but that would require a lot of extra work on the Select component just for this
91
- // focus functionality. While that would be the 'right react' way to do it, it doesnt
92
- // post any other benefits; performance wise, we are only searching within the
93
- // container, making it quick.
94
- var innerCombobox = (_this$containerRef = _this.containerRef) === null || _this$containerRef === void 0 ? void 0 : _this$containerRef.querySelector('[role="combobox"]');
95
- innerCombobox === null || innerCombobox === void 0 || innerCombobox.focus();
130
+ // Yes, this is not ideal. The alternative is to be able to place a ref
131
+ // on the inner input of Select itself, which would require a lot of
132
+ // extra stuff in the Select component for only this one thing. While
133
+ // this would be more "React-y", it doesn't seem to pose any other
134
+ // benefits. Performance-wise, we are only searching within the
135
+ // container, so it's quick.
136
+ if (_this.state.wasOpenedFromCalendarButton) {
137
+ var _this$calendarButtonR;
138
+ (_this$calendarButtonR = _this.calendarButtonRef.current) === null || _this$calendarButtonR === void 0 || _this$calendarButtonR.focus();
139
+ } else {
140
+ var _this$containerRef;
141
+ var innerCombobox = (_this$containerRef = _this.containerRef) === null || _this$containerRef === void 0 ? void 0 : _this$containerRef.querySelector('[role="combobox"]');
142
+ innerCombobox === null || innerCombobox === void 0 || innerCombobox.focus();
143
+ }
96
144
  _this.setState({
97
145
  isOpen: false
98
146
  });
@@ -100,7 +148,8 @@ var DatePickerComponent = /*#__PURE__*/function (_Component) {
100
148
  _defineProperty(_assertThisInitialized(_this), "onInputClick", function () {
101
149
  if (!_this.props.isDisabled && !_this.getIsOpen()) {
102
150
  _this.setState({
103
- isOpen: true
151
+ isOpen: true,
152
+ wasOpenedFromCalendarButton: false
104
153
  });
105
154
  }
106
155
  });
@@ -110,7 +159,8 @@ var DatePickerComponent = /*#__PURE__*/function (_Component) {
110
159
  if (!((_this$containerRef2 = _this.containerRef) !== null && _this$containerRef2 !== void 0 && _this$containerRef2.contains(newlyFocusedElement))) {
111
160
  _this.setState({
112
161
  isOpen: false,
113
- shouldSetFocusOnCurrentDay: false
162
+ shouldSetFocusOnCurrentDay: false,
163
+ wasOpenedFromCalendarButton: false
114
164
  });
115
165
  _this.props.onBlur(event);
116
166
  }
@@ -133,7 +183,8 @@ var DatePickerComponent = /*#__PURE__*/function (_Component) {
133
183
  // container. Makes keyboard accessibility of calendar possible
134
184
  _this.setState({
135
185
  isOpen: false,
136
- isFocused: false
186
+ isFocused: false,
187
+ wasOpenedFromCalendarButton: false
137
188
  });
138
189
  }
139
190
  });
@@ -147,9 +198,11 @@ var DatePickerComponent = /*#__PURE__*/function (_Component) {
147
198
  });
148
199
  } else {
149
200
  _this.setState({
150
- isOpen: true,
201
+ // Don't open when focused into via keyboard if the calendar button is present
202
+ isOpen: !_this.props.shouldShowCalendarButton,
151
203
  calendarValue: value,
152
- isFocused: true
204
+ isFocused: true,
205
+ wasOpenedFromCalendarButton: false
153
206
  });
154
207
  }
155
208
  _this.props.onFocus(event);
@@ -172,11 +225,11 @@ var DatePickerComponent = /*#__PURE__*/function (_Component) {
172
225
  }
173
226
  }
174
227
  _this.setState({
175
- isOpen: true
228
+ isOpen: true,
229
+ wasOpenedFromCalendarButton: false
176
230
  });
177
231
  });
178
232
  _defineProperty(_assertThisInitialized(_this), "onInputKeyDown", function (event) {
179
- var _this$containerRef4;
180
233
  var calendarValue = _this.state.calendarValue;
181
234
  var value = _this.getValue();
182
235
  var keyPressed = event.key.toLowerCase();
@@ -184,7 +237,8 @@ var DatePickerComponent = /*#__PURE__*/function (_Component) {
184
237
  // If the input is focused and the calendar is not visible, handle space and enter clicks
185
238
  if (!_this.state.isOpen && (keyPressed === 'enter' || keyPressed === ' ')) {
186
239
  _this.setState({
187
- isOpen: true
240
+ isOpen: true,
241
+ wasOpenedFromCalendarButton: false
188
242
  });
189
243
  }
190
244
  switch (keyPressed) {
@@ -195,11 +249,18 @@ var DatePickerComponent = /*#__PURE__*/function (_Component) {
195
249
  // this would be more "React-y", it doesn't seem to pose any other
196
250
  // benefits. Performance-wise, we are only searching within the
197
251
  // container, so it's quick.
198
- var innerCombobox = (_this$containerRef4 = _this.containerRef) === null || _this$containerRef4 === void 0 ? void 0 : _this$containerRef4.querySelector('[role="combobox"]');
199
- innerCombobox === null || innerCombobox === void 0 || innerCombobox.focus();
252
+ if (_this.state.wasOpenedFromCalendarButton) {
253
+ var _this$calendarButtonR2;
254
+ (_this$calendarButtonR2 = _this.calendarButtonRef.current) === null || _this$calendarButtonR2 === void 0 || _this$calendarButtonR2.focus();
255
+ } else {
256
+ var _this$containerRef4;
257
+ var innerCombobox = (_this$containerRef4 = _this.containerRef) === null || _this$containerRef4 === void 0 ? void 0 : _this$containerRef4.querySelector('[role="combobox"]');
258
+ innerCombobox === null || innerCombobox === void 0 || innerCombobox.focus();
259
+ }
200
260
  _this.setState({
201
261
  isOpen: false,
202
- shouldSetFocusOnCurrentDay: false
262
+ shouldSetFocusOnCurrentDay: false,
263
+ wasOpenedFromCalendarButton: false
203
264
  });
204
265
  break;
205
266
  case 'backspace':
@@ -234,7 +295,8 @@ var DatePickerComponent = /*#__PURE__*/function (_Component) {
234
295
  selectInputValue: '',
235
296
  isOpen: false,
236
297
  value: safeCalendarValue,
237
- calendarValue: safeCalendarValue
298
+ calendarValue: safeCalendarValue,
299
+ wasOpenedFromCalendarButton: false
238
300
  });
239
301
  if (valueChanged) {
240
302
  _this.props.onChange(safeCalendarValue);
@@ -253,6 +315,38 @@ var DatePickerComponent = /*#__PURE__*/function (_Component) {
253
315
  break;
254
316
  }
255
317
  });
318
+ _defineProperty(_assertThisInitialized(_this), "onCalendarButtonKeyDown", function (e) {
319
+ // We want to stop this from triggering other keydown events, particularly
320
+ // for space and enter presses. Otherwise, it opens and then closes
321
+ // immediately.
322
+ if (e.type === 'keydown') {
323
+ e.stopPropagation();
324
+ }
325
+ _this.setState({
326
+ isKeyDown: true,
327
+ wasOpenedFromCalendarButton: true
328
+ });
329
+ });
330
+ // This event handler is triggered from both keydown and click. It's weird.
331
+ _defineProperty(_assertThisInitialized(_this), "onCalendarButtonClick", function (e) {
332
+ _this.setState({
333
+ isOpen: !_this.state.isOpen,
334
+ wasOpenedFromCalendarButton: true
335
+ }, function () {
336
+ var _this$calendarRef;
337
+ // We don't want the focus to move if this is a click event
338
+ if (!_this.state.isKeyDown) {
339
+ return;
340
+ }
341
+ _this.setState({
342
+ isKeyDown: false
343
+ });
344
+
345
+ // Focus on the first button within the calendar
346
+ (_this$calendarRef = _this.calendarRef) === null || _this$calendarRef === void 0 || (_this$calendarRef = _this$calendarRef.current) === null || _this$calendarRef === void 0 || (_this$calendarRef = _this$calendarRef.querySelector('button')) === null || _this$calendarRef === void 0 || _this$calendarRef.focus();
347
+ });
348
+ e.stopPropagation();
349
+ });
256
350
  _defineProperty(_assertThisInitialized(_this), "onClear", function () {
257
351
  var changedState = {
258
352
  value: '',
@@ -294,6 +388,7 @@ var DatePickerComponent = /*#__PURE__*/function (_Component) {
294
388
  }
295
389
  });
296
390
  _this.state = {
391
+ isKeyDown: false,
297
392
  isOpen: _this.props.defaultIsOpen,
298
393
  isFocused: false,
299
394
  clearingFromIcon: false,
@@ -302,29 +397,36 @@ var DatePickerComponent = /*#__PURE__*/function (_Component) {
302
397
  calendarValue: _this.props.value || _this.props.defaultValue || getShortISOString(new Date()),
303
398
  l10n: createLocalizationProvider(_this.props.locale),
304
399
  locale: _this.props.locale,
305
- shouldSetFocusOnCurrentDay: false
400
+ shouldSetFocusOnCurrentDay: false,
401
+ wasOpenedFromCalendarButton: false
306
402
  };
307
403
  return _this;
308
404
  }
309
405
  _createClass(DatePickerComponent, [{
310
406
  key: "render",
311
407
  value: function render() {
408
+ var _this2 = this;
312
409
  var _this$props = this.props,
313
410
  _this$props$appearanc = _this$props.appearance,
314
411
  appearance = _this$props$appearanc === void 0 ? 'default' : _this$props$appearanc,
315
412
  ariaDescribedBy = _this$props['aria-describedby'],
316
413
  _this$props$autoFocus = _this$props.autoFocus,
317
414
  autoFocus = _this$props$autoFocus === void 0 ? false : _this$props$autoFocus,
318
- disabled = _this$props.disabled,
319
- disabledDateFilter = _this$props.disabledDateFilter,
320
415
  _this$props$hideIcon = _this$props.hideIcon,
321
416
  hideIcon = _this$props$hideIcon === void 0 ? false : _this$props$hideIcon,
417
+ _this$props$openCalen = _this$props.openCalendarLabel,
418
+ openCalendarLabel = _this$props$openCalen === void 0 ? 'Open calendar' : _this$props$openCalen,
419
+ disabled = _this$props.disabled,
420
+ disabledDateFilter = _this$props.disabledDateFilter,
322
421
  _this$props$icon = _this$props.icon,
323
422
  icon = _this$props$icon === void 0 ? CalendarIcon : _this$props$icon,
324
423
  _this$props$id = _this$props.id,
325
424
  id = _this$props$id === void 0 ? '' : _this$props$id,
326
425
  _this$props$innerProp = _this$props.innerProps,
327
426
  innerProps = _this$props$innerProp === void 0 ? {} : _this$props$innerProp,
427
+ _this$props$inputLabe = _this$props.inputLabel,
428
+ inputLabel = _this$props$inputLabe === void 0 ? 'Date picker' : _this$props$inputLabe,
429
+ inputLabelId = _this$props.inputLabelId,
328
430
  _this$props$isDisable = _this$props.isDisabled,
329
431
  isDisabled = _this$props$isDisable === void 0 ? false : _this$props$isDisable,
330
432
  _this$props$isInvalid = _this$props.isInvalid,
@@ -340,6 +442,7 @@ var DatePickerComponent = /*#__PURE__*/function (_Component) {
340
442
  previousMonthLabel = _this$props.previousMonthLabel,
341
443
  _this$props$selectPro3 = _this$props.selectProps,
342
444
  selectProps = _this$props$selectPro3 === void 0 ? {} : _this$props$selectPro3,
445
+ shouldShowCalendarButton = _this$props.shouldShowCalendarButton,
343
446
  _this$props$spacing = _this$props.spacing,
344
447
  spacing = _this$props$spacing === void 0 ? 'default' : _this$props$spacing,
345
448
  testId = _this$props.testId,
@@ -357,7 +460,7 @@ var DatePickerComponent = /*#__PURE__*/function (_Component) {
357
460
  lang: this.props.locale
358
461
  });
359
462
  var selectComponents = _objectSpread({
360
- DropdownIndicator: dropDownIcon,
463
+ DropdownIndicator: shouldShowCalendarButton ? EmptyComponent : dropDownIcon,
361
464
  Menu: Menu,
362
465
  SingleValue: SingleValue
363
466
  }, !showClearIndicator && {
@@ -375,6 +478,7 @@ var DatePickerComponent = /*#__PURE__*/function (_Component) {
375
478
  calendarDisabledDateFilter: disabledDateFilter,
376
479
  calendarMaxDate: maxDate,
377
480
  calendarMinDate: minDate,
481
+ calendarRef: this.calendarRef,
378
482
  calendarValue: value && getShortISOString(parseISO(value)),
379
483
  calendarView: calendarValue,
380
484
  onCalendarChange: this.onCalendarChange,
@@ -383,6 +487,8 @@ var DatePickerComponent = /*#__PURE__*/function (_Component) {
383
487
  calendarWeekStartDay: weekStartDay,
384
488
  shouldSetFocusOnCurrentDay: this.state.shouldSetFocusOnCurrentDay
385
489
  };
490
+
491
+ // @ts-ignore -- Argument of type 'StylesConfig<OptionType, false, GroupBase<OptionType>>' is not assignable to parameter of type 'StylesConfig<OptionType, boolean, GroupBase<OptionType>>'.
386
492
  var mergedStyles = mergeStyles(selectStyles, {
387
493
  control: function control(base) {
388
494
  return _objectSpread(_objectSpread({}, base), disabledStyle);
@@ -403,10 +509,14 @@ var DatePickerComponent = /*#__PURE__*/function (_Component) {
403
509
  }),
404
510
  value: value
405
511
  } : null;
512
+
513
+ // `label` takes precedence of the `inputLabel`
514
+ var fullopenCalendarLabel = label || inputLabel ? "".concat(label || inputLabel, " , ").concat(openCalendarLabel) : openCalendarLabel;
406
515
  return (
407
516
  // These event handlers must be on this element because the events come
408
517
  // from different child elements.
409
518
  jsx("div", _extends({}, innerProps, {
519
+ css: pickerContainerStyles,
410
520
  role: "presentation",
411
521
  onBlur: this.onContainerBlur,
412
522
  onFocus: this.onContainerFocus,
@@ -425,7 +535,14 @@ var DatePickerComponent = /*#__PURE__*/function (_Component) {
425
535
  "aria-describedby": ariaDescribedBy,
426
536
  "aria-label": label || undefined,
427
537
  autoFocus: autoFocus,
428
- closeMenuOnSelect: true,
538
+ closeMenuOnSelect: true
539
+ // FOr some reason, this and the below `styles` type error _only_ show
540
+ // up when you alter some of the properties in the `selectComponents`
541
+ // object. These errors are still present, and I suspect have always
542
+ // been present, without changing the unrelated code. Ignoring as the
543
+ // component still works as expected despite this error. And also
544
+ // because the select refresh team may solve it later.
545
+ ,
429
546
  components: selectComponents,
430
547
  enableAnimation: false,
431
548
  inputId: id,
@@ -450,6 +567,7 @@ var DatePickerComponent = /*#__PURE__*/function (_Component) {
450
567
  spacing: spacing,
451
568
  testId: testId
452
569
  // These aren't part of `Select`'s API, but we're using them here.
570
+ // @ts-ignore -- Property 'calendarContainerRef' does not exist on type 'IntrinsicAttributes & LibraryManagedAttributes<(<Option extends unknown = OptionType, IsMulti extends boolean = false>(props: AtlaskitSelectProps<Option, IsMulti> & { ...; }) => Element), AtlaskitSelectProps<...> & { ...; }>'.
453
571
  ,
454
572
  calendarContainerRef: calendarProps.calendarContainerRef,
455
573
  calendarDisabled: calendarProps.calendarDisabled,
@@ -457,6 +575,7 @@ var DatePickerComponent = /*#__PURE__*/function (_Component) {
457
575
  calendarLocale: calendarProps.calendarLocale,
458
576
  calendarMaxDate: calendarProps.calendarMaxDate,
459
577
  calendarMinDate: calendarProps.calendarMinDate,
578
+ calendarRef: calendarProps.calendarRef,
460
579
  calendarValue: calendarProps.calendarValue,
461
580
  calendarView: calendarProps.calendarView,
462
581
  calendarWeekStartDay: calendarProps.calendarWeekStartDay,
@@ -465,7 +584,32 @@ var DatePickerComponent = /*#__PURE__*/function (_Component) {
465
584
  onCalendarSelect: calendarProps.onCalendarSelect,
466
585
  previousMonthLabel: previousMonthLabel,
467
586
  shouldSetFocusOnCurrentDay: calendarProps.shouldSetFocusOnCurrentDay
468
- })))
587
+ })), shouldShowCalendarButton && !isDisabled ? jsx(UID, {
588
+ name: function name(id) {
589
+ return "open-calendar-label--".concat(id);
590
+ }
591
+ }, function (openCalendarLabelId) {
592
+ return jsx("div", {
593
+ css: [iconContainerStyles, value && !hideIcon ? iconSpacingWithClearButtonStyles : iconSpacingWithoutClearButtonStyles]
594
+ }, inputLabelId && jsx(VisuallyHidden, {
595
+ id: openCalendarLabelId
596
+ }, ", ", openCalendarLabel), jsx(Pressable, _extends({}, inputLabelId ? {
597
+ 'aria-labelledby': "".concat(inputLabelId, " ").concat(openCalendarLabelId)
598
+ } : {
599
+ 'aria-label': fullopenCalendarLabel
600
+ }, {
601
+ onClick: _this2.onCalendarButtonClick,
602
+ onKeyDown: _this2.onCalendarButtonKeyDown,
603
+ ref: _this2.calendarButtonRef,
604
+ testId: testId && "".concat(testId, "--open-calendar-button"),
605
+ type: "button",
606
+ backgroundColor: "color.background.neutral.subtle",
607
+ padding: "space.050",
608
+ xcss: calendarButtonStyles
609
+ }), jsx(CalendarIcon, {
610
+ label: ""
611
+ })));
612
+ }) : null)
469
613
  );
470
614
  }
471
615
  }], [{
@@ -28,7 +28,7 @@ import { convertTokens } from '../internal/parse-tokens';
28
28
  import DatePicker from './date-picker';
29
29
  import TimePicker from './time-picker';
30
30
  var packageName = "@atlaskit/datetime-picker";
31
- var packageVersion = "15.1.3";
31
+ var packageVersion = "15.2.0";
32
32
  // Make DatePicker 50% the width of DateTimePicker
33
33
  // If rendering an icon container, shrink the TimePicker
34
34
  var datePickerContainerStyles = css({
@@ -347,6 +347,7 @@ var DateTimePickerComponent = /*#__PURE__*/function (_React$Component) {
347
347
  placeholder: datePickerProps.placeholder,
348
348
  previousMonthLabel: datePickerProps.previousMonthLabel,
349
349
  selectProps: mergedDatePickerSelectProps,
350
+ shouldShowCalendarButton: datePickerProps.shouldShowCalendarButton,
350
351
  spacing: datePickerProps.spacing || spacing,
351
352
  testId: testId && "".concat(testId, "--datepicker") || datePickerProps.testId,
352
353
  value: dateValue,
@@ -17,7 +17,7 @@ import parseTime from '../internal/parse-time';
17
17
  import { convertTokens } from '../internal/parse-tokens';
18
18
  import { makeSingleValue } from '../internal/single-value';
19
19
  var packageName = "@atlaskit/datetime-picker";
20
- var packageVersion = "15.1.3";
20
+ var packageVersion = "15.2.0";
21
21
  var menuStyles = {
22
22
  /* Need to remove default absolute positioning as that causes issues with position fixed */
23
23
  position: 'static',
@@ -271,6 +271,8 @@ var TimePicker = /*#__PURE__*/forwardRef(function (_ref, ref) {
271
271
  ClearIndicator: EmptyComponent
272
272
  });
273
273
  var renderIconContainer = Boolean(!hideIcon && value);
274
+
275
+ // @ts-ignore -- Argument of type 'StylesConfig<OptionType, false, GroupBase<OptionType>>' is not assignable to parameter of type 'StylesConfig<OptionType, boolean, GroupBase<OptionType>>'.
274
276
  var mergedStyles = mergeStyles(selectStyles, {
275
277
  control: function control(base) {
276
278
  return _objectSpread({}, base);
@@ -322,7 +324,7 @@ var TimePicker = /*#__PURE__*/forwardRef(function (_ref, ref) {
322
324
  value: initialValue,
323
325
  spacing: spacing
324
326
  // We need this to get things to work, even though it's not supported.
325
- // @ts-ignore
327
+ // @ts-ignore - https://product-fabric.atlassian.net/browse/DSP-21000
326
328
  ,
327
329
  fixedLayerRef: containerRef,
328
330
  isInvalid: isInvalid,
@@ -39,7 +39,9 @@ export var FixedLayerMenu = function FixedLayerMenu(_ref) {
39
39
  children = _ref.children,
40
40
  rest = _objectWithoutProperties(_ref, _excluded);
41
41
  return jsx(FixedLayer, {
42
- inputValue: selectProps.inputValue,
42
+ inputValue: selectProps.inputValue
43
+ //@ts-ignore react-select unsupported props
44
+ ,
43
45
  containerRef: selectProps.fixedLayerRef,
44
46
  content: jsx(components.Menu, _extends({}, rest, {
45
47
  // eslint-disable-next-line @atlaskit/design-system/no-unsafe-style-overrides, @atlaskit/ui-styling-standard/no-classname-prop
@@ -67,7 +69,9 @@ export var FixedLayerMenu = function FixedLayerMenu(_ref) {
67
69
  // eslint-disable-next-line @repo/internal/react/no-unsafe-overrides, @atlaskit/design-system/no-unsafe-style-overrides
68
70
  ,
69
71
  theme: theme
70
- }), children),
72
+ }), children)
73
+ //@ts-ignore react-select unsupported props
74
+ ,
71
75
  testId: selectProps.testId
72
76
  });
73
77
  };
@@ -65,6 +65,7 @@ export var Menu = function Menu(_ref) {
65
65
  onChange: selectProps.onCalendarChange,
66
66
  onSelect: selectProps.onCalendarSelect,
67
67
  previousMonthLabel: selectProps.previousMonthLabel,
68
+ ref: selectProps.calendarRef,
68
69
  selected: [selectProps.calendarValue],
69
70
  shouldSetFocusOnCurrentDay: selectProps.shouldSetFocusOnCurrentDay,
70
71
  locale: selectProps.calendarLocale,
@@ -9,6 +9,7 @@ import { type ActionMeta, type InputActionMeta } from '@atlaskit/select';
9
9
  import { type DatePickerBaseProps } from '../types';
10
10
  type DatePickerProps = typeof datePickerDefaultProps & DatePickerBaseProps;
11
11
  interface State {
12
+ isKeyDown: boolean;
12
13
  isOpen: boolean;
13
14
  /**
14
15
  * When being cleared from the icon the DatePicker is blurred.
@@ -23,6 +24,7 @@ interface State {
23
24
  l10n: LocalizationProvider;
24
25
  locale: string;
25
26
  shouldSetFocusOnCurrentDay: boolean;
27
+ wasOpenedFromCalendarButton: boolean;
26
28
  }
27
29
  declare const datePickerDefaultProps: {
28
30
  defaultIsOpen: boolean;
@@ -46,6 +48,8 @@ declare class DatePickerComponent extends Component<DatePickerProps, State> {
46
48
  onFocus: (_event: import("react").FocusEvent<HTMLInputElement>) => void;
47
49
  };
48
50
  containerRef: HTMLElement | null;
51
+ calendarRef: React.RefObject<HTMLDivElement | null>;
52
+ calendarButtonRef: React.RefObject<HTMLButtonElement>;
49
53
  constructor(props: any);
50
54
  static getDerivedStateFromProps(nextProps: Readonly<DatePickerProps>, prevState: State): {
51
55
  l10n: LocalizationProvider;
@@ -66,6 +70,8 @@ declare class DatePickerComponent extends Component<DatePickerProps, State> {
66
70
  onSelectFocus: (event: React.FocusEvent<HTMLInputElement>) => void;
67
71
  onTextInput: (event: React.ChangeEvent<HTMLInputElement>) => void;
68
72
  onInputKeyDown: (event: React.KeyboardEvent<HTMLElement>) => void;
73
+ onCalendarButtonKeyDown: (e: React.KeyboardEvent<HTMLButtonElement>) => void;
74
+ onCalendarButtonClick: (e: React.MouseEvent<HTMLButtonElement>) => void;
69
75
  onClear: () => void;
70
76
  onSelectChange: (_value: unknown, action: ActionMeta) => void;
71
77
  handleSelectInputChange: (selectInputValue: string, actionMeta: InputActionMeta) => void;
@@ -82,7 +88,7 @@ export { DatePickerComponent as DatePickerWithoutAnalytics };
82
88
  * - [Code](https://atlassian.design/components/datetime-picker/date-picker/code)
83
89
  * - [Usage](https://atlassian.design/components/datetime-picker/date-picker/usage)
84
90
  */
85
- declare const DatePicker: import("react").ForwardRefExoticComponent<Pick<Pick<Omit<DatePickerProps, keyof import("@atlaskit/analytics-next").WithAnalyticsEventsProps>, "parseInputValue" | "dateFormat" | "formatDisplayLabel" | "placeholder" | "testId" | "label" | "icon" | "appearance" | "selectProps" | "innerProps" | "isDisabled" | "id" | "aria-describedby" | "maxDate" | "minDate" | "nextMonthLabel" | "previousMonthLabel" | "weekStartDay" | "value" | "autoFocus" | "name" | "spacing" | "isInvalid" | "isOpen" | "hideIcon"> & Partial<Pick<Omit<DatePickerProps, keyof import("@atlaskit/analytics-next").WithAnalyticsEventsProps>, "disabled" | "defaultValue" | "onFocus" | "onBlur" | "onChange" | "disabledDateFilter" | "locale" | "defaultIsOpen">> & Partial<Pick<{
91
+ declare const DatePicker: import("react").ForwardRefExoticComponent<Pick<Pick<Omit<{
86
92
  defaultIsOpen: boolean;
87
93
  defaultValue: string;
88
94
  disabled: string[];
@@ -91,5 +97,23 @@ declare const DatePicker: import("react").ForwardRefExoticComponent<Pick<Pick<Om
91
97
  onBlur: (_event: React.FocusEvent<HTMLInputElement>) => void;
92
98
  onChange: (_value: string) => void;
93
99
  onFocus: (_event: React.FocusEvent<HTMLInputElement>) => void;
94
- }, never>> & import("react").RefAttributes<any> & import("@atlaskit/analytics-next").WithContextProps, "disabled" | "parseInputValue" | "dateFormat" | "formatDisplayLabel" | "placeholder" | "testId" | "label" | "icon" | "appearance" | "selectProps" | "innerProps" | "isDisabled" | "key" | "defaultValue" | "id" | "aria-describedby" | "onFocus" | "onBlur" | "onChange" | "disabledDateFilter" | "maxDate" | "minDate" | "nextMonthLabel" | "previousMonthLabel" | "locale" | "analyticsContext" | "weekStartDay" | "value" | "autoFocus" | "name" | "spacing" | "isInvalid" | "defaultIsOpen" | "isOpen" | "hideIcon"> & import("react").RefAttributes<any>>;
100
+ } & DatePickerBaseProps, keyof import("@atlaskit/analytics-next").WithAnalyticsEventsProps>, "parseInputValue" | "dateFormat" | "formatDisplayLabel" | "placeholder" | "testId" | "label" | "icon" | "appearance" | "selectProps" | "innerProps" | "isDisabled" | "id" | "aria-describedby" | "maxDate" | "minDate" | "nextMonthLabel" | "previousMonthLabel" | "weekStartDay" | "value" | "autoFocus" | "isInvalid" | "name" | "spacing" | "isOpen" | "inputLabel" | "inputLabelId" | "openCalendarLabel" | "shouldShowCalendarButton" | "hideIcon"> & Partial<Pick<Omit<{
101
+ defaultIsOpen: boolean;
102
+ defaultValue: string;
103
+ disabled: string[];
104
+ disabledDateFilter: (_: string) => boolean;
105
+ locale: string;
106
+ onBlur: (_event: React.FocusEvent<HTMLInputElement>) => void;
107
+ onChange: (_value: string) => void;
108
+ onFocus: (_event: React.FocusEvent<HTMLInputElement>) => void;
109
+ } & DatePickerBaseProps, keyof import("@atlaskit/analytics-next").WithAnalyticsEventsProps>, "disabled" | "defaultValue" | "onFocus" | "onBlur" | "onChange" | "disabledDateFilter" | "locale" | "defaultIsOpen">> & Partial<Pick<{
110
+ defaultIsOpen: boolean;
111
+ defaultValue: string;
112
+ disabled: string[];
113
+ disabledDateFilter: (_: string) => boolean;
114
+ locale: string;
115
+ onBlur: (_event: React.FocusEvent<HTMLInputElement>) => void;
116
+ onChange: (_value: string) => void;
117
+ onFocus: (_event: React.FocusEvent<HTMLInputElement>) => void;
118
+ }, never>> & import("react").RefAttributes<any> & import("@atlaskit/analytics-next").WithContextProps, "disabled" | "parseInputValue" | "dateFormat" | "formatDisplayLabel" | "placeholder" | "testId" | "label" | "icon" | "appearance" | "selectProps" | "innerProps" | "isDisabled" | "key" | "defaultValue" | "id" | "aria-describedby" | "onFocus" | "onBlur" | "onChange" | "disabledDateFilter" | "maxDate" | "minDate" | "nextMonthLabel" | "previousMonthLabel" | "locale" | "analyticsContext" | "weekStartDay" | "value" | "autoFocus" | "isInvalid" | "name" | "spacing" | "defaultIsOpen" | "isOpen" | "inputLabel" | "inputLabelId" | "openCalendarLabel" | "shouldShowCalendarButton" | "hideIcon"> & import("react").RefAttributes<any>>;
95
119
  export default DatePicker;
@@ -52,5 +52,5 @@ export { DateTimePickerComponent as DateTimePickerWithoutAnalytics };
52
52
  * - [Code](https://atlassian.design/components/datetime-picker/code)
53
53
  * - [Usage](https://atlassian.design/components/datetime-picker/usage)
54
54
  */
55
- declare const DateTimePicker: React.ForwardRefExoticComponent<Pick<Pick<Pick<Omit<DateTimePickerBaseProps, keyof import("@atlaskit/analytics-next").WithAnalyticsEventsProps>, never> & Partial<Pick<Omit<DateTimePickerBaseProps, keyof import("@atlaskit/analytics-next").WithAnalyticsEventsProps>, "testId" | "appearance" | "innerProps" | "isDisabled" | "defaultValue" | "id" | "aria-describedby" | "onFocus" | "onBlur" | "onChange" | "locale" | "value" | "autoFocus" | "name" | "spacing" | "isInvalid" | "clearControlLabel" | "datePickerProps" | "timePickerProps" | "parseValue">> & Partial<Pick<DateTimePickerBaseProps, "ref" | "createAnalyticsEvent">>, "testId" | "appearance" | "innerProps" | "isDisabled" | "defaultValue" | "id" | "aria-describedby" | "onFocus" | "onBlur" | "onChange" | "locale" | "createAnalyticsEvent" | "value" | "autoFocus" | "name" | "spacing" | "isInvalid" | "clearControlLabel" | "datePickerProps" | "timePickerProps" | "parseValue"> & React.RefAttributes<any> & import("@atlaskit/analytics-next").WithContextProps, "testId" | "appearance" | "innerProps" | "isDisabled" | "key" | "defaultValue" | "id" | "aria-describedby" | "onFocus" | "onBlur" | "onChange" | "locale" | "analyticsContext" | "createAnalyticsEvent" | "value" | "autoFocus" | "name" | "spacing" | "isInvalid" | "clearControlLabel" | "datePickerProps" | "timePickerProps" | "parseValue"> & React.RefAttributes<any>>;
55
+ declare const DateTimePicker: React.ForwardRefExoticComponent<Pick<Pick<Pick<Omit<DateTimePickerBaseProps, keyof import("@atlaskit/analytics-next").WithAnalyticsEventsProps>, never> & Partial<Pick<Omit<DateTimePickerBaseProps, keyof import("@atlaskit/analytics-next").WithAnalyticsEventsProps>, "testId" | "appearance" | "innerProps" | "isDisabled" | "defaultValue" | "id" | "aria-describedby" | "onFocus" | "onBlur" | "onChange" | "locale" | "value" | "autoFocus" | "isInvalid" | "name" | "spacing" | "clearControlLabel" | "datePickerProps" | "timePickerProps" | "parseValue">> & Partial<Pick<DateTimePickerBaseProps, "ref" | "createAnalyticsEvent">>, "testId" | "appearance" | "innerProps" | "isDisabled" | "defaultValue" | "id" | "aria-describedby" | "onFocus" | "onBlur" | "onChange" | "locale" | "createAnalyticsEvent" | "value" | "autoFocus" | "isInvalid" | "name" | "spacing" | "clearControlLabel" | "datePickerProps" | "timePickerProps" | "parseValue"> & React.RefAttributes<any> & import("@atlaskit/analytics-next").WithContextProps, "testId" | "appearance" | "innerProps" | "isDisabled" | "key" | "defaultValue" | "id" | "aria-describedby" | "onFocus" | "onBlur" | "onChange" | "locale" | "analyticsContext" | "createAnalyticsEvent" | "value" | "autoFocus" | "isInvalid" | "name" | "spacing" | "clearControlLabel" | "datePickerProps" | "timePickerProps" | "parseValue"> & React.RefAttributes<any>>;
56
56
  export default DateTimePicker;
@@ -9,5 +9,5 @@ import { type TimePickerBaseProps } from '../types';
9
9
  * - [Code](https://atlassian.design/components/datetime-picker/time-picker/code)
10
10
  * - [Usage](https://atlassian.design/components/datetime-picker/time-picker/usage)
11
11
  */
12
- declare const TimePicker: React.ForwardRefExoticComponent<Pick<TimePickerBaseProps, "times" | "parseInputValue" | "formatDisplayLabel" | "placeholder" | "testId" | "label" | "appearance" | "selectProps" | "innerProps" | "isDisabled" | "defaultValue" | "id" | "aria-describedby" | "onFocus" | "onBlur" | "onChange" | "locale" | "createAnalyticsEvent" | "value" | "autoFocus" | "name" | "spacing" | "isInvalid" | "defaultIsOpen" | "isOpen" | "hideIcon" | "timeIsEditable" | "timeFormat"> & React.RefAttributes<unknown>>;
12
+ declare const TimePicker: React.ForwardRefExoticComponent<Pick<TimePickerBaseProps, "times" | "parseInputValue" | "formatDisplayLabel" | "placeholder" | "testId" | "label" | "appearance" | "selectProps" | "innerProps" | "isDisabled" | "defaultValue" | "id" | "aria-describedby" | "onFocus" | "onBlur" | "onChange" | "locale" | "createAnalyticsEvent" | "value" | "autoFocus" | "isInvalid" | "name" | "spacing" | "defaultIsOpen" | "isOpen" | "hideIcon" | "timeIsEditable" | "timeFormat"> & React.RefAttributes<unknown>>;
13
13
  export default TimePicker;
@@ -142,6 +142,37 @@ export interface DatePickerBaseProps extends WithAnalyticsEventsProps, PickerSel
142
142
  * Called when the field is focused.
143
143
  */
144
144
  onFocus?: React.FocusEventHandler<HTMLInputElement>;
145
+ /**
146
+ * The name of the input, used when `shouldShowCalendarButton` is true. See `shouldShowCalendarButton` description for more details.
147
+ *
148
+ * @default 'Date picker'
149
+ */
150
+ inputLabel?: string;
151
+ /**
152
+ * The ID of the label for the input, used when `shouldShowCalendarButton` is
153
+ * true. See `shouldShowCalendarButton` description for more details.
154
+ */
155
+ inputLabelId?: string;
156
+ /**
157
+ * The label associated with the button to open the calendar, rendered via the
158
+ * `shouldShowCalendarButton` prop. If a `label` prop is provided, this
159
+ * calendar button label will be prefixed by the value of `label`. If no
160
+ * `label` prop is provided, this prefix should be manually added. For
161
+ * example,
162
+ *
163
+ * ```tsx
164
+ * <label id="label" htmlFor="datepicker">Desired Appointment Date</label>
165
+ * <DatePicker
166
+ * id="datepicker"
167
+ * shouldShowCalendarButton
168
+ * inputLabel="Desired Appointment Date"
169
+ * openCalendarLabel="open calendar"
170
+ * />
171
+ * ```
172
+ *
173
+ * @default 'open calendar'
174
+ */
175
+ openCalendarLabel?: string;
145
176
  /**
146
177
  * A function for parsing input characters and transforming them into a Date object.
147
178
  * By default parses the date string based off the locale.
@@ -155,6 +186,17 @@ export interface DatePickerBaseProps extends WithAnalyticsEventsProps, PickerSel
155
186
  * The aria-label attribute associated with the previous-month arrow.
156
187
  */
157
188
  previousMonthLabel?: string;
189
+ /**
190
+ * Provides a functional calendar button that opens the calendar picker that
191
+ * lives on the right side of the date picker.
192
+ *
193
+ * The accessible name for this button is caculated using either the `label`,
194
+ * `inputLabel`, or `inputLabelId` props, along with the `openCalendarLabel`
195
+ * prop.
196
+ *
197
+ * @default false
198
+ */
199
+ shouldShowCalendarButton?: boolean;
158
200
  /**
159
201
  * The spacing for the select control.
160
202
  *