@planningcenter/tapestry-react 2.7.0 → 2.8.1

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 (39) hide show
  1. package/dist/cjs/Button/Button.js +10 -13
  2. package/dist/cjs/Button/Button.test.js +53 -21
  3. package/dist/cjs/Calendar/Calendar.js +30 -25
  4. package/dist/cjs/Combobox/ComboboxInput.js +41 -37
  5. package/dist/cjs/DateField/DateField.js +78 -47
  6. package/dist/cjs/DateField/parse.js +106 -0
  7. package/dist/cjs/DateField/parse.test.js +46 -0
  8. package/dist/cjs/DateField/useArrowKeysToNavigateCalendar.js +44 -0
  9. package/dist/cjs/DateField/useEditableDate.js +72 -0
  10. package/dist/cjs/Select/Select.test.js +74 -0
  11. package/dist/esm/Button/Button.js +10 -13
  12. package/dist/esm/Button/Button.test.js +58 -26
  13. package/dist/esm/Calendar/Calendar.js +30 -25
  14. package/dist/esm/Combobox/ComboboxInput.js +40 -37
  15. package/dist/esm/DateField/DateField.js +79 -48
  16. package/dist/esm/DateField/parse.js +93 -0
  17. package/dist/esm/DateField/parse.test.js +42 -0
  18. package/dist/esm/DateField/useArrowKeysToNavigateCalendar.js +36 -0
  19. package/dist/esm/DateField/useEditableDate.js +62 -0
  20. package/dist/esm/Select/Select.test.js +59 -0
  21. package/dist/types/Button/Button.d.ts +1 -1
  22. package/dist/types/DateField/DateField.d.ts +48 -0
  23. package/dist/types/DateField/parse.d.ts +17 -0
  24. package/dist/types/DateField/parse.test.d.ts +1 -0
  25. package/dist/types/DateField/useArrowKeysToNavigateCalendar.d.ts +8 -0
  26. package/dist/types/DateField/useEditableDate.d.ts +25 -0
  27. package/dist/types/Select/Select.test.d.ts +1 -0
  28. package/package.json +3 -3
  29. package/src/Button/Button.test.tsx +32 -8
  30. package/src/Button/Button.tsx +8 -9
  31. package/src/Calendar/Calendar.js +22 -17
  32. package/src/Combobox/ComboboxInput.js +76 -62
  33. package/src/DateField/DateField.mdx +15 -0
  34. package/src/DateField/{DateField.js → DateField.tsx} +104 -52
  35. package/src/DateField/parse.test.ts +76 -0
  36. package/src/DateField/parse.ts +92 -0
  37. package/src/DateField/useArrowKeysToNavigateCalendar.ts +54 -0
  38. package/src/DateField/useEditableDate.ts +81 -0
  39. package/src/Select/Select.test.tsx +58 -0
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+
3
+ var _dateFns = require("date-fns");
4
+
5
+ var _parse = require("./parse");
6
+
7
+ describe('isValidDate', function () {
8
+ var validDates = ['jun 6, 2022', 'June-06-2022', '6-6-2022', '6/6/2022', '06-06-2022', '2022-06-26', // year, month, day
9
+ '2022/6/1' // year, month, day
10
+ ];
11
+ validDates.forEach(function (date) {
12
+ it("returns true for \"" + date + "\"", function () {
13
+ expect((0, _parse.isValidDate)(date)).toBe(true);
14
+ });
15
+ });
16
+ var invalidDates = ['June-06-22', '13-6-2022', 'June 6 2022', '2022/6/1/1', '2022-15-06'];
17
+ invalidDates.forEach(function (date) {
18
+ it("returns false for \"" + date + "\"", function () {
19
+ expect((0, _parse.isValidDate)(date)).toBe(false);
20
+ });
21
+ });
22
+ });
23
+ describe('parseDate', function () {
24
+ var dates = [['January 31, 2022', 'January 31, 2022'], ['jun 9, 2022', 'June 09, 2022'], ['June-09-2022', 'June 09, 2022'], ['6-9-2022', 'June 09, 2022'], ['6/9/2022', 'June 09, 2022'], ['06-09-2022', 'June 09, 2022'], ['2022-06-26', 'June 26, 2022'], ['2022/6/1', 'June 01, 2022', 'MMMM dd, yyyy'], ['15/6/2022', 'June 15, 2022', 'dd/MM/YYYY'], ['1/6/2022', 'June 01, 2022', 'dd MMMM, yyyy'], ['15-aug-2023', 'August 15, 2023', 'dd MMMM, yyyy'], ['15 August, 2023', 'August 15, 2023', 'dd MMMM, yyyy']];
25
+ dates.forEach(function (_ref) {
26
+ var date = _ref[0],
27
+ expected = _ref[1],
28
+ dateFormat = _ref[2];
29
+ it("returns " + expected + " for \"" + date + "\"", function () {
30
+ expect((0, _dateFns.format)((0, _parse.parseDate)({
31
+ date: date,
32
+ format: dateFormat
33
+ }), 'MMMM dd, yyyy')).toEqual(expected);
34
+ });
35
+ });
36
+ });
37
+ describe('parseMonth', function () {
38
+ var months = [['jan', 1], ['feb', 2], ['December', 12], ['2', 2], ['12', 12], ['05', 5]];
39
+ months.forEach(function (_ref2) {
40
+ var month = _ref2[0],
41
+ expected = _ref2[1];
42
+ it("returns " + expected + " for \"" + month + "\"", function () {
43
+ expect((0, _parse.parseMonth)(month)).toBe(expected);
44
+ });
45
+ });
46
+ });
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.useArrowKeysToNavigateCalendar = void 0;
5
+
6
+ var _react = require("react");
7
+
8
+ var useArrowKeysToNavigateCalendar = function useArrowKeysToNavigateCalendar(_ref) {
9
+ var date = _ref.date,
10
+ calendarIsOpen = _ref.calendarIsOpen,
11
+ openCalendar = _ref.openCalendar,
12
+ onChange = _ref.onChange;
13
+ var incrementDate = (0, _react.useCallback)(function (by) {
14
+ if (!date) return;
15
+ var newDate = new Date(date);
16
+ newDate.setDate(newDate.getDate() + by);
17
+ onChange(newDate);
18
+ }, [date, onChange]);
19
+ var handleInputKeyDown = (0, _react.useCallback)(function (event) {
20
+ if (calendarIsOpen) {
21
+ if (event.key === 'ArrowUp') {
22
+ event.preventDefault();
23
+ incrementDate(-7);
24
+ } else if (event.key === 'ArrowDown') {
25
+ event.preventDefault();
26
+ incrementDate(7);
27
+ } else if (event.key === 'ArrowLeft') {
28
+ event.preventDefault();
29
+ incrementDate(-1);
30
+ } else if (event.key === 'ArrowRight') {
31
+ event.preventDefault();
32
+ incrementDate(1);
33
+ }
34
+ } else {
35
+ if (event.key === 'ArrowDown') {
36
+ event.preventDefault();
37
+ openCalendar();
38
+ }
39
+ }
40
+ }, [calendarIsOpen, openCalendar, incrementDate]);
41
+ return handleInputKeyDown;
42
+ };
43
+
44
+ exports.useArrowKeysToNavigateCalendar = useArrowKeysToNavigateCalendar;
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.useEditableDate = void 0;
5
+
6
+ var _react = require("react");
7
+
8
+ var _dateFns = require("date-fns");
9
+
10
+ var _parse = require("./parse");
11
+
12
+ var useEditableDate = function useEditableDate(_ref) {
13
+ var date = _ref.date,
14
+ dateFormat = _ref.dateFormat,
15
+ dateValidator = _ref.dateValidator,
16
+ onChange = _ref.onChange;
17
+
18
+ var _useState = (0, _react.useState)(),
19
+ keyBuffer = _useState[0],
20
+ setKeyBuffer = _useState[1];
21
+
22
+ var _useState2 = (0, _react.useState)(false),
23
+ invalidKeyBuffer = _useState2[0],
24
+ setInvalidKeyBuffer = _useState2[1];
25
+
26
+ var formattedDate = (0, _react.useMemo)(function () {
27
+ if (keyBuffer !== undefined) {
28
+ return keyBuffer;
29
+ } else {
30
+ return date ? (0, _dateFns.format)(date, dateFormat) : '';
31
+ }
32
+ }, [date, dateFormat, keyBuffer]);
33
+ var setKeyBufferAndValidate = (0, _react.useCallback)(function (value) {
34
+ setKeyBuffer(value);
35
+
36
+ if (value && !dateValidator((0, _parse.parseDate)({
37
+ date: value,
38
+ format: dateFormat
39
+ }))) {
40
+ setInvalidKeyBuffer(true);
41
+ } else {
42
+ setInvalidKeyBuffer(false);
43
+ }
44
+ }, [dateFormat, dateValidator]);
45
+ var setDate = (0, _react.useCallback)(function (date) {
46
+ var newDate;
47
+
48
+ if (typeof date === 'string') {
49
+ setKeyBufferAndValidate(date);
50
+ newDate = (0, _parse.parseDate)({
51
+ date: date,
52
+ format: dateFormat
53
+ });
54
+ } else {
55
+ setKeyBufferAndValidate(undefined);
56
+ newDate = date;
57
+ }
58
+
59
+ if (dateValidator(newDate) && onChange) onChange(newDate);
60
+ }, [onChange, setKeyBufferAndValidate, dateValidator, dateFormat]);
61
+ var clearKeyBuffer = (0, _react.useCallback)(function () {
62
+ setKeyBufferAndValidate(undefined);
63
+ }, []);
64
+ return {
65
+ formattedDate: formattedDate,
66
+ setDate: setDate,
67
+ clearKeyBuffer: clearKeyBuffer,
68
+ invalidKeyBuffer: invalidKeyBuffer
69
+ };
70
+ };
71
+
72
+ exports.useEditableDate = useEditableDate;
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
6
+
7
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
8
+
9
+ var _react = _interopRequireDefault(require("react"));
10
+
11
+ var _react2 = require("@testing-library/react");
12
+
13
+ var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
14
+
15
+ var _ = _interopRequireDefault(require("."));
16
+
17
+ var _ThemeProvider = require("../ThemeProvider/ThemeProvider");
18
+
19
+ var people = [{
20
+ first: 'Charlie',
21
+ last: 'Brown',
22
+ twitter: 'dancounsell',
23
+ active: true
24
+ }, {
25
+ first: 'Charlotte',
26
+ last: 'White',
27
+ twitter: 'mtnmissy',
28
+ active: true
29
+ }, {
30
+ first: 'John',
31
+ last: 'James',
32
+ twitter: 'miller',
33
+ active: false
34
+ }, {
35
+ first: 'Travis',
36
+ last: 'Arnold',
37
+ twitter: 'souporserious',
38
+ active: true
39
+ }];
40
+ var selectMock = jest.fn();
41
+ test('can click to select item from list', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
42
+ return _regenerator["default"].wrap(function _callee$(_context) {
43
+ while (1) {
44
+ switch (_context.prev = _context.next) {
45
+ case 0:
46
+ jest.useFakeTimers();
47
+ (0, _react2.render)( /*#__PURE__*/_react["default"].createElement(_ThemeProvider.ThemeProvider, null, /*#__PURE__*/_react["default"].createElement(_["default"], {
48
+ onChange: selectMock
49
+ }, people.map(function (p) {
50
+ return /*#__PURE__*/_react["default"].createElement(_["default"].Option, {
51
+ value: p.twitter,
52
+ key: p.twitter
53
+ }, p.first, " ", p.last);
54
+ }))));
55
+
56
+ _userEvent["default"].click(_react2.screen.getByRole('button'));
57
+
58
+ jest.runAllTimers();
59
+
60
+ _userEvent["default"].click(_react2.screen.getByText('Travis Arnold'));
61
+
62
+ expect(selectMock).toHaveBeenCalledWith({
63
+ selectedValue: 'souporserious',
64
+ value: 'souporserious'
65
+ });
66
+ jest.useRealTimers();
67
+
68
+ case 7:
69
+ case "end":
70
+ return _context.stop();
71
+ }
72
+ }
73
+ }, _callee);
74
+ })));
@@ -172,21 +172,18 @@ export function Button(_ref) {
172
172
 
173
173
  if (disabled) {
174
174
  buttonProps.opacity = 0.65;
175
+ buttonProps['aria-disabled'] = true;
176
+ buttonProps.cursor = 'not-allowed';
175
177
 
176
- if (buttonProps.type === "button" || buttonProps.type === "reset") {
177
- buttonProps.disabled = true;
178
- } else if (buttonProps.type === "submit") {
179
- buttonProps['aria-disabled'] = true;
180
- buttonProps.cursor = 'not-allowed';
181
-
182
- buttonProps.onClick = function (event) {
183
- return event.preventDefault();
184
- };
178
+ buttonProps.onClick = function (event) {
179
+ return event.preventDefault();
180
+ };
185
181
 
186
- buttonProps.onKeyDown = function (event) {
187
- return event.preventDefault();
188
- };
189
- }
182
+ buttonProps.onKeyDown = function (event) {
183
+ if (event.key === 'Enter' || event.key === ' ') {
184
+ event.preventDefault();
185
+ }
186
+ };
190
187
  } // don't apply hover/active styles or events when disabled or spinner is present
191
188
 
192
189
 
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { render, fireEvent } from '@testing-library/react';
2
+ import { render, fireEvent, createEvent } from '@testing-library/react';
3
3
  import { Button } from './Button';
4
4
 
5
5
  var _ref = /*#__PURE__*/React.createElement(Button, null);
@@ -28,70 +28,102 @@ var _ref3 = /*#__PURE__*/React.createElement(Button, {
28
28
  disabled: true
29
29
  });
30
30
 
31
- it("should render \"disabled\" attribute, if <button> is disabled", function () {
31
+ it("if \"disabled\" prop is provided, set \"aria-disabled\" attribute", function () {
32
32
  var _render3 = render(_ref3),
33
33
  container = _render3.container;
34
34
 
35
35
  var button = container.querySelector('button');
36
- expect(button.getAttribute("aria-disabled")).toEqual(null);
37
- expect(button.disabled).toBe(true);
36
+ expect(button.getAttribute("aria-disabled")).toEqual("true");
37
+ expect(button.disabled).toBe(false);
38
38
  });
39
39
 
40
40
  var _ref4 = /*#__PURE__*/React.createElement(Button, {
41
- type: "submit",
42
41
  disabled: true
43
42
  });
44
43
 
45
- it("should render \"aria-disabled\" attribute, if <button type=\"submit\"> is disabled", function () {
44
+ it("if \"disabled\" prop is provided, prevent \"Click\" event from firing", function () {
46
45
  var _render4 = render(_ref4),
47
46
  container = _render4.container;
48
47
 
49
48
  var button = container.querySelector('button');
50
- expect(button.getAttribute("aria-disabled")).toEqual("true");
51
- expect(button.disabled).toBe(false);
49
+ var clickEvent = createEvent.click(button);
50
+ fireEvent(button, clickEvent);
51
+ expect(clickEvent.defaultPrevented).toBe(true);
52
+ });
53
+
54
+ var _ref5 = /*#__PURE__*/React.createElement(Button, {
55
+ disabled: true
56
+ });
57
+
58
+ it("if \"disabled\" prop is provided, prevent keyDown \"Enter\" event from firing", function () {
59
+ var _render5 = render(_ref5),
60
+ container = _render5.container;
61
+
62
+ var button = container.querySelector('button');
63
+ var keyDownEvent = createEvent.keyDown(button, {
64
+ key: 'Enter'
65
+ });
66
+ fireEvent(button, keyDownEvent);
67
+ expect(keyDownEvent.defaultPrevented).toBe(true);
68
+ });
69
+
70
+ var _ref6 = /*#__PURE__*/React.createElement(Button, {
71
+ disabled: true
72
+ });
73
+
74
+ it("if \"disabled\" prop is provided, prevent keyDown \"Space\" event from firing", function () {
75
+ var _render6 = render(_ref6),
76
+ container = _render6.container;
77
+
78
+ var button = container.querySelector('button');
79
+ var keyDownEvent = createEvent.keyDown(button, {
80
+ key: ' '
81
+ });
82
+ fireEvent(button, keyDownEvent);
83
+ expect(keyDownEvent.defaultPrevented).toBe(true);
52
84
  });
53
85
  it("should render title", function () {
54
86
  var title = 'Hello';
55
87
 
56
- var _render5 = render( /*#__PURE__*/React.createElement(Button, {
88
+ var _render7 = render( /*#__PURE__*/React.createElement(Button, {
57
89
  title: title
58
90
  })),
59
- getByText = _render5.getByText;
91
+ getByText = _render7.getByText;
60
92
 
61
93
  getByText(title);
62
94
  });
63
95
 
64
- var _ref5 = /*#__PURE__*/React.createElement(Button, {
96
+ var _ref7 = /*#__PURE__*/React.createElement(Button, {
65
97
  to: "#"
66
98
  });
67
99
 
68
100
  it("should render <a> without a type if \"to\" is provided", function () {
69
- var _render6 = render(_ref5),
70
- container = _render6.container;
101
+ var _render8 = render(_ref7),
102
+ container = _render8.container;
71
103
 
72
104
  var button = container.querySelector('a');
73
105
  expect(button.getAttribute('type')).toBeNull();
74
106
  });
75
107
 
76
- var _ref6 = /*#__PURE__*/React.createElement(Button, {
108
+ var _ref8 = /*#__PURE__*/React.createElement(Button, {
77
109
  href: "#"
78
110
  });
79
111
 
80
112
  it("should render <a> without a type if \"href\" is provided", function () {
81
- var _render7 = render(_ref6),
82
- container = _render7.container;
113
+ var _render9 = render(_ref8),
114
+ container = _render9.container;
83
115
 
84
116
  var button = container.querySelector('a');
85
117
  expect(button.getAttribute('type')).toBeNull();
86
118
  });
87
119
 
88
- var _ref7 = /*#__PURE__*/React.createElement(Button, {
120
+ var _ref9 = /*#__PURE__*/React.createElement(Button, {
89
121
  to: "#"
90
122
  });
91
123
 
92
124
  it("should render <a> with \"href\" if \"to\" is specifed", function () {
93
- var _render8 = render(_ref7),
94
- container = _render8.container;
125
+ var _render10 = render(_ref9),
126
+ container = _render10.container;
95
127
 
96
128
  var button = container.querySelector('a');
97
129
  expect(button.getAttribute('href')).toEqual('#');
@@ -99,12 +131,12 @@ it("should render <a> with \"href\" if \"to\" is specifed", function () {
99
131
  it("should render href and external link values", function () {
100
132
  var title = 'Hello';
101
133
 
102
- var _render9 = render( /*#__PURE__*/React.createElement(Button, {
134
+ var _render11 = render( /*#__PURE__*/React.createElement(Button, {
103
135
  external: true,
104
136
  title: title,
105
137
  to: "https://www.planningcenter.com"
106
138
  })),
107
- getByText = _render9.getByText;
139
+ getByText = _render11.getByText;
108
140
 
109
141
  var button = getByText(title);
110
142
  expect(button.getAttribute('href')).toEqual('https://www.planningcenter.com');
@@ -114,20 +146,20 @@ it("should render href and external link values", function () {
114
146
  it("should call onClick when clicked or Enter or Space key is pressed", function () {
115
147
  var onClick = jest.fn();
116
148
 
117
- var _render10 = render( /*#__PURE__*/React.createElement(Button, {
149
+ var _render12 = render( /*#__PURE__*/React.createElement(Button, {
118
150
  onClick: onClick
119
151
  })),
120
- container = _render10.container;
152
+ container = _render12.container;
121
153
 
122
154
  fireEvent.click(container.firstChild);
123
155
  expect(onClick).toHaveBeenCalledTimes(1);
124
156
  });
125
157
 
126
- var _ref8 = /*#__PURE__*/React.createElement(Button, null);
158
+ var _ref10 = /*#__PURE__*/React.createElement(Button, null);
127
159
 
128
160
  it("should not call onClick when Enter or Space key is pressed and onClick isn't present", function () {
129
- var _render11 = render(_ref8),
130
- container = _render11.container;
161
+ var _render13 = render(_ref10),
162
+ container = _render13.container;
131
163
 
132
164
  fireEvent.keyDown(container.firstChild, {
133
165
  key: 'Enter'
@@ -141,35 +141,37 @@ var Calendar = /*#__PURE__*/forwardRef(function (_ref, calendarRef) {
141
141
  axis: "horizontal",
142
142
  spacing: 0.5
143
143
  }, /*#__PURE__*/React.createElement(Box, {
144
- as: "button",
145
144
  "aria-label": isMonthsView ? 'Choose dates' : 'Choose month',
146
- padding: 0.25,
147
- fontSize: headerFontSize,
148
- lineHeight: 3,
149
- radius: 3,
150
- cursor: "pointer",
145
+ as: "button",
151
146
  backgroundColor: hover ? 'highlight' : 'transparent',
147
+ cursor: "pointer",
148
+ fontSize: headerFontSize,
152
149
  hover: {
153
150
  backgroundColor: 'highlightSecondary'
154
151
  },
152
+ lineHeight: 3,
155
153
  onClick: function onClick() {
156
154
  setCurrentView(isMonthsView ? 'calendar' : 'months');
157
- }
158
- }, format(currentDate, 'MMMM')), /*#__PURE__*/React.createElement(Box, {
159
- as: "button",
160
- "aria-label": isYearsView ? 'Choose dates' : 'Choose year',
155
+ },
161
156
  padding: 0.25,
162
- fontSize: headerFontSize,
163
- lineHeight: 3,
164
157
  radius: 3,
165
- cursor: "pointer",
158
+ tabIndex: -1
159
+ }, format(currentDate, 'MMMM')), /*#__PURE__*/React.createElement(Box, {
160
+ "aria-label": isYearsView ? 'Choose dates' : 'Choose year',
161
+ as: "button",
166
162
  backgroundColor: hover ? 'highlight' : 'transparent',
163
+ cursor: "pointer",
164
+ fontSize: headerFontSize,
167
165
  hover: {
168
166
  backgroundColor: 'highlightSecondary'
169
167
  },
168
+ lineHeight: 3,
170
169
  onClick: function onClick() {
171
170
  setCurrentView(isYearsView ? 'calendar' : 'years');
172
- }
171
+ },
172
+ padding: 0.25,
173
+ radius: 3,
174
+ tabIndex: -1
173
175
  }, currentYear)), /*#__PURE__*/React.createElement(Group, {
174
176
  marginRight: 0.5,
175
177
  childProps: {
@@ -177,35 +179,38 @@ var Calendar = /*#__PURE__*/forwardRef(function (_ref, calendarRef) {
177
179
  size: buttonSize
178
180
  }
179
181
  }, /*#__PURE__*/React.createElement(Button, {
180
- title: "Previous month",
182
+ disabled: isYearsView ? currentYear <= minYear : isSameMonth(currentDate, minDate),
181
183
  icon: {
182
184
  name: 'general.leftChevron',
183
- size: "xxs"
185
+ size: 'xxs'
184
186
  },
185
- disabled: isYearsView ? currentYear <= minYear : isSameMonth(currentDate, minDate),
186
187
  onClick: function onClick() {
187
188
  return navigateCalendar(-1);
188
- }
189
- }), /*#__PURE__*/React.createElement(Button, {
190
- tooltip: {
191
- title: 'Today'
192
189
  },
190
+ tabIndex: -1,
191
+ title: "Previous month"
192
+ }), /*#__PURE__*/React.createElement(Button, {
193
193
  icon: {
194
194
  name: 'tapestry.radio1'
195
195
  },
196
196
  onClick: function onClick() {
197
197
  return setDate(TODAY, true);
198
+ },
199
+ tabIndex: -1,
200
+ tooltip: {
201
+ title: 'Today'
198
202
  }
199
203
  }), /*#__PURE__*/React.createElement(Button, {
200
- title: "Next month",
204
+ disabled: isYearsView ? currentYear >= maxYear : isSameMonth(currentDate, maxDate),
201
205
  icon: {
202
206
  name: 'general.rightChevron',
203
- size: "xxs"
207
+ size: 'xxs'
204
208
  },
205
- disabled: isYearsView ? currentYear >= maxYear : isSameMonth(currentDate, maxDate),
206
209
  onClick: function onClick() {
207
210
  return navigateCalendar(1);
208
- }
211
+ },
212
+ tabIndex: -1,
213
+ title: "Next month"
209
214
  }))), isMonthsView && /*#__PURE__*/React.createElement(StackView, {
210
215
  axis: "horizontal",
211
216
  width: cellSize * 7,
@@ -3,6 +3,7 @@ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWith
3
3
  import React, { forwardRef, useCallback, useImperativeHandle, useRef, useContext, useEffect } from 'react';
4
4
  import Input from '../Input';
5
5
  import ItemListContext from '../ItemList/ItemListContext';
6
+ import { ItemListController } from '../ItemList';
6
7
  import { useThemeProps } from '../system';
7
8
 
8
9
  function ComboboxInput(props, ref) {
@@ -42,13 +43,11 @@ function ComboboxInput(props, ref) {
42
43
  };
43
44
  });
44
45
  var itemList = useContext(ItemListContext);
45
- var highlightedItemId = itemList.highlightedItemId,
46
- id = itemList.id;
47
46
  useEffect(function () {
48
47
  setTimeout(function () {
49
48
  itemList.setHighlightedIndex(0);
50
49
  });
51
- }, [itemList.items]);
50
+ }, [itemList]);
52
51
  var handleKeyDown = useCallback(function (e) {
53
52
  if (e.key === 'ArrowUp') {
54
53
  e.preventDefault();
@@ -76,45 +75,49 @@ function ComboboxInput(props, ref) {
76
75
  if (onClose && e.key === 'Tab') {
77
76
  onClose();
78
77
  }
79
- });
78
+ }, [itemList, onClose, onKeyDown]);
80
79
  var handleDocumentKeyDown = useCallback(function (e) {
81
80
  if (onClear && e.key === 'Escape') {
82
81
  onClear();
83
82
  }
83
+ }, [onClear]);
84
+ return /*#__PURE__*/React.createElement(ItemListController, null, function (itemList) {
85
+ var highlightedItemId = itemList.highlightedItemId,
86
+ id = itemList.id;
87
+ return /*#__PURE__*/React.createElement(Input.InputBox, _extends({
88
+ innerRef: innerRef,
89
+ size: size,
90
+ disabled: disabled,
91
+ isLoading: isLoading,
92
+ onClear: onClear
93
+ }, restProps, {
94
+ grow: 1
95
+ }), /*#__PURE__*/React.createElement(Input.InputField, {
96
+ innerRef: function innerRef(node) {
97
+ inputNode.current = node;
98
+ },
99
+ grow: 1,
100
+ role: "combobox",
101
+ autoComplete: "off",
102
+ "aria-autocomplete": "list",
103
+ "aria-controls": id,
104
+ "aria-expanded": isOpen,
105
+ "aria-activedescendant": highlightedItemId,
106
+ autoFocus: autoFocus,
107
+ type: type,
108
+ name: name,
109
+ disabled: disabled,
110
+ readOnly: readOnly,
111
+ placeholder: placeholder,
112
+ defaultValue: defaultValue,
113
+ value: value,
114
+ onChange: onChange,
115
+ onFocus: onFocus,
116
+ onBlur: onBlur,
117
+ onKeyDown: handleKeyDown,
118
+ onKeyUp: onKeyUp
119
+ }));
84
120
  });
85
- return /*#__PURE__*/React.createElement(Input.InputBox, _extends({
86
- innerRef: innerRef,
87
- size: size,
88
- disabled: disabled,
89
- isLoading: isLoading,
90
- onClear: onClear
91
- }, restProps, {
92
- grow: 1
93
- }), /*#__PURE__*/React.createElement(Input.InputField, {
94
- innerRef: function innerRef(node) {
95
- inputNode.current = node;
96
- },
97
- grow: 1,
98
- role: "combobox",
99
- autoComplete: "off",
100
- "aria-autocomplete": "list",
101
- "aria-controls": id,
102
- "aria-expanded": isOpen,
103
- "aria-activedescendant": highlightedItemId,
104
- autoFocus: autoFocus,
105
- type: type,
106
- name: name,
107
- disabled: disabled,
108
- readOnly: readOnly,
109
- placeholder: placeholder,
110
- defaultValue: defaultValue,
111
- value: value,
112
- onChange: onChange,
113
- onFocus: onFocus,
114
- onBlur: onBlur,
115
- onKeyDown: handleKeyDown,
116
- onKeyUp: onKeyUp
117
- }));
118
121
  }
119
122
 
120
123
  ComboboxInput = /*#__PURE__*/forwardRef(ComboboxInput);