@carbon/ibm-products 1.44.1 → 1.46.0

Sign up to get free protection for your applications and to get access to all the features.
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"