@carbon/ibm-products 2.0.1 → 2.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. package/css/index-full-carbon.css +192 -56
  2. package/css/index-full-carbon.css.map +1 -1
  3. package/css/index-full-carbon.min.css +3 -3
  4. package/css/index-full-carbon.min.css.map +1 -1
  5. package/css/index-without-carbon-released-only.css +53 -10
  6. package/css/index-without-carbon-released-only.css.map +1 -1
  7. package/css/index-without-carbon-released-only.min.css +1 -1
  8. package/css/index-without-carbon-released-only.min.css.map +1 -1
  9. package/css/index-without-carbon.css +68 -28
  10. package/css/index-without-carbon.css.map +1 -1
  11. package/css/index-without-carbon.min.css +3 -3
  12. package/css/index-without-carbon.min.css.map +1 -1
  13. package/css/index.css +97 -27
  14. package/css/index.css.map +1 -1
  15. package/css/index.min.css +3 -3
  16. package/css/index.min.css.map +1 -1
  17. package/es/components/AboutModal/AboutModal.js +1 -3
  18. package/es/components/ActionBar/ActionBar.js +2 -6
  19. package/es/components/AddSelect/AddSelectFormControl.js +6 -6
  20. package/es/components/AddSelect/AddSelectRow.js +15 -5
  21. package/es/components/BreadcrumbWithOverflow/BreadcrumbWithOverflow.js +2 -6
  22. package/es/components/ButtonMenu/ButtonMenu.js +4 -4
  23. package/es/components/ButtonSetWithOverflow/ButtonSetWithOverflow.js +3 -9
  24. package/es/components/Datagrid/Datagrid/DatagridVirtualBody.js +1 -3
  25. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterFlyout.js +34 -36
  26. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterPanel.js +20 -24
  27. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/index.js +0 -1
  28. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/useFilters.js +44 -15
  29. package/es/components/Datagrid/useFiltering.js +1 -1
  30. package/es/components/Datagrid/useStickyColumn.js +10 -3
  31. package/es/components/PageHeader/PageHeader.js +2 -6
  32. package/es/components/SidePanel/SidePanel.js +1 -3
  33. package/es/components/TagSet/TagSet.js +4 -7
  34. package/es/components/UserProfileImage/UserProfileImage.js +13 -2
  35. package/es/global/js/hooks/useResizeObserver.js +14 -28
  36. package/lib/components/AboutModal/AboutModal.js +1 -3
  37. package/lib/components/ActionBar/ActionBar.js +2 -6
  38. package/lib/components/AddSelect/AddSelectFormControl.js +6 -6
  39. package/lib/components/AddSelect/AddSelectRow.js +15 -5
  40. package/lib/components/BreadcrumbWithOverflow/BreadcrumbWithOverflow.js +2 -6
  41. package/lib/components/ButtonMenu/ButtonMenu.js +4 -4
  42. package/lib/components/ButtonSetWithOverflow/ButtonSetWithOverflow.js +3 -9
  43. package/lib/components/Datagrid/Datagrid/DatagridVirtualBody.js +1 -3
  44. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterFlyout.js +33 -35
  45. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterPanel.js +20 -24
  46. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/index.js +0 -7
  47. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/useFilters.js +42 -13
  48. package/lib/components/Datagrid/useFiltering.js +1 -1
  49. package/lib/components/Datagrid/useStickyColumn.js +10 -3
  50. package/lib/components/PageHeader/PageHeader.js +2 -6
  51. package/lib/components/SidePanel/SidePanel.js +1 -3
  52. package/lib/components/TagSet/TagSet.js +4 -7
  53. package/lib/components/UserProfileImage/UserProfileImage.js +13 -2
  54. package/lib/global/js/hooks/useResizeObserver.js +13 -27
  55. package/package.json +17 -17
  56. package/scss/components/AddSelect/_add-select.scss +4 -0
  57. package/scss/components/BreadcrumbWithOverflow/_breadcrumb-with-overflow.scss +0 -1
  58. package/scss/components/ButtonMenu/_button-menu.scss +32 -1
  59. package/scss/components/Datagrid/_datagrid.scss +4 -2
  60. package/scss/components/Datagrid/_storybook-styles.scss +8 -0
  61. package/scss/components/Datagrid/styles/_datagrid.scss +12 -13
  62. package/scss/components/NotificationsPanel/_notifications-panel.scss +1 -1
  63. package/scss/components/PageHeader/_page-header.scss +0 -1
  64. package/scss/components/SidePanel/_side-panel.scss +0 -2
  65. package/scss/components/Tearsheet/_tearsheet.scss +0 -5
  66. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/useInitialStateFromFilters.js +0 -21
  67. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/useInitialStateFromFilters.js +0 -30
