@carbon/ibm-products 1.42.1 → 1.44.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. package/css/index-full-carbon.css +158 -24
  2. package/css/index-full-carbon.css.map +1 -1
  3. package/css/index-full-carbon.min.css +2 -2
  4. package/css/index-full-carbon.min.css.map +1 -1
  5. package/css/index-without-carbon.css +158 -24
  6. package/css/index-without-carbon.css.map +1 -1
  7. package/css/index-without-carbon.min.css +2 -2
  8. package/css/index-without-carbon.min.css.map +1 -1
  9. package/css/index.css +158 -24
  10. package/css/index.css.map +1 -1
  11. package/css/index.min.css +2 -2
  12. package/css/index.min.css.map +1 -1
  13. package/es/components/AddSelect/AddSelect.js +1 -1
  14. package/es/components/AddSelect/AddSelectBody.js +1 -1
  15. package/es/components/AddSelect/AddSelectColumn.js +1 -1
  16. package/es/components/Datagrid/Datagrid/Datagrid.js +3 -3
  17. package/es/components/Datagrid/Datagrid/DatagridContent.js +43 -15
  18. package/es/components/Datagrid/Datagrid/DatagridToolbar.js +2 -18
  19. package/es/components/Datagrid/Datagrid/DraggableElement.js +6 -4
  20. package/es/components/Datagrid/Datagrid/addons/CustomizeColumns/Columns.js +6 -2
  21. package/es/components/Datagrid/Datagrid/addons/CustomizeColumns/CustomizeColumnsTearsheet.js +1 -1
  22. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterFlyout.js +65 -34
  23. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterPanel.js +436 -0
  24. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterProvider.js +8 -2
  25. package/es/components/Datagrid/Datagrid/addons/Filtering/constants.js +9 -1
  26. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/index.js +2 -0
  27. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/useInitialStateFromFilters.js +3 -1
  28. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/useSubscribeToEventEmitter.js +23 -0
  29. package/es/components/Datagrid/Datagrid/addons/Filtering/index.js +3 -1
  30. package/es/components/Datagrid/Datagrid/addons/Filtering/motion/variants.js +55 -0
  31. package/es/components/Datagrid/Datagrid/addons/Filtering/utils.js +49 -17
  32. package/es/components/Datagrid/Datagrid.stories/index.js +0 -1
  33. package/es/components/Datagrid/useFiltering.js +10 -3
  34. package/es/components/Datagrid/utils/DatagridActions.js +59 -6
  35. package/lib/components/AddSelect/AddSelect.js +1 -1
  36. package/lib/components/AddSelect/AddSelectBody.js +1 -1
  37. package/lib/components/AddSelect/AddSelectColumn.js +1 -1
  38. package/lib/components/Datagrid/Datagrid/Datagrid.js +3 -3
  39. package/lib/components/Datagrid/Datagrid/DatagridContent.js +43 -15
  40. package/lib/components/Datagrid/Datagrid/DatagridToolbar.js +2 -17
  41. package/lib/components/Datagrid/Datagrid/DraggableElement.js +5 -3
  42. package/lib/components/Datagrid/Datagrid/addons/CustomizeColumns/Columns.js +6 -2
  43. package/lib/components/Datagrid/Datagrid/addons/CustomizeColumns/CustomizeColumnsTearsheet.js +1 -1
  44. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterFlyout.js +64 -31
  45. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterPanel.js +445 -0
  46. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterProvider.js +7 -1
  47. package/lib/components/Datagrid/Datagrid/addons/Filtering/constants.js +15 -3
  48. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/index.js +20 -0
  49. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/useInitialStateFromFilters.js +3 -1
  50. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/useSubscribeToEventEmitter.js +30 -0
  51. package/lib/components/Datagrid/Datagrid/addons/Filtering/index.js +21 -1
  52. package/lib/components/Datagrid/Datagrid/addons/Filtering/motion/variants.js +64 -0
  53. package/lib/components/Datagrid/Datagrid/addons/Filtering/utils.js +48 -17
  54. package/lib/components/Datagrid/Datagrid.stories/index.js +0 -7
  55. package/lib/components/Datagrid/useFiltering.js +10 -3
  56. package/lib/components/Datagrid/utils/DatagridActions.js +57 -4
  57. package/package.json +2 -2
  58. package/scss/components/Datagrid/styles/_datagrid.scss +18 -18
  59. package/scss/components/Datagrid/styles/_draggableElement.scss +16 -4
  60. package/scss/components/Datagrid/styles/_index.scss +1 -0
  61. package/scss/components/Datagrid/styles/_useInlineEdit.scss +7 -3
  62. package/scss/components/Datagrid/styles/addons/_CustomizeColumnsTearsheet.scss +5 -1
  63. package/scss/components/Datagrid/styles/addons/_FilterPanel.scss +123 -0
  64. package/scss/components/FilterSummary/_filter-summary.scss +1 -0
  65. package/es/components/Datagrid/Datagrid.stories/LeftPanelStory.js +0 -6
  66. package/lib/components/Datagrid/Datagrid.stories/LeftPanelStory.js +0 -13
