@carbon/ibm-products 1.15.0 → 1.18.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. package/README.md +30 -27
  2. package/css/components/Datagrid/styles/datagrid.css +4 -0
  3. package/css/components/Datagrid/styles/datagrid.css.map +1 -1
  4. package/css/components/Datagrid/styles/index.css +5 -1
  5. package/css/components/Datagrid/styles/index.css.map +1 -1
  6. package/css/components/Datagrid/styles/useNestedRows.css +1 -1
  7. package/css/index-full-carbon.css +195 -88
  8. package/css/index-full-carbon.css.map +1 -1
  9. package/css/index-full-carbon.min.css +7 -4
  10. package/css/index-full-carbon.min.css.map +1 -1
  11. package/css/index-without-carbon-released-only.css +9 -3
  12. package/css/index-without-carbon-released-only.css.map +1 -1
  13. package/css/index-without-carbon-released-only.min.css +4 -1
  14. package/css/index-without-carbon-released-only.min.css.map +1 -1
  15. package/css/index-without-carbon.css +78 -22
  16. package/css/index-without-carbon.css.map +1 -1
  17. package/css/index-without-carbon.min.css +6 -3
  18. package/css/index-without-carbon.min.css.map +1 -1
  19. package/css/index.css +104 -53
  20. package/css/index.css.map +1 -1
  21. package/css/index.min.css +7 -4
  22. package/css/index.min.css.map +1 -1
  23. package/es/components/AddSelect/AddSelect.js +39 -10
  24. package/es/components/AddSelect/AddSelectColumn.js +31 -73
  25. package/es/components/AddSelect/AddSelectFilter.js +48 -5
  26. package/es/components/AddSelect/AddSelectSort.js +61 -0
  27. package/es/components/AddSelect/add-select-utils.js +21 -0
  28. package/es/components/AddSelect/hooks/useItemSort.js +20 -0
  29. package/es/components/DataSpreadsheet/DataSpreadsheet.js +38 -15
  30. package/es/components/DataSpreadsheet/DataSpreadsheetBody.js +93 -46
  31. package/es/components/DataSpreadsheet/DataSpreadsheetHeader.js +82 -6
  32. package/es/components/DataSpreadsheet/hooks/index.js +3 -1
  33. package/es/components/DataSpreadsheet/hooks/useSpreadsheetEdit.js +65 -19
  34. package/es/components/DataSpreadsheet/hooks/useSpreadsheetMouseMove.js +60 -0
  35. package/es/components/DataSpreadsheet/hooks/useSpreadsheetMouseUp.js +153 -0
  36. package/es/components/DataSpreadsheet/utils/checkSelectedHeaderCell.js +16 -0
  37. package/es/components/DataSpreadsheet/utils/createCellSelectionArea.js +11 -6
  38. package/es/components/DataSpreadsheet/utils/generateData.js +17 -9
  39. package/es/components/DataSpreadsheet/utils/getSpreadsheetWidth.js +30 -0
  40. package/es/components/DataSpreadsheet/utils/handleHeaderCellSelection.js +6 -2
  41. package/es/components/DataSpreadsheet/utils/moveColumnIndicatorLine.js +34 -0
  42. package/es/components/Datagrid/Datagrid/Datagrid.js +24 -12
  43. package/es/components/Datagrid/Datagrid/DatagridHead.js +8 -16
  44. package/es/components/Datagrid/Datagrid/DatagridHeaderRow.js +10 -10
  45. package/es/components/Datagrid/Datagrid/DatagridRow.js +12 -2
  46. package/es/components/Datagrid/Datagrid/index.js +6 -7
  47. package/es/components/Datagrid/index.js +1 -1
  48. package/es/components/Datagrid/useNestedRows.js +3 -3
  49. package/es/components/Datagrid/useRowExpander.js +1 -1
  50. package/es/components/ExportModal/ExportModal.js +10 -5
  51. package/es/components/SidePanel/SidePanel.js +5 -1
  52. package/es/components/WebTerminal/WebTerminal.js +36 -11
  53. package/es/components/WebTerminal/WebTerminalContentWrapper.js +49 -0
  54. package/es/components/WebTerminal/index.js +2 -1
  55. package/es/components/index.js +1 -1
  56. package/es/global/js/package-settings.js +1 -0
  57. package/lib/components/AddSelect/AddSelect.js +40 -10
  58. package/lib/components/AddSelect/AddSelectColumn.js +32 -71
  59. package/lib/components/AddSelect/AddSelectFilter.js +47 -4
  60. package/lib/components/AddSelect/AddSelectSort.js +79 -0
  61. package/lib/components/AddSelect/add-select-utils.js +29 -2
  62. package/lib/components/AddSelect/hooks/useItemSort.js +33 -0
  63. package/lib/components/DataSpreadsheet/DataSpreadsheet.js +37 -14
  64. package/lib/components/DataSpreadsheet/DataSpreadsheetBody.js +96 -45
  65. package/lib/components/DataSpreadsheet/DataSpreadsheetHeader.js +85 -6
  66. package/lib/components/DataSpreadsheet/hooks/index.js +17 -1
  67. package/lib/components/DataSpreadsheet/hooks/useSpreadsheetEdit.js +68 -18
  68. package/lib/components/DataSpreadsheet/hooks/useSpreadsheetMouseMove.js +74 -0
  69. package/lib/components/DataSpreadsheet/hooks/useSpreadsheetMouseUp.js +161 -0
  70. package/lib/components/DataSpreadsheet/utils/checkSelectedHeaderCell.js +26 -0
  71. package/lib/components/DataSpreadsheet/utils/createCellSelectionArea.js +11 -6
  72. package/lib/components/DataSpreadsheet/utils/generateData.js +17 -9
  73. package/lib/components/DataSpreadsheet/utils/getSpreadsheetWidth.js +40 -0
  74. package/lib/components/DataSpreadsheet/utils/handleHeaderCellSelection.js +6 -2
  75. package/lib/components/DataSpreadsheet/utils/moveColumnIndicatorLine.js +45 -0
  76. package/lib/components/Datagrid/Datagrid/Datagrid.js +25 -8
  77. package/lib/components/Datagrid/Datagrid/DatagridHead.js +8 -16
  78. package/lib/components/Datagrid/Datagrid/DatagridHeaderRow.js +10 -10
  79. package/lib/components/Datagrid/Datagrid/DatagridRow.js +14 -2
  80. package/lib/components/Datagrid/Datagrid/index.js +3 -5
  81. package/lib/components/Datagrid/index.js +2 -2
  82. package/lib/components/Datagrid/useNestedRows.js +3 -3
  83. package/lib/components/Datagrid/useRowExpander.js +1 -1
  84. package/lib/components/ExportModal/ExportModal.js +9 -4
  85. package/lib/components/SidePanel/SidePanel.js +5 -1
  86. package/lib/components/WebTerminal/WebTerminal.js +36 -10
  87. package/lib/components/WebTerminal/WebTerminalContentWrapper.js +58 -0
  88. package/lib/components/WebTerminal/index.js +9 -1
  89. package/lib/components/index.js +6 -0
  90. package/lib/global/js/package-settings.js +1 -0
  91. package/package.json +14 -13
  92. package/scss/components/AddSelect/_add-select.scss +15 -2
  93. package/scss/components/DataSpreadsheet/_data-spreadsheet.scss +38 -14
  94. package/scss/components/Datagrid/styles/datagrid.scss +8 -0
  95. package/scss/components/Datagrid/styles/useNestedRows.scss +1 -1
  96. package/scss/components/SidePanel/_side-panel.scss +22 -3
  97. package/scss/components/WebTerminal/_storybook-styles.scss +5 -0
  98. package/scss/components/WebTerminal/_web-terminal.scss +14 -4
