@carbon/ibm-products 1.18.1 → 1.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/css/components/Datagrid/styles/draggableElement.css +57 -0
  2. package/css/components/Datagrid/styles/draggableElement.css.map +1 -0
  3. package/css/components/Datagrid/styles/index.css +80 -0
  4. package/css/components/Datagrid/styles/index.css.map +1 -1
  5. package/css/index-full-carbon.css +98 -3
  6. package/css/index-full-carbon.css.map +1 -1
  7. package/css/index-full-carbon.min.css +3 -3
  8. package/css/index-full-carbon.min.css.map +1 -1
  9. package/css/index-without-carbon.css +98 -3
  10. package/css/index-without-carbon.css.map +1 -1
  11. package/css/index-without-carbon.min.css +3 -3
  12. package/css/index-without-carbon.min.css.map +1 -1
  13. package/css/index.css +98 -3
  14. package/css/index.css.map +1 -1
  15. package/css/index.min.css +3 -3
  16. package/css/index.min.css.map +1 -1
  17. package/es/components/ActionSet/ActionSet.js +1 -0
  18. package/es/components/AddSelect/AddSelectFilter.js +9 -3
  19. package/es/components/AddSelect/AddSelectSidebar.js +3 -2
  20. package/es/components/ComboButton/ComboButton.js +1 -2
  21. package/es/components/DataSpreadsheet/DataSpreadsheet.js +5 -3
  22. package/es/components/DataSpreadsheet/DataSpreadsheetBody.js +38 -8
  23. package/es/components/DataSpreadsheet/DataSpreadsheetHeader.js +26 -10
  24. package/es/components/DataSpreadsheet/hooks/useSpreadsheetMouseMove.js +8 -6
  25. package/es/components/DataSpreadsheet/hooks/useSpreadsheetMouseUp.js +65 -34
  26. package/es/components/DataSpreadsheet/utils/checkSelectedHeaderCell.js +17 -3
  27. package/es/components/DataSpreadsheet/utils/getCellSize.js +10 -10
  28. package/es/components/DataSpreadsheet/utils/handleHeaderCellSelection.js +113 -19
  29. package/es/components/DataSpreadsheet/utils/moveColumnIndicatorLine.js +4 -3
  30. package/es/components/Datagrid/Datagrid/DraggableElement.js +9 -19
  31. package/es/components/ExportModal/ExportModal.js +1 -1
  32. package/es/global/js/hooks/useWindowResize.js +2 -1
  33. package/es/global/js/hooks/useWindowScroll.js +2 -1
  34. package/es/global/js/utils/scrollableAncestor.js +2 -1
  35. package/lib/components/ActionSet/ActionSet.js +1 -0
  36. package/lib/components/AddSelect/AddSelectFilter.js +10 -3
  37. package/lib/components/AddSelect/AddSelectSidebar.js +3 -2
  38. package/lib/components/ComboButton/ComboButton.js +2 -4
  39. package/lib/components/DataSpreadsheet/DataSpreadsheet.js +5 -3
  40. package/lib/components/DataSpreadsheet/DataSpreadsheetBody.js +38 -8
  41. package/lib/components/DataSpreadsheet/DataSpreadsheetHeader.js +26 -10
  42. package/lib/components/DataSpreadsheet/hooks/useSpreadsheetMouseMove.js +8 -7
  43. package/lib/components/DataSpreadsheet/hooks/useSpreadsheetMouseUp.js +66 -34
  44. package/lib/components/DataSpreadsheet/utils/checkSelectedHeaderCell.js +17 -3
  45. package/lib/components/DataSpreadsheet/utils/getCellSize.js +4 -4
  46. package/lib/components/DataSpreadsheet/utils/handleHeaderCellSelection.js +112 -19
  47. package/lib/components/DataSpreadsheet/utils/moveColumnIndicatorLine.js +4 -3
  48. package/lib/components/Datagrid/Datagrid/DraggableElement.js +11 -19
  49. package/lib/components/ExportModal/ExportModal.js +1 -1
  50. package/lib/global/js/hooks/useWindowResize.js +3 -1
  51. package/lib/global/js/hooks/useWindowScroll.js +5 -1
  52. package/lib/global/js/utils/scrollableAncestor.js +6 -1
  53. package/package.json +4 -4
  54. package/scss/components/AddSelect/_add-select.scss +6 -0
  55. package/scss/components/ComboButton/_combo-button.scss +2 -1
  56. package/scss/components/DataSpreadsheet/_data-spreadsheet.scss +7 -0
  57. package/scss/components/Datagrid/_datagrid.scss +1 -10
  58. package/scss/components/Datagrid/styles/draggableElement.scss +58 -0
  59. package/scss/components/Datagrid/styles/index.scss +2 -1
@@ -1,3 +1,4 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
1
2
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
3
  // @flow
3
4
 
@@ -13,10 +14,12 @@ import PropTypes from 'prop-types';
13
14
  import { Draggable16 } from '@carbon/icons-react';
14
15
  import { useDrag, useDrop } from 'react-dnd';
15
16
  import cx from 'classnames';
17
+ import { pkg } from '../../../settings';
16
18
  var useEffect = React.useEffect,
17
19
  useRef = React.useRef,
18
20
  useState = React.useState;
19
- var DRAG_TYPE = 'wkc-shared-ui-draggable-element';
21
+ var blockClass = "".concat(pkg.prefix, "--datagrid");
22
+ var DRAG_TYPE = "".concat(blockClass, "__shared-ui-draggable-element");
20
23
 
