@planningcenter/tapestry-react 2.6.2 → 2.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.
- package/dist/cjs/Button/Button.js +12 -3
- package/dist/cjs/Button/Button.test.js +67 -14
- package/dist/cjs/Calendar/Calendar.js +30 -25
- package/dist/cjs/Combobox/ComboboxInput.js +41 -37
- package/dist/cjs/DataTable/DataTable.js +3 -2
- package/dist/cjs/DateField/DateField.js +74 -47
- package/dist/cjs/DateField/parse.js +106 -0
- package/dist/cjs/DateField/parse.test.js +46 -0
- package/dist/cjs/DateField/useArrowKeysToNavigateCalendar.js +44 -0
- package/dist/cjs/DateField/useEditableDate.js +72 -0
- package/dist/cjs/Select/Select.test.js +74 -0
- package/dist/cjs/system/colors/colors.js +18 -15
- package/dist/esm/Button/Button.js +12 -3
- package/dist/esm/Button/Button.test.js +78 -19
- package/dist/esm/Calendar/Calendar.js +30 -25
- package/dist/esm/Combobox/ComboboxInput.js +40 -37
- package/dist/esm/DataTable/DataTable.js +3 -2
- package/dist/esm/DateField/DateField.js +75 -48
- package/dist/esm/DateField/parse.js +93 -0
- package/dist/esm/DateField/parse.test.js +42 -0
- package/dist/esm/DateField/useArrowKeysToNavigateCalendar.js +36 -0
- package/dist/esm/DateField/useEditableDate.js +62 -0
- package/dist/esm/Select/Select.test.js +59 -0
- package/dist/esm/system/colors/colors.js +18 -15
- package/dist/types/Button/Button.d.ts +1 -1
- package/dist/types/DateField/DateField.d.ts +48 -0
- package/dist/types/DateField/parse.d.ts +17 -0
- package/dist/types/DateField/parse.test.d.ts +1 -0
- package/dist/types/DateField/useArrowKeysToNavigateCalendar.d.ts +8 -0
- package/dist/types/DateField/useEditableDate.d.ts +25 -0
- package/dist/types/Select/Select.test.d.ts +1 -0
- package/package.json +5 -6
- package/src/Button/Button.test.tsx +39 -1
- package/src/Button/Button.tsx +8 -3
- package/src/Calendar/Calendar.js +22 -17
- package/src/Combobox/ComboboxInput.js +76 -62
- package/src/DataTable/DataTable.js +2 -1
- package/src/DateField/DateField.mdx +15 -0
- package/src/DateField/{DateField.js → DateField.tsx} +96 -52
- package/src/DateField/parse.test.ts +76 -0
- package/src/DateField/parse.ts +92 -0
- package/src/DateField/useArrowKeysToNavigateCalendar.ts +54 -0
- package/src/DateField/useEditableDate.ts +81 -0
- package/src/Icon/Icon.mdx +12 -11
- package/src/Select/Select.test.tsx +58 -0
- package/src/system/colors/colors.js +18 -15
|
@@ -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
|
+
})));
|
|
@@ -17,25 +17,28 @@ var palette = {
|
|
|
17
17
|
darkest: 'hsl(88, 72%, 20%)'
|
|
18
18
|
},
|
|
19
19
|
warning: {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
lightest: 'hsl(42, 87%, 97%)',
|
|
21
|
+
lighter: 'hsl(42, 87%, 94%)',
|
|
22
|
+
light: 'hsl(42, 87%, 90%)',
|
|
23
|
+
base: 'hsl(42, 84%, 63%)',
|
|
24
|
+
dark: 'hsl(42, 84%, 55%)',
|
|
25
|
+
darker: 'hsl(42, 84%, 49%)'
|
|
25
26
|
},
|
|
26
27
|
error: {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
lightest: 'hsl(7, 60%, 97%)',
|
|
29
|
+
lighter: 'hsl(9, 59%, 93%)',
|
|
30
|
+
light: 'hsl(8, 60%, 85%)',
|
|
31
|
+
base: 'hsl(8, 60%, 47%)',
|
|
32
|
+
dark: 'hsl(8, 60%, 45%)',
|
|
33
|
+
darker: 'hsl(9, 61%, 43%)'
|
|
32
34
|
},
|
|
33
35
|
success: {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
lightest: 'hsl(93, 53%, 97%)',
|
|
37
|
+
lighter: 'hsl(95, 50%, 91%)',
|
|
38
|
+
light: 'hsl(86, 91%, 35%)',
|
|
39
|
+
base: 'hsl(86, 91%, 27%)',
|
|
40
|
+
dark: 'hsl(86, 91%, 25%)',
|
|
41
|
+
darker: 'hsl(86, 91%, 23%)'
|
|
39
42
|
},
|
|
40
43
|
red: ['hsl(8, 73%, 96%)', 'hsl(8, 74%, 92%)', 'hsl(8, 75%, 88%)', 'hsl(8, 76%, 68%)', 'hsl(8, 77%, 60%)', 'hsl(8, 78%, 56%)', 'hsl(8, 79%, 52%)', 'hsl(8, 80%, 48%)', 'hsl(8, 81%, 40%)', 'hsl(8, 82%, 30%)'],
|
|
41
44
|
blue: ['hsl(197, 56%, 92%)', 'hsl(197, 56%, 88%)', 'hsl(197, 56%, 72%)', 'hsl(197, 56%, 64%)', 'hsl(197, 56%, 52%)', 'hsl(197, 56%, 44%)', 'hsl(197, 56%, 40%)', 'hsl(197, 56%, 32%)', 'hsl(197, 56%, 24%)', 'hsl(197, 56%, 20%)'],
|
|
@@ -168,13 +168,22 @@ export function Button(_ref) {
|
|
|
168
168
|
if (iconRight) {
|
|
169
169
|
iconRight['color'] = 'transparent';
|
|
170
170
|
}
|
|
171
|
-
}
|
|
172
|
-
|
|
171
|
+
}
|
|
173
172
|
|
|
174
173
|
if (disabled) {
|
|
174
|
+
buttonProps.opacity = 0.65;
|
|
175
175
|
buttonProps['aria-disabled'] = true;
|
|
176
176
|
buttonProps.cursor = 'not-allowed';
|
|
177
|
-
|
|
177
|
+
|
|
178
|
+
buttonProps.onClick = function (event) {
|
|
179
|
+
return event.preventDefault();
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
buttonProps.onKeyDown = function (event) {
|
|
183
|
+
if (event.key === 'Enter' || event.key === ' ') {
|
|
184
|
+
event.preventDefault();
|
|
185
|
+
}
|
|
186
|
+
};
|
|
178
187
|
} // don't apply hover/active styles or events when disabled or spinner is present
|
|
179
188
|
|
|
180
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);
|
|
@@ -23,48 +23,107 @@ it("should render as <button> with type=\"submit\"", function () {
|
|
|
23
23
|
var button = container.querySelector('button');
|
|
24
24
|
expect(button.getAttribute('type')).toEqual('submit');
|
|
25
25
|
});
|
|
26
|
+
|
|
27
|
+
var _ref3 = /*#__PURE__*/React.createElement(Button, {
|
|
28
|
+
disabled: true
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("if \"disabled\" prop is provided, set \"aria-disabled\" attribute", function () {
|
|
32
|
+
var _render3 = render(_ref3),
|
|
33
|
+
container = _render3.container;
|
|
34
|
+
|
|
35
|
+
var button = container.querySelector('button');
|
|
36
|
+
expect(button.getAttribute("aria-disabled")).toEqual("true");
|
|
37
|
+
expect(button.disabled).toBe(false);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
var _ref4 = /*#__PURE__*/React.createElement(Button, {
|
|
41
|
+
disabled: true
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it("if \"disabled\" prop is provided, prevent \"Click\" event from firing", function () {
|
|
45
|
+
var _render4 = render(_ref4),
|
|
46
|
+
container = _render4.container;
|
|
47
|
+
|
|
48
|
+
var button = container.querySelector('button');
|
|
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);
|
|
84
|
+
});
|
|
26
85
|
it("should render title", function () {
|
|
27
86
|
var title = 'Hello';
|
|
28
87
|
|
|
29
|
-
var
|
|
88
|
+
var _render7 = render( /*#__PURE__*/React.createElement(Button, {
|
|
30
89
|
title: title
|
|
31
90
|
})),
|
|
32
|
-
getByText =
|
|
91
|
+
getByText = _render7.getByText;
|
|
33
92
|
|
|
34
93
|
getByText(title);
|
|
35
94
|
});
|
|
36
95
|
|
|
37
|
-
var
|
|
96
|
+
var _ref7 = /*#__PURE__*/React.createElement(Button, {
|
|
38
97
|
to: "#"
|
|
39
98
|
});
|
|
40
99
|
|
|
41
100
|
it("should render <a> without a type if \"to\" is provided", function () {
|
|
42
|
-
var
|
|
43
|
-
container =
|
|
101
|
+
var _render8 = render(_ref7),
|
|
102
|
+
container = _render8.container;
|
|
44
103
|
|
|
45
104
|
var button = container.querySelector('a');
|
|
46
105
|
expect(button.getAttribute('type')).toBeNull();
|
|
47
106
|
});
|
|
48
107
|
|
|
49
|
-
var
|
|
108
|
+
var _ref8 = /*#__PURE__*/React.createElement(Button, {
|
|
50
109
|
href: "#"
|
|
51
110
|
});
|
|
52
111
|
|
|
53
112
|
it("should render <a> without a type if \"href\" is provided", function () {
|
|
54
|
-
var
|
|
55
|
-
container =
|
|
113
|
+
var _render9 = render(_ref8),
|
|
114
|
+
container = _render9.container;
|
|
56
115
|
|
|
57
116
|
var button = container.querySelector('a');
|
|
58
117
|
expect(button.getAttribute('type')).toBeNull();
|
|
59
118
|
});
|
|
60
119
|
|
|
61
|
-
var
|
|
120
|
+
var _ref9 = /*#__PURE__*/React.createElement(Button, {
|
|
62
121
|
to: "#"
|
|
63
122
|
});
|
|
64
123
|
|
|
65
124
|
it("should render <a> with \"href\" if \"to\" is specifed", function () {
|
|
66
|
-
var
|
|
67
|
-
container =
|
|
125
|
+
var _render10 = render(_ref9),
|
|
126
|
+
container = _render10.container;
|
|
68
127
|
|
|
69
128
|
var button = container.querySelector('a');
|
|
70
129
|
expect(button.getAttribute('href')).toEqual('#');
|
|
@@ -72,12 +131,12 @@ it("should render <a> with \"href\" if \"to\" is specifed", function () {
|
|
|
72
131
|
it("should render href and external link values", function () {
|
|
73
132
|
var title = 'Hello';
|
|
74
133
|
|
|
75
|
-
var
|
|
134
|
+
var _render11 = render( /*#__PURE__*/React.createElement(Button, {
|
|
76
135
|
external: true,
|
|
77
136
|
title: title,
|
|
78
137
|
to: "https://www.planningcenter.com"
|
|
79
138
|
})),
|
|
80
|
-
getByText =
|
|
139
|
+
getByText = _render11.getByText;
|
|
81
140
|
|
|
82
141
|
var button = getByText(title);
|
|
83
142
|
expect(button.getAttribute('href')).toEqual('https://www.planningcenter.com');
|
|
@@ -87,20 +146,20 @@ it("should render href and external link values", function () {
|
|
|
87
146
|
it("should call onClick when clicked or Enter or Space key is pressed", function () {
|
|
88
147
|
var onClick = jest.fn();
|
|
89
148
|
|
|
90
|
-
var
|
|
149
|
+
var _render12 = render( /*#__PURE__*/React.createElement(Button, {
|
|
91
150
|
onClick: onClick
|
|
92
151
|
})),
|
|
93
|
-
container =
|
|
152
|
+
container = _render12.container;
|
|
94
153
|
|
|
95
154
|
fireEvent.click(container.firstChild);
|
|
96
155
|
expect(onClick).toHaveBeenCalledTimes(1);
|
|
97
156
|
});
|
|
98
157
|
|
|
99
|
-
var
|
|
158
|
+
var _ref10 = /*#__PURE__*/React.createElement(Button, null);
|
|
100
159
|
|
|
101
160
|
it("should not call onClick when Enter or Space key is pressed and onClick isn't present", function () {
|
|
102
|
-
var
|
|
103
|
-
container =
|
|
161
|
+
var _render13 = render(_ref10),
|
|
162
|
+
container = _render13.container;
|
|
104
163
|
|
|
105
164
|
fireEvent.keyDown(container.firstChild, {
|
|
106
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
182
|
+
disabled: isYearsView ? currentYear <= minYear : isSameMonth(currentDate, minDate),
|
|
181
183
|
icon: {
|
|
182
184
|
name: 'general.leftChevron',
|
|
183
|
-
size:
|
|
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
|
-
|
|
204
|
+
disabled: isYearsView ? currentYear >= maxYear : isSameMonth(currentDate, maxDate),
|
|
201
205
|
icon: {
|
|
202
206
|
name: 'general.rightChevron',
|
|
203
|
-
size:
|
|
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
|
|
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);
|