@vitality-ds/components 4.11.0 → 4.12.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.
@@ -8,7 +8,7 @@ exports["default"] = void 0;
8
8
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
9
  var _react = require("react");
10
10
  var _logic = require("../logic");
11
- var useDatePicker = function useDatePicker(onChange, onSelectedDateChange, value) {
11
+ var useDatePicker = function useDatePicker(onChange, onSelectedDateChange, value, openCalendarOnFocus, onKeyDown) {
12
12
  var _useState = (0, _react.useState)(false),
13
13
  _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
14
14
  isOpen = _useState2[0],
@@ -32,8 +32,8 @@ var useDatePicker = function useDatePicker(onChange, onSelectedDateChange, value
32
32
  onChange((0, _logic.createEventObject)(event.target.value));
33
33
  setTextValue(event.target.value);
34
34
  };
35
- for (var _len = arguments.length, allowedElementIds = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
36
- allowedElementIds[_key - 3] = arguments[_key];
35
+ for (var _len = arguments.length, allowedElementIds = new Array(_len > 5 ? _len - 5 : 0), _key = 5; _key < _len; _key++) {
36
+ allowedElementIds[_key - 5] = arguments[_key];
37
37
  }
38
38
  var onInteractOutside = _logic.handleOnInteractOutside.apply(void 0, [setIsOpen].concat(allowedElementIds));
39
39
  var onIconButtonClick = function onIconButtonClick(e) {
@@ -41,7 +41,17 @@ var useDatePicker = function useDatePicker(onChange, onSelectedDateChange, value
41
41
  setIsOpen(!isOpen);
42
42
  };
43
43
  var onInputFocus = function onInputFocus() {
44
- return setIsOpen(true);
44
+ return setIsOpen(openCalendarOnFocus);
45
+ };
46
+ var onEscapeKeyDown = function onEscapeKeyDown() {
47
+ return setIsOpen(false);
48
+ };
49
+ var handleOnKeyDown = function handleOnKeyDown(event) {
50
+ onKeyDown(event);
51
+ // Close the calendar on tab press to avoid the focus being "stuck" in the calendar
52
+ if (event.key === "Tab") {
53
+ setIsOpen(false);
54
+ }
45
55
  };
46
56
  return {
47
57
  onCalendarCallbackValueChange: onCalendarCallbackValueChange,
@@ -50,7 +60,9 @@ var useDatePicker = function useDatePicker(onChange, onSelectedDateChange, value
50
60
  onIconButtonClick: onIconButtonClick,
51
61
  onInputFocus: onInputFocus,
52
62
  isOpen: isOpen,
53
- textValue: textValue
63
+ textValue: textValue,
64
+ onEscapeKeyDown: onEscapeKeyDown,
65
+ handleOnKeyDown: handleOnKeyDown
54
66
  };
55
67
  };
56
68
  var _default = exports["default"] = useDatePicker;
@@ -16,7 +16,7 @@ var _Calendar = _interopRequireDefault(require("./components/Calendar"));
16
16
  var _useDatePicker2 = _interopRequireDefault(require("./hooks/useDatePicker"));
17
17
  var _logic = require("./logic");
18
18
  var _styled = require("./styled");
19
- var _excluded = ["name", "value", "onChange", "minYear", "maxYear", "id", "disabled", "css", "style", "className", "as", "asChild", "calendarValue", "onSelectedDateChange", "showFirstDateInRangeOnOpen"];
19
+ var _excluded = ["name", "value", "onChange", "minYear", "maxYear", "id", "disabled", "css", "style", "className", "as", "asChild", "calendarValue", "openCalendarOnFocus", "onSelectedDateChange", "showFirstDateInRangeOnOpen", "onKeyDown"];
20
20
  var DatePicker = /*#__PURE__*/_react["default"].forwardRef(function (_ref, forwardedRef) {
21
21
  var name = _ref.name,
22
22
  value = _ref.value,
@@ -34,28 +34,37 @@ var DatePicker = /*#__PURE__*/_react["default"].forwardRef(function (_ref, forwa
34
34
  as = _ref.as,
35
35
  asChild = _ref.asChild,
36
36
  calendarValue = _ref.calendarValue,
37
+ _ref$openCalendarOnFo = _ref.openCalendarOnFocus,
38
+ openCalendarOnFocus = _ref$openCalendarOnFo === void 0 ? true : _ref$openCalendarOnFo,
37
39
  _ref$onSelectedDateCh = _ref.onSelectedDateChange,
38
40
  onSelectedDateChange = _ref$onSelectedDateCh === void 0 ? function () {
39
41
  return null;
40
42
  } : _ref$onSelectedDateCh,
41
43
  _ref$showFirstDateInR = _ref.showFirstDateInRangeOnOpen,
42
44
  showFirstDateInRangeOnOpen = _ref$showFirstDateInR === void 0 ? false : _ref$showFirstDateInR,
45
+ _ref$onKeyDown = _ref.onKeyDown,
46
+ onKeyDown = _ref$onKeyDown === void 0 ? function () {
47
+ return null;
48
+ } : _ref$onKeyDown,
43
49
  restProps = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
44
50
  var currentTime = _luxon.DateTime.now();
45
51
  var iconButtonId = "".concat(id, "IconButton");
46
- var _useDatePicker = (0, _useDatePicker2["default"])(onChange, onSelectedDateChange, value, id, iconButtonId),
52
+ var _useDatePicker = (0, _useDatePicker2["default"])(onChange, onSelectedDateChange, value, openCalendarOnFocus, onKeyDown, id, iconButtonId),
47
53
  onCalendarCallbackValueChange = _useDatePicker.onCalendarCallbackValueChange,
48
54
  onTextInputValueChange = _useDatePicker.onTextInputValueChange,
49
55
  onInteractOutside = _useDatePicker.onInteractOutside,
50
56
  onIconButtonClick = _useDatePicker.onIconButtonClick,
51
57
  onInputFocus = _useDatePicker.onInputFocus,
52
58
  isOpen = _useDatePicker.isOpen,
53
- textValue = _useDatePicker.textValue;
59
+ textValue = _useDatePicker.textValue,
60
+ onEscapeKeyDown = _useDatePicker.onEscapeKeyDown,
61
+ handleOnKeyDown = _useDatePicker.handleOnKeyDown;
54
62
  return /*#__PURE__*/_react["default"].createElement(_styled.BaseDatePicker, {
55
63
  ref: forwardedRef
56
64
  }, /*#__PURE__*/_react["default"].createElement(_Popover["default"], {
57
65
  isOpen: isOpen,
58
66
  onInteractOutside: onInteractOutside,
67
+ onEscapeKeyDown: onEscapeKeyDown,
59
68
  triggerElement: /*#__PURE__*/_react["default"].createElement(_TextInput["default"], (0, _extends2["default"])({
60
69
  autoComplete: "off",
61
70
  maskProps: {
@@ -66,6 +75,8 @@ var DatePicker = /*#__PURE__*/_react["default"].forwardRef(function (_ref, forwa
66
75
  props: {
67
76
  icon: /*#__PURE__*/_react["default"].createElement(_icons.Date, null),
68
77
  onClick: onIconButtonClick,
78
+ // Let the user tab to the next field without focusing the icon button
79
+ tabIndex: -1,
69
80
  tooltipContent: "Toggle calendar popover",
70
81
  disabled: disabled,
71
82
  id: iconButtonId
@@ -76,6 +87,7 @@ var DatePicker = /*#__PURE__*/_react["default"].forwardRef(function (_ref, forwa
76
87
  onFocus: onInputFocus,
77
88
  name: name,
78
89
  onChange: onTextInputValueChange,
90
+ onKeyDown: handleOnKeyDown,
79
91
  value: textValue || ""
80
92
  }, restProps)),
81
93
  content: /*#__PURE__*/_react["default"].createElement(_Calendar["default"], {
@@ -10,7 +10,7 @@ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/h
10
10
  var _react = _interopRequireDefault(require("react"));
11
11
  var _constants = require("../DropdownMenu/constants");
12
12
  var _styled = require("./styled");
13
- var _excluded = ["triggerElement", "content", "isOpen", "onInteractOutside", "side", "align"];
13
+ var _excluded = ["triggerElement", "content", "isOpen", "onInteractOutside", "side", "align", "onEscapeKeyDown"];
14
14
  function Popover(_ref) {
15
15
  var triggerElement = _ref.triggerElement,
16
16
  content = _ref.content,
@@ -18,6 +18,7 @@ function Popover(_ref) {
18
18
  onInteractOutside = _ref.onInteractOutside,
19
19
  side = _ref.side,
20
20
  align = _ref.align,
21
+ onEscapeKeyDown = _ref.onEscapeKeyDown,
21
22
  restProps = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
22
23
  return /*#__PURE__*/_react["default"].createElement(_styled.PopoverRoot, (0, _extends2["default"])({
23
24
  open: isOpen
@@ -30,7 +31,8 @@ function Popover(_ref) {
30
31
  onInteractOutside: onInteractOutside,
31
32
  onOpenAutoFocus: function onOpenAutoFocus(event) {
32
33
  return event.preventDefault();
33
- }
34
+ },
35
+ onEscapeKeyDown: onEscapeKeyDown
34
36
  }, content));
35
37
  }
36
38
  var _default = exports["default"] = Popover;
@@ -1,7 +1,7 @@
1
1
  import { MouseEvent } from "react";
2
2
  import { RadixOnInteractOutsideEvent } from "../../../Popover/types";
3
3
  import { OnChangeReturnType } from "../types";
4
- declare const useDatePicker: (onChange: (value: OnChangeReturnType) => string | void, onSelectedDateChange: () => void, value: string, ...allowedElementIds: any[]) => {
4
+ declare const useDatePicker: (onChange: (value: OnChangeReturnType) => string | void, onSelectedDateChange: () => void, value: string, openCalendarOnFocus: boolean, onKeyDown: (event: React.KeyboardEvent) => void, ...allowedElementIds: any[]) => {
5
5
  onCalendarCallbackValueChange: (newValue: unknown) => void;
6
6
  onTextInputValueChange: (string: any) => unknown;
7
7
  onInteractOutside: (event: RadixOnInteractOutsideEvent) => void;
@@ -9,5 +9,7 @@ declare const useDatePicker: (onChange: (value: OnChangeReturnType) => string |
9
9
  onInputFocus: () => void;
10
10
  isOpen: boolean;
11
11
  textValue: string;
12
+ onEscapeKeyDown: () => void;
13
+ handleOnKeyDown: (event: React.KeyboardEvent) => void;
12
14
  };
13
15
  export default useDatePicker;
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  import { ExcludedProps } from "@vitality-ds/system";
2
3
  import { TextInputProps } from "../TextInput/types";
3
4
  import { CalendarProps } from "./components/Calendar/types";
@@ -22,4 +23,14 @@ export declare type DatePickerProps = ExcludedProps & Omit<TextInputProps, "ador
22
23
  * The Function run when the date changes as a result of a calendar selection.
23
24
  */
24
25
  onSelectedDateChange?: () => void;
26
+ /**
27
+ * @default true
28
+ * If true, the calendar popover will open when the input is focused.
29
+ * If false, the calendar popover will not open on focus.
30
+ */
31
+ openCalendarOnFocus?: boolean;
32
+ /**
33
+ * The function run on key down in the input.
34
+ */
35
+ onKeyDown?: (event: React.KeyboardEvent) => void;
25
36
  };
@@ -1,4 +1,4 @@
1
1
  /// <reference types="react" />
2
2
  import { PopoverProps } from "./types";
3
- declare function Popover({ triggerElement, content, isOpen, onInteractOutside, side, align, ...restProps }: PopoverProps): JSX.Element;
3
+ declare function Popover({ triggerElement, content, isOpen, onInteractOutside, side, align, onEscapeKeyDown, ...restProps }: PopoverProps): JSX.Element;
4
4
  export default Popover;
@@ -32,5 +32,9 @@ export declare type PopoverProps = ExcludedProps & ComponentProps<typeof Popover
32
32
  * @default "center"
33
33
  */
34
34
  align?: PopoverContentProps["align"];
35
+ /**
36
+ * Function to run when the escape key is pressed while the popover is open.
37
+ */
38
+ onEscapeKeyDown?: PopoverContentProps["onEscapeKeyDown"];
35
39
  };
36
40
  export {};
@@ -1,7 +1,7 @@
1
1
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
2
  import { useCallback, useMemo, useState } from "react";
3
3
  import { convertISOToAusDate, createEventObject, handleOnInteractOutside } from "../logic";
4
- var useDatePicker = function useDatePicker(onChange, onSelectedDateChange, value) {
4
+ var useDatePicker = function useDatePicker(onChange, onSelectedDateChange, value, openCalendarOnFocus, onKeyDown) {
5
5
  var _useState = useState(false),
6
6
  _useState2 = _slicedToArray(_useState, 2),
7
7
  isOpen = _useState2[0],
@@ -25,8 +25,8 @@ var useDatePicker = function useDatePicker(onChange, onSelectedDateChange, value
25
25
  onChange(createEventObject(event.target.value));
26
26
  setTextValue(event.target.value);
27
27
  };
28
- for (var _len = arguments.length, allowedElementIds = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
29
- allowedElementIds[_key - 3] = arguments[_key];
28
+ for (var _len = arguments.length, allowedElementIds = new Array(_len > 5 ? _len - 5 : 0), _key = 5; _key < _len; _key++) {
29
+ allowedElementIds[_key - 5] = arguments[_key];
30
30
  }
31
31
  var onInteractOutside = handleOnInteractOutside.apply(void 0, [setIsOpen].concat(allowedElementIds));
32
32
  var onIconButtonClick = function onIconButtonClick(e) {
@@ -34,7 +34,17 @@ var useDatePicker = function useDatePicker(onChange, onSelectedDateChange, value
34
34
  setIsOpen(!isOpen);
35
35
  };
36
36
  var onInputFocus = function onInputFocus() {
37
- return setIsOpen(true);
37
+ return setIsOpen(openCalendarOnFocus);
38
+ };
39
+ var onEscapeKeyDown = function onEscapeKeyDown() {
40
+ return setIsOpen(false);
41
+ };
42
+ var handleOnKeyDown = function handleOnKeyDown(event) {
43
+ onKeyDown(event);
44
+ // Close the calendar on tab press to avoid the focus being "stuck" in the calendar
45
+ if (event.key === "Tab") {
46
+ setIsOpen(false);
47
+ }
38
48
  };
39
49
  return {
40
50
  onCalendarCallbackValueChange: onCalendarCallbackValueChange,
@@ -43,7 +53,9 @@ var useDatePicker = function useDatePicker(onChange, onSelectedDateChange, value
43
53
  onIconButtonClick: onIconButtonClick,
44
54
  onInputFocus: onInputFocus,
45
55
  isOpen: isOpen,
46
- textValue: textValue
56
+ textValue: textValue,
57
+ onEscapeKeyDown: onEscapeKeyDown,
58
+ handleOnKeyDown: handleOnKeyDown
47
59
  };
48
60
  };
49
61
  export default useDatePicker;
@@ -1,6 +1,6 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
3
- var _excluded = ["name", "value", "onChange", "minYear", "maxYear", "id", "disabled", "css", "style", "className", "as", "asChild", "calendarValue", "onSelectedDateChange", "showFirstDateInRangeOnOpen"];
3
+ var _excluded = ["name", "value", "onChange", "minYear", "maxYear", "id", "disabled", "css", "style", "className", "as", "asChild", "calendarValue", "openCalendarOnFocus", "onSelectedDateChange", "showFirstDateInRangeOnOpen", "onKeyDown"];
4
4
  import { Date } from "@vitality-ds/icons";
5
5
  import { DateTime } from "luxon";
6
6
  import React from "react";
@@ -27,28 +27,37 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (_ref, forwardedRef) {
27
27
  as = _ref.as,
28
28
  asChild = _ref.asChild,
29
29
  calendarValue = _ref.calendarValue,
30
+ _ref$openCalendarOnFo = _ref.openCalendarOnFocus,
31
+ openCalendarOnFocus = _ref$openCalendarOnFo === void 0 ? true : _ref$openCalendarOnFo,
30
32
  _ref$onSelectedDateCh = _ref.onSelectedDateChange,
31
33
  onSelectedDateChange = _ref$onSelectedDateCh === void 0 ? function () {
32
34
  return null;
33
35
  } : _ref$onSelectedDateCh,
34
36
  _ref$showFirstDateInR = _ref.showFirstDateInRangeOnOpen,
35
37
  showFirstDateInRangeOnOpen = _ref$showFirstDateInR === void 0 ? false : _ref$showFirstDateInR,
38
+ _ref$onKeyDown = _ref.onKeyDown,
39
+ onKeyDown = _ref$onKeyDown === void 0 ? function () {
40
+ return null;
41
+ } : _ref$onKeyDown,
36
42
  restProps = _objectWithoutProperties(_ref, _excluded);
37
43
  var currentTime = DateTime.now();
38
44
  var iconButtonId = "".concat(id, "IconButton");
39
- var _useDatePicker = useDatePicker(onChange, onSelectedDateChange, value, id, iconButtonId),
45
+ var _useDatePicker = useDatePicker(onChange, onSelectedDateChange, value, openCalendarOnFocus, onKeyDown, id, iconButtonId),
40
46
  onCalendarCallbackValueChange = _useDatePicker.onCalendarCallbackValueChange,
41
47
  onTextInputValueChange = _useDatePicker.onTextInputValueChange,
42
48
  onInteractOutside = _useDatePicker.onInteractOutside,
43
49
  onIconButtonClick = _useDatePicker.onIconButtonClick,
44
50
  onInputFocus = _useDatePicker.onInputFocus,
45
51
  isOpen = _useDatePicker.isOpen,
46
- textValue = _useDatePicker.textValue;
52
+ textValue = _useDatePicker.textValue,
53
+ onEscapeKeyDown = _useDatePicker.onEscapeKeyDown,
54
+ handleOnKeyDown = _useDatePicker.handleOnKeyDown;
47
55
  return /*#__PURE__*/React.createElement(BaseDatePicker, {
48
56
  ref: forwardedRef
49
57
  }, /*#__PURE__*/React.createElement(Popover, {
50
58
  isOpen: isOpen,
51
59
  onInteractOutside: onInteractOutside,
60
+ onEscapeKeyDown: onEscapeKeyDown,
52
61
  triggerElement: /*#__PURE__*/React.createElement(TextInput, _extends({
53
62
  autoComplete: "off",
54
63
  maskProps: {
@@ -59,6 +68,8 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (_ref, forwardedRef) {
59
68
  props: {
60
69
  icon: /*#__PURE__*/React.createElement(Date, null),
61
70
  onClick: onIconButtonClick,
71
+ // Let the user tab to the next field without focusing the icon button
72
+ tabIndex: -1,
62
73
  tooltipContent: "Toggle calendar popover",
63
74
  disabled: disabled,
64
75
  id: iconButtonId
@@ -69,6 +80,7 @@ var DatePicker = /*#__PURE__*/React.forwardRef(function (_ref, forwardedRef) {
69
80
  onFocus: onInputFocus,
70
81
  name: name,
71
82
  onChange: onTextInputValueChange,
83
+ onKeyDown: handleOnKeyDown,
72
84
  value: textValue || ""
73
85
  }, restProps)),
74
86
  content: /*#__PURE__*/React.createElement(Calendar, {
@@ -1,6 +1,6 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
3
- var _excluded = ["triggerElement", "content", "isOpen", "onInteractOutside", "side", "align"];
3
+ var _excluded = ["triggerElement", "content", "isOpen", "onInteractOutside", "side", "align", "onEscapeKeyDown"];
4
4
  import React from "react";
5
5
  import { FLOATING_ELEMENT_SIDE_OFFSET } from "../DropdownMenu/constants";
6
6
  import { PopoverContent, PopoverRoot, PopoverTrigger } from "./styled";
@@ -11,6 +11,7 @@ function Popover(_ref) {
11
11
  onInteractOutside = _ref.onInteractOutside,
12
12
  side = _ref.side,
13
13
  align = _ref.align,
14
+ onEscapeKeyDown = _ref.onEscapeKeyDown,
14
15
  restProps = _objectWithoutProperties(_ref, _excluded);
15
16
  return /*#__PURE__*/React.createElement(PopoverRoot, _extends({
16
17
  open: isOpen
@@ -23,7 +24,8 @@ function Popover(_ref) {
23
24
  onInteractOutside: onInteractOutside,
24
25
  onOpenAutoFocus: function onOpenAutoFocus(event) {
25
26
  return event.preventDefault();
26
- }
27
+ },
28
+ onEscapeKeyDown: onEscapeKeyDown
27
29
  }, content));
28
30
  }
29
31
  export default Popover;