@carbon/ibm-products 1.9.0 → 1.11.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) hide show
  1. package/css/index-full-carbon.css +364 -5838
  2. package/css/index-full-carbon.css.map +1 -1
  3. package/css/index-full-carbon.min.css +5 -5
  4. package/css/index-full-carbon.min.css.map +1 -1
  5. package/css/index-without-carbon-released-only.css +68 -3430
  6. package/css/index-without-carbon-released-only.css.map +1 -1
  7. package/css/index-without-carbon-released-only.min.css +3 -3
  8. package/css/index-without-carbon-released-only.min.css.map +1 -1
  9. package/css/index-without-carbon.css +185 -4098
  10. package/css/index-without-carbon.css.map +1 -1
  11. package/css/index-without-carbon.min.css +5 -5
  12. package/css/index-without-carbon.min.css.map +1 -1
  13. package/css/index.css +302 -4099
  14. package/css/index.css.map +1 -1
  15. package/css/index.min.css +5 -5
  16. package/css/index.min.css.map +1 -1
  17. package/es/components/AddSelect/AddSelect.js +98 -92
  18. package/es/components/AddSelect/AddSelectColumn.js +219 -8
  19. package/es/components/AddSelect/AddSelectList.js +5 -5
  20. package/es/components/AddSelect/AddSelectSidebar.js +3 -15
  21. package/es/components/AddSelect/add-select-utils.js +64 -0
  22. package/es/components/BreadcrumbWithOverflow/BreadcrumbWithOverflow.js +2 -1
  23. package/es/components/ButtonMenu/ButtonMenu.js +12 -4
  24. package/es/components/DataSpreadsheet/DataSpreadsheet.js +480 -182
  25. package/es/components/DataSpreadsheet/DataSpreadsheetBody.js +124 -81
  26. package/es/components/DataSpreadsheet/DataSpreadsheetHeader.js +74 -8
  27. package/es/components/DataSpreadsheet/hooks/useMoveActiveCell.js +27 -0
  28. package/es/components/DataSpreadsheet/hooks/useResetSpreadsheetFocus.js +28 -0
  29. package/es/components/DataSpreadsheet/hooks/useSpreadsheetOutsideClick.js +41 -0
  30. package/es/components/DataSpreadsheet/utils/checkActiveHeaderCell.js +34 -0
  31. package/es/components/DataSpreadsheet/{createActiveCellFn.js → utils/createActiveCellFn.js} +21 -8
  32. package/es/components/DataSpreadsheet/{createCellSelectionArea.js → utils/createCellSelectionArea.js} +8 -4
  33. package/es/components/DataSpreadsheet/{generateData.js → utils/generateData.js} +6 -0
  34. package/es/components/DataSpreadsheet/{getCellSize.js → utils/getCellSize.js} +0 -0
  35. package/es/components/DataSpreadsheet/utils/handleHeaderCellSelection.js +46 -0
  36. package/es/components/DataSpreadsheet/utils/handleMultipleKeys.js +82 -0
  37. package/es/components/DataSpreadsheet/utils/removeCellSelections.js +30 -0
  38. package/es/components/InlineEdit/InlineEdit.js +58 -27
  39. package/es/components/OptionsTile/OptionsTile.js +31 -21
  40. package/es/components/OptionsTile/index.js +1 -1
  41. package/es/components/PageHeader/PageHeader.js +26 -15
  42. package/es/components/PageHeader/PageHeaderTitle.js +2 -1
  43. package/es/components/PageHeader/PageHeaderUtils.js +24 -29
  44. package/es/components/TagSet/TagSet.js +12 -3
  45. package/es/components/UserProfileImage/UserProfileImage.js +2 -1
  46. package/es/components/index.js +0 -1
  47. package/es/global/js/package-settings.js +1 -2
  48. package/lib/components/AddSelect/AddSelect.js +101 -92
  49. package/lib/components/AddSelect/AddSelectColumn.js +232 -13
  50. package/lib/components/AddSelect/AddSelectList.js +5 -5
  51. package/lib/components/AddSelect/AddSelectSidebar.js +9 -15
  52. package/lib/components/AddSelect/add-select-utils.js +78 -0
  53. package/lib/components/BreadcrumbWithOverflow/BreadcrumbWithOverflow.js +2 -1
  54. package/lib/components/ButtonMenu/ButtonMenu.js +12 -4
  55. package/lib/components/DataSpreadsheet/DataSpreadsheet.js +490 -186
  56. package/lib/components/DataSpreadsheet/DataSpreadsheetBody.js +127 -82
  57. package/lib/components/DataSpreadsheet/DataSpreadsheetHeader.js +82 -9
  58. package/lib/components/DataSpreadsheet/hooks/useMoveActiveCell.js +37 -0
  59. package/lib/components/DataSpreadsheet/hooks/useResetSpreadsheetFocus.js +39 -0
  60. package/lib/components/DataSpreadsheet/hooks/useSpreadsheetOutsideClick.js +52 -0
  61. package/lib/components/DataSpreadsheet/utils/checkActiveHeaderCell.js +45 -0
  62. package/lib/components/DataSpreadsheet/{createActiveCellFn.js → utils/createActiveCellFn.js} +21 -8
  63. package/lib/components/DataSpreadsheet/{createCellSelectionArea.js → utils/createCellSelectionArea.js} +8 -4
  64. package/lib/components/DataSpreadsheet/{generateData.js → utils/generateData.js} +6 -0
  65. package/lib/components/DataSpreadsheet/{getCellSize.js → utils/getCellSize.js} +0 -0
  66. package/lib/components/DataSpreadsheet/utils/handleHeaderCellSelection.js +59 -0
  67. package/lib/components/DataSpreadsheet/utils/handleMultipleKeys.js +92 -0
  68. package/lib/components/DataSpreadsheet/utils/removeCellSelections.js +41 -0
  69. package/lib/components/InlineEdit/InlineEdit.js +60 -28
  70. package/lib/components/OptionsTile/OptionsTile.js +30 -20
  71. package/lib/components/PageHeader/PageHeader.js +25 -15
  72. package/lib/components/PageHeader/PageHeaderTitle.js +2 -1
  73. package/lib/components/PageHeader/PageHeaderUtils.js +24 -29
  74. package/lib/components/TagSet/TagSet.js +13 -3
  75. package/lib/components/UserProfileImage/UserProfileImage.js +2 -1
  76. package/lib/components/index.js +0 -8
  77. package/lib/global/js/package-settings.js +1 -2
  78. package/package.json +17 -17
  79. package/scss/components/AddSelect/_add-select.scss +47 -14
  80. package/scss/components/BreadcrumbWithOverflow/_breadcrumb-with-overflow.scss +7 -3
  81. package/scss/components/CreateInfluencer/_create-influencer.scss +2 -0
  82. package/scss/components/CreateModal/_create-modal.scss +1 -0
  83. package/scss/components/CreateSidePanel/_create-side-panel.scss +1 -1
  84. package/scss/components/CreateSidePanel/_storybook-styles.scss +1 -1
  85. package/scss/components/CreateTearsheet/_create-tearsheet.scss +1 -0
  86. package/scss/components/CreateTearsheetNarrow/_create-tearsheet-narrow.scss +1 -0
  87. package/scss/components/DataSpreadsheet/_data-spreadsheet.scss +25 -7
  88. package/scss/components/EditSidePanel/_edit-side-panel.scss +9 -0
  89. package/scss/components/EditSidePanel/_storybook-styles.scss +1 -1
  90. package/scss/components/InlineEdit/_inline-edit.scss +46 -39
  91. package/scss/components/InlineEdit/_storybook-styles.scss +1 -0
  92. package/scss/components/ModifiedTabs/_modified-tabs.scss +5 -0
  93. package/scss/components/NotificationsPanel/_notifications-panel.scss +10 -3
  94. package/scss/components/OptionsTile/_index.scss +1 -1
  95. package/scss/components/OptionsTile/_options-tile.scss +17 -17
  96. package/scss/components/OptionsTile/_storybook-styles.scss +4 -4
  97. package/scss/components/PageHeader/_page-header.scss +5 -2
  98. package/scss/components/SidePanel/_side-panel.scss +19 -12
  99. package/scss/components/StatusIcon/_status-icon.scss +1 -0
  100. package/scss/components/Tearsheet/_tearsheet.scss +4 -0
  101. package/scss/components/UserProfileImage/_user-profile-image.scss +9 -0
  102. package/scss/components/WebTerminal/_web-terminal.scss +2 -0
  103. package/scss/components/_index.scss +0 -1
  104. package/es/components/LoadingBar/LoadingBar.js +0 -156
  105. package/es/components/LoadingBar/index.js +0 -7
  106. package/lib/components/LoadingBar/LoadingBar.js +0 -170
  107. package/lib/components/LoadingBar/index.js +0 -13
  108. package/scss/components/LoadingBar/_index.scss +0 -8
  109. package/scss/components/LoadingBar/_loading-bar.scss +0 -211
  110. package/scss/components/LoadingBar/_storybook-styles.scss +0 -14
