@carbon/ibm-products 1.17.0 → 1.18.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. package/README.md +30 -27
  2. package/css/components/Datagrid/styles/datagrid.css +24 -4
  3. package/css/components/Datagrid/styles/datagrid.css.map +1 -1
  4. package/css/components/Datagrid/styles/index.css +24 -4
  5. package/css/components/Datagrid/styles/index.css.map +1 -1
  6. package/css/index-full-carbon.css +215 -90
  7. package/css/index-full-carbon.css.map +1 -1
  8. package/css/index-full-carbon.min.css +4 -4
  9. package/css/index-full-carbon.min.css.map +1 -1
  10. package/css/index-without-carbon.css +98 -24
  11. package/css/index-without-carbon.css.map +1 -1
  12. package/css/index-without-carbon.min.css +2 -2
  13. package/css/index-without-carbon.min.css.map +1 -1
  14. package/css/index.css +124 -55
  15. package/css/index.css.map +1 -1
  16. package/css/index.min.css +4 -4
  17. package/css/index.min.css.map +1 -1
  18. package/es/components/AddSelect/AddSelect.js +57 -8
  19. package/es/components/AddSelect/AddSelectColumn.js +31 -73
  20. package/es/components/AddSelect/AddSelectFilter.js +2 -2
  21. package/es/components/AddSelect/AddSelectList.js +32 -6
  22. package/es/components/AddSelect/AddSelectMetaPanel.js +54 -0
  23. package/es/components/AddSelect/AddSelectSidebar.js +19 -1
  24. package/es/components/AddSelect/AddSelectSort.js +61 -0
  25. package/es/components/AddSelect/add-select-utils.js +21 -0
  26. package/es/components/AddSelect/hooks/useItemSort.js +20 -0
  27. package/es/components/DataSpreadsheet/DataSpreadsheet.js +29 -15
  28. package/es/components/DataSpreadsheet/DataSpreadsheetBody.js +89 -46
  29. package/es/components/DataSpreadsheet/DataSpreadsheetHeader.js +70 -6
  30. package/es/components/DataSpreadsheet/hooks/index.js +3 -1
  31. package/es/components/DataSpreadsheet/hooks/useSpreadsheetEdit.js +15 -14
  32. package/es/components/DataSpreadsheet/hooks/useSpreadsheetMouseMove.js +64 -0
  33. package/es/components/DataSpreadsheet/hooks/useSpreadsheetMouseUp.js +155 -0
  34. package/es/components/DataSpreadsheet/utils/createCellSelectionArea.js +3 -3
  35. package/es/components/DataSpreadsheet/utils/getCellSize.js +10 -10
  36. package/es/components/DataSpreadsheet/utils/getSpreadsheetWidth.js +8 -2
  37. package/es/components/DataSpreadsheet/utils/handleHeaderCellSelection.js +1 -1
  38. package/es/components/DataSpreadsheet/utils/moveColumnIndicatorLine.js +35 -0
  39. package/es/components/Datagrid/Datagrid/Datagrid.js +1 -1
  40. package/es/components/Datagrid/Datagrid/DatagridEmptyBody.js +22 -3
  41. package/es/components/Datagrid/Datagrid/addons/RowSize/RowSizeDropdown.js +3 -3
  42. package/es/components/Datagrid/Datagrid/addons/RowSize/RowSizeRadioGroup.js +1 -1
  43. package/es/components/ExportModal/ExportModal.js +1 -1
  44. package/lib/components/AddSelect/AddSelect.js +58 -8
  45. package/lib/components/AddSelect/AddSelectColumn.js +32 -71
  46. package/lib/components/AddSelect/AddSelectFilter.js +2 -2
  47. package/lib/components/AddSelect/AddSelectList.js +30 -4
  48. package/lib/components/AddSelect/AddSelectMetaPanel.js +77 -0
  49. package/lib/components/AddSelect/AddSelectSidebar.js +20 -1
  50. package/lib/components/AddSelect/AddSelectSort.js +79 -0
  51. package/lib/components/AddSelect/add-select-utils.js +29 -2
  52. package/lib/components/AddSelect/hooks/useItemSort.js +33 -0
  53. package/lib/components/DataSpreadsheet/DataSpreadsheet.js +28 -14
  54. package/lib/components/DataSpreadsheet/DataSpreadsheetBody.js +90 -45
  55. package/lib/components/DataSpreadsheet/DataSpreadsheetHeader.js +72 -6
  56. package/lib/components/DataSpreadsheet/hooks/index.js +17 -1
  57. package/lib/components/DataSpreadsheet/hooks/useSpreadsheetEdit.js +14 -14
  58. package/lib/components/DataSpreadsheet/hooks/useSpreadsheetMouseMove.js +78 -0
  59. package/lib/components/DataSpreadsheet/hooks/useSpreadsheetMouseUp.js +163 -0
  60. package/lib/components/DataSpreadsheet/utils/createCellSelectionArea.js +3 -3
  61. package/lib/components/DataSpreadsheet/utils/getCellSize.js +4 -4
  62. package/lib/components/DataSpreadsheet/utils/getSpreadsheetWidth.js +8 -2
  63. package/lib/components/DataSpreadsheet/utils/handleHeaderCellSelection.js +1 -1
  64. package/lib/components/DataSpreadsheet/utils/moveColumnIndicatorLine.js +46 -0
  65. package/lib/components/Datagrid/Datagrid/Datagrid.js +1 -1
  66. package/lib/components/Datagrid/Datagrid/DatagridEmptyBody.js +24 -3
  67. package/lib/components/Datagrid/Datagrid/addons/RowSize/RowSizeDropdown.js +3 -3
  68. package/lib/components/Datagrid/Datagrid/addons/RowSize/RowSizeRadioGroup.js +1 -1
  69. package/lib/components/ExportModal/ExportModal.js +1 -1
  70. package/package.json +13 -12
  71. package/scss/components/AddSelect/_add-select.scss +45 -5
  72. package/scss/components/DataSpreadsheet/_data-spreadsheet.scss +28 -14
  73. package/scss/components/Datagrid/_storybook-styles.scss +5 -0
  74. package/scss/components/Datagrid/styles/datagrid.scss +43 -5
