@carbon/ibm-products 1.70.0 → 1.72.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. package/README.md +8 -4
  2. package/css/index-full-carbon.css +1 -8
  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-released-only.css +1 -8
  7. package/css/index-without-carbon-released-only.css.map +1 -1
  8. package/css/index-without-carbon-released-only.min.css +1 -1
  9. package/css/index-without-carbon-released-only.min.css.map +1 -1
  10. package/css/index-without-carbon.css +1 -8
  11. package/css/index-without-carbon.css.map +1 -1
  12. package/css/index-without-carbon.min.css +1 -1
  13. package/css/index-without-carbon.min.css.map +1 -1
  14. package/css/index.css +1 -8
  15. package/css/index.css.map +1 -1
  16. package/css/index.min.css +1 -1
  17. package/css/index.min.css.map +1 -1
  18. package/es/components/CoachmarkStack/CoachmarkStack.js +11 -11
  19. package/es/components/CreateTearsheet/preview-components/MultiStepWithIntro.js +6 -3
  20. package/es/components/Datagrid/Datagrid/Datagrid.js +10 -3
  21. package/es/components/Datagrid/Datagrid/DatagridContent.js +6 -2
  22. package/es/components/Datagrid/Datagrid/DatagridEmptyBody.js +1 -1
  23. package/es/components/Datagrid/Datagrid/DatagridHeaderRow.js +10 -3
  24. package/es/components/Datagrid/Datagrid/DatagridRefBody.js +1 -1
  25. package/es/components/Datagrid/Datagrid/DatagridRow.js +2 -2
  26. package/es/components/Datagrid/Datagrid/DatagridSelectAll.js +5 -3
  27. package/es/components/Datagrid/Datagrid/DatagridSimpleBody.js +1 -1
  28. package/es/components/Datagrid/Datagrid/DatagridToolbar.js +26 -7
  29. package/es/components/Datagrid/Datagrid/DatagridVirtualBody.js +1 -1
  30. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterFlyout.js +4 -0
  31. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterPanel.js +0 -1
  32. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterProvider.js +41 -17
  33. package/es/components/Datagrid/Datagrid/addons/Filtering/constants.js +7 -2
  34. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/useFilterContext.js +7 -0
  35. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/useFilters.js +103 -5
  36. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/useShouldDisableButtons.js +1 -0
  37. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/useSubscribeToEventEmitter.js +1 -0
  38. package/es/components/Datagrid/Datagrid/addons/Filtering/index.js +1 -0
  39. package/es/components/Datagrid/Datagrid/addons/Filtering/utils.js +12 -1
  40. package/es/components/Datagrid/Datagrid/addons/stateReducer.js +4 -7
  41. package/es/components/Datagrid/useDisableSelectRows.js +1 -1
  42. package/es/components/Datagrid/useFiltering.js +49 -52
  43. package/es/components/Datagrid/useInfiniteScroll.js +7 -3
  44. package/es/components/Datagrid/useInitialColumnSort.js +39 -0
  45. package/es/components/Datagrid/useSelectAllToggle.js +11 -10
  46. package/es/components/Datagrid/useSelectRows.js +4 -4
  47. package/es/components/Datagrid/useSortableColumns.js +16 -16
  48. package/es/components/Tearsheet/TearsheetShell.js +6 -4
  49. package/es/global/js/hooks/index.js +3 -2
  50. package/es/global/js/hooks/useFocus.js +72 -0
  51. package/es/global/js/hooks/useIsomorphicEffect.js +12 -0
  52. package/es/global/js/package-settings.js +0 -1
  53. package/lib/components/CoachmarkStack/CoachmarkStack.js +11 -11
  54. package/lib/components/CreateTearsheet/preview-components/MultiStepWithIntro.js +6 -3
  55. package/lib/components/Datagrid/Datagrid/Datagrid.js +10 -3
  56. package/lib/components/Datagrid/Datagrid/DatagridContent.js +6 -2
  57. package/lib/components/Datagrid/Datagrid/DatagridEmptyBody.js +1 -1
  58. package/lib/components/Datagrid/Datagrid/DatagridHeaderRow.js +10 -3
  59. package/lib/components/Datagrid/Datagrid/DatagridRefBody.js +1 -1
  60. package/lib/components/Datagrid/Datagrid/DatagridRow.js +2 -2
  61. package/lib/components/Datagrid/Datagrid/DatagridSelectAll.js +4 -2
  62. package/lib/components/Datagrid/Datagrid/DatagridSimpleBody.js +1 -1
  63. package/lib/components/Datagrid/Datagrid/DatagridToolbar.js +26 -14
  64. package/lib/components/Datagrid/Datagrid/DatagridVirtualBody.js +1 -1
  65. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterFlyout.js +4 -0
  66. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterPanel.js +0 -1
  67. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterProvider.js +37 -14
  68. package/lib/components/Datagrid/Datagrid/addons/Filtering/constants.js +11 -4
  69. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/useFilterContext.js +7 -0
  70. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/useFilters.js +99 -2
  71. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/useShouldDisableButtons.js +1 -0
  72. package/lib/components/Datagrid/Datagrid/addons/Filtering/utils.js +11 -0
  73. package/lib/components/Datagrid/Datagrid/addons/stateReducer.js +4 -7
  74. package/lib/components/Datagrid/useDisableSelectRows.js +1 -1
  75. package/lib/components/Datagrid/useFiltering.js +47 -50
  76. package/lib/components/Datagrid/useInfiniteScroll.js +7 -3
  77. package/lib/components/Datagrid/useInitialColumnSort.js +47 -0
  78. package/lib/components/Datagrid/useSelectAllToggle.js +9 -9
  79. package/lib/components/Datagrid/useSelectRows.js +3 -3
  80. package/lib/components/Datagrid/useSortableColumns.js +18 -17
  81. package/lib/components/Tearsheet/TearsheetShell.js +6 -4
  82. package/lib/global/js/hooks/index.js +8 -1
  83. package/lib/global/js/hooks/useFocus.js +79 -0
  84. package/lib/global/js/hooks/useIsomorphicEffect.js +18 -0
  85. package/lib/global/js/package-settings.js +0 -1
  86. package/package.json +9 -8
  87. package/scss/components/Datagrid/styles/addons/_FilterPanel.scss +7 -8
  88. package/telemetry.yml +816 -0