@@ -12,7 +12,7 @@ import { Filter } from '@carbon/react/icons';
12
12
  import { Button, usePrefix } from '@carbon/react';
13
13
  import cx from 'classnames';
14
14
  import PropTypes from 'prop-types';
15
- import React, { useRef, useState } from 'react';
15
+ import React, { useRef, useState, useEffect } from 'react';
16
16
  import { useClickOutside } from '../../../../../global/js/hooks';
17
17
  import { pkg } from '../../../../../settings';
18
18
  import { ActionSet } from '../../../../ActionSet';
@@ -45,11 +45,8 @@ var FilterFlyout = function FilterFlyout(_ref) {
45
45
  setAllFilters = _ref.setAllFilters,
46
46
  _ref$data = _ref.data,
47
47
  data = _ref$data === void 0 ? [] : _ref$data,
48
- _ref$initialFilters = _ref.initialFilters,
49
- initialFilters = _ref$initialFilters === void 0 ? [] : _ref$initialFilters;
50
- // Save the initial filters we only need the filters once when it loads
51
- var initialFiltersRef = useRef(initialFilters);
52
-
48
+ _ref$reactTableFilter = _ref.reactTableFiltersState,
49
+ reactTableFiltersState = _ref$reactTableFilter === void 0 ? [] : _ref$reactTableFilter;
53
50
  /** State */
54
51
  var _useState = useState(false),
55
52
  _useState2 = _slicedToArray(_useState, 2),
@@ -60,15 +57,17 @@ var FilterFlyout = function FilterFlyout(_ref) {
60
57
  filters: filters,
61
58
  setAllFilters: setAllFilters,
62
59
  variation: FLYOUT,
63
- initialFilters: initialFiltersRef.current
60
+ reactTableFiltersState: reactTableFiltersState,
61
+ onCancel: onCancel
64
62
  }),
65
63
  filtersState = _useFilters.filtersState,
66
64
  prevFiltersObjectArrayRef = _useFilters.prevFiltersObjectArrayRef,
67
65
  prevFiltersRef = _useFilters.prevFiltersRef,
68
- revertToPreviousFilters = _useFilters.revertToPreviousFilters,
66
+ cancel = _useFilters.cancel,
69
67
  reset = _useFilters.reset,
70
68
  renderFilter = _useFilters.renderFilter,
71
- filtersObjectArray = _useFilters.filtersObjectArray;
69
+ filtersObjectArray = _useFilters.filtersObjectArray,
70
+ lastAppliedFilters = _useFilters.lastAppliedFilters;
72
71
 
73
72
  /** Refs */
74
73
  var filterFlyoutRef = useRef(null);
@@ -107,26 +106,10 @@ var FilterFlyout = function FilterFlyout(_ref) {
107
106
  // updates the ref so next time the flyout opens we have records of the previous filters
108
107
  prevFiltersRef.current = JSON.stringify(filtersState);
109
108
  prevFiltersObjectArrayRef.current = JSON.stringify(filtersObjectArray);
110
- };
111
- var cancel = function cancel() {
112
- // Reverting to previous filters only applies when using batch actions
113
- if (updateMethod === BATCH) {
114
- revertToPreviousFilters();
115
- onCancel();
116
- }
117
- closeFlyout();
118
- };
119
109
 
120
- /** Effects */
121
- useClickOutside(filterFlyoutRef, function (target) {
122
- var hasClickedOnDatePicker = target.closest('.flatpickr-calendar');
123
- var hasClickedOnDropdown = target.className === "".concat(carbonPrefix, "--list-box__menu-item__option");
124
- if (!open || hasClickedOnDatePicker || hasClickedOnDropdown) {
125
- return;
126
- }
127
- cancel();
128
- });
129
- useSubscribeToEventEmitter(CLEAR_FILTERS, reset);
110
+ // Update the last applied filters
111
+ lastAppliedFilters.current = JSON.stringify(filtersObjectArray);
112
+ };
130
113
 
131
114
  /** Renders all filters */
132
115
  var renderFilters = function renderFilters() {
@@ -153,6 +136,21 @@ var FilterFlyout = function FilterFlyout(_ref) {
153
136
  buttonSize: "md"
154
137
  });
155
138
  };