@@ -2,7 +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", "clearFiltersText", "columnInputPlaceholder", "description", "globalFilters", "globalFiltersIconDescription", "globalFiltersPlaceholderText", "globalFiltersPrimaryButtonText", "globalFiltersSecondaryButtonText", "globalSearchLabel", "globalSearchPlaceholder", "influencerTitle", "items", "itemsLabel", "multi", "noResultsDescription", "noResultsTitle", "noSelectionDescription", "noSelectionTitle", "onClose", "onCloseButtonText", "onSubmit", "onSubmitButtonText", "open", "portalTarget", "removeIconDescription", "searchResultsLabel", "title"];
5
+ var _excluded = ["className", "clearFiltersText", "closeIconDescription", "columnInputPlaceholder", "description", "globalFilters", "globalFiltersIconDescription", "globalFiltersPlaceholderText", "globalFiltersPrimaryButtonText", "globalFiltersSecondaryButtonText", "globalSearchLabel", "globalSearchPlaceholder", "globalSortBy", "influencerTitle", "items", "itemsLabel", "metaIconDescription", "metaPanelTitle", "multi", "navIconDescription", "noResultsDescription", "noResultsTitle", "noSelectionDescription", "noSelectionTitle", "onClose", "onCloseButtonText", "onSubmit", "onSubmitButtonText", "open", "portalTarget", "removeIconDescription", "searchResultsLabel", "title"];
6
6
  //
7
7
  // Copyright IBM Corp. 2022
8
8
  //
@@ -22,12 +22,16 @@ import { AddSelectList } from './AddSelectList';
22
22
  import { AddSelectColumn } from './AddSelectColumn';
23
23
  import { normalize, flatten, getGlobalFilterValues } from './add-select-utils';
24
24
  import { AddSelectFilter } from './AddSelectFilter';
25
+ import { AddSelectSort } from './AddSelectSort';
26
+ import { sortItems } from './add-select-utils';
27
+ import { useItemSort } from './hooks/useItemSort';
25
28
  var componentName = 'AddSelect';
