@carbon/ibm-products 1.16.0 → 1.18.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (101) 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 +241 -93
  7. package/css/index-full-carbon.css.map +1 -1
  8. package/css/index-full-carbon.min.css +7 -4
  9. package/css/index-full-carbon.min.css.map +1 -1
  10. package/css/index-without-carbon-released-only.css +9 -3
  11. package/css/index-without-carbon-released-only.css.map +1 -1
  12. package/css/index-without-carbon-released-only.min.css +4 -1
  13. package/css/index-without-carbon-released-only.min.css.map +1 -1
  14. package/css/index-without-carbon.css +124 -27
  15. package/css/index-without-carbon.css.map +1 -1
  16. package/css/index-without-carbon.min.css +6 -3
  17. package/css/index-without-carbon.min.css.map +1 -1
  18. package/css/index.css +150 -58
  19. package/css/index.css.map +1 -1
  20. package/css/index.min.css +7 -4
  21. package/css/index.min.css.map +1 -1
  22. package/es/components/AddSelect/AddSelect.js +57 -8
  23. package/es/components/AddSelect/AddSelectColumn.js +31 -73
  24. package/es/components/AddSelect/AddSelectFilter.js +2 -2
  25. package/es/components/AddSelect/AddSelectList.js +32 -6
  26. package/es/components/AddSelect/AddSelectMetaPanel.js +54 -0
  27. package/es/components/AddSelect/AddSelectSidebar.js +19 -1
  28. package/es/components/AddSelect/AddSelectSort.js +61 -0
  29. package/es/components/AddSelect/add-select-utils.js +21 -0
  30. package/es/components/AddSelect/hooks/useItemSort.js +20 -0
  31. package/es/components/DataSpreadsheet/DataSpreadsheet.js +28 -13
  32. package/es/components/DataSpreadsheet/DataSpreadsheetBody.js +60 -42
  33. package/es/components/DataSpreadsheet/DataSpreadsheetHeader.js +73 -6
  34. package/es/components/DataSpreadsheet/hooks/index.js +3 -1
  35. package/es/components/DataSpreadsheet/hooks/useSpreadsheetEdit.js +65 -19
  36. package/es/components/DataSpreadsheet/hooks/useSpreadsheetMouseMove.js +60 -0
  37. package/es/components/DataSpreadsheet/hooks/useSpreadsheetMouseUp.js +153 -0
  38. package/es/components/DataSpreadsheet/utils/checkSelectedHeaderCell.js +16 -0
  39. package/es/components/DataSpreadsheet/utils/createCellSelectionArea.js +11 -6
  40. package/es/components/DataSpreadsheet/utils/getSpreadsheetWidth.js +8 -2
  41. package/es/components/DataSpreadsheet/utils/handleHeaderCellSelection.js +7 -3
  42. package/es/components/DataSpreadsheet/utils/moveColumnIndicatorLine.js +34 -0
  43. package/es/components/Datagrid/Datagrid/Datagrid.js +25 -13
  44. package/es/components/Datagrid/Datagrid/DatagridEmptyBody.js +22 -3
  45. package/es/components/Datagrid/Datagrid/DatagridHead.js +8 -16
  46. package/es/components/Datagrid/Datagrid/DatagridHeaderRow.js +10 -10
  47. package/es/components/Datagrid/Datagrid/addons/RowSize/RowSizeDropdown.js +3 -3
  48. package/es/components/Datagrid/Datagrid/addons/RowSize/RowSizeRadioGroup.js +1 -1
  49. package/es/components/Datagrid/Datagrid/index.js +6 -7
  50. package/es/components/Datagrid/index.js +1 -1
  51. package/es/components/ExportModal/ExportModal.js +10 -5
  52. package/es/components/SidePanel/SidePanel.js +5 -1
  53. package/es/components/WebTerminal/WebTerminal.js +36 -11
  54. package/es/components/WebTerminal/WebTerminalContentWrapper.js +49 -0
  55. package/es/components/WebTerminal/index.js +2 -1
  56. package/es/components/index.js +1 -1
  57. package/es/global/js/package-settings.js +1 -0
  58. package/lib/components/AddSelect/AddSelect.js +58 -8
  59. package/lib/components/AddSelect/AddSelectColumn.js +32 -71
  60. package/lib/components/AddSelect/AddSelectFilter.js +2 -2
  61. package/lib/components/AddSelect/AddSelectList.js +30 -4
  62. package/lib/components/AddSelect/AddSelectMetaPanel.js +77 -0
  63. package/lib/components/AddSelect/AddSelectSidebar.js +20 -1
  64. package/lib/components/AddSelect/AddSelectSort.js +79 -0
  65. package/lib/components/AddSelect/add-select-utils.js +29 -2
  66. package/lib/components/AddSelect/hooks/useItemSort.js +33 -0
  67. package/lib/components/DataSpreadsheet/DataSpreadsheet.js +27 -12
  68. package/lib/components/DataSpreadsheet/DataSpreadsheetBody.js +62 -41
  69. package/lib/components/DataSpreadsheet/DataSpreadsheetHeader.js +76 -6
  70. package/lib/components/DataSpreadsheet/hooks/index.js +17 -1
  71. package/lib/components/DataSpreadsheet/hooks/useSpreadsheetEdit.js +68 -18
  72. package/lib/components/DataSpreadsheet/hooks/useSpreadsheetMouseMove.js +74 -0
  73. package/lib/components/DataSpreadsheet/hooks/useSpreadsheetMouseUp.js +161 -0
  74. package/lib/components/DataSpreadsheet/utils/checkSelectedHeaderCell.js +26 -0
  75. package/lib/components/DataSpreadsheet/utils/createCellSelectionArea.js +11 -6
  76. package/lib/components/DataSpreadsheet/utils/getSpreadsheetWidth.js +8 -2
  77. package/lib/components/DataSpreadsheet/utils/handleHeaderCellSelection.js +7 -3
  78. package/lib/components/DataSpreadsheet/utils/moveColumnIndicatorLine.js +45 -0
  79. package/lib/components/Datagrid/Datagrid/Datagrid.js +26 -9
  80. package/lib/components/Datagrid/Datagrid/DatagridEmptyBody.js +24 -3
  81. package/lib/components/Datagrid/Datagrid/DatagridHead.js +8 -16
  82. package/lib/components/Datagrid/Datagrid/DatagridHeaderRow.js +10 -10
  83. package/lib/components/Datagrid/Datagrid/addons/RowSize/RowSizeDropdown.js +3 -3
  84. package/lib/components/Datagrid/Datagrid/addons/RowSize/RowSizeRadioGroup.js +1 -1
  85. package/lib/components/Datagrid/Datagrid/index.js +3 -5
  86. package/lib/components/Datagrid/index.js +2 -2
  87. package/lib/components/ExportModal/ExportModal.js +9 -4
  88. package/lib/components/SidePanel/SidePanel.js +5 -1
  89. package/lib/components/WebTerminal/WebTerminal.js +36 -10
  90. package/lib/components/WebTerminal/WebTerminalContentWrapper.js +58 -0
  91. package/lib/components/WebTerminal/index.js +9 -1
  92. package/lib/components/index.js +6 -0
  93. package/lib/global/js/package-settings.js +1 -0
  94. package/package.json +17 -16
  95. package/scss/components/AddSelect/_add-select.scss +45 -5
  96. package/scss/components/DataSpreadsheet/_data-spreadsheet.scss +31 -13
  97. package/scss/components/Datagrid/_storybook-styles.scss +5 -0
  98. package/scss/components/Datagrid/styles/datagrid.scss +43 -5
  99. package/scss/components/SidePanel/_side-panel.scss +22 -3
  100. package/scss/components/WebTerminal/_storybook-styles.scss +5 -0
  101. package/scss/components/WebTerminal/_web-terminal.scss +14 -4