@@ -16,11 +16,12 @@ var _pconsole = _interopRequireDefault(require("../../../global/js/utils/pconsol
16
16
  var _InlineEditContext = require("./addons/InlineEdit/InlineEditContext");
17
17
  var _DatagridContent = require("./DatagridContent");
18
18
  var _FilterProvider = require("./addons/Filtering/FilterProvider");
19
- var _excluded = ["datagridState", "title"];
19
+ var _excluded = ["ariaToolbarLabel", "datagridState", "title"];
20
20
  var blockClass = "".concat(_settings.pkg.prefix, "--datagrid");
21
21
  var componentName = 'Datagrid';
22
22
  var Datagrid = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref) {
23
- var datagridState = _ref.datagridState,
23
+ var ariaToolbarLabel = _ref.ariaToolbarLabel,
24
+ datagridState = _ref.datagridState,
24
25
  title = _ref.title,
25
26
  rest = (0, _objectWithoutProperties2.default)(_ref, _excluded);
26
27
  if (!datagridState) {
@@ -37,7 +38,8 @@ var Datagrid = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref) {
37
38
  var rows = DatagridPagination && datagridState.page || datagridState.rows;
38
39
  var props = {
39
40
  title: title,
40
- datagridState: datagridState
41
+ datagridState: datagridState,
42
+ ariaToolbarLabel: ariaToolbarLabel
41
43
  };
42
44
  return /*#__PURE__*/_react.default.createElement(_FilterProvider.FilterProvider, {
43
45
  filters: filters,
@@ -59,6 +61,11 @@ exports.Datagrid = Datagrid = _settings.pkg.checkComponentEnabled(Datagrid, comp
59
61
  // is used in preference to relying on function.name.
60
62
  Datagrid.displayName = componentName;
61
63
  Datagrid.propTypes = {
64
+ /**
65
+ * Specify a label to be read by screen readers on the container node
66
+ * 'aria-label' of the TableToolbar component.
67
+ */
68
+ ariaToolbarLabel: _propTypes.default.string,
62
69
  /**
63
70
  * The data grid state, much of it being supplied by the useDatagrid hook
64
71
  */
@@ -42,7 +42,8 @@ var TableContainer = _carbonComponentsReact.DataTable.TableContainer,
42
42
  var blockClass = "".concat(_settings.pkg.prefix, "--datagrid");
43
43
  var DatagridContent = function DatagridContent(_ref) {
44
44
  var _cx5;
45
- var datagridState = _ref.datagridState,
45
+ var ariaToolbarLabel = _ref.ariaToolbarLabel,
46
+ datagridState = _ref.datagridState,
46
47
  title = _ref.title;
47
48
  var _useContext = (0, _react.useContext)(_InlineEditContext.InlineEditContext),
48
49
  inlineEditState = _useContext.state,
@@ -164,7 +165,9 @@ var DatagridContent = function DatagridContent(_ref) {
164
165
  className: (0, _classnames.default)("".concat(blockClass, "__grid-container"), withVirtualScroll || fullHeightDatagrid ? "".concat(blockClass, "__full-height") : '', DatagridPagination ? "".concat(blockClass, "__with-pagination") : '', useDenseHeader ? "".concat(blockClass, "__dense-header") : '', (_cx5 = {}, (0, _defineProperty2.default)(_cx5, "".concat(blockClass, "__grid-container-grid-active"), gridActive), (0, _defineProperty2.default)(_cx5, "".concat(blockClass, "__grid-container-inline-edit"), withInlineEdit), (0, _defineProperty2.default)(_cx5, "".concat(blockClass, "__grid-container-grid-active--without-toolbar"), withInlineEdit && !DatagridActions), _cx5)),
165
166
  title: gridTitle,
166
167
  description: gridDescription
167
- }, /*#__PURE__*/_react.default.createElement(_DatagridToolbar.default, datagridState), /*#__PURE__*/_react.default.createElement("div", {
168
+ }, /*#__PURE__*/_react.default.createElement(_DatagridToolbar.default, (0, _extends2.default)({}, datagridState, {
169
+ ariaToolbarLabel: ariaToolbarLabel
170
+ })), /*#__PURE__*/_react.default.createElement("div", {
168
171
  className: (0, _classnames.default)("".concat(blockClass, "__table-container"), (0, _defineProperty2.default)({}, "".concat(blockClass, "__table-container--filter-open"), panelOpen)),
169
172
  ref: gridAreaRef
170
173
  }, (filterProps === null || filterProps === void 0 ? void 0 : filterProps.variation) === 'panel' && /*#__PURE__*/_react.default.createElement(_FilterPanel.default, (0, _extends2.default)({}, getFilterFlyoutProps(), {
@@ -184,6 +187,7 @@ var DatagridContent = function DatagridContent(_ref) {
184
187
  };
185
188
  exports.DatagridContent = DatagridContent;
186
189
  DatagridContent.propTypes = {
190
+ ariaToolbarLabel: _propTypes.default.string,
187
191
  datagridState: _propTypes.default.shape({
188
192
  getTableProps: _propTypes.default.func,
189
193
  getFilterFlyoutProps: _propTypes.default.func,
@@ -42,7 +42,7 @@ var DatagridEmptyBody = function DatagridEmptyBody(datagridState) {
42
42
  };
43
43
  var validEmptyStates = ['error', 'noData', 'notFound'];
44
44
  return /*#__PURE__*/_react.default.createElement(TableBody, (0, _extends2.default)({}, getTableBodyProps({
45
- role: false
45
+ role: undefined
46
46
  }), {
47
47
  className: "".concat(blockClass, "__empty-state-body")
48
48
  }), /*#__PURE__*/_react.default.createElement(TableRow, null, /*#__PURE__*/_react.default.createElement(TableCell, {
@@ -17,6 +17,7 @@ var _commonColumnIds = require("../common-column-ids");
17
17
  var _settings = require("../../../settings");
18
18
  var _stateReducer = require("./addons/stateReducer");
19
19
  var _getNodeTextContent = require("../../../global/js/utils/getNodeTextContent");
20
+ var _useInitialColumnSort = require("../useInitialColumnSort");
20
21
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
21
22
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
22
23
  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; }
@@ -33,7 +34,9 @@ var getAccessibilityProps = function getAccessibilityProps(header) {
33
34
  return props;
34
35
  };
35
36
  var HeaderRow = function HeaderRow(datagridState, headRef, headerGroup) {
36
- var resizerAriaLabel = datagridState.resizerAriaLabel;
37
+ var resizerAriaLabel = datagridState.resizerAriaLabel,
38
+ isFetching = datagridState.isFetching;
39
+ (0, _useInitialColumnSort.useInitialColumnSort)(datagridState);
37
40
  // Used to measure the height of the table and uses that value
38
41
  // to display a vertical line to indicate the column you are resizing
39
42
  (0, _react.useEffect)(function () {
@@ -74,7 +77,7 @@ var HeaderRow = function HeaderRow(datagridState, headRef, headerGroup) {
74
77
  onMouseDown === null || onMouseDown === void 0 ? void 0 : onMouseDown(event);
75
78
  };
76
79
  return /*#__PURE__*/_react.default.createElement(TableRow, (0, _extends2.default)({}, headerGroup.getHeaderGroupProps({
77
- role: false
80
+ role: undefined
78
81
  }), {
79
82
  className: (0, _classnames.default)("".concat(blockClass, "__head"), headerGroup.getHeaderGroupProps().className),
80
83
  ref: headRef
@@ -100,15 +103,19 @@ var HeaderRow = function HeaderRow(datagridState, headRef, headerGroup) {
100
103
  columnWidths = _ref4.columnWidths;
101
104
  var originalCol = visibleColumns[index];
102
105
  return /*#__PURE__*/_react.default.createElement(TableHeader, (0, _extends2.default)({}, header.getHeaderProps({
103
- role: false
106
+ role: undefined
104
107
  }), {
105
108
  className: (0, _classnames.default)((_cx = {}, (0, _defineProperty2.default)(_cx, "".concat(blockClass, "__resizableColumn"), header.getResizerProps), (0, _defineProperty2.default)(_cx, "".concat(blockClass, "__isResizing"), header.isResizing), (0, _defineProperty2.default)(_cx, "".concat(blockClass, "__sortableColumn"), datagridState.isTableSortable && header.id !== 'spacer'), (0, _defineProperty2.default)(_cx, "".concat(blockClass, "__isSorted"), header.isSorted), (0, _defineProperty2.default)(_cx, "".concat(blockClass, "__header-actions-column"), header.isAction), _cx), header.getHeaderProps().className),
106
109
  key: header.id,
107
110
  "aria-hidden": header.id === 'spacer' && 'true'
108
111
  }, getAccessibilityProps(header)), header.render('Header'), header.getResizerProps && !header.isAction && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("input", (0, _extends2.default)({}, header.getResizerProps(), {
112
+ disabled: isFetching,
109
113
  onMouseDown: function onMouseDown(event) {
110
114
  return handleOnMouseDownResize(event, header.getResizerProps);
111
115
  },
116
+ onMouseUp: function onMouseUp() {
117
+ return (0, _stateReducer.handleColumnResizeEndEvent)(dispatch, onColResizeEnd, header.id, true);
118
+ },
112
119
  onKeyDown: function onKeyDown(event) {
113
120
  var key = event.key;
114
121
  if (key === 'ArrowLeft' || key === 'ArrowRight') {
@@ -23,7 +23,7 @@ var DatagridRefBody = function DatagridRefBody(datagridState) {
23
23
  rows = datagridState.rows,
24
24
  prepareRow = datagridState.prepareRow;
25
25
  return /*#__PURE__*/_react.default.createElement("tbody", (0, _extends2.default)({}, getTableBodyProps({
26
- role: false
26
+ role: undefined
27
27
  }), {
28
28
  className: (0, _classnames.default)("".concat(blockClass, "__simple-body"), getTableBodyProps().className)
29
29
  }), rows.map(function (row) {
@@ -113,7 +113,7 @@ var DatagridRow = function DatagridRow(datagridState) {
113
113
  }, /*#__PURE__*/_react.default.createElement(TableRow, (0, _extends2.default)({
114
114
  className: rowClassNames
115
115
  }, row.getRowProps({
116
- role: false
116
+ role: undefined
117
117
  }), {
118
118
  key: row.id,
119
119
  onMouseEnter: hoverHandler,
@@ -124,7 +124,7 @@ var DatagridRow = function DatagridRow(datagridState) {
124
124
  }, setAdditionalRowProps()), row.cells.map(function (cell, index) {
125
125
  var _cell$column;
126
126
  var cellProps = cell.getCellProps({
127
- role: false
127
+ role: undefined
128
128
  });
129
129
  var children = cellProps.children,
130
130
  restProps = (0, _objectWithoutProperties2.default)(cellProps, _excluded);
@@ -21,7 +21,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
21
21
  var blockClass = "".concat(_settings.pkg.prefix, "--datagrid");
22
22
  var SelectAll = function SelectAll(datagridState) {
23
23
  var _columns$;
24
- var _useState = (0, _react.useState)(window.innerWidth),
24
+ var _useState = (0, _react.useState)(typeof window !== 'undefined' ? window.innerWidth : ''),
25
25
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
26
26
  windowSize = _useState2[0],
27
27
  setWindowSize = _useState2[1];
@@ -30,7 +30,9 @@ var SelectAll = function SelectAll(datagridState) {
30
30
  function updateSize() {
31
31
  setWindowSize(window.innerWidth);
32
32
  }
33
- window.addEventListener('resize', updateSize);
33
+ if (typeof window !== 'undefined') {
34
+ window.addEventListener('resize', updateSize);
35
+ }
34
36
  return function () {
35
37
  return window.removeEventListener('resize', updateSize);
36
38
  };
@@ -20,7 +20,7 @@ var DatagridSimpleBody = function DatagridSimpleBody(datagridState) {
20
20
  rows = datagridState.rows,
21
21
  prepareRow = datagridState.prepareRow;
22
22
  return /*#__PURE__*/_react.default.createElement(TableBody, (0, _extends2.default)({}, getTableBodyProps({
23
- role: false
23
+ role: undefined
24
24
  }), {
25
25
  className: (0, _classnames.default)("".concat(blockClass, "__simple-body"), getTableBodyProps().className)
26
26
  }), rows.map(function (row) {
@@ -6,9 +6,11 @@ Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports.default = void 0;
9
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
9
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
11
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
12
  var _react = _interopRequireWildcard(require("react"));
13
+ var _propTypes = _interopRequireDefault(require("prop-types"));
12
14
  var _iconsReact = require("@carbon/icons-react");
13
15
  var _carbonComponentsReact = require("carbon-components-react");
14
16
  var _useResizeObserver2 = require("../../../global/js/hooks/useResizeObserver");
@@ -16,15 +18,9 @@ var _ButtonMenu = require("../../ButtonMenu");
16
18
  var _settings = require("../../../settings");
17
19
  var _classnames = _interopRequireDefault(require("classnames"));
18
20
  var _stateReducer = require("./addons/stateReducer");
21
+ var _excluded = ["ariaToolbarLabel"];
19
22
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
20
23
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
21
- /**
22
- * Copyright IBM Corp. 2022, 2023
23
- *
24
- * This source code is licensed under the Apache-2.0 license found in the
25
- * LICENSE file in the root directory of this source tree.
26
- */
27
-
28
24
  var blockClass = "".concat(_settings.pkg.prefix, "--datagrid");
29
25
  var toolbarClass = "".concat(blockClass, "__table-toolbar");
30
26
  var menuClass = "".concat(blockClass, "__button-menu");
@@ -109,6 +105,16 @@ var DatagridBatchActionsToolbar = function DatagridBatchActionsToolbar(datagridS
109
105
  }
110
106
  }));
111
107
  };
108
+ var onCancelHandler = function onCancelHandler() {
109
+ (0, _stateReducer.handleSelectAllRowData)({
110
+ dispatch: dispatch,
111
+ rows: [],
112
+ getRowId: getRowId,
113
+ isChecked: false
114
+ });
115
+ toggleAllRowsSelected(false);
116
+ setGlobalFilter(null);
117
+ };
112
118
 
113
119
  // Only display the first two batch actions, the rest are
114
120
  // displayed inside of the ButtonMenu if there are more than
@@ -116,10 +122,7 @@ var DatagridBatchActionsToolbar = function DatagridBatchActionsToolbar(datagridS
116
122
  return /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.TableBatchActions, {
117
123
  shouldShowBatchActions: totalSelected > 0,
118
124
  totalSelected: totalSelected,
119
- onCancel: function onCancel() {
120
- toggleAllRowsSelected(false);
121
- setGlobalFilter(null);
122
- },
125
+ onCancel: onCancelHandler,
123
126
  translateWithId: translateWithIdBatchActions
124
127
  }, !displayAllInMenu && toolbarBatchActions && (toolbarBatchActions === null || toolbarBatchActions === void 0 ? void 0 : toolbarBatchActions.map(function (batchAction, index) {
125
128
  if (index < 2 && toolbarBatchActions.length > 3 || index < 3 && toolbarBatchActions.length <= 3) {
@@ -142,7 +145,9 @@ var DatagridBatchActionsToolbar = function DatagridBatchActionsToolbar(datagridS
142
145
  }
143
146
  })), renderBatchActionOverflow());
144
147
  };
145
- var DatagridToolbar = function DatagridToolbar(datagridState) {
148
+ var DatagridToolbar = function DatagridToolbar(_ref2) {
149
+ var ariaToolbarLabel = _ref2.ariaToolbarLabel,
150
+ datagridState = (0, _objectWithoutProperties2.default)(_ref2, _excluded);
146
151
  var ref = (0, _react.useRef)(null);
147
152
  var _useResizeObserver = (0, _useResizeObserver2.useResizeObserver)(ref),
148
153
  width = _useResizeObserver.width;
@@ -154,9 +159,16 @@ var DatagridToolbar = function DatagridToolbar(datagridState) {
154
159
  return batchActions && DatagridActions ? /*#__PURE__*/_react.default.createElement("div", {
155
160
  ref: ref,
156
161
  className: (0, _classnames.default)([toolbarClass, "".concat(toolbarClass, "--").concat(getRowHeight)])
157
- }, /*#__PURE__*/_react.default.createElement(TableToolbar, null, DatagridActions && /*#__PURE__*/_react.default.createElement(DatagridActions, datagridState), DatagridBatchActionsToolbar && DatagridBatchActionsToolbar(datagridState, width, ref))) : DatagridActions ? /*#__PURE__*/_react.default.createElement("div", {
162
+ }, /*#__PURE__*/_react.default.createElement(TableToolbar, {
163
+ "aria-label": ariaToolbarLabel
164
+ }, DatagridActions && /*#__PURE__*/_react.default.createElement(DatagridActions, datagridState), DatagridBatchActionsToolbar && DatagridBatchActionsToolbar(datagridState, width, ref))) : DatagridActions ? /*#__PURE__*/_react.default.createElement("div", {
158
165
  className: toolbarClass
159
- }, /*#__PURE__*/_react.default.createElement(TableToolbar, null, DatagridActions && /*#__PURE__*/_react.default.createElement(DatagridActions, datagridState), DatagridBatchActions && DatagridBatchActions(datagridState))) : null;
166
+ }, /*#__PURE__*/_react.default.createElement(TableToolbar, {
167
+ "aria-label": ariaToolbarLabel
168
+ }, DatagridActions && /*#__PURE__*/_react.default.createElement(DatagridActions, datagridState), DatagridBatchActions && DatagridBatchActions(datagridState))) : null;
169
+ };
170
+ DatagridToolbar.propTypes = {
171
+ ariaToolbarLabel: _propTypes.default.string
160
172
  };
161
173
  var _default = DatagridToolbar;
162
174
  exports.default = _default;
@@ -76,7 +76,7 @@ var DatagridVirtualBody = function DatagridVirtualBody(datagridState) {
76
76
  overflow: 'hidden'
77
77
  }
78
78
  }, /*#__PURE__*/_react.default.createElement(_DatagridHead.default, datagridState)), /*#__PURE__*/_react.default.createElement(TableBody, (0, _extends2.default)({}, getTableBodyProps({
79
- role: false
79
+ role: undefined
80
80
  }), {
81
81
  onScroll: syncScroll
82
82
  }), /*#__PURE__*/_react.default.createElement(_reactWindow.VariableSizeList, {
@@ -194,9 +194,13 @@ var FilterFlyout = function FilterFlyout(_ref) {
194
194
  };
195
195
 
196
196
  /** Effects */
197
+ // Close flyout when clicking outside
197
198
  (0, _hooks.useClickOutside)(filterFlyoutRef, function (target) {
198
199
  var hasClickedOnDatePicker = target.closest('.flatpickr-calendar');
199
200
  var hasClickedOnDropdown = target.className === "".concat(_settings.carbon.prefix, "--list-box__menu-item__option");
201
+
202
+ // Do not do anything if flyout is closed or if clicking on anything
203
+ // rendered via a portal
200
204
  if (!open || hasClickedOnDatePicker || hasClickedOnDropdown) {
201
205
  return;
202
206
  }
@@ -23,7 +23,6 @@ var _ = require(".");
23
23
  var _hooks = require("./hooks");
24
24
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
25
25
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
26
- /* eslint-disable react/jsx-key */
27
26
  /**
28
27
  * Copyright IBM Corp. 2022, 2024
29
28
  *
@@ -40,7 +40,7 @@ var removeFilterItem = function removeFilterItem(state, index) {
40
40
  return state.splice(index, 1);
41
41
  };
42
42
  var updateFilterState = function updateFilterState(state, type, value) {
43
- if (type === _constants.CHECKBOX) {
43
+ if (type === _constants.CHECKBOX || type === _constants.MULTISELECT) {
44
44
  return;
45
45
  }
46
46
  if (type === _constants.DATE) {
@@ -63,7 +63,7 @@ var clearSingleFilter = function clearSingleFilter(_ref, setAllFilters, state) {
63
63
  var filterValues = f.value;
64
64
  var filterType = f.type;
65
65
  updateFilterState(tempState, filterType, value);
66
- if (filterType === _constants.CHECKBOX) {
66
+ if (filterType === _constants.CHECKBOX || filterType === _constants.MULTISELECT) {
67
67
  /**
68
68
  When all checkboxes of a group are all unselected the value still exists in the filtersObjectArray
69
69
  This checks if all the checkboxes are selected = false and removes it from the array
@@ -130,15 +130,15 @@ var prepareFiltersForTags = function prepareFiltersForTags(filters, renderDateLa
130
130
  key: id,
131
131
  value: (_renderDateLabel = renderDateLabel === null || renderDateLabel === void 0 ? void 0 : renderDateLabel(startDate, endDate)) !== null && _renderDateLabel !== void 0 ? _renderDateLabel : formatDateRange(startDate, endDate)
132
132
  }, sharedFilterProps));
133
- } else if (type === _constants.CHECKBOX) {
134
- value.forEach(function (checkbox) {
135
- if (checkbox.selected) {
133
+ } else if (type === _constants.CHECKBOX || type === _constants.MULTISELECT) {
134
+ value.forEach(function (option) {
135
+ if (option.selected) {
136
136
  tags.push(_objectSpread(_objectSpread({
137
137
  key: id,
138
- value: checkbox.value
138
+ value: option.value
139
139
  }, sharedFilterProps), {}, {
140
140
  onClose: function onClose() {
141
- return handleSingleFilterRemoval(id, checkbox.value);
141
+ return handleSingleFilterRemoval(id, option.value);
142
142
  }
143
143
  }));
144
144
  }
@@ -147,22 +147,45 @@ var prepareFiltersForTags = function prepareFiltersForTags(filters, renderDateLa
147
147
  });
148
148
  return tags;
149
149
  };
150
- var FilterProvider = function FilterProvider(_ref3) {
151
- var children = _ref3.children,
152
- filters = _ref3.filters,
153
- filterProps = _ref3.filterProps;
154
- var _ref4 = filterProps || {},
155
- renderDateLabel = _ref4.renderDateLabel;
150
+ var filteringReducer = function filteringReducer(state, action) {
151
+ switch (action.type) {
152
+ case _constants.SAVED_FILTERS:
153
+ {
154
+ var _ref3 = action.payload || {},
155
+ savedFilters = _ref3.savedFilters;
156
+ return _objectSpread(_objectSpread({}, state), {}, {
157
+ savedFilters: savedFilters
158
+ });
159
+ }
160
+ default:
161
+ return state;
162
+ }
163
+ };
164
+ var FilterProvider = function FilterProvider(_ref4) {
165
+ var children = _ref4.children,
166
+ filters = _ref4.filters,
167
+ filterProps = _ref4.filterProps;
168
+ var _ref5 = filterProps || {},
169
+ renderDateLabel = _ref5.renderDateLabel;
156
170
  var filterTags = prepareFiltersForTags(filters, renderDateLabel);
157
171
  var _useState = (0, _react.useState)(false),
158
172
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
159
173
  panelOpen = _useState2[0],
160
174
  setPanelOpen = _useState2[1];
175
+ var initialState = {
176
+ savedFilters: []
177
+ };
178
+ var _useReducer = (0, _react.useReducer)(filteringReducer, initialState),
179
+ _useReducer2 = (0, _slicedToArray2.default)(_useReducer, 2),
180
+ state = _useReducer2[0],
181
+ dispatch = _useReducer2[1];
161
182
  var value = {
162
183
  filterTags: filterTags,
163
184
  EventEmitter: EventEmitter,
164
185
  panelOpen: panelOpen,
165
- setPanelOpen: setPanelOpen
186
+ setPanelOpen: setPanelOpen,
187
+ state: state,
188
+ dispatch: dispatch
166
189
  };
167
190
  return /*#__PURE__*/_react.default.createElement(FilterContext.Provider, {
168
191
  value: value
@@ -3,13 +3,14 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.RADIO = exports.PANEL_WIDTH = exports.PANEL = exports.NUMBER = exports.INSTANT = exports.FLYOUT = exports.DROPDOWN = exports.DATE = exports.CLEAR_SINGLE_FILTER = exports.CLEAR_FILTERS = exports.CHECKBOX = exports.BATCH = exports.ACTION_SET_HEIGHT = void 0;
6
+ exports.SAVED_FILTERS = exports.RADIO = exports.PANEL_WIDTH = exports.PANEL = exports.NUMBER = exports.MULTISELECT = exports.INSTANT = exports.FLYOUT = exports.DROPDOWN = exports.DATE = exports.CLEAR_SINGLE_FILTER = exports.CLEAR_FILTERS = exports.CHECKBOX = exports.BATCH = exports.ACTION_SET_HEIGHT = void 0;
7
7
  /**
8
- * Copyright IBM Corp. 2022, 2022
8
+ * Copyright IBM Corp. 2022, 2024
9
9
  *
10
10
  * This source code is licensed under the Apache-2.0 license found in the
11
11
  * LICENSE file in the root directory of this source tree.
12
12
  */
13
+
13
14
  /** Constants for update methods can either be batch or instant */
14
15
  var BATCH = 'batch';
15
16
  exports.BATCH = BATCH;
@@ -32,9 +33,11 @@ exports.CHECKBOX = CHECKBOX;
32
33
  var RADIO = 'radio';
33
34
  exports.RADIO = RADIO;
34
35
  var DROPDOWN = 'dropdown';
36
+ exports.DROPDOWN = DROPDOWN;
37
+ var MULTISELECT = 'multiSelect';
35
38
 
36
39
  /** Constants for event emitters */
37
- exports.DROPDOWN = DROPDOWN;
40
+ exports.MULTISELECT = MULTISELECT;
38
41
  var CLEAR_FILTERS = 'clearFilters';
39
42
  exports.CLEAR_FILTERS = CLEAR_FILTERS;
40
43
  var CLEAR_SINGLE_FILTER = 'clearSingleFilter';
@@ -44,4 +47,8 @@ exports.CLEAR_SINGLE_FILTER = CLEAR_SINGLE_FILTER;
44
47
  var PANEL_WIDTH = 320;
45
48
  exports.PANEL_WIDTH = PANEL_WIDTH;
46
49
  var ACTION_SET_HEIGHT = 64;
47
- exports.ACTION_SET_HEIGHT = ACTION_SET_HEIGHT;
50
+
51
+ /** Constants for local reducer */
52
+ exports.ACTION_SET_HEIGHT = ACTION_SET_HEIGHT;
53
+ var SAVED_FILTERS = 'savedFilters';
54
+ exports.SAVED_FILTERS = SAVED_FILTERS;
@@ -6,6 +6,13 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.default = void 0;
7
7
  var _FilterProvider = require("../FilterProvider");
8
8
  var _react = require("react");
9
+ /**
10
+ * Copyright IBM Corp. 2023, 2024
11
+ *
12
+ * This source code is licensed under the Apache-2.0 license found in the
13
+ * LICENSE file in the root directory of this source tree.
14
+ */
15
+
9
16
  var useFilterContext = function useFilterContext() {
10
17
  // get the context
11
18
  var context = (0, _react.useContext)(_FilterProvider.FilterContext);
@@ -15,6 +15,7 @@ var _carbonComponentsReact = require("carbon-components-react");
15
15
  var _constants = require("../constants");
16
16
  var _utils = require("../utils");
17
17
  var _hooks = require("../../../../../../global/js/hooks");
18
+ var _FilterProvider = require("../FilterProvider");
18
19
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
19
20
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
20
21
  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; }
@@ -29,6 +30,10 @@ var useFilters = function useFilters(_ref) {
29
30
  onCancel = _ref.onCancel,
30
31
  panelOpen = _ref.panelOpen,
31
32
  isFetching = _ref.isFetching;
33
+ var _useContext = (0, _react.useContext)(_FilterProvider.FilterContext),
34
+ state = _useContext.state,
35
+ localDispatch = _useContext.dispatch;
36
+ var savedFilters = state.savedFilters;
32
37
  /** State */
33
38
  var _useState = (0, _react.useState)((0, _utils.getInitialStateFromFilters)(filters, variation, reactTableFiltersState)),
34
39
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
@@ -112,7 +117,7 @@ var useFilters = function useFilters(_ref) {
112
117
  }
113
118
 
114
119
  // ATTENTION: this is where you would reset or remove individual filters from the filters array
115
- if (type === _constants.CHECKBOX) {
120
+ if (type === _constants.CHECKBOX || type === _constants.MULTISELECT) {
116
121
  /**
117
122
  When all checkboxes of a group are all unselected the value still exists in the filtersObjectArray
118
123
  This checks if all the checkboxes are selected = false and removes it from the array
@@ -168,6 +173,16 @@ var useFilters = function useFilters(_ref) {
168
173
  }
169
174
  setFiltersObjectArray(filtersObjectArrayCopy);
170
175
 
176
+ // Dispatch action from local filter context to track filters in order
177
+ // to keep history if `isFetching` becomes true. If so, react-table
178
+ // clears all filter history
179
+ localDispatch({
180
+ type: _constants.SAVED_FILTERS,
181
+ payload: {
182
+ savedFilters: filtersObjectArrayCopy
183
+ }
184
+ });
185
+
171
186
  // // Automatically apply the filters if the updateMethod is instant
172
187
  if (updateMethod === _constants.INSTANT) {
173
188
  setAllFilters(filtersObjectArrayCopy);
@@ -312,6 +327,71 @@ var useFilters = function useFilters(_ref) {
312
327
  },
313
328
  light: isPanel
314
329
  }));
330
+ break;
331
+ case _constants.MULTISELECT:
332
+ {
333
+ var _filtersState$column3;
334
+ var isStringArray = components.MultiSelect.items.length && typeof components.MultiSelect.items[0] === 'string';
335
+ var selectedFilters = (_filtersState$column3 = filtersState[column]) === null || _filtersState$column3 === void 0 ? void 0 : _filtersState$column3.value.filter(function (i) {
336
+ return i.selected;
337
+ });
338
+ var filteredItems = components.MultiSelect.items.map(function (item) {
339
+ if (selectedFilters.filter(function (a) {
340
+ return isStringArray ? a.id === item : a.id === item.id;
341
+ }).length) {
342
+ return item;
343
+ }
344
+ return null;
345
+ }).filter(Boolean);
346
+ filter = /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.MultiSelect, (0, _extends2.default)({}, components.MultiSelect, {
347
+ selectedItems: filteredItems,
348
+ onChange: function onChange(_ref6) {
349
+ var _components$MultiSele, _components$MultiSele2;
350
+ var selectedItems = _ref6.selectedItems;
351
+ var allOptions = filtersState[column].value;
352
+ // Find selected items from list of options
353
+ var foundItems = selectedItems.map(function (item) {
354
+ if (allOptions.filter(function (option) {
355
+ return isStringArray ? option.id === item : option.id === item.id;
356
+ })) {
357
+ return allOptions.filter(function (option) {
358
+ return isStringArray ? option.id === item : option.id === item.id;
359
+ })[0];
360
+ }
361
+ return null;
362
+ }).filter(Boolean);
363
+
364
+ // Change selected state for those items that have been selected
365
+ allOptions.map(function (a) {
366
+ return a.selected = false;
367
+ });
368
+ foundItems.map(function (item) {
369
+ var foundOriginalItem = allOptions.filter(function (a) {
370
+ return isStringArray ? a === item : a.id === item.id;
371
+ });
372
+ if (foundOriginalItem && foundOriginalItem.length) {
373
+ foundOriginalItem[0].selected = true;
374
+ }
375
+ });
376
+ if (!selectedItems.length) {
377
+ allOptions.map(function (a) {
378
+ return a.selected = false;
379
+ });
380
+ }
381
+ setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, (0, _defineProperty2.default)({}, column, {
382
+ value: allOptions,
383
+ type: type
384
+ })));
385
+ applyFilters({
386
+ column: column,
387
+ value: (0, _toConsumableArray2.default)(filtersState[column].value),
388
+ type: type
389
+ });
390
+ (_components$MultiSele = components.MultiSelect) === null || _components$MultiSele === void 0 ? void 0 : (_components$MultiSele2 = _components$MultiSele.onChange) === null || _components$MultiSele2 === void 0 ? void 0 : _components$MultiSele2.call(_components$MultiSele, selectedItems);
391
+ }
392
+ }));
393
+ break;
394
+ }
315
395
  }
316
396
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, {
317
397
  key: column
@@ -347,10 +427,27 @@ var useFilters = function useFilters(_ref) {
347
427
  setAllFilters(JSON.parse(prevFiltersObjectArrayRef.current));
348
428
  setFetchingReset(true);
349
429
  }
430
+ if (isFetching && fetchingReset) {
431
+ var cleanFilters = function cleanFilters(originalFilterState) {
432
+ var copy = _objectSpread({}, originalFilterState);
433
+ var updatedFilters = savedFilters.map(function (f) {
434
+ if (Object.hasOwn(copy, f.id)) {
435
+ copy[f.id] = f;
436
+ return copy;
437
+ }
438
+ return copy;
439
+ });
440
+ return updatedFilters[0];
441
+ };
442
+ setFiltersObjectArray(savedFilters);
443
+ var filterStateCopy = cleanFilters(filtersState);
444
+ setFiltersState(filterStateCopy);
445
+ }
350
446
  if (!isFetching) {
351
447
  setFetchingReset(false);
352
448
  }
353
- }, [isFetching, reactTableFiltersState, setAllFilters, fetchingReset]);
449
+ // eslint-disable-next-line react-hooks/exhaustive-deps
450
+ }, [isFetching, reactTableFiltersState, setAllFilters, fetchingReset, savedFilters, filtersObjectArray]);
354
451
  var cancel = function cancel() {
355
452
  // Reverting to previous filters only applies when using batch actions
356
453
  if (updateMethod === _constants.BATCH) {
@@ -14,6 +14,7 @@ var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
14
14
  * This source code is licensed under the Apache-2.0 license found in the
15
15
  * LICENSE file in the root directory of this source tree.
16
16
  */
17
+
17
18
  /* eslint-disable jsdoc/check-param-names */
18
19
 
19
20
  /**
@@ -65,6 +65,17 @@ var getInitialStateFromFilters = function getInitialStateFromFilters(filters, va
65
65
  value: '',
66
66
  type: type
67
67
  };
68
+ } else if (type === _constants.MULTISELECT) {
69
+ initialFilterState[column] = {
70
+ value: props.MultiSelect.items.map(function (item) {
71
+ return {
72
+ id: typeof item === 'string' ? item : item.id,
73
+ value: typeof item === 'string' ? item : item.text,
74
+ selected: false
75
+ };
76
+ }),
77
+ type: type
78
+ };
68
79
  }
69
80
  };
70
81
  if (variation === _constants.FLYOUT) {