@carbon/ibm-products 2.0.0-rc.10 → 2.0.0-rc.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. package/css/index-full-carbon.css +102 -1
  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 +102 -1
  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 +93 -1
  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/DataSpreadsheet/DataSpreadsheet.js +1 -4
  14. package/es/components/DataSpreadsheet/utils/handleCellDeletion.js +6 -4
  15. package/es/components/Datagrid/Datagrid/Datagrid.js +7 -3
  16. package/es/components/Datagrid/Datagrid/DatagridContent.js +8 -3
  17. package/es/components/Datagrid/Datagrid/DatagridEmptyBody.js +17 -4
  18. package/es/components/Datagrid/Datagrid/DatagridRow.js +2 -10
  19. package/es/components/Datagrid/Datagrid/DatagridToolbar.js +22 -4
  20. package/es/components/Datagrid/Datagrid/DatagridVirtualBody.js +29 -8
  21. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterFlyout.js +424 -0
  22. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterProvider.js +83 -0
  23. package/es/components/Datagrid/Datagrid/addons/Filtering/constants.js +20 -0
  24. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/useInitialStateFromFilters.js +22 -0
  25. package/es/components/Datagrid/Datagrid/addons/Filtering/index.js +7 -0
  26. package/es/components/Datagrid/Datagrid/addons/Filtering/utils.js +38 -0
  27. package/es/components/Datagrid/index.js +2 -1
  28. package/es/components/Datagrid/useFiltering.js +90 -0
  29. package/es/components/Datagrid/useParentDimensions.js +3 -1
  30. package/es/components/Datagrid/utils/DatagridActions.js +13 -26
  31. package/es/components/Datagrid/utils/getArgTypes.js +5 -0
  32. package/es/components/Datagrid/utils/getInlineEditColumns.js +6 -1
  33. package/es/components/Datagrid/utils/makeData.js +24 -16
  34. package/es/components/FilterSummary/FilterSummary.js +54 -0
  35. package/es/components/FilterSummary/index.js +7 -0
  36. package/lib/components/DataSpreadsheet/DataSpreadsheet.js +1 -4
  37. package/lib/components/DataSpreadsheet/utils/handleCellDeletion.js +6 -4
  38. package/lib/components/Datagrid/Datagrid/Datagrid.js +8 -3
  39. package/lib/components/Datagrid/Datagrid/DatagridContent.js +8 -3
  40. package/lib/components/Datagrid/Datagrid/DatagridEmptyBody.js +17 -4
  41. package/lib/components/Datagrid/Datagrid/DatagridRow.js +2 -19
  42. package/lib/components/Datagrid/Datagrid/DatagridToolbar.js +24 -3
  43. package/lib/components/Datagrid/Datagrid/DatagridVirtualBody.js +31 -8
  44. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterFlyout.js +443 -0
  45. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterProvider.js +104 -0
  46. package/lib/components/Datagrid/Datagrid/addons/Filtering/constants.js +35 -0
  47. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/useInitialStateFromFilters.js +33 -0
  48. package/lib/components/Datagrid/Datagrid/addons/Filtering/index.js +15 -0
  49. package/lib/components/Datagrid/Datagrid/addons/Filtering/utils.js +47 -0
  50. package/lib/components/Datagrid/index.js +9 -1
  51. package/lib/components/Datagrid/useFiltering.js +94 -0
  52. package/lib/components/Datagrid/useParentDimensions.js +3 -1
  53. package/lib/components/Datagrid/utils/DatagridActions.js +13 -25
  54. package/lib/components/Datagrid/utils/getArgTypes.js +5 -0
  55. package/lib/components/Datagrid/utils/getInlineEditColumns.js +6 -1
  56. package/lib/components/Datagrid/utils/makeData.js +26 -18
  57. package/lib/components/FilterSummary/FilterSummary.js +72 -0
  58. package/lib/components/FilterSummary/index.js +15 -0
  59. package/package.json +2 -2
  60. package/scss/components/Datagrid/_datagrid.scss +0 -1
  61. package/scss/components/Datagrid/_storybook-styles.scss +12 -0
  62. package/scss/components/Datagrid/styles/_datagrid.scss +18 -0
  63. package/scss/components/Datagrid/styles/_index.scss +1 -0
  64. package/scss/components/Datagrid/styles/addons/_FilterFlyout.scss +87 -0
  65. package/scss/components/FilterSummary/_filter-summary.scss +20 -0
  66. package/scss/components/FilterSummary/_index.scss +10 -0
  67. package/scss/components/FilterSummary/_storybook-styles.scss +14 -0
  68. package/scss/components/_index.scss +1 -0