@@ -22,7 +22,8 @@ import cx from 'classnames';
22
22
  import { pkg } from '../../settings'; // Carbon and package components we use.
23
23
 
24
24
  import { Close16 as Close, Help16 as Help } from '@carbon/icons-react';
25
- import { Button, OverflowMenu, OverflowMenuItem } from 'carbon-components-react'; // The block part of our conventional BEM class names (blockClass__E--M).
25
+ import { Button, OverflowMenu, OverflowMenuItem } from 'carbon-components-react';
26
+ import { moderate02 } from '@carbon/motion'; // The block part of our conventional BEM class names (blockClass__E--M).
26
27
 
27
28
  var componentName = 'WebTerminal';
28
29
  var blockClass = "".concat(pkg.prefix, "--web-terminal"); // Default values for props
@@ -33,7 +34,7 @@ var defaults = {
33
34
  documentationLinksIconDescription: 'Show documentation links'
34
35
  };
35
36
  export var WebTerminal = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
36
- var _ref2;
37
+ var _ref3;
37
38
 
38
39
  var _ref$actions = _ref.actions,
39
40
  actions = _ref$actions === void 0 ? defaults.actions : _ref$actions,
@@ -53,6 +54,12 @@ export var WebTerminal = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
53
54
  shouldRender = _useState2[0],
54
55
  setRender = _useState2[1];
55
56
 
57
+ var _ref2 = window && window.matchMedia ? window.matchMedia('(prefers-reduced-motion: reduce)') : {
58
+ matches: true
59
+ },
60
+ prefersReducedMotion = _ref2.matches;
61
+
62
+ var webTerminalAnimationName = "".concat(open ? 'web-terminal-entrance' : 'web-terminal-exit', " ").concat(moderate02);
56
63
  var showDocumentationLinks = useMemo(function () {
57
64
  return documentationLinks.length > 0;
58
65
  }, [documentationLinks]);
@@ -61,6 +68,9 @@ export var WebTerminal = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
61
68
  setRender(true);
62
69
  }
63
70
  }, [open]);
