@pingux/astro 2.178.0-alpha.0 → 2.178.2-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.
@@ -35,7 +35,7 @@ var _pendoID = require("../../utils/devUtils/constants/pendoID");
35
35
  var _helper = require("./helper");
36
36
  var _timezones = _interopRequireWildcard(require("./timezones"));
37
37
  var _react2 = require("@emotion/react");
38
- var _excluded = ["additionalTimeZones", "emptySearchText", "locales", "localeOptions"];
38
+ var _excluded = ["additionalTimeZones", "emptySearchText", "locales", "localeOptions", "selectedKey", "onSelectionChange", "inputValue", "onInputChange"];
39
39
  function _interopRequireWildcard(e, t) { if ("function" == typeof _WeakMap) var r = new _WeakMap(), n = new _WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = _Object$defineProperty) && _Object$getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
40
40
  function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = _filterInstanceProperty2(o).call(o, function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
41
41
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var _context8, _context9; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty2(_context8 = ownKeys(Object(t), !0)).call(_context8, function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty2(_context9 = ownKeys(Object(t))).call(_context9, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
@@ -58,15 +58,23 @@ var TimeZonePicker = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
58
58
  emptySearchText = props.emptySearchText,
59
59
  locales = props.locales,
60
60
  localeOptions = props.localeOptions,
61
+ selectedKeyProp = props.selectedKey,
62
+ onSelectionChangeProp = props.onSelectionChange,
63
+ inputValueProp = props.inputValue,
64
+ onInputChangeProp = props.onInputChange,
61
65
  otherProps = (0, _objectWithoutProperties2["default"])(props, _excluded);
62
- var _useState = (0, _react.useState)(''),
66
+ var isSelectionControlled = selectedKeyProp !== undefined;
67
+ var isInputControlled = inputValueProp !== undefined;
68
+ var _useState = (0, _react.useState)(selectedKeyProp || ''),
63
69
  _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
64
- search = _useState2[0],
65
- setSearch = _useState2[1];
66
- var _useState3 = (0, _react.useState)(''),
70
+ internalInputValue = _useState2[0],
71
+ setInternalInputValue = _useState2[1];
72
+ var _useState3 = (0, _react.useState)(selectedKeyProp || ''),
67
73
  _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
68
- selectedKey = _useState4[0],
69
- setSelectedKey = _useState4[1];
74
+ internalSelectedKey = _useState4[0],
75
+ setInternalSelectedKey = _useState4[1];
76
+ var inputValue = isInputControlled ? inputValueProp : internalInputValue;
77
+ var selectedKey = isSelectionControlled ? selectedKeyProp : internalSelectedKey;
70
78
  var timeZonePickerRef = (0, _react.useRef)();
71
79
  /* istanbul ignore next */
72
80
  (0, _react.useImperativeHandle)(ref, function () {
@@ -100,20 +108,36 @@ var TimeZonePicker = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
100
108
  return a.numericOffset - b.numericOffset;
101
109
  });
102
110
  }, [additionalTimeZones]);
111
+
112
+ // Sync internal input value when controlled selectedKey changes externally
113
+ (0, _react.useEffect)(function () {
114
+ if (isSelectionControlled) {
115
+ if (selectedKeyProp) {
116
+ var item = (0, _find["default"])(allTimeZones).call(allTimeZones, function (tz) {
117
+ return tz.key === selectedKeyProp;
118
+ });
119
+ if (item && !isInputControlled) {
120
+ setInternalInputValue(item.key);
121
+ }
122
+ } else if (!isInputControlled) {
123
+ setInternalInputValue('');
124
+ }
125
+ }
126
+ }, [selectedKeyProp, isSelectionControlled, isInputControlled, allTimeZones]);
103
127
  var filteredItems = (0, _react.useMemo)(function () {
104
128
  var selectedItem = (0, _find["default"])(allTimeZones).call(allTimeZones, function (tz) {
105
129
  return tz.key === selectedKey;
106
130
  });
107
- var isExactMatch = selectedItem && selectedItem.key === search;
108
- if (!search || isExactMatch) {
131
+ var isExactMatch = selectedItem && selectedItem.key === inputValue;
132
+ if (!inputValue || isExactMatch) {
109
133
  return allTimeZones;
110
134
  }
111
- var upperSearch = search.toUpperCase();
135
+ var upperSearch = inputValue.toUpperCase();
112
136
  return (0, _filter["default"])(allTimeZones).call(allTimeZones, function (tz) {
113
137
  var _context7;
114
138
  return (0, _includes["default"])(_context7 = tz.searchTags).call(_context7, upperSearch);
115
139
  });
116
- }, [search, selectedKey, allTimeZones]);
140
+ }, [inputValue, selectedKey, allTimeZones]);
117
141
  var timeData = (0, _react.useMemo)(function () {
118
142
  var now = new Date();
119
143
  var map = new _map2["default"]();
@@ -125,10 +149,16 @@ var TimeZonePicker = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
125
149
  return map;
126
150
  }, [allTimeZones, locales, localeOptions]);
127
151
  var onInputChange = function onInputChange(value) {
128
- setSearch(value);
152
+ if (!isInputControlled) {
153
+ setInternalInputValue(value);
154
+ }
129
155
  if (value === '') {
130
- setSelectedKey(null);
156
+ if (!isSelectionControlled) {
157
+ setInternalSelectedKey(null);
158
+ }
159
+ onSelectionChangeProp === null || onSelectionChangeProp === void 0 || onSelectionChangeProp(null);
131
160
  }
161
+ onInputChangeProp === null || onInputChangeProp === void 0 || onInputChangeProp(value);
132
162
  };
133
163
  var onSelectionChange = function onSelectionChange(key) {
134
164
  if (!key) return;
@@ -136,14 +166,20 @@ var TimeZonePicker = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
136
166
  return item.key === key;
137
167
  });
138
168
  if (selectedItem) {
139
- setSearch(selectedItem.key);
140
- setSelectedKey(key);
169
+ if (!isInputControlled) {
170
+ setInternalInputValue(selectedItem.key);
171
+ }
172
+ if (!isSelectionControlled) {
173
+ setInternalSelectedKey(key);
174
+ }
175
+ onSelectionChangeProp === null || onSelectionChangeProp === void 0 || onSelectionChangeProp(key);
176
+ onInputChangeProp === null || onInputChangeProp === void 0 || onInputChangeProp(selectedItem.key);
141
177
  }
142
178
  };
143
179
  return (0, _react2.jsx)(_index.ComboBoxField, (0, _extends2["default"])({}, (0, _pendoID.getPendoID)('TimeZonePicker'), otherProps, {
144
180
  ref: timeZonePickerRef,
145
181
  items: filteredItems,
146
- inputValue: search,
182
+ inputValue: inputValue,
147
183
  selectedKey: selectedKey,
148
184
  onInputChange: onInputChange,
149
185
  onSelectionChange: onSelectionChange,
@@ -191,7 +227,15 @@ TimeZonePicker.propTypes = {
191
227
  /** 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. */
192
228
  locales: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].arrayOf(_propTypes["default"].string)]),
193
229
  /** 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. */
194
- localeOptions: _propTypes["default"].shape({})
230
+ localeOptions: _propTypes["default"].shape({}),
231
+ /** The key of the currently selected item (controlled). */
232
+ selectedKey: _propTypes["default"].string,
233
+ /** Handler called when the selection changes. Receives the selected key. */
234
+ onSelectionChange: _propTypes["default"].func,
235
+ /** The current input value (controlled). */
236
+ inputValue: _propTypes["default"].string,
237
+ /** Handler called when the input value changes. */
238
+ onInputChange: _propTypes["default"].func
195
239
  };
196
240
  TimeZonePicker.defaultProps = {
197
241
  emptySearchText: 'No Search Result',
@@ -5,7 +5,8 @@ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequ
5
5
  _Object$defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports["default"] = exports.WithCustomTimeZone = exports.Default = void 0;
8
+ exports["default"] = exports.WithCustomTimeZone = exports.Default = exports.Controlled = void 0;
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));
9
10
  var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
10
11
  var _react = _interopRequireDefault(require("react"));
11
12
  var _storybookDocsLayout = _interopRequireDefault(require("../../../.storybook/storybookDocsLayout"));
@@ -28,6 +29,19 @@ var Default = exports.Default = function Default(args) {
28
29
  label: "Default Example"
29
30
  }));
30
31
  };