139
+
140
+ /** Effects */
141
+ useClickOutside(filterFlyoutRef, function (target) {
142
+ var hasClickedOnDatePicker = target.closest('.flatpickr-calendar');
143
+ var hasClickedOnDropdown = target.className === "".concat(carbonPrefix, "--list-box__menu-item__option");
144
+ if (!open || hasClickedOnDatePicker || hasClickedOnDropdown) {
145
+ return;
146
+ }
147
+ closeFlyout();
148
+ cancel();
149
+ });
150
+ useSubscribeToEventEmitter(CLEAR_FILTERS, reset);
151
+ useEffect(function reflectLastAppliedFiltersWhenReactTableUpdates() {
152
+ lastAppliedFilters.current = JSON.stringify(reactTableFiltersState);
153
+ }, [reactTableFiltersState, lastAppliedFilters]);
156
154
  return /*#__PURE__*/React.createElement("div", {
157
155
  className: "".concat(componentClass, "__container")
158
156
  }, /*#__PURE__*/React.createElement(Button, {
@@ -196,14 +194,6 @@ FilterFlyout.propTypes = {
196
194
  * Icon description for the filter flyout button
197
195
  */
198
196
  flyoutIconDescription: PropTypes.string,
199
- /**
200
- * Filters that should be applied on load
201
- */
202
- initialFilters: PropTypes.arrayOf(PropTypes.shape({
203
- id: PropTypes.string.isRequired,
204
- type: PropTypes.string.isRequired,
205
- value: PropTypes.any.isRequired
206
- })),
207
197
  /**
208
198
  * Callback when the apply button is clicked
209
199
  */
@@ -224,6 +214,14 @@ FilterFlyout.propTypes = {
224
214
  * Label text of the primary action in the flyout
225
215
  */
226
216
  primaryActionLabel: PropTypes.string,
217
+ /**
218
+ * Filters from react table's state
219
+ */
220
+ reactTableFiltersState: PropTypes.arrayOf(PropTypes.shape({
221
+ id: PropTypes.string.isRequired,
222
+ type: PropTypes.string.isRequired,
223
+ value: PropTypes.any.isRequired
224
+ })),
227
225
  /**
228
226
  * Label text of the secondary action in the flyout
229
227
  */
@@ -56,11 +56,8 @@ var FilterPanel = function FilterPanel(_ref) {
56
56
  searchLabelText = _ref$searchLabelText === void 0 ? 'Filter search' : _ref$searchLabelText,
57
57
  _ref$searchPlaceholde = _ref.searchPlaceholder,
58
58
  searchPlaceholder = _ref$searchPlaceholde === void 0 ? 'Find filters' : _ref$searchPlaceholde,
59
- _ref$initialFilters = _ref.initialFilters,
60
- initialFilters = _ref$initialFilters === void 0 ? [] : _ref$initialFilters;
61
- // Save the initial filters we only need the filters once
62
- var initialFiltersRef = useRef(initialFilters);
63
-
59
+ _ref$reactTableFilter = _ref.reactTableFiltersState,
60
+ reactTableFiltersState = _ref$reactTableFilter === void 0 ? [] : _ref$reactTableFilter;
64
61
  /** State */
65
62
  var _useState = useState(false),
66
63
  _useState2 = _slicedToArray(_useState, 2),
@@ -71,15 +68,17 @@ var FilterPanel = function FilterPanel(_ref) {
71
68
  filters: filterSections,
72
69
  setAllFilters: setAllFilters,
73
70
  variation: PANEL,
74
- initialFilters: initialFiltersRef.current
71
+ reactTableFiltersState: reactTableFiltersState,
72
+ onCancel: onCancel
75
73
  }),
76
74
  filtersState = _useFilters.filtersState,
77
75
  prevFiltersObjectArrayRef = _useFilters.prevFiltersObjectArrayRef,
78
76
  prevFiltersRef = _useFilters.prevFiltersRef,
79
- revertToPreviousFilters = _useFilters.revertToPreviousFilters,
77
+ cancel = _useFilters.cancel,
80
78
  reset = _useFilters.reset,
81
79
  renderFilter = _useFilters.renderFilter,
82
- filtersObjectArray = _useFilters.filtersObjectArray;
80
+ filtersObjectArray = _useFilters.filtersObjectArray,
81
+ lastAppliedFilters = _useFilters.lastAppliedFilters;
83
82
 
84
83
  /** Refs */
85
84
  var filterPanelRef = useRef();
@@ -109,14 +108,8 @@ var FilterPanel = function FilterPanel(_ref) {
109
108
 
110
109
  /** Methods */
111
110
  var closePanel = function closePanel() {
112
- return setPanelOpen(false);
113
- };
114
- var cancel = function cancel() {
115
- // Reverting to previous filters only applies when using batch actions
116
- if (updateMethod === BATCH) {
117
- revertToPreviousFilters();
118
- onCancel();
119
- }
111
+ cancel();
112
+ setPanelOpen(false);
120
113
  };
121
114
  var apply = function apply() {
122
115
  setAllFilters(filtersObjectArray);
@@ -128,6 +121,9 @@ var FilterPanel = function FilterPanel(_ref) {
128
121
  // updates the ref so next time the flyout opens we have records of the previous filters
129
122
  prevFiltersRef.current = JSON.stringify(filtersState);
130
123
  prevFiltersObjectArrayRef.current = JSON.stringify(filtersObjectArray);
124
+
125
+ // Update the last applied filters
126
+ lastAppliedFilters.current = JSON.stringify(filtersObjectArray);
131
127
  };
132
128
  var renderActionSet = function renderActionSet() {
133
129
  return showActionSet && /*#__PURE__*/React.createElement(MotionActionSet, {
@@ -244,20 +240,20 @@ FilterPanel.propTypes = {
244
240
  closeIconDescription: PropTypes.string,
245
241
  filterPanelMinHeight: PropTypes.number,
246
242
  filterSections: PropTypes.array,
247
- /**
248
- * Filters that should be applied on load
249
- */
250
- initialFilters: PropTypes.arrayOf(PropTypes.shape({
251
- id: PropTypes.string.isRequired,
252
- type: PropTypes.string.isRequired,
253
- value: PropTypes.any.isRequired
254
- })),
255
243
  onApply: PropTypes.func,
256
244
  onCancel: PropTypes.func,
257
245
  onPanelClose: PropTypes.func,
258
246
  onPanelOpen: PropTypes.func,
259
247
  open: PropTypes.bool,
260
248
  primaryActionLabel: PropTypes.string,
249
+ /**
250
+ * Filters from react table's state
251
+ */
252
+ reactTableFiltersState: PropTypes.arrayOf(PropTypes.shape({
253
+ id: PropTypes.string.isRequired,
254
+ type: PropTypes.string.isRequired,
255
+ value: PropTypes.any.isRequired
256
+ })),
261
257
  searchLabelText: PropTypes.string,
262
258
  searchPlaceholder: PropTypes.string,
263
259
  secondaryActionLabel: PropTypes.string,
@@ -5,7 +5,6 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- export { default as useInitialStateFromFilters } from './useInitialStateFromFilters';
9
8
  export { default as useSubscribeToEventEmitter } from './useSubscribeToEventEmitter';
10
9
  export { default as useFilters } from './useFilters';
11
10
  export { default as useShouldDisableButtons } from './useShouldDisableButtons';
@@ -11,10 +11,9 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
11
11
  * US Government Users Restricted Rights - Use, duplication or disclosure
12
12
  * restricted by GSA ADP Schedule Contract with IBM Corp.
13
13
  */
14
- import React, { useState, useRef } from 'react';
14
+ import React, { useState, useRef, useEffect } from 'react';
15
15
  import { Checkbox, DatePicker, DatePickerInput, Dropdown, FormGroup, NumberInput, RadioButton, RadioButtonGroup, Layer } from '@carbon/react';
16
- import { INSTANT, DATE, CHECKBOX, NUMBER, RADIO, DROPDOWN, PANEL } from '../constants';
17
- import useInitialStateFromFilters from './useInitialStateFromFilters';
16
+ import { INSTANT, BATCH, DATE, CHECKBOX, NUMBER, RADIO, DROPDOWN, PANEL } from '../constants';
18
17
  import { getInitialStateFromFilters } from '../utils';
19
18
  var useFilters = function useFilters(_ref) {
20
19
  var updateMethod = _ref.updateMethod,
@@ -22,19 +21,22 @@ var useFilters = function useFilters(_ref) {
22
21
  filters = _ref$filters === void 0 ? [] : _ref$filters,
23
22
  setAllFilters = _ref.setAllFilters,
24
23
  variation = _ref.variation,
25
- initialFilters = _ref.initialFilters;
24
+ reactTableFiltersState = _ref.reactTableFiltersState,
25
+ _ref$onCancel = _ref.onCancel,
26
+ onCancel = _ref$onCancel === void 0 ? function () {} : _ref$onCancel;
26
27
  /** State */
27
- var _useInitialStateFromF = useInitialStateFromFilters(filters, variation, initialFilters),
28
- _useInitialStateFromF2 = _slicedToArray(_useInitialStateFromF, 2),
29
- filtersState = _useInitialStateFromF2[0],
30
- setFiltersState = _useInitialStateFromF2[1];
31
- var _useState = useState(initialFilters),
28
+ var _useState = useState(getInitialStateFromFilters(filters, variation, reactTableFiltersState)),
32
29
  _useState2 = _slicedToArray(_useState, 2),
33
- filtersObjectArray = _useState2[0],
34
- setFiltersObjectArray = _useState2[1];
30
+ filtersState = _useState2[0],
31
+ setFiltersState = _useState2[1];
32
+ var _useState3 = useState(reactTableFiltersState),
33
+ _useState4 = _slicedToArray(_useState3, 2),
34
+ filtersObjectArray = _useState4[0],
35
+ setFiltersObjectArray = _useState4[1];
35
36
 
36
37
  // When using batch actions we have to store the filters to then apply them later
37
38
  var prevFiltersRef = useRef(JSON.stringify(filtersState));
39
+ var lastAppliedFilters = useRef(JSON.stringify(reactTableFiltersState));
38
40
  var prevFiltersObjectArrayRef = useRef(JSON.stringify(filtersObjectArray));
39
41
 
40
42
  /** Methods */
@@ -43,6 +45,7 @@ var useFilters = function useFilters(_ref) {
43
45
  var revertToPreviousFilters = function revertToPreviousFilters() {
44
46
  setFiltersState(JSON.parse(prevFiltersRef.current));
45
47
  setFiltersObjectArray(JSON.parse(prevFiltersObjectArrayRef.current));
48
+ setAllFilters(JSON.parse(lastAppliedFilters.current));
46
49
  };
47
50
  var reset = function reset() {
48
51
  // When we reset we want the "initialFilters" to be an empty array
@@ -154,8 +157,11 @@ var useFilters = function useFilters(_ref) {
154
157
  var type = _ref3.type,
155
158
  column = _ref3.column,
156
159
  components = _ref3.props;
157
- var isPanel = variation === PANEL;
158
160
  var filter;
161
+ var isPanel = variation === PANEL;
162
+ if (!type) {
163
+ return console.error("type: ".concat(type, "; does not exist as a type of filter."));
164
+ }
159
165
  switch (type) {
160
166
  case DATE:
161
167
  filter = /*#__PURE__*/React.createElement(DatePicker, _extends({}, components.DatePicker, {
@@ -281,10 +287,31 @@ var useFilters = function useFilters(_ref) {
281
287
  break;
282
288
  }
283
289
  if (isPanel) {
284
- return /*#__PURE__*/React.createElement(Layer, null, filter);
290
+ return /*#__PURE__*/React.createElement(Layer, {
291
+ key: column
292
+ }, filter);
285
293
  }
286
- return filter;
294
+ return /*#__PURE__*/React.createElement(React.Fragment, {
295
+ key: column
296
+ }, filter);
287
297
  };
298
+ var cancel = function cancel() {
299
+ // Reverting to previous filters only applies when using batch actions
300
+ if (updateMethod === BATCH) {
301
+ revertToPreviousFilters();
302
+ onCancel();
303
+ }
304
+ };
305
+
306
+ /** The purpose of this function is to sync any changes in react-tables state.filters array and reflect
307
+ those new filter changes in the panel/flyout state. The external change is triggered if setAllFilters is called outside of the Datagrid */
308
+ useEffect(function updateStateAndFiltersToReflectExternalFilterChanges() {
309
+ var newFiltersState = getInitialStateFromFilters(filters, variation, reactTableFiltersState);
310
+ setFiltersState(newFiltersState);
311
+ prevFiltersRef.current = JSON.stringify(newFiltersState);
312
+ prevFiltersObjectArrayRef.current = JSON.stringify(reactTableFiltersState);
313
+ setFiltersObjectArray(reactTableFiltersState);
314
+ }, [filters, reactTableFiltersState, variation]);
288
315
  return {
289
316
  filtersState: filtersState,
290
317
  setFiltersState: setFiltersState,
@@ -293,7 +320,9 @@ var useFilters = function useFilters(_ref) {
293
320
  revertToPreviousFilters: revertToPreviousFilters,
294
321
  reset: reset,
295
322
  renderFilter: renderFilter,
296
- filtersObjectArray: filtersObjectArray
323
+ filtersObjectArray: filtersObjectArray,
324
+ lastAppliedFilters: lastAppliedFilters,
325
+ cancel: cancel
297
326
  };
298
327
  };
299
328
  export default useFilters;
@@ -74,7 +74,7 @@ var useFiltering = function useFiltering(hooks) {
74
74
  variation: 'flyout',
75
75
  updateMethod: BATCH,
76
76
  panelIconDescription: 'Open filter panel',
77
- initialFilters: state.filters
77
+ reactTableFiltersState: state.filters
78
78
  };
79
79
  var getFilterFlyoutProps = function getFilterFlyoutProps() {
80
80
  return _objectSpread(_objectSpread(_objectSpread({}, defaultProps), filterProps), {}, {
@@ -21,10 +21,13 @@ var OFFSET_SCROLL_CLASS = "".concat(styleClassPrefix, "-offset-scroll");
21
21
  var useStickyColumn = function useStickyColumn(hooks) {
22
22
  var tableBodyRef = useRef();
23
23
  var stickyHeaderCellRef = useRef();
24
- var _useState = useState(window.innerWidth),
24
+ var _useState = useState(null),
25
25
  _useState2 = _slicedToArray(_useState, 2),
26
26
  windowSize = _useState2[0],
27
27
  setWindowSize = _useState2[1];
28
+ useEffect(function () {
29
+ setWindowSize(window.innerWidth);
30
+ }, []);
28
31
  useLayoutEffect(function () {
29
32
  function updateSize() {
30
33
  setWindowSize(window.innerWidth);
@@ -53,9 +56,13 @@ var useStickyColumn = function useStickyColumn(hooks) {
53
56
  headerCellElement.classList.add(OFFSET_SCROLL_CLASS);
54
57
  }
55
58
  var boundListener = debounce(onBodyResize.bind(null, tableBodyElement, headerCellElement), 250);
56
- window.addEventListener('resize', boundListener);
59
+ if (typeof window !== 'undefined') {
60
+ window.addEventListener('resize', boundListener);
61
+ }
57
62
  return function () {
58
- window.removeEventListener('resize', boundListener);
63
+ if (typeof window !== 'undefined') {
64
+ window.removeEventListener('resize', boundListener);
65
+ }
59
66
  };
60
67
  }, [instance.rows, instance.isFetching]);
61
68
  useEffect(function () {
@@ -314,12 +314,8 @@ export var PageHeader = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
314
314
  utilSetCollapsed(collapseHeader, metrics.headerOffset, metrics.headerTopValue);
315
315
  }
316
316
  }, [collapseHeader, metrics.headerOffset, metrics.headerTopValue]);
317
- useResizeObserver(sizingContainerRef, {
318
- callback: handleResizeActionBarColumn
319
- });
320
- useResizeObserver(headerRef, {
321
- callback: handleResize
322
- });
317
+ useResizeObserver(sizingContainerRef, handleResizeActionBarColumn);
318
+ useResizeObserver(headerRef, handleResize);
323
319
 
324
320
  // Determine what form of title to display in the breadcrumb
325
321
  var breadcrumbItemForTitle = utilGetBreadcrumbItemForTitle(blockClass, collapseTitle, title);
@@ -444,9 +444,7 @@ export var SidePanel = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
444
444
  }, title));
445
445
  };
446
446
  var contentRef = ref || sidePanelRef;
447
- useResizeObserver(contentRef, {
448
- callback: handleResize
449
- });
447
+ useResizeObserver(contentRef, handleResize);
450
448
  return /*#__PURE__*/React.createElement(AnimatePresence, null, open && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(motion.div, _extends({}, getDevtoolsProps(componentName), rest, {
451
449
  id: "".concat(blockClass, "-outer"),
452
450
  className: mainPanelClassNames,
@@ -156,7 +156,8 @@ export var TagSet = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
156
156
  if (sizingTags.length > 0) {
157
157
  var spaceAvailable = tagSetRef.current.offsetWidth;
158
158
  for (var i in sizingTags) {
159
- var tagWidth = sizingTags[i].offsetWidth;
159
+ var _sizingTags$i;
160
+ var tagWidth = ((_sizingTags$i = sizingTags[i]) === null || _sizingTags$i === void 0 ? void 0 : _sizingTags$i.offsetWidth) || 0;
160
161
  if (spaceAvailable >= tagWidth) {
161
162
  spaceAvailable -= tagWidth;
162
163
  willFit += 1;
@@ -198,12 +199,8 @@ export var TagSet = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
198
199
  var handleModalClose = function handleModalClose() {
199
200
  setShowAllModalOpen(false);
200
201
  };
201
- useResizeObserver(sizingContainerRef, {
202
- callback: handleSizerTagsResize
203
- });
204
- useResizeObserver(tagSetRef, {
205
- callback: handleResize
206
- });
202
+ useResizeObserver(sizingContainerRef, handleSizerTagsResize);
203
+ useResizeObserver(tagSetRef, handleResize);
207
204
  return /*#__PURE__*/React.createElement("div", _extends({}, rest, {
208
205
  className: cx([blockClass, className]),
209
206
  ref: tagSetRef
@@ -1,6 +1,6 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
3
- var _excluded = ["backgroundColor", "className", "kind", "icon", "initials", "image", "imageDescription", "size", "theme", "tooltipText"];
3
+ var _excluded = ["backgroundColor", "className", "kind", "icon", "initials", "image", "imageDescription", "size", "theme", "tooltipText", "tooltipAlignment"];
4
4
  /**
5
5
  * Copyright IBM Corp. 2021, 2021
6
6
  *
@@ -28,6 +28,10 @@ var componentName = 'UserProfileImage';
28
28
 
29
29
  // NOTE: the component SCSS is not imported here: it is rolled up separately.
30
30
 
31
+ // Default values for props
32
+ var defaults = {
33
+ tooltipAlignment: 'bottom'
34
+ };
31
35
  /**
32
36
  * This is a user profile image component which displays an image, or initials or icon for a user.
33
37
  */
@@ -42,6 +46,8 @@ export var UserProfileImage = /*#__PURE__*/React.forwardRef(function (_ref, ref)
42
46
  size = _ref.size,
43
47
  theme = _ref.theme,
44
48
  tooltipText = _ref.tooltipText,
49
+ _ref$tooltipAlignment = _ref.tooltipAlignment,
50
+ tooltipAlignment = _ref$tooltipAlignment === void 0 ? defaults.tooltipAlignment : _ref$tooltipAlignment,
45
51
  rest = _objectWithoutProperties(_ref, _excluded);
46
52
  var icons = {
47
53
  user: {
@@ -121,7 +127,8 @@ export var UserProfileImage = /*#__PURE__*/React.forwardRef(function (_ref, ref)
121
127
  return FillItem && (tooltipText ? /*#__PURE__*/React.createElement(IconButton, {
122
128
  label: tooltipText,
123
129
  className: "".concat(blockClass, "__tooltip"),
124
- kind: "ghost"
130
+ kind: "ghost",
131
+ align: tooltipAlignment
125
132
  }, renderUserProfileImage()) : renderUserProfileImage());
126
133
  });
127
134
 
@@ -169,6 +176,10 @@ UserProfileImage.propTypes = {
169
176
  * Set theme in which the component will be rendered
170
177
  */
171
178
  theme: PropTypes.oneOf(['light', 'dark']).isRequired,
179
+ /**
180
+ * Specify how the trigger should align with the tooltip
181
+ */
182
+ tooltipAlignment: PropTypes.oneOf(['top', 'top-left', 'top-right', 'bottom', 'bottom-left', 'bottom-right', 'left', 'right']),
172
183
  /**
173
184
  * Pass in the display name to have it shown on hover
174
185
  */
@@ -5,14 +5,8 @@ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
5
5
  * This source code is licensed under the Apache-2.0 license found in the
6
6
  * LICENSE file in the root directory of this source tree.
7
7
  */
8
- import { useRef, useState, useLayoutEffect } from 'react';
9
- export var useResizeObserver = function useResizeObserver(ref) {
10
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
11
- callback: null,
12
- throttleInterval: 0
13
- };
14
- var callback = options.callback,
15
- throttleInterval = options.throttleInterval;
8
+ import { useRef, useState, useLayoutEffect, useEffect } from 'react';
9
+ export var useResizeObserver = function useResizeObserver(ref, callback) {
16
10
  var _useState = useState(0),
17
11
  _useState2 = _slicedToArray(_useState, 2),
18
12
  width = _useState2[0],
@@ -21,8 +15,14 @@ export var useResizeObserver = function useResizeObserver(ref) {
21
15
  _useState4 = _slicedToArray(_useState3, 2),
22
16
  height = _useState4[0],
23
17
  setHeight = _useState4[1];
24
- var throttleTimeout = useRef(null);
25
18
  var entriesToHandle = useRef(null);
19
+ var cb = useRef(callback);
20
+ useEffect(function () {
21
+ // ref for callback removes it as dependency fro useLayoutEffect
22
+ // This significantly reduces repeated calls if a function is redefined on every
23
+ // render
24
+ cb.current = callback;
25
+ }, [callback]);
26
26
  useLayoutEffect(function () {
27
27
  if (!(ref !== null && ref !== void 0 && ref.current)) {
28
28
  return;
@@ -34,29 +34,15 @@ export var useResizeObserver = function useResizeObserver(ref) {
34
34
  var entry = entriesToHandle.current[0];
35
35
  setWidth(entry.contentRect.width);
36
36
  setHeight(entry.contentRect.height);
37
- throttleTimeout.current = null;
38
- callback && callback(entry.contentRect);
37
+ cb.current && cb.current(entry.contentRect);
39
38
  };
40
39
  var observer = new ResizeObserver(function (entries) {
41
40
  // always update entriesToHandle
42
41
  entriesToHandle.current = entries;
43
- if (throttleInterval) {
44
- // if a throttleInterval check for running timeout
45
- if (throttleTimeout.current === null) {
46
- // no live timeout set entries to handle and move on
47
-
48
- // set up throttle
49
- throttleTimeout.current = setTimeout(function () {
50
- // do callbacks
51
- doCallbacks();
52
- // reset throttle
53
- throttleTimeout.current = null;
54
- }, throttleInterval);
55
- }
56
- } else {
57
- // no throttle do callbacks every time
42
+ window.requestAnimationFrame(function () {
43
+ // do callbacks
58
44
  doCallbacks();
59
- }
45
+ });
60
46
  });
61
47
 
62
48
  // observe all refs passed
@@ -66,7 +52,7 @@ export var useResizeObserver = function useResizeObserver(ref) {
66
52
  observer = null;
67
53
  };
68
54
  // eslint-disable-next-line react-hooks/exhaustive-deps
69
- }, [ref, options]);
55
+ }, [ref]);
70
56
  return {
71
57
  width: width,
72
58
  height: height
@@ -81,9 +81,7 @@ var AboutModal = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref) {
81
81
  }, [bodyRef]);
82
82
 
83
83
  // Detect resize of the ModalBody to recalculate whether scrolling is enabled
84
- (0, _useResizeObserver.useResizeObserver)(bodyRef, {
85
- callback: handleResize
86
- });
84
+ (0, _useResizeObserver.useResizeObserver)(bodyRef, handleResize);
87
85
  return /*#__PURE__*/_react.default.createElement(_react2.ComposedModal, (0, _extends2.default)({}, rest, {
88
86
  className: (0, _classnames.default)(blockClass,
89
87
  // Apply the block class to the main HTML element
@@ -192,12 +192,8 @@ var ActionBar = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref) {
192
192
  };
193
193
 
194
194
  // // resize of the items
195
- (0, _useResizeObserver.useResizeObserver)(sizingRef, {
196
- callback: handleResize
197
- });
198
- (0, _useResizeObserver.useResizeObserver)(localRef, {
199
- callback: handleResize
200
- });
195
+ (0, _useResizeObserver.useResizeObserver)(sizingRef, handleResize);
196
+ (0, _useResizeObserver.useResizeObserver)(localRef, handleResize);
201
197
  return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({}, rest, {
202
198
  className: (0, _classnames.default)([blockClass, className]),
203
199
  ref: localRef
@@ -14,16 +14,15 @@ var _UserProfileImage = require("../UserProfileImage");
14
14
  var componentName = 'AddSelectFormControl';
15
15
  var blockClass = "".concat(_settings.pkg.prefix, "--add-select__selections");
16
16
  var AddSelectFormControl = function AddSelectFormControl(_ref) {
17
- var _controlProps;
18
17
  var item = _ref.item,
19
18
  onClick = _ref.onClick,
20
19
  selected = _ref.selected,
21
20
  type = _ref.type;
22
- var controlProps = (_controlProps = {
21
+ var controlProps = (0, _defineProperty2.default)({
23
22
  onClick: onClick,
24
- id: item.id,
25
- className: "".concat(blockClass, "-form-control-wrapper")
26
- }, (0, _defineProperty2.default)(_controlProps, "aria-label", item.title), (0, _defineProperty2.default)(_controlProps, "size", 20), _controlProps);
23
+ className: "".concat(blockClass, "-form-control-wrapper ").concat(blockClass, "-form-control-wrapper--").concat(type),
24
+ size: 20
25
+ }, "aria-labelledby", "control-label-".concat(item.id));
27
26
  var getCheckbox = function getCheckbox() {
28
27
  if (selected) {
29
28
  return /*#__PURE__*/_react.default.createElement(_icons.CheckboxCheckedFilled, controlProps);
@@ -75,7 +74,8 @@ var AddSelectFormControl = function AddSelectFormControl(_ref) {
75
74
  }, getItemIcon(item)), /*#__PURE__*/_react.default.createElement("div", {
76
75
  className: "".concat(blockClass, "-form-control-label-text")
77
76
  }, /*#__PURE__*/_react.default.createElement("span", {
78
- className: "".concat(blockClass, "-cell-title")
77
+ className: "".concat(blockClass, "-cell-title"),
78
+ id: "control-label-".concat(item.id)
79
79
  }, item.title), item.subtitle && /*#__PURE__*/_react.default.createElement("span", {
80
80
  className: "".concat(blockClass, "-cell-subtitle")
81
81
  }, item.subtitle))));