@carbon/ibm-products 1.45.0 → 1.46.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. package/README.md +17 -0
  2. package/css/index-full-carbon.css +38 -21
  3. package/css/index-full-carbon.css.map +1 -1
  4. package/css/index-full-carbon.min.css +4 -2
  5. package/css/index-full-carbon.min.css.map +1 -1
  6. package/css/index-without-carbon.css +38 -21
  7. package/css/index-without-carbon.css.map +1 -1
  8. package/css/index-without-carbon.min.css +4 -2
  9. package/css/index-without-carbon.min.css.map +1 -1
  10. package/css/index.css +38 -21
  11. package/css/index.css.map +1 -1
  12. package/css/index.min.css +4 -2
  13. package/css/index.min.css.map +1 -1
  14. package/es/components/Datagrid/Datagrid/DatagridContent.js +2 -2
  15. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterFlyout.js +18 -228
  16. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterPanel.js +39 -268
  17. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterProvider.js +4 -4
  18. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/index.js +2 -1
  19. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/useFilters.js +276 -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 +2 -2
  23. package/lib/components/Datagrid/Datagrid/DatagridContent.js +2 -2
  24. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterFlyout.js +22 -224
  25. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterPanel.js +44 -265
  26. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterProvider.js +4 -4
  27. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/index.js +8 -1
  28. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/useFilters.js +280 -0
  29. package/lib/components/Datagrid/Datagrid/addons/Filtering/utils.js +5 -5
  30. package/lib/components/Datagrid/useSortableColumns.js +9 -3
  31. package/lib/components/Datagrid/utils/DatagridActions.js +2 -2
  32. package/package.json +8 -8
  33. package/scss/components/Datagrid/styles/_datagrid.scss +2 -4
  34. package/scss/components/Datagrid/styles/_useSortableColumns.scss +33 -17
  35. package/scss/components/OptionsTile/_options-tile.scss +8 -1
@@ -1,9 +1,5 @@
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
4
  /**
9
5
  * Copyright IBM Corp. 2022, 2023
@@ -13,16 +9,15 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
13
9
  */
