@carbon/ibm-products 1.53.1 → 1.54.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. package/README.md +15 -15
  2. package/css/index-full-carbon.css +0 -5
  3. package/css/index-full-carbon.css.map +1 -1
  4. package/css/index-full-carbon.min.css +1 -1
  5. package/css/index-full-carbon.min.css.map +1 -1
  6. package/css/index-without-carbon.css +0 -5
  7. package/css/index-without-carbon.css.map +1 -1
  8. package/css/index-without-carbon.min.css +1 -1
  9. package/css/index-without-carbon.min.css.map +1 -1
  10. package/css/index.css +0 -5
  11. package/css/index.css.map +1 -1
  12. package/css/index.min.css +1 -1
  13. package/css/index.min.css.map +1 -1
  14. package/es/components/AboutModal/AboutModal.js +1 -3
  15. package/es/components/ActionBar/ActionBar.js +4 -6
  16. package/es/components/BreadcrumbWithOverflow/BreadcrumbWithOverflow.js +2 -6
  17. package/es/components/ButtonSetWithOverflow/ButtonSetWithOverflow.js +3 -9
  18. package/es/components/Datagrid/Datagrid/DatagridVirtualBody.js +1 -3
  19. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterFlyout.js +35 -36
  20. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterPanel.js +22 -26
  21. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/index.js +0 -1
  22. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/useFilters.js +50 -17
  23. package/es/components/Datagrid/useFiltering.js +1 -1
  24. package/es/components/Datagrid/useStickyColumn.js +10 -3
  25. package/es/components/Datagrid/utils/makeData.js +1 -1
  26. package/es/components/PageHeader/PageHeader.js +2 -6
  27. package/es/components/SidePanel/SidePanel.js +1 -3
  28. package/es/components/TagSet/TagSet.js +2 -6
  29. package/es/global/js/hooks/useResizeObserver.js +14 -28
  30. package/es/global/js/utils/story-helper.js +1 -1
  31. package/lib/components/AboutModal/AboutModal.js +1 -3
  32. package/lib/components/ActionBar/ActionBar.js +4 -6
  33. package/lib/components/BreadcrumbWithOverflow/BreadcrumbWithOverflow.js +2 -6
  34. package/lib/components/ButtonSetWithOverflow/ButtonSetWithOverflow.js +3 -9
  35. package/lib/components/Datagrid/Datagrid/DatagridVirtualBody.js +1 -3
  36. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterFlyout.js +33 -35
  37. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterPanel.js +22 -26
  38. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/index.js +0 -7
  39. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/useFilters.js +48 -15
  40. package/lib/components/Datagrid/useFiltering.js +1 -1
  41. package/lib/components/Datagrid/useStickyColumn.js +10 -3
  42. package/lib/components/Datagrid/utils/makeData.js +1 -1
  43. package/lib/components/PageHeader/PageHeader.js +2 -6
  44. package/lib/components/SidePanel/SidePanel.js +1 -3
  45. package/lib/components/TagSet/TagSet.js +2 -6
  46. package/lib/global/js/hooks/useResizeObserver.js +13 -27
  47. package/lib/global/js/utils/story-helper.js +1 -1
  48. package/package.json +7 -7
  49. package/scss/components/Datagrid/_storybook-styles.scss +8 -0
  50. package/scss/components/Datagrid/styles/_datagrid.scss +0 -5
  51. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/useInitialStateFromFilters.js +0 -21
  52. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/useInitialStateFromFilters.js +0 -30
@@ -12,12 +12,13 @@ import { Filter16 } from '@carbon/icons-react';
12
12
  import { Button } from 'carbon-components-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';
19
19
  import { BATCH, CLEAR_FILTERS, FLYOUT, INSTANT } from './constants';
20
20
  import { useSubscribeToEventEmitter, useFilters, useShouldDisableButtons } from './hooks';
21
+ import { carbon } from '../../../../../settings';
21
22
  var blockClass = "".concat(pkg.prefix, "--datagrid");
22
23
  var componentClass = "".concat(blockClass, "-filter-flyout");