71
+ /**
72
+ When the web terminal slide in animation is complete, sets render to false.
73
+ */
64
74
 
65
75
  var onAnimationEnd = function onAnimationEnd() {
66
76
  if (!open) {
@@ -68,11 +78,23 @@ export var WebTerminal = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
68
78
  }
69
79
  };
70
80
 
81
+ var handleCloseTerminal = function handleCloseTerminal() {
82
+ /**
83
+ If the user prefers reduced motion, we have to manually set render to false
84
+ because onAnimationEnd will never be called.
85
+ */
86
+ if (prefersReducedMotion) {
87
+ setRender(false);
88
+ }
89
+
90
+ closeTerminal();
91
+ };
92
+
71
93
  return shouldRender ? /*#__PURE__*/React.createElement("div", _extends({}, rest, {
72
94
  ref: ref,
73
- className: cx([className, blockClass, (_ref2 = {}, _defineProperty(_ref2, "".concat(blockClass, "--open"), open), _defineProperty(_ref2, "".concat(blockClass, "--closed"), !open), _ref2)]),
95
+ className: cx([className, blockClass, (_ref3 = {}, _defineProperty(_ref3, "".concat(blockClass, "--open"), open), _defineProperty(_ref3, "".concat(blockClass, "--closed"), !open), _ref3)]),
74
96
  style: {
75
- animation: "".concat(open ? 'web-terminal-entrance 250ms' : 'web-terminal-exit 250ms')
97
+ animation: !prefersReducedMotion && webTerminalAnimationName
76
98
  },
77
99
  onAnimationEnd: onAnimationEnd
78
100
  }), /*#__PURE__*/React.createElement("header", {
@@ -84,16 +106,16 @@ export var WebTerminal = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
84
106
  iconDescription: documentationLinksIconDescription,
85
107
  menuOptionsClass: "".concat(blockClass, "__documentation-overflow"),
86
108
  size: "lg"
87
- }, documentationLinks.map(function (_ref3, i) {
88
- var rest = _extends({}, _ref3);
109
+ }, documentationLinks.map(function (_ref4, i) {
110
+ var rest = _extends({}, _ref4);
89
111
 
90
112
  return /*#__PURE__*/React.createElement(OverflowMenuItem, _extends({
91
113
  key: i
92
114
  }, rest));
93
- })), actions.map(function (_ref4) {
94
- var renderIcon = _ref4.renderIcon,
95
- onClick = _ref4.onClick,
96
- iconDescription = _ref4.iconDescription;
115
+ })), actions.map(function (_ref5) {
116
+ var renderIcon = _ref5.renderIcon,
117
+ onClick = _ref5.onClick,
118
+ iconDescription = _ref5.iconDescription;
97
119
  return /*#__PURE__*/React.createElement(Button, {
98
120
  key: iconDescription,
99
121
  hasIconOnly: true,
@@ -107,7 +129,10 @@ export var WebTerminal = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
107
129
  renderIcon: Close,
108
130
  kind: "ghost",
109
131
  iconDescription: closeIconDescription,
110
- onClick: closeTerminal
132
+ onClick: handleCloseTerminal,
133
+ onAnimationEnd: function onAnimationEnd(event) {
134
+ return event.stopPropagation();
135
+ }
111
136
  })), /*#__PURE__*/React.createElement("div", {
112
137
  className: "".concat(blockClass, "__body")
113
138
  }, children)) : null;
@@ -0,0 +1,49 @@
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
+ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
4
+ var _excluded = ["children", "isTerminalOpen"];
5
+
6
+ /**
7
+ * Copyright IBM Corp. 2020, 2021
8
+ *
9
+ * This source code is licensed under the Apache-2.0 license found in the
10
+ * LICENSE file in the root directory of this source tree.
11
+ */
12
+ // Import portions of React that are needed.
13
+ import React from 'react'; // Other standard imports.
14
+
15
+ import PropTypes from 'prop-types';
16
+ import cx from 'classnames';
17
+ import { pkg } from '../../settings'; // The block part of our conventional BEM class names (blockClass__E--M).
18
+
19
+ var componentName = 'WebTerminalContentWrapper';
20
+ var blockClass = "".concat(pkg.prefix, "--web-terminal-content-wrapper");
21
+ export var WebTerminalContentWrapper = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
22
+ var children = _ref.children,
23
+ isTerminalOpen = _ref.isTerminalOpen,
24
+ rest = _objectWithoutProperties(_ref, _excluded);
25
+
26
+ return /*#__PURE__*/React.createElement("div", _extends({
27
+ ref: ref,
28
+ className: cx([blockClass, _defineProperty({}, "".concat(blockClass, "--open"), isTerminalOpen)])
29
+ }, rest), children);
30
+ }); // Return a placeholder if not released and not enabled by feature flag
31
+
32
+ WebTerminalContentWrapper = pkg.checkComponentEnabled(WebTerminalContentWrapper, componentName); // The display name of the component, used by React. Note that displayName
33
+ // is used in preference to relying on function.name.
34
+
35
+ WebTerminalContentWrapper.displayName = componentName; // The types and DocGen commentary for the component props,
36
+ // in alphabetical order (for consistency).
37
+ // See https://www.npmjs.com/package/prop-types#usage.
38
+
39
+ WebTerminalContentWrapper.propTypes = {
40
+ /**
41
+ * Pass in content as children.
42
+ */
43
+ children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]).isRequired,
44
+
45
+ /**
46
+ * A boolean to determine if the terminal is open.
47
+ */
48
+ isTerminalOpen: PropTypes.bool.isRequired
49
+ };
@@ -1 +1,2 @@
1
- export { WebTerminal } from './WebTerminal';
1
+ export { WebTerminal } from './WebTerminal';
2
+ export { WebTerminalContentWrapper } from './WebTerminalContentWrapper';
@@ -32,7 +32,7 @@ export { TagSet } from './TagSet';
32
32
  export { Tearsheet, TearsheetNarrow } from './Tearsheet';