@@ -19,8 +19,7 @@ var _hooks = require("../../../../../global/js/hooks");
19
19
  var _settings = require("../../../../../settings");
20
20
  var _ActionSet = require("../../../../ActionSet");
21
21
  var _constants = require("./constants");
22
- var _FilterProvider = require("./FilterProvider");
23
- var _useInitialStateFromFilters = _interopRequireDefault(require("./hooks/useInitialStateFromFilters"));
22
+ var _hooks2 = require("./hooks");
24
23
  var _utils = require("./utils");
25
24
  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); }
26
25
  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; }
@@ -50,17 +49,15 @@ var FilterFlyout = function FilterFlyout(_ref) {
50
49
  onCancel = _ref$onCancel === void 0 ? function () {} : _ref$onCancel,
51
50
  _ref$secondaryActionL = _ref.secondaryActionLabel,
52
51
  secondaryActionLabel = _ref$secondaryActionL === void 0 ? 'Cancel' : _ref$secondaryActionL,
53
- setAllFilters = _ref.setAllFilters;
54
- /** Context state and methods */
55
- var _useContext = (0, _react.useContext)(_FilterProvider.FilterContext),
56
- EventEmitter = _useContext.EventEmitter;
57
-
52
+ setAllFilters = _ref.setAllFilters,
53
+ _ref$data = _ref.data,
54
+ data = _ref$data === void 0 ? [] : _ref$data;
58
55
  /** State */
59
56
  var _useState = (0, _react.useState)(false),
60
57
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
61
58
  open = _useState2[0],
62
59
  setOpen = _useState2[1];
63
- var _useInitialStateFromF = (0, _useInitialStateFromFilters.default)(filters),
60
+ var _useInitialStateFromF = (0, _hooks2.useInitialStateFromFilters)(filters, _constants.FLYOUT),
64
61
  _useInitialStateFromF2 = (0, _slicedToArray2.default)(_useInitialStateFromF, 2),
65
62
  filtersState = _useInitialStateFromF2[0],
66
63
  setFiltersState = _useInitialStateFromF2[1];
@@ -90,6 +87,7 @@ var FilterFlyout = function FilterFlyout(_ref) {
90
87
  var apply = function apply() {
91
88
  setAllFilters(filtersObjectArray);
92
89
  closeFlyout();
90
+ // From the user
93
91
  onApply();
94
92
 
95
93
  // updates the ref so next time the flyout opens we have records of the previous filters
@@ -106,7 +104,7 @@ var FilterFlyout = function FilterFlyout(_ref) {
106
104
  };
107
105
  var reset = function reset() {
108
106
  // Get the initial values for the filters
109
- var initialFiltersState = (0, _utils.getInitialStateFromFilters)(filters);
107
+ var initialFiltersState = (0, _utils.getInitialStateFromFilters)(filters, _constants.FLYOUT);
110
108
  var initialFiltersObjectArray = [];
111
109
 
112
110
  // Set the state to the initial values
@@ -149,6 +147,23 @@ var FilterFlyout = function FilterFlyout(_ref) {
149
147
  type: type
150
148
  });
151
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
+ }
152
167
  setFiltersObjectArray(filtersObjectArrayCopy);
153
168
 
154
169
  // Automatically apply the filters if the updateMethod is instant
@@ -160,18 +175,16 @@ var FilterFlyout = function FilterFlyout(_ref) {
160
175
  /** Effects */
161
176
  (0, _hooks.useClickOutside)(filterFlyoutRef, function (target) {
162
177
  var hasClickedOnDatePicker = target.closest('.flatpickr-calendar');
163
- if (!open || hasClickedOnDatePicker) {
178
+ var hasClickedOnDropdown = target.className === 'bx--list-box__menu-item__option';
179
+ if (!open || hasClickedOnDatePicker || hasClickedOnDropdown) {
164
180
  return;
165
181
  }
166
182
  cancel();
167
183
  });
168
- (0, _react.useEffect)(function subscribeToEmitter() {
169
- // This event is emitted from the DatagridToolbar component when clearFilters is clicked in FilterSummary
170
- EventEmitter.subscribe(_constants.CLEAR_FILTERS, reset);
171
- });
184
+ (0, _hooks2.useSubscribeToEventEmitter)(_constants.CLEAR_FILTERS, reset);
172
185
 
173
186
  /** Render the individual filter component */
174
- var renderFilter = (0, _react.useCallback)(function (_ref3) {
187
+ var renderFilter = function renderFilter(_ref3) {
175
188
  var type = _ref3.type,
176
189
  column = _ref3.column,
177
190
  components = _ref3.props;
@@ -179,7 +192,10 @@ var FilterFlyout = function FilterFlyout(_ref) {
179
192
  return /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.DatePicker, (0, _extends2.default)({}, components.DatePicker, {
180
193
  onChange: function onChange(value) {
181
194
  var _components$DatePicke, _components$DatePicke2;
182
- setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, (0, _defineProperty2.default)({}, column, value)));
195
+ setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, (0, _defineProperty2.default)({}, column, {
196
+ value: value,
197
+ type: type
198
+ })));
183
199
  applyFilters({
184
200
  column: column,
185
201
  value: value,
@@ -187,7 +203,7 @@ var FilterFlyout = function FilterFlyout(_ref) {
187
203
  });
188
204
  (_components$DatePicke = (_components$DatePicke2 = components.DatePicker).onChange) === null || _components$DatePicke === void 0 ? void 0 : _components$DatePicke.call(_components$DatePicke2, value);
189
205
  },
190
- value: filtersState[column],
206
+ value: filtersState[column].value,
191
207
  datePickerType: "range"
192
208
  }), /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.DatePickerInput, (0, _extends2.default)({
193
209
  placeholder: "mm/dd/yyyy",
@@ -204,7 +220,10 @@ var FilterFlyout = function FilterFlyout(_ref) {
204
220
  }, components.NumberInput, {
205
221
  onChange: function onChange(event) {
206
222
  var _components$NumberInp, _components$NumberInp2;
207
- setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, (0, _defineProperty2.default)({}, column, event.target.value)));
223
+ setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, (0, _defineProperty2.default)({}, column, {
224
+ value: event.target.value,
225
+ type: type
226
+ })));
208
227
  applyFilters({
209
228
  column: column,
210
229
  value: event.target.value,
@@ -212,24 +231,27 @@ var FilterFlyout = function FilterFlyout(_ref) {
212
231
  });
213
232
  (_components$NumberInp = (_components$NumberInp2 = components.NumberInput).onChange) === null || _components$NumberInp === void 0 ? void 0 : _components$NumberInp.call(_components$NumberInp2, event);
214
233
  },
215
- value: filtersState[column]
234
+ value: filtersState[column].value
216
235
  }));
217
236
  } else if (type === _constants.CHECKBOX) {
218
- return /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.FormGroup, components.FormGroup, filtersState[column].map(function (option) {
237
+ return /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.FormGroup, components.FormGroup, filtersState[column].value.map(function (option) {
219
238
  return /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.Checkbox, (0, _extends2.default)({
220
239
  key: option.labelText
221
240
  }, option, {
222
241
  onChange: function onChange(isSelected) {
223
242
  var _option$onChange;
224
- var checkboxCopy = filtersState[column];
243
+ var checkboxCopy = filtersState[column].value;
225
244
  var foundCheckbox = checkboxCopy.find(function (checkbox) {
226
245
  return checkbox.value === option.value;
227
246
  });
228
247
  foundCheckbox.selected = isSelected;
229
- setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, (0, _defineProperty2.default)({}, column, checkboxCopy)));
248
+ setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, (0, _defineProperty2.default)({}, column, {
249
+ value: checkboxCopy,
250
+ type: type
251
+ })));
230
252
  applyFilters({
231
253
  column: column,
232
- value: (0, _toConsumableArray2.default)(filtersState[column]),
254
+ value: (0, _toConsumableArray2.default)(filtersState[column].value),
233
255
  type: type
234
256
  });
235
257
  (_option$onChange = option.onChange) === null || _option$onChange === void 0 ? void 0 : _option$onChange.call(option, isSelected);
@@ -239,10 +261,13 @@ var FilterFlyout = function FilterFlyout(_ref) {
239
261
  }));
240
262
  } else if (type === _constants.RADIO) {
241
263
  return /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.FormGroup, components.FormGroup, /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.RadioButtonGroup, (0, _extends2.default)({}, components.RadioButtonGroup, {
242
- valueSelected: filtersState[column],
264
+ valueSelected: filtersState[column].value,
243
265
  onChange: function onChange(selected) {
244
266
  var _components$RadioButt, _components$RadioButt2;
245
- setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, (0, _defineProperty2.default)({}, column, selected)));
267
+ setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, (0, _defineProperty2.default)({}, column, {
268
+ value: selected,
269
+ type: type
270
+ })));
246
271
  applyFilters({
247
272
  column: column,
248
273
  value: selected,
@@ -258,11 +283,14 @@ var FilterFlyout = function FilterFlyout(_ref) {
258
283
  })));
259
284
  } else if (type === _constants.DROPDOWN) {
260
285
  return /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.Dropdown, (0, _extends2.default)({}, components.Dropdown, {
261
- selectedItem: filtersState[column],
286
+ selectedItem: filtersState[column].value,
262
287
  onChange: function onChange(_ref5) {
263
288
  var _components$Dropdown$, _components$Dropdown;
264
289
  var selectedItem = _ref5.selectedItem;
265
- setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, (0, _defineProperty2.default)({}, column, selectedItem)));
290
+ setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, (0, _defineProperty2.default)({}, column, {
291
+ value: selectedItem,
292
+ type: type
293
+ })));
266
294
  applyFilters({
267
295
  column: column,
268
296
  value: selectedItem,
@@ -272,12 +300,12 @@ var FilterFlyout = function FilterFlyout(_ref) {
272
300
  }
273
301
  }));