14
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, useShouldDisableButtons, 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,22 @@ 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));
72
69
  var _useShouldDisableButt = useShouldDisableButtons({
73
70
  initialValue: true,
74
71
  filtersState: filtersState,
@@ -111,88 +108,6 @@ var FilterFlyout = function FilterFlyout(_ref) {
111
108
  }
112
109
  closeFlyout();
113
110
  };
114
- var reset = function reset() {
115
- // Get the initial values for the filters
116
- var initialFiltersState = getInitialStateFromFilters(filters, FLYOUT);
117
- var initialFiltersObjectArray = [];
118
-
119
- // Set the state to the initial values
120
- setFiltersState(initialFiltersState);
121
- setFiltersObjectArray(initialFiltersObjectArray);
122
- setAllFilters([]);
123
-
124
- // Update their respective refs so everything is in sync
125
- prevFiltersRef.current = JSON.stringify(initialFiltersState);
126
- prevFiltersObjectArrayRef.current = JSON.stringify(initialFiltersObjectArray);
127
- };
128
-
129
- // If the user decides to cancel or click outside the flyout, it reverts back to the filters that were
130
- // there when they opened the flyout
131
- var revertToPreviousFilters = function revertToPreviousFilters() {
132
- setFiltersState(JSON.parse(prevFiltersRef.current));
133
- setFiltersObjectArray(JSON.parse(prevFiltersObjectArrayRef.current));
134
- };
135
- var applyFilters = useCallback(function (_ref2) {
136
- var column = _ref2.column,
137
- value = _ref2.value,
138
- type = _ref2.type;
139
- // If no end date is selected return because we need the end date to do computations
140
- if (type === DATE && !value[1]) {
141
- return;
142
- }
143
- var filtersObjectArrayCopy = _toConsumableArray(filtersObjectArray);
144
- // check if the filter already exists in the array
145
- var filter = filtersObjectArrayCopy.find(function (item) {
146
- return item.id === column;
147
- });
148
-
149
- // if filter exists in array then update the filter's new value
150
- if (filter) {
151
- filter.value = value;
152
- } else {
153
- filtersObjectArrayCopy.push({
154
- id: column,
155
- value: value,
156
- type: type
157
- });
158
- }
159
- if (type === CHECKBOX) {
160
- /**
161
- When all checkboxes of a group are all unselected the value still exists in the filtersObjectArray
162
- This checks if all the checkboxes are selected = false and removes it from the array
163
- */
164
- var index = filtersObjectArrayCopy.findIndex(function (filter) {
165
- return filter.id === column;
166
- });
167
-
168
- // If all the selected state is false remove from array
169
- var shouldRemoveFromArray = filtersObjectArrayCopy[index].value.every(function (val) {
170
- return val.selected === false;
171
- });
172
- if (shouldRemoveFromArray) {
173
- filtersObjectArrayCopy.splice(index, 1);
174
- }
175
- } else if (type === DROPDOWN || type === RADIO) {
176
- if (value === 'Any') {
177
- /**
178
- Checks to see if the selected value is 'Any', that means the user wants
179
- to reset specific filter
180
- */
181
- var _index = filtersObjectArrayCopy.findIndex(function (filter) {
182
- return filter.id === column;
183
- });
184
-
185
- // Remove it from the filters array
186
- filtersObjectArrayCopy.splice(_index, 1);
187
- }
188
- }
189
- setFiltersObjectArray(filtersObjectArrayCopy);
190
-
191
- // Automatically apply the filters if the updateMethod is instant
192
- if (updateMethod === INSTANT) {
193
- setAllFilters(filtersObjectArrayCopy);
194
- }
195
- }, [setAllFilters, updateMethod, filtersObjectArray]);
196
111
 
197
112
  /** Effects */
198
113
  useClickOutside(filterFlyoutRef, function (target) {
@@ -205,131 +120,6 @@ var FilterFlyout = function FilterFlyout(_ref) {
205
120
  });
206
121
  useSubscribeToEventEmitter(CLEAR_FILTERS, reset);
207
122
 
208
- /** Render the individual filter component */
209
- var renderFilter = function renderFilter(_ref3) {
210
- var type = _ref3.type,
211
- column = _ref3.column,
212
- components = _ref3.props;
213
- if (type === DATE) {
214
- return /*#__PURE__*/React.createElement(DatePicker, _extends({}, components.DatePicker, {
215
- onChange: function onChange(value) {
216
- var _components$DatePicke, _components$DatePicke2;
217
- setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, _defineProperty({}, column, {
218
- value: value,
219
- type: type
220
- })));
221
- applyFilters({
222
- column: column,
223
- value: value,
224
- type: type
225
- });
226
- (_components$DatePicke = (_components$DatePicke2 = components.DatePicker).onChange) === null || _components$DatePicke === void 0 ? void 0 : _components$DatePicke.call(_components$DatePicke2, value);
227
- },
228
- value: filtersState[column].value,
229
- datePickerType: "range"
230
- }), /*#__PURE__*/React.createElement(DatePickerInput, _extends({
231
- placeholder: "mm/dd/yyyy",
232
- labelText: "Start date"
233
- }, components.DatePickerInput.start)), /*#__PURE__*/React.createElement(DatePickerInput, _extends({
234
- placeholder: "mm/dd/yyyy",
235
- labelText: "End date"
236
- }, components.DatePickerInput.end)));
237
- } else if (type === NUMBER) {
238
- return /*#__PURE__*/React.createElement(NumberInput, _extends({
239
- step: 1,
240
- allowEmpty: true,
241
- hideSteppers: true
242
- }, components.NumberInput, {
243
- onChange: function onChange(event) {
244
- var _components$NumberInp, _components$NumberInp2;
245
- setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, _defineProperty({}, column, {
246
- value: event.target.value,
247
- type: type
248
- })));
249
- applyFilters({
250
- column: column,
251
- value: event.target.value,
252
- type: type
253
- });
254
- (_components$NumberInp = (_components$NumberInp2 = components.NumberInput).onChange) === null || _components$NumberInp === void 0 ? void 0 : _components$NumberInp.call(_components$NumberInp2, event);
255
- },
256
- value: filtersState[column].value
257
- }));
258
- } else if (type === CHECKBOX) {
259
- return /*#__PURE__*/React.createElement(FormGroup, components.FormGroup, filtersState[column].value.map(function (option) {
260
- return /*#__PURE__*/React.createElement(Checkbox, _extends({
261
- key: option.labelText
262
- }, option, {
263
- onChange: function onChange(isSelected) {
264
- var _option$onChange;
265
- var checkboxCopy = filtersState[column].value;
266
- var foundCheckbox = checkboxCopy.find(function (checkbox) {
267
- return checkbox.value === option.value;
268
- });
269
- foundCheckbox.selected = isSelected;
270
- setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, _defineProperty({}, column, {
271
- value: checkboxCopy,
272
- type: type
273
- })));
274
- applyFilters({
275
- column: column,
276
- value: _toConsumableArray(filtersState[column].value),
277
- type: type
278
- });
279
- (_option$onChange = option.onChange) === null || _option$onChange === void 0 ? void 0 : _option$onChange.call(option, isSelected);
280
- },
281
- checked: option.selected
282
- }));
283
- }));
284
- } else if (type === RADIO) {
285
- var _filtersState$column, _filtersState$column2;
286
- return /*#__PURE__*/React.createElement(FormGroup, components.FormGroup, /*#__PURE__*/React.createElement(RadioButtonGroup, _extends({}, components.RadioButtonGroup, {
287
- valueSelected: ((_filtersState$column = filtersState[column]) === null || _filtersState$column === void 0 ? void 0 : _filtersState$column.value) === '' ? 'Any' : (_filtersState$column2 = filtersState[column]) === null || _filtersState$column2 === void 0 ? void 0 : _filtersState$column2.value,
288
- onChange: function onChange(selected) {
289
- var _components$RadioButt, _components$RadioButt2;
290
- setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, _defineProperty({}, column, {
291
- value: selected,
292
- type: type
293
- })));
294
- applyFilters({
295
- column: column,
296
- value: selected,
297
- type: type
298
- });
299
- (_components$RadioButt = (_components$RadioButt2 = components.RadioButtonGroup).onChange) === null || _components$RadioButt === void 0 ? void 0 : _components$RadioButt.call(_components$RadioButt2, selected);
300
- }
301
- }), /*#__PURE__*/React.createElement(RadioButton, {
302
- id: "any",
303
- labelText: "Any",
304
- value: "Any"
305
- }), components.RadioButton.map(function (radio) {
306
- var _ref4, _radio$id;
307
- return /*#__PURE__*/React.createElement(RadioButton, _extends({
308
- key: (_ref4 = (_radio$id = radio.id) !== null && _radio$id !== void 0 ? _radio$id : radio.labelText) !== null && _ref4 !== void 0 ? _ref4 : radio.value
309
- }, radio));
310
- })));
311
- } else if (type === DROPDOWN) {
312
- return /*#__PURE__*/React.createElement(Dropdown, _extends({}, components.Dropdown, {
313
- selectedItem: filtersState[column].value === '' ? 'Any' : filtersState[column].value,
314
- items: ['Any'].concat(_toConsumableArray(components.Dropdown.items)),
315
- onChange: function onChange(_ref5) {
316
- var _components$Dropdown$, _components$Dropdown;
317
- var selectedItem = _ref5.selectedItem;
318
- setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, _defineProperty({}, column, {
319
- value: selectedItem,
320
- type: type
321
- })));
322
- applyFilters({
323
- column: column,
324
- value: selectedItem,
325
- type: type
326
- });
327
- (_components$Dropdown$ = (_components$Dropdown = components.Dropdown).onChange) === null || _components$Dropdown$ === void 0 ? void 0 : _components$Dropdown$.call(_components$Dropdown, selectedItem);
328
- }
329
- }));
330
- }
331
- };
332
-
333
123
  /** Renders all filters */
334
124
  var renderFilters = function renderFilters() {
335
125
  return filters.map(renderFilter);
@@ -344,7 +134,7 @@ var FilterFlyout = function FilterFlyout(_ref) {
344
134
  isExpressive: false,
345
135
  disabled: shouldDisableButtons
346
136
  }, {
347
- key: 3,
137
+ key: 2,
348
138
  kind: 'secondary',
349
139
  label: secondaryActionLabel,
350
140
  onClick: cancel,