@carbon/ibm-products 1.53.1 → 1.54.2

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 (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;