23
24
  var FilterFlyout = function FilterFlyout(_ref) {
@@ -45,11 +46,8 @@ var FilterFlyout = function FilterFlyout(_ref) {
45
46
  setAllFilters = _ref.setAllFilters,
46
47
  _ref$data = _ref.data,
47
48
  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
-
49
+ _ref$reactTableFilter = _ref.reactTableFiltersState,
50
+ reactTableFiltersState = _ref$reactTableFilter === void 0 ? [] : _ref$reactTableFilter;
53
51
  /** State */
54
52
  var _useState = useState(false),
55
53
  _useState2 = _slicedToArray(_useState, 2),
@@ -60,15 +58,17 @@ var FilterFlyout = function FilterFlyout(_ref) {
60
58
  filters: filters,
61
59
  setAllFilters: setAllFilters,
62
60
  variation: FLYOUT,
63
- initialFilters: initialFiltersRef.current
61
+ reactTableFiltersState: reactTableFiltersState,
62
+ onCancel: onCancel
64
63
  }),
65
64
  filtersState = _useFilters.filtersState,
66
65
  prevFiltersObjectArrayRef = _useFilters.prevFiltersObjectArrayRef,
67
66
  prevFiltersRef = _useFilters.prevFiltersRef,
68
- revertToPreviousFilters = _useFilters.revertToPreviousFilters,
67
+ cancel = _useFilters.cancel,
69
68
  reset = _useFilters.reset,
70
69
  renderFilter = _useFilters.renderFilter,
71
- filtersObjectArray = _useFilters.filtersObjectArray;
70
+ filtersObjectArray = _useFilters.filtersObjectArray,
71
+ lastAppliedFilters = _useFilters.lastAppliedFilters;
72
72
 
73
73
  /** Refs */
74
74
  var filterFlyoutRef = useRef(null);
@@ -105,26 +105,10 @@ var FilterFlyout = function FilterFlyout(_ref) {
105
105
  // updates the ref so next time the flyout opens we have records of the previous filters
106
106
  prevFiltersRef.current = JSON.stringify(filtersState);
107
107
  prevFiltersObjectArrayRef.current = JSON.stringify(filtersObjectArray);
108
- };
109
- var cancel = function cancel() {
110
- // Reverting to previous filters only applies when using batch actions
111
- if (updateMethod === BATCH) {
112
- revertToPreviousFilters();
113
- onCancel();
114
- }
115
- closeFlyout();
116
- };
117
108
 
118
- /** Effects */
119
- useClickOutside(filterFlyoutRef, function (target) {
120
- var hasClickedOnDatePicker = target.closest('.flatpickr-calendar');
121
- var hasClickedOnDropdown = target.className === 'bx--list-box__menu-item__option';
122
- if (!open || hasClickedOnDatePicker || hasClickedOnDropdown) {
123
- return;
124
- }
125
- cancel();
126
- });
127
- useSubscribeToEventEmitter(CLEAR_FILTERS, reset);
109
+ // Update the last applied filters
110
+ lastAppliedFilters.current = JSON.stringify(filtersObjectArray);
111
+ };
128
112
 
129
113
  /** Renders all filters */
130
114
  var renderFilters = function renderFilters() {
@@ -151,6 +135,21 @@ var FilterFlyout = function FilterFlyout(_ref) {
151
135
  buttonSize: "md"
152
136
  });
153
137
  };