@@ -272,13 +272,17 @@ export var SidePanel = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
272
272
 
273
273
  var actionToolbarElement = document.querySelector(".".concat(blockClass, "__action-toolbar"));
274
274
 
275
+ var _labelText = document.querySelector(".".concat(blockClass, "__label-text"));
276
+
275
277
  var _sidePanelSubtitleElementHeight = (_sidePanelSubtitleElement === null || _sidePanelSubtitleElement === void 0 ? void 0 : _sidePanelSubtitleElement.offsetHeight) || 0;
276
278
 
277
279
  var sidePanelActionBarElementHeight = (actionToolbarElement === null || actionToolbarElement === void 0 ? void 0 : actionToolbarElement.offsetHeight) || 0;
278
280
  var titleHeight = (_sidePanelTitleElement === null || _sidePanelTitleElement === void 0 ? void 0 : _sidePanelTitleElement.offsetHeight) + 24;
281
+ var labelHeight = (_labelText === null || _labelText === void 0 ? void 0 : _labelText.offsetHeight) || 0;
279
282
  _sidePanelOuter === null || _sidePanelOuter === void 0 ? void 0 : _sidePanelOuter.style.setProperty("--".concat(blockClass, "--title-text-height"), "".concat(titleHeight, "px"));
280
283
  _sidePanelOuter === null || _sidePanelOuter === void 0 ? void 0 : _sidePanelOuter.style.setProperty("--".concat(blockClass, "--subtitle-container-height"), "".concat(_sidePanelSubtitleElementHeight, "px"));