33
33
  export { Toolbar, ToolbarButton, ToolbarGroup } from './Toolbar';
34
34
  export { UserProfileImage } from './UserProfileImage';
35
- export { WebTerminal } from './WebTerminal';
35
+ export { WebTerminal, WebTerminalContentWrapper } from './WebTerminal';
36
36
  export { EditSidePanel } from './EditSidePanel';
37
37
  export { OptionsTile } from './OptionsTile';
38
38
  export { InlineEdit } from './InlineEdit';
@@ -60,6 +60,7 @@ var defaults = {
60
60
  ToolbarButton: false,
61
61
  ToolbarGroup: false,
62
62
  WebTerminal: false,
63
+ WebTerminalContentWrapper: false,
63
64
  EditSidePanel: false,
64
65
  CancelableTextEdit: false,
65
66
  InlineEdit: false,
@@ -43,7 +43,11 @@ var _addSelectUtils = require("./add-select-utils");
43
43
 
44
44
  var _AddSelectFilter = require("./AddSelectFilter");
45
45
 
46
- 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"];
46
+ var _AddSelectSort = require("./AddSelectSort");
47
+
48
+ var _useItemSort2 = require("./hooks/useItemSort");
49
+
50
+ 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"];
47
51
 
48
52
  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); }
49
53
 
@@ -55,6 +59,7 @@ var AddSelect = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
55
59
 
56
60
  var className = _ref.className,
57
61
  clearFiltersText = _ref.clearFiltersText,
62
+ closeIconDescription = _ref.closeIconDescription,
58
63
  columnInputPlaceholder = _ref.columnInputPlaceholder,
59
64
  description = _ref.description,
60
65
  globalFilters = _ref.globalFilters,
@@ -64,10 +69,14 @@ var AddSelect = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
64
69
  globalFiltersSecondaryButtonText = _ref.globalFiltersSecondaryButtonText,
65
70
  globalSearchLabel = _ref.globalSearchLabel,
66
71
  globalSearchPlaceholder = _ref.globalSearchPlaceholder,
72
+ globalSortBy = _ref.globalSortBy,
67
73
  influencerTitle = _ref.influencerTitle,
68
74
  items = _ref.items,
69
75
  itemsLabel = _ref.itemsLabel,
76
+ metaIconDescription = _ref.metaIconDescription,
77
+ metaPanelTitle = _ref.metaPanelTitle,
70
78
  multi = _ref.multi,
79
+ navIconDescription = _ref.navIconDescription,
71
80
  noResultsDescription = _ref.noResultsDescription,
72
81
  noResultsTitle = _ref.noResultsTitle,
73
82
  noSelectionDescription = _ref.noSelectionDescription,
@@ -129,6 +138,17 @@ var AddSelect = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
129
138
  appliedGlobalFilters = _useState18[0],
130
139
  setAppliedGlobalFilters = _useState18[1];
131
140
 
141
+ var _useState19 = (0, _react.useState)({}),
142
+ _useState20 = (0, _slicedToArray2.default)(_useState19, 2),
143
+ displayMetalPanel = _useState20[0],
144
+ setDisplayMetaPanel = _useState20[1];
145
+
146
+ var _useItemSort = (0, _useItemSort2.useItemSort)(),
147
+ sortDirection = _useItemSort.sortDirection,
148
+ setSortDirection = _useItemSort.setSortDirection,
149
+ sortAttribute = _useItemSort.sortAttribute,
150
+ setSortAttribute = _useItemSort.setSortAttribute;
151
+
132
152
  (0, _react.useEffect)(function () {
133
153
  var entries = items.entries; // flatItems is just a single array of all entries including children
134
154
 
@@ -218,6 +238,8 @@ var AddSelect = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
218
238
  return results;
219
239
  };
220
240
 
241
+ var sortFn = (0, _addSelectUtils.sortItems)(sortAttribute, sortDirection);
242
+
221
243
  var getDisplayItems = function getDisplayItems() {
222
244
  if (useNormalizedItems) {
223
245
  // when global search or filter is in use the results are not in column format
@@ -230,7 +252,7 @@ var AddSelect = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
230
252
  return filters.every(function (filter) {
231
253
  return item[filter] === appliedGlobalFilters[filter];
232
254
  });
233
- });
255
+ }).sort(sortFn);
234
256
  return results;
