@carbon/ibm-products 1.53.0 → 1.54.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. package/README.md +15 -15
  2. package/es/components/AboutModal/AboutModal.js +1 -3
  3. package/es/components/ActionBar/ActionBar.js +4 -6
  4. package/es/components/BreadcrumbWithOverflow/BreadcrumbWithOverflow.js +2 -6
  5. package/es/components/ButtonSetWithOverflow/ButtonSetWithOverflow.js +3 -9
  6. package/es/components/Datagrid/Datagrid/DatagridVirtualBody.js +1 -3
  7. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterFlyout.js +35 -36
  8. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterPanel.js +22 -26
  9. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/index.js +0 -1
  10. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/useFilters.js +50 -17
  11. package/es/components/Datagrid/useActionsColumn.js +6 -1
  12. package/es/components/Datagrid/useFiltering.js +1 -1
  13. package/es/components/Datagrid/utils/makeData.js +1 -1
  14. package/es/components/PageHeader/PageHeader.js +2 -6
  15. package/es/components/SidePanel/SidePanel.js +1 -3
  16. package/es/components/TagSet/TagSet.js +2 -6
  17. package/es/global/js/hooks/useResizeObserver.js +14 -28
  18. package/es/global/js/utils/story-helper.js +1 -1
  19. package/lib/components/AboutModal/AboutModal.js +1 -3
  20. package/lib/components/ActionBar/ActionBar.js +4 -6
  21. package/lib/components/BreadcrumbWithOverflow/BreadcrumbWithOverflow.js +2 -6
  22. package/lib/components/ButtonSetWithOverflow/ButtonSetWithOverflow.js +3 -9
  23. package/lib/components/Datagrid/Datagrid/DatagridVirtualBody.js +1 -3
  24. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterFlyout.js +33 -35
  25. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterPanel.js +22 -26
  26. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/index.js +0 -7
  27. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/useFilters.js +48 -15
  28. package/lib/components/Datagrid/useActionsColumn.js +6 -1
  29. package/lib/components/Datagrid/useFiltering.js +1 -1
  30. package/lib/components/Datagrid/utils/makeData.js +1 -1
  31. package/lib/components/PageHeader/PageHeader.js +2 -6
  32. package/lib/components/SidePanel/SidePanel.js +1 -3
  33. package/lib/components/TagSet/TagSet.js +2 -6
  34. package/lib/global/js/hooks/useResizeObserver.js +13 -27
  35. package/lib/global/js/utils/story-helper.js +1 -1
  36. package/package.json +8 -7
  37. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/useInitialStateFromFilters.js +0 -21
  38. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/useInitialStateFromFilters.js +0 -30
package/README.md CHANGED
@@ -9,18 +9,18 @@
9
9
  > name can still be encountered in various places and historical logs.
10
10
 