281
284
  _sidePanelOuter === null || _sidePanelOuter === void 0 ? void 0 : _sidePanelOuter.style.setProperty("--".concat(blockClass, "--action-bar-container-height"), "".concat(sidePanelActionBarElementHeight, "px"));
285
+ _sidePanelOuter === null || _sidePanelOuter === void 0 ? void 0 : _sidePanelOuter.style.setProperty("--".concat(blockClass, "--label-text-height"), "".concat(labelHeight, "px"));
282
286
  }
283
287
  }, [open, animateTitle, animationComplete, shouldRender, panelHeight, title, size, reducedMotion.matches]); // click outside functionality if `includeOverlay` prop is set
284
288
 
@@ -492,7 +496,7 @@ export var SidePanel = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
492
496
  className: "".concat(blockClass, "__visually-hidden")
493
497
  }, "Focus sentinel"), !animateTitle && renderHeader(), /*#__PURE__*/React.createElement("div", {
494
498
  ref: sidePanelInnerRef,
495
- className: cx("".concat(blockClass, "__inner-content"), (_cx4 = {}, _defineProperty(_cx4, "".concat(blockClass, "__static-inner-content"), !animateTitle), _defineProperty(_cx4, "".concat(blockClass, "__inner-content-with-actions"), actions && actions.length), _cx4))
499
+ className: cx("".concat(blockClass, "__inner-content"), (_cx4 = {}, _defineProperty(_cx4, "".concat(blockClass, "__static-inner-content"), !animateTitle), _defineProperty(_cx4, "".concat(blockClass, "__static-inner-content-no-actions"), !animateTitle && !(actions !== null && actions !== void 0 && actions.length)), _defineProperty(_cx4, "".concat(blockClass, "__inner-content-with-actions"), actions && actions.length), _cx4))
496
500
  }, animateTitle && renderHeader(), /*#__PURE__*/React.createElement("div", {
497
501
  className: "".concat(blockClass, "__body-content")
498
502
  }, children), /*#__PURE__*/React.createElement(ActionSet, {
@@ -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", "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", "columnInputPlaceholder", "description", "globalFilters", "globalFiltersIconDescription", "globalFiltersPlaceholderText", "globalFiltersPrimaryButtonText", "globalFiltersSecondaryButtonText", "globalSearchLabel", "globalSearchPlaceholder", "globalSortBy", "influencerTitle", "items", "itemsLabel", "multi", "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
 
@@ -54,6 +58,7 @@ var AddSelect = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
54
58
  var _cx;
55
59
 
56
60
  var className = _ref.className,
61
+ clearFiltersText = _ref.clearFiltersText,
57
62
  columnInputPlaceholder = _ref.columnInputPlaceholder,
58
63
  description = _ref.description,
59
64
  globalFilters = _ref.globalFilters,
@@ -63,6 +68,7 @@ var AddSelect = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
63
68
  globalFiltersSecondaryButtonText = _ref.globalFiltersSecondaryButtonText,
64
69
  globalSearchLabel = _ref.globalSearchLabel,
65
70
  globalSearchPlaceholder = _ref.globalSearchPlaceholder,
71
+ globalSortBy = _ref.globalSortBy,
66
72
  influencerTitle = _ref.influencerTitle,
67
73
  items = _ref.items,
68
74
  itemsLabel = _ref.itemsLabel,
@@ -128,6 +134,12 @@ var AddSelect = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
128
134
  appliedGlobalFilters = _useState18[0],
129
135
  setAppliedGlobalFilters = _useState18[1];
130
136
 
137
+ var _useItemSort = (0, _useItemSort2.useItemSort)(),
138
+ sortDirection = _useItemSort.sortDirection,
139
+ setSortDirection = _useItemSort.setSortDirection,
140
+ sortAttribute = _useItemSort.sortAttribute,
141
+ setSortAttribute = _useItemSort.setSortAttribute;
142
+
131
143
  (0, _react.useEffect)(function () {
132
144
  var entries = items.entries; // flatItems is just a single array of all entries including children
133
145
 
@@ -217,6 +229,8 @@ var AddSelect = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
217
229
  return results;
218
230
  };
219
231
 
232
+ var sortFn = (0, _addSelectUtils.sortItems)(sortAttribute, sortDirection);
233
+
220
234
  var getDisplayItems = function getDisplayItems() {
221
235
  if (useNormalizedItems) {
222
236
  // when global search or filter is in use the results are not in column format
@@ -229,7 +243,7 @@ var AddSelect = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
229
243
  return filters.every(function (filter) {
230
244
  return item[filter] === appliedGlobalFilters[filter];
231
245
  });
232
- });
246
+ }).sort(sortFn);
233
247
  return results;
234
248
  }
235
249
 
@@ -263,7 +277,9 @@ var AddSelect = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
263
277
  onSubmit(multi ? multiSelection : singleSelection);
264
278
  };
