@carbon/ibm-products 2.0.1 → 2.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 (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))));