@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
@@ -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"