235
257
  }
236
258
 
@@ -243,13 +265,16 @@ var AddSelect = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
243
265
 
244
266
  var itemsToDisplay = getDisplayItems();
245
267
  var commonListProps = {
268
+ metaIconDescription: metaIconDescription,
246
269
  multi: multi,
247
270
  multiSelection: multiSelection,
271
+ navIconDescription: navIconDescription,
248
272
  path: path,
249
273
  setMultiSelection: setMultiSelection,
250
274
  setPath: setPath,
251
275
  setSingleSelection: setSingleSelection,
252
- singleSelection: singleSelection
276
+ singleSelection: singleSelection,
277
+ setDisplayMetaPanel: setDisplayMetaPanel
253
278
  }; // handlers
254
279
 
255
280
  var handleSearch = function handleSearch(term) {
@@ -284,13 +309,17 @@ var AddSelect = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
284
309
  portalTarget: portalTarget
285
310
  };
286
311
  var sidebarProps = {
312
+ closeIconDescription: closeIconDescription,
287
313
  influencerTitle: influencerTitle,
288
314
  items: flatItems,
315
+ metaPanelTitle: metaPanelTitle,
289
316
  multiSelection: multiSelection,
290
317
  noSelectionDescription: noSelectionDescription,
291
318
  noSelectionTitle: noSelectionTitle,
292
319
  removeIconDescription: removeIconDescription,
293
- setMultiSelection: setMultiSelection
320
+ setMultiSelection: setMultiSelection,
321
+ displayMetalPanel: displayMetalPanel,
322
+ setDisplayMetaPanel: setDisplayMetaPanel
294
323
  };
295
324
 
296
325
  var setShowBreadsCrumbs = function setShowBreadsCrumbs() {
@@ -317,9 +346,11 @@ var AddSelect = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
317
346
  return true;
318
347
  };
319
348
 
349
+ var hasResults = itemsToDisplay.length > 0;
350
+ var globalFiltersApplied = Object.keys(appliedGlobalFilters).length > 0;
320
351
  var showBreadsCrumbs = setShowBreadsCrumbs();
321
- var showTags = setShowTags();
322
- var globalFiltersApplied = Object.keys(appliedGlobalFilters).length > 0; // main content
352
+ var showSort = (searchTerm || globalFiltersApplied) && hasResults;
353
+ var showTags = setShowTags(); // main content
323
354
 
324
355
  var body = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
325
356
  className: "".concat(blockClass, "__header")
@@ -339,6 +370,8 @@ var AddSelect = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
339
370
  hasFiltersApplied: globalFiltersApplied,
340
371
  clearFiltersText: clearFiltersText
341
372
  }), /*#__PURE__*/_react.default.createElement("div", {
373
+ className: "".concat(blockClass, "__sub-header")
374
+ }, /*#__PURE__*/_react.default.createElement("div", {
342
375
  className: "".concat(blockClass, "__tag-container")
343
376
  }, showBreadsCrumbs ? /*#__PURE__*/_react.default.createElement(_AddSelectBreadcrumbs.AddSelectBreadcrumbs, {
344
377
  itemsLabel: itemsLabel,
@@ -349,7 +382,14 @@ var AddSelect = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
349
382
  }, searchTerm ? searchResultsLabel : itemsLabel), showTags && /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.Tag, {
350
383
  type: "gray",
351
384
  size: "sm"
352
- }, itemsToDisplay.length))), useNormalizedItems && !searchTerm && !globalFiltersApplied ? /*#__PURE__*/_react.default.createElement("div", {
385
+ }, itemsToDisplay.length)), showSort && /*#__PURE__*/_react.default.createElement(_AddSelectSort.AddSelectSort, {
386
+ items: itemsToDisplay,
387
+ setSortAttribute: setSortAttribute,
388
+ setSortDirection: setSortDirection,
389
+ sortAttribute: sortAttribute,
390
+ sortDirection: sortDirection,
391
+ sortBy: globalSortBy
392
+ }))), useNormalizedItems && !searchTerm && !globalFiltersApplied ? /*#__PURE__*/_react.default.createElement("div", {
353
393
  className: "".concat(blockClass, "__columns")
354
394
  }, itemsToDisplay.map(function (page, idx) {
355
395
  var _path;
@@ -360,7 +400,7 @@ var AddSelect = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
360
400
  header: idx === 0 ? itemsLabel : (_path = path[idx - 1]) === null || _path === void 0 ? void 0 : _path.title,
361
401
  columnInputPlaceholder: columnInputPlaceholder
362
402
  }));
