@pingux/astro 1.16.1-alpha.0 → 1.17.0-alpha.2
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 +40 -7
- package/lib/cjs/components/ComboBoxField/ComboBoxField.stories.js +58 -2
- package/lib/cjs/components/ComboBoxField/ComboBoxField.test.js +123 -25
- package/lib/cjs/components/Image/Image.js +14 -3
- package/lib/cjs/components/Image/Image.stories.js +17 -8
- package/lib/cjs/components/Image/Image.test.js +9 -0
- package/lib/cjs/components/MultivaluesField/MultivaluesField.stories.js +142 -21
- package/lib/components/ComboBoxField/ComboBoxField.js +40 -8
- package/lib/components/ComboBoxField/ComboBoxField.stories.js +51 -0
- package/lib/components/ComboBoxField/ComboBoxField.test.js +106 -25
- package/lib/components/Image/Image.js +15 -4
- package/lib/components/Image/Image.stories.js +17 -8
- package/lib/components/Image/Image.test.js +9 -0
- package/lib/components/MultivaluesField/MultivaluesField.stories.js +142 -20
- package/package.json +1 -1
@@ -38,6 +38,8 @@ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-c
|
|
38
38
|
|
39
39
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
|
40
40
|
|
41
|
+
var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
|
42
|
+
|
41
43
|
var _react = _interopRequireWildcard(require("react"));
|
42
44
|
|
43
45
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
@@ -78,7 +80,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
78
80
|
|
79
81
|
function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
80
82
|
|
81
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var
|
83
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context2, _context3; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context2 = ownKeys(Object(source), !0)).call(_context2, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context3 = ownKeys(Object(source))).call(_context3, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
|
82
84
|
|
83
85
|
/**
|
84
86
|
* Combines an input with a listbox for a filterable dropdown list.
|
@@ -103,13 +105,14 @@ var ComboBoxField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
103
105
|
onFocusChange = props.onFocusChange,
|
104
106
|
onKeyDown = props.onKeyDown,
|
105
107
|
onKeyUp = props.onKeyUp,
|
108
|
+
hasAddOption = props.hasAddOption,
|
106
109
|
hasCustomValue = props.hasCustomValue,
|
107
110
|
hasNoEmptySelection = props.hasNoEmptySelection,
|
108
111
|
defaultSelectedKey = props.defaultSelectedKey,
|
109
112
|
selectedKey = props.selectedKey,
|
110
113
|
onSelectionChange = props.onSelectionChange,
|
111
|
-
|
112
|
-
|
114
|
+
initialDefaultItems = props.defaultItems,
|
115
|
+
initialItems = props.items,
|
113
116
|
onOpenChange = props.onOpenChange,
|
114
117
|
loadingState = props.loadingState,
|
115
118
|
onLoadMore = props.onLoadMore,
|
@@ -137,13 +140,11 @@ var ComboBoxField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
137
140
|
onFocusChange: onFocusChange,
|
138
141
|
onKeyDown: onKeyDown,
|
139
142
|
onKeyUp: onKeyUp,
|
140
|
-
allowsCustomValue: hasCustomValue,
|
143
|
+
allowsCustomValue: hasAddOption || hasCustomValue,
|
141
144
|
disallowEmptySelection: hasNoEmptySelection,
|
142
145
|
defaultSelectedKey: defaultSelectedKey,
|
143
146
|
selectedKey: selectedKey,
|
144
147
|
onSelectionChange: onSelectionChange,
|
145
|
-
defaultItems: defaultItems,
|
146
|
-
items: items,
|
147
148
|
onOpenChange: onOpenChange,
|
148
149
|
loadingState: loadingState,
|
149
150
|
onLoadMore: onLoadMore,
|
@@ -169,18 +170,47 @@ var ComboBoxField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
169
170
|
|
170
171
|
var onSelectionChangeHandler = function onSelectionChangeHandler(key) {
|
171
172
|
var newVal = key || selectedKey || '';
|
173
|
+
|
174
|
+
if (hasAddOption && selectedKey !== inputValue) {
|
175
|
+
newVal = inputValue;
|
176
|
+
}
|
177
|
+
|
172
178
|
if (onSelectionChange) onSelectionChange(newVal);
|
173
179
|
};
|
174
180
|
|
181
|
+
var shouldShowAddOption = hasAddOption && inputValue && selectedKey !== inputValue;
|
182
|
+
var addOption = "ADD: ".concat(inputValue);
|
183
|
+
|
184
|
+
var getItemsArr = function getItemsArr(initialArr) {
|
185
|
+
if (initialArr && shouldShowAddOption) {
|
186
|
+
var _context;
|
187
|
+
|
188
|
+
return (0, _concat["default"])(_context = []).call(_context, initialArr, [{
|
189
|
+
name: addOption,
|
190
|
+
key: addOption
|
191
|
+
}]);
|
192
|
+
}
|
193
|
+
|
194
|
+
return initialArr;
|
195
|
+
};
|
196
|
+
|
197
|
+
var defaultItems = getItemsArr(initialDefaultItems);
|
198
|
+
var items = getItemsArr(initialItems);
|
199
|
+
|
175
200
|
var _useFilter = (0, _i18n.useFilter)({
|
176
201
|
sensitivity: 'base'
|
177
202
|
}),
|
178
203
|
contains = _useFilter.contains;
|
179
204
|
|
180
205
|
var state = (0, _combobox2.useComboBoxState)(_objectSpread(_objectSpread({}, comboBoxOptions), {}, {
|
181
|
-
|
206
|
+
defaultItems: defaultItems,
|
207
|
+
items: items,
|
208
|
+
onSelectionChange: hasAddOption || hasCustomValue ? onSelectionChangeHandler : onSelectionChange,
|
182
209
|
defaultFilter: typeof defaultFilter !== 'undefined' ? defaultFilter : contains
|
183
210
|
}));
|
211
|
+
(0, _react.useEffect)(function () {
|
212
|
+
if (shouldShowAddOption) state.selectionManager.setFocusedKey(addOption);
|
213
|
+
}, [shouldShowAddOption, state, addOption]);
|
184
214
|
|
185
215
|
var _useComboBox = (0, _combobox.useComboBox)(_objectSpread(_objectSpread({}, comboBoxOptions), {}, {
|
186
216
|
buttonRef: buttonRef,
|
@@ -286,6 +316,9 @@ var ComboBoxField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
286
316
|
}, listbox));
|
287
317
|
});
|
288
318
|
ComboBoxField.propTypes = {
|
319
|
+
/* Whether or not adding new options to the list is enabled. */
|
320
|
+
hasAddOption: _propTypes["default"].bool,
|
321
|
+
|
289
322
|
/** Whether the ComboBox allows a non-item matching input value to be set. */
|
290
323
|
hasCustomValue: _propTypes["default"].bool,
|
291
324
|
|
@@ -14,7 +14,11 @@ _Object$defineProperty(exports, "__esModule", {
|
|
14
14
|
value: true
|
15
15
|
});
|
16
16
|
|
17
|
-
exports["default"] = exports.WithoutStatusIndicator = exports.WithSections = exports.WithCustomInputValue = exports.WithCustomHeight = exports.Required = exports.HelperText = exports.FocusMenuTrigger = exports.DisabledKeys = exports.Disabled = exports.Default = exports.CustomDefaultFilter = exports.ControlledWithCustomValue = exports.ControlledSelection = exports.ControlledMenu = exports.ControlledInput = exports.ControlledFiltering = exports.AsyncLoading = exports.AllowCustomValue = void 0;
|
17
|
+
exports["default"] = exports.WithoutStatusIndicator = exports.WithSections = exports.WithCustomInputValue = exports.WithCustomHeight = exports.Required = exports.HelperText = exports.FocusMenuTrigger = exports.DisabledKeys = exports.Disabled = exports.Default = exports.CustomDefaultFilter = exports.ControlledWithCustomValue = exports.ControlledWithAddOption = exports.ControlledSelection = exports.ControlledMenu = exports.ControlledInput = exports.ControlledFiltering = exports.AsyncLoading = exports.AllowCustomValue = void 0;
|
18
|
+
|
19
|
+
var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
|
20
|
+
|
21
|
+
var _find = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/find"));
|
18
22
|
|
19
23
|
var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));
|
20
24
|
|
@@ -562,4 +566,56 @@ var CustomDefaultFilter = function CustomDefaultFilter() {
|
|
562
566
|
}));
|
563
567
|
};
|
564
568
|
|
565
|
-
exports.CustomDefaultFilter = CustomDefaultFilter;
|
569
|
+
exports.CustomDefaultFilter = CustomDefaultFilter;
|
570
|
+
|
571
|
+
var ControlledWithAddOption = function ControlledWithAddOption() {
|
572
|
+
var _useState11 = (0, _react.useState)(items),
|
573
|
+
_useState12 = (0, _slicedToArray2["default"])(_useState11, 2),
|
574
|
+
options = _useState12[0],
|
575
|
+
setOptions = _useState12[1];
|
576
|
+
|
577
|
+
var _useState13 = (0, _react.useState)(''),
|
578
|
+
_useState14 = (0, _slicedToArray2["default"])(_useState13, 2),
|
579
|
+
inputValue = _useState14[0],
|
580
|
+
setInputValue = _useState14[1];
|
581
|
+
|
582
|
+
var _useState15 = (0, _react.useState)(''),
|
583
|
+
_useState16 = (0, _slicedToArray2["default"])(_useState15, 2),
|
584
|
+
selectedKey = _useState16[0],
|
585
|
+
setSelectedKey = _useState16[1];
|
586
|
+
|
587
|
+
var onSelectionChange = function onSelectionChange(key) {
|
588
|
+
// Add new option to options array
|
589
|
+
if (key && !(0, _find["default"])(options).call(options, function (_ref2) {
|
590
|
+
var name = _ref2.name;
|
591
|
+
return name === key;
|
592
|
+
})) {
|
593
|
+
var _context2;
|
594
|
+
|
595
|
+
setOptions((0, _concat["default"])(_context2 = []).call(_context2, options, [{
|
596
|
+
key: key,
|
597
|
+
name: key
|
598
|
+
}]));
|
599
|
+
}
|
600
|
+
|
601
|
+
setInputValue(key);
|
602
|
+
setSelectedKey(key);
|
603
|
+
};
|
604
|
+
|
605
|
+
return (0, _react2.jsx)(_index.OverlayProvider, null, (0, _react2.jsx)(_ComboBoxField["default"], (0, _extends2["default"])({
|
606
|
+
label: "Example label",
|
607
|
+
defaultItems: options
|
608
|
+
}, actions, {
|
609
|
+
inputValue: inputValue,
|
610
|
+
selectedKey: selectedKey,
|
611
|
+
onInputChange: setInputValue,
|
612
|
+
onSelectionChange: onSelectionChange,
|
613
|
+
hasAddOption: true
|
614
|
+
}), function (item) {
|
615
|
+
return (0, _react2.jsx)(_index.Item, {
|
616
|
+
key: item.name
|
617
|
+
}, item.name);
|
618
|
+
}));
|
619
|
+
};
|
620
|
+
|
621
|
+
exports.ControlledWithAddOption = ControlledWithAddOption;
|
@@ -32,6 +32,10 @@ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/
|
|
32
32
|
|
33
33
|
var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));
|
34
34
|
|
35
|
+
var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
|
36
|
+
|
37
|
+
var _find = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/find"));
|
38
|
+
|
35
39
|
var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));
|
36
40
|
|
37
41
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));
|
@@ -62,7 +66,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
62
66
|
|
63
67
|
function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty2(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
64
68
|
|
65
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var
|
69
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context6, _context7; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty2(_context6 = ownKeys(Object(source), !0)).call(_context6, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty2(_context7 = ownKeys(Object(source))).call(_context7, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
|
66
70
|
|
67
71
|
var items = [{
|
68
72
|
name: 'Aardvark',
|
@@ -121,6 +125,54 @@ var ComboBoxWithCustomFilter = function ComboBoxWithCustomFilter() {
|
|
121
125
|
});
|
122
126
|
};
|
123
127
|
|
128
|
+
var ComboBoxWithAddOption = function ComboBoxWithAddOption() {
|
129
|
+
var _useState3 = (0, _react.useState)(items),
|
130
|
+
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
|
131
|
+
options = _useState4[0],
|
132
|
+
setOptions = _useState4[1];
|
133
|
+
|
134
|
+
var _useState5 = (0, _react.useState)(''),
|
135
|
+
_useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
|
136
|
+
inputValue = _useState6[0],
|
137
|
+
setInputValue = _useState6[1];
|
138
|
+
|
139
|
+
var _useState7 = (0, _react.useState)(''),
|
140
|
+
_useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
|
141
|
+
selectedKey = _useState8[0],
|
142
|
+
setSelectedKey = _useState8[1];
|
143
|
+
|
144
|
+
var onSelectionChange = function onSelectionChange(key) {
|
145
|
+
if (key && !(0, _find["default"])(options).call(options, function (_ref2) {
|
146
|
+
var name = _ref2.name;
|
147
|
+
return name === key;
|
148
|
+
})) {
|
149
|
+
var _context;
|
150
|
+
|
151
|
+
setOptions((0, _concat["default"])(_context = []).call(_context, options, [{
|
152
|
+
key: key,
|
153
|
+
name: key
|
154
|
+
}]));
|
155
|
+
}
|
156
|
+
|
157
|
+
setInputValue(key);
|
158
|
+
setSelectedKey(key);
|
159
|
+
};
|
160
|
+
|
161
|
+
return (0, _react2.jsx)(_index.ComboBoxField, {
|
162
|
+
label: "Example label",
|
163
|
+
defaultItems: options,
|
164
|
+
inputValue: inputValue,
|
165
|
+
selectedKey: selectedKey,
|
166
|
+
onInputChange: setInputValue,
|
167
|
+
onSelectionChange: onSelectionChange,
|
168
|
+
hasAddOption: true
|
169
|
+
}, function (item) {
|
170
|
+
return (0, _react2.jsx)(_index.Item, {
|
171
|
+
key: item.name
|
172
|
+
}, item.name);
|
173
|
+
});
|
174
|
+
};
|
175
|
+
|
124
176
|
beforeAll(function () {
|
125
177
|
jest.spyOn(window.HTMLElement.prototype, 'clientWidth', 'get').mockImplementation(function () {
|
126
178
|
return 1000;
|
@@ -474,43 +526,43 @@ test('should use default contains filtering', function () {
|
|
474
526
|
});
|
475
527
|
test('should be able to use controlled filtering', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
476
528
|
var options, input;
|
477
|
-
return _regenerator["default"].wrap(function _callee$(
|
529
|
+
return _regenerator["default"].wrap(function _callee$(_context2) {
|
478
530
|
while (1) {
|
479
|
-
switch (
|
531
|
+
switch (_context2.prev = _context2.next) {
|
480
532
|
case 0:
|
481
533
|
(0, _testWrapper.render)((0, _react2.jsx)(ComboBoxWithCustomFilter, null));
|
482
534
|
input = _testWrapper.screen.queryByRole('combobox'); // Should list all without filterable input
|
483
535
|
|
484
536
|
_userEvent["default"].type(input, '{arrowdown}');
|
485
537
|
|
486
|
-
|
538
|
+
_context2.next = 5;
|
487
539
|
return _testWrapper.screen.findAllByRole('option');
|
488
540
|
|
489
541
|
case 5:
|
490
|
-
options =
|
542
|
+
options = _context2.sent;
|
491
543
|
expect(options).toHaveLength(items.length); // Should only list the second option
|
492
544
|
|
493
545
|
_userEvent["default"].type(input, 'k');
|
494
546
|
|
495
|
-
|
547
|
+
_context2.next = 10;
|
496
548
|
return _testWrapper.screen.findAllByRole('option');
|
497
549
|
|
498
550
|
case 10:
|
499
|
-
options =
|
551
|
+
options = _context2.sent;
|
500
552
|
expect(options[0]).toHaveTextContent(items[1].name);
|
501
553
|
|
502
554
|
case 12:
|
503
555
|
case "end":
|
504
|
-
return
|
556
|
+
return _context2.stop();
|
505
557
|
}
|
506
558
|
}
|
507
559
|
}, _callee);
|
508
560
|
})));
|
509
561
|
test('should be able to use custom default filtering', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
|
510
562
|
var options, defaultFilter, input;
|
511
|
-
return _regenerator["default"].wrap(function _callee2$(
|
563
|
+
return _regenerator["default"].wrap(function _callee2$(_context3) {
|
512
564
|
while (1) {
|
513
|
-
switch (
|
565
|
+
switch (_context3.prev = _context3.next) {
|
514
566
|
case 0:
|
515
567
|
defaultFilter = function defaultFilter(option, inputValue) {
|
516
568
|
return (0, _startsWith["default"])(option).call(option, inputValue);
|
@@ -523,34 +575,34 @@ test('should be able to use custom default filtering', /*#__PURE__*/(0, _asyncTo
|
|
523
575
|
|
524
576
|
_userEvent["default"].type(input, '{arrowdown}');
|
525
577
|
|
526
|
-
|
578
|
+
_context3.next = 6;
|
527
579
|
return _testWrapper.screen.findAllByRole('option');
|
528
580
|
|
529
581
|
case 6:
|
530
|
-
options =
|
582
|
+
options = _context3.sent;
|
531
583
|
expect(options).toHaveLength(items.length); // Should only list the second option
|
532
584
|
|
533
585
|
_userEvent["default"].type(input, 'K');
|
534
586
|
|
535
|
-
|
587
|
+
_context3.next = 11;
|
536
588
|
return _testWrapper.screen.findAllByRole('option');
|
537
589
|
|
538
590
|
case 11:
|
539
|
-
options =
|
591
|
+
options = _context3.sent;
|
540
592
|
expect(options[0]).toHaveTextContent(items[1].name);
|
541
593
|
|
542
594
|
case 13:
|
543
595
|
case "end":
|
544
|
-
return
|
596
|
+
return _context3.stop();
|
545
597
|
}
|
546
598
|
}
|
547
599
|
}, _callee2);
|
548
600
|
})));
|
549
601
|
test('should show in input "textValue" if provided', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
|
550
602
|
var newItems, input, options;
|
551
|
-
return _regenerator["default"].wrap(function _callee3$(
|
603
|
+
return _regenerator["default"].wrap(function _callee3$(_context4) {
|
552
604
|
while (1) {
|
553
|
-
switch (
|
605
|
+
switch (_context4.prev = _context4.next) {
|
554
606
|
case 0:
|
555
607
|
newItems = (0, _map["default"])(items).call(items, function (item) {
|
556
608
|
return _objectSpread(_objectSpread({}, item), {}, {
|
@@ -564,11 +616,11 @@ test('should show in input "textValue" if provided', /*#__PURE__*/(0, _asyncToGe
|
|
564
616
|
|
565
617
|
_userEvent["default"].click(input);
|
566
618
|
|
567
|
-
|
619
|
+
_context4.next = 6;
|
568
620
|
return _testWrapper.screen.findAllByRole('option');
|
569
621
|
|
570
622
|
case 6:
|
571
|
-
options =
|
623
|
+
options = _context4.sent;
|
572
624
|
|
573
625
|
_userEvent["default"].click(options[0]);
|
574
626
|
|
@@ -580,7 +632,7 @@ test('should show in input "textValue" if provided', /*#__PURE__*/(0, _asyncToGe
|
|
580
632
|
|
581
633
|
case 11:
|
582
634
|
case "end":
|
583
|
-
return
|
635
|
+
return _context4.stop();
|
584
636
|
}
|
585
637
|
}
|
586
638
|
}, _callee3);
|
@@ -951,25 +1003,71 @@ test('onSelectionChange works properly with custom value', function () {
|
|
951
1003
|
|
952
1004
|
expect(onSelectionChange).toHaveBeenCalledWith('');
|
953
1005
|
});
|
1006
|
+
test('add option shows when "hasAddOption" is provided', function () {
|
1007
|
+
(0, _testWrapper.render)((0, _react2.jsx)(ComboBoxWithAddOption, null));
|
1008
|
+
|
1009
|
+
var input = _testWrapper.screen.queryByRole('combobox');
|
1010
|
+
|
1011
|
+
expect(input).toHaveValue('');
|
1012
|
+
expect(_testWrapper.screen.queryByRole('listbox')).not.toBeInTheDocument();
|
1013
|
+
expect(_testWrapper.screen.queryByRole('option')).not.toBeInTheDocument();
|
1014
|
+
var inputValue = 'New value';
|
1015
|
+
|
1016
|
+
_userEvent["default"].type(input, inputValue);
|
1017
|
+
|
1018
|
+
expect(input).toHaveValue(inputValue);
|
1019
|
+
expect(_testWrapper.screen.queryByRole('listbox')).toBeInTheDocument();
|
1020
|
+
|
1021
|
+
var option = _testWrapper.screen.queryByRole('option');
|
1022
|
+
|
1023
|
+
expect(option).toBeInTheDocument();
|
1024
|
+
expect(option).toHaveClass('is-focused');
|
1025
|
+
expect(option).toHaveTextContent("ADD: ".concat(inputValue));
|
1026
|
+
});
|
1027
|
+
test('if "hasAddOption" is provided, then custom value is added to listbox on blur', function () {
|
1028
|
+
(0, _testWrapper.render)((0, _react2.jsx)(ComboBoxWithAddOption, null));
|
1029
|
+
|
1030
|
+
var input = _testWrapper.screen.queryByRole('combobox');
|
1031
|
+
|
1032
|
+
var inputValue = 'New value';
|
1033
|
+
|
1034
|
+
_userEvent["default"].type(input, inputValue);
|
1035
|
+
|
1036
|
+
expect(input).toHaveValue(inputValue); // blur input
|
1037
|
+
|
1038
|
+
_userEvent["default"].tab();
|
1039
|
+
|
1040
|
+
expect(_testWrapper.screen.queryByRole('listbox')).not.toBeInTheDocument();
|
1041
|
+
expect(_testWrapper.screen.queryByRole('option')).not.toBeInTheDocument();
|
1042
|
+
|
1043
|
+
_userEvent["default"].click(input);
|
1044
|
+
|
1045
|
+
expect(input).toHaveValue(inputValue);
|
1046
|
+
expect(_testWrapper.screen.queryByRole('listbox')).toBeInTheDocument();
|
1047
|
+
|
1048
|
+
var options = _testWrapper.screen.queryAllByRole('option');
|
1049
|
+
|
1050
|
+
expect(options[options.length - 1]).toHaveTextContent(inputValue);
|
1051
|
+
});
|
954
1052
|
test('should have no accessibility violations', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
|
955
1053
|
var _getComponent6, container, results;
|
956
1054
|
|
957
|
-
return _regenerator["default"].wrap(function _callee4$(
|
1055
|
+
return _regenerator["default"].wrap(function _callee4$(_context5) {
|
958
1056
|
while (1) {
|
959
|
-
switch (
|
1057
|
+
switch (_context5.prev = _context5.next) {
|
960
1058
|
case 0:
|
961
1059
|
jest.useRealTimers();
|
962
1060
|
_getComponent6 = getComponent(), container = _getComponent6.container;
|
963
|
-
|
1061
|
+
_context5.next = 4;
|
964
1062
|
return (0, _jestAxe.axe)(container);
|
965
1063
|
|
966
1064
|
case 4:
|
967
|
-
results =
|
1065
|
+
results = _context5.sent;
|
968
1066
|
expect(results).toHaveNoViolations();
|
969
1067
|
|
970
1068
|
case 6:
|
971
1069
|
case "end":
|
972
|
-
return
|
1070
|
+
return _context5.stop();
|
973
1071
|
}
|
974
1072
|
}
|
975
1073
|
}, _callee4);
|
@@ -56,7 +56,7 @@ var _colors = require("../../styles/colors");
|
|
56
56
|
|
57
57
|
var _templateObject;
|
58
58
|
|
59
|
-
var _excluded = ["className", "fallbackImage", "fallbackTimeout", "isDisabled", "src", "sx"];
|
59
|
+
var _excluded = ["className", "fallbackImage", "fallbackTimeout", "isDisabled", "src", "alt", "sx"];
|
60
60
|
|
61
61
|
function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
62
62
|
|
@@ -77,6 +77,7 @@ var Image = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
77
77
|
fallbackTimeout = props.fallbackTimeout,
|
78
78
|
isDisabled = props.isDisabled,
|
79
79
|
src = props.src,
|
80
|
+
alt = props.alt,
|
80
81
|
sx = props.sx,
|
81
82
|
others = (0, _objectWithoutProperties2["default"])(props, _excluded);
|
82
83
|
|
@@ -122,6 +123,8 @@ var Image = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
122
123
|
return imgRef.current;
|
123
124
|
});
|
124
125
|
(0, _hooks.usePropWarning)(props, 'disabled', 'isDisabled');
|
126
|
+
var ariaLabel = props['aria-label'] || alt;
|
127
|
+
(0, _hooks.useAriaLabelWarning)('Image', ariaLabel);
|
125
128
|
|
126
129
|
var _useHover = (0, _interactions.useHover)(props),
|
127
130
|
hoverProps = _useHover.hoverProps,
|
@@ -178,7 +181,7 @@ var Image = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
|
|
178
181
|
var themeUiImage = (0, _react2.jsx)(_themeUi.Image, (0, _extends2["default"])({
|
179
182
|
className: classNames,
|
180
183
|
ref: imgRef,
|
181
|
-
alt:
|
184
|
+
alt: alt,
|
182
185
|
role: "img",
|
183
186
|
src: imgSrc,
|
184
187
|
sx: sx
|
@@ -212,7 +215,15 @@ Image.propTypes = {
|
|
212
215
|
fallbackImage: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].object]),
|
213
216
|
|
214
217
|
/** Time in milliseconds that component should wait for a response from src address. */
|
215
|
-
fallbackTimeout: _propTypes["default"].number
|
218
|
+
fallbackTimeout: _propTypes["default"].number,
|
219
|
+
|
220
|
+
/** Descriptive text for an image. This is *highly* recommended in most cases.
|
221
|
+
* See [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#attr-alt).
|
222
|
+
* */
|
223
|
+
alt: _propTypes["default"].string,
|
224
|
+
|
225
|
+
/** Defines a string value that labels the current element. */
|
226
|
+
'aria-label': _propTypes["default"].string
|
216
227
|
};
|
217
228
|
Image.defaultProps = {
|
218
229
|
isDisabled: false,
|
@@ -67,7 +67,9 @@ exports["default"] = _default;
|
|
67
67
|
|
68
68
|
var Default = function Default(_ref) {
|
69
69
|
var args = (0, _extends2["default"])({}, _ref);
|
70
|
-
return (0, _react2.jsx)(_["default"], args
|
70
|
+
return (0, _react2.jsx)(_["default"], (0, _extends2["default"])({}, args, {
|
71
|
+
alt: "Ping identity square logo"
|
72
|
+
}));
|
71
73
|
};
|
72
74
|
|
73
75
|
exports.Default = Default;
|
@@ -75,7 +77,8 @@ exports.Default = Default;
|
|
75
77
|
var Avatar = function Avatar() {
|
76
78
|
return (0, _react2.jsx)(_["default"], {
|
77
79
|
src: _imageConstants.pingImg,
|
78
|
-
variant: "images.avatar"
|
80
|
+
variant: "images.avatar",
|
81
|
+
alt: "Ping identity round avatar"
|
79
82
|
});
|
80
83
|
};
|
81
84
|
|
@@ -89,7 +92,8 @@ var CustomSizeAndRadius = function CustomSizeAndRadius() {
|
|
89
92
|
height: '70px',
|
90
93
|
borderRadius: 8,
|
91
94
|
bg: 'neutral.90'
|
92
|
-
}
|
95
|
+
},
|
96
|
+
alt: "Terry Crews in a red suite"
|
93
97
|
});
|
94
98
|
};
|
95
99
|
|
@@ -98,7 +102,8 @@ exports.CustomSizeAndRadius = CustomSizeAndRadius;
|
|
98
102
|
var Disabled = function Disabled() {
|
99
103
|
return (0, _react2.jsx)(_["default"], {
|
100
104
|
src: _imageConstants.pingImg,
|
101
|
-
isDisabled: true
|
105
|
+
isDisabled: true,
|
106
|
+
alt: "Ping identity square logo"
|
102
107
|
});
|
103
108
|
};
|
104
109
|
|
@@ -111,7 +116,8 @@ var FallbackImage = function FallbackImage() {
|
|
111
116
|
sx: {
|
112
117
|
width: '150px',
|
113
118
|
height: '150px'
|
114
|
-
}
|
119
|
+
},
|
120
|
+
alt: "Random image"
|
115
121
|
});
|
116
122
|
};
|
117
123
|
|
@@ -125,7 +131,8 @@ var WithSkeletonLoadSuccess = function WithSkeletonLoadSuccess(_ref2) {
|
|
125
131
|
sx: {
|
126
132
|
width: '150px',
|
127
133
|
height: '150px'
|
128
|
-
}
|
134
|
+
},
|
135
|
+
alt: "Random image"
|
129
136
|
});
|
130
137
|
};
|
131
138
|
|
@@ -140,7 +147,8 @@ var WithSkeletonLoadTimeout = function WithSkeletonLoadTimeout() {
|
|
140
147
|
sx: {
|
141
148
|
width: '150px',
|
142
149
|
height: '150px'
|
143
|
-
}
|
150
|
+
},
|
151
|
+
alt: "Random image"
|
144
152
|
});
|
145
153
|
};
|
146
154
|
|
@@ -169,7 +177,8 @@ var UpdatingImageSrc = function UpdatingImageSrc() {
|
|
169
177
|
width: '200px',
|
170
178
|
height: '200px',
|
171
179
|
mt: '25px'
|
172
|
-
}
|
180
|
+
},
|
181
|
+
alt: image === _imageConstants.pingImg ? 'Ping identity square logo' : 'Terry Crews in a red suite'
|
173
182
|
}));
|
174
183
|
};
|
175
184
|
|
@@ -101,6 +101,15 @@ test('image shows disabled status', function () {
|
|
101
101
|
|
102
102
|
expect(img).toHaveClass('is-disabled');
|
103
103
|
});
|
104
|
+
test('image with alt text', function () {
|
105
|
+
getComponent({
|
106
|
+
alt: 'Test'
|
107
|
+
});
|
108
|
+
(0, _react2.act)(function () {
|
109
|
+
fallbackImageObj.onImageLoad();
|
110
|
+
});
|
111
|
+
expect(_testWrapper.screen.getByAltText('Test')).toBeInTheDocument();
|
112
|
+
});
|
104
113
|
test('image source is able to be changed', function () {
|
105
114
|
var src2 = 'second-src';
|
106
115
|
|