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