@carbon/ibm-products 1.71.0 → 1.72.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. package/css/index-full-carbon.css +48 -2
  2. package/css/index-full-carbon.css.map +1 -1
  3. package/css/index-full-carbon.min.css +1 -1
  4. package/css/index-full-carbon.min.css.map +1 -1
  5. package/css/index-without-carbon-released-only.css +48 -2
  6. package/css/index-without-carbon-released-only.css.map +1 -1
  7. package/css/index-without-carbon-released-only.min.css +1 -1
  8. package/css/index-without-carbon-released-only.min.css.map +1 -1
  9. package/css/index-without-carbon.css +48 -2
  10. package/css/index-without-carbon.css.map +1 -1
  11. package/css/index-without-carbon.min.css +1 -1
  12. package/css/index-without-carbon.min.css.map +1 -1
  13. package/css/index.css +48 -2
  14. package/css/index.css.map +1 -1
  15. package/css/index.min.css +1 -1
  16. package/css/index.min.css.map +1 -1
  17. package/es/components/CoachmarkStack/CoachmarkStack.js +11 -11
  18. package/es/components/Datagrid/Datagrid/Datagrid.js +10 -3
  19. package/es/components/Datagrid/Datagrid/DatagridContent.js +7 -3
  20. package/es/components/Datagrid/Datagrid/DatagridEmptyBody.js +1 -1
  21. package/es/components/Datagrid/Datagrid/DatagridExpandedRow.js +4 -4
  22. package/es/components/Datagrid/Datagrid/DatagridHeaderRow.js +4 -2
  23. package/es/components/Datagrid/Datagrid/DatagridRefBody.js +1 -1
  24. package/es/components/Datagrid/Datagrid/DatagridRow.js +8 -7
  25. package/es/components/Datagrid/Datagrid/DatagridSimpleBody.js +1 -1
  26. package/es/components/Datagrid/Datagrid/DatagridToolbar.js +15 -3
  27. package/es/components/Datagrid/Datagrid/DatagridVirtualBody.js +1 -1
  28. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterProvider.js +8 -8
  29. package/es/components/Datagrid/Datagrid/addons/Filtering/constants.js +1 -0
  30. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/useFilters.js +68 -3
  31. package/es/components/Datagrid/Datagrid/addons/Filtering/utils.js +12 -1
  32. package/es/components/Datagrid/Datagrid/addons/stateReducer.js +8 -1
  33. package/es/components/Datagrid/useDisableSelectRows.js +1 -1
  34. package/es/components/Datagrid/useFiltering.js +48 -46
  35. package/es/components/Datagrid/useInitialColumnSort.js +39 -0
  36. package/es/components/Datagrid/useSelectRows.js +2 -2
  37. package/es/components/Datagrid/useSortableColumns.js +16 -16
  38. package/lib/components/CoachmarkStack/CoachmarkStack.js +11 -11
  39. package/lib/components/Datagrid/Datagrid/Datagrid.js +10 -3
  40. package/lib/components/Datagrid/Datagrid/DatagridContent.js +7 -3
  41. package/lib/components/Datagrid/Datagrid/DatagridEmptyBody.js +1 -1
  42. package/lib/components/Datagrid/Datagrid/DatagridExpandedRow.js +4 -4
  43. package/lib/components/Datagrid/Datagrid/DatagridHeaderRow.js +4 -2
  44. package/lib/components/Datagrid/Datagrid/DatagridRefBody.js +1 -1
  45. package/lib/components/Datagrid/Datagrid/DatagridRow.js +8 -7
  46. package/lib/components/Datagrid/Datagrid/DatagridSimpleBody.js +1 -1
  47. package/lib/components/Datagrid/Datagrid/DatagridToolbar.js +15 -10
  48. package/lib/components/Datagrid/Datagrid/DatagridVirtualBody.js +1 -1
  49. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterProvider.js +7 -7
  50. package/lib/components/Datagrid/Datagrid/addons/Filtering/constants.js +4 -2
  51. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/useFilters.js +66 -1
  52. package/lib/components/Datagrid/Datagrid/addons/Filtering/utils.js +11 -0
  53. package/lib/components/Datagrid/Datagrid/addons/stateReducer.js +8 -1
  54. package/lib/components/Datagrid/useDisableSelectRows.js +1 -1
  55. package/lib/components/Datagrid/useFiltering.js +47 -45
  56. package/lib/components/Datagrid/useInitialColumnSort.js +47 -0
  57. package/lib/components/Datagrid/useSelectRows.js +2 -2
  58. package/lib/components/Datagrid/useSortableColumns.js +18 -17
  59. package/package.json +5 -5
  60. package/scss/components/Datagrid/styles/_useExpandedRow.scss +25 -0
  61. package/scss/components/Datagrid/styles/_useNestedRows.scss +62 -1
  62. package/scss/components/Datagrid/styles/addons/_FilterPanel.scss +1 -1
