@carbon/ibm-products 1.8.0 → 1.11.0

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