@@ -21,6 +21,10 @@ var _react2 = require("@carbon/react");
21
21
 
22
22
  var _settings = require("../../../settings");
23
23
 
24
+ var _DatagridHead = _interopRequireDefault(require("./DatagridHead"));
25
+
26
+ var _layout = require("@carbon/layout");
27
+
24
28
  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
29
 
26
30
  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; }
@@ -46,6 +50,8 @@ var rowSizeMap = {
46
50
  var defaultRowHeight = rowSizeMap.lg;
47
51
 
48
52
  var DatagridVirtualBody = function DatagridVirtualBody(datagridState) {
53
+ var _gridRef$current, _gridRef$current2;
54
+
49
55
  var getTableBodyProps = datagridState.getTableBodyProps,
50
56
  rows = datagridState.rows,
51
57
  prepareRow = datagridState.prepareRow,
@@ -59,7 +65,15 @@ var DatagridVirtualBody = function DatagridVirtualBody(datagridState) {
59
65
  DatagridPagination = datagridState.DatagridPagination,
60
66
  page = datagridState.page,
61
67
  handleResize = datagridState.handleResize,
62
- withOverflowRow = datagridState.withOverflowRow;
68
+ gridRef = datagridState.gridRef;
69
+
70
+ var syncScroll = function syncScroll(e) {
71
+ var virtualBody = e.target;
72
+ document.querySelector(".".concat(blockClass, "__head-warp")).scrollLeft = virtualBody.scrollLeft;
73
+ var spacerColumn = document.querySelector(".".concat(blockClass, "__head-warp thead th:last-child"));
74
+ spacerColumn.style.width = (0, _layout.px)(32 + (virtualBody.offsetWidth - virtualBody.clientWidth)); // scrollbar width to header column to fix header alignment
75
+ };
76
+
63
77
  (0, _react.useEffect)(function () {
64
78
  handleResize();
65
79
  }, [handleResize]);
@@ -70,8 +84,16 @@ var DatagridVirtualBody = function DatagridVirtualBody(datagridState) {
70
84
  }
71
85
 
72
86
  var visibleRows = DatagridPagination && page || rows;
73
- return /*#__PURE__*/_react.default.createElement(TableBody, (0, _extends2.default)({}, getTableBodyProps(), {
74
- onScroll: onScroll
87
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
88
+ className: "".concat(blockClass, "__head-warp"),
89
+ style: {
90
+ width: (_gridRef$current = gridRef.current) === null || _gridRef$current === void 0 ? void 0 : _gridRef$current.clientWidth,
91
+ overflow: 'hidden'
92
+ }
93
+ }, /*#__PURE__*/_react.default.createElement(_DatagridHead.default, datagridState)), /*#__PURE__*/_react.default.createElement(TableBody, (0, _extends2.default)({}, getTableBodyProps(), {
94
+ onScroll: function onScroll(e) {
95
+ return syncScroll(e);
96
+ }
75
97
  }), /*#__PURE__*/_react.default.createElement(_reactWindow.VariableSizeList, {
76
98
  height: virtualHeight || tableHeight,
77
99
  itemCount: visibleRows.length,
@@ -82,20 +104,21 @@ var DatagridVirtualBody = function DatagridVirtualBody(datagridState) {
82
104
  onScroll: onScroll,
83
105
  innerRef: innerListRef,
84
106
  ref: listRef,
85
- className: "".concat(blockClass, "__virtual-scrollbar")
107
+ className: "".concat(blockClass, "__virtual-scrollbar"),
108
+ style: {
109
+ width: (_gridRef$current2 = gridRef.current) === null || _gridRef$current2 === void 0 ? void 0 : _gridRef$current2.clientWidth
110
+ }
86
111
  }, function (_ref) {
87
112
  var index = _ref.index,
88
113
  style = _ref.style;
89
114
  var row = visibleRows[index];
90
115
  prepareRow(row);
91
116
  return /*#__PURE__*/_react.default.createElement("div", {
92
- style: _objectSpread(_objectSpread({}, style), {}, {
93
- overflow: withOverflowRow ? 'visible' : 'hidden'
94
- })
117
+ style: _objectSpread({}, style)
95
118
  }, row.RowRenderer(_objectSpread(_objectSpread({}, datagridState), {}, {
96
119
  row: row
97
120
  })));
98
- }));
121
+ })));
99
122
  };
