@elastic/eui 76.0.0 → 76.1.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.
Files changed (66) hide show
  1. package/dist/eui_theme_dark.css +4 -0
  2. package/dist/eui_theme_dark.min.css +1 -1
  3. package/dist/eui_theme_light.css +4 -0
  4. package/dist/eui_theme_light.min.css +1 -1
  5. package/es/components/color_picker/color_palette_picker/color_palette_picker.js +5 -6
  6. package/es/components/datagrid/body/data_grid_cell.js +6 -3
  7. package/es/components/datagrid/body/data_grid_cell_popover.js +32 -12
  8. package/es/components/date_picker/auto_refresh/auto_refresh.js +2 -1
  9. package/es/components/form/form_control_layout/form_control_layout_icons.js +1 -1
  10. package/es/components/form/range/dual_range.js +14 -7
  11. package/es/components/form/range/range.js +10 -3
  12. package/es/components/form/super_select/super_select.js +21 -18
  13. package/es/components/form/super_select/super_select_control.js +7 -14
  14. package/es/components/selectable/selectable.js +59 -36
  15. package/es/components/selectable/selectable_list/selectable_list.js +1 -1
  16. package/es/components/suggest/suggest.js +3 -10
  17. package/eui.d.ts +27 -12
  18. package/i18ntokens.json +81 -49
  19. package/lib/components/color_picker/color_palette_picker/color_palette_picker.js +5 -6
  20. package/lib/components/datagrid/body/data_grid_cell.js +6 -3
  21. package/lib/components/datagrid/body/data_grid_cell_popover.js +35 -12
  22. package/lib/components/date_picker/auto_refresh/auto_refresh.js +2 -1
  23. package/lib/components/form/form_control_layout/form_control_layout_icons.js +1 -1
  24. package/lib/components/form/range/dual_range.js +14 -7
  25. package/lib/components/form/range/range.js +10 -3
  26. package/lib/components/form/super_select/super_select.js +21 -18
  27. package/lib/components/form/super_select/super_select_control.js +7 -16
  28. package/lib/components/selectable/selectable.js +59 -36
  29. package/lib/components/selectable/selectable_list/selectable_list.js +1 -1
  30. package/lib/components/suggest/suggest.js +3 -12
  31. package/optimize/es/components/datagrid/body/data_grid_cell.js +4 -2
  32. package/optimize/es/components/datagrid/body/data_grid_cell_popover.js +30 -12
  33. package/optimize/es/components/date_picker/auto_refresh/auto_refresh.js +2 -1
  34. package/optimize/es/components/form/form_control_layout/form_control_layout_icons.js +1 -1
  35. package/optimize/es/components/form/range/dual_range.js +14 -7
  36. package/optimize/es/components/form/range/range.js +10 -3
  37. package/optimize/es/components/form/super_select/super_select.js +16 -12
  38. package/optimize/es/components/form/super_select/super_select_control.js +7 -14
  39. package/optimize/es/components/selectable/selectable.js +50 -34
  40. package/optimize/es/components/selectable/selectable_list/selectable_list.js +1 -1
  41. package/optimize/es/components/suggest/suggest.js +3 -10
  42. package/optimize/lib/components/datagrid/body/data_grid_cell.js +4 -2
  43. package/optimize/lib/components/datagrid/body/data_grid_cell_popover.js +33 -19
  44. package/optimize/lib/components/date_picker/auto_refresh/auto_refresh.js +2 -1
  45. package/optimize/lib/components/form/form_control_layout/form_control_layout_icons.js +1 -1
  46. package/optimize/lib/components/form/range/dual_range.js +14 -7
  47. package/optimize/lib/components/form/range/range.js +10 -3
  48. package/optimize/lib/components/form/super_select/super_select.js +16 -11
  49. package/optimize/lib/components/form/super_select/super_select_control.js +7 -16
  50. package/optimize/lib/components/selectable/selectable.js +50 -35
  51. package/optimize/lib/components/selectable/selectable_list/selectable_list.js +1 -1
  52. package/optimize/lib/components/suggest/suggest.js +3 -12
  53. package/package.json +1 -1
  54. package/src/components/form/super_select/_super_select_control.scss +4 -0
  55. package/test-env/components/color_picker/color_palette_picker/color_palette_picker.js +5 -6
  56. package/test-env/components/datagrid/body/data_grid_cell.js +6 -3
  57. package/test-env/components/datagrid/body/data_grid_cell_popover.js +33 -19
  58. package/test-env/components/date_picker/auto_refresh/auto_refresh.js +2 -1
  59. package/test-env/components/form/form_control_layout/form_control_layout_icons.js +1 -1
  60. package/test-env/components/form/range/dual_range.js +14 -7
  61. package/test-env/components/form/range/range.js +10 -3
  62. package/test-env/components/form/super_select/super_select.js +21 -17
  63. package/test-env/components/form/super_select/super_select_control.js +7 -16
  64. package/test-env/components/selectable/selectable.js +58 -36
  65. package/test-env/components/selectable/selectable_list/selectable_list.js +1 -1
  66. package/test-env/components/suggest/suggest.js +3 -12