@@ -1,6 +1,6 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
3
- var _excluded = ["datagridState", "title"];
3
+ var _excluded = ["ariaToolbarLabel", "datagridState", "title"];
4
4
  /**
5
5
  * Copyright IBM Corp. 2020, 2022
6
6
  *
@@ -20,7 +20,8 @@ import { FilterProvider } from './addons/Filtering/FilterProvider';
20
20
  var blockClass = "".concat(pkg.prefix, "--datagrid");
21
21
  var componentName = 'Datagrid';
22
22
  export var Datagrid = /*#__PURE__*/React.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 = _objectWithoutProperties(_ref, _excluded);
26
27
  if (!datagridState) {
@@ -37,7 +38,8 @@ export var Datagrid = /*#__PURE__*/React.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.createElement(FilterProvider, {
43
45
  filters: filters,
@@ -58,6 +60,11 @@ Datagrid = pkg.checkComponentEnabled(Datagrid, componentName);
58
60
  // is used in preference to relying on function.name.
59
61
  Datagrid.displayName = componentName;
60
62
  Datagrid.propTypes = {
63
+ /**
64
+ * Specify a label to be read by screen readers on the container node
65
+ * 'aria-label' of the TableToolbar component.
66
+ */
67
+ ariaToolbarLabel: PropTypes.string,
61
68
  /**
62
69
  * The data grid state, much of it being supplied by the useDatagrid hook
63
70
  */
@@ -32,7 +32,8 @@ var TableContainer = DataTable.TableContainer,
32
32
  var blockClass = "".concat(pkg.prefix, "--datagrid");
33
33
  export var DatagridContent = function DatagridContent(_ref) {
34
34
  var _cx5;
35
- var datagridState = _ref.datagridState,
35
+ var ariaToolbarLabel = _ref.ariaToolbarLabel,
36
+ datagridState = _ref.datagridState,
36
37
  title = _ref.title;
37
38
  var _useContext = useContext(InlineEditContext),
38
39
  inlineEditState = _useContext.state,
@@ -89,7 +90,7 @@ export var DatagridContent = function DatagridContent(_ref) {
89
90
  var renderTable = function renderTable() {
90
91
  var _getTableProps;
91
92
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Table, _extends({}, getTableProps(), {
92
- className: cx(withVirtualScroll ? '' : "".concat(blockClass, "__table-simple"), "".concat(blockClass, "__vertical-align-").concat(verticalAlign), _defineProperty({}, "".concat(blockClass, "__variable-row-height"), variableRowHeight), _defineProperty({}, "".concat(blockClass, "__table-with-inline-edit"), withInlineEdit), _defineProperty({}, "".concat(blockClass, "__table-grid-active"), gridActive), _defineProperty({}, "".concat(blockClass, "__table-is-resizing"), typeof columnResizing.isResizingColumn === 'string'), (_getTableProps = getTableProps()) === null || _getTableProps === void 0 ? void 0 : _getTableProps.className),
93
+ className: cx(withVirtualScroll ? '' : "".concat(blockClass, "__table-simple"), "".concat(blockClass, "__vertical-align-").concat(verticalAlign), _defineProperty({}, "".concat(blockClass, "__variable-row-height"), variableRowHeight), _defineProperty({}, "".concat(blockClass, "__table-with-inline-edit"), withInlineEdit), _defineProperty({}, "".concat(blockClass, "__table-grid-active"), gridActive), _defineProperty({}, "".concat(blockClass, "__table-is-resizing"), typeof (columnResizing === null || columnResizing === void 0 ? void 0 : columnResizing.isResizingColumn) === 'string'), (_getTableProps = getTableProps()) === null || _getTableProps === void 0 ? void 0 : _getTableProps.className),
93
94
  role: withInlineEdit && 'grid',
94
95
  tabIndex: withInlineEdit && 0,
95
96
  onKeyDown: /* istanbul ignore next */
@@ -154,7 +155,9 @@ export var DatagridContent = function DatagridContent(_ref) {
154
155
  className: cx("".concat(blockClass, "__grid-container"), withVirtualScroll || fullHeightDatagrid ? "".concat(blockClass, "__full-height") : '', DatagridPagination ? "".concat(blockClass, "__with-pagination") : '', useDenseHeader ? "".concat(blockClass, "__dense-header") : '', (_cx5 = {}, _defineProperty(_cx5, "".concat(blockClass, "__grid-container-grid-active"), gridActive), _defineProperty(_cx5, "".concat(blockClass, "__grid-container-inline-edit"), withInlineEdit), _defineProperty(_cx5, "".concat(blockClass, "__grid-container-grid-active--without-toolbar"), withInlineEdit && !DatagridActions), _cx5)),
155
156
  title: gridTitle,
156
157
  description: gridDescription
157
- }, /*#__PURE__*/React.createElement(DatagridToolbar, datagridState), /*#__PURE__*/React.createElement("div", {
158
+ }, /*#__PURE__*/React.createElement(DatagridToolbar, _extends({}, datagridState, {
159
+ ariaToolbarLabel: ariaToolbarLabel
160
+ })), /*#__PURE__*/React.createElement("div", {
158
161
  className: cx("".concat(blockClass, "__table-container"), _defineProperty({}, "".concat(blockClass, "__table-container--filter-open"), panelOpen)),
159
162
  ref: gridAreaRef
160
163
  }, (filterProps === null || filterProps === void 0 ? void 0 : filterProps.variation) === 'panel' && /*#__PURE__*/React.createElement(FilterPanel, _extends({}, getFilterFlyoutProps(), {
@@ -173,6 +176,7 @@ export var DatagridContent = function DatagridContent(_ref) {
173
176
  }));
174
177
  };
175
178
  DatagridContent.propTypes = {
179
+ ariaToolbarLabel: PropTypes.string,
176
180
  datagridState: PropTypes.shape({
177
181
  getTableProps: PropTypes.func,
178
182
  getFilterFlyoutProps: PropTypes.func,
@@ -35,7 +35,7 @@ var DatagridEmptyBody = function DatagridEmptyBody(datagridState) {
35
35
  };
36
36
  var validEmptyStates = ['error', 'noData', 'notFound'];
37
37
  return /*#__PURE__*/React.createElement(TableBody, _extends({}, getTableBodyProps({
38
- role: false
38
+ role: undefined
39
39
  }), {
40
40
  className: "".concat(blockClass, "__empty-state-body")
41
41
  }), /*#__PURE__*/React.createElement(TableRow, null, /*#__PURE__*/React.createElement(TableCell, {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright IBM Corp. 2020, 2023
2
+ * Copyright IBM Corp. 2020, 2024
3
3
  *
4
4
  * This source code is licensed under the Apache-2.0 license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -15,10 +15,10 @@ var DatagridExpandedRow = function DatagridExpandedRow(ExpandedRowContentCompone
15
15
  var row = datagridState.row;
16
16
  var expandedContentHeight = row.expandedContentHeight;
17
17
  var toggleParentHoverClass = function toggleParentHoverClass(event, eventType) {
18
- var _event$target, _event$target$parentN;
18
+ var _event$target;
19
19
  /* istanbul ignore else */
20
- if (event !== null && event !== void 0 && (_event$target = event.target) !== null && _event$target !== void 0 && (_event$target$parentN = _event$target.parentNode) !== null && _event$target$parentN !== void 0 && _event$target$parentN.previousElementSibling) {
21
- var parentNode = event.target.parentNode.previousElementSibling;
20
+ if (event !== null && event !== void 0 && (_event$target = event.target) !== null && _event$target !== void 0 && _event$target.closest('tr').previousElementSibling) {
21
+ var parentNode = event.target.closest('tr').previousElementSibling;
22
22
  if (eventType === 'enter') {
23
23
  parentNode.classList.add("".concat(blockClass, "__expandable-row--hover"));
24
24
  } else {
@@ -18,6 +18,7 @@ import { selectionColumnId } from '../common-column-ids';
18
18
  import { pkg } from '../../../settings';
19
19
  import { handleColumnResizeEndEvent, handleColumnResizingEvent } from './addons/stateReducer';
20
20
  import { getNodeTextContent } from '../../../global/js/utils/getNodeTextContent';
21
+ import { useInitialColumnSort } from '../useInitialColumnSort';
21
22
  var blockClass = "".concat(pkg.prefix, "--datagrid");
22
23
  var getAccessibilityProps = function getAccessibilityProps(header) {
23
24
  var props = {};
@@ -32,6 +33,7 @@ var getAccessibilityProps = function getAccessibilityProps(header) {
32
33
  var HeaderRow = function HeaderRow(datagridState, headRef, headerGroup) {
33
34
  var resizerAriaLabel = datagridState.resizerAriaLabel,
34
35
  isFetching = datagridState.isFetching;
36
+ useInitialColumnSort(datagridState);
35
37
  // Used to measure the height of the table and uses that value
36
38
  // to display a vertical line to indicate the column you are resizing
37
39
  useEffect(function () {
@@ -72,7 +74,7 @@ var HeaderRow = function HeaderRow(datagridState, headRef, headerGroup) {
72
74
  onMouseDown === null || onMouseDown === void 0 ? void 0 : onMouseDown(event);
73
75
  };
74
76
  return /*#__PURE__*/React.createElement(TableRow, _extends({}, headerGroup.getHeaderGroupProps({
75
- role: false
77
+ role: undefined
76
78
  }), {
77
79
  className: cx("".concat(blockClass, "__head"), headerGroup.getHeaderGroupProps().className),
78
80
  ref: headRef
@@ -98,7 +100,7 @@ var HeaderRow = function HeaderRow(datagridState, headRef, headerGroup) {
98
100
  columnWidths = _ref4.columnWidths;
99
101
  var originalCol = visibleColumns[index];
100
102
  return /*#__PURE__*/React.createElement(TableHeader, _extends({}, header.getHeaderProps({
101
- role: false
103
+ role: undefined
102
104
  }), {
103
105
  className: cx((_cx = {}, _defineProperty(_cx, "".concat(blockClass, "__resizableColumn"), header.getResizerProps), _defineProperty(_cx, "".concat(blockClass, "__isResizing"), header.isResizing), _defineProperty(_cx, "".concat(blockClass, "__sortableColumn"), datagridState.isTableSortable && header.id !== 'spacer'), _defineProperty(_cx, "".concat(blockClass, "__isSorted"), header.isSorted), _defineProperty(_cx, "".concat(blockClass, "__header-actions-column"), header.isAction), _cx), header.getHeaderProps().className),
104
106
  key: header.id,
@@ -23,7 +23,7 @@ var DatagridRefBody = function DatagridRefBody(datagridState) {
23
23
  rows = datagridState.rows,
24
24
  prepareRow = datagridState.prepareRow;
25
25
  return /*#__PURE__*/React.createElement("tbody", _extends({}, getTableBodyProps({
26
- role: false
26
+ role: undefined
27
27
  }), {
28
28
  className: cx("".concat(blockClass, "__simple-body"), getTableBodyProps().className)
29
29
  }), rows.map(function (row) {
@@ -99,6 +99,8 @@ var DatagridRow = function DatagridRow(datagridState) {
99
99
  hoverHandler(event);
100
100
  }
101
101
  };
102
+ var _row$getRowProps = row.getRowProps(),
103
+ className = _row$getRowProps.className;
102
104
  var rowClassNames = cx("".concat(blockClass, "__carbon-row"), (_cx = {}, _defineProperty(_cx, "".concat(blockClass, "__carbon-row-expanded"), row.isExpanded), _defineProperty(_cx, "".concat(blockClass, "__carbon-row-expandable"), row.canExpand), _defineProperty(_cx, "".concat(carbon.prefix, "--data-table--selected"), row.isSelected), _cx));
103
105
  var setAdditionalRowProps = function setAdditionalRowProps() {
104
106
  if (withNestedRows || withExpandedRows) {
@@ -110,11 +112,10 @@ var DatagridRow = function DatagridRow(datagridState) {
110
112
  };
111
113
  return /*#__PURE__*/React.createElement(React.Fragment, {
112
114
  key: key
113
- }, /*#__PURE__*/React.createElement(TableRow, _extends({
114
- className: rowClassNames
115
- }, row.getRowProps({
116
- role: false
115
+ }, /*#__PURE__*/React.createElement(TableRow, _extends({}, row.getRowProps({
116
+ role: undefined
117
117
  }), {
118
+ className: cx(rowClassNames, className),
118
119
  key: row.id,
119
120
  onMouseEnter: hoverHandler,
120
121
  onMouseLeave: handleMouseLeave,
@@ -122,9 +123,9 @@ var DatagridRow = function DatagridRow(datagridState) {
122
123
  onBlur: focusRemover,
123
124
  onKeyUp: handleOnKeyUp
124
125
  }, setAdditionalRowProps()), row.cells.map(function (cell, index) {
125
- var _cell$column;
126
+ var _cell$column, _cx2;
126
127
  var cellProps = cell.getCellProps({
127
- role: false
128
+ role: undefined
128
129
  });
129
130
  var children = cellProps.children,
130
131
  restProps = _objectWithoutProperties(cellProps, _excluded);
@@ -136,7 +137,7 @@ var DatagridRow = function DatagridRow(datagridState) {
136
137
  });
137
138
  }
138
139
  return /*#__PURE__*/React.createElement(TableCell, _extends({
139
- className: cx("".concat(blockClass, "__cell"), _defineProperty({}, "".concat(blockClass, "__expandable-row-cell"), row.canExpand && index === 0))
140
+ className: cx("".concat(blockClass, "__cell"), (_cx2 = {}, _defineProperty(_cx2, "".concat(blockClass, "__expandable-row-cell"), row.canExpand && index === 0), _defineProperty(_cx2, "".concat(blockClass, "__expandable-row-cell--is-expanded"), row.isExpanded && index === 0), _cx2))
140
141
  }, restProps, {
141
142
  key: cell.column.id
142
143
  }), content);
@@ -20,7 +20,7 @@ var DatagridSimpleBody = function DatagridSimpleBody(datagridState) {
20
20
  rows = datagridState.rows,
21
21
  prepareRow = datagridState.prepareRow;
22
22
  return /*#__PURE__*/React.createElement(TableBody, _extends({}, getTableBodyProps({
23
- role: false
23
+ role: undefined
24
24
  }), {
25
25
  className: cx("".concat(blockClass, "__simple-body"), getTableBodyProps().className)
26
26
  }), rows.map(function (row) {
@@ -1,5 +1,7 @@
1
+ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
1
2
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
3
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
+ var _excluded = ["ariaToolbarLabel"];
3
5
  /**
4
6
  * Copyright IBM Corp. 2022, 2023
5
7
  *
@@ -8,6 +10,7 @@ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
8
10
  */
9
11
 
10
12
  import React, { useEffect, useRef, useState } from 'react';
13
+ import PropTypes from 'prop-types';
11
14
  import { Add16, OverflowMenuVertical16 } from '@carbon/icons-react';
12
15
  import { DataTable, TableBatchActions, TableBatchAction } from 'carbon-components-react';
13
16
  import { useResizeObserver } from '../../../global/js/hooks/useResizeObserver';
@@ -139,7 +142,9 @@ var DatagridBatchActionsToolbar = function DatagridBatchActionsToolbar(datagridS
139
142
  }
140
143
  })), renderBatchActionOverflow());
141
144
  };
142
- var DatagridToolbar = function DatagridToolbar(datagridState) {
145
+ var DatagridToolbar = function DatagridToolbar(_ref2) {
146
+ var ariaToolbarLabel = _ref2.ariaToolbarLabel,
147
+ datagridState = _objectWithoutProperties(_ref2, _excluded);
143
148
  var ref = useRef(null);
144
149
  var _useResizeObserver = useResizeObserver(ref),
145
150
  width = _useResizeObserver.width;
@@ -151,8 +156,15 @@ var DatagridToolbar = function DatagridToolbar(datagridState) {
151
156
  return batchActions && DatagridActions ? /*#__PURE__*/React.createElement("div", {
152
157
  ref: ref,
153
158
  className: cx([toolbarClass, "".concat(toolbarClass, "--").concat(getRowHeight)])
154
- }, /*#__PURE__*/React.createElement(TableToolbar, null, DatagridActions && /*#__PURE__*/React.createElement(DatagridActions, datagridState), DatagridBatchActionsToolbar && DatagridBatchActionsToolbar(datagridState, width, ref))) : DatagridActions ? /*#__PURE__*/React.createElement("div", {
159
+ }, /*#__PURE__*/React.createElement(TableToolbar, {
160
+ "aria-label": ariaToolbarLabel
161
+ }, DatagridActions && /*#__PURE__*/React.createElement(DatagridActions, datagridState), DatagridBatchActionsToolbar && DatagridBatchActionsToolbar(datagridState, width, ref))) : DatagridActions ? /*#__PURE__*/React.createElement("div", {
155
162
  className: toolbarClass
156
- }, /*#__PURE__*/React.createElement(TableToolbar, null, DatagridActions && /*#__PURE__*/React.createElement(DatagridActions, datagridState), DatagridBatchActions && DatagridBatchActions(datagridState))) : null;
163
+ }, /*#__PURE__*/React.createElement(TableToolbar, {
164
+ "aria-label": ariaToolbarLabel
165
+ }, DatagridActions && /*#__PURE__*/React.createElement(DatagridActions, datagridState), DatagridBatchActions && DatagridBatchActions(datagridState))) : null;
166
+ };
167
+ DatagridToolbar.propTypes = {
168
+ ariaToolbarLabel: PropTypes.string
157
169
  };
158
170
  export default DatagridToolbar;
@@ -73,7 +73,7 @@ var DatagridVirtualBody = function DatagridVirtualBody(datagridState) {
73
73
  overflow: 'hidden'
74
74
  }
75
75
  }, /*#__PURE__*/React.createElement(DatagridHead, datagridState)), /*#__PURE__*/React.createElement(TableBody, _extends({}, getTableBodyProps({
76
- role: false
76
+ role: undefined
77
77
  }), {
78
78
  onScroll: syncScroll
79
79
  }), /*#__PURE__*/React.createElement(VariableSizeList, {
@@ -12,7 +12,7 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
12
12
 
13
13
  import React, { createContext, useState, useReducer } from 'react';
14
14
  import PropTypes from 'prop-types';
15
- import { DATE, DROPDOWN, NUMBER, RADIO, CHECKBOX, CLEAR_SINGLE_FILTER, SAVED_FILTERS } from './constants';
15
+ import { DATE, DROPDOWN, NUMBER, RADIO, CHECKBOX, CLEAR_SINGLE_FILTER, SAVED_FILTERS, MULTISELECT } from './constants';
16
16
  export var FilterContext = /*#__PURE__*/createContext();
17
17
  var EventEmitter = {
18
18
  events: {},
@@ -36,7 +36,7 @@ var removeFilterItem = function removeFilterItem(state, index) {
36
36
  return state.splice(index, 1);
37
37
  };
38
38
  var updateFilterState = function updateFilterState(state, type, value) {
39
- if (type === CHECKBOX) {
39
+ if (type === CHECKBOX || type === MULTISELECT) {
40
40
  return;
41
41
  }
42
42
  if (type === DATE) {
@@ -59,7 +59,7 @@ export var clearSingleFilter = function clearSingleFilter(_ref, setAllFilters, s
59
59
  var filterValues = f.value;
60
60
  var filterType = f.type;
61
61
  updateFilterState(tempState, filterType, value);
62
- if (filterType === CHECKBOX) {
62
+ if (filterType === CHECKBOX || filterType === MULTISELECT) {
63
63
  /**
64
64
  When all checkboxes of a group are all unselected the value still exists in the filtersObjectArray
65
65
  This checks if all the checkboxes are selected = false and removes it from the array
@@ -125,15 +125,15 @@ var prepareFiltersForTags = function prepareFiltersForTags(filters, renderDateLa
125
125
  key: id,
126
126
  value: (_renderDateLabel = renderDateLabel === null || renderDateLabel === void 0 ? void 0 : renderDateLabel(startDate, endDate)) !== null && _renderDateLabel !== void 0 ? _renderDateLabel : formatDateRange(startDate, endDate)
127
127
  }, sharedFilterProps));
128
- } else if (type === CHECKBOX) {
129
- value.forEach(function (checkbox) {
130
- if (checkbox.selected) {
128
+ } else if (type === CHECKBOX || type === MULTISELECT) {
129
+ value.forEach(function (option) {
130
+ if (option.selected) {
131
131
  tags.push(_objectSpread(_objectSpread({
132
132
  key: id,
133
- value: checkbox.value
133
+ value: option.value
134
134
  }, sharedFilterProps), {}, {
135
135
  onClose: function onClose() {
136
- return handleSingleFilterRemoval(id, checkbox.value);
136
+ return handleSingleFilterRemoval(id, option.value);
137
137
  }
138
138
  }));
139
139
  }
@@ -19,6 +19,7 @@ export var NUMBER = 'number';
19
19
  export var CHECKBOX = 'checkbox';
20
20
  export var RADIO = 'radio';
21
21
  export var DROPDOWN = 'dropdown';
22
+ export var MULTISELECT = 'multiSelect';
22
23
 
23
24
  /** Constants for event emitters */
24
25
  export var CLEAR_FILTERS = 'clearFilters';
@@ -12,8 +12,8 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
12
12
  */
13
13
 
14
14
  import React, { useState, useRef, useEffect, useCallback, useContext } from 'react';
15
- import { Checkbox, DatePicker, DatePickerInput, Dropdown, FormGroup, NumberInput, RadioButton, RadioButtonGroup } from 'carbon-components-react';
16
- import { INSTANT, BATCH, DATE, CHECKBOX, NUMBER, RADIO, DROPDOWN, PANEL, SAVED_FILTERS } from '../constants';
15
+ import { Checkbox, DatePicker, DatePickerInput, Dropdown, FormGroup, NumberInput, RadioButton, RadioButtonGroup, MultiSelect } from 'carbon-components-react';
16
+ import { INSTANT, BATCH, DATE, CHECKBOX, NUMBER, RADIO, DROPDOWN, PANEL, SAVED_FILTERS, MULTISELECT } from '../constants';
17
17
  import { getInitialStateFromFilters } from '../utils';
18
18
  import { usePreviousValue } from '../../../../../../global/js/hooks';
19
19
  import { FilterContext } from '../FilterProvider';
@@ -114,7 +114,7 @@ var useFilters = function useFilters(_ref) {
114
114
  }
115
115
 
116
116
  // ATTENTION: this is where you would reset or remove individual filters from the filters array
117
- if (type === CHECKBOX) {
117
+ if (type === CHECKBOX || type === MULTISELECT) {
118
118
  /**
119
119
  When all checkboxes of a group are all unselected the value still exists in the filtersObjectArray
120
120
  This checks if all the checkboxes are selected = false and removes it from the array
@@ -324,6 +324,71 @@ var useFilters = function useFilters(_ref) {
324
324
  },
325
325
  light: isPanel
326
326
  }));
327
+ break;
328
+ case MULTISELECT:
329
+ {
330
+ var _filtersState$column3;
331
+ var isStringArray = components.MultiSelect.items.length && typeof components.MultiSelect.items[0] === 'string';
332
+ var selectedFilters = (_filtersState$column3 = filtersState[column]) === null || _filtersState$column3 === void 0 ? void 0 : _filtersState$column3.value.filter(function (i) {
333
+ return i.selected;
334
+ });
335
+ var filteredItems = components.MultiSelect.items.map(function (item) {
336
+ if (selectedFilters.filter(function (a) {
337
+ return isStringArray ? a.id === item : a.id === item.id;
338
+ }).length) {
339
+ return item;
340
+ }
341
+ return null;
342
+ }).filter(Boolean);
343
+ filter = /*#__PURE__*/React.createElement(MultiSelect, _extends({}, components.MultiSelect, {
344
+ selectedItems: filteredItems,
345
+ onChange: function onChange(_ref6) {
346
+ var _components$MultiSele, _components$MultiSele2;
347
+ var selectedItems = _ref6.selectedItems;
348
+ var allOptions = filtersState[column].value;
349
+ // Find selected items from list of options
350
+ var foundItems = selectedItems.map(function (item) {
351
+ if (allOptions.filter(function (option) {
352
+ return isStringArray ? option.id === item : option.id === item.id;
353
+ })) {
354
+ return allOptions.filter(function (option) {
355
+ return isStringArray ? option.id === item : option.id === item.id;
356
+ })[0];
357
+ }
358
+ return null;
359
+ }).filter(Boolean);
360
+
361
+ // Change selected state for those items that have been selected
362
+ allOptions.map(function (a) {
363
+ return a.selected = false;
364
+ });
365
+ foundItems.map(function (item) {
366
+ var foundOriginalItem = allOptions.filter(function (a) {
367
+ return isStringArray ? a === item : a.id === item.id;
368
+ });
369
+ if (foundOriginalItem && foundOriginalItem.length) {
370
+ foundOriginalItem[0].selected = true;
371
+ }
372
+ });
373
+ if (!selectedItems.length) {
374
+ allOptions.map(function (a) {
375
+ return a.selected = false;
376
+ });
377
+ }
378
+ setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, _defineProperty({}, column, {
379
+ value: allOptions,
380
+ type: type
381
+ })));
382
+ applyFilters({
383
+ column: column,
384
+ value: _toConsumableArray(filtersState[column].value),
385
+ type: type
386
+ });
387
+ (_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);
388
+ }
389
+ }));
390
+ break;
391
+ }
327
392
  }
328
393
  return /*#__PURE__*/React.createElement(React.Fragment, {
329
394
  key: column
@@ -5,7 +5,7 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- import { CHECKBOX, DATE, DROPDOWN, FLYOUT, NUMBER, PANEL, RADIO } from './constants';
8
+ import { CHECKBOX, DATE, DROPDOWN, FLYOUT, MULTISELECT, NUMBER, PANEL, RADIO } from './constants';
9
9
  var applyInitialFilters = function applyInitialFilters(filterState, initialFilters) {
10
10
  Object.keys(filterState).forEach(function (key) {
11
11
  var hasInitialFilter = initialFilters.find(function (filter) {
@@ -59,6 +59,17 @@ export var getInitialStateFromFilters = function getInitialStateFromFilters(filt
59
59
  value: '',
60
60
  type: type
61
61
  };
62
+ } else if (type === MULTISELECT) {
63
+ initialFilterState[column] = {
64
+ value: props.MultiSelect.items.map(function (item) {
65
+ return {
66
+ id: typeof item === 'string' ? item : item.id,
67
+ value: typeof item === 'string' ? item : item.text,
68
+ selected: false
69
+ };
70
+ }),
71
+ type: type
72
+ };
62
73
  }
63
74
  };
64
75
  if (variation === FLYOUT) {
@@ -89,13 +89,20 @@ export var stateReducer = function stateReducer(newState, action) {
89
89
  getRowId = _ref3.getRowId,
90
90
  indeterminate = _ref3.indeterminate,
91
91
  isChecked = _ref3.isChecked;
92
+ var newSelectedRowIds = {};
92
93
  if (rows) {
93
94
  var newSelectedRowData = {};
94
95
  rows.forEach(function (row) {
96
+ var props = row.getRowProps();
97
+ if (props && props.disabled) {
98
+ return;
99
+ }
100
+ newSelectedRowIds[getRowId(row.original, row.index)] = true;
95
101
  newSelectedRowData[getRowId(row.original, row.index)] = row.original;
96
102
  });
97
103
  return _objectSpread(_objectSpread({}, newState), {}, {
98
- selectedRowData: indeterminate || !isChecked ? {} : newSelectedRowData
104
+ selectedRowData: indeterminate || !isChecked ? {} : newSelectedRowData,
105
+ selectedRowIds: newSelectedRowIds
99
106
  });
100
107
  }
101
108
  return _objectSpread({}, newState);
@@ -13,7 +13,7 @@ var useDisableSelectRows = function useDisableSelectRows(hooks) {
13
13
  var row = _ref.row,
14
14
  instance = _ref.instance;
15
15
  return [props, {
16
- selectDisabled: instance.shouldDisableSelectRow && instance.shouldDisableSelectRow(row)
16
+ disabled: instance.shouldDisableSelectRow && instance.shouldDisableSelectRow(row)
17
17
  }];
18
18
  };
19
19
  hooks.getRowProps.push(getRowProps);
@@ -12,57 +12,59 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
12
12
 
13
13
  import { useMemo } from 'react';
14
14
  import { FilterFlyout } from './Datagrid/addons/Filtering';
15
- import { BATCH } from './Datagrid/addons/Filtering/constants';
15
+ import { BATCH, CHECKBOX, DATE, MULTISELECT, NUMBER } from './Datagrid/addons/Filtering/constants';
16
+ var handleMultiFilter = function handleMultiFilter(rows, id, value) {
17
+ // gets all the items that are selected and returns their value
18
+ var selectedItems = value.filter(function (item) {
19
+ return item.selected;
20
+ }).map(function (item) {
21
+ return item.value;
22
+ });
23
+
24
+ // if the user removed all checkboxes then display all rows
25
+ if (selectedItems.length === 0) {
26
+ return rows;
27
+ }
28
+ return rows.filter(function (row) {
29
+ var rowValue = row.values[id];
30
+ return selectedItems.includes(rowValue);
31
+ });
32
+ };
16
33
  var useFiltering = function useFiltering(hooks) {
17
34
  /* istanbul ignore next */
18
35
  var filterTypes = useMemo(function () {
19
- return {
20
- date: function date(rows, id, _ref) {
21
- var _ref2 = _slicedToArray(_ref, 2),
22
- startDate = _ref2[0],
23
- endDate = _ref2[1];
24
- return rows.filter(function (row) {
25
- var rowValue = row.values[id];
26
- var startDateObj = _typeof(startDate) === 'object' ? startDate : new Date(startDate);
27
- var endDateObj = _typeof(endDate) === 'object' ? endDate : new Date(endDate);
28
- var rowValueDateObj = _typeof(rowValue) === 'object' ? rowValue : new Date(rowValue);
29
- if (rowValueDateObj.getTime() <= endDateObj.getTime() && rowValueDateObj.getTime() >= startDateObj.getTime()) {
30
- // In date range
31
- return true;
32
- } else {
33
- // Not in date range
34
- return false;
35
- }
36
- });
37
- },
38
- number: function number(rows, id, value) {
39
- if (value === '') {
40
- return rows;
36
+ var _ref3;
37
+ return _ref3 = {}, _defineProperty(_ref3, DATE, function (rows, id, _ref) {
38
+ var _ref2 = _slicedToArray(_ref, 2),
39
+ startDate = _ref2[0],
40
+ endDate = _ref2[1];
41
+ return rows.filter(function (row) {
42
+ var rowValue = row.values[id];
43
+ var startDateObj = _typeof(startDate) === 'object' ? startDate : new Date(startDate);
44
+ var endDateObj = _typeof(endDate) === 'object' ? endDate : new Date(endDate);
45
+ var rowValueDateObj = _typeof(rowValue) === 'object' ? rowValue : new Date(rowValue);
46
+ if (rowValueDateObj.getTime() <= endDateObj.getTime() && rowValueDateObj.getTime() >= startDateObj.getTime()) {
47
+ // In date range
48
+ return true;
49
+ } else {
50
+ // Not in date range
51
+ return false;
41
52
  }
42
- var parsedValue = parseInt(value);
43
- return rows.filter(function (row) {
44
- var rowValue = row.values[id];
45
- return rowValue === parsedValue;
46
- });
47
- },
48
- checkbox: function checkbox(rows, id, value) {
49
- // gets all the items that are selected and returns their value
50
- var selectedItems = value.filter(function (item) {
51
- return item.selected;
52
- }).map(function (item) {
53
- return item.value;
54
- });
55
-
56
- // if the user removed all checkboxes then display all rows
57
- if (selectedItems.length === 0) {
58
- return rows;
59
- }
60
- return rows.filter(function (row) {
61
- var rowValue = row.values[id];
62
- return selectedItems.includes(rowValue);
63
- });
53
+ });
54
+ }), _defineProperty(_ref3, NUMBER, function (rows, id, value) {
55
+ if (value === '') {
56
+ return rows;
64
57
  }
65
- };
58
+ var parsedValue = parseInt(value);
59
+ return rows.filter(function (row) {
60
+ var rowValue = row.values[id];
61
+ return rowValue === parsedValue;
62
+ });
63
+ }), _defineProperty(_ref3, CHECKBOX, function (rows, id, value) {
64
+ return handleMultiFilter(rows, id, value);
65
+ }), _defineProperty(_ref3, MULTISELECT, function (rows, id, value) {
66
+ return handleMultiFilter(rows, id, value);
67
+ }), _ref3;
66
68
  }, []);
67
69
  hooks.useInstance.push(function (instance) {
68
70
  var filterProps = instance.filterProps,
@@ -0,0 +1,39 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ /**
3
+ * Copyright IBM Corp. 2024, 2024
4
+ *
5
+ * This source code is licensed under the Apache-2.0 license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+
9
+ import { useEffect, useState } from 'react';
10
+ import { getNewSortOrder } from './useSortableColumns';
11
+ export var useInitialColumnSort = function useInitialColumnSort(instance) {
12
+ var _useState = useState(false),
13
+ _useState2 = _slicedToArray(_useState, 2),
14
+ hasInitialSort = _useState2[0],
15
+ setHasInitialSort = _useState2[1];
16
+ useEffect(function () {
17
+ var initialState = instance.initialState,
18
+ headers = instance.headers,
19
+ onSort = instance.onSort,
20
+ isTableSortable = instance.isTableSortable;
21
+ var sortableColumn = initialState.sortableColumn;
22
+ var foundSortedCol = headers.some(function (h) {
23
+ return h.isSorted;
24
+ });
25
+ if (foundSortedCol || hasInitialSort || !isTableSortable) {
26
+ return;
27
+ }
28
+ if (sortableColumn) {
29
+ var columnId = sortableColumn.id,
30
+ order = sortableColumn.order;
31
+ var _getNewSortOrder = getNewSortOrder(order),
32
+ newSortDesc = _getNewSortOrder.newSortDesc,
33
+ newOrder = _getNewSortOrder.newOrder;
34
+ onSort === null || onSort === void 0 ? void 0 : onSort(columnId, newOrder);
35
+ instance.toggleSortBy(columnId, newSortDesc, false);
36
+ setHasInitialSort(true);
37
+ }
38
+ }, [instance, hasInitialSort]);
39
+ };
@@ -100,7 +100,7 @@ var SelectRow = function SelectRow(datagridState) {
100
100
  return window.removeEventListener('resize', updateSize);
101
101
  };
102
102
  }, []);
103
- var selectDisabled = isFetching || row.getRowProps().selectDisabled;
103
+ var selectDisabled = isFetching || row.getRowProps().disabled;
104
104
  var _row$getToggleRowSele2 = row.getToggleRowSelectedProps(),
105
105
  onChange = _row$getToggleRowSele2.onChange,
106
106
  title = _row$getToggleRowSele2.title,
@@ -124,7 +124,7 @@ var SelectRow = function SelectRow(datagridState) {
124
124
  getRowId: getRowId
125
125
  });
126
126
  };
127
- var rowId = "".concat(tableId, "-").concat(row.index);
127
+ var rowId = "".concat(tableId, "-").concat(row.id, "-").concat(row.index);
128
128
  return /*#__PURE__*/React.createElement(TableSelectRow, _extends({}, cellProps, selectProps, {
129
129
  radio: radio,
130
130
  onSelect: onSelectHandler,