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

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. package/css/index-full-carbon.css +131 -75
  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-released-only.css +1 -0
  6. package/css/index-without-carbon-released-only.css.map +1 -1
  7. package/css/index-without-carbon-released-only.min.css +1 -1
  8. package/css/index-without-carbon-released-only.min.css.map +1 -1
  9. package/css/index-without-carbon.css +131 -75
  10. package/css/index-without-carbon.css.map +1 -1
  11. package/css/index-without-carbon.min.css +2 -2
  12. package/css/index-without-carbon.min.css.map +1 -1
  13. package/css/index.css +121 -75
  14. package/css/index.css.map +1 -1
  15. package/css/index.min.css +2 -2
  16. package/css/index.min.css.map +1 -1
  17. package/es/components/AddSelect/AddSelectBody.js +1 -1
  18. package/es/components/AddSelect/hooks/usePath.js +8 -1
  19. package/es/components/CreateFullPage/CreateFullPage.js +9 -2
  20. package/es/components/CreateTearsheet/CreateTearsheet.js +9 -2
  21. package/es/components/CreateTearsheet/preview-components/MultiStepTearsheet.js +3 -1
  22. package/es/components/DataSpreadsheet/DataSpreadsheet.js +1 -4
  23. package/es/components/DataSpreadsheet/utils/handleCellDeletion.js +6 -4
  24. package/es/components/Datagrid/Datagrid/Datagrid.js +7 -3
  25. package/es/components/Datagrid/Datagrid/DatagridContent.js +18 -6
  26. package/es/components/Datagrid/Datagrid/DatagridEmptyBody.js +17 -4
  27. package/es/components/Datagrid/Datagrid/DatagridRow.js +2 -10
  28. package/es/components/Datagrid/Datagrid/DatagridToolbar.js +22 -4
  29. package/es/components/Datagrid/Datagrid/DatagridVirtualBody.js +29 -8
  30. package/es/components/Datagrid/Datagrid/addons/CustomizeColumns/Actions.js +7 -10
  31. package/es/components/Datagrid/Datagrid/addons/CustomizeColumns/ButtonWrapper.js +11 -13
  32. package/es/components/Datagrid/Datagrid/addons/CustomizeColumns/Columns.js +28 -27
  33. package/es/components/Datagrid/Datagrid/addons/CustomizeColumns/{CustomizeColumnsModal.js → CustomizeColumnsTearsheet.js} +31 -31
  34. package/es/components/Datagrid/Datagrid/addons/CustomizeColumns/TearsheetWrapper.js +56 -0
  35. package/es/components/Datagrid/Datagrid/addons/CustomizeColumns/index.js +1 -1
  36. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterFlyout.js +424 -0
  37. package/es/components/Datagrid/Datagrid/addons/Filtering/FilterProvider.js +83 -0
  38. package/es/components/Datagrid/Datagrid/addons/Filtering/constants.js +20 -0
  39. package/es/components/Datagrid/Datagrid/addons/Filtering/hooks/useInitialStateFromFilters.js +22 -0
  40. package/es/components/Datagrid/Datagrid/addons/Filtering/index.js +7 -0
  41. package/es/components/Datagrid/Datagrid/addons/Filtering/utils.js +38 -0
  42. package/es/components/Datagrid/index.js +2 -1
  43. package/es/components/Datagrid/useCustomizeColumns.js +8 -8
  44. package/es/components/Datagrid/useFiltering.js +90 -0
  45. package/es/components/Datagrid/useParentDimensions.js +3 -1
  46. package/es/components/Datagrid/utils/DatagridActions.js +13 -26
  47. package/es/components/Datagrid/utils/getArgTypes.js +5 -0
  48. package/es/components/Datagrid/utils/getInlineEditColumns.js +6 -1
  49. package/es/components/Datagrid/utils/makeData.js +24 -16
  50. package/es/components/FilterSummary/FilterSummary.js +54 -0
  51. package/es/components/FilterSummary/index.js +7 -0
  52. package/es/components/index.js +1 -1
  53. package/es/global/js/hooks/useCreateComponentFocus.js +38 -10
  54. package/lib/components/AddSelect/AddSelectBody.js +1 -1
  55. package/lib/components/AddSelect/hooks/usePath.js +7 -0
  56. package/lib/components/CreateFullPage/CreateFullPage.js +9 -2
  57. package/lib/components/CreateTearsheet/CreateTearsheet.js +9 -2
  58. package/lib/components/CreateTearsheet/preview-components/MultiStepTearsheet.js +3 -1
  59. package/lib/components/DataSpreadsheet/DataSpreadsheet.js +1 -4
  60. package/lib/components/DataSpreadsheet/utils/handleCellDeletion.js +6 -4
  61. package/lib/components/Datagrid/Datagrid/Datagrid.js +8 -3
  62. package/lib/components/Datagrid/Datagrid/DatagridContent.js +17 -6
  63. package/lib/components/Datagrid/Datagrid/DatagridEmptyBody.js +17 -4
  64. package/lib/components/Datagrid/Datagrid/DatagridRow.js +2 -19
  65. package/lib/components/Datagrid/Datagrid/DatagridToolbar.js +24 -3
  66. package/lib/components/Datagrid/Datagrid/DatagridVirtualBody.js +31 -8
  67. package/lib/components/Datagrid/Datagrid/addons/CustomizeColumns/Actions.js +7 -10
  68. package/lib/components/Datagrid/Datagrid/addons/CustomizeColumns/ButtonWrapper.js +6 -6
  69. package/lib/components/Datagrid/Datagrid/addons/CustomizeColumns/Columns.js +30 -28
  70. package/lib/components/Datagrid/Datagrid/addons/CustomizeColumns/{CustomizeColumnsModal.js → CustomizeColumnsTearsheet.js} +27 -25
  71. package/lib/components/Datagrid/Datagrid/addons/CustomizeColumns/{ModalWrapper.js → TearsheetWrapper.js} +31 -36
  72. package/lib/components/Datagrid/Datagrid/addons/CustomizeColumns/index.js +3 -3
  73. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterFlyout.js +443 -0
  74. package/lib/components/Datagrid/Datagrid/addons/Filtering/FilterProvider.js +104 -0
  75. package/lib/components/Datagrid/Datagrid/addons/Filtering/constants.js +35 -0
  76. package/lib/components/Datagrid/Datagrid/addons/Filtering/hooks/useInitialStateFromFilters.js +33 -0
  77. package/lib/components/Datagrid/Datagrid/addons/Filtering/index.js +15 -0
  78. package/lib/components/Datagrid/Datagrid/addons/Filtering/utils.js +47 -0
  79. package/lib/components/Datagrid/index.js +9 -1
  80. package/lib/components/Datagrid/useCustomizeColumns.js +7 -7
  81. package/lib/components/Datagrid/useFiltering.js +94 -0
  82. package/lib/components/Datagrid/useParentDimensions.js +3 -1
  83. package/lib/components/Datagrid/utils/DatagridActions.js +13 -25
  84. package/lib/components/Datagrid/utils/getArgTypes.js +5 -0
  85. package/lib/components/Datagrid/utils/getInlineEditColumns.js +6 -1
  86. package/lib/components/Datagrid/utils/makeData.js +26 -18
  87. package/lib/components/FilterSummary/FilterSummary.js +72 -0
  88. package/lib/components/FilterSummary/index.js +15 -0
  89. package/lib/components/index.js +6 -0
  90. package/lib/global/js/hooks/useCreateComponentFocus.js +42 -11
  91. package/package.json +2 -2
  92. package/scss/components/Datagrid/_datagrid.scss +0 -1
  93. package/scss/components/Datagrid/_storybook-styles.scss +12 -0
  94. package/scss/components/Datagrid/styles/_datagrid.scss +23 -0
  95. package/scss/components/Datagrid/styles/_draggableElement.scss +9 -8
  96. package/scss/components/Datagrid/styles/_index.scss +8 -8
  97. package/scss/components/Datagrid/styles/addons/_CustomizeColumnsTearsheet.scss +65 -0
  98. package/scss/components/Datagrid/styles/addons/_FilterFlyout.scss +87 -0
  99. package/scss/components/FilterSummary/_filter-summary.scss +20 -0
  100. package/scss/components/FilterSummary/_index.scss +10 -0
  101. package/scss/components/FilterSummary/_storybook-styles.scss +14 -0
  102. package/scss/components/Tearsheet/_tearsheet.scss +2 -0
  103. package/scss/components/_index.scss +1 -0
  104. package/es/components/Datagrid/Datagrid/addons/CustomizeColumns/ModalWrapper.js +0 -63
  105. package/scss/components/Datagrid/styles/addons/_CustomizeColumnsModal.scss +0 -93