363
- })) : /*#__PURE__*/_react.default.createElement("div", null, itemsToDisplay.length > 0 ? /*#__PURE__*/_react.default.createElement(_AddSelectList.AddSelectList, (0, _extends2.default)({}, commonListProps, {
403
+ })) : /*#__PURE__*/_react.default.createElement("div", null, hasResults ? /*#__PURE__*/_react.default.createElement(_AddSelectList.AddSelectList, (0, _extends2.default)({}, commonListProps, {
364
404
  filteredItems: itemsToDisplay,
365
405
  modifiers: items === null || items === void 0 ? void 0 : items.modifiers
366
406
  })) : /*#__PURE__*/_react.default.createElement("div", {
@@ -381,6 +421,7 @@ exports.AddSelect = AddSelect;
381
421
  AddSelect.propTypes = {
382
422
  className: _propTypes.default.string,
383
423
  clearFiltersText: _propTypes.default.string,
424
+ closeIconDescription: _propTypes.default.string,
384
425
  columnInputPlaceholder: _propTypes.default.string,
385
426
  description: _propTypes.default.string,
386
427
  globalFilters: _propTypes.default.arrayOf(_propTypes.default.shape({
@@ -393,6 +434,7 @@ AddSelect.propTypes = {
393
434
  globalFiltersSecondaryButtonText: _propTypes.default.string,
394
435
  globalSearchLabel: _propTypes.default.string,
395
436
  globalSearchPlaceholder: _propTypes.default.string,
437
+ globalSortBy: _propTypes.default.array,
396
438
  influencerTitle: _propTypes.default.string,
397
439
  items: _propTypes.default.shape({
398
440
  modifiers: _propTypes.default.shape({
@@ -410,13 +452,21 @@ AddSelect.propTypes = {
410
452
  children: _propTypes.default.object,
411
453
  icon: _propTypes.default.object,
412
454
  id: _propTypes.default.string.isRequired,
455
+ meta: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.shape({
456
+ id: _propTypes.default.string,
457
+ title: _propTypes.default.string,
458
+ value: _propTypes.default.string
459
+ })), _propTypes.default.node]),
413
460
  subtitle: _propTypes.default.string,
414
461
  title: _propTypes.default.string.isRequired,
415
462
  value: _propTypes.default.string.isRequired
416
463
  }))
417
464
  }),
418
465
  itemsLabel: _propTypes.default.string,
466
+ metaIconDescription: _propTypes.default.string,
467
+ metaPanelTitle: _propTypes.default.string,
419
468
  multi: _propTypes.default.bool,
469
+ navIconDescription: _propTypes.default.string,
420
470
  noResultsDescription: _propTypes.default.string,
421
471
  noResultsTitle: _propTypes.default.string,
422
472
  noSelectionDescription: _propTypes.default.string,
@@ -29,6 +29,12 @@ var _settings = require("../../settings");
29
29
 
30
30
  var _AddSelectList = require("./AddSelectList");
31
31
 
32
+ var _AddSelectSort = require("./AddSelectSort");
33
+
34
+ var _addSelectUtils = require("./add-select-utils");
35
+
36
+ var _useItemSort2 = require("./hooks/useItemSort");
37
+
32
38
  var _uuidv = _interopRequireDefault(require("../../global/js/utils/uuidv4"));
33
39
 
34
40
  var _excluded = ["columnInputPlaceholder", "filteredItems", "header", "multiSelection", "setMultiSelection"];
@@ -40,7 +46,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
40
46
  var componentName = 'AddSelect';
41
47
 
42
48
  var AddSelectColumn = function AddSelectColumn(_ref) {
43
- var _filteredItems$find, _filteredItems$find2;
49
+ var _filteredItems$find;
44
50
 
45
51
  var columnInputPlaceholder = _ref.columnInputPlaceholder,
46
52
  filteredItems = _ref.filteredItems,
@@ -59,20 +65,16 @@ var AddSelectColumn = function AddSelectColumn(_ref) {
59
65
  searchTerm = _useState4[0],
60
66
  setSearchTerm = _useState4[1];
61
67
 
62
- var _useState5 = (0, _react.useState)(''),
63
- _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
64
- sortDirection = _useState6[0],
65
- setSortDirection = _useState6[1];
66
-
67
- var _useState7 = (0, _react.useState)(''),
68
- _useState8 = (0, _slicedToArray2.default)(_useState7, 2),
69
- sortAttribute = _useState8[0],
70
- setSortAttribute = _useState8[1];
68
+ var _useItemSort = (0, _useItemSort2.useItemSort)(),
69
+ sortDirection = _useItemSort.sortDirection,
70
+ setSortDirection = _useItemSort.setSortDirection,
71
+ sortAttribute = _useItemSort.sortAttribute,
72
+ setSortAttribute = _useItemSort.setSortAttribute;
71
73
 
72
- var _useState9 = (0, _react.useState)([]),
73
- _useState10 = (0, _slicedToArray2.default)(_useState9, 2),
74
- filters = _useState10[0],
75
- setFilters = _useState10[1];
74
+ var _useState5 = (0, _react.useState)([]),
75
+ _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
76
+ filters = _useState6[0],
77
+ setFilters = _useState6[1];
76
78
 
77
79
  var blockClass = "".concat(_settings.pkg.prefix, "--add-select");
78
80
  var colClass = "".concat(blockClass, "__column");
@@ -81,39 +83,14 @@ var AddSelectColumn = function AddSelectColumn(_ref) {
81
83
  return multiSelection.includes(item.id);
82
84
  });
83
85
  setAllSelected(isAllSelected);
84
- }, [filteredItems, multiSelection]); // sorting
85
-
86
- var colSortBy = (_filteredItems$find = filteredItems.find(function (item) {
87
- return item.sortBy;
88
- })) === null || _filteredItems$find === void 0 ? void 0 : _filteredItems$find.sortBy;
89
- var sortByOpts = colSortBy ? colSortBy.reduce(function (acc, cur) {
90
- var opts = [{
91
- id: "".concat(cur, "-asc"),
92
- itemText: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_iconsReact.ArrowUp16, null), cur),
93
- direction: 'asc',
94
- attribute: cur
95
- }, {
96
- id: "".concat(cur, "-desc"),
97
- itemText: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_iconsReact.ArrowDown16, null), cur),
98
- direction: 'desc',
99
- attribute: cur
100
- }];
101
- return [].concat((0, _toConsumableArray2.default)(acc), opts);
102
- }, []) : []; // filtering
103
-
104
- var colFilterBy = (_filteredItems$find2 = filteredItems.find(function (item) {
86
+ }, [filteredItems, multiSelection]); // filtering
87
+
88
+ var colFilterBy = (_filteredItems$find = filteredItems.find(function (item) {
105
89
  return item.filterBy;
106
- })) === null || _filteredItems$find2 === void 0 ? void 0 : _filteredItems$find2.filterBy;
90
+ })) === null || _filteredItems$find === void 0 ? void 0 : _filteredItems$find.filterBy;
107
91
  var filterByOpts = colFilterBy ? filteredItems.map(function (item) {
108
92
  return item[colFilterBy];
109
- }) : []; // handlers
110
-
111
- var sortHandler = function sortHandler(_ref2) {
112
- var direction = _ref2.direction,
113
- attribute = _ref2.attribute;
114
- setSortAttribute(attribute);
115
- setSortDirection(direction);
116
- };
93
+ }) : [];
117
94
 
