@pingux/astro 1.5.1-alpha.1 → 1.6.0-alpha.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/lib/cjs/components/ComboBoxField/ComboBoxField.js +12 -3
- package/lib/cjs/components/ComboBoxField/ComboBoxField.stories.js +22 -3
- package/lib/cjs/components/ComboBoxField/ComboBoxField.test.js +48 -8
- package/lib/cjs/components/TimeZonePicker/TimeZonePicker.js +265 -0
- package/lib/cjs/components/TimeZonePicker/TimeZonePicker.stories.js +43 -0
- package/lib/cjs/components/TimeZonePicker/TimeZonePicker.test.js +103 -0
- package/lib/cjs/components/TimeZonePicker/index.js +18 -0
- package/lib/cjs/components/TimeZonePicker/timezones.js +123 -0
- package/lib/cjs/index.js +10 -0
- package/lib/cjs/styles/variants/text.js +29 -1
- package/lib/components/ComboBoxField/ComboBoxField.js +12 -3
- package/lib/components/ComboBoxField/ComboBoxField.stories.js +17 -1
- package/lib/components/ComboBoxField/ComboBoxField.test.js +46 -8
- package/lib/components/TimeZonePicker/TimeZonePicker.js +230 -0
- package/lib/components/TimeZonePicker/TimeZonePicker.stories.js +21 -0
- package/lib/components/TimeZonePicker/TimeZonePicker.test.js +80 -0
- package/lib/components/TimeZonePicker/index.js +1 -0
- package/lib/components/TimeZonePicker/timezones.js +112 -0
- package/lib/index.js +1 -0
- package/lib/styles/variants/text.js +29 -1
- package/package.json +1 -1
@@ -114,7 +114,8 @@ var ComboBoxField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
114
114
|
menuTrigger = props.menuTrigger,
|
115
115
|
isNotFlippable = props.isNotFlippable,
|
116
116
|
direction = props.direction,
|
117
|
-
scrollBoxProps = props.scrollBoxProps
|
117
|
+
scrollBoxProps = props.scrollBoxProps,
|
118
|
+
defaultFilter = props.defaultFilter;
|
118
119
|
var comboBoxOptions = {
|
119
120
|
children: children,
|
120
121
|
isRequired: isRequired,
|
@@ -171,7 +172,7 @@ var ComboBoxField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
171
172
|
|
172
173
|
var state = (0, _combobox2.useComboBoxState)(_objectSpread(_objectSpread({}, comboBoxOptions), {}, {
|
173
174
|
onSelectionChange: hasCustomValue ? onSelectionChangeHandler : onSelectionChange,
|
174
|
-
defaultFilter: contains
|
175
|
+
defaultFilter: typeof defaultFilter !== 'undefined' ? defaultFilter : contains
|
175
176
|
}));
|
176
177
|
|
177
178
|
var _useComboBox = (0, _combobox.useComboBox)(_objectSpread(_objectSpread({}, comboBoxOptions), {}, {
|
@@ -224,7 +225,7 @@ var ComboBoxField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
224
225
|
if (inputRef.current) {
|
225
226
|
setMenuWidth(inputRef.current.offsetWidth);
|
226
227
|
}
|
227
|
-
}, [inputRef, setMenuWidth
|
228
|
+
}, [inputRef, setMenuWidth]);
|
228
229
|
(0, _utils.useResizeObserver)({
|
229
230
|
ref: inputRef,
|
230
231
|
onResize: onResize
|
@@ -394,6 +395,14 @@ ComboBoxField.propTypes = {
|
|
394
395
|
* `(e: KeyboardEvent) => void`
|
395
396
|
*/
|
396
397
|
onKeyUp: _propTypes["default"].func,
|
398
|
+
|
399
|
+
/**
|
400
|
+
* Handler that determines the default filtering for items. If undefined, `contains` from
|
401
|
+
* [useFilter](https://react-spectrum.adobe.com/react-aria/useFilter.html) is used.
|
402
|
+
*
|
403
|
+
* `(option: string, inputValue: string) => boolean`
|
404
|
+
*/
|
405
|
+
defaultFilter: _propTypes["default"].func,
|
397
406
|
// /** Props object that is spread directly into the ScrollBox element. */
|
398
407
|
|
399
408
|
/** @ignore */
|
@@ -10,7 +10,7 @@ _Object$defineProperty(exports, "__esModule", {
|
|
10
10
|
value: true
|
11
11
|
});
|
12
12
|
|
13
|
-
exports.WithCustomHeight = exports.WithoutStatusIndicator = exports.Required = exports.HelperText = exports.Disabled = exports.FocusMenuTrigger = exports.DisabledKeys = exports.AllowCustomValue = exports.ControlledWithCustomValue = exports.ControlledFiltering = exports.ControlledSelection = exports.ControlledMenu = exports.ControlledInput = exports.AsyncLoading = exports.WithSections = exports.Default = exports["default"] = void 0;
|
13
|
+
exports.CustomDefaultFilter = exports.WithCustomHeight = exports.WithoutStatusIndicator = exports.Required = exports.HelperText = exports.Disabled = exports.FocusMenuTrigger = exports.DisabledKeys = exports.AllowCustomValue = exports.ControlledWithCustomValue = exports.ControlledFiltering = exports.ControlledSelection = exports.ControlledMenu = exports.ControlledInput = exports.AsyncLoading = exports.WithSections = exports.Default = exports["default"] = void 0;
|
14
14
|
|
15
15
|
var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));
|
16
16
|
|
@@ -367,7 +367,7 @@ var ControlledFiltering = function ControlledFiltering() {
|
|
367
367
|
return (0, _filter["default"])(items).call(items, function (item) {
|
368
368
|
return startsWith(item.name, filterValue);
|
369
369
|
});
|
370
|
-
}, [
|
370
|
+
}, [startsWith, filterValue]);
|
371
371
|
return (0, _react2.jsx)(_index.OverlayProvider, null, (0, _react2.jsx)(_ComboBoxField["default"], (0, _extends2["default"])({
|
372
372
|
label: "Example label"
|
373
373
|
}, actions, {
|
@@ -520,4 +520,23 @@ var WithCustomHeight = function WithCustomHeight() {
|
|
520
520
|
}));
|
521
521
|
};
|
522
522
|
|
523
|
-
exports.WithCustomHeight = WithCustomHeight;
|
523
|
+
exports.WithCustomHeight = WithCustomHeight;
|
524
|
+
|
525
|
+
var CustomDefaultFilter = function CustomDefaultFilter() {
|
526
|
+
var _useFilter2 = (0, _i18n.useFilter)({
|
527
|
+
sensitivity: 'base'
|
528
|
+
}),
|
529
|
+
startsWith = (0, _startsWith["default"])(_useFilter2);
|
530
|
+
|
531
|
+
return (0, _react2.jsx)(_index.OverlayProvider, null, (0, _react2.jsx)(_ComboBoxField["default"], (0, _extends2["default"])({
|
532
|
+
label: "Example label",
|
533
|
+
defaultItems: animals,
|
534
|
+
defaultFilter: startsWith
|
535
|
+
}, actions), function (item) {
|
536
|
+
return (0, _react2.jsx)(_index.Item, {
|
537
|
+
key: item.name
|
538
|
+
}, item.name);
|
539
|
+
}));
|
540
|
+
};
|
541
|
+
|
542
|
+
exports.CustomDefaultFilter = CustomDefaultFilter;
|
@@ -79,7 +79,7 @@ var ComboBoxWithCustomFilter = function ComboBoxWithCustomFilter() {
|
|
79
79
|
return (0, _filter["default"])(items).call(items, function (item) {
|
80
80
|
return startsWith(item.name, filterValue);
|
81
81
|
});
|
82
|
-
}, [
|
82
|
+
}, [startsWith, filterValue]);
|
83
83
|
return (0, _react2.jsx)(_index.ComboBoxField, (0, _extends2["default"])({}, defaultProps, {
|
84
84
|
items: filteredItems,
|
85
85
|
inputValue: filterValue,
|
@@ -450,6 +450,46 @@ test('should be able to use controlled filtering', /*#__PURE__*/(0, _asyncToGene
|
|
450
450
|
}
|
451
451
|
}, _callee);
|
452
452
|
})));
|
453
|
+
test('should be able to use custom default filtering', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
|
454
|
+
var options, defaultFilter, input;
|
455
|
+
return _regenerator["default"].wrap(function _callee2$(_context2) {
|
456
|
+
while (1) {
|
457
|
+
switch (_context2.prev = _context2.next) {
|
458
|
+
case 0:
|
459
|
+
defaultFilter = function defaultFilter(option, inputValue) {
|
460
|
+
return (0, _startsWith["default"])(option).call(option, inputValue);
|
461
|
+
};
|
462
|
+
|
463
|
+
getComponent({
|
464
|
+
defaultFilter: defaultFilter
|
465
|
+
});
|
466
|
+
input = _testWrapper.screen.queryByRole('combobox'); // Should list all without filterable input
|
467
|
+
|
468
|
+
_userEvent["default"].type(input, '{arrowdown}');
|
469
|
+
|
470
|
+
_context2.next = 6;
|
471
|
+
return _testWrapper.screen.findAllByRole('option');
|
472
|
+
|
473
|
+
case 6:
|
474
|
+
options = _context2.sent;
|
475
|
+
expect(options).toHaveLength(items.length); // Should only list the second option
|
476
|
+
|
477
|
+
_userEvent["default"].type(input, 'K');
|
478
|
+
|
479
|
+
_context2.next = 11;
|
480
|
+
return _testWrapper.screen.findAllByRole('option');
|
481
|
+
|
482
|
+
case 11:
|
483
|
+
options = _context2.sent;
|
484
|
+
expect(options[0]).toHaveTextContent(items[1].name);
|
485
|
+
|
486
|
+
case 13:
|
487
|
+
case "end":
|
488
|
+
return _context2.stop();
|
489
|
+
}
|
490
|
+
}
|
491
|
+
}, _callee2);
|
492
|
+
})));
|
453
493
|
describe('loadingState', function () {
|
454
494
|
it('combobox should not render a loader if menu is not open', function () {
|
455
495
|
var _getComponent = getComponent({
|
@@ -816,26 +856,26 @@ test('onSelectionChange works properly with custom value', function () {
|
|
816
856
|
|
817
857
|
expect(onSelectionChange).toHaveBeenCalledWith('');
|
818
858
|
});
|
819
|
-
test('should have no accessibility violations', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function
|
859
|
+
test('should have no accessibility violations', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
|
820
860
|
var _getComponent6, container, results;
|
821
861
|
|
822
|
-
return _regenerator["default"].wrap(function
|
862
|
+
return _regenerator["default"].wrap(function _callee3$(_context3) {
|
823
863
|
while (1) {
|
824
|
-
switch (
|
864
|
+
switch (_context3.prev = _context3.next) {
|
825
865
|
case 0:
|
826
866
|
jest.useRealTimers();
|
827
867
|
_getComponent6 = getComponent(), container = _getComponent6.container;
|
828
|
-
|
868
|
+
_context3.next = 4;
|
829
869
|
return (0, _jestAxe.axe)(container);
|
830
870
|
|
831
871
|
case 4:
|
832
|
-
results =
|
872
|
+
results = _context3.sent;
|
833
873
|
expect(results).toHaveNoViolations();
|
834
874
|
|
835
875
|
case 6:
|
836
876
|
case "end":
|
837
|
-
return
|
877
|
+
return _context3.stop();
|
838
878
|
}
|
839
879
|
}
|
840
|
-
},
|
880
|
+
}, _callee3);
|
841
881
|
})));
|
@@ -0,0 +1,265 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var _interopRequireWildcard = require("@babel/runtime-corejs3/helpers/interopRequireWildcard");
|
4
|
+
|
5
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
|
6
|
+
|
7
|
+
var _Object$defineProperty2 = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
|
8
|
+
|
9
|
+
_Object$defineProperty2(exports, "__esModule", {
|
10
|
+
value: true
|
11
|
+
});
|
12
|
+
|
13
|
+
exports["default"] = void 0;
|
14
|
+
|
15
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/define-property"));
|
16
|
+
|
17
|
+
var _defineProperties = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/define-properties"));
|
18
|
+
|
19
|
+
var _getOwnPropertyDescriptors = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors"));
|
20
|
+
|
21
|
+
var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));
|
22
|
+
|
23
|
+
var _getOwnPropertyDescriptor = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor"));
|
24
|
+
|
25
|
+
var _getOwnPropertySymbols = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols"));
|
26
|
+
|
27
|
+
var _keys = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/keys"));
|
28
|
+
|
29
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
|
30
|
+
|
31
|
+
var _sort = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/sort"));
|
32
|
+
|
33
|
+
var _parseFloat2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/parse-float"));
|
34
|
+
|
35
|
+
var _indexOf = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/index-of"));
|
36
|
+
|
37
|
+
var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));
|
38
|
+
|
39
|
+
var _entries = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/entries"));
|
40
|
+
|
41
|
+
var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
|
42
|
+
|
43
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));
|
44
|
+
|
45
|
+
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/objectWithoutProperties"));
|
46
|
+
|
47
|
+
var _defineProperty3 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
|
48
|
+
|
49
|
+
var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
|
50
|
+
|
51
|
+
var _includes = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/includes"));
|
52
|
+
|
53
|
+
var _react = _interopRequireWildcard(require("react"));
|
54
|
+
|
55
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
56
|
+
|
57
|
+
var _timezones = _interopRequireWildcard(require("./timezones.js"));
|
58
|
+
|
59
|
+
var _index = require("../../index");
|
60
|
+
|
61
|
+
var _react2 = require("@emotion/react");
|
62
|
+
|
63
|
+
function ownKeys(object, enumerableOnly) { var keys = (0, _keys["default"])(object); if (_getOwnPropertySymbols["default"]) { var symbols = (0, _getOwnPropertySymbols["default"])(object); if (enumerableOnly) symbols = (0, _filter["default"])(symbols).call(symbols, function (sym) { return (0, _getOwnPropertyDescriptor["default"])(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
64
|
+
|
65
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { var _context8; (0, _forEach["default"])(_context8 = ownKeys(Object(source), true)).call(_context8, function (key) { (0, _defineProperty3["default"])(target, key, source[key]); }); } else if (_getOwnPropertyDescriptors["default"]) { (0, _defineProperties["default"])(target, (0, _getOwnPropertyDescriptors["default"])(source)); } else { var _context9; (0, _forEach["default"])(_context9 = ownKeys(Object(source))).call(_context9, function (key) { (0, _defineProperty2["default"])(target, key, (0, _getOwnPropertyDescriptor["default"])(source, key)); }); } } return target; }
|
66
|
+
|
67
|
+
var createSearchTags = function createSearchTags(_ref) {
|
68
|
+
var _context, _context2, _context3, _context4;
|
69
|
+
|
70
|
+
var gmt = _ref.gmt,
|
71
|
+
gmtLabel = _ref.gmtLabel,
|
72
|
+
timeZone = _ref.timeZone;
|
73
|
+
var additionalTags = '';
|
74
|
+
var americaTimeZone = (0, _includes["default"])(timeZone).call(timeZone, 'America') && timeZone.substring(8);
|
75
|
+
|
76
|
+
if ((0, _includes["default"])(_timezones.usCities).call(_timezones.usCities, americaTimeZone)) {
|
77
|
+
additionalTags = "US ".concat(americaTimeZone);
|
78
|
+
}
|
79
|
+
|
80
|
+
return (0, _concat["default"])(_context = (0, _concat["default"])(_context2 = (0, _concat["default"])(_context3 = (0, _concat["default"])(_context4 = "".concat(gmt, " ")).call(_context4, gmtLabel, " ")).call(_context3, timeZone, " ")).call(_context2, timeZone === null || timeZone === void 0 ? void 0 : timeZone.replace(/_/g, ' '), " ")).call(_context, additionalTags);
|
81
|
+
};
|
82
|
+
|
83
|
+
var getLocaleTime = function getLocaleTime(_ref2) {
|
84
|
+
var timeZone = _ref2.timeZone,
|
85
|
+
locales = _ref2.locales,
|
86
|
+
localeOptions = _ref2.localeOptions;
|
87
|
+
var date = new Date();
|
88
|
+
return date.toLocaleTimeString(locales, _objectSpread({
|
89
|
+
timeZone: timeZone
|
90
|
+
}, localeOptions));
|
91
|
+
};
|
92
|
+
/**
|
93
|
+
* Component allows users to choose a timezone from the list.
|
94
|
+
* You can checkout the default timezones list [here](https://github.com/yury-dymov/react-bootstrap-timezone-picker/blob/master/src/timezones.json).
|
95
|
+
*
|
96
|
+
* Utilizes ComboBoxField component. You can use the same props as with
|
97
|
+
* the ComboBoxField - they will be spread into it.
|
98
|
+
*/
|
99
|
+
|
100
|
+
|
101
|
+
var TimeZonePicker = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
102
|
+
var additionalTimeZones = props.additionalTimeZones,
|
103
|
+
emptySearchText = props.emptySearchText,
|
104
|
+
locales = props.locales,
|
105
|
+
localeOptions = props.localeOptions,
|
106
|
+
otherProps = (0, _objectWithoutProperties2["default"])(props, ["additionalTimeZones", "emptySearchText", "locales", "localeOptions"]);
|
107
|
+
|
108
|
+
var _useState = (0, _react.useState)(''),
|
109
|
+
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
110
|
+
search = _useState2[0],
|
111
|
+
setSearch = _useState2[1];
|
112
|
+
|
113
|
+
var _useState3 = (0, _react.useState)(false),
|
114
|
+
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
|
115
|
+
timeUpdate = _useState4[0],
|
116
|
+
setTimeUpdate = _useState4[1];
|
117
|
+
|
118
|
+
var _useState5 = (0, _react.useState)([]),
|
119
|
+
_useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
|
120
|
+
timeZones = _useState6[0],
|
121
|
+
setTimeZones = _useState6[1];
|
122
|
+
|
123
|
+
var extendedTimeZonesList = additionalTimeZones ? _objectSpread(_objectSpread({}, _timezones["default"]), additionalTimeZones) : _timezones["default"];
|
124
|
+
var timeZonePickerRef = (0, _react.useRef)();
|
125
|
+
/* istanbul ignore next */
|
126
|
+
|
127
|
+
(0, _react.useImperativeHandle)(ref, function () {
|
128
|
+
return timeZonePickerRef.current;
|
129
|
+
});
|
130
|
+
(0, _react.useEffect)(function () {
|
131
|
+
if (timeUpdate) {
|
132
|
+
var createTimeZoneTimes = function createTimeZoneTimes() {
|
133
|
+
var _context5;
|
134
|
+
|
135
|
+
return (0, _map["default"])(_context5 = (0, _entries["default"])(extendedTimeZonesList)).call(_context5, function (item) {
|
136
|
+
var _item$;
|
137
|
+
|
138
|
+
var gmt = item[0].substring(1, 10);
|
139
|
+
var gmtLabel = item[0].substring(12);
|
140
|
+
var timeZone = (_item$ = item[1]) === null || _item$ === void 0 ? void 0 : _item$.replace(/_/g, ' ');
|
141
|
+
var time = getLocaleTime({
|
142
|
+
timeZone: item[1],
|
143
|
+
locales: locales,
|
144
|
+
localeOptions: localeOptions
|
145
|
+
});
|
146
|
+
var searchTags = createSearchTags({
|
147
|
+
gmt: gmt,
|
148
|
+
gmtLabel: gmtLabel,
|
149
|
+
timeZone: timeZone
|
150
|
+
});
|
151
|
+
return {
|
152
|
+
gmt: gmt,
|
153
|
+
timeZone: timeZone,
|
154
|
+
time: time,
|
155
|
+
searchTags: searchTags
|
156
|
+
};
|
157
|
+
});
|
158
|
+
};
|
159
|
+
|
160
|
+
setTimeZones(createTimeZoneTimes());
|
161
|
+
setTimeUpdate(false);
|
162
|
+
}
|
163
|
+
}, [extendedTimeZonesList, locales, localeOptions, timeUpdate]);
|
164
|
+
var filterTimezones = (0, _react.useCallback)(function (timeZonesList) {
|
165
|
+
return (0, _filter["default"])(timeZonesList).call(timeZonesList, function (_ref3) {
|
166
|
+
var _context6;
|
167
|
+
|
168
|
+
var searchTags = _ref3.searchTags;
|
169
|
+
return (0, _indexOf["default"])(_context6 = searchTags.toUpperCase()).call(_context6, search.toUpperCase()) > -1;
|
170
|
+
});
|
171
|
+
}, [search]);
|
172
|
+
var filteredTimezones = (0, _react.useMemo)(function () {
|
173
|
+
return filterTimezones(timeZones);
|
174
|
+
}, [filterTimezones, timeZones]);
|
175
|
+
|
176
|
+
var sortByGMT = function sortByGMT(a, b) {
|
177
|
+
var aNum = (0, _parseFloat2["default"])(a.gmt.split('GMT')[1].split(':')[0]);
|
178
|
+
var bNum = (0, _parseFloat2["default"])(b.gmt.split('GMT')[1].split(')')[0]);
|
179
|
+
return aNum - bNum;
|
180
|
+
};
|
181
|
+
|
182
|
+
var items = (0, _react.useMemo)(function () {
|
183
|
+
var _context7;
|
184
|
+
|
185
|
+
if (filteredTimezones.length === 0) {
|
186
|
+
return (0, _react2.jsx)(_index.Item, {
|
187
|
+
key: emptySearchText
|
188
|
+
}, emptySearchText);
|
189
|
+
}
|
190
|
+
|
191
|
+
return (0, _map["default"])(_context7 = (0, _sort["default"])(filteredTimezones).call(filteredTimezones, sortByGMT)).call(_context7, function (_ref4) {
|
192
|
+
var gmt = _ref4.gmt,
|
193
|
+
time = _ref4.time,
|
194
|
+
timeZone = _ref4.timeZone;
|
195
|
+
return (0, _react2.jsx)(_index.Item, {
|
196
|
+
key: timeZone,
|
197
|
+
"data-id": timeZone,
|
198
|
+
textValue: timeZone
|
199
|
+
}, (0, _react2.jsx)(_index.Box, {
|
200
|
+
flexDirection: "row",
|
201
|
+
justifyContent: "space-between",
|
202
|
+
width: "100%"
|
203
|
+
}, (0, _react2.jsx)(_index.Box, {
|
204
|
+
flexDirection: "row"
|
205
|
+
}, (0, _react2.jsx)(_index.Text, {
|
206
|
+
variant: "timeZone.title"
|
207
|
+
}, timeZone), (0, _react2.jsx)(_index.Text, {
|
208
|
+
variant: "timeZone.subTitle"
|
209
|
+
}, gmt)), (0, _react2.jsx)(_index.Box, null, (0, _react2.jsx)(_index.Text, {
|
210
|
+
variant: "timeZone.time"
|
211
|
+
}, time))));
|
212
|
+
});
|
213
|
+
}, [emptySearchText, filteredTimezones]);
|
214
|
+
var comboBoxFieldProps = (0, _react.useMemo)(function () {
|
215
|
+
return _objectSpread({
|
216
|
+
controlProps: {
|
217
|
+
sx: {
|
218
|
+
width: 400,
|
219
|
+
fontSize: 'md'
|
220
|
+
}
|
221
|
+
},
|
222
|
+
onInputChange: setSearch,
|
223
|
+
items: filteredTimezones,
|
224
|
+
ref: timeZonePickerRef,
|
225
|
+
onOpenChange: function onOpenChange(isOpen) {
|
226
|
+
return setTimeUpdate(isOpen);
|
227
|
+
},
|
228
|
+
disabledKeys: [{
|
229
|
+
emptySearchText: emptySearchText
|
230
|
+
}]
|
231
|
+
}, otherProps);
|
232
|
+
}, [emptySearchText, filteredTimezones, otherProps]);
|
233
|
+
return (0, _react2.jsx)(_index.ComboBoxField, (0, _extends2["default"])({}, comboBoxFieldProps, {
|
234
|
+
disabledKeys: [emptySearchText]
|
235
|
+
}), items);
|
236
|
+
});
|
237
|
+
TimeZonePicker.propTypes = {
|
238
|
+
/**
|
239
|
+
* An object representing additional time zones to merge with the [default list](https://github.com/yury-dymov/react-bootstrap-timezone-picker/blob/master/src/timezones.json).
|
240
|
+
* The key may be customized, but the value should be a timezone string from the list in the [Time Zone Database](https://www.iana.org/time-zones).
|
241
|
+
*
|
242
|
+
* e.g. `{'(GMT+02:00) Africa/Juba': 'Africa/Juba'}`
|
243
|
+
*/
|
244
|
+
additionalTimeZones: _propTypes["default"].shape({}),
|
245
|
+
|
246
|
+
/** Text that will be shown if no search results are found. */
|
247
|
+
emptySearchText: _propTypes["default"].string,
|
248
|
+
|
249
|
+
/** Locale(s) to use when generating the time format. See [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleTimeString#using_locales) for more info. */
|
250
|
+
locales: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].arrayOf(_propTypes["default"].string)]),
|
251
|
+
|
252
|
+
/** Custom options to use when generating the time format. See [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleTimeString#using_options) for more info. */
|
253
|
+
localeOptions: _propTypes["default"].shape({})
|
254
|
+
};
|
255
|
+
TimeZonePicker.defaultProps = {
|
256
|
+
emptySearchText: 'No Search Result',
|
257
|
+
locales: [],
|
258
|
+
localeOptions: {
|
259
|
+
hour12: true,
|
260
|
+
hour: '2-digit',
|
261
|
+
minute: '2-digit'
|
262
|
+
}
|
263
|
+
};
|
264
|
+
var _default = TimeZonePicker;
|
265
|
+
exports["default"] = _default;
|
@@ -0,0 +1,43 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
|
4
|
+
|
5
|
+
var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
|
6
|
+
|
7
|
+
_Object$defineProperty(exports, "__esModule", {
|
8
|
+
value: true
|
9
|
+
});
|
10
|
+
|
11
|
+
exports.WithCustomTimeZone = exports.Default = exports["default"] = void 0;
|
12
|
+
|
13
|
+
var _react = _interopRequireDefault(require("react"));
|
14
|
+
|
15
|
+
var _TimeZonePicker = _interopRequireDefault(require("./TimeZonePicker"));
|
16
|
+
|
17
|
+
var _react2 = require("@emotion/react");
|
18
|
+
|
19
|
+
var _default = {
|
20
|
+
title: 'Form/TimeZonePicker',
|
21
|
+
component: _TimeZonePicker["default"]
|
22
|
+
};
|
23
|
+
exports["default"] = _default;
|
24
|
+
|
25
|
+
var Default = function Default() {
|
26
|
+
return (0, _react2.jsx)(_TimeZonePicker["default"], {
|
27
|
+
label: "Default Example"
|
28
|
+
});
|
29
|
+
};
|
30
|
+
|
31
|
+
exports.Default = Default;
|
32
|
+
|
33
|
+
var WithCustomTimeZone = function WithCustomTimeZone() {
|
34
|
+
var customTimeZone = {
|
35
|
+
'(GMT+02:00) Africa/Juba': 'Africa/Juba'
|
36
|
+
};
|
37
|
+
return (0, _react2.jsx)(_TimeZonePicker["default"], {
|
38
|
+
additionalTimeZones: customTimeZone,
|
39
|
+
label: "With Custom Time Zone (Africa/Juba)"
|
40
|
+
});
|
41
|
+
};
|
42
|
+
|
43
|
+
exports.WithCustomTimeZone = WithCustomTimeZone;
|
@@ -0,0 +1,103 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
|
4
|
+
|
5
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
|
6
|
+
|
7
|
+
var _react = _interopRequireDefault(require("react"));
|
8
|
+
|
9
|
+
var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
|
10
|
+
|
11
|
+
var _testWrapper = require("../../utils/testUtils/testWrapper");
|
12
|
+
|
13
|
+
var _index = require("../../index");
|
14
|
+
|
15
|
+
var _react2 = require("@emotion/react");
|
16
|
+
|
17
|
+
var testTimeZoneJuba = 'Africa/Juba';
|
18
|
+
var testTimeZoneApia = 'Pacific/Apia';
|
19
|
+
var defaultProps = {
|
20
|
+
label: 'Test Label'
|
21
|
+
};
|
22
|
+
|
23
|
+
var getComponent = function getComponent() {
|
24
|
+
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
25
|
+
|
26
|
+
var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
|
27
|
+
_ref$renderFn = _ref.renderFn,
|
28
|
+
renderFn = _ref$renderFn === void 0 ? _testWrapper.render : _ref$renderFn;
|
29
|
+
|
30
|
+
return renderFn((0, _react2.jsx)(_index.OverlayProvider, null, (0, _react2.jsx)(_index.TimeZonePicker, (0, _extends2["default"])({}, defaultProps, props))));
|
31
|
+
};
|
32
|
+
|
33
|
+
beforeAll(function () {
|
34
|
+
jest.spyOn(window.HTMLElement.prototype, 'clientWidth', 'get').mockImplementation(function () {
|
35
|
+
return 1000;
|
36
|
+
});
|
37
|
+
jest.spyOn(window.HTMLElement.prototype, 'clientHeight', 'get').mockImplementation(function () {
|
38
|
+
return 1000;
|
39
|
+
});
|
40
|
+
window.HTMLElement.prototype.scrollIntoView = jest.fn();
|
41
|
+
jest.spyOn(window.screen, 'width', 'get').mockImplementation(function () {
|
42
|
+
return 1024;
|
43
|
+
});
|
44
|
+
jest.spyOn(window, 'requestAnimationFrame').mockImplementation(function (cb) {
|
45
|
+
return cb();
|
46
|
+
});
|
47
|
+
jest.useFakeTimers();
|
48
|
+
});
|
49
|
+
afterEach(function () {
|
50
|
+
jest.clearAllMocks();
|
51
|
+
});
|
52
|
+
afterAll(function () {
|
53
|
+
jest.restoreAllMocks();
|
54
|
+
});
|
55
|
+
test('renders ComboBoxField component', function () {
|
56
|
+
getComponent();
|
57
|
+
|
58
|
+
var input = _testWrapper.screen.queryByRole('combobox');
|
59
|
+
|
60
|
+
var label = _testWrapper.screen.getByText(defaultProps.label);
|
61
|
+
|
62
|
+
var button = _testWrapper.screen.queryByRole('button');
|
63
|
+
|
64
|
+
expect(input).toBeInTheDocument();
|
65
|
+
expect(_testWrapper.screen.queryAllByLabelText(defaultProps.label)).toEqual([input, button]);
|
66
|
+
expect(label).toBeInTheDocument();
|
67
|
+
expect(label).toHaveTextContent(defaultProps.label);
|
68
|
+
expect(button).toBeInTheDocument();
|
69
|
+
});
|
70
|
+
test('search is working correctly', function () {
|
71
|
+
getComponent();
|
72
|
+
|
73
|
+
var input = _testWrapper.screen.queryByRole('combobox');
|
74
|
+
|
75
|
+
_userEvent["default"].type(input, testTimeZoneApia);
|
76
|
+
|
77
|
+
expect(_testWrapper.screen.getByText(testTimeZoneApia)).toBeInTheDocument();
|
78
|
+
});
|
79
|
+
test('custom timezone can be added', function () {
|
80
|
+
getComponent({
|
81
|
+
additionalTimeZones: {
|
82
|
+
'(GMT+02:00) Africa/Juba': testTimeZoneJuba
|
83
|
+
}
|
84
|
+
});
|
85
|
+
|
86
|
+
var input = _testWrapper.screen.queryByRole('combobox');
|
87
|
+
|
88
|
+
_userEvent["default"].type(input, testTimeZoneJuba);
|
89
|
+
|
90
|
+
expect(_testWrapper.screen.getByText(testTimeZoneJuba)).toBeInTheDocument();
|
91
|
+
});
|
92
|
+
test('shows custom empty search state text when no items are found', function () {
|
93
|
+
var testEmptyText = 'test empty text';
|
94
|
+
getComponent({
|
95
|
+
emptySearchText: testEmptyText
|
96
|
+
});
|
97
|
+
|
98
|
+
var input = _testWrapper.screen.queryByRole('combobox');
|
99
|
+
|
100
|
+
_userEvent["default"].type(input, 'awdasrf213');
|
101
|
+
|
102
|
+
expect(_testWrapper.screen.getByText(testEmptyText)).toBeInTheDocument();
|
103
|
+
});
|
@@ -0,0 +1,18 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
|
4
|
+
|
5
|
+
var _Object$defineProperty = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
|
6
|
+
|
7
|
+
_Object$defineProperty(exports, "__esModule", {
|
8
|
+
value: true
|
9
|
+
});
|
10
|
+
|
11
|
+
_Object$defineProperty(exports, "default", {
|
12
|
+
enumerable: true,
|
13
|
+
get: function get() {
|
14
|
+
return _TimeZonePicker["default"];
|
15
|
+
}
|
16
|
+
});
|
17
|
+
|
18
|
+
var _TimeZonePicker = _interopRequireDefault(require("./TimeZonePicker"));
|