@elastic/eui 92.0.0 → 92.1.1

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 (156) hide show
  1. package/dist/eui_theme_dark.css +3 -18
  2. package/dist/eui_theme_dark.min.css +1 -1
  3. package/dist/eui_theme_light.css +3 -18
  4. package/dist/eui_theme_light.min.css +1 -1
  5. package/es/components/aspect_ratio/aspect_ratio.js +1 -1
  6. package/es/components/collapsible_nav_beta/collapsible_nav_body_footer.js +7 -3
  7. package/es/components/collapsible_nav_beta/collapsible_nav_body_footer.styles.js +4 -4
  8. package/es/components/datagrid/body/{data_grid_cell.js → cell/data_grid_cell.js} +111 -244
  9. package/es/components/datagrid/body/{data_grid_cell_actions.js → cell/data_grid_cell_actions.js} +5 -5
  10. package/es/components/datagrid/body/{data_grid_cell_popover.js → cell/data_grid_cell_popover.js} +4 -4
  11. package/es/components/datagrid/body/{data_grid_cell_wrapper.js → cell/data_grid_cell_wrapper.js} +1 -1
  12. package/es/components/datagrid/body/cell/focus_utils.js +166 -0
  13. package/es/components/datagrid/body/cell/index.js +11 -0
  14. package/es/components/datagrid/body/data_grid_body.js +0 -2
  15. package/es/components/datagrid/body/data_grid_body_custom.js +1 -7
  16. package/es/components/datagrid/body/data_grid_body_virtualized.js +1 -7
  17. package/es/components/datagrid/body/footer/data_grid_footer_row.js +1 -2
  18. package/es/components/datagrid/body/header/data_grid_control_header_cell.js +3 -6
  19. package/es/components/datagrid/body/header/data_grid_header_cell.js +27 -12
  20. package/es/components/datagrid/body/header/data_grid_header_cell_wrapper.js +45 -116
  21. package/es/components/datagrid/body/header/data_grid_header_row.js +5 -10
  22. package/es/components/datagrid/body/header/use_data_grid_header.js +3 -14
  23. package/es/components/datagrid/data_grid.js +2 -12
  24. package/es/components/datagrid/utils/focus.js +25 -54
  25. package/es/components/datagrid/utils/scrolling.js +1 -1
  26. package/es/components/flyout/flyout_resizable.js +10 -10
  27. package/es/components/flyout/flyout_resizable.styles.js +12 -6
  28. package/es/components/resizable_container/helpers.js +5 -6
  29. package/es/components/resizable_container/resizable_button.js +13 -4
  30. package/es/components/resizable_container/resizable_button.styles.js +18 -8
  31. package/es/components/resizable_container/resizable_container.js +28 -22
  32. package/es/components/steps/step_number.styles.js +6 -7
  33. package/es/components/tree_view/tree_view.js +9 -2
  34. package/eui.d.ts +130 -90
  35. package/i18ntokens.json +108 -72
  36. package/lib/components/aspect_ratio/aspect_ratio.js +1 -1
  37. package/lib/components/collapsible_nav_beta/collapsible_nav_body_footer.js +7 -3
  38. package/lib/components/collapsible_nav_beta/collapsible_nav_body_footer.styles.js +4 -4
  39. package/lib/components/datagrid/body/{data_grid_cell.js → cell/data_grid_cell.js} +111 -244
  40. package/lib/components/datagrid/body/{data_grid_cell_actions.js → cell/data_grid_cell_actions.js} +5 -5
  41. package/lib/components/datagrid/body/{data_grid_cell_popover.js → cell/data_grid_cell_popover.js} +4 -4
  42. package/lib/components/datagrid/body/{data_grid_cell_wrapper.js → cell/data_grid_cell_wrapper.js} +1 -1
  43. package/lib/components/datagrid/body/cell/focus_utils.js +174 -0
  44. package/lib/components/datagrid/body/cell/index.js +32 -0
  45. package/lib/components/datagrid/body/data_grid_body.js +0 -2
  46. package/lib/components/datagrid/body/data_grid_body_custom.js +2 -8
  47. package/lib/components/datagrid/body/data_grid_body_virtualized.js +2 -8
  48. package/lib/components/datagrid/body/footer/data_grid_footer_row.js +5 -6
  49. package/lib/components/datagrid/body/header/data_grid_control_header_cell.js +3 -6
  50. package/lib/components/datagrid/body/header/data_grid_header_cell.js +35 -20
  51. package/lib/components/datagrid/body/header/data_grid_header_cell_wrapper.js +47 -119
  52. package/lib/components/datagrid/body/header/data_grid_header_row.js +5 -10
  53. package/lib/components/datagrid/body/header/use_data_grid_header.js +10 -24
  54. package/lib/components/datagrid/data_grid.js +4 -14
  55. package/lib/components/datagrid/utils/focus.js +26 -56
  56. package/lib/components/datagrid/utils/scrolling.js +2 -2
  57. package/lib/components/flyout/flyout_resizable.js +10 -10
  58. package/lib/components/flyout/flyout_resizable.styles.js +12 -6
  59. package/lib/components/resizable_container/helpers.js +7 -7
  60. package/lib/components/resizable_container/resizable_button.js +13 -4
  61. package/lib/components/resizable_container/resizable_button.styles.js +18 -8
  62. package/lib/components/resizable_container/resizable_container.js +28 -22
  63. package/lib/components/steps/step_number.styles.js +6 -7
  64. package/lib/components/tree_view/tree_view.js +9 -2
  65. package/optimize/es/components/aspect_ratio/aspect_ratio.js +1 -1
  66. package/optimize/es/components/collapsible_nav_beta/collapsible_nav_body_footer.js +7 -3
  67. package/optimize/es/components/collapsible_nav_beta/collapsible_nav_body_footer.styles.js +4 -4
  68. package/optimize/es/components/datagrid/body/{data_grid_cell.js → cell/data_grid_cell.js} +111 -244
  69. package/optimize/es/components/datagrid/body/{data_grid_cell_actions.js → cell/data_grid_cell_actions.js} +5 -5
  70. package/optimize/es/components/datagrid/body/{data_grid_cell_popover.js → cell/data_grid_cell_popover.js} +4 -4
  71. package/optimize/es/components/datagrid/body/{data_grid_cell_wrapper.js → cell/data_grid_cell_wrapper.js} +1 -1
  72. package/optimize/es/components/datagrid/body/cell/focus_utils.js +153 -0
  73. package/optimize/es/components/datagrid/body/cell/index.js +11 -0
  74. package/optimize/es/components/datagrid/body/data_grid_body_custom.js +1 -5
  75. package/optimize/es/components/datagrid/body/data_grid_body_virtualized.js +1 -5
  76. package/optimize/es/components/datagrid/body/footer/data_grid_footer_row.js +1 -2
  77. package/optimize/es/components/datagrid/body/header/data_grid_control_header_cell.js +2 -4
  78. package/optimize/es/components/datagrid/body/header/data_grid_header_cell.js +25 -10
  79. package/optimize/es/components/datagrid/body/header/data_grid_header_cell_wrapper.js +41 -115
  80. package/optimize/es/components/datagrid/body/header/data_grid_header_row.js +4 -8
  81. package/optimize/es/components/datagrid/body/header/use_data_grid_header.js +3 -13
  82. package/optimize/es/components/datagrid/data_grid.js +2 -12
  83. package/optimize/es/components/datagrid/utils/focus.js +25 -54
  84. package/optimize/es/components/datagrid/utils/scrolling.js +1 -1
  85. package/optimize/es/components/flyout/flyout_resizable.js +10 -10
  86. package/optimize/es/components/flyout/flyout_resizable.styles.js +12 -6
  87. package/optimize/es/components/resizable_container/helpers.js +5 -6
  88. package/optimize/es/components/resizable_container/resizable_button.js +5 -2
  89. package/optimize/es/components/resizable_container/resizable_button.styles.js +18 -8
  90. package/optimize/es/components/resizable_container/resizable_container.js +28 -22
  91. package/optimize/es/components/steps/step_number.styles.js +6 -7
  92. package/optimize/es/components/tree_view/tree_view.js +9 -2
  93. package/optimize/lib/components/aspect_ratio/aspect_ratio.js +1 -1
  94. package/optimize/lib/components/collapsible_nav_beta/collapsible_nav_body_footer.js +7 -3
  95. package/optimize/lib/components/collapsible_nav_beta/collapsible_nav_body_footer.styles.js +4 -4
  96. package/optimize/lib/components/datagrid/body/{data_grid_cell.js → cell/data_grid_cell.js} +111 -244
  97. package/optimize/lib/components/datagrid/body/{data_grid_cell_actions.js → cell/data_grid_cell_actions.js} +5 -5
  98. package/optimize/lib/components/datagrid/body/{data_grid_cell_popover.js → cell/data_grid_cell_popover.js} +4 -4
  99. package/optimize/lib/components/datagrid/body/{data_grid_cell_wrapper.js → cell/data_grid_cell_wrapper.js} +1 -1
  100. package/optimize/lib/components/datagrid/body/cell/focus_utils.js +163 -0
  101. package/optimize/lib/components/datagrid/body/cell/index.js +32 -0
  102. package/optimize/lib/components/datagrid/body/data_grid_body_custom.js +2 -6
  103. package/optimize/lib/components/datagrid/body/data_grid_body_virtualized.js +2 -6
  104. package/optimize/lib/components/datagrid/body/footer/data_grid_footer_row.js +5 -6
  105. package/optimize/lib/components/datagrid/body/header/data_grid_control_header_cell.js +2 -4
  106. package/optimize/lib/components/datagrid/body/header/data_grid_header_cell.js +25 -10
  107. package/optimize/lib/components/datagrid/body/header/data_grid_header_cell_wrapper.js +41 -115
  108. package/optimize/lib/components/datagrid/body/header/data_grid_header_row.js +4 -8
  109. package/optimize/lib/components/datagrid/body/header/use_data_grid_header.js +4 -14
  110. package/optimize/lib/components/datagrid/data_grid.js +4 -14
  111. package/optimize/lib/components/datagrid/utils/focus.js +26 -56
  112. package/optimize/lib/components/datagrid/utils/scrolling.js +2 -2
  113. package/optimize/lib/components/flyout/flyout_resizable.js +10 -10
  114. package/optimize/lib/components/flyout/flyout_resizable.styles.js +12 -6
  115. package/optimize/lib/components/resizable_container/helpers.js +7 -7
  116. package/optimize/lib/components/resizable_container/resizable_button.js +5 -2
  117. package/optimize/lib/components/resizable_container/resizable_button.styles.js +18 -8
  118. package/optimize/lib/components/resizable_container/resizable_container.js +28 -22
  119. package/optimize/lib/components/steps/step_number.styles.js +6 -7
  120. package/optimize/lib/components/tree_view/tree_view.js +9 -2
  121. package/package.json +1 -1
  122. package/src/components/datagrid/body/header/_data_grid_header_row.scss +8 -7
  123. package/test-env/components/aspect_ratio/aspect_ratio.js +1 -1
  124. package/test-env/components/collapsible_nav_beta/collapsible_nav_body_footer.js +7 -3
  125. package/test-env/components/collapsible_nav_beta/collapsible_nav_body_footer.styles.js +4 -4
  126. package/test-env/components/datagrid/body/{data_grid_cell.js → cell/data_grid_cell.js} +111 -244
  127. package/test-env/components/datagrid/body/{data_grid_cell_actions.js → cell/data_grid_cell_actions.js} +5 -5
  128. package/test-env/components/datagrid/body/{data_grid_cell_popover.js → cell/data_grid_cell_popover.js} +4 -4
  129. package/test-env/components/datagrid/body/{data_grid_cell_wrapper.js → cell/data_grid_cell_wrapper.js} +1 -1
  130. package/test-env/components/datagrid/body/cell/focus_utils.js +172 -0
  131. package/test-env/components/datagrid/body/cell/index.js +32 -0
  132. package/test-env/components/datagrid/body/data_grid_body.js +0 -2
  133. package/test-env/components/datagrid/body/data_grid_body_custom.js +2 -8
  134. package/test-env/components/datagrid/body/data_grid_body_virtualized.js +2 -8
  135. package/test-env/components/datagrid/body/footer/data_grid_footer_row.js +5 -6
  136. package/test-env/components/datagrid/body/header/data_grid_control_header_cell.js +3 -6
  137. package/test-env/components/datagrid/body/header/data_grid_header_cell.js +25 -10
  138. package/test-env/components/datagrid/body/header/data_grid_header_cell_wrapper.js +44 -116
  139. package/test-env/components/datagrid/body/header/data_grid_header_row.js +5 -10
  140. package/test-env/components/datagrid/body/header/use_data_grid_header.js +4 -14
  141. package/test-env/components/datagrid/data_grid.js +4 -14
  142. package/test-env/components/datagrid/utils/focus.js +26 -56
  143. package/test-env/components/datagrid/utils/scrolling.js +2 -2
  144. package/test-env/components/flyout/flyout_resizable.js +10 -10
  145. package/test-env/components/flyout/flyout_resizable.styles.js +12 -6
  146. package/test-env/components/resizable_container/helpers.js +7 -7
  147. package/test-env/components/resizable_container/resizable_button.js +13 -4
  148. package/test-env/components/resizable_container/resizable_button.styles.js +18 -8
  149. package/test-env/components/resizable_container/resizable_container.js +28 -22
  150. package/test-env/components/steps/step_number.styles.js +6 -7
  151. package/test-env/components/tree_view/tree_view.js +9 -2
  152. package/es/components/datagrid/body/header/header_is_interactive.js +0 -58
  153. package/lib/components/datagrid/body/header/header_is_interactive.js +0 -63
  154. package/optimize/es/components/datagrid/body/header/header_is_interactive.js +0 -53
  155. package/optimize/lib/components/datagrid/body/header/header_is_interactive.js +0 -61
  156. package/test-env/components/datagrid/body/header/header_is_interactive.js +0 -61
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.HandleInteractiveChildren = exports.FocusTrappedChildren = void 0;
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
+ var _react = _interopRequireWildcard(require("react"));
11
+ var _tabbable = require("tabbable");
12
+ var _services = require("../../../../services");
13
+ var _focus_trap = require("../../../focus_trap");
14
+ var _accessibility = require("../../../accessibility");
15
+ var _i18n = require("../../../i18n");
16
+ var _react2 = require("@emotion/react");
17
+ 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); }
18
+ 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; }
19
+ /*
20
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
21
+ * or more contributor license agreements. Licensed under the Elastic License
22
+ * 2.0 and the Server Side Public License, v 1; you may not use this file except
23
+ * in compliance with, at your election, the Elastic License 2.0 or the Server
24
+ * Side Public License, v 1.
25
+ */
26
+
27
+ /**
28
+ * This internal utility component is used by all cells, both header and body/footer cells.
29
+ * It always handles:
30
+ * 1. Removing any interactive children from keyboard tab order on cell mount
31
+ * 2. Listening for focus on any interactive children and updating the cell focus context
32
+ *
33
+ * It should *only* render focus traps for:
34
+ * 1. Header cells that are `actions: false` but still have interactive children
35
+ * 2. Body cells that are `isExpandable: false` but still have interactive children
36
+ */
37
+ var HandleInteractiveChildren = function HandleInteractiveChildren(_ref) {
38
+ var cellEl = _ref.cellEl,
39
+ children = _ref.children,
40
+ updateCellFocusContext = _ref.updateCellFocusContext,
41
+ renderFocusTrap = _ref.renderFocusTrap;
42
+ var _useState = (0, _react.useState)(false),
43
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
44
+ hasInteractiveChildren = _useState2[0],
45
+ setHasInteractiveChildren = _useState2[1];
46
+
47
+ // On mount, disable all interactive children
48
+ (0, _react.useEffect)(function () {
49
+ if (cellEl) {
50
+ var interactiveChildren = disableInteractives(cellEl);
51
+ if (renderFocusTrap) {
52
+ setHasInteractiveChildren(interactiveChildren.length > 0);
53
+ }
54
+ }
55
+ }, [cellEl, renderFocusTrap]);
56
+
57
+ // Ensure that any interactive children that are clicked update the latest cell focus context
58
+ (0, _react.useEffect)(function () {
59
+ if (cellEl) {
60
+ var onFocus = function onFocus() {
61
+ return updateCellFocusContext();
62
+ };
63
+ cellEl.addEventListener('focus', onFocus, true); // useCapture listens for focus on children
64
+ return function () {
65
+ cellEl.removeEventListener('focus', onFocus, true);
66
+ };
67
+ }
68
+ }, [cellEl, updateCellFocusContext]);
69
+ var _children = (0, _react.useMemo)(function () {
70
+ return (0, _react2.jsx)(_react.default.Fragment, null, children);
71
+ }, [children]);
72
+ if (!cellEl) return _children; // Do nothing if cell has yet to mount or is unmounting
73
+ if (!renderFocusTrap) return _children; // Cells with default actions / expansion popovers do not need to trap
74
+ if (!hasInteractiveChildren) return _children; // No need to focus trap if no children are interactive
75
+
76
+ return (0, _react2.jsx)(FocusTrappedChildren, {
77
+ cellEl: cellEl
78
+ }, children);
79
+ };
80
+
81
+ /**
82
+ * Cells with interactive children but no cell popover expansion should render a
83
+ * focus trap that can be entered with the Enter key, which cycles keyboard tabs
84
+ * through the cell contents only, and exited with the Escape key
85
+ */
86
+ exports.HandleInteractiveChildren = HandleInteractiveChildren;
87
+ var FocusTrappedChildren = function FocusTrappedChildren(_ref2) {
88
+ var cellEl = _ref2.cellEl,
89
+ children = _ref2.children;
90
+ var _useState3 = (0, _react.useState)(false),
91
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
92
+ isCellEntered = _useState4[0],
93
+ setIsCellEntered = _useState4[1];
94
+ (0, _react.useEffect)(function () {
95
+ if (isCellEntered) {
96
+ enableAndFocusInteractives(cellEl);
97
+ } else {
98
+ disableInteractives(cellEl);
99
+ }
100
+ }, [isCellEntered, cellEl]);
101
+ (0, _react.useEffect)(function () {
102
+ var onKeyUp = function onKeyUp(event) {
103
+ switch (event.key) {
104
+ case _services.keys.ENTER:
105
+ case _services.keys.F2:
106
+ event.preventDefault();
107
+ setIsCellEntered(true);
108
+ break;
109
+ case _services.keys.ESCAPE:
110
+ event.preventDefault();
111
+ setIsCellEntered(function (isCellEntered) {
112
+ if (isCellEntered === true) {
113
+ requestAnimationFrame(function () {
114
+ return cellEl.focus();
115
+ }); // move focus to cell
116
+ return false;
117
+ }
118
+ return isCellEntered;
119
+ });
120
+ break;
121
+ }
122
+ };
123
+ cellEl.addEventListener('keyup', onKeyUp);
124
+ return function () {
125
+ cellEl.removeEventListener('keyup', onKeyUp);
126
+ };
127
+ }, [cellEl]);
128
+ return (0, _react2.jsx)(_focus_trap.EuiFocusTrap, {
129
+ disabled: !isCellEntered,
130
+ onDeactivation: function onDeactivation() {
131
+ return setIsCellEntered(false);
132
+ },
133
+ clickOutsideDisables: true
134
+ }, children, (0, _react2.jsx)(_accessibility.EuiScreenReaderOnly, null, (0, _react2.jsx)("p", null, ' - ', (0, _react2.jsx)(_i18n.EuiI18n
135
+ // eslint-disable-next-line local/i18n
136
+ , {
137
+ token: "euiDataGridCell.focusTrapEnterPrompt",
138
+ default: "Press the Enter key to interact with this cell's contents."
139
+ }))));
140
+ };
141
+
142
+ /**
143
+ * Utility fns for managing child interactive tabIndex state
144
+ */
145
+ exports.FocusTrappedChildren = FocusTrappedChildren;
146
+ var disableInteractives = function disableInteractives(cell) {
147
+ var interactives = (0, _tabbable.tabbable)(cell);
148
+ interactives.forEach(function (element) {
149
+ element.setAttribute('data-euigrid-tab-managed', 'true');
150
+ element.setAttribute('tabIndex', '-1');
151
+ });
152
+ return interactives;
153
+ };
154
+ var enableAndFocusInteractives = function enableAndFocusInteractives(cell) {
155
+ var interactives = cell.querySelectorAll('[data-euigrid-tab-managed]');
156
+ interactives.forEach(function (element, i) {
157
+ element.setAttribute('tabIndex', '0');
158
+ if (i === 0) {
159
+ element.focus();
160
+ }
161
+ });
162
+ return interactives;
163
+ };
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "Cell", {
7
+ enumerable: true,
8
+ get: function get() {
9
+ return _data_grid_cell_wrapper.Cell;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "DataGridCellPopoverContext", {
13
+ enumerable: true,
14
+ get: function get() {
15
+ return _data_grid_cell_popover.DataGridCellPopoverContext;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "EuiDataGridCell", {
19
+ enumerable: true,
20
+ get: function get() {
21
+ return _data_grid_cell.EuiDataGridCell;
22
+ }
23
+ });
24
+ Object.defineProperty(exports, "useCellPopover", {
25
+ enumerable: true,
26
+ get: function get() {
27
+ return _data_grid_cell_popover.useCellPopover;
28
+ }
29
+ });
30
+ var _data_grid_cell = require("./data_grid_cell");
31
+ var _data_grid_cell_wrapper = require("./data_grid_cell_wrapper");
32
+ var _data_grid_cell_popover = require("./data_grid_cell_popover");
@@ -17,7 +17,7 @@ var _col_widths = require("../utils/col_widths");
17
17
  var _row_heights = require("../utils/row_heights");
18
18
  var _header = require("./header");
19
19
  var _footer = require("./footer");
20
- var _data_grid_cell_wrapper = require("./data_grid_cell_wrapper");
20
+ var _cell = require("./cell");
21
21
  var _react2 = require("@emotion/react");
22
22
  var _excluded = ["colIndex", "visibleRowIndex"];
23
23
  /*
@@ -44,8 +44,6 @@ var EuiDataGridBodyCustomRender = function EuiDataGridBodyCustomRender(_ref) {
44
44
  renderCellPopover = _ref.renderCellPopover,
45
45
  renderFooterCellValue = _ref.renderFooterCellValue,
46
46
  interactiveCellId = _ref.interactiveCellId,
47
- headerIsInteractive = _ref.headerIsInteractive,
48
- handleHeaderMutation = _ref.handleHeaderMutation,
49
47
  setVisibleColumns = _ref.setVisibleColumns,
50
48
  switchColumnPos = _ref.switchColumnPos,
51
49
  onColumnResize = _ref.onColumnResize,
@@ -91,8 +89,6 @@ var EuiDataGridBodyCustomRender = function EuiDataGridBodyCustomRender(_ref) {
91
89
  * Header & footer
92
90
  */
93
91
  var _useDataGridHeader = (0, _header.useDataGridHeader)({
94
- headerIsInteractive: headerIsInteractive,
95
- handleHeaderMutation: handleHeaderMutation,
96
92
  switchColumnPos: switchColumnPos,
97
93
  setVisibleColumns: setVisibleColumns,
98
94
  leadingControlColumns: leadingControlColumns,
@@ -152,7 +148,7 @@ var EuiDataGridBodyCustomRender = function EuiDataGridBodyCustomRender(_ref) {
152
148
  visibleRowIndex: visibleRowIndex,
153
149
  style: style
154
150
  }, cellProps);
155
- return (0, _react2.jsx)(_data_grid_cell_wrapper.Cell, (0, _extends2.default)({}, props, rest));
151
+ return (0, _react2.jsx)(_cell.Cell, (0, _extends2.default)({}, props, rest));
156
152
  }, [].concat((0, _toConsumableArray2.default)(Object.values(cellProps)), [getRowHeight]) // eslint-disable-line react-hooks/exhaustive-deps
157
153
  );
158
154
 
@@ -15,7 +15,7 @@ var _reactWindow = require("react-window");
15
15
  var _resize_observer = require("../../observer/resize_observer");
16
16
  var _header = require("./header");
17
17
  var _footer = require("./footer");
18
- var _data_grid_cell_wrapper = require("./data_grid_cell_wrapper");
18
+ var _cell = require("./cell");
19
19
  var _data_grid_row_manager = require("./data_grid_row_manager");
20
20
  var _grid_height_width = require("../utils/grid_height_width");
21
21
  var _col_widths = require("../utils/col_widths");
@@ -41,7 +41,7 @@ var _Cell = function _Cell(_ref) {
41
41
  data = _ref.data;
42
42
  var _useContext = (0, _react.useContext)(DataGridWrapperRowsContext),
43
43
  headerRowHeight = _useContext.headerRowHeight;
44
- return (0, _react2.jsx)(_data_grid_cell_wrapper.Cell, (0, _extends2.default)({
44
+ return (0, _react2.jsx)(_cell.Cell, (0, _extends2.default)({
45
45
  colIndex: columnIndex,
46
46
  visibleRowIndex: rowIndex,
47
47
  style: _objectSpread(_objectSpread({}, style), {}, {
@@ -92,8 +92,6 @@ var EuiDataGridBodyVirtualized = function EuiDataGridBodyVirtualized(_ref3) {
92
92
  renderFooterCellValue = _ref3.renderFooterCellValue,
93
93
  interactiveCellId = _ref3.interactiveCellId,
94
94
  pagination = _ref3.pagination,
95
- headerIsInteractive = _ref3.headerIsInteractive,
96
- handleHeaderMutation = _ref3.handleHeaderMutation,
97
95
  setVisibleColumns = _ref3.setVisibleColumns,
98
96
  switchColumnPos = _ref3.switchColumnPos,
99
97
  onColumnResize = _ref3.onColumnResize,
@@ -143,8 +141,6 @@ var EuiDataGridBodyVirtualized = function EuiDataGridBodyVirtualized(_ref3) {
143
141
  * Header & footer
144
142
  */
145
143
  var _useDataGridHeader = (0, _header.useDataGridHeader)({
146
- headerIsInteractive: headerIsInteractive,
147
- handleHeaderMutation: handleHeaderMutation,
148
144
  switchColumnPos: switchColumnPos,
149
145
  setVisibleColumns: setVisibleColumns,
150
146
  leadingControlColumns: leadingControlColumns,
@@ -10,8 +10,7 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
10
10
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
11
11
  var _classnames = _interopRequireDefault(require("classnames"));
12
12
  var _react = _interopRequireWildcard(require("react"));
13
- var _data_grid_cell = require("../data_grid_cell");
14
- var _data_grid_cell_popover = require("../data_grid_cell_popover");
13
+ var _cell = require("../cell");
15
14
  var _react2 = require("@emotion/react");
16
15
  var _excluded = ["leadingControlColumns", "trailingControlColumns", "columns", "schema", "columnWidths", "defaultColumnWidth", "className", "renderCellValue", "renderCellPopover", "rowIndex", "interactiveCellId", "data-test-subj", "visibleRowIndex"];
17
16
  /*
@@ -46,7 +45,7 @@ var EuiDataGridFooterRow = /*#__PURE__*/(0, _react.memo)( /*#__PURE__*/(0, _reac
46
45
  'euiDataGridRow--striped': visibleRowIndex % 2 !== 0
47
46
  }, 'euiDataGridFooter', className);
48
47
  var dataTestSubj = (0, _classnames.default)('dataGridRow', 'dataGridFooterRow', _dataTestSubj);
49
- var popoverContext = (0, _react.useContext)(_data_grid_cell_popover.DataGridCellPopoverContext);
48
+ var popoverContext = (0, _react.useContext)(_cell.DataGridCellPopoverContext);
50
49
  var sharedCellProps = {
51
50
  rowIndex: rowIndex,
52
51
  visibleRowIndex: visibleRowIndex,
@@ -63,7 +62,7 @@ var EuiDataGridFooterRow = /*#__PURE__*/(0, _react.memo)( /*#__PURE__*/(0, _reac
63
62
  width = _ref2.width,
64
63
  footerCellRender = _ref2.footerCellRender,
65
64
  footerCellProps = _ref2.footerCellProps;
66
- return (0, _react2.jsx)(_data_grid_cell.EuiDataGridCell, (0, _extends2.default)({}, footerCellProps, sharedCellProps, {
65
+ return (0, _react2.jsx)(_cell.EuiDataGridCell, (0, _extends2.default)({}, footerCellProps, sharedCellProps, {
67
66
  key: "".concat(id, "-").concat(rowIndex),
68
67
  colIndex: i,
69
68
  columnId: id,
@@ -77,7 +76,7 @@ var EuiDataGridFooterRow = /*#__PURE__*/(0, _react.memo)( /*#__PURE__*/(0, _reac
77
76
  var columnType = schema[id] ? schema[id].columnType : null;
78
77
  var width = columnWidths[id] || defaultColumnWidth;
79
78
  var columnPosition = i + leadingControlColumns.length;
80
- return (0, _react2.jsx)(_data_grid_cell.EuiDataGridCell, (0, _extends2.default)({}, sharedCellProps, {
79
+ return (0, _react2.jsx)(_cell.EuiDataGridCell, (0, _extends2.default)({}, sharedCellProps, {
81
80
  key: "".concat(columnPosition, ",").concat(visibleRowIndex) // Note: this key should use cell position to match react-window/data cell behavior. See #5720
82
81
  ,
83
82
  colIndex: columnPosition,
@@ -95,7 +94,7 @@ var EuiDataGridFooterRow = /*#__PURE__*/(0, _react.memo)( /*#__PURE__*/(0, _reac
95
94
  footerCellRender = _ref4.footerCellRender,
96
95
  footerCellProps = _ref4.footerCellProps;
97
96
  var colIndex = i + columns.length + leadingControlColumns.length;
98
- return (0, _react2.jsx)(_data_grid_cell.EuiDataGridCell, (0, _extends2.default)({}, footerCellProps, sharedCellProps, {
97
+ return (0, _react2.jsx)(_cell.EuiDataGridCell, (0, _extends2.default)({}, footerCellProps, sharedCellProps, {
99
98
  key: "".concat(id, "-").concat(rowIndex),
100
99
  colIndex: colIndex,
101
100
  columnId: id,
@@ -20,8 +20,7 @@ var _react2 = require("@emotion/react");
20
20
 
21
21
  var EuiDataGridControlHeaderCell = function EuiDataGridControlHeaderCell(_ref) {
22
22
  var controlColumn = _ref.controlColumn,
23
- index = _ref.index,
24
- headerIsInteractive = _ref.headerIsInteractive;
23
+ index = _ref.index;
25
24
  var HeaderCellRender = controlColumn.headerCellRender,
26
25
  headerCellProps = controlColumn.headerCellProps,
27
26
  width = controlColumn.width,
@@ -30,8 +29,7 @@ var EuiDataGridControlHeaderCell = function EuiDataGridControlHeaderCell(_ref) {
30
29
  className: (0, _classnames.default)('euiDataGridHeaderCell--controlColumn', headerCellProps === null || headerCellProps === void 0 ? void 0 : headerCellProps.className),
31
30
  id: id,
32
31
  index: index,
33
- width: width,
34
- headerIsInteractive: headerIsInteractive
32
+ width: width
35
33
  }), (0, _react2.jsx)("div", {
36
34
  className: "euiDataGridHeaderCell__content"
37
35
  }, (0, _react2.jsx)(HeaderCellRender, null)));
@@ -7,8 +7,8 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.useSortingUtils = exports.usePopoverArrowNavigation = exports.EuiDataGridHeaderCell = void 0;
9
9
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
12
12
  var _classnames2 = _interopRequireDefault(require("classnames"));
13
13
  var _react = _interopRequireWildcard(require("react"));
14
14
  var _tabbable = require("tabbable");
@@ -43,6 +43,7 @@ var _ref2 = process.env.NODE_ENV === "production" ? {
43
43
  toString: _EMOTION_STRINGIFIED_CSS_ERROR__
44
44
  };
45
45
  var EuiDataGridHeaderCell = function EuiDataGridHeaderCell(_ref) {
46
+ var _classnames;
46
47
  var column = _ref.column,
47
48
  index = _ref.index,
48
49
  columns = _ref.columns,
@@ -52,15 +53,13 @@ var EuiDataGridHeaderCell = function EuiDataGridHeaderCell(_ref) {
52
53
  defaultColumnWidth = _ref.defaultColumnWidth,
53
54
  setColumnWidth = _ref.setColumnWidth,
54
55
  setVisibleColumns = _ref.setVisibleColumns,
55
- switchColumnPos = _ref.switchColumnPos,
56
- headerIsInteractive = _ref.headerIsInteractive;
56
+ switchColumnPos = _ref.switchColumnPos;
57
57
  var id = column.id,
58
58
  display = column.display,
59
59
  displayAsText = column.displayAsText,
60
60
  displayHeaderCellProps = column.displayHeaderCellProps;
61
61
  var width = columnWidths[id] || defaultColumnWidth;
62
62
  var columnType = schema[id] ? schema[id].columnType : null;
63
- var classes = (0, _classnames2.default)((0, _defineProperty2.default)({}, "euiDataGridHeaderCell--".concat(columnType), columnType), displayHeaderCellProps === null || displayHeaderCellProps === void 0 ? void 0 : displayHeaderCellProps.className);
64
63
  var _useContext = (0, _react.useContext)(_focus.DataGridFocusContext),
65
64
  setFocusedCell = _useContext.setFocusedCell,
66
65
  focusFirstVisibleInteractiveCell = _useContext.focusFirstVisibleInteractiveCell;
@@ -85,6 +84,14 @@ var EuiDataGridHeaderCell = function EuiDataGridHeaderCell(_ref) {
85
84
  });
86
85
  var showColumnActions = columnActions && columnActions.length > 0;
87
86
  var actionsButtonRef = (0, _react.useRef)(null);
87
+ var focusActionsButton = (0, _react.useCallback)(function () {
88
+ var _actionsButtonRef$cur;
89
+ (_actionsButtonRef$cur = actionsButtonRef.current) === null || _actionsButtonRef$cur === void 0 ? void 0 : _actionsButtonRef$cur.focus();
90
+ }, []);
91
+ var _useState3 = (0, _react.useState)(false),
92
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
93
+ isActionsButtonFocused = _useState4[0],
94
+ setIsActionsButtonFocused = _useState4[1];
88
95
  var _useSortingUtils = useSortingUtils({
89
96
  sorting: sorting,
90
97
  id: id,
@@ -105,13 +112,16 @@ var EuiDataGridHeaderCell = function EuiDataGridHeaderCell(_ref) {
105
112
  title: displayAsText || id,
106
113
  className: "euiDataGridHeaderCell__content"
107
114
  }, display || displayAsText || id), sortingArrow);
115
+ var classes = (0, _classnames2.default)((_classnames = {}, (0, _defineProperty2.default)(_classnames, "euiDataGridHeaderCell--".concat(columnType), columnType), (0, _defineProperty2.default)(_classnames, 'euiDataGridHeaderCell--hasColumnActions', showColumnActions), (0, _defineProperty2.default)(_classnames, 'euiDataGridHeaderCell--isActionsPopoverOpen', isPopoverOpen), _classnames), displayHeaderCellProps === null || displayHeaderCellProps === void 0 ? void 0 : displayHeaderCellProps.className);
108
116
  return (0, _react2.jsx)(_data_grid_header_cell_wrapper.EuiDataGridHeaderCellWrapper, (0, _extends2.default)({}, displayHeaderCellProps, {
109
117
  className: classes,
110
118
  id: id,
111
119
  index: index,
112
120
  width: width,
113
- headerIsInteractive: headerIsInteractive,
114
- "aria-sort": ariaSort
121
+ "aria-sort": ariaSort,
122
+ hasActionsPopover: showColumnActions,
123
+ isActionsButtonFocused: isActionsButtonFocused,
124
+ focusActionsButton: focusActionsButton
115
125
  }), column.isResizable !== false && width != null ? (0, _react2.jsx)(_data_grid_column_resizer.EuiDataGridColumnResizer, {
116
126
  columnId: id,
117
127
  columnWidth: width,
@@ -119,11 +129,16 @@ var EuiDataGridHeaderCell = function EuiDataGridHeaderCell(_ref) {
119
129
  }) : null, !showColumnActions ? (0, _react2.jsx)(_react.default.Fragment, null, cellContent, sortingScreenReaderText && (0, _react2.jsx)(_accessibility2.EuiScreenReaderOnly, null, (0, _react2.jsx)("p", null, sortingScreenReaderText))) : (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)("button", {
120
130
  className: "euiDataGridHeaderCell__button",
121
131
  onClick: function onClick() {
122
- setFocusedCell([index, -1]);
123
- setIsPopoverOpen(function (isPopoverOpen) {
132
+ return setIsPopoverOpen(function (isPopoverOpen) {
124
133
  return !isPopoverOpen;
125
134
  });
126
135
  },
136
+ onFocus: function onFocus() {
137
+ return setIsActionsButtonFocused(true);
138
+ },
139
+ onBlur: function onBlur() {
140
+ return setIsActionsButtonFocused(false);
141
+ },
127
142
  "aria-describedby": "".concat(sortingAriaId, " ").concat(actionsAriaId),
128
143
  ref: actionsButtonRef,
129
144
  "data-test-subj": "dataGridHeaderCellActionButton-".concat(id)
@@ -137,8 +152,8 @@ var EuiDataGridHeaderCell = function EuiDataGridHeaderCell(_ref) {
137
152
  focusTrapProps: {
138
153
  // We need to override the default EuiPopover `onClickOutside` since the anchor is separate from the actual button
139
154
  onClickOutside: function onClickOutside(event) {
140
- var _actionsButtonRef$cur;
141
- if (((_actionsButtonRef$cur = actionsButtonRef.current) === null || _actionsButtonRef$cur === void 0 ? void 0 : _actionsButtonRef$cur.contains(event.target)) === false) {
155
+ var _actionsButtonRef$cur2;
156
+ if (((_actionsButtonRef$cur2 = actionsButtonRef.current) === null || _actionsButtonRef$cur2 === void 0 ? void 0 : _actionsButtonRef$cur2.contains(event.target)) === false) {
142
157
  setIsPopoverOpen(false);
143
158
  }
144
159
  }
@@ -11,11 +11,10 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
11
11
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
12
12
  var _classnames = _interopRequireDefault(require("classnames"));
13
13
  var _react = _interopRequireWildcard(require("react"));
14
- var _tabbable = require("tabbable");
15
- var _services = require("../../../../services");
16
14
  var _focus = require("../../utils/focus");
15
+ var _focus_utils = require("../cell/focus_utils");
17
16
  var _react2 = require("@emotion/react");
18
- var _excluded = ["id", "index", "headerIsInteractive", "width", "className", "children"];
17
+ var _excluded = ["id", "index", "width", "className", "children", "hasActionsPopover", "isActionsButtonFocused", "focusActionsButton"];
19
18
  /*
20
19
  * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
21
20
  * or more contributor license agreements. Licensed under the Elastic License
@@ -23,120 +22,66 @@ var _excluded = ["id", "index", "headerIsInteractive", "width", "className", "ch
23
22
  * in compliance with, at your election, the Elastic License 2.0 or the Server
24
23
  * Side Public License, v 1.
25
24
  */
26
- 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); }
27
- 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; }
28
25
  /**
29
26
  * This is a wrapper that handles repeated concerns between control &
30
27
  * standard header cells. Most of its shared logic is around focus state/UX,
31
28
  * but it also DRY's out certain class/data-test-subj/style attributes
32
29
  */
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); }
31
+ 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; }
33
32
  var EuiDataGridHeaderCellWrapper = function EuiDataGridHeaderCellWrapper(_ref) {
34
33
  var id = _ref.id,
35
34
  index = _ref.index,
36
- headerIsInteractive = _ref.headerIsInteractive,
37
35
  width = _ref.width,
38
36
  className = _ref.className,
39
37
  children = _ref.children,
38
+ hasActionsPopover = _ref.hasActionsPopover,
39
+ isActionsButtonFocused = _ref.isActionsButtonFocused,
40
+ focusActionsButton = _ref.focusActionsButton,
40
41
  rest = (0, _objectWithoutProperties2.default)(_ref, _excluded);
41
42
  var classes = (0, _classnames.default)('euiDataGridHeaderCell', className);
43
+
44
+ // Must be a state and not a ref to trigger a HandleInteractiveChildren rerender
45
+ var _useState = (0, _react.useState)(null),
46
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
47
+ headerEl = _useState2[0],
48
+ setHeaderEl = _useState2[1];
42
49
  var _useContext = (0, _react.useContext)(_focus.DataGridFocusContext),
43
50
  setFocusedCell = _useContext.setFocusedCell,
44
51
  onFocusUpdate = _useContext.onFocusUpdate;
45
- var _useState = (0, _react.useState)(false),
46
- _useState2 = (0, _slicedToArray2.default)(_useState, 2),
47
- isFocused = _useState2[0],
48
- setIsFocused = _useState2[1];
52
+ var updateCellFocusContext = (0, _react.useCallback)(function () {
53
+ setFocusedCell([index, -1]);
54
+ }, [index, setFocusedCell]);
55
+ var _useState3 = (0, _react.useState)(false),
56
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
57
+ isFocused = _useState4[0],
58
+ setIsFocused = _useState4[1];
49
59
  (0, _react.useEffect)(function () {
50
60
  onFocusUpdate([index, -1], function (isFocused) {
51
61
  setIsFocused(isFocused);
52
62
  });
53
63
  }, [index, onFocusUpdate]);
54
- var headerRef = (0, _react.useRef)(null);
55
- var _useState3 = (0, _react.useState)(false),
56
- _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
57
- isCellEntered = _useState4[0],
58
- setIsCellEntered = _useState4[1];
59
64
  (0, _react.useEffect)(function () {
60
- var headerNode = headerRef.current;
61
- if (isCellEntered) {
62
- enableAndFocusInteractives(headerNode);
63
- } else {
64
- disableInteractives(headerNode);
65
- }
66
- }, [isCellEntered]);
67
- (0, _react.useEffect)(function () {
68
- var headerNode = headerRef.current;
69
- if (isFocused) {
70
- var interactives = headerNode.querySelectorAll('[data-euigrid-tab-managed]');
71
- if (interactives.length === 1) {
72
- setIsCellEntered(true);
73
- } else {
74
- headerNode.focus();
65
+ if (isFocused && headerEl) {
66
+ // Only focus the cell if not already focused on something in the cell
67
+ if (!headerEl.contains(document.activeElement)) {
68
+ headerEl.focus();
75
69
  }
76
- } else {
77
- setIsCellEntered(false);
78
70
  }
71
+ }, [isFocused, headerEl]);
79
72
 
80
- // focusin bubbles while focus does not, and this needs to react to children gaining focus
81
- var onFocusIn = function onFocusIn(e) {
82
- if (!headerIsInteractive) {
83
- // header is not interactive, avoid focusing
84
- requestAnimationFrame(function () {
85
- return headerNode.blur();
86
- });
87
- e.preventDefault();
88
- return false;
89
- } else {
90
- // take the focus
91
- if (isFocused === false) {
92
- setFocusedCell([index, -1]);
93
- } else {
94
- // this cell already had the grid's focus, so re-enable and focus interactives
95
- setIsCellEntered(true);
96
- }
97
- }
98
- };
99
-
100
- // focusout bubbles while blur does not, and this needs to react to the children losing focus
101
- var onFocusOut = function onFocusOut() {
102
- // wait for the next element to receive focus, then update interactives' state
103
- requestAnimationFrame(function () {
104
- if (!headerNode.contains(document.activeElement)) {
105
- setIsCellEntered(false);
106
- }
107
- });
108
- };
109
- var onKeyUp = function onKeyUp(event) {
110
- switch (event.key) {
111
- case _services.keys.ENTER:
112
- {
113
- event.preventDefault();
114
- setIsCellEntered(true);
115
- break;
116
- }
117
- case _services.keys.ESCAPE:
118
- {
119
- event.preventDefault();
120
- // move focus to cell
121
- setIsCellEntered(false);
122
- headerNode.focus();
123
- break;
124
- }
125
- }
126
- };
127
- headerNode.addEventListener('focusin', onFocusIn);
128
- headerNode.addEventListener('focusout', onFocusOut);
129
- headerNode.addEventListener('keyup', onKeyUp);
130
- return function () {
131
- headerNode.removeEventListener('focusin', onFocusIn);
132
- headerNode.removeEventListener('focusout', onFocusOut);
133
- headerNode.removeEventListener('keyup', onKeyUp);
134
- };
135
- }, [headerIsInteractive, isFocused, index, setFocusedCell]);
73
+ // For cell headers with actions, auto-focus into the button instead of the cell wrapper div
74
+ // The button text is significantly more useful to screen readers (e.g. contains sort order & hints)
75
+ var onFocus = (0, _react.useCallback)(function (e) {
76
+ if (hasActionsPopover && e.target === headerEl) {
77
+ focusActionsButton === null || focusActionsButton === void 0 ? void 0 : focusActionsButton();
78
+ }
79
+ }, [hasActionsPopover, focusActionsButton, headerEl]);
136
80
  return (0, _react2.jsx)("div", (0, _extends2.default)({
137
81
  role: "columnheader",
138
- ref: headerRef,
139
- tabIndex: isFocused && !isCellEntered ? 0 : -1,
82
+ ref: setHeaderEl,
83
+ tabIndex: isFocused && !isActionsButtonFocused ? 0 : -1,
84
+ onFocus: onFocus,
140
85
  className: classes,
141
86
  "data-test-subj": "dataGridHeaderCell-".concat(id),
142
87
  "data-gridcell-column-id": id,
@@ -146,29 +91,10 @@ var EuiDataGridHeaderCellWrapper = function EuiDataGridHeaderCellWrapper(_ref) {
146
91
  style: width != null ? {
147
92
  width: "".concat(width, "px")
148
93
  } : {}
149
- }, rest), children);
94
+ }, rest), (0, _react2.jsx)(_focus_utils.HandleInteractiveChildren, {
95
+ cellEl: headerEl,
96
+ updateCellFocusContext: updateCellFocusContext,
97
+ renderFocusTrap: !hasActionsPopover
98
+ }, children));
150
99
  };
151
-
152
- /**
153
- * Utility fns for managing child interactive tabIndex state
154
- */
155
- exports.EuiDataGridHeaderCellWrapper = EuiDataGridHeaderCellWrapper;
156
- var disableInteractives = function disableInteractives(headerNode) {
157
- var tabbables = (0, _tabbable.tabbable)(headerNode);
158
- if (tabbables.length > 1) {
159
- console.warn("EuiDataGridHeaderCell expects at most 1 tabbable element, ".concat(tabbables.length, " found instead"));
160
- }
161
- tabbables.forEach(function (element) {
162
- element.setAttribute('data-euigrid-tab-managed', 'true');
163
- element.setAttribute('tabIndex', '-1');
164
- });
165
- };
166
- var enableAndFocusInteractives = function enableAndFocusInteractives(headerNode) {
167
- var interactiveElements = headerNode.querySelectorAll('[data-euigrid-tab-managed]');
168
- interactiveElements.forEach(function (element, i) {
169
- element.setAttribute('tabIndex', '0');
170
- if (i === 0) {
171
- element.focus();
172
- }
173
- });
174
- };
100
+ exports.EuiDataGridHeaderCellWrapper = EuiDataGridHeaderCellWrapper;