@@ -9,10 +9,16 @@ Object.defineProperty(exports, "__esModule", {
9
9
  });
10
10
  exports.useCellPopover = exports.JsonPopoverContent = exports.DefaultCellPopover = exports.DataGridCellPopoverContext = void 0;
11
11
 
12
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
+
14
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
+
12
16
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
17
 
14
18
  var _react = _interopRequireWildcard(require("react"));
15
19
 
20
+ var _classnames = _interopRequireDefault(require("classnames"));
21
+
16
22
  var _services = require("../../../services");
17
23
 
18
24
  var _popover = require("../../popover");
@@ -27,13 +33,10 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
27
33
 
28
34
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
29
35
 
30
- /*
31
- * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
32
- * or more contributor license agreements. Licensed under the Elastic License
33
- * 2.0 and the Server Side Public License, v 1; you may not use this file except
34
- * in compliance with, at your election, the Elastic License 2.0 or the Server
35
- * Side Public License, v 1.
36
- */
36
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
37
+
38
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
39
+
37
40
  var DataGridCellPopoverContext = /*#__PURE__*/(0, _react.createContext)({
38
41
  popoverIsOpen: false,
39
42
  cellLocation: {
@@ -43,11 +46,14 @@ var DataGridCellPopoverContext = /*#__PURE__*/(0, _react.createContext)({
43
46
  openCellPopover: function openCellPopover() {},
44
47
  closeCellPopover: function closeCellPopover() {},
45
48
  setPopoverAnchor: function setPopoverAnchor() {},
46
- setPopoverContent: function setPopoverContent() {}
49
+ setPopoverContent: function setPopoverContent() {},
50
+ setCellPopoverProps: function setCellPopoverProps() {}
47
51
  });
48
52
  exports.DataGridCellPopoverContext = DataGridCellPopoverContext;
49
53
 
50
54
  var useCellPopover = function useCellPopover() {
55
+ var _cellPopoverProps$pan;
56
+
51
57
  // Current open state & cell location are handled here
52
58
  var _useState = (0, _react.useState)(false),
53
59
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
@@ -71,7 +77,13 @@ var useCellPopover = function useCellPopover() {
71
77
  var _useState7 = (0, _react.useState)(),
72
78
  _useState8 = (0, _slicedToArray2.default)(_useState7, 2),
73
79
  popoverContent = _useState8[0],
74
- setPopoverContent = _useState8[1];
80
+ setPopoverContent = _useState8[1]; // Allow customization of most (not all) popover props by consumers
81
+
82
+
83
+ var _useState9 = (0, _react.useState)({}),
84
+ _useState10 = (0, _slicedToArray2.default)(_useState9, 2),
85
+ cellPopoverProps = _useState10[0],
86
+ setCellPopoverProps = _useState10[1];
75
87
 
76
88
  var closeCellPopover = (0, _react.useCallback)(function () {
77
89
  return setPopoverIsOpen(false);
@@ -101,20 +113,20 @@ var useCellPopover = function useCellPopover() {
101
113
  openCellPopover: openCellPopover,
102
114
  cellLocation: cellLocation,
103
115
  setPopoverAnchor: setPopoverAnchor,
104
- setPopoverContent: setPopoverContent
116
+ setPopoverContent: setPopoverContent,
117
+ setCellPopoverProps: setCellPopoverProps
105
118
  }; // Note that this popover is rendered once at the top grid level, rather than one popover per cell
106
119
 
107
- var cellPopover = popoverIsOpen && popoverAnchor && (0, _react2.jsx)(_popover.EuiWrappingPopover, {
120
+ var cellPopover = popoverIsOpen && popoverAnchor && (0, _react2.jsx)(_popover.EuiWrappingPopover, (0, _extends2.default)({
108
121
  isOpen: popoverIsOpen,
109
- button: popoverAnchor,
110
122
  display: "block",
111
123
  hasArrow: false,
112
- panelPaddingSize: "s",
113
- panelClassName: "euiDataGridRowCell__popover",
114
- panelProps: {
124
+ panelPaddingSize: "s"
125
+ }, cellPopoverProps, {
126
+ panelProps: _objectSpread({
115
127
  'data-test-subj': 'euiDataGridExpansionPopover'
116
- },
117
- closePopover: closeCellPopover,
128
+ }, cellPopoverProps.panelProps || {}),
129
+ panelClassName: (0, _classnames.default)('euiDataGridRowCell__popover', cellPopoverProps.panelClassName, (_cellPopoverProps$pan = cellPopoverProps.panelProps) === null || _cellPopoverProps$pan === void 0 ? void 0 : _cellPopoverProps$pan.className),
118
130
  onKeyDown: function onKeyDown(event) {
119
131
  if (event.key === _services.keys.F2 || event.key === _services.keys.ESCAPE) {
120
132
  event.preventDefault();
@@ -125,8 +137,10 @@ var useCellPopover = function useCellPopover() {
125
137
  return popoverAnchor.parentElement.focus();
126
138
  });
127
139
  }
128
- }
129
- }, popoverContent);
140
+ },
141
+ button: popoverAnchor,
142
+ closePopover: closeCellPopover
143
+ }), popoverContent);
130
144
  return {
131
145
  cellPopoverContext: cellPopoverContext,
132
146
  cellPopover: cellPopover
@@ -165,7 +165,8 @@ var EuiAutoRefreshButton = function EuiAutoRefreshButton(_ref2) {
165
165
  isOpen: isPopoverOpen,
166
166
  closePopover: function closePopover() {
167
167
  setIsPopoverOpen(false);
168
- }
168
+ },
169
+ popoverScreenReaderText: isPaused ? autoRefeshLabelOff : autoRefeshLabelOn
169
170
  }, (0, _react2.jsx)(_refresh_interval.EuiRefreshInterval, {
170
171
  onRefreshChange: onRefreshChange,
171
172
  isPaused: isPaused,
@@ -178,7 +178,7 @@ var EuiFormControlLayoutIcons = /*#__PURE__*/function (_Component) {
178
178
  return (0, _react2.jsx)(_icon.EuiIcon, {
179
179
  size: compressed ? 's' : 'm',
180
180
  color: "danger",
181
- type: "alert"
181
+ type: "warning"
182
182
  });
183
183
  }
184
184
  }]);
@@ -69,6 +69,8 @@ var _range = require("./range.styles");
69
69
 
70
70
  var _dual_range = require("./dual_range.styles");
71
71
 
72
+ var _i18n = require("../../i18n");
73
+
72
74
  var _react2 = require("@emotion/react");
73
75
 
74
76
  var _excluded = ["className", "css", "compressed", "disabled", "fullWidth", "isLoading", "readOnly", "id", "max", "min", "name", "step", "showLabels", "showInput", "showTicks", "tickInterval", "ticks", "levels", "onBlur", "onChange", "onFocus", "showRange", "value", "isInvalid", "append", "prepend", "minInputProps", "maxInputProps", "isDraggable", "theme"];
@@ -560,6 +562,10 @@ var EuiDualRangeClass = /*#__PURE__*/function (_Component) {
560
562
  var rightThumbStyles = rightThumbColor ? _objectSpread(_objectSpread({}, rightThumbPosition), {}, {
561
563
  backgroundColor: (0, _range_levels_colors.euiRangeLevelColor)(rightThumbColor, theme.euiTheme)
562
564
  }) : rightThumbPosition;
565
+ var dualSliderScreenReaderInstructions = (0, _react2.jsx)(_i18n.EuiI18n, {
566
+ token: "euiDualRange.sliderScreenReaderInstructions",
567
+ default: "You are in a custom range slider. Use the Up and Down arrow keys to change the minimum value. Press Tab to interact with the maximum value."
568
+ });
563
569
  var theRange = (0, _react2.jsx)(_range_wrapper.EuiRangeWrapper, {
564
570
  css: cssStyles,
565
571
  className: classes,
@@ -615,8 +621,8 @@ var EuiDualRangeClass = /*#__PURE__*/function (_Component) {
615
621
  onFocus: _this2.onThumbFocus,
616
622
  onBlur: _this2.onThumbBlur,
617
623
  onKeyDown: _this2.handleDraggableKeyDown,
618
- "aria-describedby": _this2.props['aria-describedby'],
619
- "aria-label": _this2.props['aria-label']
624
+ "aria-describedby": showInputOnly ? undefined : _this2.props['aria-describedby'],
625
+ "aria-label": showInputOnly ? undefined : _this2.props['aria-label']
620
626
  }), (0, _react2.jsx)(_range_thumb.EuiRangeThumb, {
621
627
  min: min,
622
628
  max: Number(_this2.upperValue),
@@ -628,8 +634,8 @@ var EuiDualRangeClass = /*#__PURE__*/function (_Component) {
628
634
  onFocus: _this2.onThumbFocus,
629
635
  onBlur: _this2.onThumbBlur,
630
636
  style: (0, _global_styling.logicalStyles)(leftThumbStyles),
631
- "aria-describedby": _this2.props['aria-describedby'],
632
- "aria-label": _this2.props['aria-label']
637
+ "aria-describedby": showInputOnly ? undefined : _this2.props['aria-describedby'],
638
+ "aria-label": showInputOnly ? undefined : _this2.props['aria-label']
633
639
  }), (0, _react2.jsx)(_range_thumb.EuiRangeThumb, {
634
640
  min: Number(_this2.lowerValue),
635
641
  max: max,
@@ -641,8 +647,8 @@ var EuiDualRangeClass = /*#__PURE__*/function (_Component) {
641
647
  onFocus: _this2.onThumbFocus,
642
648
  onBlur: _this2.onThumbBlur,
643
649
  style: (0, _global_styling.logicalStyles)(rightThumbStyles),
644
- "aria-describedby": _this2.props['aria-describedby'],
645
- "aria-label": _this2.props['aria-label']
650
+ "aria-describedby": showInputOnly ? undefined : _this2.props['aria-describedby'],
651
+ "aria-label": showInputOnly ? undefined : _this2.props['aria-label']
646
652
  })), showRange && _this2.isValid && (0, _react2.jsx)(_range_highlight.EuiRangeHighlight, {
647
653
  showTicks: showTicks,
648
654
  min: Number(min),
@@ -675,7 +681,8 @@ var EuiDualRangeClass = /*#__PURE__*/function (_Component) {
675
681
  isOpen: this.state.isPopoverOpen,
676
682
  closePopover: this.closePopover,
677
683
  disableFocusTrap: true,
678
- onPanelResize: this.onResize
684
+ onPanelResize: this.onResize,
685
+ popoverScreenReaderText: dualSliderScreenReaderInstructions
679
686
  }, theRange) : undefined;
680
687
  return thePopover || theRange;
681
688
  }
@@ -59,6 +59,8 @@ var _range_wrapper = require("./range_wrapper");
59
59
 
60
60
  var _range = require("./range.styles");
61
61
 
62
+ var _i18n = require("../../i18n");
63
+
62
64
  var _react2 = require("@emotion/react");
63
65
 
64
66
  var _excluded = ["className", "compressed", "disabled", "fullWidth", "isLoading", "readOnly", "id", "max", "min", "name", "step", "showLabels", "showInput", "showTicks", "tickInterval", "ticks", "levels", "showRange", "showValue", "valueAppend", "valuePrepend", "onBlur", "onChange", "onFocus", "value", "tabIndex", "isInvalid", "theme"];
@@ -205,6 +207,10 @@ var EuiRangeClass = /*#__PURE__*/function (_Component) {
205
207
  var styles = (0, _range.euiRangeStyles)(theme);
206
208
  var cssStyles = [styles.euiRange, showInput && styles.hasInput];
207
209
  var thumbColor = levels && (0, _range_levels_colors.getLevelColor)(levels, Number(value));
210
+ var sliderScreenReaderInstructions = (0, _react2.jsx)(_i18n.EuiI18n, {
211
+ token: "euiRange.sliderScreenReaderInstructions",
212
+ default: "You are in a custom range slider. Use the Up and Down arrow keys to change the value."
213
+ });
208
214
  var theRange = (0, _react2.jsx)(_range_wrapper.EuiRangeWrapper, {
209
215
  className: classes,
210
216
  css: cssStyles,
@@ -225,7 +231,7 @@ var EuiRangeClass = /*#__PURE__*/function (_Component) {
225
231
  levels: levels,
226
232
  onChange: this.handleOnChange,
227
233
  value: value,
228
- "aria-hidden": showInput === true,
234
+ "aria-hidden": !!showInput,
229
235
  showRange: showRange
230
236
  }, function (trackWidth) {
231
237
  return (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_range_slider.EuiRangeSlider, (0, _extends2.default)({
@@ -246,7 +252,7 @@ var EuiRangeClass = /*#__PURE__*/function (_Component) {
246
252
  } : undefined,
247
253
  onFocus: showInput === true ? undefined : onFocus,
248
254
  onBlur: showInputOnly ? _this2.onInputBlur : onBlur,
249
- "aria-hidden": showInput === true ? true : false,
255
+ "aria-hidden": !!showInput,
250
256
  thumbColor: thumbColor
251
257
  }, rest)), showRange && _this2.isValid && (0, _react2.jsx)(_range_highlight.EuiRangeHighlight, {
252
258
  showTicks: showTicks,
@@ -279,7 +285,8 @@ var EuiRangeClass = /*#__PURE__*/function (_Component) {
279
285
  fullWidth: fullWidth,
280
286
  isOpen: this.state.isPopoverOpen,
281
287
  closePopover: this.closePopover,
282
- disableFocusTrap: true
288
+ disableFocusTrap: true,
289
+ popoverScreenReaderText: sliderScreenReaderInstructions
283
290
  }, theRange) : undefined;
284
291
  return thePopover ? thePopover : theRange;
285
292
  }
@@ -47,7 +47,7 @@ var _i18n = require("../../i18n");
47
47
 
48
48
  var _react2 = require("@emotion/react");
49
49
 
50
- var _excluded = ["className", "options", "valueOfSelected", "onChange", "isOpen", "isInvalid", "hasDividers", "itemClassName", "itemLayoutAlign", "fullWidth", "popoverProps", "compressed"],
50
+ var _excluded = ["className", "options", "valueOfSelected", "placeholder", "onChange", "isOpen", "isInvalid", "hasDividers", "itemClassName", "itemLayoutAlign", "fullWidth", "popoverProps", "compressed"],
51
51
  _excluded2 = ["value", "dropdownDisplay", "inputDisplay"];
52
52
 
53
53
  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); }
@@ -83,7 +83,6 @@ var EuiSuperSelect = /*#__PURE__*/function (_Component) {
83
83
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "itemNodes", []);
84
84
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "_isMounted", false);
85
85
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "describedById", (0, _services.htmlIdGenerator)('euiSuperSelect_')('_screenreaderDescribeId'));
86
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "labelledById", (0, _services.htmlIdGenerator)('euiSuperSelect_')('_screenreaderLabelId'));
87
86
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "state", {
88
87
  isPopoverOpen: _this.props.isOpen || false
89
88
  });
@@ -242,6 +241,7 @@ var EuiSuperSelect = /*#__PURE__*/function (_Component) {
242
241
  className = _this$props.className,
243
242
  options = _this$props.options,
244
243
  valueOfSelected = _this$props.valueOfSelected,
244
+ placeholder = _this$props.placeholder,
245
245
  onChange = _this$props.onChange,
246
246
  isOpen = _this$props.isOpen,
247
247
  isInvalid = _this$props.isInvalid,
@@ -260,9 +260,9 @@ var EuiSuperSelect = /*#__PURE__*/function (_Component) {
260
260
  'euiSuperSelect__item--hasDividers': hasDividers
261
261
  }, itemClassName);
262
262
  var button = (0, _react2.jsx)(_super_select_control.EuiSuperSelectControl, (0, _extends2.default)({
263
- screenReaderId: this.labelledById,
264
263
  options: options,
265
264
  value: valueOfSelected,
265
+ placeholder: placeholder,
266
266
  onClick: this.state.isPopoverOpen ? this.closePopover : this.openPopover,
267
267
  onKeyDown: this.onSelectKeyDown,
268
268
  className: buttonClasses,
@@ -305,14 +305,19 @@ var EuiSuperSelect = /*#__PURE__*/function (_Component) {
305
305
  }, (0, _react2.jsx)(_i18n.EuiI18n, {
306
306
  token: "euiSuperSelect.screenReaderAnnouncement",
307
307
  default: "You are in a form selector and must select a single option. Use the Up and Down arrow keys to navigate or Escape to close."
308
- }))), (0, _react2.jsx)("div", {
309
- "aria-labelledby": this.labelledById,
310
- "aria-describedby": this.describedById,
311
- className: "euiSuperSelect__listbox",
312
- role: "listbox",
313
- "aria-activedescendant": valueOfSelected,
314
- tabIndex: 0
315
- }, items));
308
+ }))), (0, _react2.jsx)(_i18n.EuiI18n, {
309
+ token: "euiSuperSelect.ariaLabel",
310
+ default: "Select listbox"
311
+ }, function (ariaLabel) {
312
+ return (0, _react2.jsx)("div", {
313
+ "aria-label": ariaLabel,
314
+ "aria-describedby": _this2.describedById,
315
+ className: "euiSuperSelect__listbox",
316
+ role: "listbox",
317
+ "aria-activedescendant": valueOfSelected,
318
+ tabIndex: 0
319
+ }, items);
320
+ }));
316
321
  }