118
95
  var selectAllHandler = function selectAllHandler(checked) {
119
96
  var itemIds = filteredItems.map(function (item) {
@@ -160,22 +137,11 @@ var AddSelectColumn = function AddSelectColumn(_ref) {
160
137
  });
161
138
  };
162
139
 
163
- var sortItems = function sortItems(a, b) {
164
- var _a$sortAttribute, _b$sortAttribute;
165
-
166
- var valueA = (_a$sortAttribute = a[sortAttribute]) === null || _a$sortAttribute === void 0 ? void 0 : _a$sortAttribute.split(' ').join('');
167
- var valueB = (_b$sortAttribute = b[sortAttribute]) === null || _b$sortAttribute === void 0 ? void 0 : _b$sortAttribute.split(' ').join('');
168
-
169
- if (sortDirection === 'desc') {
170
- return valueA > valueB ? -1 : 1;
171
- }
172
-
173
- return valueA < valueB ? -1 : 1;
174
- };
175
-
140
+ var sortFn = (0, _addSelectUtils.sortItems)(sortAttribute, sortDirection);
141
+ var sortBy = (0, _addSelectUtils.getSortBy)(filteredItems);
176
142
  var colItems = filteredItems.filter(filterBySearch) // first check if the item meets the search
177
143
  .filter(filterByAttribute) // then check if the item is included in the filter
178
- .sort(sortItems); // then sort the items by whatever criteria
144
+ .sort(sortFn); // then sort the items by whatever criteria
179
145
 
180
146
  return /*#__PURE__*/_react.default.createElement("div", {
181
147
  className: colClass
@@ -193,19 +159,14 @@ var AddSelectColumn = function AddSelectColumn(_ref) {
193
159
  labelText: columnInputPlaceholder
194
160
  }), /*#__PURE__*/_react.default.createElement("div", {
195
161
  className: "".concat(colClass, "-sort-filter")
196
- }, sortByOpts.length > 0 && /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.OverflowMenu, {
197
- renderIcon: _iconsReact.ArrowsVertical32,
198
- className: "".concat(colClass, "-overflow"),
199
- flipped: true
200
- }, sortByOpts.map(function (opt) {
201
- return /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.OverflowMenuItem, {
202
- key: opt.id,
203
- itemText: opt.itemText,
204
- onClick: function onClick() {
205
- return sortHandler(opt);
206
- }
207
- });
208
- })), filterByOpts.length > 0 && /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.OverflowMenu, {
162
+ }, /*#__PURE__*/_react.default.createElement(_AddSelectSort.AddSelectSort, {
163
+ items: filteredItems,
164
+ setSortAttribute: setSortAttribute,
165
+ setSortDirection: setSortDirection,
166
+ sortAttribute: sortAttribute,
167
+ sortDirection: sortDirection,
168
+ sortBy: sortBy
169
+ }), filterByOpts.length > 0 && /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.OverflowMenu, {
209
170
  renderIcon: _iconsReact.Filter32,
210
171
  className: "".concat(colClass, "-overflow"),
211
172
  flipped: true
@@ -104,7 +104,7 @@ var AddSelectFilter = function AddSelectFilter(_ref) {
104
104
  };
105
105
 
106
106
  var showFilter = multi && (filterOpts === null || filterOpts === void 0 ? void 0 : filterOpts.length) > 0;
107
- return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
107
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
108
108
  className: "".concat(blockClass, "-search")
109
109
  }, /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.TextInput, {
110
110
  id: "temp-id",
@@ -123,7 +123,7 @@ var AddSelectFilter = function AddSelectFilter(_ref) {
123
123
  className: "".concat(blockClass, "-toggle"),
124
124
  size: "md"
125
125
  }), open && /*#__PURE__*/_react.default.createElement("div", {
126
- className: "".concat(blockClass)
126
+ className: blockClass
127
127
  }, /*#__PURE__*/_react.default.createElement("div", {
128
128
  className: "".concat(blockClass, "-content")
129
129
  }, /*#__PURE__*/_react.default.createElement("p", null, "Filters"), /*#__PURE__*/_react.default.createElement("div", {
@@ -35,10 +35,13 @@ var componentName = 'AddSelectList';
35
35
 
36
36
  var AddSelectList = function AddSelectList(_ref) {
37
37
  var filteredItems = _ref.filteredItems,
38
+ metaIconDescription = _ref.metaIconDescription,
38
39
  modifiers = _ref.modifiers,
39
40
  multi = _ref.multi,
40
41
  multiSelection = _ref.multiSelection,
42
+ navIconDescription = _ref.navIconDescription,
41
43
  path = _ref.path,
44
+ setDisplayMetaPanel = _ref.setDisplayMetaPanel,
42
45
  setMultiSelection = _ref.setMultiSelection,
43
46
  setPath = _ref.setPath,
44
47
  setSingleSelection = _ref.setSingleSelection,
@@ -186,7 +189,7 @@ var AddSelectList = function AddSelectList(_ref) {
186
189
  light: true,
187
190
  label: modifiers === null || modifiers === void 0 ? void 0 : modifiers.label,
188
191
  disabled: !isSelected(item.id),
189
- className: "".concat(blockClass, "-dropdown")
192
+ className: "".concat(blockClass, "-dropdown ").concat(blockClass, "-hidden-hover")
190
193
  })) : /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.RadioButton, {
191
194
  className: "".concat(blockClass, "-radio"),
192
195
  name: "add-select-selections",
@@ -195,21 +198,44 @@ var AddSelectList = function AddSelectList(_ref) {
195
198
  labelText: item.title,
196
199
  onChange: handleSingleSelection,
197
200
  selected: item.value === singleSelection
198
- }), item.children && /*#__PURE__*/_react.default.createElement(_iconsReact.ChevronRight16, {
201
+ }), item.children && /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.Button, {
202
+ renderIcon: _iconsReact.ChevronRight16,
203
+ iconDescription: navIconDescription,
204
+ tooltipPosition: "left",
205
+ tooltipAlignment: "center",
206
+ hasIconOnly: true,
199
207
  onClick: function onClick() {
200
208
  return onNavigateItem(item);
201
- }
202
- }))));
209
+ },
210
+ kind: "ghost",
211
+ size: "sm"
212
+ }), item.meta && /*#__PURE__*/_react.default.createElement("div", {
213
+ className: "".concat(blockClass, "-hidden-hover")
214
+ }, /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.Button, {
215
+ renderIcon: _iconsReact.View16,
216
+ iconDescription: metaIconDescription,
217
+ tooltipPosition: "left",
218
+ tooltipAlignment: "center",
219
+ hasIconOnly: true,
220
+ onClick: function onClick() {
221
+ return setDisplayMetaPanel(item);
222
+ },
223
+ kind: "ghost",
224
+ size: "sm"
225
+ })))));
203
226
  }))));
204
227
  };
205
228
 
206
229
  exports.AddSelectList = AddSelectList;
207
230
  AddSelectList.propTypes = {
208
231
  filteredItems: _propTypes.default.array,
232
+ metaIconDescription: _propTypes.default.string,
209
233
  modifiers: _propTypes.default.object,
210
234
  multi: _propTypes.default.bool,
211
235
  multiSelection: _propTypes.default.array,
236
+ navIconDescription: _propTypes.default.string,
212
237
  path: _propTypes.default.array,
238
+ setDisplayMetaPanel: _propTypes.default.func,
213
239
  setMultiSelection: _propTypes.default.func,
214
240
  setPath: _propTypes.default.func,
215
241
  setSingleSelection: _propTypes.default.func,