32
+ var Controlled = exports.Controlled = function Controlled(args) {
33
+ var _React$useState = _react["default"].useState('Pacific/Apia GMT+13:00'),
34
+ _React$useState2 = (0, _slicedToArray2["default"])(_React$useState, 2),
35
+ selectedTimeZone = _React$useState2[0],
36
+ setSelectedTimeZone = _React$useState2[1];
37
+ return (0, _react2.jsx)(_index.TimeZonePicker, (0, _extends2["default"])({}, args, {
38
+ label: "Controlled Example",
39
+ selectedKey: selectedTimeZone,
40
+ onSelectionChange: function onSelectionChange(key) {
41
+ return setSelectedTimeZone(key);
42
+ }
43
+ }));
44
+ };
31
45
  var WithCustomTimeZone = exports.WithCustomTimeZone = function WithCustomTimeZone(args) {
32
46
  var customTimeZone = {
33
47
  '(GMT+02:00) Africa/Juba': 'Africa/Juba'
@@ -20,7 +20,7 @@ var _testWrapper = require("../../utils/testUtils/testWrapper");
20
20
  var _universalComponentTest = require("../../utils/testUtils/universalComponentTest");
21
21
  var _helper = require("./helper");
22
22
  var _react2 = require("@emotion/react");
23
- function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return r; }; var t, r = {}, e = Object.prototype, n = e.hasOwnProperty, o = "function" == typeof _Symbol ? _Symbol : {}, i = o.iterator || "@@iterator", a = o.asyncIterator || "@@asyncIterator", u = o.toStringTag || "@@toStringTag"; function c(t, r, e, n) { return _Object$defineProperty(t, r, { value: e, enumerable: !n, configurable: !n, writable: !n }); } try { c({}, ""); } catch (t) { c = function c(t, r, e) { return t[r] = e; }; } function h(r, e, n, o) { var i = e && e.prototype instanceof Generator ? e : Generator, a = _Object$create(i.prototype); return c(a, "_invoke", function (r, e, n) { var o = 1; return function (i, a) { if (3 === o) throw Error("Generator is already running"); if (4 === o) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var u = n.delegate; if (u) { var c = d(u, n); if (c) { if (c === f) continue; return c; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (1 === o) throw o = 4, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = 3; var h = s(r, e, n); if ("normal" === h.type) { if (o = n.done ? 4 : 2, h.arg === f) continue; return { value: h.arg, done: n.done }; } "throw" === h.type && (o = 4, n.method = "throw", n.arg = h.arg); } }; }(r, n, new Context(o || [])), !0), a; } function s(t, r, e) { try { return { type: "normal", arg: t.call(r, e) }; } catch (t) { return { type: "throw", arg: t }; } } r.wrap = h; var f = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var l = {}; c(l, i, function () { return this; }); var p = _Object$getPrototypeOf, y = p && p(p(x([]))); y && y !== e && n.call(y, i) && (l = y); var v = GeneratorFunctionPrototype.prototype = Generator.prototype = _Object$create(l); function g(t) { var _context6; _forEachInstanceProperty(_context6 = ["next", "throw", "return"]).call(_context6, function (r) { c(t, r, function (t) { return this._invoke(r, t); }); }); } function AsyncIterator(t, r) { function e(o, i, a, u) { var c = s(t[o], t, i); if ("throw" !== c.type) { var h = c.arg, f = h.value; return f && "object" == _typeof(f) && n.call(f, "__await") ? r.resolve(f.__await).then(function (t) { e("next", t, a, u); }, function (t) { e("throw", t, a, u); }) : r.resolve(f).then(function (t) { h.value = t, a(h); }, function (t) { return e("throw", t, a, u); }); } u(c.arg); } var o; c(this, "_invoke", function (t, n) { function i() { return new r(function (r, o) { e(t, n, r, o); }); } return o = o ? o.then(i, i) : i(); }, !0); } function d(r, e) { var n = e.method, o = r.i[n]; if (o === t) return e.delegate = null, "throw" === n && r.i["return"] && (e.method = "return", e.arg = t, d(r, e), "throw" === e.method) || "return" !== n && (e.method = "throw", e.arg = new TypeError("The iterator does not provide a '" + n + "' method")), f; var i = s(o, r.i, e.arg); if ("throw" === i.type) return e.method = "throw", e.arg = i.arg, e.delegate = null, f; var a = i.arg; return a ? a.done ? (e[r.r] = a.value, e.next = r.n, "return" !== e.method && (e.method = "next", e.arg = t), e.delegate = null, f) : a : (e.method = "throw", e.arg = new TypeError("iterator result is not an object"), e.delegate = null, f); } function w(t) { this.tryEntries.push(t); } function m(r) { var e = r[4] || {}; e.type = "normal", e.arg = t, r[4] = e; } function Context(t) { this.tryEntries = [[-1]], _forEachInstanceProperty(t).call(t, w, this), this.reset(!0); } function x(r) { if (null != r) { var e = r[i]; if (e) return e.call(r); if ("function" == typeof r.next) return r; if (!isNaN(r.length)) { var o = -1, a = function e() { for (; ++o < r.length;) if (n.call(r, o)) return e.value = r[o], e.done = !1, e; return e.value = t, e.done = !0, e; }; return a.next = a; } } throw new TypeError(_typeof(r) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, c(v, "constructor", GeneratorFunctionPrototype), c(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = c(GeneratorFunctionPrototype, u, "GeneratorFunction"), r.isGeneratorFunction = function (t) { var r = "function" == typeof t && t.constructor; return !!r && (r === GeneratorFunction || "GeneratorFunction" === (r.displayName || r.name)); }, r.mark = function (t) { return _Object$setPrototypeOf ? _Object$setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, c(t, u, "GeneratorFunction")), t.prototype = _Object$create(v), t; }, r.awrap = function (t) { return { __await: t }; }, g(AsyncIterator.prototype), c(AsyncIterator.prototype, a, function () { return this; }), r.AsyncIterator = AsyncIterator, r.async = function (t, e, n, o, i) { void 0 === i && (i = _Promise); var a = new AsyncIterator(h(t, e, n, o), i); return r.isGeneratorFunction(e) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, g(v), c(v, u, "Generator"), c(v, i, function () { return this; }), c(v, "toString", function () { return "[object Generator]"; }), r.keys = function (t) { var r = Object(t), e = []; for (var n in r) e.unshift(n); return function t() { for (; e.length;) if ((n = e.pop()) in r) return t.value = n, t.done = !1, t; return t.done = !0, t; }; }, r.values = x, Context.prototype = { constructor: Context, reset: function reset(r) { var _context7; if (this.prev = this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, _forEachInstanceProperty(_context7 = this.tryEntries).call(_context7, m), !r) for (var e in this) "t" === e.charAt(0) && n.call(this, e) && !isNaN(+_sliceInstanceProperty(e).call(e, 1)) && (this[e] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0][4]; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(r) { if (this.done) throw r; var e = this; function n(t) { a.type = "throw", a.arg = r, e.next = t; } for (var o = e.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i[4], u = this.prev, c = i[1], h = i[2]; if (-1 === i[0]) return n("end"), !1; if (!c && !h) throw Error("try statement without catch or finally"); if (null != i[0] && i[0] <= u) { if (u < c) return this.method = "next", this.arg = t, n(c), !0; if (u < h) return n(h), !1; } } }, abrupt: function abrupt(t, r) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var n = this.tryEntries[e]; if (n[0] > -1 && n[0] <= this.prev && this.prev < n[2]) { var o = n; break; } } o && ("break" === t || "continue" === t) && o[0] <= r && r <= o[2] && (o = null); var i = o ? o[4] : {}; return i.type = t, i.arg = r, o ? (this.method = "next", this.next = o[2], f) : this.complete(i); }, complete: function complete(t, r) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && r && (this.next = r), f; }, finish: function finish(t) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var e = this.tryEntries[r]; if (e[2] === t) return this.complete(e[4], e[3]), m(e), f; } }, "catch": function _catch(t) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var e = this.tryEntries[r]; if (e[0] === t) { var n = e[4]; if ("throw" === n.type) { var o = n.arg; m(e); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(r, e, n) { return this.delegate = { i: x(r), r: e, n: n }, "next" === this.method && (this.arg = t), f; } }, r; }
23
+ function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return r; }; var t, r = {}, e = Object.prototype, n = e.hasOwnProperty, o = "function" == typeof _Symbol ? _Symbol : {}, i = o.iterator || "@@iterator", a = o.asyncIterator || "@@asyncIterator", u = o.toStringTag || "@@toStringTag"; function c(t, r, e, n) { return _Object$defineProperty(t, r, { value: e, enumerable: !n, configurable: !n, writable: !n }); } try { c({}, ""); } catch (t) { c = function c(t, r, e) { return t[r] = e; }; } function h(r, e, n, o) { var i = e && e.prototype instanceof Generator ? e : Generator, a = _Object$create(i.prototype); return c(a, "_invoke", function (r, e, n) { var o = 1; return function (i, a) { if (3 === o) throw Error("Generator is already running"); if (4 === o) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var u = n.delegate; if (u) { var c = d(u, n); if (c) { if (c === f) continue; return c; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (1 === o) throw o = 4, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = 3; var h = s(r, e, n); if ("normal" === h.type) { if (o = n.done ? 4 : 2, h.arg === f) continue; return { value: h.arg, done: n.done }; } "throw" === h.type && (o = 4, n.method = "throw", n.arg = h.arg); } }; }(r, n, new Context(o || [])), !0), a; } function s(t, r, e) { try { return { type: "normal", arg: t.call(r, e) }; } catch (t) { return { type: "throw", arg: t }; } } r.wrap = h; var f = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var l = {}; c(l, i, function () { return this; }); var p = _Object$getPrototypeOf, y = p && p(p(x([]))); y && y !== e && n.call(y, i) && (l = y); var v = GeneratorFunctionPrototype.prototype = Generator.prototype = _Object$create(l); function g(t) { var _context12; _forEachInstanceProperty(_context12 = ["next", "throw", "return"]).call(_context12, function (r) { c(t, r, function (t) { return this._invoke(r, t); }); }); } function AsyncIterator(t, r) { function e(o, i, a, u) { var c = s(t[o], t, i); if ("throw" !== c.type) { var h = c.arg, f = h.value; return f && "object" == _typeof(f) && n.call(f, "__await") ? r.resolve(f.__await).then(function (t) { e("next", t, a, u); }, function (t) { e("throw", t, a, u); }) : r.resolve(f).then(function (t) { h.value = t, a(h); }, function (t) { return e("throw", t, a, u); }); } u(c.arg); } var o; c(this, "_invoke", function (t, n) { function i() { return new r(function (r, o) { e(t, n, r, o); }); } return o = o ? o.then(i, i) : i(); }, !0); } function d(r, e) { var n = e.method, o = r.i[n]; if (o === t) return e.delegate = null, "throw" === n && r.i["return"] && (e.method = "return", e.arg = t, d(r, e), "throw" === e.method) || "return" !== n && (e.method = "throw", e.arg = new TypeError("The iterator does not provide a '" + n + "' method")), f; var i = s(o, r.i, e.arg); if ("throw" === i.type) return e.method = "throw", e.arg = i.arg, e.delegate = null, f; var a = i.arg; return a ? a.done ? (e[r.r] = a.value, e.next = r.n, "return" !== e.method && (e.method = "next", e.arg = t), e.delegate = null, f) : a : (e.method = "throw", e.arg = new TypeError("iterator result is not an object"), e.delegate = null, f); } function w(t) { this.tryEntries.push(t); } function m(r) { var e = r[4] || {}; e.type = "normal", e.arg = t, r[4] = e; } function Context(t) { this.tryEntries = [[-1]], _forEachInstanceProperty(t).call(t, w, this), this.reset(!0); } function x(r) { if (null != r) { var e = r[i]; if (e) return e.call(r); if ("function" == typeof r.next) return r; if (!isNaN(r.length)) { var o = -1, a = function e() { for (; ++o < r.length;) if (n.call(r, o)) return e.value = r[o], e.done = !1, e; return e.value = t, e.done = !0, e; }; return a.next = a; } } throw new TypeError(_typeof(r) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, c(v, "constructor", GeneratorFunctionPrototype), c(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = c(GeneratorFunctionPrototype, u, "GeneratorFunction"), r.isGeneratorFunction = function (t) { var r = "function" == typeof t && t.constructor; return !!r && (r === GeneratorFunction || "GeneratorFunction" === (r.displayName || r.name)); }, r.mark = function (t) { return _Object$setPrototypeOf ? _Object$setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, c(t, u, "GeneratorFunction")), t.prototype = _Object$create(v), t; }, r.awrap = function (t) { return { __await: t }; }, g(AsyncIterator.prototype), c(AsyncIterator.prototype, a, function () { return this; }), r.AsyncIterator = AsyncIterator, r.async = function (t, e, n, o, i) { void 0 === i && (i = _Promise); var a = new AsyncIterator(h(t, e, n, o), i); return r.isGeneratorFunction(e) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, g(v), c(v, u, "Generator"), c(v, i, function () { return this; }), c(v, "toString", function () { return "[object Generator]"; }), r.keys = function (t) { var r = Object(t), e = []; for (var n in r) e.unshift(n); return function t() { for (; e.length;) if ((n = e.pop()) in r) return t.value = n, t.done = !1, t; return t.done = !0, t; }; }, r.values = x, Context.prototype = { constructor: Context, reset: function reset(r) { var _context13; if (this.prev = this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, _forEachInstanceProperty(_context13 = this.tryEntries).call(_context13, m), !r) for (var e in this) "t" === e.charAt(0) && n.call(this, e) && !isNaN(+_sliceInstanceProperty(e).call(e, 1)) && (this[e] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0][4]; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(r) { if (this.done) throw r; var e = this; function n(t) { a.type = "throw", a.arg = r, e.next = t; } for (var o = e.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i[4], u = this.prev, c = i[1], h = i[2]; if (-1 === i[0]) return n("end"), !1; if (!c && !h) throw Error("try statement without catch or finally"); if (null != i[0] && i[0] <= u) { if (u < c) return this.method = "next", this.arg = t, n(c), !0; if (u < h) return n(h), !1; } } }, abrupt: function abrupt(t, r) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var n = this.tryEntries[e]; if (n[0] > -1 && n[0] <= this.prev && this.prev < n[2]) { var o = n; break; } } o && ("break" === t || "continue" === t) && o[0] <= r && r <= o[2] && (o = null); var i = o ? o[4] : {}; return i.type = t, i.arg = r, o ? (this.method = "next", this.next = o[2], f) : this.complete(i); }, complete: function complete(t, r) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && r && (this.next = r), f; }, finish: function finish(t) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var e = this.tryEntries[r]; if (e[2] === t) return this.complete(e[4], e[3]), m(e), f; } }, "catch": function _catch(t) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var e = this.tryEntries[r]; if (e[0] === t) { var n = e[4]; if ("throw" === n.type) { var o = n.arg; m(e); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(r, e, n) { return this.delegate = { i: x(r), r: e, n: n }, "next" === this.method && (this.arg = t), f; } }, r; }
24
24
  jest.mock('./helper', function () {
25
25
  return {
26
26
  getGmtAndOffset: jest.fn().mockReturnValue({
@@ -164,4 +164,233 @@ test('selecting a timezone updates the input value', /*#__PURE__*/(0, _asyncToGe
164
164
  return _context4.stop();
165
165
  }
166
166
  }, _callee4);
167
- })));
167
+ })));
168
+ test('controlled selectedKey sets the input value', function () {
169
+ var selectedKey = 'America/New York GMT-00:00';
170
+ getComponent({
171
+ selectedKey: selectedKey
172
+ });
173
+ var input = _testWrapper.screen.getByRole('combobox');
174
+ expect(input).toHaveValue(selectedKey);
175
+ });
176
+ test('controlled onSelectionChange is called when an item is selected', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {
177
+ var onSelectionChange, timezone, gmtAndOffset, expectedKey, input, option;
178
+ return _regeneratorRuntime().wrap(function _callee5$(_context6) {
179
+ var _context7;
180
+ while (1) switch (_context6.prev = _context6.next) {
181
+ case 0:
182
+ onSelectionChange = jest.fn();
183
+ timezone = 'America/New York';
184
+ gmtAndOffset = (0, _helper.getGmtAndOffset)(timezone);
185
+ expectedKey = (0, _concat["default"])(_context7 = "".concat(timezone, " ")).call(_context7, gmtAndOffset.gmt);
186
+ getComponent({
187
+ onSelectionChange: onSelectionChange
188
+ });
189
+ input = _testWrapper.screen.getByRole('combobox');
190
+ _context6.next = 8;
191
+ return _userEvent["default"].type(input, timezone);
192
+ case 8:
193
+ option = _testWrapper.screen.getByRole('option', {
194
+ key: expectedKey
195
+ });
196
+ _context6.next = 11;
197
+ return _userEvent["default"].click(option);
198
+ case 11:
199
+ expect(onSelectionChange).toHaveBeenCalledWith(expectedKey);
200
+ case 12:
201
+ case "end":
202
+ return _context6.stop();
203
+ }
204
+ }, _callee5);
205
+ })));
206
+ test('controlled onSelectionChange is called with null when input is cleared', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee6() {
207
+ var onSelectionChange, input;
208
+ return _regeneratorRuntime().wrap(function _callee6$(_context8) {
209
+ while (1) switch (_context8.prev = _context8.next) {
210
+ case 0:
211
+ onSelectionChange = jest.fn();
212
+ getComponent({
213
+ onSelectionChange: onSelectionChange,
214
+ selectedKey: 'America/New York GMT-00:00'
215
+ });
216
+ input = _testWrapper.screen.getByRole('combobox');
217
+ _context8.next = 5;
218
+ return _userEvent["default"].clear(input);
219
+ case 5:
220
+ expect(onSelectionChange).toHaveBeenCalledWith(null);
221
+ case 6:
222
+ case "end":
223
+ return _context8.stop();
224
+ }
225
+ }, _callee6);
226
+ })));
227
+ test('controlled onInputChange is called when typing', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee7() {
228
+ var onInputChange, input;
229
+ return _regeneratorRuntime().wrap(function _callee7$(_context9) {
230
+ while (1) switch (_context9.prev = _context9.next) {
231
+ case 0:
232
+ onInputChange = jest.fn();
233
+ getComponent({
234
+ onInputChange: onInputChange
235
+ });
236
+ input = _testWrapper.screen.getByRole('combobox');
237
+ _context9.next = 5;
238
+ return _userEvent["default"].type(input, 'Pac');
239
+ case 5:
240
+ expect(onInputChange).toHaveBeenCalled();
241
+ case 6:
242
+ case "end":
243
+ return _context9.stop();
244
+ }
245
+ }, _callee7);
246
+ })));
247
+ test('supports controlled inputValue', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee8() {
248
+ var onInputChange, input;
249
+ return _regeneratorRuntime().wrap(function _callee8$(_context0) {
250
+ while (1) switch (_context0.prev = _context0.next) {
251
+ case 0:
252
+ onInputChange = jest.fn();
253
+ getComponent({
254
+ inputValue: 'Pacific',
255
+ onInputChange: onInputChange
256
+ });
257
+ input = _testWrapper.screen.getByRole('combobox');
258
+ expect(input).toHaveValue('Pacific');
259
+ case 4:
260
+ case "end":
261
+ return _context0.stop();
262
+ }
263
+ }, _callee8);
264
+ })));
265
+ test('passes isDisabled to ComboBoxField', function () {
266
+ getComponent({
267
+ isDisabled: true
268
+ });
269
+ var input = _testWrapper.screen.getByRole('combobox');
270
+ expect(input).toBeDisabled();
271
+ });
272
+ test('passes isRequired to ComboBoxField', function () {
273
+ getComponent({
274
+ isRequired: true
275
+ });
276
+ var input = _testWrapper.screen.getByRole('combobox');
277
+ expect(input).toBeRequired();
278
+ });
279
+ test('passes isReadOnly to ComboBoxField', function () {
280
+ getComponent({
281
+ isReadOnly: true
282
+ });
283
+ var input = _testWrapper.screen.getByRole('combobox');
284
+ expect(input).toHaveAttribute('readonly');
285
+ });
286
+ test('passes placeholder to ComboBoxField', function () {
287
+ getComponent({
288
+ placeholder: 'Select a timezone'
289
+ });
290
+ var input = _testWrapper.screen.getByRole('combobox');
291
+ expect(input).toHaveAttribute('placeholder', 'Select a timezone');
292
+ });
293
+ test('passes helperText to ComboBoxField', function () {
294
+ getComponent({
295
+ helperText: 'Choose your preferred timezone'
296
+ });
297
+ expect(_testWrapper.screen.getByText('Choose your preferred timezone')).toBeInTheDocument();
298
+ });
299
+ test('passes status to ComboBoxField', function () {
300
+ getComponent({
301
+ status: 'error',
302
+ helperText: 'This field is required'
303
+ });
304
+ expect(_testWrapper.screen.getByText('This field is required')).toBeInTheDocument();
305
+ });
306
+ test('calls onOpenChange when menu opens', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee9() {
307
+ var onOpenChange, input;
308
+ return _regeneratorRuntime().wrap(function _callee9$(_context1) {
309
+ while (1) switch (_context1.prev = _context1.next) {
310
+ case 0:
311
+ onOpenChange = jest.fn();
312
+ getComponent({
313
+ onOpenChange: onOpenChange
314
+ });
315
+ input = _testWrapper.screen.getByRole('combobox');
316
+ _context1.next = 5;
317
+ return _userEvent["default"].type(input, 'America');
318
+ case 5:
319
+ expect(onOpenChange).toHaveBeenCalledWith(true, 'input');
320
+ case 6:
321
+ case "end":
322
+ return _context1.stop();
323
+ }
324
+ }, _callee9);
325
+ })));
326
+ test('clears selection when input is cleared in uncontrolled mode', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regeneratorRuntime().mark(function _callee0() {
327
+ var onSelectionChange, onInputChange, timezone, gmtAndOffset, expectedOptionText, input, option;
328
+ return _regeneratorRuntime().wrap(function _callee0$(_context10) {
329
+ var _context11;
330
+ while (1) switch (_context10.prev = _context10.next) {
331
+ case 0:
332
+ onSelectionChange = jest.fn();
333
+ onInputChange = jest.fn();
334
+ timezone = 'America/New York';
335
+ gmtAndOffset = (0, _helper.getGmtAndOffset)(timezone);
336
+ expectedOptionText = (0, _concat["default"])(_context11 = "".concat(timezone, " ")).call(_context11, gmtAndOffset.gmt);
337
+ getComponent({
338
+ onSelectionChange: onSelectionChange,
339
+ onInputChange: onInputChange
340
+ });
341
+ input = _testWrapper.screen.getByRole('combobox');
342
+ _context10.next = 9;
343
+ return _userEvent["default"].type(input, timezone);
344
+ case 9:
345
+ option = _testWrapper.screen.getByRole('option', {
346
+ key: expectedOptionText
347
+ });
348
+ _context10.next = 12;
349
+ return _userEvent["default"].click(option);
350
+ case 12:
351
+ expect(onSelectionChange).toHaveBeenCalledWith(expectedOptionText);
352
+ _context10.next = 15;
353
+ return _userEvent["default"].clear(input);
354
+ case 15:
355
+ expect(onInputChange).toHaveBeenCalledWith('');
356
+ case 16:
357
+ case "end":
358
+ return _context10.stop();
359
+ }
360
+ }, _callee0);
361
+ })));
362
+ test('displays pre-selected value on initial render with controlled selectedKey', function () {
363
+ var timezone = 'America/New York';
364
+ var gmtAndOffset = (0, _helper.getGmtAndOffset)(timezone);
365
+ var expectedOptionText = "".concat(timezone, " ").concat(gmtAndOffset.gmt);
366
+ getComponent({
367
+ selectedKey: expectedOptionText
368
+ });
369
+ var input = _testWrapper.screen.getByRole('combobox');
370
+ expect(input).toHaveValue(expectedOptionText);
371
+ });
372
+ test('displays pre-selected value with additionalTimeZones', function () {
373
+ var timezone = 'Africa/Juba';
374
+ var gmtAndOffset = (0, _helper.getGmtAndOffset)(timezone);
375
+ var expectedOptionText = "".concat(timezone, " ").concat(gmtAndOffset.gmt);
376
+ getComponent({
377
+ additionalTimeZones: {
378
+ '(GMT+02:00) Africa/Juba': testTimeZoneJuba
379
+ },
380
+ selectedKey: expectedOptionText
381
+ });
382
+ var input = _testWrapper.screen.getByRole('combobox');
383
+ expect(input).toHaveValue(expectedOptionText);
384
+ });
385
+ test('displays pre-selected value with controlled inputValue', function () {
386
+ var timezone = 'America/New York';
387
+ var gmtAndOffset = (0, _helper.getGmtAndOffset)(timezone);
388
+ var expectedOptionText = "".concat(timezone, " ").concat(gmtAndOffset.gmt);
389
+ getComponent({
390
+ selectedKey: expectedOptionText,
391
+ inputValue: expectedOptionText,
392
+ onInputChange: jest.fn()
393
+ });
394
+ var input = _testWrapper.screen.getByRole('combobox');
395
+ expect(input).toHaveValue(expectedOptionText);
396
+ });
@@ -2,7 +2,7 @@ import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
2
2
  import _defineProperty from "@babel/runtime-corejs3/helpers/esm/defineProperty";