317
322
  }]);
318
323
  return EuiSuperSelect;
@@ -356,6 +361,11 @@ EuiSuperSelect.propTypes = {
356
361
  readOnly: _propTypes.default.bool,
357
362
  name: _propTypes.default.string,
358
363
 
364
+ /**
365
+ * Placeholder to display when the current selected value is empty.
366
+ */
367
+ placeholder: _propTypes.default.oneOfType([_propTypes.default.node, _propTypes.default.node]),
368
+
359
369
  /**
360
370
  * Creates an input group with element(s) coming before input.
361
371
  * `string` | `ReactElement` or an array of these
@@ -368,12 +378,6 @@ EuiSuperSelect.propTypes = {
368
378
  */
369
379
  append: _propTypes.default.oneOfType([_propTypes.default.oneOfType([_propTypes.default.string.isRequired, _propTypes.default.element.isRequired]).isRequired, _propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.string.isRequired, _propTypes.default.element.isRequired]).isRequired).isRequired]),
370
380
 
371
- /**
372
- * Creates a semantic label ID for the `div[role="listbox"]` that's opened on click or keypress.
373
- * __Generated and passed down by `EuiSuperSelect`.__
374
- */
375
- screenReaderId: _propTypes.default.string,
376
-
377
381
  /**
378
382
  * Pass an array of options that must at least include:
379
383
  * `value`: storing unique value of item,
@@ -17,19 +17,15 @@ var _react = _interopRequireWildcard(require("react"));
17
17
 
18
18
  var _classnames = _interopRequireDefault(require("classnames"));
19
19
 
20
- var _accessibility = require("../../accessibility");
21
-
22
20
  var _form_control_layout = require("../form_control_layout");
23
21
 
24
- var _i18n = require("../../i18n");
25
-
26
22
  var _num_icons = require("../form_control_layout/_num_icons");
27
23
 
28
24
  var _eui_form_context = require("../eui_form_context");
29
25
 
30
26
  var _react2 = require("@emotion/react");
31
27
 
32
- var _excluded = ["className", "options", "id", "name", "fullWidth", "isLoading", "isInvalid", "readOnly", "defaultValue", "compressed", "value", "prepend", "append", "screenReaderId", "disabled"];
28
+ var _excluded = ["className", "options", "id", "name", "fullWidth", "isLoading", "isInvalid", "readOnly", "defaultValue", "compressed", "value", "placeholder", "prepend", "append", "disabled"];
33
29
 
34
30
  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); }
35
31
 
@@ -55,9 +51,9 @@ var EuiSuperSelectControl = function EuiSuperSelectControl(props) {
55
51
  _props$compressed = props.compressed,
56
52
  compressed = _props$compressed === void 0 ? false : _props$compressed,
57
53
  value = props.value,
54
+ placeholder = props.placeholder,
58
55
  prepend = props.prepend,
59
56
  append = props.append,
60
- screenReaderId = props.screenReaderId,
61
57
  disabled = props.disabled,
62
58
  rest = (0, _objectWithoutProperties2.default)(props, _excluded);
63
59
  var numIconsClass = (0, _num_icons.getFormControlClassNameForIconCount)({
@@ -89,6 +85,7 @@ var EuiSuperSelectControl = function EuiSuperSelectControl(props) {
89
85
  selectedValue = selectedOption ? selectedOption.inputDisplay : selectedValue;
90
86
  }
91
87
 
88
+ var showPlaceholder = !!placeholder && !selectedValue;
92
89
  return (0, _react2.jsx)(_react.Fragment, null, (0, _react2.jsx)("input", {
93
90
  type: "hidden",
94
91
  id: id,
@@ -106,22 +103,16 @@ var EuiSuperSelectControl = function EuiSuperSelectControl(props) {
106
103
  compressed: compressed,
107
104
  prepend: prepend,
108
105
  append: append
109
- }, (0, _react2.jsx)(_accessibility.EuiScreenReaderOnly, null, (0, _react2.jsx)("span", {
110
- id: screenReaderId
111
- }, (0, _react2.jsx)(_i18n.EuiI18n, {
112
- token: "euiSuperSelectControl.selectAnOption",
113
- default: "Select an option: {selectedValue}, is selected",
114
- values: {
115
- selectedValue: selectedValue
116
- }
117
- }))), (0, _react2.jsx)("button", (0, _extends2.default)({
106
+ }, (0, _react2.jsx)("button", (0, _extends2.default)({
118
107
  type: "button",
119
108
  className: classes,
120
109
  "aria-haspopup": "listbox",
121
110
  disabled: disabled || readOnly // @ts-ignore Using as a selector only for mixin use
122
111
  ,
123
112
  readOnly: readOnly
124
- }, rest), selectedValue)));
113
+ }, rest), showPlaceholder ? (0, _react2.jsx)("span", {
114
+ className: "euiSuperSelectControl__placeholder"
115
+ }, placeholder) : selectedValue)));
125
116
  };
126
117
 
127
118
  exports.EuiSuperSelectControl = EuiSuperSelectControl;
@@ -9,10 +9,10 @@ Object.defineProperty(exports, "__esModule", {
9
9
  });
10
10
  exports.EuiSelectable = void 0;
11
11
 
12
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
-
14
12
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
15
13
 
14
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15
+
16
16
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
17
17
 
18
18
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
@@ -55,7 +55,7 @@ var _i18n = require("../i18n");
55
55
 
56
56
  var _react2 = require("@emotion/react");
57
57
 
58
- var _excluded = ["children", "className", "options", "onChange", "onActiveOptionChange", "searchable", "searchProps", "singleSelection", "isLoading", "listProps", "renderOption", "height", "allowExclusions", "aria-label", "aria-describedby", "loadingMessage", "noMatchesMessage", "emptyMessage", "errorMessage", "isPreFiltered"],
58
+ var _excluded = ["children", "className", "options", "onChange", "onActiveOptionChange", "searchable", "searchProps", "singleSelection", "isLoading", "listProps", "renderOption", "height", "allowExclusions", "aria-label", "aria-describedby", "loadingMessage", "noMatchesMessage", "emptyMessage", "errorMessage", "selectableScreenReaderText", "isPreFiltered"],
59
59
  _excluded2 = ["aria-label", "aria-describedby", "onChange", "defaultValue", "inputRef"],
60
60
  _excluded3 = ["aria-label", "aria-describedby", "isVirtualized", "rowHeight"];
61
61
 
@@ -90,13 +90,22 @@ var EuiSelectable = /*#__PURE__*/function (_Component) {
90
90
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "rootId", void 0);
91
91
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "messageContentId", void 0);
92
92
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "listId", void 0);
93
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "isFocusOnSearchOrListBox", function (target) {
94
+ var _this$optionsListRef$, _this$optionsListRef$2;
95
+
96
+ var searchHasFocus = _this.props.searchable && target === _this.inputRef;
97
+ var listBox = (_this$optionsListRef$ = _this.optionsListRef.current) === null || _this$optionsListRef$ === void 0 ? void 0 : (_this$optionsListRef$2 = _this$optionsListRef$.listBoxRef) === null || _this$optionsListRef$2 === void 0 ? void 0 : _this$optionsListRef$2.parentElement;
98
+ var listBoxContainsFocus = target instanceof Node && (listBox === null || listBox === void 0 ? void 0 : listBox.contains(target));
99
+ var listBoxHasFocus = target === listBox || listBoxContainsFocus;
100
+ return searchHasFocus || listBoxHasFocus;
101
+ });
93
102
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onMouseDown", function () {
94
103
  // Bypass onFocus when a click event originates from this.containerRef.