265
279
 
280
+ 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));
266
281
  var commonTearsheetProps = {
282
+ className: classNames,
267
283
  open: open,
268
284
  title: title,
269
285
  description: description,
@@ -289,7 +305,6 @@ var AddSelect = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
289
305
  removeIconDescription: removeIconDescription,
290
306
  setMultiSelection: setMultiSelection
291
307
  };
292
- 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));
293
308
 
294
309
  var setShowBreadsCrumbs = function setShowBreadsCrumbs() {
295
310
  if (searchTerm) {
@@ -315,9 +330,11 @@ var AddSelect = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
315
330
  return true;
316
331
  };
317
332
 
333
+ var hasResults = itemsToDisplay.length > 0;
334
+ var globalFiltersApplied = Object.keys(appliedGlobalFilters).length > 0;
318
335
  var showBreadsCrumbs = setShowBreadsCrumbs();
319
- var showTags = setShowTags();
320
- var globalFiltersApplied = Object.keys(appliedGlobalFilters).length > 0; // main content
336
+ var showSort = (searchTerm || globalFiltersApplied) && hasResults;
337
+ var showTags = setShowTags(); // main content
321
338
 
322
339
  var body = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
323
340
  className: "".concat(blockClass, "__header")
@@ -332,8 +349,13 @@ var AddSelect = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
332
349
  primaryButtonText: globalFiltersPrimaryButtonText,
333
350
  secondaryButtonText: globalFiltersSecondaryButtonText,
334
351
  placeholder: globalFiltersPlaceholderText,
335
- iconDescription: globalFiltersIconDescription
352
+ iconDescription: globalFiltersIconDescription,
353
+ appliedFilters: appliedGlobalFilters,
354
+ hasFiltersApplied: globalFiltersApplied,
355
+ clearFiltersText: clearFiltersText
336
356
  }), /*#__PURE__*/_react.default.createElement("div", {
357
+ className: "".concat(blockClass, "__sub-header")
358
+ }, /*#__PURE__*/_react.default.createElement("div", {
337
359
  className: "".concat(blockClass, "__tag-container")
338
360
  }, showBreadsCrumbs ? /*#__PURE__*/_react.default.createElement(_AddSelectBreadcrumbs.AddSelectBreadcrumbs, {
339
361
  itemsLabel: itemsLabel,
@@ -344,7 +366,14 @@ var AddSelect = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
344
366
  }, searchTerm ? searchResultsLabel : itemsLabel), showTags && /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.Tag, {
345
367
  type: "gray",
346
368
  size: "sm"
347
- }, itemsToDisplay.length))), useNormalizedItems && !searchTerm && !globalFiltersApplied ? /*#__PURE__*/_react.default.createElement("div", {
369
+ }, itemsToDisplay.length)), showSort && /*#__PURE__*/_react.default.createElement(_AddSelectSort.AddSelectSort, {
370
+ items: itemsToDisplay,
371
+ setSortAttribute: setSortAttribute,
372
+ setSortDirection: setSortDirection,
373
+ sortAttribute: sortAttribute,
374
+ sortDirection: sortDirection,
375
+ sortBy: globalSortBy
376
+ }))), useNormalizedItems && !searchTerm && !globalFiltersApplied ? /*#__PURE__*/_react.default.createElement("div", {
348
377
  className: "".concat(blockClass, "__columns")
349
378
  }, itemsToDisplay.map(function (page, idx) {
350
379
  var _path;
@@ -355,7 +384,7 @@ var AddSelect = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
355
384
  header: idx === 0 ? itemsLabel : (_path = path[idx - 1]) === null || _path === void 0 ? void 0 : _path.title,
356
385
  columnInputPlaceholder: columnInputPlaceholder
357
386
  }));