3
3
  import _slicedToArray from "@babel/runtime-corejs3/helpers/esm/slicedToArray";
4
4
  import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/esm/objectWithoutProperties";
5
- var _excluded = ["additionalTimeZones", "emptySearchText", "locales", "localeOptions"];
5
+ var _excluded = ["additionalTimeZones", "emptySearchText", "locales", "localeOptions", "selectedKey", "onSelectionChange", "inputValue", "onInputChange"];
6
6
  function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = _filterInstanceProperty(o).call(o, function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
7
7
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var _context8, _context9; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context8 = ownKeys(Object(t), !0)).call(_context8, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context9 = ownKeys(Object(t))).call(_context9, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
8
8
  import _includesInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/includes";
@@ -20,7 +20,7 @@ import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-sta
20
20
  import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors";
21
21
  import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties";
22
22
  import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property";
23
- import React, { forwardRef, useImperativeHandle, useMemo, useRef, useState } from 'react';
23
+ import React, { forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
24
24
  import PropTypes from 'prop-types';
25
25
  import { Box, ComboBoxField, Item, Text } from '../../index';
26
26
  import { getPendoID } from '../../utils/devUtils/constants/pendoID';
@@ -46,15 +46,23 @@ var TimeZonePicker = /*#__PURE__*/forwardRef(function (props, ref) {
46
46
  emptySearchText = props.emptySearchText,
47
47
  locales = props.locales,
48
48
  localeOptions = props.localeOptions,
49
+ selectedKeyProp = props.selectedKey,
50
+ onSelectionChangeProp = props.onSelectionChange,
51
+ inputValueProp = props.inputValue,
52
+ onInputChangeProp = props.onInputChange,
49
53
  otherProps = _objectWithoutProperties(props, _excluded);
50
- var _useState = useState(''),
54
+ var isSelectionControlled = selectedKeyProp !== undefined;
55
+ var isInputControlled = inputValueProp !== undefined;
56
+ var _useState = useState(selectedKeyProp || ''),
51
57
  _useState2 = _slicedToArray(_useState, 2),
52
- search = _useState2[0],
53
- setSearch = _useState2[1];
54
- var _useState3 = useState(''),
58
+ internalInputValue = _useState2[0],
59
+ setInternalInputValue = _useState2[1];
60
+ var _useState3 = useState(selectedKeyProp || ''),
55
61
  _useState4 = _slicedToArray(_useState3, 2),
56
- selectedKey = _useState4[0],
57
- setSelectedKey = _useState4[1];
62
+ internalSelectedKey = _useState4[0],
63
+ setInternalSelectedKey = _useState4[1];
64
+ var inputValue = isInputControlled ? inputValueProp : internalInputValue;
65
+ var selectedKey = isSelectionControlled ? selectedKeyProp : internalSelectedKey;
58
66
  var timeZonePickerRef = useRef();
59
67
  /* istanbul ignore next */
60
68
  useImperativeHandle(ref, function () {
@@ -88,20 +96,36 @@ var TimeZonePicker = /*#__PURE__*/forwardRef(function (props, ref) {
88
96
  return a.numericOffset - b.numericOffset;
89
97
  });
90
98
  }, [additionalTimeZones]);
99
+
100
+ // Sync internal input value when controlled selectedKey changes externally
101
+ useEffect(function () {
102
+ if (isSelectionControlled) {
103
+ if (selectedKeyProp) {
104
+ var item = _findInstanceProperty(allTimeZones).call(allTimeZones, function (tz) {
105
+ return tz.key === selectedKeyProp;
106
+ });
107
+ if (item && !isInputControlled) {
108
+ setInternalInputValue(item.key);
109
+ }
110
+ } else if (!isInputControlled) {
111
+ setInternalInputValue('');
112
+ }
113
+ }
114
+ }, [selectedKeyProp, isSelectionControlled, isInputControlled, allTimeZones]);
91
115
  var filteredItems = useMemo(function () {
92
116
  var selectedItem = _findInstanceProperty(allTimeZones).call(allTimeZones, function (tz) {
93
117
  return tz.key === selectedKey;
94
118
  });
95
- var isExactMatch = selectedItem && selectedItem.key === search;
96
- if (!search || isExactMatch) {
119
+ var isExactMatch = selectedItem && selectedItem.key === inputValue;
120
+ if (!inputValue || isExactMatch) {
97
121
  return allTimeZones;
98
122
  }
99
- var upperSearch = search.toUpperCase();
123
+ var upperSearch = inputValue.toUpperCase();
100
124
  return _filterInstanceProperty(allTimeZones).call(allTimeZones, function (tz) {
101
125
  var _context7;
102
126
  return _includesInstanceProperty(_context7 = tz.searchTags).call(_context7, upperSearch);
103
127
  });
104
- }, [search, selectedKey, allTimeZones]);
128
+ }, [inputValue, selectedKey, allTimeZones]);
105
129
  var timeData = useMemo(function () {
106
130
  var now = new Date();
107
131
  var map = new _Map();
@@ -113,10 +137,16 @@ var TimeZonePicker = /*#__PURE__*/forwardRef(function (props, ref) {
113
137
  return map;
114
138
  }, [allTimeZones, locales, localeOptions]);
115
139
  var onInputChange = function onInputChange(value) {
116
- setSearch(value);
140
+ if (!isInputControlled) {
141
+ setInternalInputValue(value);
142
+ }
117
143
  if (value === '') {
118
- setSelectedKey(null);
144
+ if (!isSelectionControlled) {
145
+ setInternalSelectedKey(null);
146
+ }
147
+ onSelectionChangeProp === null || onSelectionChangeProp === void 0 || onSelectionChangeProp(null);
119
148
  }
149
+ onInputChangeProp === null || onInputChangeProp === void 0 || onInputChangeProp(value);
120
150
  };
121
151
  var onSelectionChange = function onSelectionChange(key) {
122
152
  if (!key) return;
@@ -124,14 +154,20 @@ var TimeZonePicker = /*#__PURE__*/forwardRef(function (props, ref) {
124
154
  return item.key === key;
125
155
  });
126
156
  if (selectedItem) {
127
- setSearch(selectedItem.key);
128
- setSelectedKey(key);
157
+ if (!isInputControlled) {
158
+ setInternalInputValue(selectedItem.key);
159
+ }
160
+ if (!isSelectionControlled) {
161
+ setInternalSelectedKey(key);
162
+ }
163
+ onSelectionChangeProp === null || onSelectionChangeProp === void 0 || onSelectionChangeProp(key);
164
+ onInputChangeProp === null || onInputChangeProp === void 0 || onInputChangeProp(selectedItem.key);
129
165
  }
130
166
  };
131
167
  return ___EmotionJSX(ComboBoxField, _extends({}, getPendoID('TimeZonePicker'), otherProps, {
132
168
  ref: timeZonePickerRef,
133
169
  items: filteredItems,
134
- inputValue: search,
170
+ inputValue: inputValue,
135
171
  selectedKey: selectedKey,
136
172
  onInputChange: onInputChange,
137
173
  onSelectionChange: onSelectionChange,
@@ -179,7 +215,15 @@ TimeZonePicker.propTypes = {
179
215
  /** 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. */
180
216
  locales: PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.string)]),
181
217
  /** 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. */
182
- localeOptions: PropTypes.shape({})
218
+ localeOptions: PropTypes.shape({}),
219
+ /** The key of the currently selected item (controlled). */
220
+ selectedKey: PropTypes.string,
221
+ /** Handler called when the selection changes. Receives the selected key. */
222
+ onSelectionChange: PropTypes.func,
223
+ /** The current input value (controlled). */
224
+ inputValue: PropTypes.string,
225
+ /** Handler called when the input value changes. */
226
+ onInputChange: PropTypes.func
183
227
  };
184
228
  TimeZonePicker.defaultProps = {
185
229
  emptySearchText: 'No Search Result',
@@ -1,3 +1,4 @@
1
+ import _slicedToArray from "@babel/runtime-corejs3/helpers/esm/slicedToArray";
1
2
  import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
2
3
  import React from 'react';
3
4
  import DocsLayout from '../../../.storybook/storybookDocsLayout';
@@ -20,6 +21,19 @@ export var Default = function Default(args) {
20
21
  label: "Default Example"
21
22
  }));
22
23
  };
24
+ export var Controlled = function Controlled(args) {
25
+ var _React$useState = React.useState('Pacific/Apia GMT+13:00'),
26
+ _React$useState2 = _slicedToArray(_React$useState, 2),
27
+ selectedTimeZone = _React$useState2[0],
28
+ setSelectedTimeZone = _React$useState2[1];
29
+ return ___EmotionJSX(TimeZonePicker, _extends({}, args, {
30
+ label: "Controlled Example",
31
+ selectedKey: selectedTimeZone,
32
+ onSelectionChange: function onSelectionChange(key) {
33
+ return setSelectedTimeZone(key);
34
+ }
35
+ }));
36
+ };
23
37
  export var WithCustomTimeZone = function WithCustomTimeZone(args) {
24
38
  var customTimeZone = {
25
39
  '(GMT+02:00) Africa/Juba': 'Africa/Juba'
@@ -10,7 +10,7 @@ import _typeof from "@babel/runtime-corejs3/helpers/esm/typeof";
10
10
  import _asyncToGenerator from "@babel/runtime-corejs3/helpers/esm/asyncToGenerator";
11
11
  import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
12
12
  import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat";
13
- function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return r; }; var t, r = {}, e = Object.prototype, n = e.hasOwnProperty, o = "function" == typeof _Symbol ? _Symbol : {}, i = o.iterator || "@@iterator", a = o.asyncIterator || "@@asyncIterator", u = o.toStringTag || "@@toStringTag"; function c(t, r, e, n) { return _Object$defineProperty(t, r, { value: e, enumerable: !n, configurable: !n, writable: !n }); } try { c({}, ""); } catch (t) { c = function c(t, r, e) { return t[r] = e; }; } function h(r, e, n, o) { var i = e && e.prototype instanceof Generator ? e : Generator, a = _Object$create(i.prototype); return c(a, "_invoke", function (r, e, n) { var o = 1; return function (i, a) { if (3 === o) throw Error("Generator is already running"); if (4 === o) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var u = n.delegate; if (u) { var c = d(u, n); if (c) { if (c === f) continue; return c; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (1 === o) throw o = 4, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = 3; var h = s(r, e, n); if ("normal" === h.type) { if (o = n.done ? 4 : 2, h.arg === f) continue; return { value: h.arg, done: n.done }; } "throw" === h.type && (o = 4, n.method = "throw", n.arg = h.arg); } }; }(r, n, new Context(o || [])), !0), a; } function s(t, r, e) { try { return { type: "normal", arg: t.call(r, e) }; } catch (t) { return { type: "throw", arg: t }; } } r.wrap = h; var f = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var l = {}; c(l, i, function () { return this; }); var p = _Object$getPrototypeOf, y = p && p(p(x([]))); y && y !== e && n.call(y, i) && (l = y); var v = GeneratorFunctionPrototype.prototype = Generator.prototype = _Object$create(l); function g(t) { var _context6; _forEachInstanceProperty(_context6 = ["next", "throw", "return"]).call(_context6, function (r) { c(t, r, function (t) { return this._invoke(r, t); }); }); } function AsyncIterator(t, r) { function e(o, i, a, u) { var c = s(t[o], t, i); if ("throw" !== c.type) { var h = c.arg, f = h.value; return f && "object" == _typeof(f) && n.call(f, "__await") ? r.resolve(f.__await).then(function (t) { e("next", t, a, u); }, function (t) { e("throw", t, a, u); }) : r.resolve(f).then(function (t) { h.value = t, a(h); }, function (t) { return e("throw", t, a, u); }); } u(c.arg); } var o; c(this, "_invoke", function (t, n) { function i() { return new r(function (r, o) { e(t, n, r, o); }); } return o = o ? o.then(i, i) : i(); }, !0); } function d(r, e) { var n = e.method, o = r.i[n]; if (o === t) return e.delegate = null, "throw" === n && r.i["return"] && (e.method = "return", e.arg = t, d(r, e), "throw" === e.method) || "return" !== n && (e.method = "throw", e.arg = new TypeError("The iterator does not provide a '" + n + "' method")), f; var i = s(o, r.i, e.arg); if ("throw" === i.type) return e.method = "throw", e.arg = i.arg, e.delegate = null, f; var a = i.arg; return a ? a.done ? (e[r.r] = a.value, e.next = r.n, "return" !== e.method && (e.method = "next", e.arg = t), e.delegate = null, f) : a : (e.method = "throw", e.arg = new TypeError("iterator result is not an object"), e.delegate = null, f); } function w(t) { this.tryEntries.push(t); } function m(r) { var e = r[4] || {}; e.type = "normal", e.arg = t, r[4] = e; } function Context(t) { this.tryEntries = [[-1]], _forEachInstanceProperty(t).call(t, w, this), this.reset(!0); } function x(r) { if (null != r) { var e = r[i]; if (e) return e.call(r); if ("function" == typeof r.next) return r; if (!isNaN(r.length)) { var o = -1, a = function e() { for (; ++o < r.length;) if (n.call(r, o)) return e.value = r[o], e.done = !1, e; return e.value = t, e.done = !0, e; }; return a.next = a; } } throw new TypeError(_typeof(r) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, c(v, "constructor", GeneratorFunctionPrototype), c(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = c(GeneratorFunctionPrototype, u, "GeneratorFunction"), r.isGeneratorFunction = function (t) { var r = "function" == typeof t && t.constructor; return !!r && (r === GeneratorFunction || "GeneratorFunction" === (r.displayName || r.name)); }, r.mark = function (t) { return _Object$setPrototypeOf ? _Object$setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, c(t, u, "GeneratorFunction")), t.prototype = _Object$create(v), t; }, r.awrap = function (t) { return { __await: t }; }, g(AsyncIterator.prototype), c(AsyncIterator.prototype, a, function () { return this; }), r.AsyncIterator = AsyncIterator, r.async = function (t, e, n, o, i) { void 0 === i && (i = _Promise); var a = new AsyncIterator(h(t, e, n, o), i); return r.isGeneratorFunction(e) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, g(v), c(v, u, "Generator"), c(v, i, function () { return this; }), c(v, "toString", function () { return "[object Generator]"; }), r.keys = function (t) { var r = Object(t), e = []; for (var n in r) e.unshift(n); return function t() { for (; e.length;) if ((n = e.pop()) in r) return t.value = n, t.done = !1, t; return t.done = !0, t; }; }, r.values = x, Context.prototype = { constructor: Context, reset: function reset(r) { var _context7; if (this.prev = this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, _forEachInstanceProperty(_context7 = this.tryEntries).call(_context7, m), !r) for (var e in this) "t" === e.charAt(0) && n.call(this, e) && !isNaN(+_sliceInstanceProperty(e).call(e, 1)) && (this[e] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0][4]; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(r) { if (this.done) throw r; var e = this; function n(t) { a.type = "throw", a.arg = r, e.next = t; } for (var o = e.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i[4], u = this.prev, c = i[1], h = i[2]; if (-1 === i[0]) return n("end"), !1; if (!c && !h) throw Error("try statement without catch or finally"); if (null != i[0] && i[0] <= u) { if (u < c) return this.method = "next", this.arg = t, n(c), !0; if (u < h) return n(h), !1; } } }, abrupt: function abrupt(t, r) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var n = this.tryEntries[e]; if (n[0] > -1 && n[0] <= this.prev && this.prev < n[2]) { var o = n; break; } } o && ("break" === t || "continue" === t) && o[0] <= r && r <= o[2] && (o = null); var i = o ? o[4] : {}; return i.type = t, i.arg = r, o ? (this.method = "next", this.next = o[2], f) : this.complete(i); }, complete: function complete(t, r) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && r && (this.next = r), f; }, finish: function finish(t) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var e = this.tryEntries[r]; if (e[2] === t) return this.complete(e[4], e[3]), m(e), f; } }, "catch": function _catch(t) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var e = this.tryEntries[r]; if (e[0] === t) { var n = e[4]; if ("throw" === n.type) { var o = n.arg; m(e); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(r, e, n) { return this.delegate = { i: x(r), r: e, n: n }, "next" === this.method && (this.arg = t), f; } }, r; }
13
+ function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return r; }; var t, r = {}, e = Object.prototype, n = e.hasOwnProperty, o = "function" == typeof _Symbol ? _Symbol : {}, i = o.iterator || "@@iterator", a = o.asyncIterator || "@@asyncIterator", u = o.toStringTag || "@@toStringTag"; function c(t, r, e, n) { return _Object$defineProperty(t, r, { value: e, enumerable: !n, configurable: !n, writable: !n }); } try { c({}, ""); } catch (t) { c = function c(t, r, e) { return t[r] = e; }; } function h(r, e, n, o) { var i = e && e.prototype instanceof Generator ? e : Generator, a = _Object$create(i.prototype); return c(a, "_invoke", function (r, e, n) { var o = 1; return function (i, a) { if (3 === o) throw Error("Generator is already running"); if (4 === o) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var u = n.delegate; if (u) { var c = d(u, n); if (c) { if (c === f) continue; return c; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (1 === o) throw o = 4, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = 3; var h = s(r, e, n); if ("normal" === h.type) { if (o = n.done ? 4 : 2, h.arg === f) continue; return { value: h.arg, done: n.done }; } "throw" === h.type && (o = 4, n.method = "throw", n.arg = h.arg); } }; }(r, n, new Context(o || [])), !0), a; } function s(t, r, e) { try { return { type: "normal", arg: t.call(r, e) }; } catch (t) { return { type: "throw", arg: t }; } } r.wrap = h; var f = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var l = {}; c(l, i, function () { return this; }); var p = _Object$getPrototypeOf, y = p && p(p(x([]))); y && y !== e && n.call(y, i) && (l = y); var v = GeneratorFunctionPrototype.prototype = Generator.prototype = _Object$create(l); function g(t) { var _context12; _forEachInstanceProperty(_context12 = ["next", "throw", "return"]).call(_context12, function (r) { c(t, r, function (t) { return this._invoke(r, t); }); }); } function AsyncIterator(t, r) { function e(o, i, a, u) { var c = s(t[o], t, i); if ("throw" !== c.type) { var h = c.arg, f = h.value; return f && "object" == _typeof(f) && n.call(f, "__await") ? r.resolve(f.__await).then(function (t) { e("next", t, a, u); }, function (t) { e("throw", t, a, u); }) : r.resolve(f).then(function (t) { h.value = t, a(h); }, function (t) { return e("throw", t, a, u); }); } u(c.arg); } var o; c(this, "_invoke", function (t, n) { function i() { return new r(function (r, o) { e(t, n, r, o); }); } return o = o ? o.then(i, i) : i(); }, !0); } function d(r, e) { var n = e.method, o = r.i[n]; if (o === t) return e.delegate = null, "throw" === n && r.i["return"] && (e.method = "return", e.arg = t, d(r, e), "throw" === e.method) || "return" !== n && (e.method = "throw", e.arg = new TypeError("The iterator does not provide a '" + n + "' method")), f; var i = s(o, r.i, e.arg); if ("throw" === i.type) return e.method = "throw", e.arg = i.arg, e.delegate = null, f; var a = i.arg; return a ? a.done ? (e[r.r] = a.value, e.next = r.n, "return" !== e.method && (e.method = "next", e.arg = t), e.delegate = null, f) : a : (e.method = "throw", e.arg = new TypeError("iterator result is not an object"), e.delegate = null, f); } function w(t) { this.tryEntries.push(t); } function m(r) { var e = r[4] || {}; e.type = "normal", e.arg = t, r[4] = e; } function Context(t) { this.tryEntries = [[-1]], _forEachInstanceProperty(t).call(t, w, this), this.reset(!0); } function x(r) { if (null != r) { var e = r[i]; if (e) return e.call(r); if ("function" == typeof r.next) return r; if (!isNaN(r.length)) { var o = -1, a = function e() { for (; ++o < r.length;) if (n.call(r, o)) return e.value = r[o], e.done = !1, e; return e.value = t, e.done = !0, e; }; return a.next = a; } } throw new TypeError(_typeof(r) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, c(v, "constructor", GeneratorFunctionPrototype), c(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = c(GeneratorFunctionPrototype, u, "GeneratorFunction"), r.isGeneratorFunction = function (t) { var r = "function" == typeof t && t.constructor; return !!r && (r === GeneratorFunction || "GeneratorFunction" === (r.displayName || r.name)); }, r.mark = function (t) { return _Object$setPrototypeOf ? _Object$setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, c(t, u, "GeneratorFunction")), t.prototype = _Object$create(v), t; }, r.awrap = function (t) { return { __await: t }; }, g(AsyncIterator.prototype), c(AsyncIterator.prototype, a, function () { return this; }), r.AsyncIterator = AsyncIterator, r.async = function (t, e, n, o, i) { void 0 === i && (i = _Promise); var a = new AsyncIterator(h(t, e, n, o), i); return r.isGeneratorFunction(e) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, g(v), c(v, u, "Generator"), c(v, i, function () { return this; }), c(v, "toString", function () { return "[object Generator]"; }), r.keys = function (t) { var r = Object(t), e = []; for (var n in r) e.unshift(n); return function t() { for (; e.length;) if ((n = e.pop()) in r) return t.value = n, t.done = !1, t; return t.done = !0, t; }; }, r.values = x, Context.prototype = { constructor: Context, reset: function reset(r) { var _context13; if (this.prev = this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, _forEachInstanceProperty(_context13 = this.tryEntries).call(_context13, m), !r) for (var e in this) "t" === e.charAt(0) && n.call(this, e) && !isNaN(+_sliceInstanceProperty(e).call(e, 1)) && (this[e] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0][4]; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(r) { if (this.done) throw r; var e = this; function n(t) { a.type = "throw", a.arg = r, e.next = t; } for (var o = e.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i[4], u = this.prev, c = i[1], h = i[2]; if (-1 === i[0]) return n("end"), !1; if (!c && !h) throw Error("try statement without catch or finally"); if (null != i[0] && i[0] <= u) { if (u < c) return this.method = "next", this.arg = t, n(c), !0; if (u < h) return n(h), !1; } } }, abrupt: function abrupt(t, r) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var n = this.tryEntries[e]; if (n[0] > -1 && n[0] <= this.prev && this.prev < n[2]) { var o = n; break; } } o && ("break" === t || "continue" === t) && o[0] <= r && r <= o[2] && (o = null); var i = o ? o[4] : {}; return i.type = t, i.arg = r, o ? (this.method = "next", this.next = o[2], f) : this.complete(i); }, complete: function complete(t, r) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && r && (this.next = r), f; }, finish: function finish(t) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var e = this.tryEntries[r]; if (e[2] === t) return this.complete(e[4], e[3]), m(e), f; } }, "catch": function _catch(t) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var e = this.tryEntries[r]; if (e[0] === t) { var n = e[4]; if ("throw" === n.type) { var o = n.arg; m(e); } return o; } } throw Error("illegal catch attempt"); }, delegateYield: function delegateYield(r, e, n) { return this.delegate = { i: x(r), r: e, n: n }, "next" === this.method && (this.arg = t), f; } }, r; }
14
14
  import React from 'react';
15
15
  import userEvent from '@testing-library/user-event';
16
16
  import { OverlayProvider, TimeZonePicker } from '../../index';
@@ -161,4 +161,233 @@ test('selecting a timezone updates the input value', /*#__PURE__*/_asyncToGenera
161
161
  return _context4.stop();
162
162
  }
163
163
  }, _callee4);