26
29
  export var AddSelect = /*#__PURE__*/forwardRef(function (_ref, ref) {
27
30
  var _cx;
28
31
 
29
32
  var className = _ref.className,
30
33
  clearFiltersText = _ref.clearFiltersText,
34
+ closeIconDescription = _ref.closeIconDescription,
31
35
  columnInputPlaceholder = _ref.columnInputPlaceholder,
32
36
  description = _ref.description,
33
37
  globalFilters = _ref.globalFilters,
@@ -37,10 +41,14 @@ export var AddSelect = /*#__PURE__*/forwardRef(function (_ref, ref) {
37
41
  globalFiltersSecondaryButtonText = _ref.globalFiltersSecondaryButtonText,
38
42
  globalSearchLabel = _ref.globalSearchLabel,
39
43
  globalSearchPlaceholder = _ref.globalSearchPlaceholder,
44
+ globalSortBy = _ref.globalSortBy,
40
45
  influencerTitle = _ref.influencerTitle,
41
46
  items = _ref.items,
42
47
  itemsLabel = _ref.itemsLabel,
48
+ metaIconDescription = _ref.metaIconDescription,
49
+ metaPanelTitle = _ref.metaPanelTitle,
43
50
  multi = _ref.multi,
51
+ navIconDescription = _ref.navIconDescription,
44
52
  noResultsDescription = _ref.noResultsDescription,
45
53
  noResultsTitle = _ref.noResultsTitle,
46
54
  noSelectionDescription = _ref.noSelectionDescription,
@@ -103,6 +111,17 @@ export var AddSelect = /*#__PURE__*/forwardRef(function (_ref, ref) {
103
111
  appliedGlobalFilters = _useState18[0],
104
112
  setAppliedGlobalFilters = _useState18[1];
105
113
 
114
+ var _useState19 = useState({}),
115
+ _useState20 = _slicedToArray(_useState19, 2),
116
+ displayMetalPanel = _useState20[0],
117
+ setDisplayMetaPanel = _useState20[1];
118
+
119
+ var _useItemSort = useItemSort(),
120
+ sortDirection = _useItemSort.sortDirection,
121
+ setSortDirection = _useItemSort.setSortDirection,
122
+ sortAttribute = _useItemSort.sortAttribute,
123
+ setSortAttribute = _useItemSort.setSortAttribute;
124
+
106
125
  useEffect(function () {
107
126
  var entries = items.entries; // flatItems is just a single array of all entries including children
108
127
 
@@ -192,6 +211,8 @@ export var AddSelect = /*#__PURE__*/forwardRef(function (_ref, ref) {
192
211
  return results;
193
212
  };
194
213
 
214
+ var sortFn = sortItems(sortAttribute, sortDirection);
215
+
195
216
  var getDisplayItems = function getDisplayItems() {
196
217
  if (useNormalizedItems) {
197
218
  // when global search or filter is in use the results are not in column format
@@ -204,7 +225,7 @@ export var AddSelect = /*#__PURE__*/forwardRef(function (_ref, ref) {
204
225
  return filters.every(function (filter) {
205
226
  return item[filter] === appliedGlobalFilters[filter];
206
227
  });
207
- });
228
+ }).sort(sortFn);
208
229
  return results;
209
230
  }
210
231
 
@@ -217,13 +238,16 @@ export var AddSelect = /*#__PURE__*/forwardRef(function (_ref, ref) {
217
238
 
218
239
  var itemsToDisplay = getDisplayItems();
219
240
  var commonListProps = {
241
+ metaIconDescription: metaIconDescription,
220
242
  multi: multi,
221
243
  multiSelection: multiSelection,
244
+ navIconDescription: navIconDescription,
222
245
  path: path,
223
246
  setMultiSelection: setMultiSelection,
224
247
  setPath: setPath,
225
248
  setSingleSelection: setSingleSelection,
226
- singleSelection: singleSelection
249
+ singleSelection: singleSelection,
250
+ setDisplayMetaPanel: setDisplayMetaPanel
227
251
  }; // handlers
228
252
 
229
253
  var handleSearch = function handleSearch(term) {
@@ -258,13 +282,17 @@ export var AddSelect = /*#__PURE__*/forwardRef(function (_ref, ref) {
258
282
  portalTarget: portalTarget
259
283
  };
260
284
  var sidebarProps = {
285
+ closeIconDescription: closeIconDescription,
261
286
  influencerTitle: influencerTitle,
262
287
  items: flatItems,
288
+ metaPanelTitle: metaPanelTitle,
263
289
  multiSelection: multiSelection,
264
290
  noSelectionDescription: noSelectionDescription,
265
291
  noSelectionTitle: noSelectionTitle,
266
292
  removeIconDescription: removeIconDescription,
267
- setMultiSelection: setMultiSelection
293
+ setMultiSelection: setMultiSelection,
294
+ displayMetalPanel: displayMetalPanel,
295
+ setDisplayMetaPanel: setDisplayMetaPanel
268
296
  };
269
297
 
270
298
  var setShowBreadsCrumbs = function setShowBreadsCrumbs() {
@@ -291,9 +319,11 @@ export var AddSelect = /*#__PURE__*/forwardRef(function (_ref, ref) {
291
319
  return true;
292
320
  };
293
321
 
322
+ var hasResults = itemsToDisplay.length > 0;
323
+ var globalFiltersApplied = Object.keys(appliedGlobalFilters).length > 0;
294
324
  var showBreadsCrumbs = setShowBreadsCrumbs();
295
- var showTags = setShowTags();
296
- var globalFiltersApplied = Object.keys(appliedGlobalFilters).length > 0; // main content
325
+ var showSort = (searchTerm || globalFiltersApplied) && hasResults;
326
+ var showTags = setShowTags(); // main content
297
327
 
298
328
  var body = /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
299
329
  className: "".concat(blockClass, "__header")
@@ -313,6 +343,8 @@ export var AddSelect = /*#__PURE__*/forwardRef(function (_ref, ref) {
313
343
  hasFiltersApplied: globalFiltersApplied,
314
344
  clearFiltersText: clearFiltersText
315
345
  }), /*#__PURE__*/React.createElement("div", {
346
+ className: "".concat(blockClass, "__sub-header")
347
+ }, /*#__PURE__*/React.createElement("div", {
316
348
  className: "".concat(blockClass, "__tag-container")
317
349
  }, showBreadsCrumbs ? /*#__PURE__*/React.createElement(AddSelectBreadcrumbs, {
318
350
  itemsLabel: itemsLabel,
@@ -323,7 +355,14 @@ export var AddSelect = /*#__PURE__*/forwardRef(function (_ref, ref) {
323
355
  }, searchTerm ? searchResultsLabel : itemsLabel), showTags && /*#__PURE__*/React.createElement(Tag, {
324
356
  type: "gray",
325
357
  size: "sm"
326
- }, itemsToDisplay.length))), useNormalizedItems && !searchTerm && !globalFiltersApplied ? /*#__PURE__*/React.createElement("div", {
358
+ }, itemsToDisplay.length)), showSort && /*#__PURE__*/React.createElement(AddSelectSort, {
359
+ items: itemsToDisplay,
360
+ setSortAttribute: setSortAttribute,
361
+ setSortDirection: setSortDirection,
362
+ sortAttribute: sortAttribute,
363
+ sortDirection: sortDirection,
364
+ sortBy: globalSortBy
365
+ }))), useNormalizedItems && !searchTerm && !globalFiltersApplied ? /*#__PURE__*/React.createElement("div", {
327
366
  className: "".concat(blockClass, "__columns")
328
367
  }, itemsToDisplay.map(function (page, idx) {
329
368
  var _path;
@@ -334,7 +373,7 @@ export var AddSelect = /*#__PURE__*/forwardRef(function (_ref, ref) {
334
373
  header: idx === 0 ? itemsLabel : (_path = path[idx - 1]) === null || _path === void 0 ? void 0 : _path.title,
335
374
  columnInputPlaceholder: columnInputPlaceholder
336
375
  }));
337
- })) : /*#__PURE__*/React.createElement("div", null, itemsToDisplay.length > 0 ? /*#__PURE__*/React.createElement(AddSelectList, _extends({}, commonListProps, {
376
+ })) : /*#__PURE__*/React.createElement("div", null, hasResults ? /*#__PURE__*/React.createElement(AddSelectList, _extends({}, commonListProps, {
338
377
  filteredItems: itemsToDisplay,
339
378
  modifiers: items === null || items === void 0 ? void 0 : items.modifiers
340
379
  })) : /*#__PURE__*/React.createElement("div", {
@@ -353,6 +392,7 @@ export var AddSelect = /*#__PURE__*/forwardRef(function (_ref, ref) {
353
392
  AddSelect.propTypes = {
354
393
  className: PropTypes.string,
355
394
  clearFiltersText: PropTypes.string,
395
+ closeIconDescription: PropTypes.string,
356
396
  columnInputPlaceholder: PropTypes.string,
357
397
  description: PropTypes.string,
358
398
  globalFilters: PropTypes.arrayOf(PropTypes.shape({
@@ -365,6 +405,7 @@ AddSelect.propTypes = {
365
405
  globalFiltersSecondaryButtonText: PropTypes.string,
366
406
  globalSearchLabel: PropTypes.string,
367
407
  globalSearchPlaceholder: PropTypes.string,
408
+ globalSortBy: PropTypes.array,
368
409
  influencerTitle: PropTypes.string,
369
410
  items: PropTypes.shape({
370
411
  modifiers: PropTypes.shape({
@@ -382,13 +423,21 @@ AddSelect.propTypes = {
382
423
  children: PropTypes.object,
383
424
  icon: PropTypes.object,
384
425
  id: PropTypes.string.isRequired,
426
+ meta: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.shape({
427
+ id: PropTypes.string,
428
+ title: PropTypes.string,
429
+ value: PropTypes.string
430
+ })), PropTypes.node]),
385
431
  subtitle: PropTypes.string,
386
432
  title: PropTypes.string.isRequired,
387
433
  value: PropTypes.string.isRequired
388
434
  }))
389
435
  }),
390
436
  itemsLabel: PropTypes.string,
437
+ metaIconDescription: PropTypes.string,
438
+ metaPanelTitle: PropTypes.string,
391
439
  multi: PropTypes.bool,
440
+ navIconDescription: PropTypes.string,
392
441
  noResultsDescription: PropTypes.string,
393
442
  noResultsTitle: PropTypes.string,
394
443
  noSelectionDescription: PropTypes.string,
@@ -11,14 +11,17 @@ var _excluded = ["columnInputPlaceholder", "filteredItems", "header", "multiSele
11
11
  //
12
12
  import React, { useState, useEffect } from 'react';
13
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';
14
+ import { TextInput, Tag, OverflowMenu, Checkbox } from 'carbon-components-react';
15
+ import { Filter32 } from '@carbon/icons-react';
16
16
  import { pkg, carbon } from '../../settings';
17
17
  import { AddSelectList } from './AddSelectList';
18
+ import { AddSelectSort } from './AddSelectSort';
19
+ import { sortItems, getSortBy } from './add-select-utils';
20
+ import { useItemSort } from './hooks/useItemSort';
18
21
  import uuidv4 from '../../global/js/utils/uuidv4';
19
22
  var componentName = 'AddSelect';
20
23
  export var AddSelectColumn = function AddSelectColumn(_ref) {
21
- var _filteredItems$find, _filteredItems$find2;
24
+ var _filteredItems$find;
22
25
 
23
26
  var columnInputPlaceholder = _ref.columnInputPlaceholder,
24
27
  filteredItems = _ref.filteredItems,
@@ -37,20 +40,16 @@ export var AddSelectColumn = function AddSelectColumn(_ref) {
37
40
  searchTerm = _useState4[0],
38
41
  setSearchTerm = _useState4[1];
39
42
 
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];
43
+ var _useItemSort = useItemSort(),
44
+ sortDirection = _useItemSort.sortDirection,
45
+ setSortDirection = _useItemSort.setSortDirection,
46
+ sortAttribute = _useItemSort.sortAttribute,
47
+ setSortAttribute = _useItemSort.setSortAttribute;
49
48
 
50
- var _useState9 = useState([]),
51
- _useState10 = _slicedToArray(_useState9, 2),
52
- filters = _useState10[0],
53
- setFilters = _useState10[1];
49
+ var _useState5 = useState([]),
50
+ _useState6 = _slicedToArray(_useState5, 2),
51
+ filters = _useState6[0],
52
+ setFilters = _useState6[1];
54
53
 
55
54
  var blockClass = "".concat(pkg.prefix, "--add-select");
56
55
  var colClass = "".concat(blockClass, "__column");
@@ -59,39 +58,14 @@ export var AddSelectColumn = function AddSelectColumn(_ref) {
59
58
  return multiSelection.includes(item.id);
60
59
  });
61
60
  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) {
61
+ }, [filteredItems, multiSelection]); // filtering
62
+
63
+ var colFilterBy = (_filteredItems$find = filteredItems.find(function (item) {
83
64
  return item.filterBy;
84
- })) === null || _filteredItems$find2 === void 0 ? void 0 : _filteredItems$find2.filterBy;
65
+ })) === null || _filteredItems$find === void 0 ? void 0 : _filteredItems$find.filterBy;
85
66
  var filterByOpts = colFilterBy ? filteredItems.map(function (item) {
86
67
  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
- };
68
+ }) : [];
95
69
 
96
70
  var selectAllHandler = function selectAllHandler(checked) {
97
71
  var itemIds = filteredItems.map(function (item) {
@@ -138,22 +112,11 @@ export var AddSelectColumn = function AddSelectColumn(_ref) {
138
112
  });
139
113
  };
140
114
 
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
-
115
+ var sortFn = sortItems(sortAttribute, sortDirection);
116
+ var sortBy = getSortBy(filteredItems);
154
117
  var colItems = filteredItems.filter(filterBySearch) // first check if the item meets the search
155
118
  .filter(filterByAttribute) // then check if the item is included in the filter
156
- .sort(sortItems); // then sort the items by whatever criteria
119
+ .sort(sortFn); // then sort the items by whatever criteria
157
120
 
158
121
  return /*#__PURE__*/React.createElement("div", {
159
122
  className: colClass
@@ -171,19 +134,14 @@ export var AddSelectColumn = function AddSelectColumn(_ref) {
171
134
  labelText: columnInputPlaceholder
172
135
  }), /*#__PURE__*/React.createElement("div", {
173
136
  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, {
137
+ }, /*#__PURE__*/React.createElement(AddSelectSort, {
138
+ items: filteredItems,
139
+ setSortAttribute: setSortAttribute,
140
+ setSortDirection: setSortDirection,
141
+ sortAttribute: sortAttribute,
142
+ sortDirection: sortDirection,
143
+ sortBy: sortBy
144
+ }), filterByOpts.length > 0 && /*#__PURE__*/React.createElement(OverflowMenu, {
187
145
  renderIcon: Filter32,
188
146
  className: "".concat(colClass, "-overflow"),
189
147
  flipped: true
@@ -88,7 +88,7 @@ export var AddSelectFilter = function AddSelectFilter(_ref) {
88
88
  };
89
89
 
90
90
  var showFilter = multi && (filterOpts === null || filterOpts === void 0 ? void 0 : filterOpts.length) > 0;
91
- return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
91
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
92
92
  className: "".concat(blockClass, "-search")
93
93
  }, /*#__PURE__*/React.createElement(TextInput, {
94
94
  id: "temp-id",
@@ -107,7 +107,7 @@ export var AddSelectFilter = function AddSelectFilter(_ref) {
107
107
  className: "".concat(blockClass, "-toggle"),
108
108
  size: "md"
109
109
  }), open && /*#__PURE__*/React.createElement("div", {
110
- className: "".concat(blockClass)
110
+ className: blockClass
111
111
  }, /*#__PURE__*/React.createElement("div", {
112
112
  className: "".concat(blockClass, "-content")
113
113
  }, /*#__PURE__*/React.createElement("p", null, "Filters"), /*#__PURE__*/React.createElement("div", {
@@ -7,8 +7,8 @@ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
7
7
  // LICENSE file in the root directory of this source tree.
8
8
  //
9
9
  import React from 'react';
10
- import { Checkbox, RadioButton, StructuredListRow, StructuredListWrapper, StructuredListBody, StructuredListCell, Dropdown } from 'carbon-components-react';
11
- import { ChevronRight16 } from '@carbon/icons-react';
10
+ import { Button, Checkbox, RadioButton, StructuredListRow, StructuredListWrapper, StructuredListBody, StructuredListCell, Dropdown } from 'carbon-components-react';
11
+ import { ChevronRight16, View16 } from '@carbon/icons-react';
12
12
  import PropTypes from 'prop-types';
13
13
  import cx from 'classnames';
14
14
  import { UserProfileImage } from '../UserProfileImage';
@@ -16,10 +16,13 @@ import { pkg } from '../../settings';
16
16
  var componentName = 'AddSelectList';
17
17
  export var AddSelectList = function AddSelectList(_ref) {
18
18
  var filteredItems = _ref.filteredItems,
19
+ metaIconDescription = _ref.metaIconDescription,
19
20
  modifiers = _ref.modifiers,
20
21
  multi = _ref.multi,
21
22
  multiSelection = _ref.multiSelection,
23
+ navIconDescription = _ref.navIconDescription,
22
24
  path = _ref.path,
25
+ setDisplayMetaPanel = _ref.setDisplayMetaPanel,
23
26
  setMultiSelection = _ref.setMultiSelection,
24
27
  setPath = _ref.setPath,
25
28
  setSingleSelection = _ref.setSingleSelection,
@@ -169,7 +172,7 @@ export var AddSelectList = function AddSelectList(_ref) {
169
172
  light: true,
170
173
  label: modifiers === null || modifiers === void 0 ? void 0 : modifiers.label,
171
174
  disabled: !isSelected(item.id),
172
- className: "".concat(blockClass, "-dropdown")
175
+ className: "".concat(blockClass, "-dropdown ").concat(blockClass, "-hidden-hover")
173
176
  })) : /*#__PURE__*/React.createElement(RadioButton, {
174
177
  className: "".concat(blockClass, "-radio"),
175
178
  name: "add-select-selections",
@@ -178,19 +181,42 @@ export var AddSelectList = function AddSelectList(_ref) {
178
181
  labelText: item.title,
179
182
  onChange: handleSingleSelection,
180
183
  selected: item.value === singleSelection
181
- }), item.children && /*#__PURE__*/React.createElement(ChevronRight16, {
184
+ }), item.children && /*#__PURE__*/React.createElement(Button, {
185
+ renderIcon: ChevronRight16,
186
+ iconDescription: navIconDescription,
187
+ tooltipPosition: "left",
188
+ tooltipAlignment: "center",
189
+ hasIconOnly: true,
182
190
  onClick: function onClick() {
183
191
  return onNavigateItem(item);
184
- }
185
- }))));
192
+ },
193
+ kind: "ghost",
194
+ size: "sm"
195
+ }), item.meta && /*#__PURE__*/React.createElement("div", {
196
+ className: "".concat(blockClass, "-hidden-hover")
197
+ }, /*#__PURE__*/React.createElement(Button, {
198
+ renderIcon: View16,
199
+ iconDescription: metaIconDescription,
200
+ tooltipPosition: "left",
201
+ tooltipAlignment: "center",
202
+ hasIconOnly: true,
203
+ onClick: function onClick() {
204
+ return setDisplayMetaPanel(item);
205
+ },
206
+ kind: "ghost",
207
+ size: "sm"
208
+ })))));
186
209
  }))));
187
210
  };
188
211
  AddSelectList.propTypes = {
189
212
  filteredItems: PropTypes.array,
213
+ metaIconDescription: PropTypes.string,
190
214
  modifiers: PropTypes.object,
191
215
  multi: PropTypes.bool,
192
216
  multiSelection: PropTypes.array,
217
+ navIconDescription: PropTypes.string,
193
218
  path: PropTypes.array,
219
+ setDisplayMetaPanel: PropTypes.func,
194
220
  setMultiSelection: PropTypes.func,
195
221
  setPath: PropTypes.func,
196
222
  setSingleSelection: PropTypes.func,
@@ -0,0 +1,54 @@
1
+ import React, { isValidElement } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { Close16 } from '@carbon/icons-react';
4
+ import { Button } from 'carbon-components-react';
5
+ import { pkg } from '../../settings';
6
+ var componentName = 'AddSelectMetaPanel';
7
+ export var AddSelectMetaPanel = function AddSelectMetaPanel(_ref) {
8
+ var closeIconDescription = _ref.closeIconDescription,
9
+ meta = _ref.meta,
10
+ setDisplayMetaPanel = _ref.setDisplayMetaPanel,
11
+ title = _ref.title;
12
+ var blockClass = "".concat(pkg.prefix, "--add-select__meta-panel");
13
+
14
+ var onCloseHandler = function onCloseHandler() {
15
+ setDisplayMetaPanel({});
16
+ };
17
+
18
+ return /*#__PURE__*/React.createElement("div", {
19
+ className: blockClass
20
+ }, /*#__PURE__*/React.createElement("div", {
21
+ className: "".concat(blockClass, "-header")
22
+ }, /*#__PURE__*/React.createElement("p", {
23
+ className: "".concat(blockClass, "-title")
24
+ }, title), /*#__PURE__*/React.createElement(Button, {
25
+ renderIcon: Close16,
26
+ iconDescription: closeIconDescription,
27
+ tooltipPosition: "left",
28
+ tooltipAlignment: "center",
29
+ hasIconOnly: true,
30
+ onClick: onCloseHandler,
31
+ kind: "ghost",
32
+ size: "sm"
33
+ })), /*#__PURE__*/isValidElement(meta) ? meta : meta.map(function (entry) {
34
+ return /*#__PURE__*/React.createElement("div", {
35
+ key: entry.id,
36
+ className: "".concat(blockClass, "-entry")
37
+ }, /*#__PURE__*/React.createElement("p", {
38
+ className: "".concat(blockClass, "-entry-title")
39
+ }, entry.title), /*#__PURE__*/React.createElement("p", {
40
+ className: "".concat(blockClass, "-entry-body")
41
+ }, entry.value));
42
+ }));
43
+ };
44
+ AddSelectMetaPanel.propTypes = {
45
+ closeIconDescription: PropTypes.string,
46
+ meta: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.shape({
47
+ id: PropTypes.string,
48
+ title: PropTypes.string,
49
+ value: PropTypes.string
50
+ })), PropTypes.node]),
51
+ setDisplayMetaPanel: PropTypes.func,
52
+ title: PropTypes.string
53
+ };
54
+ AddSelectMetaPanel.displayName = componentName;
@@ -12,14 +12,19 @@ import { SubtractAlt32 } from '@carbon/icons-react';
12
12
  import PropTypes from 'prop-types';
13
13
  import { NoDataEmptyState } from '../../components/EmptyStates/NoDataEmptyState';
14
14
  import { pkg } from '../../settings';
15
+ import { AddSelectMetaPanel } from './AddSelectMetaPanel';
15
16
  var componentName = 'AddSelectSidebar';
16
17
  export var AddSelectSidebar = function AddSelectSidebar(_ref) {
17
- var influencerTitle = _ref.influencerTitle,
18
+ var closeIconDescription = _ref.closeIconDescription,
19
+ displayMetalPanel = _ref.displayMetalPanel,
20
+ influencerTitle = _ref.influencerTitle,
18
21
  items = _ref.items,
22
+ metaPanelTitle = _ref.metaPanelTitle,
19
23
  multiSelection = _ref.multiSelection,
20
24
  noSelectionDescription = _ref.noSelectionDescription,
21
25
  noSelectionTitle = _ref.noSelectionTitle,
22
26
  removeIconDescription = _ref.removeIconDescription,
27
+ setDisplayMetaPanel = _ref.setDisplayMetaPanel,
23
28
  setMultiSelection = _ref.setMultiSelection;
24
29
  var blockClass = "".concat(pkg.prefix, "--add-select__sidebar");
25
30
 
@@ -69,6 +74,15 @@ export var AddSelectSidebar = function AddSelectSidebar(_ref) {
69
74
  }));
70
75
  };
71
76
 
77
+ if (Object.keys(displayMetalPanel).length !== 0) {
78
+ return /*#__PURE__*/React.createElement(AddSelectMetaPanel, {
79
+ closeIconDescription: closeIconDescription,
80
+ meta: displayMetalPanel.meta,
81
+ setDisplayMetaPanel: setDisplayMetaPanel,
82
+ title: metaPanelTitle
83
+ });
84
+ }
85
+
72
86
  return /*#__PURE__*/React.createElement("div", {
73
87
  className: blockClass
74
88
  }, /*#__PURE__*/React.createElement("div", {
@@ -103,12 +117,16 @@ export var AddSelectSidebar = function AddSelectSidebar(_ref) {
103
117
  })));
104
118
  };
105
119
  AddSelectSidebar.propTypes = {
120
+ closeIconDescription: PropTypes.string,
121
+ displayMetalPanel: PropTypes.object,
106
122
  influencerTitle: PropTypes.string,
107
123
  items: PropTypes.array,
124
+ metaPanelTitle: PropTypes.string,
108
125
  multiSelection: PropTypes.array,
109
126
  noSelectionDescription: PropTypes.string,
110
127
  noSelectionTitle: PropTypes.string,
111
128
  removeIconDescription: PropTypes.string,
129
+ setDisplayMetaPanel: PropTypes.func,
112
130
  setMultiSelection: PropTypes.func
113
131
  };
114
132
  AddSelectSidebar.displayName = componentName;
@@ -0,0 +1,61 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
+ //
3
+ // Copyright IBM Corp. 2022
4
+ //
5
+ // This source code is licensed under the Apache-2.0 license found in the
6
+ // LICENSE file in the root directory of this source tree.
7
+ //
8
+ import React from 'react';
9
+ import PropTypes from 'prop-types';
10
+ import { OverflowMenu, OverflowMenuItem } from 'carbon-components-react';
11
+ import { ArrowsVertical32, ArrowUp16, ArrowDown16 } from '@carbon/icons-react';
12
+ import { pkg } from '../../settings';
13
+ var componentName = 'AddSelect';
14
+ export var AddSelectSort = function AddSelectSort(_ref) {
15
+ var setSortAttribute = _ref.setSortAttribute,
16
+ setSortDirection = _ref.setSortDirection,
17
+ sortBy = _ref.sortBy;
18
+ var blockClass = "".concat(pkg.prefix, "--add-select-sort");
19
+ var sortByOpts = sortBy ? sortBy.reduce(function (acc, cur) {
20
+ var opts = [{
21
+ id: "".concat(cur, "-asc"),
22
+ itemText: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ArrowUp16, null), cur),
23
+ direction: 'asc',
24
+ attribute: cur
25
+ }, {
26
+ id: "".concat(cur, "-desc"),
27
+ itemText: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ArrowDown16, null), cur),
28
+ direction: 'desc',
29
+ attribute: cur
30
+ }];
31
+ return [].concat(_toConsumableArray(acc), opts);
32
+ }, []) : []; // handlers
33
+
34
+ var sortHandler = function sortHandler(_ref2) {
35
+ var direction = _ref2.direction,
36
+ attribute = _ref2.attribute;
37
+ setSortAttribute(attribute);
38
+ setSortDirection(direction);
39
+ };
40
+
41
+ return /*#__PURE__*/React.createElement("div", {
42
+ className: blockClass
43
+ }, sortByOpts.length > 0 && /*#__PURE__*/React.createElement(OverflowMenu, {
44
+ renderIcon: ArrowsVertical32,
45
+ flipped: true
46
+ }, sortByOpts.map(function (opt) {
47
+ return /*#__PURE__*/React.createElement(OverflowMenuItem, {
48
+ key: opt.id,
49
+ itemText: opt.itemText,
50
+ onClick: function onClick() {
51
+ return sortHandler(opt);
52
+ }
53
+ });
54
+ })));
55
+ };
56
+ AddSelectSort.propTypes = {
57
+ setSortAttribute: PropTypes.func,
58
+ setSortDirection: PropTypes.func,
59
+ sortBy: PropTypes.array
60
+ };
61
+ AddSelectSort.displayName = componentName;
@@ -91,4 +91,25 @@ export var getGlobalFilterValues = function getGlobalFilterValues(globalFilters,
91
91
  return prevFilter;
92
92
  }, []);