358
- })) : /*#__PURE__*/_react.default.createElement("div", null, itemsToDisplay.length > 0 ? /*#__PURE__*/_react.default.createElement(_AddSelectList.AddSelectList, (0, _extends2.default)({}, commonListProps, {
387
+ })) : /*#__PURE__*/_react.default.createElement("div", null, hasResults ? /*#__PURE__*/_react.default.createElement(_AddSelectList.AddSelectList, (0, _extends2.default)({}, commonListProps, {
359
388
  filteredItems: itemsToDisplay,
360
389
  modifiers: items === null || items === void 0 ? void 0 : items.modifiers
361
390
  })) : /*#__PURE__*/_react.default.createElement("div", {
@@ -366,8 +395,7 @@ var AddSelect = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
366
395
  }))));
367
396
 
368
397
  return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({
369
- ref: ref,
370
- className: classNames
398
+ ref: ref
371
399
  }, rest), multi ? /*#__PURE__*/_react.default.createElement(_Tearsheet.Tearsheet, (0, _extends2.default)({}, commonTearsheetProps, {
372
400
  influencer: multi && /*#__PURE__*/_react.default.createElement(_AddSelectSidebar.AddSelectSidebar, sidebarProps),
373
401
  influencerPosition: "right"
@@ -376,6 +404,7 @@ var AddSelect = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
376
404
  exports.AddSelect = AddSelect;
377
405
  AddSelect.propTypes = {
378
406
  className: _propTypes.default.string,
407
+ clearFiltersText: _propTypes.default.string,
379
408
  columnInputPlaceholder: _propTypes.default.string,
380
409
  description: _propTypes.default.string,
381
410
  globalFilters: _propTypes.default.arrayOf(_propTypes.default.shape({
@@ -388,6 +417,7 @@ AddSelect.propTypes = {
388
417
  globalFiltersSecondaryButtonText: _propTypes.default.string,
389
418
  globalSearchLabel: _propTypes.default.string,
390
419
  globalSearchPlaceholder: _propTypes.default.string,
420
+ globalSortBy: _propTypes.default.array,
391
421
  influencerTitle: _propTypes.default.string,
392
422
  items: _propTypes.default.shape({
393
423
  modifiers: _propTypes.default.shape({
@@ -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
@@ -34,9 +34,12 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
34
34
  var componentName = 'AddSelectFilter';
35
35
 
36
36
  var AddSelectFilter = function AddSelectFilter(_ref) {
37
- var filterOpts = _ref.filterOpts,
37
+ var appliedFilters = _ref.appliedFilters,
38
+ clearFiltersText = _ref.clearFiltersText,
39
+ filterOpts = _ref.filterOpts,
38
40
  handleFilter = _ref.handleFilter,
39
41
  handleSearch = _ref.handleSearch,
42
+ hasFiltersApplied = _ref.hasFiltersApplied,
40
43
  iconDescription = _ref.iconDescription,
41
44
  inputLabel = _ref.inputLabel,
42
45
  inputPlaceholder = _ref.inputPlaceholder,
@@ -66,6 +69,14 @@ var AddSelectFilter = function AddSelectFilter(_ref) {
66
69
  var selectedItem = _ref2.selectedItem;
67
70
  setFilters(_objectSpread(_objectSpread({}, filters), {}, (0, _defineProperty2.default)({}, id, selectedItem)));
68
71
  };
72
+ /**
73
+ * this component needs to manage it's own internal state of filters before they're applied
74
+ * setFilters manages the local filter state
75
+ * applyFilters adds the filter state to the parent
76
+ * resetFilters resets the local state
77
+ * clearFilters resets both
78
+ */
79
+
69
80
 
70
81
  var applyFilters = function applyFilters() {
71
82
  handleFilter(filters);
@@ -75,12 +86,25 @@ var AddSelectFilter = function AddSelectFilter(_ref) {
75
86
  setFilters({});
76
87
  };
77
88
 
89
+ var clearFilters = function clearFilters() {
90
+ resetFilters();
91
+ handleFilter({});
92
+ };
93
+
94
+ var removeTag = function removeTag(key) {
95
+ var newFilters = _objectSpread({}, filters);
96
+
97
+ delete newFilters[key];
98
+ setFilters(newFilters);
99
+ handleFilter(newFilters);
100
+ };
101
+
78
102
  var getSelectedItem = function getSelectedItem(id) {
79
103
  return filters[id] || '';
80
104
  };
81
105
 
82
106
  var showFilter = multi && (filterOpts === null || filterOpts === void 0 ? void 0 : filterOpts.length) > 0;
83
- return /*#__PURE__*/_react.default.createElement("div", {
107
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
84
108
  className: "".concat(blockClass, "-search")
85
109
  }, /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.TextInput, {
86
110
  id: "temp-id",
@@ -99,7 +123,7 @@ var AddSelectFilter = function AddSelectFilter(_ref) {
99
123
  className: "".concat(blockClass, "-toggle"),
100
124
  size: "md"
101
125
  }), open && /*#__PURE__*/_react.default.createElement("div", {
102
- className: "".concat(blockClass)
126
+ className: blockClass
103
127
  }, /*#__PURE__*/_react.default.createElement("div", {
104
128
  className: "".concat(blockClass, "-content")
105
129
  }, /*#__PURE__*/_react.default.createElement("p", null, "Filters"), /*#__PURE__*/_react.default.createElement("div", {
@@ -127,14 +151,33 @@ var AddSelectFilter = function AddSelectFilter(_ref) {
127
151
  kind: "primary",
128
152
  onClick: applyFilters,
129
153
  className: "".concat(blockClass, "-button")
130
- }, primaryButtonText))));
154
+ }, primaryButtonText)))), hasFiltersApplied && /*#__PURE__*/_react.default.createElement("div", {
155
+ className: "".concat(blockClass, "-applied")
156
+ }, Object.keys(appliedFilters).map(function (filterType) {
157
+ return /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.Tag, {
158
+ key: filterType,
159
+ type: "gray",
160
+ size: "sm",
161
+ onClose: function onClose() {
162
+ return removeTag(filterType);
163
+ },
164
+ filter: true
165
+ }, "".concat(filterType, ": ").concat(appliedFilters[filterType]));
166
+ }), /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.Button, {
167
+ kind: "ghost",
168
+ size: "sm",
169
+ onClick: clearFilters
170
+ }, clearFiltersText)));
131
171
  };
132
172
 
133
173
  exports.AddSelectFilter = AddSelectFilter;
134
174
  AddSelectFilter.propTypes = {
175
+ appliedFilters: _propTypes.default.object,
176
+ clearFiltersText: _propTypes.default.string,
135
177
  filterOpts: _propTypes.default.array,
136
178
  handleFilter: _propTypes.default.func,
137
179
  handleSearch: _propTypes.default.func,
180
+ hasFiltersApplied: _propTypes.default.bool,
138
181
  iconDescription: _propTypes.default.string,
139
182
  inputLabel: _propTypes.default.string,
140
183
  inputPlaceholder: _propTypes.default.string,