274
302
  }
275
- }, [filtersState, applyFilters, setFiltersState]);
303
+ };
276
304
 
277
305
  /** Renders all filters */
278
- var renderFilters = (0, _react.useCallback)(function () {
306
+ var renderFilters = function renderFilters() {
279
307
  return filters.map(renderFilter);
280
- }, [filters, renderFilter]);
308
+ };
281
309
  var renderActionSet = function renderActionSet() {
282
310
  return showActionSet && /*#__PURE__*/_react.default.createElement(_ActionSet.ActionSet, {
283
311
  actions: [{
@@ -306,7 +334,8 @@ var FilterFlyout = function FilterFlyout(_ref) {
306
334
  renderIcon: _iconsReact.Filter16,
307
335
  iconDescription: flyoutIconDescription,
308
336
  onClick: open ? closeFlyout : openFlyout,
309
- className: (0, _classnames.default)("".concat(componentClass, "__trigger"), (0, _defineProperty2.default)({}, "".concat(componentClass, "__trigger--open"), open))
337
+ className: (0, _classnames.default)("".concat(componentClass, "__trigger"), (0, _defineProperty2.default)({}, "".concat(componentClass, "__trigger--open"), open)),
338
+ disabled: data.length === 0
310
339
  }), /*#__PURE__*/_react.default.createElement("div", {
311
340
  ref: filterFlyoutRef,
312
341
  className: (0, _classnames.default)(componentClass, (_cx2 = {}, (0, _defineProperty2.default)(_cx2, "".concat(componentClass, "--open"), open), (0, _defineProperty2.default)(_cx2, "".concat(componentClass, "--batch"), showActionSet), (0, _defineProperty2.default)(_cx2, "".concat(componentClass, "--instant"), !showActionSet), _cx2))
@@ -319,6 +348,10 @@ var FilterFlyout = function FilterFlyout(_ref) {
319
348
  }, renderFilters())), renderActionSet()));
320
349
  };
321
350
  FilterFlyout.propTypes = {
351
+ /**
352
+ * All data rows in the table
353
+ */
354
+ data: _propTypes.default.array.isRequired,
322
355
  /**
323
356
  * Array of filters to render
324
357
  */