138
+
139
+ /** Effects */
140
+ useClickOutside(filterFlyoutRef, function (target) {
141
+ var hasClickedOnDatePicker = target.closest('.flatpickr-calendar');
142
+ var hasClickedOnDropdown = target.className === "".concat(carbon.prefix, "--list-box__menu-item__option");
143
+ if (!open || hasClickedOnDatePicker || hasClickedOnDropdown) {
144
+ return;
145
+ }
146
+ closeFlyout();
147
+ cancel();
148
+ });
149
+ useSubscribeToEventEmitter(CLEAR_FILTERS, reset);
150
+ useEffect(function reflectLastAppliedFiltersWhenReactTableUpdates() {
151
+ lastAppliedFilters.current = JSON.stringify(reactTableFiltersState);
152
+ }, [reactTableFiltersState, lastAppliedFilters]);
154
153
  return /*#__PURE__*/React.createElement("div", {
155
154
  className: "".concat(componentClass, "__container")
156
155
  }, /*#__PURE__*/React.createElement(Button, {
@@ -190,14 +189,6 @@ FilterFlyout.propTypes = {
190
189
  * Icon description for the filter flyout button
191
190
  */
192
191
  flyoutIconDescription: PropTypes.string,
193
- /**
194
- * Filters that should be applied on load
195
- */
196
- initialFilters: PropTypes.arrayOf(PropTypes.shape({
197
- id: PropTypes.string.isRequired,
198
- type: PropTypes.string.isRequired,
199
- value: PropTypes.any.isRequired
200
- })),
201
192
  /**
202
193
  * Callback when the apply button is clicked
203
194
  */
@@ -218,6 +209,14 @@ FilterFlyout.propTypes = {
218
209
  * Label text of the primary action in the flyout
219
210
  */
220
211
  primaryActionLabel: PropTypes.string,
212
+ /**
213
+ * Filters from react table's state
214
+ */
215
+ reactTableFiltersState: PropTypes.arrayOf(PropTypes.shape({
216
+ id: PropTypes.string.isRequired,
217
+ type: PropTypes.string.isRequired,
218
+ value: PropTypes.any.isRequired
219
+ })),
221
220
  /**
222
221
  * Label text of the secondary action in the flyout
223
222
  */
@@ -54,11 +54,8 @@ var FilterPanel = function FilterPanel(_ref) {
54
54
  searchLabelText = _ref$searchLabelText === void 0 ? 'Filter search' : _ref$searchLabelText,
55
55
  _ref$searchPlaceholde = _ref.searchPlaceholder,
56
56
  searchPlaceholder = _ref$searchPlaceholde === void 0 ? 'Find filters' : _ref$searchPlaceholde,
57
- _ref$initialFilters = _ref.initialFilters,
58
- initialFilters = _ref$initialFilters === void 0 ? [] : _ref$initialFilters;
59
- // Save the initial filters we only need the filters once
60
- var initialFiltersRef = useRef(initialFilters);
61
-
57
+ _ref$reactTableFilter = _ref.reactTableFiltersState,
58
+ reactTableFiltersState = _ref$reactTableFilter === void 0 ? [] : _ref$reactTableFilter;
62
59
  /** State */
63
60
  var _useState = useState(false),
64
61
  _useState2 = _slicedToArray(_useState, 2),
@@ -69,15 +66,17 @@ var FilterPanel = function FilterPanel(_ref) {
69
66
  filters: filterSections,
70
67
  setAllFilters: setAllFilters,
71
68
  variation: PANEL,
72
- initialFilters: initialFiltersRef.current
69
+ reactTableFiltersState: reactTableFiltersState,
70
+ onCancel: onCancel
73
71
  }),
74
72
  filtersState = _useFilters.filtersState,
75
73
  prevFiltersObjectArrayRef = _useFilters.prevFiltersObjectArrayRef,
76
74
  prevFiltersRef = _useFilters.prevFiltersRef,
77
- revertToPreviousFilters = _useFilters.revertToPreviousFilters,
75
+ cancel = _useFilters.cancel,
78
76
  reset = _useFilters.reset,
79
77
  renderFilter = _useFilters.renderFilter,
80
- filtersObjectArray = _useFilters.filtersObjectArray;
78
+ filtersObjectArray = _useFilters.filtersObjectArray,
79
+ lastAppliedFilters = _useFilters.lastAppliedFilters;
81
80
 
82
81
  /** Refs */
83
82
  var filterPanelRef = useRef();
@@ -107,14 +106,8 @@ var FilterPanel = function FilterPanel(_ref) {
107
106
 
108
107
  /** Methods */
109
108
  var closePanel = function closePanel() {
110
- return setPanelOpen(false);
111
- };
112
- var cancel = function cancel() {
113
- // Reverting to previous filters only applies when using batch actions
114
- if (updateMethod === BATCH) {
115
- revertToPreviousFilters();
116
- onCancel();
117
- }
109
+ cancel();
110
+ setPanelOpen(false);
118
111
  };
119
112
  var apply = function apply() {
120
113
  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, {
@@ -213,14 +209,14 @@ var FilterPanel = function FilterPanel(_ref) {
213
209
  height: getScrollableContainerHeight()
214
210
  },
215
211
  onScroll: onInnerContainerScroll
216
- }, filterSections.map(function (_ref2) {
212
+ }, filterSections.map(function (_ref2, index) {
217
213
  var _ref2$categoryTitle = _ref2.categoryTitle,
218
214
  categoryTitle = _ref2$categoryTitle === void 0 ? null : _ref2$categoryTitle,
219
215
  _ref2$filters = _ref2.filters,
220
216
  filters = _ref2$filters === void 0 ? [] : _ref2$filters,
221
217
  hasAccordion = _ref2.hasAccordion;
222
218
  return /*#__PURE__*/React.createElement("div", {
223
- key: categoryTitle,
219
+ key: index,
224
220
  className: "".concat(componentClass, "__category")
225
221
  }, categoryTitle && /*#__PURE__*/React.createElement("div", {
226
222
  className: "".concat(componentClass, "__category-title")
@@ -241,20 +237,20 @@ FilterPanel.propTypes = {
241
237
  closeIconDescription: PropTypes.string,
242
238
  filterPanelMinHeight: PropTypes.number,
243
239
  filterSections: PropTypes.array,
244
- /**
245
- * Filters that should be applied on load
246
- */
247
- initialFilters: PropTypes.arrayOf(PropTypes.shape({
248
- id: PropTypes.string.isRequired,
249
- type: PropTypes.string.isRequired,
250
- value: PropTypes.any.isRequired
251
- })),
252
240
  onApply: PropTypes.func,
253
241
  onCancel: PropTypes.func,
254
242
  onPanelClose: PropTypes.func,
255
243
  onPanelOpen: PropTypes.func,
256
244
  open: PropTypes.bool,
257
245
  primaryActionLabel: PropTypes.string,
246
+ /**
247
+ * Filters from react table's state
248
+ */
249
+ reactTableFiltersState: PropTypes.arrayOf(PropTypes.shape({
250
+ id: PropTypes.string.isRequired,
251
+ type: PropTypes.string.isRequired,
252
+ value: PropTypes.any.isRequired
253
+ })),
258
254
  searchLabelText: PropTypes.string,
259
255
  searchPlaceholder: PropTypes.string,
260
256
  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 useShouldDisableButtons } from './useShouldDisableButtons';
11
10
  export { default as useFilters } from './useFilters';
@@ -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 } from 'carbon-components-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,10 +157,14 @@ var useFilters = function useFilters(_ref) {
154
157
  var type = _ref3.type,
155
158
  column = _ref3.column,
156
159
  components = _ref3.props;
160
+ var filter;
157
161
  var isPanel = variation === PANEL;
162
+ if (!type) {
163
+ return console.error("type: ".concat(type, "; does not exist as a type of filter."));
164
+ }
158
165
  switch (type) {
159
166
  case DATE:
160
- return /*#__PURE__*/React.createElement(DatePicker, _extends({}, components.DatePicker, {
167
+ filter = /*#__PURE__*/React.createElement(DatePicker, _extends({}, components.DatePicker, {
161
168
  onChange: function onChange(value) {
162
169
  var _components$DatePicke, _components$DatePicke2;
163
170
  setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, _defineProperty({}, column, {
@@ -181,8 +188,9 @@ var useFilters = function useFilters(_ref) {
181
188
  placeholder: "mm/dd/yyyy",
182
189
  labelText: "End date"
183
190
  }, components.DatePickerInput.end)));
191
+ break;
184
192
  case NUMBER:
185
- return /*#__PURE__*/React.createElement(NumberInput, _extends({
193
+ filter = /*#__PURE__*/React.createElement(NumberInput, _extends({
186
194
  step: 1,
187
195
  allowEmpty: true,
188
196
  hideSteppers: true
@@ -203,8 +211,9 @@ var useFilters = function useFilters(_ref) {
203
211
  value: filtersState[column].value,
204
212
  light: isPanel
205
213
  }));
214
+ break;
206
215
  case CHECKBOX:
207
- return /*#__PURE__*/React.createElement(FormGroup, components.FormGroup, filtersState[column].value.map(function (option) {
216
+ filter = /*#__PURE__*/React.createElement(FormGroup, components.FormGroup, filtersState[column].value.map(function (option) {
208
217
  return /*#__PURE__*/React.createElement(Checkbox, _extends({
209
218
  key: option.labelText
210
219
  }, option, {
@@ -229,8 +238,9 @@ var useFilters = function useFilters(_ref) {
229
238
  checked: option.selected
230
239
  }));
231
240
  }));
241
+ break;
232
242
  case RADIO:
233
- return /*#__PURE__*/React.createElement(FormGroup, components.FormGroup, /*#__PURE__*/React.createElement(RadioButtonGroup, _extends({}, components.RadioButtonGroup, {
243
+ filter = /*#__PURE__*/React.createElement(FormGroup, components.FormGroup, /*#__PURE__*/React.createElement(RadioButtonGroup, _extends({}, components.RadioButtonGroup, {
234
244
  valueSelected: ((_filtersState$column = filtersState[column]) === null || _filtersState$column === void 0 ? void 0 : _filtersState$column.value) === '' ? 'Any' : (_filtersState$column2 = filtersState[column]) === null || _filtersState$column2 === void 0 ? void 0 : _filtersState$column2.value,
235
245
  onChange: function onChange(selected) {
236
246
  var _components$RadioButt, _components$RadioButt2;
@@ -255,8 +265,9 @@ var useFilters = function useFilters(_ref) {
255
265
  key: (_ref4 = (_radio$id = radio.id) !== null && _radio$id !== void 0 ? _radio$id : radio.labelText) !== null && _ref4 !== void 0 ? _ref4 : radio.value
256
266
  }, radio));
257
267
  })));
268
+ break;
258
269
  case DROPDOWN:
259
- return /*#__PURE__*/React.createElement(Dropdown, _extends({}, components.Dropdown, {
270
+ filter = /*#__PURE__*/React.createElement(Dropdown, _extends({}, components.Dropdown, {
260
271
  items: ['Any'].concat(_toConsumableArray(components.Dropdown.items)),
261
272
  selectedItem: filtersState[column].value === '' ? 'Any' : filtersState[column].value,
262
273
  onChange: function onChange(_ref5) {
@@ -276,7 +287,27 @@ var useFilters = function useFilters(_ref) {
276
287
  light: isPanel
277
288
  }));
278
289
  }
290
+ return /*#__PURE__*/React.createElement(React.Fragment, {
291
+ key: column
292
+ }, filter);
293
+ };
294
+ var cancel = function cancel() {
295
+ // Reverting to previous filters only applies when using batch actions
296
+ if (updateMethod === BATCH) {
297
+ revertToPreviousFilters();
298
+ onCancel();
299
+ }
279
300
  };
301
+
302
+ /** The purpose of this function is to sync any changes in react-tables state.filters array and reflect
303
+ those new filter changes in the panel/flyout state. The external change is triggered if setAllFilters is called outside of the Datagrid */
304
+ useEffect(function updateStateAndFiltersToReflectExternalFilterChanges() {
305
+ var newFiltersState = getInitialStateFromFilters(filters, variation, reactTableFiltersState);
306
+ setFiltersState(newFiltersState);
307
+ prevFiltersRef.current = JSON.stringify(newFiltersState);
308
+ prevFiltersObjectArrayRef.current = JSON.stringify(reactTableFiltersState);
309
+ setFiltersObjectArray(reactTableFiltersState);
310
+ }, [filters, reactTableFiltersState, variation]);
280
311
  return {
281
312
  filtersState: filtersState,
282
313
  setFiltersState: setFiltersState,
@@ -285,7 +316,9 @@ var useFilters = function useFilters(_ref) {
285
316
  revertToPreviousFilters: revertToPreviousFilters,
286
317
  reset: reset,
287
318
  renderFilter: renderFilter,
288
- filtersObjectArray: filtersObjectArray
319
+ filtersObjectArray: filtersObjectArray,
320
+ lastAppliedFilters: lastAppliedFilters,
321
+ cancel: cancel
289
322
  };
290
323
  };
291
324
  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 () {
@@ -55,7 +55,7 @@ var getPasswordStrength = function getPasswordStrength() {
55
55
  var renderDocLink = function renderDocLink() {
56
56
  var chance = Math.random();
57
57
  var docLinkObj = {
58
- href: chance > 0.66 ? 'http://carbondesignsystem.com/' : chance > 0.33 ? 'https://pages.github.ibm.com/cdai-design/pal/' : 'http://carbon-for-ibm-products.netlify.app/',
58
+ href: chance > 0.66 ? 'https://carbondesignsystem.com/' : chance > 0.33 ? 'https://pages.github.ibm.com/cdai-design/pal/' : 'https://ibm-products.carbondesignsystem.com/',
59
59
  text: chance > 0.66 ? 'Carbon Design System' : chance > 0.33 ? 'Carbon for IBM Products PAL' : 'Carbon for IBM Products storybook'
60
60
  };
61
61
  return docLinkObj;
@@ -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);
@@ -436,9 +436,7 @@ export var SidePanel = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
436
436
  }, title));
437
437
  };
438
438
  var contentRef = ref || sidePanelRef;
439
- useResizeObserver(contentRef, {
440
- callback: handleResize
441
- });
439
+ useResizeObserver(contentRef, handleResize);
442
440
  return /*#__PURE__*/React.createElement(AnimatePresence, null, open && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(motion.div, _extends({}, getDevtoolsProps(componentName), rest, {
443
441
  id: "".concat(blockClass, "-outer"),
444
442
  className: mainPanelClassNames,
@@ -202,12 +202,8 @@ export var TagSet = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
202
202
  var handleModalClose = function handleModalClose() {
203
203
  setShowAllModalOpen(false);
204
204
  };
205
- useResizeObserver(sizingContainerRef, {
206
- callback: handleSizerTagsResize
207
- });
208
- useResizeObserver(tagSetRef, {
209
- callback: handleResize
210
- });
205
+ useResizeObserver(sizingContainerRef, handleSizerTagsResize);
206
+ useResizeObserver(tagSetRef, handleResize);
211
207
  return /*#__PURE__*/React.createElement("div", _extends({}, rest, {
212
208
  className: cx([blockClass, className]),
213
209
  ref: tagSetRef
@@ -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
@@ -66,7 +66,7 @@ export var prepareStory = function prepareStory(template, options) {
66
66
  export var CodesandboxLink = function CodesandboxLink(_ref) {
67
67
  var exampleDirectory = _ref.exampleDirectory;
68
68
  return /*#__PURE__*/React.createElement("a", {
69
- href: "https://codesandbox.io/s/github/carbon-design-system/ibm-cloud-cognitive/tree/main_v1/examples/carbon-for-ibm-products/".concat(exampleDirectory)
69
+ href: "https://codesandbox.io/s/github/carbon-design-system/ibm-products/tree/main_v1/examples/carbon-for-ibm-products/".concat(exampleDirectory)
70
70
  }, /*#__PURE__*/React.createElement("img", {
71
71
  alt: "Edit on CodeSandbox",
72
72
  src: "https://codesandbox.io/static/img/play-codesandbox.svg"
@@ -71,9 +71,7 @@ var AboutModal = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref) {
71
71
  }, [bodyRef]);
72
72
 
73
73
  // Detect resize of the ModalBody to recalculate whether scrolling is enabled
74
- (0, _useResizeObserver.useResizeObserver)(bodyRef, {
75
- callback: handleResize
76
- });
74
+ (0, _useResizeObserver.useResizeObserver)(bodyRef, handleResize);
77
75
  return /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.ComposedModal, (0, _extends2.default)({}, rest, {
78
76
  className: (0, _classnames.default)(blockClass,
79
77
  // Apply the block class to the main HTML element
@@ -181,12 +181,10 @@ var ActionBar = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref) {
181
181
  /* istanbul ignore next */ // not sure how to fake window resize
182
182
  checkFullyVisibleItems();
183
183
  };
184
- (0, _useResizeObserver.useResizeObserver)(sizingRef, {
185
- callback: handleResize
186
- });
187
- (0, _useResizeObserver.useResizeObserver)(localRef, {
188
- callback: handleResize
189
- });
184
+
185
+ // // resize of the items
186
+ (0, _useResizeObserver.useResizeObserver)(sizingRef, handleResize);
187
+ (0, _useResizeObserver.useResizeObserver)(localRef, handleResize);
190
188
  return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({}, rest, {
191
189
  className: (0, _classnames.default)([blockClass, className]),
192
190
  ref: localRef
@@ -240,13 +240,9 @@ var BreadcrumbWithOverflow = function BreadcrumbWithOverflow(_ref) {
240
240
  }
241
241
 
242
242
  // container resize
243
- (0, _useResizeObserver.useResizeObserver)(sizingContainerRef, {
244
- callback: handleResize
245
- });
243
+ (0, _useResizeObserver.useResizeObserver)(sizingContainerRef, handleResize);
246
244
  // item resize
247
- (0, _useResizeObserver.useResizeObserver)(breadcrumbItemWithOverflow, {
248
- callback: handleResize
249
- });
245
+ (0, _useResizeObserver.useResizeObserver)(breadcrumbItemWithOverflow, handleResize);
250
246
  return /*#__PURE__*/_react.default.createElement("div", {
251
247
  className: (0, _classnames.default)(blockClass, className, (0, _defineProperty2.default)({}, "".concat(blockClass, "__with-items"), displayedBreadcrumbItems.length > 1)),
252
248
  ref: breadcrumbItemWithOverflow
@@ -138,15 +138,9 @@ var ButtonSetWithOverflow = function ButtonSetWithOverflow(_ref) {
138
138
  }, (0, _propsHelper.prepareProps)(other, ['iconDescription', 'renderIcon'])));
139
139
  }).reverse());
140
140
  });
141
- (0, _useResizeObserver.useResizeObserver)(sizingContainerRefSet, {
142
- callback: checkFullyVisibleItems
143
- });
144
- (0, _useResizeObserver.useResizeObserver)(sizingContainerRefCombo, {
145
- callback: checkFullyVisibleItems
146
- });
147
- (0, _useResizeObserver.useResizeObserver)(spaceAvailableRef, {
148
- callback: checkFullyVisibleItems
149
- });
141
+ (0, _useResizeObserver.useResizeObserver)(sizingContainerRefSet, checkFullyVisibleItems);
142
+ (0, _useResizeObserver.useResizeObserver)(sizingContainerRefCombo, checkFullyVisibleItems);
143
+ (0, _useResizeObserver.useResizeObserver)(spaceAvailableRef, checkFullyVisibleItems);
150
144
  return /*#__PURE__*/_react.default.createElement("div", {
151
145
  className: (0, _classnames.default)([blockClass, className, (0, _defineProperty2.default)({}, "".concat(blockClass, "--right"), rightAlign)]),
152
146
  ref: spaceAvailableRef
@@ -54,9 +54,7 @@ var DatagridVirtualBody = function DatagridVirtualBody(datagridState) {
54
54
  var gridRefElement = gridRef === null || gridRef === void 0 ? void 0 : gridRef.current;
55
55
  gridRefElement.style.width = gridRefElement === null || gridRefElement === void 0 ? void 0 : gridRefElement.clientWidth;
56
56
  };
57
- (0, _useResizeObserver.useResizeObserver)(gridRef, {
58
- callback: handleVirtualGridResize
59
- });
57
+ (0, _useResizeObserver.useResizeObserver)(gridRef, handleVirtualGridResize);
60
58
  var syncScroll = function syncScroll(e) {
61
59
  var virtualBody = e.target;
62
60
  document.querySelector(".".concat(blockClass, "__head-wrap")).scrollLeft = virtualBody.scrollLeft;