93
93
  return filterOpts;
94
+ };
95
+ export var sortItems = function sortItems(attribute, direction) {
96
+ return function (a, b) {
97
+ var _a$attribute, _b$attribute;
98
+
99
+ var valueA = (_a$attribute = a[attribute]) === null || _a$attribute === void 0 ? void 0 : _a$attribute.split(' ').join('');
100
+ var valueB = (_b$attribute = b[attribute]) === null || _b$attribute === void 0 ? void 0 : _b$attribute.split(' ').join('');
101
+
102
+ if (direction === 'desc') {
103
+ return valueA > valueB ? -1 : 1;
104
+ }
105
+
106
+ return valueA < valueB ? -1 : 1;
107
+ };
108
+ };
109
+ export var getSortBy = function getSortBy(items) {
110
+ var _items$find;
111
+
112
+ return (_items$find = items.find(function (item) {
113
+ return item.sortBy;
114
+ })) === null || _items$find === void 0 ? void 0 : _items$find.sortBy;
94
115
  };
@@ -0,0 +1,20 @@
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ import { useState } from 'react';
3
+ export var useItemSort = function useItemSort() {
4
+ var _useState = useState(''),
5
+ _useState2 = _slicedToArray(_useState, 2),
6
+ sortDirection = _useState2[0],
7
+ setSortDirection = _useState2[1];
8
+
9
+ var _useState3 = useState(''),
10
+ _useState4 = _slicedToArray(_useState3, 2),
11
+ sortAttribute = _useState4[0],
12
+ setSortAttribute = _useState4[1];
13
+
14
+ return {
15
+ sortDirection: sortDirection,
16
+ setSortDirection: setSortDirection,
17
+ sortAttribute: sortAttribute,
18
+ setSortAttribute: setSortAttribute
19
+ };
20
+ };