11
11
  [![All Contributors](https://img.shields.io/badge/all_contributors-10-orange.svg)](#contributors-)
12
- [![Licensed under the Apache License, Version 2.0](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](https://github.com/carbon-design-system/ibm-cloud-cognitive/blob/master/LICENSE)
13
- [![Build status](https://github.com/carbon-design-system/ibm-cloud-cognitive/actions/workflows/ci.yml/badge.svg)](https://github.com/carbon-design-system/ibm-cloud-cognitive/actions/workflows/ci.yml)
12
+ [![Licensed under the Apache License, Version 2.0](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](https://github.com/carbon-design-system/ibm-products/blob/master/LICENSE)
13
+ [![Build status](https://github.com/carbon-design-system/ibm-products/actions/workflows/ci.yml/badge.svg)](https://github.com/carbon-design-system/ibm-products/actions/workflows/ci.yml)
14
14
  [![Netlify status](https://img.shields.io/netlify/f850c678-e8be-43c0-aa95-b2b9cca8ac21)](https://app.netlify.com/sites/carbon-for-ibm-products/deploys)
15
- [![GitHub Lerna version](https://img.shields.io/github/lerna-json/v/carbon-design-system/ibm-cloud-cognitive)](https://lerna.js.org)
16
- [![PRs welcome](https://img.shields.io/badge/PRs-welcome-brightgreen)](https://github.com/carbon-design-system/ibm-cloud-cognitive/blob/master/.github/CONTRIBUTING.md)
15
+ [![GitHub Lerna version](https://img.shields.io/github/lerna-json/v/carbon-design-system/ibm-products)](https://lerna.js.org)
16
+ [![PRs welcome](https://img.shields.io/badge/PRs-welcome-brightgreen)](https://github.com/carbon-design-system/ibm-products/blob/master/.github/CONTRIBUTING.md)
17
17
 
18
18
  > Carbon for IBM Products common UI components
19
19
 
20
20
  ## 🚀 Getting started
21
21
 
22
22
  If you’re just getting started and looking to browse our React components, take
23
- a look at [our Storybook](https://carbon-for-ibm-products.netlify.app).
23
+ a look at [our Storybook](https://ibm-products.carbondesignsystem.com).
24
24
 
25
25
  ### 📦 Installing Carbon for IBM Products
26
26
 
@@ -44,7 +44,7 @@ import '@carbon/ibm-products/css/index.min.css';
44
44
  ### Webpack 4
45
45
 
46
46
  Our package requires support for ES modules (see
47
- [#2378](https://github.com/carbon-design-system/ibm-cloud-cognitive/issues/2378#issuecomment-1319276192)).
47
+ [#2378](https://github.com/carbon-design-system/ibm-products/issues/2378#issuecomment-1319276192)).
48
48
  In Webpack 5, these are supported by default. In Webpack 4, you will need to add
49
49
  the [following rule](https://stackoverflow.com/a/72149467) to your config.
50
50
 
@@ -74,7 +74,7 @@ dependencies which need to be installed.
74
74
 
75
75
  **Note:** `@carbon/elements` rolls up a number of Carbon packages that could be
76
76
  installed independently. As this list of dependencies could change, we leave you
77
- to view `package.json` in ibm-cloud-cognitive if you wish to install individual
77
+ to view `package.json` in ibm-products if you wish to install individual
78
78
  packages.
79
79
 
80
80
  ## Examples
@@ -83,7 +83,7 @@ packages.
83
83
 
84
84
  Examples for each released component, and some that are still not quite ready,
85
85
  can be found here on
86
- [CodeSandbox](https://codesandbox.io/examples/package/@carbon/ibm-cloud-cognitive).
86
+ [CodeSandbox](https://codesandbox.io/examples/package/@carbon/ibm-products).
87
87
 
88
88
  ### Packages
89
89
 
@@ -170,7 +170,7 @@ So, do not be shy. We both depend on and appreciate contributors, new and old,
170
170
  who help us fix bugs, build new features, improve our documentation, etc.
171
171
 
172
172
  If you’re interested, definitely check out our
173
- [Contributing Guide](https://github.com/carbon-design-system/ibm-cloud-cognitive/blob/master/.github/CONTRIBUTING.md)
173
+ [Contributing Guide](https://github.com/carbon-design-system/ibm-products/blob/master/.github/CONTRIBUTING.md)
174
174
  and
175
175
  [Carbon’s Developer Handbook](https://github.com/carbon-design-system/carbon/blob/master/docs/developer-handbook.md)!
176
176
  👀
@@ -180,13 +180,13 @@ and
180
180
  <!-- markdownlint-disable -->
181
181
  <table>
182
182
  <tr>
183
- <td align="center"><a href="https://github.com/lee-chase"><img src="https://avatars0.githubusercontent.com/u/15086604?v=4" width="100px;" alt=""/><br /><sub><b>Lee Chase</b></sub></a><br /><a href="https://github.com/carbon-design-system/ibm-cloud-cognitive/commits?author=lee-chase" title="Code">💻</a></td>
184
- <td align="center"><a href="http://davidmenendez.net"><img src="https://avatars1.githubusercontent.com/u/6370760?v=4" width="100px;" alt=""/><br /><sub><b>David Menendez</b></sub></a><br /><a href="https://github.com/carbon-design-system/ibm-cloud-cognitive/commits?author=davidmenendez" title="Code">💻</a></td>
185
- <td align="center"><a href="http://www.matthewdgallo.com"><img src="https://avatars0.githubusercontent.com/u/10215203?v=4" width="100px;" alt=""/><br /><sub><b>Matthew Gallo</b></sub></a><br /><a href="https://github.com/carbon-design-system/ibm-cloud-cognitive/commits?author=matthewgallo" title="Code">💻</a></td>
183
+ <td align="center"><a href="https://github.com/lee-chase"><img src="https://avatars0.githubusercontent.com/u/15086604?v=4" width="100px;" alt=""/><br /><sub><b>Lee Chase</b></sub></a><br /><a href="https://github.com/carbon-design-system/ibm-products/commits?author=lee-chase" title="Code">💻</a></td>
184
+ <td align="center"><a href="http://davidmenendez.net"><img src="https://avatars1.githubusercontent.com/u/6370760?v=4" width="100px;" alt=""/><br /><sub><b>David Menendez</b></sub></a><br /><a href="https://github.com/carbon-design-system/ibm-products/commits?author=davidmenendez" title="Code">💻</a></td>
185
+ <td align="center"><a href="http://www.matthewdgallo.com"><img src="https://avatars0.githubusercontent.com/u/10215203?v=4" width="100px;" alt=""/><br /><sub><b>Matthew Gallo</b></sub></a><br /><a href="https://github.com/carbon-design-system/ibm-products/commits?author=matthewgallo" title="Code">💻</a></td>
186
186
  </tr>
187
187
  <tr>
188
- <td align="center"><a href="http://simonfinney.dev"><img src="https://avatars2.githubusercontent.com/u/3846874?v=4" width="100px;" alt=""/><br /><sub><b>Simon Finney</b></sub></a><br /><a href="https://github.com/carbon-design-system/ibm-cloud-cognitive/commits?author=SimonFinney" title="Code">💻</a></td>
189
- <td align="center"><a href="https://github.com/polinaouk"><img src="https://avatars2.githubusercontent.com/u/24444328?v=4" width="100px;" alt=""/><br /><sub><b>Polina Olemskaia</b></sub></a><br /><a href="https://github.com/carbon-design-system/ibm-cloud-cognitive/commits?author=polinaouk" title="Code">💻</a></td>
188
+ <td align="center"><a href="http://simonfinney.dev"><img src="https://avatars2.githubusercontent.com/u/3846874?v=4" width="100px;" alt=""/><br /><sub><b>Simon Finney</b></sub></a><br /><a href="https://github.com/carbon-design-system/ibm-products/commits?author=SimonFinney" title="Code">💻</a></td>
189
+ <td align="center"><a href="https://github.com/polinaouk"><img src="https://avatars2.githubusercontent.com/u/24444328?v=4" width="100px;" alt=""/><br /><sub><b>Polina Olemskaia</b></sub></a><br /><a href="https://github.com/carbon-design-system/ibm-products/commits?author=polinaouk" title="Code">💻</a></td>
190
190
  </tr>
191
191
  </table>
192
192
 
@@ -203,6 +203,6 @@ In order to gather usage information for these components we use
203
203
  ## 📝 License
204
204
 
205
205
  Licensed under the
206
- [Apache-2.0 License](https://github.com/carbon-design-system/ibm-cloud-cognitive/blob/master/LICENSE).
206
+ [Apache-2.0 License](https://github.com/carbon-design-system/ibm-products/blob/master/LICENSE).
207
207
 
208
208
  [![This site is powered by Netlify](https://www.netlify.com/img/global/badges/netlify-color-accent.svg)](https://www.netlify.com)
@@ -74,9 +74,7 @@ export var AboutModal = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
74
74
  }, [bodyRef]);
75
75
 
76
76
  // Detect resize of the ModalBody to recalculate whether scrolling is enabled
77
- useResizeObserver(bodyRef, {
78
- callback: handleResize
79
- });
77
+ useResizeObserver(bodyRef, handleResize);
80
78
  return /*#__PURE__*/React.createElement(ComposedModal, _extends({}, rest, {
81
79
  className: cx(blockClass,
82
80
  // Apply the block class to the main HTML element
@@ -184,12 +184,10 @@ export var ActionBar = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
184
184
  /* istanbul ignore next */ // not sure how to fake window resize
185
185
  checkFullyVisibleItems();
186
186
  };
187
- useResizeObserver(sizingRef, {
188
- callback: handleResize
189
- });
190
- useResizeObserver(localRef, {
191
- callback: handleResize
192
- });
187
+
188
+ // // resize of the items
189
+ useResizeObserver(sizingRef, handleResize);
190
+ useResizeObserver(localRef, handleResize);
193
191
  return /*#__PURE__*/React.createElement("div", _extends({}, rest, {
194
192
  className: cx([blockClass, className]),
195
193
  ref: localRef
@@ -245,13 +245,9 @@ export var BreadcrumbWithOverflow = function BreadcrumbWithOverflow(_ref) {
245
245
  }
246
246
 
247
247
  // container resize
248
- useResizeObserver(sizingContainerRef, {
249
- callback: handleResize
250
- });
248
+ useResizeObserver(sizingContainerRef, handleResize);
251
249
  // item resize
252
- useResizeObserver(breadcrumbItemWithOverflow, {
253
- callback: handleResize
254
- });
250
+ useResizeObserver(breadcrumbItemWithOverflow, handleResize);
255
251
  return /*#__PURE__*/React.createElement("div", {
256
252
  className: cx(blockClass, className, _defineProperty({}, "".concat(blockClass, "__with-items"), displayedBreadcrumbItems.length > 1)),
257
253
  ref: breadcrumbItemWithOverflow
@@ -135,15 +135,9 @@ export var ButtonSetWithOverflow = function ButtonSetWithOverflow(_ref) {
135
135
  }, prepareProps(other, ['iconDescription', 'renderIcon'])));
136
136
  }).reverse());
137
137
  });
138
- useResizeObserver(sizingContainerRefSet, {
139
- callback: checkFullyVisibleItems
140
- });
141
- useResizeObserver(sizingContainerRefCombo, {
142
- callback: checkFullyVisibleItems
143
- });
144
- useResizeObserver(spaceAvailableRef, {
145
- callback: checkFullyVisibleItems
146
- });
138
+ useResizeObserver(sizingContainerRefSet, checkFullyVisibleItems);
139
+ useResizeObserver(sizingContainerRefCombo, checkFullyVisibleItems);
140
+ useResizeObserver(spaceAvailableRef, checkFullyVisibleItems);
147
141
  return /*#__PURE__*/React.createElement("div", {
148
142
  className: cx([blockClass, className, _defineProperty({}, "".concat(blockClass, "--right"), rightAlign)]),
149
143
  ref: spaceAvailableRef
@@ -51,9 +51,7 @@ var DatagridVirtualBody = function DatagridVirtualBody(datagridState) {
51
51
  var gridRefElement = gridRef === null || gridRef === void 0 ? void 0 : gridRef.current;
52
52
  gridRefElement.style.width = gridRefElement === null || gridRefElement === void 0 ? void 0 : gridRefElement.clientWidth;
53
53
  };
54
- useResizeObserver(gridRef, {
55
- callback: handleVirtualGridResize
56
- });
54
+ useResizeObserver(gridRef, handleVirtualGridResize);
57
55
  var syncScroll = function syncScroll(e) {
58
56
  var virtualBody = e.target;
59
57
  document.querySelector(".".concat(blockClass, "__head-wrap")).scrollLeft = virtualBody.scrollLeft;
@@ -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;
@@ -1,7 +1,7 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
3
  import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
4
- var _excluded = ["id", "itemText", "onClick", "icon"],
4
+ var _excluded = ["id", "itemText", "onClick", "icon", "shouldHideMenuItem"],
5
5
  _excluded2 = ["id", "onClick", "shouldHideMenuItem", "shouldDisableMenuItem", "disabled"];
6
6
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
7
7
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -47,7 +47,12 @@ var useActionsColumn = function useActionsColumn(hooks) {
47
47
  itemText = action.itemText,
48
48
  _onClick = action.onClick,
49
49
  icon = action.icon,
50
+ shouldHideMenuItem = action.shouldHideMenuItem,
50
51
  rest = _objectWithoutProperties(action, _excluded);
52
+ var hidden = typeof shouldHideMenuItem === 'function' && shouldHideMenuItem(row);
53
+ if (hidden) {
54
+ return null;
55
+ }
51
56
  var selectedRowId = selectedFlatRows === null || selectedFlatRows === void 0 ? void 0 : selectedFlatRows.filter(function (item) {
52
57
  return item.id === row.id ? item.id : null;
53
58
  });
@@ -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), {}, {
@@ -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,