95
104
  // Prevents onFocus from scrolling away from a clicked option and negating the selection event.
96
105
  // https://github.com/elastic/eui/issues/4147
97
106
  _this.preventOnFocus = true;
98
107
  });
99
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onFocus", function () {
108
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onFocus", function (event) {
100
109
  if (_this.preventOnFocus) {
101
110
  _this.preventOnFocus = false;
102
111
  return;
@@ -106,6 +115,10 @@ var EuiSelectable = /*#__PURE__*/function (_Component) {
106
115
  return;
107
116
  }
108
117
 
118
+ if (event && !_this.isFocusOnSearchOrListBox(event.target)) {
119
+ return;
120
+ }
121
+
109
122
  var firstSelected = _this.state.visibleOptions.findIndex(function (option) {
110
123
  return option.checked && !option.disabled && !option.isGroupLabel;
111
124
  });
@@ -125,7 +138,19 @@ var EuiSelectable = /*#__PURE__*/function (_Component) {
125
138
  }
126
139
  });
127
140
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onKeyDown", function (event) {
128
- var optionsList = _this.optionsListRef.current;
141
+ var optionsList = _this.optionsListRef.current; // Check if the user is interacting with something other than the
142
+ // searchbox or selection list. If so, the user may be attempting to
143
+ // interact with the search clear button or a totally custom button,
144
+ // and listbox keyboard navigation/selection should not be triggered.
145
+
146
+ if (!_this.isFocusOnSearchOrListBox(event.target)) {
147
+ _this.setState({
148
+ activeOptionIndex: undefined,
149
+ isFocused: false
150
+ });
151
+
152
+ return;
153
+ }
129
154
 
