@carbon/ibm-products 1.44.1 → 1.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/css/index-full-carbon.css +30 -19
  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.css +30 -19
  6. package/css/index-without-carbon.css.map +1 -1
  7. package/css/index-without-carbon.min.css +1 -1
  8. package/css/index-without-carbon.min.css.map +1 -1
  9. package/css/index.css +30 -19
  10. package/css/index.css.map +1 -1
  11. package/css/index.min.css +1 -1
  12. package/css/index.min.css.map +1 -1
  13. package/es/components/Datagrid/Datagrid/DatagridContent.js +2 -2
  14. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterFlyout.js +39 -217
  15. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterPanel.js +61 -258
  16. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterProvider.js +4 -4
  17. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/index.js +10 -1
  18. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/useFilters.js +276 -0
  19. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/useShouldDisableButtons.js +34 -0
  20. package/es/components/Datagrid/Datagrid/addons/Filtering/utils.js +6 -6
  21. package/es/components/Datagrid/useSortableColumns.js +16 -10
  22. package/es/components/Datagrid/utils/DatagridActions.js +6 -38
  23. package/lib/components/Datagrid/Datagrid/DatagridContent.js +2 -2
  24. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterFlyout.js +37 -207
  25. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterPanel.js +60 -255
  26. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterProvider.js +4 -4
  27. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/index.js +15 -1
  28. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/useFilters.js +280 -0
  29. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/useShouldDisableButtons.js +41 -0
  30. package/lib/components/Datagrid/Datagrid/addons/Filtering/utils.js +5 -5
  31. package/lib/components/Datagrid/useSortableColumns.js +9 -3
  32. package/lib/components/Datagrid/utils/DatagridActions.js +6 -38
  33. package/package.json +8 -8
  34. package/scss/components/Datagrid/styles/_datagrid.scss +1 -1
  35. package/scss/components/Datagrid/styles/_useSortableColumns.scss +33 -17
  36. package/scss/components/Datagrid/styles/addons/_RowSizeDropdown.scss +1 -1
@@ -1,28 +1,23 @@
1
- import _extends from "@babel/runtime/helpers/extends";
2
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
- import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
4
2
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
5
- 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; }
6
- 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; }
7
3
  // @flow
8
- /*
9
- * Licensed Materials - Property of IBM
10
- * 5724-Q36
11
- * (c) Copyright IBM Corp. 2022
12
- * US Government Users Restricted Rights - Use, duplication or disclosure
13
- * restricted by GSA ADP Schedule Contract with IBM Corp.
4
+ /**
5
+ * Copyright IBM Corp. 2022, 2023
6
+ *
7
+ * This source code is licensed under the Apache-2.0 license found in the
8
+ * LICENSE file in the root directory of this source tree.
14
9
  */
10
+
15
11
  import { Filter16 } from '@carbon/icons-react';
16
- import { Button, Checkbox, DatePicker, DatePickerInput, Dropdown, FormGroup, NumberInput, RadioButton, RadioButtonGroup } from 'carbon-components-react';
12
+ import { Button } from 'carbon-components-react';
17
13
  import cx from 'classnames';
18
14
  import PropTypes from 'prop-types';
19
- import React, { useCallback, useRef, useState } from 'react';
15
+ import React, { useRef, useState } from 'react';
20
16
  import { useClickOutside } from '../../../../../global/js/hooks';
21
17
  import { pkg } from '../../../../../settings';
22
18
  import { ActionSet } from '../../../../ActionSet';
23
- import { BATCH, CHECKBOX, CLEAR_FILTERS, DATE, DROPDOWN, FLYOUT, INSTANT, NUMBER, RADIO } from './constants';
24
- import { useInitialStateFromFilters, useSubscribeToEventEmitter } from './hooks';
25
- import { getInitialStateFromFilters } from './utils';
19
+ import { BATCH, CLEAR_FILTERS, FLYOUT, INSTANT } from './constants';
20
+ import { useSubscribeToEventEmitter, useFilters, useShouldDisableButtons } from './hooks';
26
21
  var blockClass = "".concat(pkg.prefix, "--datagrid");
27
22
  var componentClass = "".concat(blockClass, "-filter-flyout");