21
24
  var DraggableElement = function DraggableElement(_ref) {
22
25
  var id = _ref.id,
@@ -55,7 +58,6 @@ var DraggableElement = function DraggableElement(_ref) {
55
58
  var dragIndex = item.index;
56
59
  var hoverIndex = index; // Don't replace items with themselves
57
60
 
58
- // Don't replace items with themselves
59
61
  if (dragIndex === hoverIndex || disabled) {
60
62
  return;
61
63
  }
@@ -67,12 +69,6 @@ var DraggableElement = function DraggableElement(_ref) {
67
69
  // to avoid expensive index searches.
68
70
  // eslint-disable-next-line no-param-reassign
69
71
 
70
- // Time to actually perform the action
71
- // Note: we're mutating the monitor item here!
72
- // Generally it's better to avoid mutations,
73
- // but it's good here for the sake of performance
74
- // to avoid expensive index searches.
75
- // eslint-disable-next-line no-param-reassign
76
72
  item.index = hoverIndex;
77
73
  }
78
74
  }),
@@ -120,14 +116,10 @@ var DraggableElement = function DraggableElement(_ref) {
120
116
  var content = /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
121
117
  className: cx({
122
118
  disabled: disabled
123
- }, 'wkc-draggable-handleStyle')
119
+ }, "".concat(blockClass, "__draggable-handleStyle"))
124
120
  }, /*#__PURE__*/React.createElement(Draggable16, null)), children);
125
121
  return /*#__PURE__*/React.createElement("li", {
126
- className: cx({
127
- 'wkc-draggable-handleHolder-isOver': isOver && !disabled
128
- }, {
129
- 'wkc-draggable-handleHolder--grabbed': isGrabbed
130
- }, 'wkc-draggable-handleHolder'),
122
+ className: cx(_defineProperty({}, "".concat(blockClass, "__draggable-handleHolder-isOver"), isOver && !disabled), _defineProperty({}, "".concat(blockClass, "__wkc-draggable-handleHolder--grabbed"), isGrabbed), "".concat(blockClass, "__draggable-handleHolder")),
131
123
  ref: ref,
132
124
  "aria-selected": isFocused,
133
125
  role: "option",
@@ -155,17 +147,15 @@ var DraggableElement = function DraggableElement(_ref) {
155
147
  setIsFocusedOnItem(e.currentTarget === e.target);
156
148
  }
157
149
  }, /*#__PURE__*/React.createElement("span", {
158
- className: "wkc-shared-ui--assistive-text"
150
+ className: "".concat(blockClass, "__shared-ui--assistive-text")
159
151
  }, ariaLabel), isDragging && !isOver ? /*#__PURE__*/React.createElement("div", {
160
152
  ref: preview,
161
- className: "wkc-draggable-handleHolder-droppable"
153
+ className: "${blockClass}__draggable-handleHolder-droppable"
162
154
  }, content) : /*#__PURE__*/React.createElement("div", {
163
155
  ref: drag,
164
156
  "aria-hidden": isFocused && isFocusedOnItem // if focus on li, hide the children from aria
165
157
  ,
166
- className: cx({
167
- 'wkc-draggable-handleStyle': !disabled
168
- }, 'wkc-draggable-handleHolder-droppable')
158
+ className: cx(_defineProperty({}, "".concat(blockClass, "__draggable-handleStyle"), !disabled), ["".concat(blockClass, "__draggable-handleHolder-droppable")])
169
159
  }, (!isOver || disabled) && content));
170
160
  };
171
161
 
@@ -79,7 +79,7 @@ export var ExportModal = /*#__PURE__*/forwardRef(function (_ref, ref) {
79
79
 
80
80
  setName(filename);
81
81
  setExtension(preformattedExtensions === null || preformattedExtensions === void 0 ? void 0 : (_preformattedExtensio = preformattedExtensions[0]) === null || _preformattedExtensio === void 0 ? void 0 : _preformattedExtensio.extension);
82
- }, [filename, preformattedExtensions]);
82
+ }, [filename, preformattedExtensions, open]);
83
83
 