130
155
  switch (event.key) {
131
156
  case _services.keys.ARROW_UP:
@@ -150,20 +175,10 @@ var EuiSelectable = /*#__PURE__*/function (_Component) {
150
175
  case _services.keys.ENTER:
151
176
  case _services.keys.SPACE:
152
177
  if (_this.props.searchable) {
153
- var _this$optionsListRef$, _this$optionsListRef$2;
154
-
155
178
  // For searchable instances, SPACE is reserved as a character for filtering
156
179
  // via the input box, and as such only ENTER will toggle selection.
157
180
  if (event.target === _this.inputRef && event.key === _services.keys.SPACE) {
158
181
  return;
159
- } // Check if the user is interacting with something other than the
160
- // searchbox or selection list. If not, the user is attempting to
161
- // interact with an internal button such as the clear button,
162
- // and the event should not be altered.
163
-
164
-
165
- if (!(event.target === _this.inputRef || event.target === ((_this$optionsListRef$ = _this.optionsListRef.current) === null || _this$optionsListRef$ === void 0 ? void 0 : (_this$optionsListRef$2 = _this$optionsListRef$.listBoxRef) === null || _this$optionsListRef$2 === void 0 ? void 0 : _this$optionsListRef$2.parentElement))) {
166
- return;
167
182
  }
168
183
  }
169
184
 
@@ -251,10 +266,8 @@ var EuiSelectable = /*#__PURE__*/function (_Component) {
251
266
  (_this$props$searchPro = _this.props.searchProps) === null || _this$props$searchPro === void 0 ? void 0 : (_this$props$searchPro2 = _this$props$searchPro.onChange) === null || _this$props$searchPro2 === void 0 ? void 0 : _this$props$searchPro2.call(_this$props$searchPro, searchValue, visibleOptions);
252
267
  });
253
268
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onContainerBlur", function (e) {
254
- var _e$relatedTarget, _e$relatedTarget$firs;
255
-
256
269
  // Ignore blur events when moving from search to option to avoid activeOptionIndex conflicts
257
- if (((_e$relatedTarget = e.relatedTarget) === null || _e$relatedTarget === void 0 ? void 0 : (_e$relatedTarget$firs = _e$relatedTarget.firstChild) === null || _e$relatedTarget$firs === void 0 ? void 0 : _e$relatedTarget$firs.id) === _this.listId) {
270
+ if (_this.isFocusOnSearchOrListBox(e.relatedTarget)) {
258
271
  return;
259
272
  }
260
273
 
@@ -357,6 +370,7 @@ var EuiSelectable = /*#__PURE__*/function (_Component) {
357
370
  noMatchesMessage = _this$props3.noMatchesMessage,
358
371
  emptyMessage = _this$props3.emptyMessage,
359
372
  errorMessage = _this$props3.errorMessage,
373
+ selectableScreenReaderText = _this$props3.selectableScreenReaderText,
360
374
  isPreFiltered = _this$props3.isPreFiltered,
361
375
  rest = (0, _objectWithoutProperties2.default)(_this$props3, _excluded);
362
376
  var _this$state = this.state,
@@ -491,10 +505,15 @@ var EuiSelectable = /*#__PURE__*/function (_Component) {
491
505
  var searchAccessibleName = getAccessibleName(searchProps, this.messageContentId);
492
506
  var searchHasAccessibleName = Boolean(Object.keys(searchAccessibleName).length);
493
507
  var search = searchable ? (0, _react2.jsx)(_i18n.EuiI18n, {
494
- token: "euiSelectable.placeholderName",
495
- default: "Filter options"
496
- }, function (placeholderName) {
497
- return (0, _react2.jsx)(_selectable_search.EuiSelectableSearch, (0, _extends2.default)({
508
+ tokens: ['euiSelectable.screenReaderInstructions', 'euiSelectable.placeholderName'],
509
+ defaults: ['Use the Up and Down arrow keys to move focus over options. Press Enter to select. Press Escape to collapse options.', 'Filter options']
510
+ }, function (_ref4) {
511
+ var _ref5 = (0, _slicedToArray2.default)(_ref4, 2),
512
+ screenReaderInstructions = _ref5[0],
513
+ placeholderName = _ref5[1];
514
+
515
+ return (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_selectable_search.EuiSelectableSearch, (0, _extends2.default)({
516
+ "aria-describedby": listAriaDescribedbyId,
498
517
  key: "listSearch",
499
518
  options: options,
500
519
  value: searchValue,
@@ -513,15 +532,17 @@ var EuiSelectable = /*#__PURE__*/function (_Component) {
513
532
  }
514
533
  }, searchHasAccessibleName ? searchAccessibleName : {
515
534
  'aria-label': placeholderName
516
- }, cleanedSearchProps));
535
+ }, cleanedSearchProps)), (0, _react2.jsx)(_accessibility.EuiScreenReaderOnly, null, (0, _react2.jsx)("p", {
536
+ id: listAriaDescribedbyId
537
+ }, selectableScreenReaderText, " ", screenReaderInstructions)));
517
538
  }) : undefined;
518
539
  var resultsLength = visibleOptions.filter(function (option) {
519
540
  return !option.disabled;
520
541
  }).length;
521
542
  var listScreenReaderStatus = searchable && (0, _react2.jsx)(_i18n.EuiI18n, {
522
543
  token: "euiSelectable.searchResults",
523
- default: function _default(_ref4) {
524
- var resultsLength = _ref4.resultsLength;
544
+ default: function _default(_ref6) {
545
+ var resultsLength = _ref6.resultsLength;
525
546
  return "".concat(resultsLength, " result").concat(resultsLength === 1 ? '' : 's', " available");
526
547
  },
527
548
  values: {
@@ -532,18 +553,12 @@ var EuiSelectable = /*#__PURE__*/function (_Component) {
532
553
  var listAccessibleName = getAccessibleName(listProps, listAriaDescribedbyId);
533
554
  var listHasAccessibleName = Boolean(Object.keys(listAccessibleName).length);
534
555
  var list = (0, _react2.jsx)(_i18n.EuiI18n, {
535
- tokens: ['euiSelectable.screenReaderInstructions', 'euiSelectable.placeholderName'],
536
- defaults: ['Use up and down arrows to move focus over options. Enter to select. Escape to collapse options.', 'Filter options']
537
- }, function (_ref5) {
538
- var _ref6 = (0, _slicedToArray2.default)(_ref5, 2),
539
- placeholderName = _ref6[0],
540
- screenReaderInstructions = _ref6[1];
541
-
556
+ token: "euiSelectable.placeholderName",
557
+ default: "Filter options"
558
+ }, function (placeholderName) {
542
559
  return (0, _react2.jsx)(_react.default.Fragment, null, searchable && (0, _react2.jsx)(_accessibility.EuiScreenReaderLive, {
543
560
  isActive: messageContent != null || activeOptionIndex != null
544
- }, messageContent || listScreenReaderStatus), (0, _react2.jsx)(_accessibility.EuiScreenReaderOnly, null, (0, _react2.jsx)("p", {
545
- id: listAriaDescribedbyId
546
- }, screenReaderInstructions)), messageContent ? (0, _react2.jsx)(_selectable_message.EuiSelectableMessage, {
561
+ }, messageContent || listScreenReaderStatus), messageContent ? (0, _react2.jsx)(_selectable_message.EuiSelectableMessage, {
547
562
  "data-test-subj": "euiSelectableMessage",
548
563
  id: _this2.messageContentId,
549
564
  bordered: listProps && listProps.bordered
@@ -780,5 +795,12 @@ EuiSelectable.propTypes = {
780
795
  * Control whether or not options get filtered internally or if consumer will filter
781
796
  * Default: false
782
797
  */
783
- isPreFiltered: _propTypes.default.bool
798
+ isPreFiltered: _propTypes.default.bool,
799
+
800
+ /**
801
+ * Optional screen reader instructions to announce upon focus/interaction. This text is read out
802
+ * after the `EuiSelectable` label and a brief pause, but before the default keyboard instructions for
803
+ * interacting with a selectable are read out.
804
+ */
805
+ selectableScreenReaderText: _propTypes.default.string
784
806
  };
@@ -114,7 +114,7 @@ var EuiSelectableList = /*#__PURE__*/function (_Component) {
114
114
  }
115
115
 
116
116
  if (typeof ariaDescribedby === 'string') {
117
- ref.setAttribute('aria-labelledby', ariaDescribedby);
117
+ ref.setAttribute('aria-describedby', ariaDescribedby);
118
118
  }
119
119
  }
120
120
  });