@carbon/ibm-products 2.0.0-rc.20 → 2.0.0-rc.21

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. package/README.md +17 -0
  2. package/css/index-full-carbon.css +12 -6
  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 +12 -6
  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 +12 -6
  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 +19 -247
  16. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterPanel.js +41 -285
  17. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterProvider.js +4 -4
  18. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/index.js +1 -0
  19. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/useFilters.js +310 -0
  20. package/es/components/Datagrid/Datagrid/addons/Filtering/utils.js +6 -6
  21. package/es/components/Datagrid/utils/DatagridActions.js +2 -2
  22. package/lib/components/Datagrid/Datagrid/DatagridContent.js +2 -2
  23. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterFlyout.js +22 -243
  24. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterPanel.js +47 -284
  25. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterProvider.js +4 -4
  26. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/index.js +8 -0
  27. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/useFilters.js +325 -0
  28. package/lib/components/Datagrid/Datagrid/addons/Filtering/utils.js +5 -5
  29. package/lib/components/Datagrid/utils/DatagridActions.js +2 -2
  30. package/package.json +2 -2
  31. package/scss/components/Datagrid/styles/_datagrid.scss +2 -4
  32. package/scss/components/OptionsTile/_options-tile.scss +10 -3
@@ -0,0 +1,325 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports.default = void 0;
11
+
12
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
+
14
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
+
16
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
17
+
18
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
19
+
20
+ var _react = _interopRequireWildcard(require("react"));
21
+
22
+ var _react2 = require("@carbon/react");
23
+
24
+ var _constants = require("../constants");
25
+
26
+ var _useInitialStateFromFilters = _interopRequireDefault(require("./useInitialStateFromFilters"));
27
+
28
+ var _utils = require("../utils");
29
+
30
+ 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); }
31
+
32
+ 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; }
33
+
34
+ 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; }
35
+
36
+ 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; }
37
+
38
+ var useFilters = function useFilters(_ref) {
39
+ var updateMethod = _ref.updateMethod,
40
+ _ref$filters = _ref.filters,
41
+ filters = _ref$filters === void 0 ? [] : _ref$filters,
42
+ setAllFilters = _ref.setAllFilters,
43
+ variation = _ref.variation;
44
+
45
+ /** State */
46
+ var _useInitialStateFromF = (0, _useInitialStateFromFilters.default)(filters, variation),
47
+ _useInitialStateFromF2 = (0, _slicedToArray2.default)(_useInitialStateFromF, 2),
48
+ filtersState = _useInitialStateFromF2[0],
49
+ setFiltersState = _useInitialStateFromF2[1];
50
+
51
+ var _useState = (0, _react.useState)([]),
52
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
53
+ filtersObjectArray = _useState2[0],
54
+ setFiltersObjectArray = _useState2[1]; // When using batch actions we have to store the filters to then apply them later
55
+
56
+
57
+ var prevFiltersRef = (0, _react.useRef)(JSON.stringify(filtersState));
58
+ var prevFiltersObjectArrayRef = (0, _react.useRef)(JSON.stringify(filtersObjectArray));
59
+ /** Methods */
60
+ // If the user decides to cancel or click outside the flyout, it reverts back to the filters that were
61
+ // there when they opened the flyout
62
+
63
+ var revertToPreviousFilters = function revertToPreviousFilters() {
64
+ setFiltersState(JSON.parse(prevFiltersRef.current));
65
+ setFiltersObjectArray(JSON.parse(prevFiltersObjectArrayRef.current));
66
+ };
67
+
68
+ var reset = function reset() {
69
+ // Get the initial values for the filters
70
+ var initialFiltersState = (0, _utils.getInitialStateFromFilters)(filters, variation);
71
+ var initialFiltersObjectArray = []; // Set the state to the initial values
72
+
73
+ setFiltersState(initialFiltersState);
74
+ setFiltersObjectArray(initialFiltersObjectArray);
75
+ setAllFilters([]); // Update their respective refs so everything is in sync
76
+
77
+ prevFiltersRef.current = JSON.stringify(initialFiltersState);
78
+ prevFiltersObjectArrayRef.current = JSON.stringify(initialFiltersObjectArray);
79
+ };
80
+
81
+ var applyFilters = function applyFilters(_ref2) {
82
+ var column = _ref2.column,
83
+ value = _ref2.value,
84
+ type = _ref2.type;
85
+
86
+ // If no end date is selected return because we need the end date to do computations
87
+ if (type === _constants.DATE && value.length > 0 && !value[1]) {
88
+ return;
89
+ }
90
+
91
+ var filtersObjectArrayCopy = (0, _toConsumableArray2.default)(filtersObjectArray); // // check if the filter already exists in the array
92
+
93
+ var filter = filtersObjectArrayCopy.find(function (item) {
94
+ return item.id === column;
95
+ }); // // if filter exists in array then update the filter's new value
96
+
97
+ if (filter) {
98
+ filter.value = value;
99
+ } else {
100
+ filtersObjectArrayCopy.push({
101
+ id: column,
102
+ value: value,
103
+ type: type
104
+ });
105
+ } // ATTENTION: this is where you would reset or remove individual filters from the filters array
106
+
107
+
108
+ if (type === _constants.CHECKBOX) {
109
+ /**
110
+ When all checkboxes of a group are all unselected the value still exists in the filtersObjectArray
111
+ This checks if all the checkboxes are selected = false and removes it from the array
112
+ */
113
+ var index = filtersObjectArrayCopy.findIndex(function (filter) {
114
+ return filter.id === column;
115
+ }); // If all the selected state is false remove from array
116
+
117
+ var shouldRemoveFromArray = filtersObjectArrayCopy[index].value.every(function (val) {
118
+ return val.selected === false;
119
+ });
120
+
121
+ if (shouldRemoveFromArray) {
122
+ filtersObjectArrayCopy.splice(index, 1);
123
+ }
124
+ } else if (type === _constants.DATE) {
125
+ if (value.length === 0) {
126
+ /**
127
+ Checks to see if the date value is an empty array, if it is that means the user wants
128
+ to reset the date filter
129
+ */
130
+ var _index = filtersObjectArrayCopy.findIndex(function (filter) {
131
+ return filter.id === column;
132
+ }); // Remove it from the filters array since there is nothing to filter
133
+
134
+
135
+ filtersObjectArrayCopy.splice(_index, 1);
136
+ }
137
+ } else if (type === _constants.DROPDOWN || type === _constants.RADIO) {
138
+ if (value === 'Any') {
139
+ /**
140
+ Checks to see if the selected value is 'Any', that means the user wants
141
+ to reset specific filter
142
+ */
143
+ var _index2 = filtersObjectArrayCopy.findIndex(function (filter) {
144
+ return filter.id === column;
145
+ }); // Remove it from the filters array
146
+
147
+
148
+ filtersObjectArrayCopy.splice(_index2, 1);
149
+ }
150
+ }
151
+
152
+ setFiltersObjectArray(filtersObjectArrayCopy); // // Automatically apply the filters if the updateMethod is instant
153
+
154
+ if (updateMethod === _constants.INSTANT) {
155
+ setAllFilters(filtersObjectArrayCopy);
156
+ }
157
+ };
158
+ /** Render the individual filter component */
159
+
160
+
161
+ var renderFilter = function renderFilter(_ref3) {
162
+ var _filtersState$column, _filtersState$column2, _filtersState$column3, _filtersState$column4;
163
+
164
+ var type = _ref3.type,
165
+ column = _ref3.column,
166
+ components = _ref3.props;
167
+ var isPanel = variation === _constants.PANEL;
168
+ var filter;
169
+
170
+ switch (type) {
171
+ case _constants.DATE:
172
+ filter = /*#__PURE__*/_react.default.createElement(_react2.DatePicker, (0, _extends2.default)({}, components.DatePicker, {
173
+ onChange: function onChange(value) {
174
+ var _components$DatePicke, _components$DatePicke2;
175
+
176
+ setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, (0, _defineProperty2.default)({}, column, {
177
+ value: value,
178
+ type: type
179
+ })));
180
+ applyFilters({
181
+ column: column,
182
+ value: value,
183
+ type: type
184
+ });
185
+ (_components$DatePicke = (_components$DatePicke2 = components.DatePicker).onChange) === null || _components$DatePicke === void 0 ? void 0 : _components$DatePicke.call(_components$DatePicke2, value);
186
+ },
187
+ value: filtersState[column].value,
188
+ datePickerType: "range"
189
+ }), /*#__PURE__*/_react.default.createElement(_react2.DatePickerInput, (0, _extends2.default)({
190
+ placeholder: "mm/dd/yyyy",
191
+ labelText: "Start date"
192
+ }, components.DatePickerInput.start)), /*#__PURE__*/_react.default.createElement(_react2.DatePickerInput, (0, _extends2.default)({
193
+ placeholder: "mm/dd/yyyy",
194
+ labelText: "End date"
195
+ }, components.DatePickerInput.end)));
196
+ break;
197
+
198
+ case _constants.NUMBER:
199
+ filter = /*#__PURE__*/_react.default.createElement(_react2.NumberInput, (0, _extends2.default)({
200
+ step: 1,
201
+ allowEmpty: true,
202
+ hideSteppers: true
203
+ }, components.NumberInput, {
204
+ onChange: function onChange(event) {
205
+ var _components$NumberInp, _components$NumberInp2;
206
+
207
+ setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, (0, _defineProperty2.default)({}, column, {
208
+ value: event.target.value,
209
+ type: type
210
+ })));
211
+ applyFilters({
212
+ column: column,
213
+ value: event.target.value,
214
+ type: type
215
+ });
216
+ (_components$NumberInp = (_components$NumberInp2 = components.NumberInput).onChange) === null || _components$NumberInp === void 0 ? void 0 : _components$NumberInp.call(_components$NumberInp2, event);
217
+ },
218
+ value: filtersState[column].value
219
+ }));
220
+ break;
221
+
222
+ case _constants.CHECKBOX:
223
+ filter = /*#__PURE__*/_react.default.createElement(_react2.FormGroup, components.FormGroup, filtersState[column].value.map(function (option) {
224
+ return /*#__PURE__*/_react.default.createElement(_react2.Checkbox, (0, _extends2.default)({
225
+ key: option.labelText
226
+ }, option, {
227
+ onChange: function onChange(_, _ref4) {
228
+ var _option$onChange;
229
+
230
+ var isSelected = _ref4.checked;
231
+ var checkboxCopy = filtersState[column].value;
232
+ var foundCheckbox = checkboxCopy.find(function (checkbox) {
233
+ return checkbox.value === option.value;
234
+ });
235
+ foundCheckbox.selected = isSelected;
236
+ setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, (0, _defineProperty2.default)({}, column, {
237
+ value: checkboxCopy,
238
+ type: type
239
+ })));
240
+ applyFilters({
241
+ column: column,
242
+ value: (0, _toConsumableArray2.default)(filtersState[column].value),
243
+ type: type
244
+ });
245
+ (_option$onChange = option.onChange) === null || _option$onChange === void 0 ? void 0 : _option$onChange.call(option, isSelected);
246
+ },
247
+ checked: option.selected
248
+ }));
249
+ }));
250
+ break;
251
+
252
+ case _constants.RADIO:
253
+ filter = /*#__PURE__*/_react.default.createElement(_react2.FormGroup, components.FormGroup, /*#__PURE__*/_react.default.createElement(_react2.RadioButtonGroup, (0, _extends2.default)({}, components.RadioButtonGroup, {
254
+ 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,
255
+ onChange: function onChange(selected) {
256
+ var _components$RadioButt, _components$RadioButt2;
257
+
258
+ setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, (0, _defineProperty2.default)({}, column, {
259
+ value: selected,
260
+ type: type
261
+ })));
262
+ applyFilters({
263
+ column: column,
264
+ value: selected,
265
+ type: type
266
+ });
267
+ (_components$RadioButt = (_components$RadioButt2 = components.RadioButtonGroup).onChange) === null || _components$RadioButt === void 0 ? void 0 : _components$RadioButt.call(_components$RadioButt2, selected);
268
+ }
269
+ }), /*#__PURE__*/_react.default.createElement(_react2.RadioButton, {
270
+ id: "any",
271
+ labelText: "Any",
272
+ value: "Any"
273
+ }), components.RadioButton.map(function (radio) {
274
+ var _ref5, _radio$id;
275
+
276
+ return /*#__PURE__*/_react.default.createElement(_react2.RadioButton, (0, _extends2.default)({
277
+ key: (_ref5 = (_radio$id = radio.id) !== null && _radio$id !== void 0 ? _radio$id : radio.labelText) !== null && _ref5 !== void 0 ? _ref5 : radio.value
278
+ }, radio));
279
+ })));
280
+ break;
281
+
282
+ case _constants.DROPDOWN:
283
+ filter = /*#__PURE__*/_react.default.createElement(_react2.Dropdown, (0, _extends2.default)({}, components.Dropdown, {
284
+ selectedItem: ((_filtersState$column3 = filtersState[column]) === null || _filtersState$column3 === void 0 ? void 0 : _filtersState$column3.value) === '' ? 'Any' : (_filtersState$column4 = filtersState[column]) === null || _filtersState$column4 === void 0 ? void 0 : _filtersState$column4.value,
285
+ items: ['Any'].concat((0, _toConsumableArray2.default)(components.Dropdown.items)),
286
+ onChange: function onChange(_ref6) {
287
+ var _components$Dropdown$, _components$Dropdown;
288
+
289
+ var selectedItem = _ref6.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
+ break;
303
+ }
304
+
305
+ if (isPanel) {
306
+ return /*#__PURE__*/_react.default.createElement(_react2.Layer, null, filter);
307
+ }
308
+
309
+ return filter;
310
+ };
311
+
312
+ return {
313
+ filtersState: filtersState,
314
+ setFiltersState: setFiltersState,
315
+ prevFiltersObjectArrayRef: prevFiltersObjectArrayRef,
316
+ prevFiltersRef: prevFiltersRef,
317
+ revertToPreviousFilters: revertToPreviousFilters,
318
+ reset: reset,
319
+ renderFilter: renderFilter,
320
+ filtersObjectArray: filtersObjectArray
321
+ };
322
+ };
323
+
324
+ var _default = useFilters;
325
+ exports.default = _default;
@@ -23,7 +23,7 @@ var getInitialStateFromFilters = function getInitialStateFromFilters(filters) {
23
23
  column = _ref.column,
24
24
  props = _ref.props;
25
25
 
26
- if (type === 'checkbox') {
26
+ if (type === _constants.CHECKBOX) {
27
27
  initialFilterState[column] = {
28
28
  value: props.Checkbox.map(function (_ref2) {
29
29
  var id = _ref2.id,
@@ -38,22 +38,22 @@ var getInitialStateFromFilters = function getInitialStateFromFilters(filters) {
38
38
  }),
39
39
  type: type
40
40
  };
41
- } else if (type === 'date') {
41
+ } else if (type === _constants.DATE) {
42
42
  initialFilterState[column] = {
43
43
  value: [null, null],
44
44
  type: type
45
45
  };
46
- } else if (type === 'number') {
46
+ } else if (type === _constants.NUMBER) {
47
47
  initialFilterState[column] = {
48
48
  value: '',
49
49
  type: type
50
50
  };
51
- } else if (type === 'radio') {
51
+ } else if (type === _constants.RADIO) {
52
52
  initialFilterState[column] = {
53
53
  value: '',
54
54
  type: type
55
55
  };
56
- } else if (type === 'dropdown') {
56
+ } else if (type === _constants.DROPDOWN) {
57
57
  initialFilterState[column] = {
58
58
  value: '',
59
59
  type: type
@@ -41,7 +41,7 @@ var blockClass = "".concat(_settings.pkg.prefix, "--datagrid");
41
41
 
42
42
  var DatagridActions = function DatagridActions(datagridState) {
43
43
  var _useContext = (0, _react.useContext)(_Filtering.FilterContext),
44
- setLeftPanelOpen = _useContext.setLeftPanelOpen;
44
+ setPanelOpen = _useContext.setPanelOpen;
45
45
 
46
46
  var selectedFlatRows = datagridState.selectedFlatRows,
47
47
  setGlobalFilter = datagridState.setGlobalFilter,
@@ -87,7 +87,7 @@ var DatagridActions = function DatagridActions(datagridState) {
87
87
  iconDescription: filterProps.panelIconDescription,
88
88
  className: "".concat(blockClass, "-filter-panel-open-button"),
89
89
  onClick: function onClick() {
90
- return setLeftPanelOpen(function (open) {
90
+ return setPanelOpen(function (open) {
91
91
  return !open;
92
92
  });
93
93
  },
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@carbon/ibm-products",
3
3
  "description": "Carbon for IBM Products",
4
- "version": "2.0.0-rc.20",
4
+ "version": "2.0.0-rc.21",
5
5
  "license": "Apache-2.0",
6
6
  "main": "lib/index.js",
7
7
  "module": "es/index.js",
@@ -94,5 +94,5 @@
94
94
  "react": "^16.8.6 || ^17.0.1",
95
95
  "react-dom": "^16.8.6 || ^17.0.1"
96
96
  },
97
- "gitHead": "7cc1856159813001293987ec197c8e1a2db85123"
97
+ "gitHead": "18e39051d3cdcf186d14a87665f958dd14429927"
98
98
  }
@@ -445,7 +445,9 @@
445
445
  }
446
446
 
447
447
  .#{$block-class}__table-toolbar {
448
+ display: flex;
448
449
  flex: 1 0 auto;
450
+ align-items: flex-end;
449
451
  }
450
452
 
451
453
  .#{c4p-settings.$carbon-prefix}--table-toolbar {
@@ -456,10 +458,6 @@
456
458
  flex: 1 1 100%;
457
459
  }
458
460
 
459
- .#{c4p-settings.$carbon-prefix}--table-toolbar {
460
- padding-top: $spacing-07;
461
- }
462
-
463
461
  .#{$block-class}__toolbar-divider {
464
462
  position: relative;
465
463
  }
@@ -21,12 +21,19 @@
21
21
  $block-class: #{c4p-settings.$pkg-prefix}--options-tile;
22
22
 
23
23
  .#{$block-class} {
24
- border-bottom: 1px solid $border-subtle-01;
25
- background-color: $layer-01;
24
+ position: relative;
25
+ border-bottom: 1px solid $border-subtle;
26
+ background-color: $layer;
26
27
  }
27
28
 
28
29
  .#{$block-class}__toggle-container {
29
- position: relative;
30
+ position: absolute;
31
+ top: 0;
32
+ right: 0;
33
+ bottom: 0;
34
+ width: calc(
35
+ #{$spacing-05} + 2rem + #{$spacing-05}
36
+ ); // spacing + toggle width + spacing
30
37
  }
31
38
 
32
39
  .#{$block-class}__toggle {