164
- })));
164
+ })));
165
+ test('controlled selectedKey sets the input value', function () {
166
+ var selectedKey = 'America/New York GMT-00:00';
167
+ getComponent({
168
+ selectedKey: selectedKey
169
+ });
170
+ var input = screen.getByRole('combobox');
171
+ expect(input).toHaveValue(selectedKey);
172
+ });
173
+ test('controlled onSelectionChange is called when an item is selected', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {
174
+ var onSelectionChange, timezone, gmtAndOffset, expectedKey, input, option;
175
+ return _regeneratorRuntime().wrap(function _callee5$(_context6) {
176
+ var _context7;
177
+ while (1) switch (_context6.prev = _context6.next) {
178
+ case 0:
179
+ onSelectionChange = jest.fn();
180
+ timezone = 'America/New York';
181
+ gmtAndOffset = getGmtAndOffset(timezone);
182
+ expectedKey = _concatInstanceProperty(_context7 = "".concat(timezone, " ")).call(_context7, gmtAndOffset.gmt);
183
+ getComponent({
184
+ onSelectionChange: onSelectionChange
185
+ });
186
+ input = screen.getByRole('combobox');
187
+ _context6.next = 8;
188
+ return userEvent.type(input, timezone);
189
+ case 8:
190
+ option = screen.getByRole('option', {
191
+ key: expectedKey
192
+ });
193
+ _context6.next = 11;
194
+ return userEvent.click(option);
195
+ case 11:
196
+ expect(onSelectionChange).toHaveBeenCalledWith(expectedKey);
197
+ case 12:
198
+ case "end":
199
+ return _context6.stop();
200
+ }
201
+ }, _callee5);
202
+ })));
203
+ test('controlled onSelectionChange is called with null when input is cleared', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee6() {
204
+ var onSelectionChange, input;
205
+ return _regeneratorRuntime().wrap(function _callee6$(_context8) {
206
+ while (1) switch (_context8.prev = _context8.next) {
207
+ case 0:
208
+ onSelectionChange = jest.fn();
209
+ getComponent({
210
+ onSelectionChange: onSelectionChange,
211
+ selectedKey: 'America/New York GMT-00:00'
212
+ });
213
+ input = screen.getByRole('combobox');
214
+ _context8.next = 5;
215
+ return userEvent.clear(input);
216
+ case 5:
217
+ expect(onSelectionChange).toHaveBeenCalledWith(null);
218
+ case 6:
219
+ case "end":
220
+ return _context8.stop();
221
+ }
222
+ }, _callee6);
223
+ })));
224
+ test('controlled onInputChange is called when typing', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee7() {
225
+ var onInputChange, input;
226
+ return _regeneratorRuntime().wrap(function _callee7$(_context9) {
227
+ while (1) switch (_context9.prev = _context9.next) {
228
+ case 0:
229
+ onInputChange = jest.fn();
230
+ getComponent({
231
+ onInputChange: onInputChange
232
+ });
233
+ input = screen.getByRole('combobox');
234
+ _context9.next = 5;
235
+ return userEvent.type(input, 'Pac');
236
+ case 5:
237
+ expect(onInputChange).toHaveBeenCalled();
238
+ case 6:
239
+ case "end":
240
+ return _context9.stop();
241
+ }
242
+ }, _callee7);
243
+ })));
244
+ test('supports controlled inputValue', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee8() {
245
+ var onInputChange, input;
246
+ return _regeneratorRuntime().wrap(function _callee8$(_context0) {
247
+ while (1) switch (_context0.prev = _context0.next) {
248
+ case 0:
249
+ onInputChange = jest.fn();
250
+ getComponent({
251
+ inputValue: 'Pacific',
252
+ onInputChange: onInputChange
253
+ });
254
+ input = screen.getByRole('combobox');
255
+ expect(input).toHaveValue('Pacific');
256
+ case 4:
257
+ case "end":
258
+ return _context0.stop();
259
+ }
260
+ }, _callee8);
261
+ })));
262
+ test('passes isDisabled to ComboBoxField', function () {
263
+ getComponent({
264
+ isDisabled: true
265
+ });
266
+ var input = screen.getByRole('combobox');
267
+ expect(input).toBeDisabled();
268
+ });
269
+ test('passes isRequired to ComboBoxField', function () {
270
+ getComponent({
271
+ isRequired: true
272
+ });
273
+ var input = screen.getByRole('combobox');
274
+ expect(input).toBeRequired();
275
+ });
276
+ test('passes isReadOnly to ComboBoxField', function () {
277
+ getComponent({
278
+ isReadOnly: true
279
+ });
280
+ var input = screen.getByRole('combobox');
281
+ expect(input).toHaveAttribute('readonly');
282
+ });
283
+ test('passes placeholder to ComboBoxField', function () {
284
+ getComponent({
285
+ placeholder: 'Select a timezone'
286
+ });
287
+ var input = screen.getByRole('combobox');
288
+ expect(input).toHaveAttribute('placeholder', 'Select a timezone');
289
+ });
290
+ test('passes helperText to ComboBoxField', function () {
291
+ getComponent({
292
+ helperText: 'Choose your preferred timezone'
293
+ });
294
+ expect(screen.getByText('Choose your preferred timezone')).toBeInTheDocument();
295
+ });
296
+ test('passes status to ComboBoxField', function () {
297
+ getComponent({
298
+ status: 'error',
299
+ helperText: 'This field is required'
300
+ });
301
+ expect(screen.getByText('This field is required')).toBeInTheDocument();
302
+ });
303
+ test('calls onOpenChange when menu opens', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee9() {
304
+ var onOpenChange, input;
305
+ return _regeneratorRuntime().wrap(function _callee9$(_context1) {
306
+ while (1) switch (_context1.prev = _context1.next) {
307
+ case 0:
308
+ onOpenChange = jest.fn();
309
+ getComponent({
310
+ onOpenChange: onOpenChange
311
+ });
312
+ input = screen.getByRole('combobox');
313
+ _context1.next = 5;
314
+ return userEvent.type(input, 'America');
315
+ case 5:
316
+ expect(onOpenChange).toHaveBeenCalledWith(true, 'input');
317
+ case 6:
318
+ case "end":
319
+ return _context1.stop();
320
+ }
321
+ }, _callee9);
322
+ })));
323
+ test('clears selection when input is cleared in uncontrolled mode', /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee0() {
324
+ var onSelectionChange, onInputChange, timezone, gmtAndOffset, expectedOptionText, input, option;
325
+ return _regeneratorRuntime().wrap(function _callee0$(_context10) {
326
+ var _context11;
327
+ while (1) switch (_context10.prev = _context10.next) {
328
+ case 0:
329
+ onSelectionChange = jest.fn();
330
+ onInputChange = jest.fn();
331
+ timezone = 'America/New York';
332
+ gmtAndOffset = getGmtAndOffset(timezone);
333
+ expectedOptionText = _concatInstanceProperty(_context11 = "".concat(timezone, " ")).call(_context11, gmtAndOffset.gmt);
334
+ getComponent({
335
+ onSelectionChange: onSelectionChange,
336
+ onInputChange: onInputChange
337
+ });
338
+ input = screen.getByRole('combobox');
339
+ _context10.next = 9;
340
+ return userEvent.type(input, timezone);
341
+ case 9:
342
+ option = screen.getByRole('option', {
343
+ key: expectedOptionText
344
+ });
345
+ _context10.next = 12;
346
+ return userEvent.click(option);
347
+ case 12:
348
+ expect(onSelectionChange).toHaveBeenCalledWith(expectedOptionText);
349
+ _context10.next = 15;
350
+ return userEvent.clear(input);
351
+ case 15:
352
+ expect(onInputChange).toHaveBeenCalledWith('');
353
+ case 16:
354
+ case "end":
355
+ return _context10.stop();
356
+ }
357
+ }, _callee0);
358
+ })));
359
+ test('displays pre-selected value on initial render with controlled selectedKey', function () {
360
+ var timezone = 'America/New York';
361
+ var gmtAndOffset = getGmtAndOffset(timezone);
362
+ var expectedOptionText = "".concat(timezone, " ").concat(gmtAndOffset.gmt);
363
+ getComponent({
364
+ selectedKey: expectedOptionText
365
+ });
366
+ var input = screen.getByRole('combobox');
367
+ expect(input).toHaveValue(expectedOptionText);
368
+ });
369
+ test('displays pre-selected value with additionalTimeZones', function () {
370
+ var timezone = 'Africa/Juba';
371
+ var gmtAndOffset = getGmtAndOffset(timezone);
372
+ var expectedOptionText = "".concat(timezone, " ").concat(gmtAndOffset.gmt);
373
+ getComponent({
374
+ additionalTimeZones: {
375
+ '(GMT+02:00) Africa/Juba': testTimeZoneJuba
376
+ },
377
+ selectedKey: expectedOptionText
378
+ });
379
+ var input = screen.getByRole('combobox');
380
+ expect(input).toHaveValue(expectedOptionText);
381
+ });
382
+ test('displays pre-selected value with controlled inputValue', function () {
383
+ var timezone = 'America/New York';
384
+ var gmtAndOffset = getGmtAndOffset(timezone);
385
+ var expectedOptionText = "".concat(timezone, " ").concat(gmtAndOffset.gmt);
386
+ getComponent({
387
+ selectedKey: expectedOptionText,
388
+ inputValue: expectedOptionText,
389
+ onInputChange: jest.fn()
390
+ });
391
+ var input = screen.getByRole('combobox');
392
+ expect(input).toHaveValue(expectedOptionText);
393
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pingux/astro",
3
- "version": "2.178.0-alpha.0",
3
+ "version": "2.178.2-alpha.0",
4
4
  "description": "React component library for Ping Identity's design system",
5
5
  "repository": {
6
6
  "type": "git",