28
23
  var FilterFlyout = function FilterFlyout(_ref) {
@@ -55,20 +50,30 @@ var FilterFlyout = function FilterFlyout(_ref) {
55
50
  _useState2 = _slicedToArray(_useState, 2),
56
51
  open = _useState2[0],
57
52
  setOpen = _useState2[1];
58
- var _useInitialStateFromF = useInitialStateFromFilters(filters, FLYOUT),
59
- _useInitialStateFromF2 = _slicedToArray(_useInitialStateFromF, 2),
60
- filtersState = _useInitialStateFromF2[0],
61
- setFiltersState = _useInitialStateFromF2[1];
62
- var _useState3 = useState([]),
63
- _useState4 = _slicedToArray(_useState3, 2),
64
- filtersObjectArray = _useState4[0],
65
- setFiltersObjectArray = _useState4[1];
53
+ var _useFilters = useFilters({
54
+ updateMethod: updateMethod,
55
+ filters: filters,
56
+ setAllFilters: setAllFilters,
57
+ variation: FLYOUT
58
+ }),
59
+ filtersState = _useFilters.filtersState,
60
+ prevFiltersObjectArrayRef = _useFilters.prevFiltersObjectArrayRef,
61
+ prevFiltersRef = _useFilters.prevFiltersRef,
62
+ revertToPreviousFilters = _useFilters.revertToPreviousFilters,
63
+ reset = _useFilters.reset,
64
+ renderFilter = _useFilters.renderFilter,
65
+ filtersObjectArray = _useFilters.filtersObjectArray;
66
66
 
67
67
  /** Refs */
68
68
  var filterFlyoutRef = useRef(null);
69
- // When using batch actions we have to store the filters to then apply them later
70
- var prevFiltersRef = useRef(JSON.stringify(filtersState));
71
- var prevFiltersObjectArrayRef = useRef(JSON.stringify(filtersObjectArray));
69
+ var _useShouldDisableButt = useShouldDisableButtons({
70
+ initialValue: true,
71
+ filtersState: filtersState,
72
+ prevFiltersRef: prevFiltersRef
73
+ }),
74
+ _useShouldDisableButt2 = _slicedToArray(_useShouldDisableButt, 2),
75
+ shouldDisableButtons = _useShouldDisableButt2[0],
76
+ setShouldDisableButtons = _useShouldDisableButt2[1];
72
77
 
73
78
  /** Memos */
74
79
  var showActionSet = updateMethod === BATCH;
@@ -88,6 +93,9 @@ var FilterFlyout = function FilterFlyout(_ref) {
88
93
  // From the user
89
94
  onApply();
90
95
 
96
+ // When the user clicks apply, the action set buttons should be disabled again
97
+ setShouldDisableButtons(true);
98
+
91
99
  // updates the ref so next time the flyout opens we have records of the previous filters
92
100
  prevFiltersRef.current = JSON.stringify(filtersState);
93
101
  prevFiltersObjectArrayRef.current = JSON.stringify(filtersObjectArray);
@@ -100,75 +108,6 @@ var FilterFlyout = function FilterFlyout(_ref) {
100
108
  }
101
109
  closeFlyout();
102
110
  };
103
- var reset = function reset() {
104
- // Get the initial values for the filters
105
- var initialFiltersState = getInitialStateFromFilters(filters, FLYOUT);
106
- var initialFiltersObjectArray = [];
107
-
108
- // Set the state to the initial values
109
- setFiltersState(initialFiltersState);
110
- setFiltersObjectArray(initialFiltersObjectArray);
111
- setAllFilters([]);
112
-
113
- // Update their respective refs so everything is in sync
114
- prevFiltersRef.current = JSON.stringify(initialFiltersState);
115
- prevFiltersObjectArrayRef.current = JSON.stringify(initialFiltersObjectArray);
116
- };
117
-
118
- // If the user decides to cancel or click outside the flyout, it reverts back to the filters that were
119
- // there when they opened the flyout
120
- var revertToPreviousFilters = function revertToPreviousFilters() {
121
- setFiltersState(JSON.parse(prevFiltersRef.current));
122
- setFiltersObjectArray(JSON.parse(prevFiltersObjectArrayRef.current));
123
- };
124
- var applyFilters = useCallback(function (_ref2) {
125
- var column = _ref2.column,
126
- value = _ref2.value,
127
- type = _ref2.type;
128
- // If no end date is selected return because we need the end date to do computations
129
- if (type === DATE && !value[1]) {
130
- return;
131
- }
132
- var filtersObjectArrayCopy = _toConsumableArray(filtersObjectArray);
133
- // check if the filter already exists in the array
134
- var filter = filtersObjectArrayCopy.find(function (item) {
135
- return item.id === column;
136
- });
137
-
138
- // if filter exists in array then update the filter's new value
139
- if (filter) {
140
- filter.value = value;
141
- } else {
142
- filtersObjectArrayCopy.push({
143
- id: column,
144
- value: value,
145
- type: type
146
- });
147
- }
148
- if (type === CHECKBOX) {
149
- /**
150
- When all checkboxes of a group are all unselected the value still exists in the filtersObjectArray
151
- This checks if all the checkboxes are selected = false and removes it from the array
152
- */
153
- var index = filtersObjectArrayCopy.findIndex(function (filter) {
154
- return filter.id === column;
155
- });
156
-
157
- // If all the selected state is false remove from array
158
- var shouldRemoveFromArray = filtersObjectArrayCopy[index].value.every(function (val) {
159
- return val.selected === false;
160
- });
161
- if (shouldRemoveFromArray) {
162
- filtersObjectArrayCopy.splice(index, 1);
163
- }
164
- }
165
- setFiltersObjectArray(filtersObjectArrayCopy);
166
-
167
- // Automatically apply the filters if the updateMethod is instant
168
- if (updateMethod === INSTANT) {
169
- setAllFilters(filtersObjectArrayCopy);
170
- }
171
- }, [setAllFilters, updateMethod, filtersObjectArray]);
172
111
 
173
112
  /** Effects */
174
113
  useClickOutside(filterFlyoutRef, function (target) {
@@ -181,125 +120,6 @@ var FilterFlyout = function FilterFlyout(_ref) {
181
120
  });
182
121
  useSubscribeToEventEmitter(CLEAR_FILTERS, reset);
183
122
 
184
- /** Render the individual filter component */
185
- var renderFilter = function renderFilter(_ref3) {
186
- var type = _ref3.type,
187
- column = _ref3.column,
188
- components = _ref3.props;
189
- if (type === DATE) {
190
- return /*#__PURE__*/React.createElement(DatePicker, _extends({}, components.DatePicker, {
191
- onChange: function onChange(value) {
192
- var _components$DatePicke, _components$DatePicke2;
193
- setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, _defineProperty({}, column, {
194
- value: value,
195
- type: type
196
- })));
197
- applyFilters({
198
- column: column,
199
- value: value,
200
- type: type
201
- });
202
- (_components$DatePicke = (_components$DatePicke2 = components.DatePicker).onChange) === null || _components$DatePicke === void 0 ? void 0 : _components$DatePicke.call(_components$DatePicke2, value);
203
- },
204
- value: filtersState[column].value,
205
- datePickerType: "range"
206
- }), /*#__PURE__*/React.createElement(DatePickerInput, _extends({
207
- placeholder: "mm/dd/yyyy",
208
- labelText: "Start date"
209
- }, components.DatePickerInput.start)), /*#__PURE__*/React.createElement(DatePickerInput, _extends({
210
- placeholder: "mm/dd/yyyy",
211
- labelText: "End date"
212
- }, components.DatePickerInput.end)));
213
- } else if (type === NUMBER) {
214
- return /*#__PURE__*/React.createElement(NumberInput, _extends({
215
- step: 1,
216
- allowEmpty: true,
217
- hideSteppers: true
218
- }, components.NumberInput, {
219
- onChange: function onChange(event) {
220
- var _components$NumberInp, _components$NumberInp2;
221
- setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, _defineProperty({}, column, {
222
- value: event.target.value,
223
- type: type
224
- })));
225
- applyFilters({
226
- column: column,
227
- value: event.target.value,
228
- type: type
229
- });
230
- (_components$NumberInp = (_components$NumberInp2 = components.NumberInput).onChange) === null || _components$NumberInp === void 0 ? void 0 : _components$NumberInp.call(_components$NumberInp2, event);
231
- },
232
- value: filtersState[column].value
233
- }));
234
- } else if (type === CHECKBOX) {
235
- return /*#__PURE__*/React.createElement(FormGroup, components.FormGroup, filtersState[column].value.map(function (option) {
236
- return /*#__PURE__*/React.createElement(Checkbox, _extends({
237
- key: option.labelText
238
- }, option, {
239
- onChange: function onChange(isSelected) {
240
- var _option$onChange;
241
- var checkboxCopy = filtersState[column].value;
242
- var foundCheckbox = checkboxCopy.find(function (checkbox) {
243
- return checkbox.value === option.value;
244
- });
245
- foundCheckbox.selected = isSelected;
246
- setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, _defineProperty({}, column, {
247
- value: checkboxCopy,
248
- type: type
249
- })));
250
- applyFilters({
251
- column: column,
252
- value: _toConsumableArray(filtersState[column].value),
253
- type: type
254
- });
255
- (_option$onChange = option.onChange) === null || _option$onChange === void 0 ? void 0 : _option$onChange.call(option, isSelected);
256
- },
257
- checked: option.selected
258
- }));
259
- }));
260
- } else if (type === RADIO) {
261
- return /*#__PURE__*/React.createElement(FormGroup, components.FormGroup, /*#__PURE__*/React.createElement(RadioButtonGroup, _extends({}, components.RadioButtonGroup, {
262
- valueSelected: filtersState[column].value,
263
- onChange: function onChange(selected) {
264
- var _components$RadioButt, _components$RadioButt2;
265
- setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, _defineProperty({}, column, {
266
- value: selected,
267
- type: type
268
- })));
269
- applyFilters({
270
- column: column,
271
- value: selected,
272
- type: type
273
- });
274
- (_components$RadioButt = (_components$RadioButt2 = components.RadioButtonGroup).onChange) === null || _components$RadioButt === void 0 ? void 0 : _components$RadioButt.call(_components$RadioButt2, selected);
275
- }
276
- }), components.RadioButton.map(function (radio) {
277
- var _ref4, _radio$id;
278
- return /*#__PURE__*/React.createElement(RadioButton, _extends({
279
- key: (_ref4 = (_radio$id = radio.id) !== null && _radio$id !== void 0 ? _radio$id : radio.labelText) !== null && _ref4 !== void 0 ? _ref4 : radio.value
280
- }, radio));
281
- })));
282
- } else if (type === DROPDOWN) {
283
- return /*#__PURE__*/React.createElement(Dropdown, _extends({}, components.Dropdown, {
284
- selectedItem: filtersState[column].value,
285
- onChange: function onChange(_ref5) {
286
- var _components$Dropdown$, _components$Dropdown;
287
- var selectedItem = _ref5.selectedItem;
288
- setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, _defineProperty({}, column, {
289
- value: selectedItem,
290
- type: type
291
- })));
292
- applyFilters({
293
- column: column,
294
- value: selectedItem,
295
- type: type
296
- });
297
- (_components$Dropdown$ = (_components$Dropdown = components.Dropdown).onChange) === null || _components$Dropdown$ === void 0 ? void 0 : _components$Dropdown$.call(_components$Dropdown, selectedItem);
298
- }
299
- }));
300
- }
301
- };
302
-
303
123
  /** Renders all filters */
304
124
  var renderFilters = function renderFilters() {
305
125
  return filters.map(renderFilter);
@@ -311,13 +131,15 @@ var FilterFlyout = function FilterFlyout(_ref) {
311
131
  kind: 'primary',
312
132
  label: primaryActionLabel,
313
133
  onClick: apply,
314
- isExpressive: false
134
+ isExpressive: false,
135
+ disabled: shouldDisableButtons
315
136
  }, {
316
- key: 3,
137
+ key: 2,
317
138
  kind: 'secondary',
318
139
  label: secondaryActionLabel,
319
140
  onClick: cancel,
320
- isExpressive: false
141
+ isExpressive: false,
142
+ disabled: shouldDisableButtons
321
143
  }],
322
144
  size: "md",
323
145
  buttonSize: "md"