100
123
 
101
124
  var _default = DatagridVirtualBody;
@@ -0,0 +1,443 @@
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 _icons = require("@carbon/react/icons");
21
+
22
+ var _react = require("@carbon/react");
23
+
24
+ var _classnames = _interopRequireDefault(require("classnames"));
25
+
26
+ var _propTypes = _interopRequireDefault(require("prop-types"));
27
+
28
+ var _react2 = _interopRequireWildcard(require("react"));
29
+
30
+ var _hooks = require("../../../../../global/js/hooks");
31
+
32
+ var _settings = require("../../../../../settings");
33
+
34
+ var _ActionSet = require("../../../../ActionSet");
35
+
36
+ var _constants = require("./constants");
37
+
38
+ var _FilterProvider = require("./FilterProvider");
39
+
40
+ var _useInitialStateFromFilters = _interopRequireDefault(require("./hooks/useInitialStateFromFilters"));
41
+
42
+ var _utils = require("./utils");
43
+
44
+ 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); }
45
+
46
+ 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; }
47
+
48
+ 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; }
49
+
50
+ 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; }
51
+
52
+ var blockClass = "".concat(_settings.pkg.prefix, "--datagrid");
53
+ var componentClass = "".concat(blockClass, "-filter-flyout");
54
+
55
+ var FilterFlyout = function FilterFlyout(_ref) {
56
+ var _cx2;
57
+
58
+ var _ref$updateMethod = _ref.updateMethod,
59
+ updateMethod = _ref$updateMethod === void 0 ? _constants.BATCH : _ref$updateMethod,
60
+ _ref$flyoutIconDescri = _ref.flyoutIconDescription,
61
+ flyoutIconDescription = _ref$flyoutIconDescri === void 0 ? 'Open filters' : _ref$flyoutIconDescri,
62
+ _ref$filters = _ref.filters,
63
+ filters = _ref$filters === void 0 ? [] : _ref$filters,
64
+ _ref$title = _ref.title,
65
+ title = _ref$title === void 0 ? 'Filter' : _ref$title,
66
+ _ref$primaryActionLab = _ref.primaryActionLabel,
67
+ primaryActionLabel = _ref$primaryActionLab === void 0 ? 'Apply' : _ref$primaryActionLab,
68
+ _ref$onFlyoutOpen = _ref.onFlyoutOpen,
69
+ onFlyoutOpen = _ref$onFlyoutOpen === void 0 ? function () {} : _ref$onFlyoutOpen,
70
+ _ref$onFlyoutClose = _ref.onFlyoutClose,
71
+ onFlyoutClose = _ref$onFlyoutClose === void 0 ? function () {} : _ref$onFlyoutClose,
72
+ _ref$onApply = _ref.onApply,
73
+ onApply = _ref$onApply === void 0 ? function () {} : _ref$onApply,
74
+ _ref$onCancel = _ref.onCancel,
75
+ onCancel = _ref$onCancel === void 0 ? function () {} : _ref$onCancel,
76
+ _ref$secondaryActionL = _ref.secondaryActionLabel,
77
+ secondaryActionLabel = _ref$secondaryActionL === void 0 ? 'Cancel' : _ref$secondaryActionL,
78
+ setAllFilters = _ref.setAllFilters;
79
+
80
+ /** Context state and methods */
81
+ var _useContext = (0, _react2.useContext)(_FilterProvider.FilterContext),
82
+ EventEmitter = _useContext.EventEmitter;
83
+ /** State */
84
+
85
+
86
+ var _useState = (0, _react2.useState)(false),
87
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
88
+ open = _useState2[0],
89
+ setOpen = _useState2[1];
90
+
91
+ var _useInitialStateFromF = (0, _useInitialStateFromFilters.default)(filters),
92
+ _useInitialStateFromF2 = (0, _slicedToArray2.default)(_useInitialStateFromF, 2),
93
+ filtersState = _useInitialStateFromF2[0],
94
+ setFiltersState = _useInitialStateFromF2[1];
95
+
96
+ var _useState3 = (0, _react2.useState)([]),
97
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
98
+ filtersObjectArray = _useState4[0],
99
+ setFiltersObjectArray = _useState4[1];
100
+ /** Refs */
101
+
102
+
103
+ var filterFlyoutRef = (0, _react2.useRef)(null); // When using batch actions we have to store the filters to then apply them later
104
+
105
+ var prevFiltersRef = (0, _react2.useRef)(JSON.stringify(filtersState));
106
+ var prevFiltersObjectArrayRef = (0, _react2.useRef)(JSON.stringify(filtersObjectArray));
107
+ /** Memos */
108
+
109
+ var showActionSet = updateMethod === _constants.BATCH;
110
+ /** Methods */
111
+
112
+ var openFlyout = function openFlyout() {
113
+ setOpen(true);
114
+ onFlyoutOpen();
115
+ };
116
+
117
+ var closeFlyout = function closeFlyout() {
118
+ setOpen(false);
119
+ onFlyoutClose();
120
+ };
121
+
122
+ var apply = function apply() {
123
+ setAllFilters(filtersObjectArray);
124
+ closeFlyout();
125
+ onApply(); // updates the ref so next time the flyout opens we have records of the previous filters
126
+
127
+ prevFiltersRef.current = JSON.stringify(filtersState);
128
+ prevFiltersObjectArrayRef.current = JSON.stringify(filtersObjectArray);
129
+ };
130
+
131
+ var cancel = function cancel() {
132
+ // Reverting to previous filters only applies when using batch actions
133
+ if (updateMethod === _constants.BATCH) {
134
+ revertToPreviousFilters();
135
+ onCancel();
136
+ }
137
+
138
+ closeFlyout();
139
+ };
140
+
141
+ var reset = function reset() {
142
+ // Get the initial values for the filters
143
+ var initialFiltersState = (0, _utils.getInitialStateFromFilters)(filters);
144
+ var initialFiltersObjectArray = []; // Set the state to the initial values
145
+
146
+ setFiltersState(initialFiltersState);
147
+ setFiltersObjectArray(initialFiltersObjectArray);
148
+ setAllFilters([]); // Update their respective refs so everything is in sync
149
+
150
+ prevFiltersRef.current = JSON.stringify(initialFiltersState);
151
+ prevFiltersObjectArrayRef.current = JSON.stringify(initialFiltersObjectArray);
152
+ }; // If the user decides to cancel or click outside the flyout, it reverts back to the filters that were
153
+ // there when they opened the flyout
154
+
155
+
156
+ var revertToPreviousFilters = function revertToPreviousFilters() {
157
+ setFiltersState(JSON.parse(prevFiltersRef.current));
158
+ setFiltersObjectArray(JSON.parse(prevFiltersObjectArrayRef.current));
159
+ };
160
+
161
+ var applyFilters = (0, _react2.useCallback)(function (_ref2) {
162
+ var column = _ref2.column,
163
+ value = _ref2.value,
164
+ type = _ref2.type;
165
+
166
+ // If no end date is selected return because we need the end date to do computations
167
+ if (type === _constants.DATE && !value[1]) {
168
+ return;
169
+ }
170
+
171
+ var filtersObjectArrayCopy = (0, _toConsumableArray2.default)(filtersObjectArray); // check if the filter already exists in the array
172
+
173
+ var filter = filtersObjectArrayCopy.find(function (item) {
174
+ return item.id === column;
175
+ }); // if filter exists in array then update the filter's new value
176
+
177
+ if (filter) {
178
+ filter.value = value;
179
+ } else {
180
+ filtersObjectArrayCopy.push({
181
+ id: column,
182
+ value: value,
183
+ type: type
184
+ });
185
+ }
186
+
187
+ setFiltersObjectArray(filtersObjectArrayCopy); // Automatically apply the filters if the updateMethod is instant
188
+
189
+ if (updateMethod === _constants.INSTANT) {
190
+ setAllFilters(filtersObjectArrayCopy);
191
+ }
192
+ }, [setAllFilters, updateMethod, filtersObjectArray]);
193
+ /** Effects */
194
+
195
+ (0, _hooks.useClickOutside)(filterFlyoutRef, function (target) {
196
+ var hasClickedOnDatePicker = target.closest('.flatpickr-calendar');
197
+
198
+ if (!open || hasClickedOnDatePicker) {
199
+ return;
200
+ }
201
+
202
+ cancel();
203
+ });
204
+ (0, _react2.useEffect)(function subscribeToEmitter() {
205
+ // This event is emitted from the DatagridToolbar component when clearFilters is clicked in FilterSummary
206
+ EventEmitter.subscribe(_constants.CLEAR_FILTERS, reset);
207
+ });
208
+ /** Render the individual filter component */
209
+
210
+ var renderFilter = (0, _react2.useCallback)(function (_ref3) {
211
+ var type = _ref3.type,
212
+ column = _ref3.column,
213
+ components = _ref3.props;
214
+ var key = "".concat(type, "-").concat(column, "-").concat(Math.random());
215
+
216
+ if (type === _constants.DATE) {
217
+ return /*#__PURE__*/_react2.default.createElement(_react.DatePicker, (0, _extends2.default)({
218
+ key: key
219
+ }, components.DatePicker, {
220
+ onChange: function onChange(value) {
221
+ var _components$DatePicke, _components$DatePicke2;
222
+
223
+ setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, (0, _defineProperty2.default)({}, column, value)));
224
+ applyFilters({
225
+ column: column,
226
+ value: value,
227
+ type: type
228
+ });
229
+ (_components$DatePicke = (_components$DatePicke2 = components.DatePicker).onChange) === null || _components$DatePicke === void 0 ? void 0 : _components$DatePicke.call(_components$DatePicke2, value);
230
+ },
231
+ value: filtersState[column],
232
+ datePickerType: "range"
233
+ }), /*#__PURE__*/_react2.default.createElement(_react.DatePickerInput, (0, _extends2.default)({
234
+ placeholder: "mm/dd/yyyy",
235
+ labelText: "Start date"
236
+ }, components.DatePickerInput.start)), /*#__PURE__*/_react2.default.createElement(_react.DatePickerInput, (0, _extends2.default)({
237
+ placeholder: "mm/dd/yyyy",
238
+ labelText: "End date"
239
+ }, components.DatePickerInput.end)));
240
+ } else if (type === _constants.NUMBER) {
241
+ return /*#__PURE__*/_react2.default.createElement(_react.NumberInput, (0, _extends2.default)({
242
+ key: key,
243
+ step: 1,
244
+ allowEmpty: true,
245
+ hideSteppers: true
246
+ }, components.NumberInput, {
247
+ onChange: function onChange(event) {
248
+ var _components$NumberInp, _components$NumberInp2;
249
+
250
+ setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, (0, _defineProperty2.default)({}, column, event.target.value)));
251
+ applyFilters({
252
+ column: column,
253
+ value: event.target.value,
254
+ type: type
255
+ });
256
+ (_components$NumberInp = (_components$NumberInp2 = components.NumberInput).onChange) === null || _components$NumberInp === void 0 ? void 0 : _components$NumberInp.call(_components$NumberInp2, event);
257
+ },
258
+ value: filtersState[column]
259
+ }));
260
+ } else if (type === _constants.CHECKBOX) {
261
+ return /*#__PURE__*/_react2.default.createElement(_react.FormGroup, (0, _extends2.default)({
262
+ key: key
263
+ }, components.FormGroup), filtersState[column].map(function (option) {
264
+ return /*#__PURE__*/_react2.default.createElement(_react.Checkbox, (0, _extends2.default)({
265
+ key: option.labelText
266
+ }, option, {
267
+ onChange: function onChange(_, _ref4) {
268
+ var _option$onChange;
269
+
270
+ var checked = _ref4.checked;
271
+ var checkboxCopy = filtersState[column];
272
+ var foundCheckbox = checkboxCopy.find(function (checkbox) {
273
+ return checkbox.value === option.value;
274
+ });
275
+ foundCheckbox.selected = checked;
276
+ setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, (0, _defineProperty2.default)({}, column, checkboxCopy)));
277
+ applyFilters({
278
+ column: column,
279
+ value: (0, _toConsumableArray2.default)(filtersState[column]),
280
+ type: type
281
+ });
282
+ (_option$onChange = option.onChange) === null || _option$onChange === void 0 ? void 0 : _option$onChange.call(option, checked);
283
+ },
284
+ checked: option.selected
285
+ }));
286
+ }));
287
+ } else if (type === _constants.RADIO) {
288
+ return /*#__PURE__*/_react2.default.createElement(_react.FormGroup, (0, _extends2.default)({
289
+ key: key
290
+ }, components.FormGroup), /*#__PURE__*/_react2.default.createElement(_react.RadioButtonGroup, (0, _extends2.default)({}, components.RadioButtonGroup, {
291
+ valueSelected: filtersState[column],
292
+ onChange: function onChange(selected) {
293
+ var _components$RadioButt, _components$RadioButt2;
294
+
295
+ setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, (0, _defineProperty2.default)({}, column, selected)));
296
+ applyFilters({
297
+ column: column,
298
+ value: selected,
299
+ type: type
300
+ });
301
+ (_components$RadioButt = (_components$RadioButt2 = components.RadioButtonGroup).onChange) === null || _components$RadioButt === void 0 ? void 0 : _components$RadioButt.call(_components$RadioButt2, selected);
302
+ }
303
+ }), components.RadioButton.map(function (radio) {
304
+ var _ref5, _radio$id;
305
+
306
+ return /*#__PURE__*/_react2.default.createElement(_react.RadioButton, (0, _extends2.default)({
307
+ key: (_ref5 = (_radio$id = radio.id) !== null && _radio$id !== void 0 ? _radio$id : radio.labelText) !== null && _ref5 !== void 0 ? _ref5 : radio.value
308
+ }, radio));
309
+ })));
310
+ } else if (type === _constants.DROPDOWN) {
311
+ return /*#__PURE__*/_react2.default.createElement(_react.Dropdown, (0, _extends2.default)({
312
+ key: key
313
+ }, components.Dropdown, {
314
+ selectedItem: filtersState[column],
315
+ onChange: function onChange(_ref6) {
316
+ var _components$Dropdown$, _components$Dropdown;
317
+
318
+ var selectedItem = _ref6.selectedItem;
319
+ setFiltersState(_objectSpread(_objectSpread({}, filtersState), {}, (0, _defineProperty2.default)({}, column, selectedItem)));
320
+ applyFilters({
321
+ column: column,
322
+ value: selectedItem,
323
+ type: type
324
+ });
325
+ (_components$Dropdown$ = (_components$Dropdown = components.Dropdown).onChange) === null || _components$Dropdown$ === void 0 ? void 0 : _components$Dropdown$.call(_components$Dropdown, selectedItem);
326
+ }
327
+ }));
328
+ }
329
+ }, [filtersState, applyFilters, setFiltersState]);
330
+ /** Renders all filters */
331
+
332
+ var renderFilters = function renderFilters() {
333
+ return filters.map(renderFilter);
334
+ };
335
+
336
+ var renderActionSet = function renderActionSet() {
337
+ return showActionSet && /*#__PURE__*/_react2.default.createElement(_ActionSet.ActionSet, {
338
+ actions: [{
339
+ key: 1,
340
+ kind: 'primary',
341
+ label: primaryActionLabel,
342
+ onClick: apply,
343
+ isExpressive: false
344
+ }, {
345
+ key: 3,
346
+ kind: 'secondary',
347
+ label: secondaryActionLabel,
348
+ onClick: cancel,
349
+ isExpressive: false
350
+ }],
351
+ size: "md",
352
+ buttonSize: "md"
353
+ });
354
+ };
355
+
356
+ return /*#__PURE__*/_react2.default.createElement("div", {
357
+ className: "".concat(componentClass, "__container")
358
+ }, /*#__PURE__*/_react2.default.createElement(_react.Button, {
359
+ kind: "ghost",
360
+ hasIconOnly: true,
361
+ tooltipPosition: "bottom",
362
+ renderIcon: function renderIcon() {
363
+ return /*#__PURE__*/_react2.default.createElement(_icons.Filter, {
364
+ size: 16
365
+ });
366
+ },
367
+ iconDescription: flyoutIconDescription,
368
+ onClick: open ? closeFlyout : openFlyout,
369
+ className: (0, _classnames.default)("".concat(componentClass, "__trigger"), (0, _defineProperty2.default)({}, "".concat(componentClass, "__trigger--open"), open))
370
+ }), /*#__PURE__*/_react2.default.createElement("div", {
371
+ ref: filterFlyoutRef,
372
+ 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))
373
+ }, /*#__PURE__*/_react2.default.createElement("div", {
374
+ className: "".concat(componentClass, "__inner-container")
375
+ }, /*#__PURE__*/_react2.default.createElement("span", {
376
+ className: "".concat(componentClass, "__title")
377
+ }, title), /*#__PURE__*/_react2.default.createElement("div", {
378
+ className: "".concat(componentClass, "__filters")
379
+ }, renderFilters())), renderActionSet()));
380
+ };
381
+
382
+ FilterFlyout.propTypes = {
383
+ /**
384
+ * Array of filters to render
385
+ */
386
+ filters: _propTypes.default.arrayOf(_propTypes.default.shape({
387
+ type: _propTypes.default.string.isRequired,
388
+ column: _propTypes.default.string.isRequired,
389
+ props: _propTypes.default.object.isRequired
390
+ })).isRequired,
391
+
392
+ /**
393
+ * Icon description for the filter flyout button
394
+ */
395
+ flyoutIconDescription: _propTypes.default.string,
396
+
397
+ /**
398
+ * Callback when the apply button is clicked
399
+ */
400
+ onApply: _propTypes.default.func,
401
+
402
+ /**
403
+ * Callback when the cancel button is clicked
404
+ */
405
+ onCancel: _propTypes.default.func,
406
+
407
+ /**
408
+ * Callback when the flyout closes
409
+ */
410
+ onFlyoutClose: _propTypes.default.func,
411
+
412
+ /**
413
+ * Callback when the flyout opens
414
+ */
415
+ onFlyoutOpen: _propTypes.default.func,
416
+
417
+ /**
418
+ * Label text of the primary action in the flyout
419
+ */
420
+ primaryActionLabel: _propTypes.default.string,
421
+
422
+ /**
423
+ * Label text of the secondary action in the flyout
424
+ */
425
+ secondaryActionLabel: _propTypes.default.string,
426
+
427
+ /**
428
+ * Function that sets all the filters, this comes from the datagridState
429
+ */
430
+ setAllFilters: _propTypes.default.func.isRequired,
431
+
432
+ /**
433
+ * Title of the filter flyout
434
+ */
435
+ title: _propTypes.default.string,
436
+
437
+ /**
438
+ * The update method used to apply the filters
439
+ */
440
+ updateMethod: _propTypes.default.oneOf([_constants.BATCH, _constants.INSTANT]).isRequired
441
+ };
442
+ var _default = FilterFlyout;
443
+ exports.default = _default;
@@ -0,0 +1,104 @@
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.FilterProvider = exports.FilterContext = void 0;
11
+
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+
14
+ var _react = _interopRequireWildcard(require("react"));
15
+
16
+ var _propTypes = _interopRequireDefault(require("prop-types"));
17
+
18
+ var _constants = require("./constants");
19
+
20
+ 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); }
21
+
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; }
23
+
24
+ /**
25
+ * Copyright IBM Corp. 2022, 2022
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
+ var FilterContext = /*#__PURE__*/(0, _react.createContext)();
31
+ exports.FilterContext = FilterContext;
32
+ var EventEmitter = {
33
+ events: {},
34
+ dispatch: function dispatch(event, data) {
35
+ if (!this.events[event]) {
36
+ return;
37
+ }
38
+
39
+ this.events[event].forEach(function (callback) {
40
+ return callback(data);
41
+ });
42
+ },
43
+ subscribe: function subscribe(event, callback) {
44
+ if (!this.events[event]) {
45
+ this.events[event] = [];
46
+ } else {
47
+ this.events[event].push(callback);
48
+ }
49
+ }
50
+ };
51
+
52
+ var prepareFiltersForTags = function prepareFiltersForTags(filters) {
53
+ var tags = [];
54
+ filters.forEach(function (_ref) {
55
+ var id = _ref.id,
56
+ type = _ref.type,
57
+ value = _ref.value;
58
+
59
+ if (type === _constants.DROPDOWN || type === _constants.RADIO || type === _constants.NUMBER) {
60
+ tags.push({
61
+ key: id,
62
+ value: value
63
+ });
64
+ } else if (type === _constants.DATE) {
65
+ var _value = (0, _slicedToArray2.default)(value, 2),
66
+ startDate = _value[0],
67
+ endDate = _value[1];
68
+
69
+ tags.push({
70
+ key: id,
71
+ value: "".concat(startDate.toLocaleDateString(), " - ").concat(endDate.toLocaleDateString())
72
+ });
73
+ } else if (type === _constants.CHECKBOX) {
74
+ value.forEach(function (checkbox) {
75
+ if (checkbox.selected) {
76
+ tags.push({
77
+ key: id,
78
+ value: checkbox.value
79
+ });
80
+ }
81
+ });
82
+ }
83
+ });
84
+ return tags;
85
+ };
86
+
87
+ var FilterProvider = function FilterProvider(_ref2) {
88
+ var children = _ref2.children,
89
+ filters = _ref2.filters;
90
+ var filterTags = prepareFiltersForTags(filters);
91
+ var value = {
92
+ filterTags: filterTags,
93
+ EventEmitter: EventEmitter
94
+ };
95
+ return /*#__PURE__*/_react.default.createElement(FilterContext.Provider, {
96
+ value: value
97
+ }, children);
98
+ };
99
+
100
+ exports.FilterProvider = FilterProvider;
101
+ FilterProvider.propTypes = {
102
+ children: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.node), _propTypes.default.node]).isRequired,
103
+ filters: _propTypes.default.arrayOf(_propTypes.default.object).isRequired
104
+ };
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.RADIO = exports.NUMBER = exports.INSTANT = exports.DROPDOWN = exports.DATE = exports.CLEAR_FILTERS = exports.CHECKBOX = exports.BATCH = void 0;
7
+
8
+ /**
9
+ * Copyright IBM Corp. 2022, 2022
10
+ *
11
+ * This source code is licensed under the Apache-2.0 license found in the
12
+ * LICENSE file in the root directory of this source tree.
13
+ */
14
+
15
+ /** Constants for update methods can either be batch or instant */
16
+ var BATCH = 'batch';
17
+ exports.BATCH = BATCH;
18
+ var INSTANT = 'instant';
19
+ /** Constants for filter type */
20
+
21
+ exports.INSTANT = INSTANT;
22
+ var DATE = 'date';
23
+ exports.DATE = DATE;
24
+ var NUMBER = 'number';
25
+ exports.NUMBER = NUMBER;
26
+ var CHECKBOX = 'checkbox';
27
+ exports.CHECKBOX = CHECKBOX;
28
+ var RADIO = 'radio';
29
+ exports.RADIO = RADIO;
30
+ var DROPDOWN = 'dropdown';
31
+ /** Constants for event emitters */
32
+
33
+ exports.DROPDOWN = DROPDOWN;
34
+ var CLEAR_FILTERS = 'clearFilters';
35
+ exports.CLEAR_FILTERS = CLEAR_FILTERS;