84
84
  var onNameChangeHandler = function onNameChangeHandler(evt) {
85
85
  setName(evt.target.value);
@@ -1,11 +1,12 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import _typeof from "@babel/runtime/helpers/typeof";
2
3
 
3
4
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
4
5
 
5
6
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
6
7
 
7
8
  import { useRef, useLayoutEffect } from 'react';
8
- var windowExists = typeof window !== "undefined";
9
+ var windowExists = (typeof window === "undefined" ? "undefined" : _typeof(window)) !== "undefined";
9
10
 
10
11
  var getWindowSize = function getWindowSize() {
11
12
  if (!windowExists) {
@@ -1,6 +1,7 @@
1
+ import _typeof from "@babel/runtime/helpers/typeof";
1
2
  import { useRef, useLayoutEffect } from 'react';
2
3
  import { scrollableAncestor } from '../utils/scrollableAncestor';
3
- var windowExists = typeof window !== "undefined";
4
+ var windowExists = (typeof window === "undefined" ? "undefined" : _typeof(window)) !== "undefined";
4
5
 
5
6
  var useTargetScroll = function useTargetScroll(target, effect, deps, throttleInterval) {
6
7
  var scrollPosition = useRef({});
@@ -1,4 +1,5 @@
1
- var windowExists = typeof window !== "undefined"; // determine whether the target is scrollable
1
+ import _typeof from "@babel/runtime/helpers/typeof";
2
+ var windowExists = (typeof window === "undefined" ? "undefined" : _typeof(window)) !== "undefined"; // determine whether the target is scrollable
2
3
 
3
4
  var scrollable = function scrollable(target) {
4
5
  var style = window.getComputedStyle(target);
@@ -148,6 +148,7 @@ ActionSet.validateActions = function (sizeFn) {
148
148
  var problems = [];
149
149
 
150
150
  if (actions > 0) {
151
+ // eslint-disable-next-line react/prop-types
151
152
  var size = sizeFn ? sizeFn(props) : props.size || defaults.size;
152
153
  var stacking = willStack(size, actions);
153
154
 
@@ -17,6 +17,8 @@ var _react = _interopRequireWildcard(require("react"));
17
17
 
18
18
  var _carbonComponentsReact = require("carbon-components-react");
19
19
 
20
+ var _classnames = _interopRequireDefault(require("classnames"));
21
+
20
22
  var _propTypes = _interopRequireDefault(require("prop-types"));
21
23
 
22
24
  var _iconsReact = require("@carbon/icons-react");
@@ -79,6 +81,7 @@ var AddSelectFilter = function AddSelectFilter(_ref) {
79
81
 
80
82
 
81
83
  var applyFilters = function applyFilters() {
84
+ setOpen(false);
82
85
  handleFilter(filters);
83
86
  };
84
87
 
@@ -104,6 +107,8 @@ var AddSelectFilter = function AddSelectFilter(_ref) {
104
107
  };
105
108
 
106
109
  var showFilter = multi && (filterOpts === null || filterOpts === void 0 ? void 0 : filterOpts.length) > 0;
110
+ var filterBtnClassnames = (0, _classnames.default)("".concat(blockClass, "-toggle"), (0, _defineProperty2.default)({}, "".concat(blockClass, "-toggle--open"), open));
111
+ var dirtyInput = Object.keys(filters).length > 0;
107
112
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
108
113
  className: "".concat(blockClass, "-search")
109
114
  }, /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.TextInput, {
@@ -120,7 +125,7 @@ var AddSelectFilter = function AddSelectFilter(_ref) {
120
125
  return setOpen(!open);
121
126
  },
122
127
  iconDescription: iconDescription,
123
- className: "".concat(blockClass, "-toggle"),
128
+ className: filterBtnClassnames,
124
129
  size: "md"
125
130
  }), open && /*#__PURE__*/_react.default.createElement("div", {
126
131
  className: blockClass
@@ -146,11 +151,13 @@ var AddSelectFilter = function AddSelectFilter(_ref) {
146
151
  }, /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.Button, {
147
152
  kind: "secondary",
148
153
  onClick: resetFilters,
149
- className: "".concat(blockClass, "-button")
154
+ className: "".concat(blockClass, "-button"),
155
+ disabled: !dirtyInput
150
156
  }, secondaryButtonText), /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.Button, {
151
157
  kind: "primary",
152
158
  onClick: applyFilters,
153
- className: "".concat(blockClass, "-button")
159
+ className: "".concat(blockClass, "-button"),
160
+ disabled: !dirtyInput && !hasFiltersApplied
154
161
  }, primaryButtonText)))), hasFiltersApplied && /*#__PURE__*/_react.default.createElement("div", {
155
162
  className: "".concat(blockClass, "-applied")
156
163
  }, Object.keys(appliedFilters).map(function (filterType) {
@@ -23,7 +23,7 @@ var _settings = require("../../settings");
23
23
 
24
24
  var _AddSelectMetaPanel = require("./AddSelectMetaPanel");
25
25
 
26
- var _excluded = ["icon", "avatar"];
26
+ var _excluded = ["meta", "icon", "avatar"];
27
27
  var componentName = 'AddSelectSidebar';
28
28
 
29
29
  var AddSelectSidebar = function AddSelectSidebar(_ref) {
@@ -53,7 +53,8 @@ var AddSelectSidebar = function AddSelectSidebar(_ref) {
53
53
  }); // certain properties should not be displayed in the sidebar
54
54
  // eslint-disable-next-line no-unused-vars
55
55
 
56
- var icon = selectedItem.icon,
56
+ var meta = selectedItem.meta,
57
+ icon = selectedItem.icon,
57
58
  avatar = selectedItem.avatar,
58
59
  newItem = (0, _objectWithoutProperties2.default)(selectedItem, _excluded);
59
60
  acc.push(newItem);
@@ -23,8 +23,6 @@ var _iconsReact = require("@carbon/icons-react");
23
23
 
24
24
  var _carbonComponentsReact = require("carbon-components-react");
25
25
 
26
- var _OverflowMenu = require("carbon-components-react/lib/components/OverflowMenu/OverflowMenu");
27
-
28
26
  var _setupGetInstanceId = _interopRequireDefault(require("carbon-components-react/lib/tools/setupGetInstanceId"));
29
27
 
30
28
  var _classnames = _interopRequireDefault(require("classnames"));
@@ -83,7 +81,7 @@ var ComboButton = function ComboButton(_ref) {
83
81
  return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({}, rest, {
84
82
  className: (0, _classnames.default)(blockClass, className),
85
83
  "data-floating-menu-container": true
86
- }), /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.Button, primaryAction), restActions.length > 0 && /*#__PURE__*/_react.default.createElement(_OverflowMenu.OverflowMenu, (0, _extends2.default)({}, overflowMenu, {
84
+ }), /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.Button, primaryAction), restActions.length > 0 && /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.OverflowMenu, (0, _extends2.default)({}, overflowMenu, {
87
85
  className: "".concat(blockClass, "__overflow-menu"),
88
86
  menuOptionsClass: "".concat(blockClass, "__overflow-menu__list"),
89
87
  onClick: function onClick() {
@@ -121,5 +119,5 @@ ComboButton.propTypes = {
121
119
  className: _propTypes.string,
122
120
 
123
121
  /** Provide the [props of the `OverflowMenu`](https://react.carbondesignsystem.com/?path=/docs/overflowmenu) */
124
- overflowMenu: (0, _propTypes.shape)(_OverflowMenu.OverflowMenu.propTypes)
122
+ overflowMenu: (0, _propTypes.shape)(_carbonComponentsReact.OverflowMenu.propTypes)
125
123
  };
@@ -81,7 +81,7 @@ var blockClass = "".concat(_settings.pkg.prefix, "--data-spreadsheet");
81
81
  var componentName = 'DataSpreadsheet'; // Default values for props
82
82
 
83
83
  var defaults = {
84
- cellSize: 'standard',
84
+ cellSize: 'sm',
85
85
  columns: Object.freeze([]),
86
86
  data: Object.freeze([]),
87
87
  defaultEmptyRowCount: 16,
@@ -701,7 +701,8 @@ var DataSpreadsheet = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref
701
701
  spreadsheetRef: spreadsheetRef,
702
702
  isKeyboard: isKeyboard,
703
703
  setSelectionAreaData: setSelectionAreaData,
704
- index: index
704
+ index: index,
705
+ currentMatcher: currentMatcher
705
706
  }; // Select an entire column
706
707
 
707
708
  if ((activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row) === 'header' && (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column) !== 'header') {
@@ -802,6 +803,7 @@ var DataSpreadsheet = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref
802
803
  activeCellCoordinates: activeCellCoordinates,
803
804
  cellSize: cellSize,
804
805
  columns: columns,
806
+ currentMatcher: currentMatcher,
805
807
  defaultColumn: defaultColumn,
806
808
  headerGroups: headerGroups,
807
809
  rows: rows,
@@ -900,7 +902,7 @@ DataSpreadsheet.propTypes = {
900
902
  /**
901
903
  * Specifies the cell height
902
904
  */
903
- cellSize: _propTypes.default.oneOf(['compact', 'standard', 'medium', 'large']),
905
+ cellSize: _propTypes.default.oneOf(['xs', 'sm', 'md', 'lg']),
904
906
 
905
907
  /**
906
908
  * Provide an optional class to be applied to the containing node.
@@ -96,7 +96,8 @@ var DataSpreadsheetBody = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, re
96
96
  var contentScrollRef = (0, _react.useRef)();
97
97
  var previousState = (0, _hooks.usePreviousValue)({
98
98
  selectionAreaData: selectionAreaData,
99
- clickAndHoldActive: clickAndHoldActive
99
+ clickAndHoldActive: clickAndHoldActive,
100
+ rowHeight: defaultColumn.rowHeight
100
101
  }); // Set custom css property containing the spreadsheet total width
101
102
 
102
103
  (0, _react.useEffect)(function () {
@@ -176,7 +177,7 @@ var DataSpreadsheetBody = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, re
176
177
 
177
178
  for (var rowIndex = rowStart; rowIndex <= rowEnd; rowIndex++) {
178
179
  for (var columnIndex = columnStart; columnIndex <= columnEnd; columnIndex++) {
179
- cellContainer.push([rowIndex, columnIndex]);
180
+ cellContainer.push([rowIndex, columnIndex, "".concat(blockClass, "__cell--").concat(rowIndex, "--").concat(columnIndex)]);
180
181
  }
181
182
  }
182
183
 
@@ -196,18 +197,47 @@ var DataSpreadsheetBody = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, re
196
197
  setActiveCellCoordinates: setActiveCellCoordinates,
197
198
  rows: rows,
198
199
  activeCellCoordinates: activeCellCoordinates,
199
- defaultColumn: defaultColumn
200
+ defaultColumn: defaultColumn,
201
+ selectionAreas: selectionAreas
200
202
  }); // Make sure that if the cellSize prop changes, the active
201
- // cell also gets updated with the new size
203
+ // cell also gets updated with the new size and new top placement
204
+ // value. All of the cell selections will be updated as well
202
205
 
203
206
  (0, _react.useEffect)(function () {
204
207
  var listContainer = spreadsheetBodyRef === null || spreadsheetBodyRef === void 0 ? void 0 : spreadsheetBodyRef.current;
205
208
  var activeCellButton = listContainer.querySelector(".".concat(blockClass, "__active-cell--highlight"));
206
209
 
207
- if (activeCellButton) {
210
+ if (activeCellButton && defaultColumn.rowHeight !== previousState.rowHeight) {
208
211
  activeCellButton.style.height = "".concat(defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.rowHeight, "px");
212
+
213
+ if (activeCellCoordinates) {
214
+ var activeTargetElement = ref.current.querySelector("[data-row-index=\"".concat(activeCellCoordinates.row, "\"][data-column-index=\"").concat(activeCellCoordinates.column, "\"]"));
215
+
216
+ var _listContainer = ref.current.querySelector(".".concat(blockClass, "__list--container"));
217
+
218
+ var newActiveCellTopPosition = activeTargetElement.getBoundingClientRect().top - _listContainer.getBoundingClientRect().top;
219
+
220
+ activeCellButton.style.top = (0, _layout.px)(newActiveCellTopPosition);
221
+ (0, _removeCellSelections.removeCellSelections)({
222
+ spreadsheetRef: ref
223
+ });
224
+ selectionAreas.map(function (area) {
225
+ if (!area.areaCreated && area.point1 && area.point2 && area.matcher) {
226
+ return (0, _createCellSelectionArea.createCellSelectionArea)({
227
+ ref: ref,
228
+ area: area,
229
+ blockClass: blockClass,
230
+ defaultColumn: defaultColumn,
231
+ selectionAreas: selectionAreas,
232
+ setSelectionAreas: setSelectionAreas,
233
+ setActiveCellInsideSelectionArea: setActiveCellInsideSelectionArea,
234
+ visibleColumns: visibleColumns
235
+ });
236
+ }
237
+ });
238
+ }
209
239
  }
210
- }, [defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.rowHeight]); // onClick fn for each cell in the data spreadsheet body,
240
+ }, [defaultColumn, ref, activeCellCoordinates, previousState === null || previousState === void 0 ? void 0 : previousState.rowHeight, selectionAreas, setActiveCellInsideSelectionArea, setSelectionAreas, visibleColumns]); // onClick fn for each cell in the data spreadsheet body,
211
241
  // adds the active cell highlight
212
242
 
213
243
  var handleBodyCellClick = (0, _react.useCallback)(function (cell, columnIndex) {
@@ -392,7 +422,7 @@ var DataSpreadsheetBody = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, re
392
422
  "data-column-index": "header",
393
423
  type: "button",
394
424
  onClick: handleRowHeaderClick(index),
395
- className: (0, _classnames.default)("".concat(blockClass, "__td"), "".concat(blockClass, "__td-th"), "".concat(blockClass, "--interactive-cell-element"), (_cx = {}, (0, _defineProperty2.default)(_cx, "".concat(blockClass, "__td-th--active-header"), (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row) === index || (0, _checkActiveHeaderCell.checkActiveHeaderCell)(index, selectionAreas, 'row')), (0, _defineProperty2.default)(_cx, "".concat(blockClass, "__td-th--selected-header"), (0, _checkSelectedHeaderCell.checkSelectedHeaderCell)(index, selectionAreas, 'row')), _cx)),
425
+ className: (0, _classnames.default)("".concat(blockClass, "__td"), "".concat(blockClass, "__td-th"), "".concat(blockClass, "--interactive-cell-element"), (_cx = {}, (0, _defineProperty2.default)(_cx, "".concat(blockClass, "__td-th--active-header"), (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row) === index || (0, _checkActiveHeaderCell.checkActiveHeaderCell)(index, selectionAreas, 'row')), (0, _defineProperty2.default)(_cx, "".concat(blockClass, "__td-th--selected-header"), (0, _checkSelectedHeaderCell.checkSelectedHeaderCell)(index, selectionAreas, 'row', columns)), _cx)),
396
426
  style: {
397
427
  width: defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.rowHeaderWidth
398
428
  }
@@ -421,7 +451,7 @@ var DataSpreadsheetBody = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, re
421
451
  }, cell.render('Cell')));
422
452
  }));
423
453
  }
424
- }, [prepareRow, rows, activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row, selectionAreas, handleRowHeaderClick, handleBodyCellClick, handleBodyCellHover, defaultColumn]);
454
+ }, [prepareRow, rows, activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row, selectionAreas, handleRowHeaderClick, handleBodyCellClick, handleBodyCellHover, defaultColumn, columns]);
425
455
  var spreadsheetBodyRef = (0, _react.useRef)();
426
456
  return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({
427
457
  ref: spreadsheetBodyRef,
@@ -52,6 +52,7 @@ var DataSpreadsheetHeader = /*#__PURE__*/(0, _react.forwardRef)(function (_ref,
52
52
  var activeCellCoordinates = _ref.activeCellCoordinates,
53
53
  cellSize = _ref.cellSize,
54
54
  columns = _ref.columns,
55
+ currentMatcher = _ref.currentMatcher,
55
56
  defaultColumn = _ref.defaultColumn,
56
57
  headerGroups = _ref.headerGroups,
57
58
  scrollBarSize = _ref.scrollBarSize,
@@ -94,6 +95,7 @@ var DataSpreadsheetHeader = /*#__PURE__*/(0, _react.forwardRef)(function (_ref,
94
95
  var handleColumnHeaderClick = function handleColumnHeaderClick(index) {
95
96
  return function (event) {
96
97
  var isHoldingCommandKey = event.metaKey || event.ctrlKey;
98
+ var isHoldingShiftKey = event.shiftKey;
97
99
  (0, _handleHeaderCellSelection.handleHeaderCellSelection)({
98
100
  type: 'column',
99
101
  activeCellCoordinates: activeCellCoordinates,
@@ -105,7 +107,9 @@ var DataSpreadsheetHeader = /*#__PURE__*/(0, _react.forwardRef)(function (_ref,
105
107
  spreadsheetRef: ref,
106
108
  index: index,
107
109
  setSelectionAreaData: setSelectionAreaData,
108
- isHoldingCommandKey: isHoldingCommandKey
110
+ isHoldingCommandKey: isHoldingCommandKey,
111
+ isHoldingShiftKey: isHoldingShiftKey,
112
+ currentMatcher: currentMatcher
109
113
  });
110
114
  };
111
115
  };
@@ -126,23 +130,30 @@ var DataSpreadsheetHeader = /*#__PURE__*/(0, _react.forwardRef)(function (_ref,
126
130
  return function (event) {
127
131
  var _selectionAreaToClone;
128
132
 
133
+ if (event.shiftKey) {
134
+ // Remove columns, need to call handleHeaderCellSelection
135
+ return;
136
+ }
137
+
129
138
  setSelectedHeaderReorderActive(true);
139
+ var selectionAreaToClone = selectionAreas.filter(function (item) {
140
+ return (item === null || item === void 0 ? void 0 : item.matcher) === currentMatcher;
141
+ });
142
+ var selectionAreaElement = ref.current.querySelector("[data-matcher-id=\"".concat((_selectionAreaToClone = selectionAreaToClone[0]) === null || _selectionAreaToClone === void 0 ? void 0 : _selectionAreaToClone.matcher, "\"]"));
130
143
  var clickXPosition = event.clientX;
131
144
  var headerButtonCoords = event.target.getBoundingClientRect();
145
+ var headerIndex = event.target.getAttribute('data-column-index');
132
146
  var offsetXValue = clickXPosition - headerButtonCoords.left;
147
+ var lowestColumnIndexFromSelectionArea = Math.min(selectionAreaToClone[0].point1.column, selectionAreaToClone[0].point2.column);
148
+ var selectionAreaCoords = selectionAreaElement.getBoundingClientRect();
149
+ var updatedOffsetDifference = lowestColumnIndexFromSelectionArea < parseInt(headerIndex) ? offsetXValue + (headerButtonCoords.left - selectionAreaCoords.left) : offsetXValue;
133
150
  var bodyContainer = document.querySelector(".".concat(blockClass, "__list--container")).firstElementChild;
134
- var selectionAreaToClone = selectionAreas.filter(function (item) {
135
- var _item$header;
136
-
137
- return (item === null || item === void 0 ? void 0 : (_item$header = item.header) === null || _item$header === void 0 ? void 0 : _item$header.index) === index;
138
- });
139
- var selectionAreaElement = ref.current.querySelector("[data-matcher-id=\"".concat((_selectionAreaToClone = selectionAreaToClone[0]) === null || _selectionAreaToClone === void 0 ? void 0 : _selectionAreaToClone.matcher, "\"]"));
140
151
  var selectionAreaClonedElement = selectionAreaElement.cloneNode();
141
152
  var reorderIndicatorLine = selectionAreaElement.cloneNode();
142
153
  reorderIndicatorLine.className = "".concat(blockClass, "__reorder-indicator-line");
143
154
  reorderIndicatorLine.style.width = (0, _layout.px)(2);
144
155
  selectionAreaClonedElement.classList.add("".concat(blockClass, "__selection-area--element-cloned"));
145
- selectionAreaClonedElement.setAttribute('data-clone-offset-x', offsetXValue);
156
+ selectionAreaClonedElement.setAttribute('data-clone-offset-x', updatedOffsetDifference);
146
157
  selectionAreaClonedElement.setAttribute('data-column-index-original', index);
147
158
  bodyContainer.appendChild(selectionAreaClonedElement);
148
159
  bodyContainer.appendChild(reorderIndicatorLine);
@@ -192,7 +203,7 @@ var DataSpreadsheetHeader = /*#__PURE__*/(0, _react.forwardRef)(function (_ref,
192
203
  }, "\xA0")), headerGroup.headers.map(function (column, index) {
193
204
  var _cx2;
194
205
 
195
- var selectedHeader = (0, _checkSelectedHeaderCell.checkSelectedHeaderCell)(index, selectionAreas, 'column');
206
+ var selectedHeader = (0, _checkSelectedHeaderCell.checkSelectedHeaderCell)(index, selectionAreas, 'column', rows);
196
207
  return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({
197
208
  key: "column_".concat(index),
198
209
  role: "columnheader",
@@ -230,13 +241,18 @@ DataSpreadsheetHeader.propTypes = {
230
241
  /**
231
242
  * Specifies the cell height
232
243
  */
233
- cellSize: _propTypes.default.oneOf(['compact', 'standard', 'medium', 'large']),
244
+ cellSize: _propTypes.default.oneOf(['xs', 'sm', 'md', 'lg']),
234
245
 
235
246
  /**
236
247
  * All of the spreadsheet columns
237
248
  */
238
249
  columns: _propTypes.default.array,
239
250
 
251
+ /**
252
+ * uuid that corresponds to the current selection area
253
+ */
254
+ currentMatcher: _propTypes.default.string,
255
+
240
256
  /**
241
257
  * Default spreadsheet sizing values
242
258
  */
@@ -11,8 +11,6 @@ var _layout = require("@carbon/layout");
11
11
 
12
12
  var _settings = require("../../../settings");
13
13
 
14
- var _getScrollbarWidth = require("../../../global/js/utils/getScrollbarWidth");
15
-
16
14
  var _moveColumnIndicatorLine = require("../utils/moveColumnIndicatorLine");
17
15
 
18
16
  /**
@@ -38,21 +36,24 @@ var useSpreadsheetMouseMove = function useSpreadsheetMouseMove(_ref) {
38
36
  }
39
37
 
40
38
  var spreadsheetCoords = ref.current.getBoundingClientRect();
39
+ var listContainer = ref.current.querySelector(".".concat(blockClass, "__list--container"));
40
+ var scrollAmount = listContainer.scrollLeft;
41
41
  (0, _moveColumnIndicatorLine.moveColumnIndicatorLine)({
42
42
  clonedSelectionElement: clonedSelectionElement,
43
43
  ref: ref,
44
- spreadsheetCoords: spreadsheetCoords
44
+ spreadsheetCoords: spreadsheetCoords,
45
+ leftScrollAmount: scrollAmount
45
46
  });
46
- var scrollbarWidth = (0, _getScrollbarWidth.getScrollbarWidth)();
47
47
  var spreadsheetWrapperElement = ref.current;
48
48
  spreadsheetWrapperElement.getBoundingClientRect();
49
49
  var xPositionRelativeToSpreadsheet = event.clientX - spreadsheetCoords.left;
50
50
  var offsetXValue = clonedSelectionElement === null || clonedSelectionElement === void 0 ? void 0 : clonedSelectionElement.getAttribute('data-clone-offset-x');
51
- var totalSpreadsheetWidth = ref.current.offsetWidth;
51
+ var totalSpreadsheetScrollingWidth = listContainer.scrollWidth;
52
52
  var clonedSelectionWidth = clonedSelectionElement.offsetWidth;
53
- var clonePlacement = Math.max(xPositionRelativeToSpreadsheet - offsetXValue, defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.rowHeaderWidth); // Moves the position of the cloned selection area to follow mouse
53
+ var clonePlacement = Math.max(xPositionRelativeToSpreadsheet - offsetXValue, defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.rowHeaderWidth); // Moves the position of the cloned selection area to follow mouse, and
54
+ // add the amount horizontally scrolled
54
55
 
55
- clonedSelectionElement.style.left = (0, _layout.px)(totalSpreadsheetWidth - clonedSelectionWidth - scrollbarWidth >= clonePlacement ? clonePlacement : totalSpreadsheetWidth - clonedSelectionWidth - scrollbarWidth);
56
+ clonedSelectionElement.style.left = (0, _layout.px)(totalSpreadsheetScrollingWidth - clonedSelectionWidth >= clonePlacement ? clonePlacement + scrollAmount : totalSpreadsheetScrollingWidth - clonedSelectionWidth);
56
57
  };
57
58
 
58
59
  if (headerCellHoldActive) {
@@ -38,7 +38,8 @@ var useSpreadsheetMouseUp = function useSpreadsheetMouseUp(_ref) {
38
38
  setActiveCellCoordinates = _ref.setActiveCellCoordinates,
39
39
  activeCellCoordinates = _ref.activeCellCoordinates,
40
40
  rows = _ref.rows,
41
- defaultColumn = _ref.defaultColumn;
41
+ defaultColumn = _ref.defaultColumn,
42
+ selectionAreas = _ref.selectionAreas;
42
43
  (0, _react.useEffect)(function () {
43
44
  var handleMouseUp = function handleMouseUp(event) {
44
45
  // Remove the cloned selection area on mouse up
@@ -53,8 +54,12 @@ var useSpreadsheetMouseUp = function useSpreadsheetMouseUp(_ref) {
53
54
 
54
55
  if (selectionAreaCloneElement) {
55
56
  var closestCell = event.target.closest(".".concat(blockClass, "--interactive-cell-element"));
56
- var newColumnIndex = closestCell === null || closestCell === void 0 ? void 0 : closestCell.getAttribute('data-column-index');
57
- var originalColumnIndex = selectionAreaCloneElement === null || selectionAreaCloneElement === void 0 ? void 0 : selectionAreaCloneElement.getAttribute('data-column-index-original');
57
+ var newColumnIndex = parseInt === null || parseInt === void 0 ? void 0 : parseInt(closestCell === null || closestCell === void 0 ? void 0 : closestCell.getAttribute('data-column-index'));
58
+ var originalColumnIndex = parseInt === null || parseInt === void 0 ? void 0 : parseInt(selectionAreaCloneElement === null || selectionAreaCloneElement === void 0 ? void 0 : selectionAreaCloneElement.getAttribute('data-column-index-original'));
59
+ var selectionAreaToClone = selectionAreas.filter(function (item) {
60
+ return (item === null || item === void 0 ? void 0 : item.matcher) === currentMatcher;
61
+ });
62
+ var selectionAreaIndexArray = selectionAreaToClone[0].header.selectedIndexList;
58
63
  var columnToMoveToElement = ref.current.querySelector("[data-row-index=\"header\"][data-column-index=\"".concat(newColumnIndex, "\"]")); // Mouse up element was not part of the spreadsheet component
59
64
 
60
65
  if (!columnToMoveToElement) {
@@ -63,22 +68,11 @@ var useSpreadsheetMouseUp = function useSpreadsheetMouseUp(_ref) {
63
68
 
64
69
  var selectionAreaToMove = ref.current.querySelector("[data-matcher-id=\"".concat(currentMatcher, "\"]"));
65
70
  var spreadsheetPosition = ref.current.getBoundingClientRect();
66
- var newIndexPosition = columnToMoveToElement.getBoundingClientRect();
67
- var relativeNewPosition = newIndexPosition.left - spreadsheetPosition.left;
68
- var cloneColumnWidth = selectionAreaCloneElement.offsetWidth;
69
- var columnsWidthUpToNewIndex = 0;
71
+ var listContainer = ref.current.querySelector(".".concat(blockClass, "__list--container"));
72
+ var leftScrollAmount = listContainer.scrollLeft;
70
73
  var newIndexLessThanStarting = newColumnIndex < originalColumnIndex;
71
- visibleColumns.forEach(function (item, index) {
72
- if (newIndexLessThanStarting && index === visibleColumns.length - 1) {
73
- return;
74
- }
75
-
76
- if (index <= newColumnIndex) {
77
- columnsWidthUpToNewIndex += (item === null || item === void 0 ? void 0 : item.width) || (defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.width);
78
- }
79
- });
80
- var updatedSelectionAreaPlacement = newIndexLessThanStarting ? relativeNewPosition : columnsWidthUpToNewIndex - cloneColumnWidth + (defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.rowHeaderWidth);
81
- selectionAreaToMove.style.left = (0, _layout.px)(updatedSelectionAreaPlacement);
74
+ var newIndexGreater = newColumnIndex > originalColumnIndex;
75
+ var differenceBetweenOldNewIndex = newIndexGreater ? newColumnIndex - originalColumnIndex : originalColumnIndex - newColumnIndex;
82
76
  setSelectionAreas(function (prev) {
83
77
  var selectionAreaClone = (0, _deepCloneObject.deepCloneObject)(prev);
84
78
 
@@ -94,26 +88,64 @@ var useSpreadsheetMouseUp = function useSpreadsheetMouseUp(_ref) {
94
88
  return prev;
95
89
  }
96
90
 
97
- selectionAreaClone[indexOfItemToUpdate].header.index = Number(newColumnIndex);
98
- selectionAreaClone[indexOfItemToUpdate].point1.column = Number(newColumnIndex);
99
- selectionAreaClone[indexOfItemToUpdate].point2.column = Number(newColumnIndex);
91
+ if (!selectionAreaIndexArray.includes(newColumnIndex)) {
92
+ // We need to not add just the newColumnIndex, but an array of indexes
93
+ // if there are multiple columns
94
+ var newIndexArray = newIndexGreater ? selectionAreaIndexArray.map(function (num) {
95
+ return num + differenceBetweenOldNewIndex;
96
+ }) : selectionAreaIndexArray.map(function (num) {
97
+ return num - differenceBetweenOldNewIndex;
98
+ });
99
+ selectionAreaClone[indexOfItemToUpdate].header.selectedIndexList = newIndexArray;
100
+ selectionAreaClone[indexOfItemToUpdate].point1.column = Math.min.apply(Math, (0, _toConsumableArray2.default)(newIndexArray));
101
+ selectionAreaClone[indexOfItemToUpdate].point2.column = Math.max.apply(Math, (0, _toConsumableArray2.default)(newIndexArray));
102
+ }
103
+
100
104
  return selectionAreaClone;
101
- });
102
- var columnIdArray = visibleColumns.map(function (column) {
103
- return column.id;
104
- });
105
- var columnIdArrayClone = (0, _toConsumableArray2.default)(columnIdArray); // Remove one element at the original index
105
+ }); // Only reorder columns if the new index is _not_ part of the
106
+ // selectionAreaIndexArray, meaning the new placement is outside
107
+ // of the current selection area. Similarly, the active cell position
108
+ // should only be changed under the same condition.
109
+
110
+ if (!selectionAreaIndexArray.includes(newColumnIndex)) {
111
+ var deleteCount = selectionAreaIndexArray.length;
112
+ var startIndex = Math.min.apply(Math, (0, _toConsumableArray2.default)(selectionAreaIndexArray));
113
+ var columnIdArray = visibleColumns.map(function (column) {
114
+ return column.id;
115
+ });
116
+ var columnIdArrayClone = (0, _toConsumableArray2.default)(columnIdArray);
106
117
 
107
- columnIdArrayClone.splice(originalColumnIndex, 1); // Add one element at the new index
118
+ var getNewColumnOrder = function getNewColumnOrder() {
119
+ var newColumnList = [];
120
+ selectionAreaIndexArray.map(function (index) {
121
+ return newColumnList.push(columnIdArray[index]);
122
+ });
123
+ return newColumnList;
124
+ }; // Remove one element at the original index
108
125
 
109
- columnIdArrayClone.splice(newColumnIndex, 0, columnIdArray[originalColumnIndex]);
110
- setColumnOrder(columnIdArrayClone); // Function provided by useTable (react-table) hook to reorder columns
111
126
 
112
- var newCellCoords = _objectSpread(_objectSpread({}, activeCellCoordinates), {}, {
113
- column: Number(newColumnIndex)
114
- });
127
+ columnIdArrayClone.splice(startIndex, deleteCount);
128
+ var originalPointIndex = selectionAreaIndexArray.findIndex(function (item) {
129
+ return item === originalColumnIndex;
130
+ });
131
+ var updatedNewIndexWithNewOrder = newColumnIndex - originalPointIndex; // Add one element at the new index
132
+
133
+ columnIdArrayClone.splice.apply(columnIdArrayClone, [updatedNewIndexWithNewOrder, 0].concat((0, _toConsumableArray2.default)(getNewColumnOrder())));
134
+ setColumnOrder(columnIdArrayClone); // Function provided by useTable (react-table) hook to reorder columns
135
+
136
+ var newCellCoords = _objectSpread(_objectSpread({}, activeCellCoordinates), {}, {
137
+ column: newIndexGreater ? activeCellCoordinates.column + differenceBetweenOldNewIndex : activeCellCoordinates.column - differenceBetweenOldNewIndex
138
+ });
139
+
140
+ setActiveCellCoordinates(newCellCoords);
141
+ var firstSelectedHeader = Array.from(ref.current.querySelectorAll(".".concat(blockClass, "__th--selected-header")))[0];
142
+ var firstSelectedHeaderCoords = firstSelectedHeader.getBoundingClientRect();
143
+ var newRelativePosition = firstSelectedHeaderCoords.left - spreadsheetPosition.left + leftScrollAmount; // console.log(firstSelectedHeaderCoords.left - spreadsheetPosition.left + leftScrollAmount);
144
+
145
+ var updatedSelectionAreaPlacement = newIndexLessThanStarting ? newRelativePosition : newColumnIndex === originalColumnIndex ? selectionAreaToMove.style.left : newRelativePosition;
146
+ selectionAreaToMove.style.left = (0, _layout.px)(updatedSelectionAreaPlacement);
147
+ } // Remove the cloned column and indicator elements
115
148
 
116
- setActiveCellCoordinates(newCellCoords); // Remove the cloned column and indicator elements
117
149
 
118
150
  var indicatorLineElement = ref.current.querySelector(".".concat(blockClass, "__reorder-indicator-line"));
119
151
  indicatorLineElement === null || indicatorLineElement === void 0 ? void 0 : indicatorLineElement.remove();
@@ -155,7 +187,7 @@ var useSpreadsheetMouseUp = function useSpreadsheetMouseUp(_ref) {
155
187
  return function () {
156
188
  document.removeEventListener('mouseup', handleMouseUp);
157
189
  };
158
- }, [blockClass, currentMatcher, setSelectionAreas, setClickAndHoldActive, setValidStartingPoint, validStartingPoint, ref, setHeaderCellHoldActive, setColumnOrder, visibleColumns, setActiveCellCoordinates, activeCellCoordinates, rows, defaultColumn]);
190
+ }, [blockClass, currentMatcher, setSelectionAreas, setClickAndHoldActive, setValidStartingPoint, validStartingPoint, ref, setHeaderCellHoldActive, setColumnOrder, visibleColumns, setActiveCellCoordinates, activeCellCoordinates, rows, defaultColumn, selectionAreas]);
159
191
  };
160
192
 
161
193
  exports.useSpreadsheetMouseUp = useSpreadsheetMouseUp;