@@ -17,58 +17,53 @@ var React = _interopRequireWildcard(require("react"));
17
17
 
18
18
  var _propTypes = _interopRequireDefault(require("prop-types"));
19
19
 
20
- var _CustomizeColumnsModal = _interopRequireDefault(require("./CustomizeColumnsModal"));
20
+ var _CustomizeColumnsTearsheet = _interopRequireDefault(require("./CustomizeColumnsTearsheet"));
21
21
 
22
- var _excluded = ["onSaveColumnPrefs", "isModalOpen", "setIsModalOpen", "labels"];
22
+ var _excluded = ["onSaveColumnPrefs", "isTearsheetOpen", "setIsTearsheetOpen", "labels"];
23
23
 
24
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); }
25
25
 
26
26
  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; }
27
27
 
28
- var ModalWrapper = function ModalWrapper(_ref) {
28
+ var TearsheetWrapper = function TearsheetWrapper(_ref) {
29
29
  var instance = _ref.instance;
30
30
  var _instance$customizeCo = instance.customizeColumnsProps,
31
31
  _onSaveColumnPrefs = _instance$customizeCo.onSaveColumnPrefs,
32
- isModalOpen = _instance$customizeCo.isModalOpen,
33
- setIsModalOpen = _instance$customizeCo.setIsModalOpen,
32
+ isTearsheetOpen = _instance$customizeCo.isTearsheetOpen,
33
+ setIsTearsheetOpen = _instance$customizeCo.setIsTearsheetOpen,
34
34
  labels = _instance$customizeCo.labels,
35
35
  rest = (0, _objectWithoutProperties2.default)(_instance$customizeCo, _excluded);
36
-
37
- if (isModalOpen) {
38
- return /*#__PURE__*/React.createElement(_CustomizeColumnsModal.default, (0, _extends2.default)({}, rest, labels, {
39
- isOpen: isModalOpen,
40
- setIsModalOpen: setIsModalOpen,
41
- columnDefinitions: instance.allColumns,
42
- originalColumnDefinitions: instance.columns,
43
- onSaveColumnPrefs: function onSaveColumnPrefs(updatedColDefs) {
44
- var hiddenIds = updatedColDefs.filter(function (colDef) {
45
- return !colDef.isVisible;
46
- }).map(function (colDef) {
36
+ return /*#__PURE__*/React.createElement(_CustomizeColumnsTearsheet.default, (0, _extends2.default)({}, rest, labels, {
37
+ isOpen: isTearsheetOpen,
38
+ setIsTearsheetOpen: setIsTearsheetOpen,
39
+ columnDefinitions: instance.allColumns,
40
+ originalColumnDefinitions: instance.columns,
41
+ onSaveColumnPrefs: function onSaveColumnPrefs(updatedColDefs) {
42
+ var hiddenIds = updatedColDefs.filter(function (colDef) {
43
+ return !colDef.isVisible;
44
+ }).map(function (colDef) {
45
+ return colDef.id;
46
+ });
47
+ instance.setHiddenColumns(hiddenIds);
48
+
49
+ if (typeof instance.setColumnOrder === 'function') {
50
+ instance.setColumnOrder(updatedColDefs.map(function (colDef) {
47
51
  return colDef.id;
48
- });
49
- instance.setHiddenColumns(hiddenIds);
50
-
51
- if (typeof instance.setColumnOrder === 'function') {
52
- instance.setColumnOrder(updatedColDefs.map(function (colDef) {
53
- return colDef.id;
54
- }));
55
- } else {
56
- // eslint-disable-next-line no-console
57
- console.warn("Column order can not be updated. Did you forget to add 'useColumnOrder' in 'useDatagrid'");
58
- }
59
-
60
- if (typeof _onSaveColumnPrefs === 'function') {
61
- _onSaveColumnPrefs(updatedColDefs);
62
- }
52
+ }));
53
+ } else {
54
+ // eslint-disable-next-line no-console
55
+ console.warn("Column order can not be updated. Did you forget to add 'useColumnOrder' in 'useDatagrid'");
63
56
  }
64
- }));
65
- }
66
57
 
67
- return null;
58
+ if (typeof _onSaveColumnPrefs === 'function') {
59
+ _onSaveColumnPrefs(updatedColDefs);
60
+ }
61
+ }
62
+ }));
68
63
  };
69
64
 
70
- ModalWrapper.propTypes = {
65
+ TearsheetWrapper.propTypes = {
71
66
  instance: _propTypes.default.object.isRequired
72
67
  };
73
- var _default = ModalWrapper;
68
+ var _default = TearsheetWrapper;
74
69
  exports.default = _default;
@@ -5,10 +5,10 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- Object.defineProperty(exports, "CustomizeColumnsModalWrapper", {
8
+ Object.defineProperty(exports, "CustomizeColumnsTearsheetWrapper", {
9
9
  enumerable: true,
10
10
  get: function get() {
11
- return _ModalWrapper.default;
11
+ return _TearsheetWrapper.default;
12
12
  }
13
13
  });
14
14
  Object.defineProperty(exports, "ToggleButtonWrapper", {
@@ -18,6 +18,6 @@ Object.defineProperty(exports, "ToggleButtonWrapper", {
18
18
  }
19
19
  });
20
20
 
21
- var _ModalWrapper = _interopRequireDefault(require("./ModalWrapper"));
21
+ var _TearsheetWrapper = _interopRequireDefault(require("./TearsheetWrapper"));
22
22
 
23
23
  var _ButtonWrapper = _interopRequireDefault(require("./ButtonWrapper"));
@@ -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
+ };