@@ -2,13 +2,7 @@ import _extends from "@babel/runtime/helpers/extends";
2
2
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
3
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
4
  import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
5
- var _excluded = ["className", "description", "influencerTitle", "inputPlaceholder", "items", "itemsLabel", "multi", "noResultsDescription", "noResultsTitle", "noSelectionDescription", "noSelectionTitle", "onClose", "onCloseButtonText", "onSearchFilter", "onSubmit", "onSubmitButtonText", "open", "removeIconDescription", "textInputLabel", "title"],
6
- _excluded2 = ["children"];
7
-
8
- 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; }
9
-
10
- 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) { _defineProperty(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; }
11
-
5
+ var _excluded = ["className", "columnInputPlaceholder", "description", "influencerTitle", "inputPlaceholder", "items", "itemsLabel", "multi", "noResultsDescription", "noResultsTitle", "noSelectionDescription", "noSelectionTitle", "onClose", "onCloseButtonText", "onSearchFilter", "onSubmit", "onSubmitButtonText", "open", "removeIconDescription", "textInputLabel", "title"];
12
6
  //
13
7
  // Copyright IBM Corp. 2022
14
8
  //
@@ -26,20 +20,17 @@ import { AddSelectSidebar } from './AddSelectSidebar';
26
20
  import { AddSelectBreadcrumbs } from './AddSelectBreadcrumbs';
27
21
  import { AddSelectList } from './AddSelectList';
28
22
  import { AddSelectColumn } from './AddSelectColumn';
29
- var componentName = 'AddSelect'; // Default values for props
30
-
31
- var defaults = {
32
- items: Object.freeze([])
33
- };
23
+ import { normalize, flatten } from './add-select-utils';
24
+ var componentName = 'AddSelect';
34
25
  export var AddSelect = /*#__PURE__*/forwardRef(function (_ref, ref) {
35
26
  var _cx;
36
27
 
37
28
  var className = _ref.className,
29
+ columnInputPlaceholder = _ref.columnInputPlaceholder,
38
30
  description = _ref.description,
39
31
  influencerTitle = _ref.influencerTitle,
40
32
  inputPlaceholder = _ref.inputPlaceholder,
41
- _ref$items = _ref.items,
42
- items = _ref$items === void 0 ? defaults.items : _ref$items,
33
+ items = _ref.items,
43
34
  itemsLabel = _ref.itemsLabel,
44
35
  multi = _ref.multi,
45
36
  noResultsDescription = _ref.noResultsDescription,
@@ -89,75 +80,64 @@ export var AddSelect = /*#__PURE__*/forwardRef(function (_ref, ref) {
89
80
  useNormalizedItems = _useState12[0],
90
81
  setUsedNormalizedItems = _useState12[1];
91
82
 
92
- useEffect(function () {
93
- var normalize = function normalize(arr, parentId) {
94
- return arr.reduce(function (acc, cur) {
95
- var children = cur.children,
96
- item = _objectWithoutProperties(cur, _excluded2);
97
-
98
- acc[cur.id] = _objectSpread({}, item);
99
-
100
- if (parentId) {
101
- acc[cur.id].parent = parentId;
102
- }
83
+ var _useState13 = useState([]),
84
+ _useState14 = _slicedToArray(_useState13, 2),
85
+ sidebarItems = _useState14[0],
86
+ setSidebarItems = _useState14[1];
103
87
 
104
- if (children) {
105
- acc[cur.id].children = children.map(function (child) {
106
- return child.id;
107
- });
108
- var child = normalize(children, cur.id);
109
- return _objectSpread(_objectSpread({}, acc), child);
110
- }
111
-
112
- return acc;
113
- }, {});
114
- };
88
+ useEffect(function () {
89
+ var entries = items.entries;
90
+ setSidebarItems(flatten(entries)); // multi select with nested data needs to be normalized
115
91
 
116
- if (multi && items.find(function (item) {
117
- return item.children;
92
+ if (multi && entries.find(function (entry) {
93
+ return entry.children;
118
94
  })) {
119
95
  var newItems = normalize(items);
120
96
  setNormalizedItems(newItems);
121
97
  setUsedNormalizedItems(true);
122
98
  }
123
- }, [items, multi]);
99
+ }, [items, multi]); // used to generate columns of results for multi select with hierarchy
124
100
 
125
101
  var getPages = function getPages() {
126
- var results = [];
127
- var itemIds = Object.keys(normalizedItems);
102
+ var pages = [];
103
+ var itemIds = Object.keys(normalizedItems); // top level items are just items with no parents so they're the top results
104
+
128
105
  var topLevelItems = [];
129
106
  itemIds.forEach(function (itemId) {
130
107
  if (!normalizedItems[itemId].parent) {
131
108
  topLevelItems.push(normalizedItems[itemId]);
132
109
  }
133
110
  });
134
- results.push(topLevelItems);
111
+ pages.push(topLevelItems);
135
112
 
136
113
  if (path.length) {
114
+ /**
115
+ * the path is set when you initially traverse the child entries
116
+ * path is an array of item id's
117
+ * when a path is present the normalized items are searched
118
+ * any item who's has a matching parent id is added to the results
119
+ * in the end you have an array of arrays for each column of the hierarchy
120
+ */
137
121
  var pathIds = path.map(function (p) {
138
122
  return p.id;
139
123
  });
140
124
  pathIds.forEach(function (pathId) {
141
- var childItems = [];
125
+ var entries = [];
142
126
  itemIds.forEach(function (itemId) {
143
127
  if (normalizedItems[itemId].parent === pathId) {
144
- childItems.push(normalizedItems[itemId]);
128
+ entries.push(normalizedItems[itemId]);
145
129
  }
146
130
  });
147
- results.push(childItems);
131
+ pages.push(entries);
148
132
  });
149
133
  }
150
134
 
151
- return results;
152
- }; // handlers
153
-
154
-
155
- var handleSearch = function handleSearch(e) {
156
- setSearchTerm(e.target.value);
135
+ return pages;
157
136
  }; // item filtering
158
137
 
159
138
 
160
139
  var getFilteredItems = function getFilteredItems() {
140
+ var entries = items.entries;
161
141
  var hasPath = path.length > 0;
162
142
  /**
163
143
  * how to traverse the levels of items-
@@ -166,10 +146,12 @@ export var AddSelect = /*#__PURE__*/forwardRef(function (_ref, ref) {
166
146
  */
167
147
 
168
148
  var itemsToFilter = hasPath ? path.reduce(function (prev, cur) {
169
- return prev.find(function (item) {
149
+ var _prev$find, _prev$find$children;
150
+
151
+ return (_prev$find = prev.find(function (item) {
170
152
  return item.id === cur.id;
171
- }).children;
172
- }, items) : items;
153
+ })) === null || _prev$find === void 0 ? void 0 : (_prev$find$children = _prev$find.children) === null || _prev$find$children === void 0 ? void 0 : _prev$find$children.entries;
154
+ }, entries) : entries;
173
155
  var results = itemsToFilter.filter(function (item) {
174
156
  if (!searchTerm) {
175
157
  return item;
@@ -184,7 +166,8 @@ export var AddSelect = /*#__PURE__*/forwardRef(function (_ref, ref) {
184
166
  return item.title.toLowerCase().includes(searchTerm);
185
167
  });
186
168
  return results;
187
- };
169
+ }; // only multi select with hierarchy requires the the normalized items
170
+
188
171
 
189
172
  var itemsToDisplay = useNormalizedItems ? getPages() : getFilteredItems();
190
173
  var commonListProps = {
@@ -195,7 +178,42 @@ export var AddSelect = /*#__PURE__*/forwardRef(function (_ref, ref) {
195
178
  setPath: setPath,
196
179
  setSingleSelection: setSingleSelection,
197
180
  singleSelection: singleSelection
198
- }; // main content
181
+ }; // handlers
182
+
183
+ var handleSearch = function handleSearch(e) {
184
+ setSearchTerm(e.target.value);
185
+ };
186
+
187
+ var submitHandler = function submitHandler() {
188
+ onSubmit(multi ? multiSelection : singleSelection);
189
+ };
190
+
191
+ var commonTearsheetProps = {
192
+ open: open,
193
+ title: title,
194
+ description: description,
195
+ closeIconDescription: 'temp description',
196
+ actions: [{
197
+ label: onCloseButtonText,
198
+ kind: 'secondary',
199
+ onClick: onClose
200
+ }, {
201
+ label: onSubmitButtonText,
202
+ kind: 'primary',
203
+ onClick: submitHandler,
204
+ disabled: multi ? multiSelection.length === 0 : !singleSelection
205
+ }]
206
+ };
207
+ var sidebarProps = {
208
+ influencerTitle: influencerTitle,
209
+ items: sidebarItems,
210
+ multiSelection: multiSelection,
211
+ noSelectionDescription: noSelectionDescription,
212
+ noSelectionTitle: noSelectionTitle,
213
+ removeIconDescription: removeIconDescription,
214
+ setMultiSelection: setMultiSelection
215
+ };
216
+ var classNames = cx(className, blockClass, (_cx = {}, _defineProperty(_cx, "".concat(blockClass, "__single"), !multi), _defineProperty(_cx, "".concat(blockClass, "__multi"), multi), _cx)); // main content
199
217
 
200
218
  var body = /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
201
219
  className: "".concat(blockClass, "__header")
@@ -206,23 +224,26 @@ export var AddSelect = /*#__PURE__*/forwardRef(function (_ref, ref) {
206
224
  value: searchTerm,
207
225
  onChange: handleSearch
208
226
  }), /*#__PURE__*/React.createElement("div", {
209
- className: "".concat(blockClass, "__items-label-container")
227
+ className: "".concat(blockClass, "__tag-container")
210
228
  }, path.length ? /*#__PURE__*/React.createElement(AddSelectBreadcrumbs, {
211
229
  itemsLabel: itemsLabel,
212
230
  path: path,
213
231
  setPath: setPath
214
232
  }) : /*#__PURE__*/React.createElement("p", {
215
- className: "".concat(blockClass, "__items-label")
233
+ className: "".concat(blockClass, "__tag-container-label")
216
234
  }, itemsLabel), !useNormalizedItems && /*#__PURE__*/React.createElement(Tag, {
217
235
  type: "gray",
218
- size: "sm",
219
- className: "".concat(blockClass, "__items-label-tag")
236
+ size: "sm"
220
237
  }, itemsToDisplay.length))), useNormalizedItems ? /*#__PURE__*/React.createElement("div", {
221
238
  className: "".concat(blockClass, "__columns")
222
239
  }, itemsToDisplay.map(function (page, idx) {
240
+ var _path;
241
+
223
242
  return /*#__PURE__*/React.createElement(AddSelectColumn, _extends({}, commonListProps, {
224
243
  key: idx,
225
- filteredItems: page
244
+ filteredItems: page,
245
+ header: idx === 0 ? itemsLabel : (_path = path[idx - 1]) === null || _path === void 0 ? void 0 : _path.title,
246
+ columnInputPlaceholder: columnInputPlaceholder
226
247
  }));
227
248
  })) : /*#__PURE__*/React.createElement("div", null, itemsToDisplay.length > 0 ? /*#__PURE__*/React.createElement(AddSelectList, _extends({}, commonListProps, {
228
249
  filteredItems: itemsToDisplay
@@ -232,32 +253,6 @@ export var AddSelect = /*#__PURE__*/forwardRef(function (_ref, ref) {
232
253
  subtitle: noResultsDescription,
233
254
  title: noResultsTitle
234
255
  }))));
235
- var commonTearsheetProps = {
236
- open: open,
237
- title: title,
238
- description: description,
239
- closeIconDescription: 'temp description',
240
- actions: [{
241
- label: onCloseButtonText,
242
- kind: 'secondary',
243
- onClick: onClose
244
- }, {
245
- label: onSubmitButtonText,
246
- kind: 'primary',
247
- onClick: onSubmit,
248
- disabled: multi ? multiSelection.length === 0 : !singleSelection
249
- }]
250
- };
251
- var sidebarProps = {
252
- influencerTitle: influencerTitle,
253
- items: items,
254
- multiSelection: multiSelection,
255
- noSelectionDescription: noSelectionDescription,
256
- noSelectionTitle: noSelectionTitle,
257
- removeIconDescription: removeIconDescription,
258
- setMultiSelection: setMultiSelection
259
- };
260
- var classNames = cx(className, blockClass, (_cx = {}, _defineProperty(_cx, "".concat(blockClass, "__single"), !multi), _defineProperty(_cx, "".concat(blockClass, "__multi"), multi), _cx));
261
256
  return /*#__PURE__*/React.createElement("div", _extends({
262
257
  ref: ref,
263
258
  className: classNames
@@ -268,14 +263,20 @@ export var AddSelect = /*#__PURE__*/forwardRef(function (_ref, ref) {
268
263
  });
269
264
  AddSelect.propTypes = {
270
265
  className: PropTypes.string,
266
+ columnInputPlaceholder: PropTypes.string,
271
267
  description: PropTypes.string,
272
268
  influencerTitle: PropTypes.string,
273
269
  inputPlaceholder: PropTypes.string,
274
- items: PropTypes.arrayOf(PropTypes.shape({
275
- id: PropTypes.string.isRequired,
276
- title: PropTypes.string.isRequired,
277
- value: PropTypes.string.isRequired
278
- })),
270
+ items: PropTypes.shape({
271
+ sortBy: PropTypes.array,
272
+ filterBy: PropTypes.array,
273
+ entries: PropTypes.arrayOf(PropTypes.shape({
274
+ id: PropTypes.string.isRequired,
275
+ title: PropTypes.string.isRequired,
276
+ value: PropTypes.string.isRequired,
277
+ children: PropTypes.object
278
+ }))
279
+ }),
279
280
  itemsLabel: PropTypes.string,
280
281
  multi: PropTypes.bool,
281
282
  noResultsDescription: PropTypes.string,
@@ -292,4 +293,9 @@ AddSelect.propTypes = {
292
293
  textInputLabel: PropTypes.string,
293
294
  title: PropTypes.string
294
295
  };
296
+ AddSelect.defaultProps = {
297
+ items: {
298
+ entries: []
299
+ }
300
+ };
295
301
  AddSelect.displayName = componentName;
@@ -1,21 +1,232 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
3
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
4
+ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
5
+ var _excluded = ["columnInputPlaceholder", "filteredItems", "header", "multiSelection", "setMultiSelection"];
2
6
  //
3
7
  // Copyright IBM Corp. 2022
4
8
  //
5
9
  // This source code is licensed under the Apache-2.0 license found in the
6
10
  // LICENSE file in the root directory of this source tree.
7
11
  //
8
- import React from 'react'; // import PropTypes from 'prop-types';
9
-
10
- import { pkg } from '../../settings';
12
+ import React, { useState, useEffect } from 'react';
13
+ import PropTypes from 'prop-types';
14
+ import { TextInput, Tag, OverflowMenu, OverflowMenuItem, Checkbox } from 'carbon-components-react';
15
+ import { Filter32, ArrowsVertical32, ArrowUp16, ArrowDown16 } from '@carbon/icons-react';
16
+ import { pkg, carbon } from '../../settings';
11
17
  import { AddSelectList } from './AddSelectList';
18
+ import uuidv4 from '../../global/js/utils/uuidv4';
12
19
  var componentName = 'AddSelect';
13
- export var AddSelectColumn = function AddSelectColumn(props) {
14
- var blockClass = "".concat(pkg.prefix, "--add-select__col");
20
+ export var AddSelectColumn = function AddSelectColumn(_ref) {
21
+ var _filteredItems$find, _filteredItems$find2;
22
+
23
+ var columnInputPlaceholder = _ref.columnInputPlaceholder,
24
+ filteredItems = _ref.filteredItems,
25
+ header = _ref.header,
26
+ multiSelection = _ref.multiSelection,
27
+ setMultiSelection = _ref.setMultiSelection,
28
+ props = _objectWithoutProperties(_ref, _excluded);
29
+
30
+ var _useState = useState(false),
31
+ _useState2 = _slicedToArray(_useState, 2),
32
+ allSelected = _useState2[0],
33
+ setAllSelected = _useState2[1];
34
+
35
+ var _useState3 = useState(''),
36
+ _useState4 = _slicedToArray(_useState3, 2),
37
+ searchTerm = _useState4[0],
38
+ setSearchTerm = _useState4[1];
39
+
40
+ var _useState5 = useState(''),
41
+ _useState6 = _slicedToArray(_useState5, 2),
42
+ sortDirection = _useState6[0],
43
+ setSortDirection = _useState6[1];
44
+
45
+ var _useState7 = useState(''),
46
+ _useState8 = _slicedToArray(_useState7, 2),
47
+ sortAttribute = _useState8[0],
48
+ setSortAttribute = _useState8[1];
49
+
50
+ var _useState9 = useState([]),
51
+ _useState10 = _slicedToArray(_useState9, 2),
52
+ filters = _useState10[0],
53
+ setFilters = _useState10[1];
54
+
55
+ var blockClass = "".concat(pkg.prefix, "--add-select");
56
+ var colClass = "".concat(blockClass, "__column");
57
+ useEffect(function () {
58
+ var isAllSelected = filteredItems.every(function (item) {
59
+ return multiSelection.includes(item.id);
60
+ });
61
+ setAllSelected(isAllSelected);
62
+ }, [filteredItems, multiSelection]); // sorting
63
+
64
+ var colSortBy = (_filteredItems$find = filteredItems.find(function (item) {
65
+ return item.sortBy;
66
+ })) === null || _filteredItems$find === void 0 ? void 0 : _filteredItems$find.sortBy;
67
+ var sortByOpts = colSortBy ? colSortBy.reduce(function (acc, cur) {
68
+ var opts = [{
69
+ id: "".concat(cur, "-asc"),
70
+ itemText: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ArrowUp16, null), cur),
71
+ direction: 'asc',
72
+ attribute: cur
73
+ }, {
74
+ id: "".concat(cur, "-desc"),
75
+ itemText: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ArrowDown16, null), cur),
76
+ direction: 'desc',
77
+ attribute: cur
78
+ }];
79
+ return [].concat(_toConsumableArray(acc), opts);
80
+ }, []) : []; // filtering
81
+
82
+ var colFilterBy = (_filteredItems$find2 = filteredItems.find(function (item) {
83
+ return item.filterBy;
84
+ })) === null || _filteredItems$find2 === void 0 ? void 0 : _filteredItems$find2.filterBy;
85
+ var filterByOpts = colFilterBy ? filteredItems.map(function (item) {
86
+ return item[colFilterBy];
87
+ }) : []; // handlers
88
+
89
+ var sortHandler = function sortHandler(_ref2) {
90
+ var direction = _ref2.direction,
91
+ attribute = _ref2.attribute;
92
+ setSortAttribute(attribute);
93
+ setSortDirection(direction);
94
+ };
95
+
96
+ var selectAllHandler = function selectAllHandler(checked) {
97
+ var itemIds = filteredItems.map(function (item) {
98
+ return item.id;
99
+ });
100
+
101
+ if (checked) {
102
+ setMultiSelection([].concat(_toConsumableArray(multiSelection), _toConsumableArray(itemIds)));
103
+ } else {
104
+ var newItems = multiSelection.filter(function (i) {
105
+ return !itemIds.includes(i);
106
+ });
107
+ setMultiSelection(newItems);
108
+ }
109
+ };
110
+
111
+ var filterHandler = function filterHandler(checked, opt) {
112
+ if (checked) {
113
+ var newFilters = [].concat(_toConsumableArray(filters), [opt]);
114
+ setFilters(newFilters);
115
+ } else {
116
+ var _newFilters = filters.filter(function (o) {
117
+ return o !== opt;
118
+ });
119
+
120
+ setFilters(_newFilters);
121
+ }
122
+ }; // filter and sort array functions
123
+
124
+
125
+ var filterBySearch = function filterBySearch(item) {
126
+ return item.title.toLowerCase().includes(searchTerm);
127
+ };
128
+
129
+ var filterByAttribute = function filterByAttribute(item) {
130
+ if (filters.length === 0) {
131
+ return true;
132
+ }
133
+
134
+ var filterBy = item.filterBy;
135
+ var filterByValue = item[filterBy];
136
+ return filters.some(function (filter) {
137
+ return filter === filterByValue;
138
+ });
139
+ };
140
+
141
+ var sortItems = function sortItems(a, b) {
142
+ var _a$sortAttribute, _b$sortAttribute;
143
+
144
+ var valueA = (_a$sortAttribute = a[sortAttribute]) === null || _a$sortAttribute === void 0 ? void 0 : _a$sortAttribute.split(' ').join('');
145
+ var valueB = (_b$sortAttribute = b[sortAttribute]) === null || _b$sortAttribute === void 0 ? void 0 : _b$sortAttribute.split(' ').join('');
146
+
147
+ if (sortDirection === 'desc') {
148
+ return valueA > valueB ? -1 : 1;
149
+ }
150
+
151
+ return valueA < valueB ? -1 : 1;
152
+ };
153
+
154
+ var colItems = filteredItems.filter(filterBySearch) // first check if the item meets the search
155
+ .filter(filterByAttribute) // then check if the item is included in the filter
156
+ .sort(sortItems); // then sort the items by whatever criteria
157
+
15
158
  return /*#__PURE__*/React.createElement("div", {
16
- className: blockClass
17
- }, /*#__PURE__*/React.createElement(AddSelectList, _extends({}, props, {
18
- inColumn: true
159
+ className: colClass
160
+ }, /*#__PURE__*/React.createElement("div", {
161
+ className: "".concat(colClass, "-search-bar")
162
+ }, /*#__PURE__*/React.createElement(TextInput, {
163
+ value: searchTerm,
164
+ onChange: function onChange(e) {
165
+ return setSearchTerm(e.target.value);
166
+ },
167
+ light: true,
168
+ placeholder: columnInputPlaceholder,
169
+ className: "".concat(colClass, "-input"),
170
+ id: uuidv4(),
171
+ labelText: columnInputPlaceholder
172
+ }), /*#__PURE__*/React.createElement("div", {
173
+ className: "".concat(colClass, "-sort-filter")
174
+ }, sortByOpts.length > 0 && /*#__PURE__*/React.createElement(OverflowMenu, {
175
+ renderIcon: ArrowsVertical32,
176
+ className: "".concat(colClass, "-overflow"),
177
+ flipped: true
178
+ }, sortByOpts.map(function (opt) {
179
+ return /*#__PURE__*/React.createElement(OverflowMenuItem, {
180
+ key: opt.id,
181
+ itemText: opt.itemText,
182
+ onClick: function onClick() {
183
+ return sortHandler(opt);
184
+ }
185
+ });
186
+ })), filterByOpts.length > 0 && /*#__PURE__*/React.createElement(OverflowMenu, {
187
+ renderIcon: Filter32,
188
+ className: "".concat(colClass, "-overflow"),
189
+ flipped: true
190
+ }, filterByOpts.map(function (opt) {
191
+ return /*#__PURE__*/React.createElement("div", {
192
+ key: opt,
193
+ className: "".concat(carbon.prefix, "--overflow-menu-options__option")
194
+ }, /*#__PURE__*/React.createElement("div", {
195
+ className: "".concat(carbon.prefix, "--overflow-menu-options__btn")
196
+ }, /*#__PURE__*/React.createElement(Checkbox, {
197
+ id: opt,
198
+ labelText: opt,
199
+ onChange: function onChange(checked) {
200
+ return filterHandler(checked, opt);
201
+ },
202
+ checked: filters.find(function (o) {
203
+ return o === opt;
204
+ }) ? true : false
205
+ })));
206
+ })))), /*#__PURE__*/React.createElement("div", {
207
+ className: "".concat(blockClass, "__tag-container")
208
+ }, /*#__PURE__*/React.createElement(Checkbox, {
209
+ id: "".concat(uuidv4(), "-select-all"),
210
+ checked: allSelected,
211
+ onChange: selectAllHandler,
212
+ labelText: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("span", {
213
+ className: "".concat(blockClass, "__tag-container-label")
214
+ }, header), /*#__PURE__*/React.createElement(Tag, {
215
+ type: "gray",
216
+ size: "sm"
217
+ }, colItems.length))
218
+ })), /*#__PURE__*/React.createElement(AddSelectList, _extends({}, props, {
219
+ inColumn: true,
220
+ filteredItems: colItems,
221
+ setMultiSelection: setMultiSelection,
222
+ multiSelection: multiSelection
19
223
  })));
20
224
  };
225
+ AddSelectColumn.propTypes = {
226
+ columnInputPlaceholder: PropTypes.string,
227
+ filteredItems: PropTypes.array,
228
+ header: PropTypes.string,
229
+ multiSelection: PropTypes.array,
230
+ setMultiSelection: PropTypes.func
231
+ };
21
232
  AddSelectColumn.displayName = componentName;
@@ -27,13 +27,13 @@ export var AddSelectList = function AddSelectList(_ref) {
27
27
  setSingleSelection(value);
28
28
  };
29
29
 
30
- var handleMultiSelection = function handleMultiSelection(value, checked) {
30
+ var handleMultiSelection = function handleMultiSelection(id, checked) {
31
31
  if (checked) {
32
- var newValues = [].concat(_toConsumableArray(multiSelection), [value]);
32
+ var newValues = [].concat(_toConsumableArray(multiSelection), [id]);
33
33
  setMultiSelection(newValues);
34
34
  } else {
35
35
  var _newValues = multiSelection.filter(function (v) {
36
- return v !== value;
36
+ return v !== id;
37
37
  });
38
38
 
39
39
  setMultiSelection(_newValues);
@@ -114,8 +114,8 @@ export var AddSelectList = function AddSelectList(_ref) {
114
114
  className: "".concat(blockClass, "-cell-wrapper")
115
115
  }, multi ? /*#__PURE__*/React.createElement(Checkbox, {
116
116
  className: "".concat(blockClass, "-checkbox"),
117
- onChange: function onChange(value) {
118
- return handleMultiSelection(item.id, value);
117
+ onChange: function onChange(checked) {
118
+ return handleMultiSelection(item.id, checked);
119
119
  },
120
120
  labelText: !inColumn ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("span", {
121
121
  className: "".concat(blockClass, "-cell-title")
@@ -1,5 +1,3 @@
1
- import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
2
- var _excluded = ["children"];
3
1
  //
4
2
  // Copyright IBM Corp. 2022
5
3
  //
@@ -28,21 +26,10 @@ export var AddSelectSidebar = function AddSelectSidebar(_ref) {
28
26
  return v !== id;
29
27
  });
30
28
  setMultiSelection(newSelections);
31
- }; // utility to flatten the list of items and their children into a single searchable array
32
-
33
-
34
- var flattenItems = function flattenItems(arr) {
35
- return arr.reduce(function (prev, cur) {
36
- var children = cur.children,
37
- item = _objectWithoutProperties(cur, _excluded);
38
-
39
- return prev.concat(item).concat(children ? flattenItems(children) : []);
40
- }, []);
41
29
  };
42
30
 
43
- var flattenedItems = flattenItems(items);
44
31
  var sidebarItems = multiSelection.map(function (selectedId) {
45
- return flattenedItems.find(function (item) {
32
+ return items.find(function (item) {
46
33
  return item.id === selectedId;
47
34
  });
48
35
  });
@@ -67,7 +54,8 @@ export var AddSelectSidebar = function AddSelectSidebar(_ref) {
67
54
  return handleItemRemove(id);
68
55
  },
69
56
  kind: "ghost",
70
- className: "".concat(blockClass, "-item-remove-button")
57
+ className: "".concat(blockClass, "-item-remove-button"),
58
+ size: "sm"
71
59
  }));
72
60
  };
73
61
 
@@ -0,0 +1,64 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
3
+ var _excluded = ["children"],
4
+ _excluded2 = ["children"];
5
+
6
+ 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; }
7
+
8
+ 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) { _defineProperty(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; }
9
+
10
+ /**
11
+ * used to normalize nested data into a single object
12
+ * @param {Array} items - list of entries
13
+ * @returns an object of normalized item data
14
+ */
15
+ export var normalize = function normalize(items) {
16
+ var entries = items.entries,
17
+ parentId = items.parentId,
18
+ sortBy = items.sortBy,
19
+ filterBy = items.filterBy;
20
+ return entries.reduce(function (acc, cur) {
21
+ var children = cur.children,
22
+ entry = _objectWithoutProperties(cur, _excluded);
23
+
24
+ acc[cur.id] = _objectSpread({}, entry);
25
+
26
+ if (parentId) {
27
+ acc[cur.id].parent = parentId;
28
+ }
29
+
30
+ if (sortBy !== null && sortBy !== void 0 && sortBy.length) {
31
+ acc[cur.id].sortBy = sortBy;
32
+ }
33
+
34
+ if (filterBy) {
35
+ acc[cur.id].filterBy = filterBy;
36
+ }
37
+
38
+ if (children) {
39
+ acc[cur.id].children = children.entries.map(function (child) {
40
+ return child.id;
41
+ });
42
+ var child = normalize(_objectSpread(_objectSpread({}, children), {}, {
43
+ parentId: cur.id
44
+ }));
45
+ return _objectSpread(_objectSpread({}, acc), child);
46
+ }
47
+
48
+ return acc;
49
+ }, {});
50
+ };
51
+ /**
52
+ * used to create a single searchable array of nested items
53
+ * @param {Array} entries - list of entries
54
+ * @returns an array of items
55
+ */
56
+
57
+ export var flatten = function flatten(entries) {
58
+ return entries.reduce(function (prev, cur) {
59
+ var children = cur.children,
60
+ item = _objectWithoutProperties(cur, _excluded2);
61
+
62
+ return prev.concat(item).concat(children ? flatten(children.entries) : []);
63
+ }, []);
64
+ };