@carbon/ibm-products 1.18.0 → 1.19.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. package/css/components/Datagrid/styles/datagrid.css +24 -4
  2. package/css/components/Datagrid/styles/datagrid.css.map +1 -1
  3. package/css/components/Datagrid/styles/index.css +24 -4
  4. package/css/components/Datagrid/styles/index.css.map +1 -1
  5. package/css/index-full-carbon.css +78 -13
  6. package/css/index-full-carbon.css.map +1 -1
  7. package/css/index-full-carbon.min.css +2 -2
  8. package/css/index-full-carbon.min.css.map +1 -1
  9. package/css/index-without-carbon.css +78 -13
  10. package/css/index-without-carbon.css.map +1 -1
  11. package/css/index-without-carbon.min.css +2 -2
  12. package/css/index-without-carbon.min.css.map +1 -1
  13. package/css/index.css +78 -13
  14. package/css/index.css.map +1 -1
  15. package/css/index.min.css +2 -2
  16. package/css/index.min.css.map +1 -1
  17. package/es/components/ActionSet/ActionSet.js +1 -0
  18. package/es/components/AddSelect/AddSelect.js +28 -3
  19. package/es/components/AddSelect/AddSelectFilter.js +9 -3
  20. package/es/components/AddSelect/AddSelectList.js +32 -6
  21. package/es/components/AddSelect/AddSelectMetaPanel.js +54 -0
  22. package/es/components/AddSelect/AddSelectSidebar.js +22 -3
  23. package/es/components/DataSpreadsheet/DataSpreadsheet.js +7 -4
  24. package/es/components/DataSpreadsheet/DataSpreadsheetBody.js +43 -10
  25. package/es/components/DataSpreadsheet/DataSpreadsheetHeader.js +36 -13
  26. package/es/components/DataSpreadsheet/hooks/useSpreadsheetMouseMove.js +8 -6
  27. package/es/components/DataSpreadsheet/hooks/useSpreadsheetMouseUp.js +65 -34
  28. package/es/components/DataSpreadsheet/utils/checkSelectedHeaderCell.js +17 -3
  29. package/es/components/DataSpreadsheet/utils/getCellSize.js +10 -10
  30. package/es/components/DataSpreadsheet/utils/getSpreadsheetWidth.js +8 -2
  31. package/es/components/DataSpreadsheet/utils/handleHeaderCellSelection.js +113 -19
  32. package/es/components/DataSpreadsheet/utils/moveColumnIndicatorLine.js +4 -3
  33. package/es/components/Datagrid/Datagrid/Datagrid.js +1 -1
  34. package/es/components/Datagrid/Datagrid/DatagridEmptyBody.js +22 -3
  35. package/es/components/Datagrid/Datagrid/DraggableElement.js +0 -7
  36. package/es/components/Datagrid/Datagrid/addons/RowSize/RowSizeDropdown.js +3 -3
  37. package/es/components/Datagrid/Datagrid/addons/RowSize/RowSizeRadioGroup.js +1 -1
  38. package/es/components/ExportModal/ExportModal.js +1 -1
  39. package/es/global/js/hooks/useWindowResize.js +2 -1
  40. package/es/global/js/hooks/useWindowScroll.js +2 -1
  41. package/es/global/js/utils/scrollableAncestor.js +2 -1
  42. package/lib/components/ActionSet/ActionSet.js +1 -0
  43. package/lib/components/AddSelect/AddSelect.js +28 -3
  44. package/lib/components/AddSelect/AddSelectFilter.js +10 -3
  45. package/lib/components/AddSelect/AddSelectList.js +30 -4
  46. package/lib/components/AddSelect/AddSelectMetaPanel.js +77 -0
  47. package/lib/components/AddSelect/AddSelectSidebar.js +23 -3
  48. package/lib/components/DataSpreadsheet/DataSpreadsheet.js +7 -4
  49. package/lib/components/DataSpreadsheet/DataSpreadsheetBody.js +43 -10
  50. package/lib/components/DataSpreadsheet/DataSpreadsheetHeader.js +36 -13
  51. package/lib/components/DataSpreadsheet/hooks/useSpreadsheetMouseMove.js +8 -7
  52. package/lib/components/DataSpreadsheet/hooks/useSpreadsheetMouseUp.js +66 -34
  53. package/lib/components/DataSpreadsheet/utils/checkSelectedHeaderCell.js +17 -3
  54. package/lib/components/DataSpreadsheet/utils/getCellSize.js +4 -4
  55. package/lib/components/DataSpreadsheet/utils/getSpreadsheetWidth.js +8 -2
  56. package/lib/components/DataSpreadsheet/utils/handleHeaderCellSelection.js +112 -19
  57. package/lib/components/DataSpreadsheet/utils/moveColumnIndicatorLine.js +4 -3
  58. package/lib/components/Datagrid/Datagrid/Datagrid.js +1 -1
  59. package/lib/components/Datagrid/Datagrid/DatagridEmptyBody.js +24 -3
  60. package/lib/components/Datagrid/Datagrid/DraggableElement.js +0 -7
  61. package/lib/components/Datagrid/Datagrid/addons/RowSize/RowSizeDropdown.js +3 -3
  62. package/lib/components/Datagrid/Datagrid/addons/RowSize/RowSizeRadioGroup.js +1 -1
  63. package/lib/components/ExportModal/ExportModal.js +1 -1
  64. package/lib/global/js/hooks/useWindowResize.js +3 -1
  65. package/lib/global/js/hooks/useWindowScroll.js +5 -1
  66. package/lib/global/js/utils/scrollableAncestor.js +6 -1
  67. package/package.json +7 -7
  68. package/scss/components/AddSelect/_add-select.scss +46 -6
  69. package/scss/components/DataSpreadsheet/_data-spreadsheet.scss +8 -1
  70. package/scss/components/Datagrid/_storybook-styles.scss +5 -0
  71. package/scss/components/Datagrid/styles/datagrid.scss +43 -5
@@ -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;
@@ -13,12 +13,26 @@ var _deepCloneObject = require("../../../global/js/utils/deepCloneObject");
13
13
  * This source code is licensed under the Apache-2.0 license found in the
14
14
  * LICENSE file in the root directory of this source tree.
15
15
  */
16
- var checkSelectedHeaderCell = function checkSelectedHeaderCell(headerIndex, selectionAreas, headerType) {
16
+ var checkSelectedHeaderCell = function checkSelectedHeaderCell(headerIndex, selectionAreas, headerType, items) {
17
17
  var areasCloned = (0, _deepCloneObject.deepCloneObject)(selectionAreas);
18
18
  var isSelectedHeader = areasCloned.some(function (area) {
19
- var _area$header, _area$header2;
19
+ var _area$point, _area$point2, _area$point3, _area$point4, _area$point5, _area$point6, _area$point7, _area$point8;
20
20
 
21
- return (area === null || area === void 0 ? void 0 : (_area$header = area.header) === null || _area$header === void 0 ? void 0 : _area$header.type) === headerType && headerIndex === (area === null || area === void 0 ? void 0 : (_area$header2 = area.header) === null || _area$header2 === void 0 ? void 0 : _area$header2.index);
21
+ var oppositeType = headerType === 'column' ? 'row' : 'column';
22
+ var minOppositeSelection = Math.min(area === null || area === void 0 ? void 0 : (_area$point = area.point1) === null || _area$point === void 0 ? void 0 : _area$point[oppositeType], area === null || area === void 0 ? void 0 : (_area$point2 = area.point2) === null || _area$point2 === void 0 ? void 0 : _area$point2[oppositeType]);
23
+ var maxOppositeSelection = Math.max(area === null || area === void 0 ? void 0 : (_area$point3 = area.point1) === null || _area$point3 === void 0 ? void 0 : _area$point3[oppositeType], area === null || area === void 0 ? void 0 : (_area$point4 = area.point2) === null || _area$point4 === void 0 ? void 0 : _area$point4[oppositeType]);
24
+ var minSelection = Math.min(area === null || area === void 0 ? void 0 : (_area$point5 = area.point1) === null || _area$point5 === void 0 ? void 0 : _area$point5[headerType], area === null || area === void 0 ? void 0 : (_area$point6 = area.point2) === null || _area$point6 === void 0 ? void 0 : _area$point6[headerType]);
25
+ var maxSelection = Math.max(area === null || area === void 0 ? void 0 : (_area$point7 = area.point1) === null || _area$point7 === void 0 ? void 0 : _area$point7[headerType], area === null || area === void 0 ? void 0 : (_area$point8 = area.point2) === null || _area$point8 === void 0 ? void 0 : _area$point8[headerType]);
26
+ var isTrueSelectedState = (items === null || items === void 0 ? void 0 : items.length) - 1 === maxOppositeSelection && minOppositeSelection === 0; // console.log({minSelection, maxSelection});
27
+ // Iterate over all columns included in the selection area
28
+
29
+ for (var i = minSelection; i <= maxSelection; i++) {
30
+ if (headerIndex === i && isTrueSelectedState) {
31
+ return true;
32
+ }
33
+ }
34
+
35
+ return false;
22
36
  });
23
37
  return isSelectedHeader;
24
38
  };
@@ -19,16 +19,16 @@ var getSizeInPixels = function getSizeInPixels(carbonSize) {
19
19
 
20
20
  var getCellSize = function getCellSize(cellSize) {
21
21
  switch (cellSize) {
22
- case 'compact':
22
+ case 'xs':
23
23
  return getSizeInPixels(_layout.sizeXSmall);
24
24
 
25
- case 'standard':
25
+ case 'sm':
26
26
  return getSizeInPixels(_layout.sizeSmall);
27
27
 
28
- case 'medium':
28
+ case 'md':
29
29
  return getSizeInPixels(_layout.sizeMedium);
30
30
 
31
- case 'large':
31
+ case 'lg':
32
32
  return getSizeInPixels(_layout.sizeLarge);
33
33
 
34
34
  default:
@@ -19,7 +19,8 @@ var getSpreadsheetWidth = function getSpreadsheetWidth(_ref) {
19
19
  scrollBarSizeValue = _ref.scrollBarSizeValue,
20
20
  totalVisibleColumns = _ref.totalVisibleColumns,
21
21
  defaultColumn = _ref.defaultColumn,
22
- totalColumnsWidth = _ref.totalColumnsWidth;
22
+ totalColumnsWidth = _ref.totalColumnsWidth,
23
+ visibleColumns = _ref.visibleColumns;
23
24
  var additionalWidth = scrollBarSizeValue + defaultColumn.rowHeaderWidth;
24
25
 
25
26
  if (!totalVisibleColumns) {
@@ -33,7 +34,12 @@ var getSpreadsheetWidth = function getSpreadsheetWidth(_ref) {
33
34
  }
34
35
 
35
36
  if (totalVisibleColumns) {
36
- return totalVisibleColumns * (defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.width) + additionalWidth;
37
+ var totalVisibleColumnWidth = visibleColumns.map(function (item, index) {
38
+ return index <= totalVisibleColumns - 1 && ((item === null || item === void 0 ? void 0 : item.width) || (defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.width));
39
+ }).reduce(function (prev, curr) {
40
+ return prev + curr;
41
+ }, 0);
42
+ return totalVisibleColumnWidth + additionalWidth;
37
43
  }
38
44
  };
39
45
 
@@ -23,19 +23,36 @@ var _checkActiveHeaderCell = require("./checkActiveHeaderCell");
23
23
  * This source code is licensed under the Apache-2.0 license found in the
24
24
  * LICENSE file in the root directory of this source tree.
25
25
  */
26
- var handleHeaderCellSelection = function handleHeaderCellSelection(_ref) {
27
- var type = _ref.type,
28
- activeCellCoordinates = _ref.activeCellCoordinates,
29
- rows = _ref.rows,
30
- columns = _ref.columns,
31
- setActiveCellCoordinates = _ref.setActiveCellCoordinates,
32
- setCurrentMatcher = _ref.setCurrentMatcher,
33
- setSelectionAreas = _ref.setSelectionAreas,
34
- spreadsheetRef = _ref.spreadsheetRef,
35
- index = _ref.index,
36
- isKeyboard = _ref.isKeyboard,
37
- setSelectionAreaData = _ref.setSelectionAreaData,
38
- isHoldingCommandKey = _ref.isHoldingCommandKey;
26
+ var getSelectedItemIndexList = function getSelectedItemIndexList(_ref) {
27
+ var indexList = _ref.indexList,
28
+ newIndex = _ref.newIndex,
29
+ activeCellIndex = _ref.activeCellIndex;
30
+ var lowestIndex = newIndex > activeCellIndex ? activeCellIndex : Math.min.apply(Math, (0, _toConsumableArray2.default)(indexList).concat([newIndex]));
31
+ var highestIndex = newIndex < activeCellIndex ? activeCellIndex : Math.max.apply(Math, (0, _toConsumableArray2.default)(indexList).concat([newIndex]));
32
+ var newIndexList = [];
33
+
34
+ for (var i = lowestIndex; i <= highestIndex; i++) {
35
+ newIndexList.push(i);
36
+ }
37
+
38
+ return [].concat(newIndexList);
39
+ };
40
+
41
+ var handleHeaderCellSelection = function handleHeaderCellSelection(_ref2) {
42
+ var type = _ref2.type,
43
+ activeCellCoordinates = _ref2.activeCellCoordinates,
44
+ rows = _ref2.rows,
45
+ columns = _ref2.columns,
46
+ currentMatcher = _ref2.currentMatcher,
47
+ setActiveCellCoordinates = _ref2.setActiveCellCoordinates,
48
+ setCurrentMatcher = _ref2.setCurrentMatcher,
49
+ setSelectionAreas = _ref2.setSelectionAreas,
50
+ spreadsheetRef = _ref2.spreadsheetRef,
51
+ index = _ref2.index,
52
+ isKeyboard = _ref2.isKeyboard,
53
+ setSelectionAreaData = _ref2.setSelectionAreaData,
54
+ isHoldingCommandKey = _ref2.isHoldingCommandKey,
55
+ isHoldingShiftKey = _ref2.isHoldingShiftKey;
39
56
 
40
57
  if (!isHoldingCommandKey) {
41
58
  setSelectionAreaData([]);
@@ -56,11 +73,15 @@ var handleHeaderCellSelection = function handleHeaderCellSelection(_ref) {
56
73
  column: type === 'column' ? columnValue : columns.length - 1
57
74
  };
58
75
  var tempMatcher = (0, _uuidv.default)();
59
- setActiveCellCoordinates({
60
- row: type === 'column' ? 0 : rowValue,
61
- column: type === 'column' ? columnValue : 0
62
- });
63
- setCurrentMatcher(tempMatcher);
76
+
77
+ if (!isHoldingShiftKey) {
78
+ setActiveCellCoordinates({
79
+ row: type === 'column' ? 0 : rowValue,
80
+ column: type === 'column' ? columnValue : 0
81
+ });
82
+ setCurrentMatcher(tempMatcher);
83
+ }
84
+
64
85
  var newSelectionArea = {
65
86
  point1: point1,
66
87
  point2: point2,
@@ -68,7 +89,7 @@ var handleHeaderCellSelection = function handleHeaderCellSelection(_ref) {
68
89
  matcher: tempMatcher,
69
90
  header: {
70
91
  type: type,
71
- index: index
92
+ selectedIndexList: [type === 'column' ? columnValue : rowValue]
72
93
  }
73
94
  };
74
95
  setSelectionAreas(function (prev) {
@@ -94,6 +115,78 @@ var handleHeaderCellSelection = function handleHeaderCellSelection(_ref) {
94
115
  return [].concat((0, _toConsumableArray2.default)(prev), [newSelectionArea]);
95
116
  }
96
117
 
118
+ if (isHoldingShiftKey) {
119
+ var _selectionAreasClone$, _selectionAreasClone$2;
120
+
121
+ var _selectionsFromHeaderCell = selectionsClone.filter(function (item) {
122
+ var _item$header3;
123
+
124
+ return (_item$header3 = item.header) === null || _item$header3 === void 0 ? void 0 : _item$header3.type;
125
+ }); // Shift/click behavior should not occur unless there are activeCellCoordinates set
126
+
127
+
128
+ var currentSelectionArea = _selectionsFromHeaderCell.filter(function (item) {
129
+ return item.matcher === currentMatcher;
130
+ })[0];
131
+
132
+ var originalAreaIndex = Math.max(currentSelectionArea === null || currentSelectionArea === void 0 ? void 0 : currentSelectionArea.point1[type], currentSelectionArea === null || currentSelectionArea === void 0 ? void 0 : currentSelectionArea.point2[type], activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates[type]);
133
+ var newIndexValue = type === 'column' ? columnValue : rowValue;
134
+ var newPoint = {
135
+ row: originalAreaIndex < newIndexValue ? rows.length - 1 : 0,
136
+ column: columnValue
137
+ };
138
+ var selectionAreasClone = (0, _deepCloneObject.deepCloneObject)(prev);
139
+ var indexOfCurrentArea = selectionAreasClone.findIndex(function (item) {
140
+ return item.matcher === currentMatcher;
141
+ });
142
+ var newIndexList = getSelectedItemIndexList({
143
+ indexList: ((_selectionAreasClone$ = selectionAreasClone[indexOfCurrentArea]) === null || _selectionAreasClone$ === void 0 ? void 0 : (_selectionAreasClone$2 = _selectionAreasClone$.header) === null || _selectionAreasClone$2 === void 0 ? void 0 : _selectionAreasClone$2.selectedIndexList) || [type === 'column' ? columnValue : rowValue],
144
+ newIndex: newIndexValue,
145
+ activeCellIndex: activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates[type]
146
+ });
147
+
148
+ var setPoint1 = function setPoint1(value) {
149
+ return value < newIndexValue ? {
150
+ row: type === 'column' ? 0 : Math.min.apply(Math, (0, _toConsumableArray2.default)(newIndexList)),
151
+ column: type === 'column' ? Math.min.apply(Math, (0, _toConsumableArray2.default)(newIndexList)) : 0
152
+ } : newPoint;
153
+ };
154
+
155
+ var setPoint2 = function setPoint2(value) {
156
+ return value < newIndexValue ? newPoint : {
157
+ row: type === 'column' ? rows.length - 1 : Math.max.apply(Math, (0, _toConsumableArray2.default)(newIndexList)),
158
+ column: type === 'column' ? Math.max.apply(Math, (0, _toConsumableArray2.default)(newIndexList)) : columns.length - 1
159
+ };
160
+ }; // If there is no active cell set and shift is clicked on a header cell
161
+
162
+
163
+ if (!activeCellCoordinates || typeof activeCellCoordinates === 'undefined') {
164
+ // Need to set positioning of active cell because it doesn't exist yet
165
+ setCurrentMatcher(tempMatcher);
166
+ var firstSelectionArea = {
167
+ point1: setPoint1(type === 'column' ? columnValue : rowValue),
168
+ point2: setPoint2(type === 'column' ? columnValue : rowValue),
169
+ areaCreated: false,
170
+ matcher: tempMatcher,
171
+ header: {
172
+ type: type,
173
+ selectedIndexList: [type === 'column' ? columnValue : rowValue]
174
+ }
175
+ };
176
+ setActiveCellCoordinates({
177
+ row: type === 'column' ? 0 : rowValue,
178
+ column: type === 'column' ? columnValue : 0
179
+ });
180
+ return [firstSelectionArea];
181
+ }
182
+
183
+ selectionAreasClone[indexOfCurrentArea].point1 = setPoint1(activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates[type]);
184
+ selectionAreasClone[indexOfCurrentArea].point2 = setPoint2(activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates[type]);
185
+ selectionAreasClone[indexOfCurrentArea].areaCreated = false;
186
+ selectionAreasClone[indexOfCurrentArea].header.selectedIndexList = newIndexList;
187
+ return selectionAreasClone;
188
+ }
189
+
97
190
  return [newSelectionArea];
98
191
  });
99
192
  };
@@ -20,7 +20,8 @@ var moveColumnIndicatorLine = function moveColumnIndicatorLine(_ref) {
20
20
  blockClass = _ref$blockClass === void 0 ? "".concat(_settings.pkg.prefix, "--data-spreadsheet") : _ref$blockClass,
21
21
  clonedSelectionElement = _ref.clonedSelectionElement,
22
22
  ref = _ref.ref,
23
- spreadsheetCoords = _ref.spreadsheetCoords;
23
+ spreadsheetCoords = _ref.spreadsheetCoords,
24
+ leftScrollAmount = _ref.leftScrollAmount;
24
25
  var closestCell = event.target.closest(".".concat(blockClass, "--interactive-cell-element"));
25
26
  var newColumnIndex = closestCell === null || closestCell === void 0 ? void 0 : closestCell.getAttribute('data-column-index');
26
27
  var originalColumnIndex = clonedSelectionElement === null || clonedSelectionElement === void 0 ? void 0 : clonedSelectionElement.getAttribute('data-column-index-original');
@@ -30,11 +31,11 @@ var moveColumnIndicatorLine = function moveColumnIndicatorLine(_ref) {
30
31
  var selectionAreaOrigin = ref.current.querySelector("[data-matcher-id=\"".concat(matcherId, "\"]"));
31
32
 
32
33
  if (Number(newColumnIndex) > Number(originalColumnIndex)) {
33
- indicatorLineElement.style.left = (0, _layout.px)(closestCellCoords.left - spreadsheetCoords.left + closestCell.offsetWidth - 2);
34
+ indicatorLineElement.style.left = (0, _layout.px)(closestCellCoords.left - spreadsheetCoords.left + closestCell.offsetWidth - 2 + leftScrollAmount);
34
35
  }
35
36
 
36
37
  if (Number(newColumnIndex) < Number(originalColumnIndex)) {
37
- indicatorLineElement.style.left = (0, _layout.px)(closestCellCoords.left - spreadsheetCoords.left);
38
+ indicatorLineElement.style.left = (0, _layout.px)(closestCellCoords.left - spreadsheetCoords.left + leftScrollAmount);
38
39
  }
39
40
 
40
41
  if (Number(newColumnIndex) === Number(originalColumnIndex)) {
@@ -79,7 +79,7 @@ var Datagrid = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref) {
79
79
  return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({}, rest, {
80
80
  id: tableId,
81
81
  ref: ref,
82
- className: (0, _classnames.default)(className, blockClass, withVirtualScroll ? "".concat(blockClass, "__datagridWrap") : "".concat(blockClass, "__datagridWrap-simple"))
82
+ className: (0, _classnames.default)(className, blockClass, withVirtualScroll ? "".concat(blockClass, "__datagridWrap") : "".concat(blockClass, "__datagridWrap-simple"), !isFetching && rows.length === 0 ? "".concat(blockClass, "__empty-state") : '')
83
83
  }, (0, _devtools.getDevtoolsProps)(componentName)), /*#__PURE__*/_react.default.createElement(_DatagridToolbar.default, datagridState), leftPanel && /*#__PURE__*/_react.default.createElement("div", {
84
84
  className: "".concat(blockClass, "__grid-container ").concat(blockClass, "__displayFlex")
85
85
  }, leftPanel && leftPanel.isOpen && /*#__PURE__*/_react.default.createElement("div", {
@@ -7,10 +7,16 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.default = void 0;
9
9
 
10
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
+
10
12
  var _react = _interopRequireDefault(require("react"));
11
13
 
12
14
  var _settings = require("../../../settings");
13
15
 
16
+ var _carbonComponentsReact = require("carbon-components-react");
17
+
18
+ var _NoDataEmptyState = require("../../EmptyStates/NoDataEmptyState");
19
+
14
20
  /*
15
21
  * Licensed Materials - Property of IBM
16
22
  * 5724-Q36
@@ -19,12 +25,27 @@ var _settings = require("../../../settings");
19
25
  * restricted by GSA ADP Schedule Contract with IBM Corp.
20
26
  */
21
27
  var blockClass = "".concat(_settings.pkg.prefix, "--datagrid");
28
+ var TableBody = _carbonComponentsReact.DataTable.TableBody,
29
+ TableRow = _carbonComponentsReact.DataTable.TableRow,
30
+ TableCell = _carbonComponentsReact.DataTable.TableCell;
22
31
 
23
32
  var DatagridEmptyBody = function DatagridEmptyBody(datagridState) {
24
- var EmptyState = datagridState.EmptyState;
25
- return /*#__PURE__*/_react.default.createElement("div", {
33
+ var getTableBodyProps = datagridState.getTableBodyProps,
34
+ headers = datagridState.headers,
35
+ emptyStateTitle = datagridState.emptyStateTitle,
36
+ emptyStateDescription = datagridState.emptyStateDescription,
37
+ emptyStateSize = datagridState.emptyStateSize,
38
+ illustrationTheme = datagridState.illustrationTheme;
39
+ return /*#__PURE__*/_react.default.createElement(TableBody, (0, _extends2.default)({}, getTableBodyProps(), {
26
40
  className: "".concat(blockClass, "__empty-state-body")
27
- }, EmptyState);
41
+ }), /*#__PURE__*/_react.default.createElement(TableRow, null, /*#__PURE__*/_react.default.createElement(TableCell, {
42
+ colSpan: headers.length
43
+ }, /*#__PURE__*/_react.default.createElement(_NoDataEmptyState.NoDataEmptyState, {
44
+ illustrationTheme: illustrationTheme,
45
+ size: emptyStateSize,
46
+ title: emptyStateTitle,
47
+ subtitle: emptyStateDescription
48
+ }))));
28
49
  };
29
50
 
30
51
  var _default = DatagridEmptyBody;
@@ -76,7 +76,6 @@ var DraggableElement = function DraggableElement(_ref) {
76
76
  var dragIndex = item.index;
77
77
  var hoverIndex = index; // Don't replace items with themselves
78
78
 
79
- // Don't replace items with themselves
80
79
  if (dragIndex === hoverIndex || disabled) {
81
80
  return;
82
81
  }
@@ -88,12 +87,6 @@ var DraggableElement = function DraggableElement(_ref) {
88
87
  // to avoid expensive index searches.
89
88
  // eslint-disable-next-line no-param-reassign
90
89
 
91
- // Time to actually perform the action
92
- // Note: we're mutating the monitor item here!
93
- // Generally it's better to avoid mutations,
94
- // but it's good here for the sake of performance
95
- // to avoid expensive index searches.
96
- // eslint-disable-next-line no-param-reassign
97
90
  item.index = hoverIndex;
98
91
  }
99
92
  }),
@@ -71,10 +71,10 @@ var RowSizeDropdown = function RowSizeDropdown(_ref) {
71
71
 
72
72
  RowSizeDropdown.propTypes = {
73
73
  buttonLabel: _propTypes.default.string,
74
- datagridName: _propTypes.default.string.isRequired,
75
- light: _propTypes.default.bool.isRequired,
74
+ datagridName: _propTypes.default.string,
75
+ light: _propTypes.default.bool,
76
76
  onChange: _propTypes.default.func.isRequired,
77
- selectedOption: _propTypes.default.string.isRequired
77
+ selectedOption: _propTypes.default.string
78
78
  };
79
79
  var _default = RowSizeDropdown;
80
80
  exports.default = _default;
@@ -148,7 +148,7 @@ RowSizeRadioGroup.defaultProps = {
148
148
  };
149
149
  RowSizeRadioGroup.propTypes = {
150
150
  buttonRef: _propTypes.default.any.isRequired,
151
- datagridName: _propTypes.default.string.isRequired,
151
+ datagridName: _propTypes.default.string,
152
152
  hideRadioGroup: _propTypes.default.func.isRequired,
153
153
  legendText: _propTypes.default.string,
154
154
  onChange: _propTypes.default.func.isRequired,
@@ -100,7 +100,7 @@ var ExportModal = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
100
100
 
101
101
  setName(filename);
102
102
  setExtension(preformattedExtensions === null || preformattedExtensions === void 0 ? void 0 : (_preformattedExtensio = preformattedExtensions[0]) === null || _preformattedExtensio === void 0 ? void 0 : _preformattedExtensio.extension);
103
- }, [filename, preformattedExtensions]);
103
+ }, [filename, preformattedExtensions, open]);
104
104
 
105
105
  var onNameChangeHandler = function onNameChangeHandler(evt) {
106
106
  setName(evt.target.value);
@@ -9,13 +9,15 @@ exports.useWindowResize = void 0;
9
9
 
10
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
11
 
12
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
13
+
12
14
  var _react = require("react");
13
15
 
14
16
  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; }
15
17
 
16
18
  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) { (0, _defineProperty2.default)(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; }
17
19
 
18
- var windowExists = typeof window !== "undefined";
20
+ var windowExists = (typeof window === "undefined" ? "undefined" : (0, _typeof2.default)(window)) !== "undefined";
19
21
 
20
22
  var getWindowSize = function getWindowSize() {
21
23
  if (!windowExists) {
@@ -1,16 +1,20 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
3
5
  Object.defineProperty(exports, "__esModule", {
4
6
  value: true
5
7
  });
6
8
  exports.useNearestScroll = useNearestScroll;
7
9
  exports.useWindowScroll = useWindowScroll;
8
10
 
11
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
12
+
9
13
  var _react = require("react");
10
14
 
11
15
  var _scrollableAncestor = require("../utils/scrollableAncestor");
12
16
 
13
- var windowExists = typeof window !== "undefined";
17
+ var windowExists = (typeof window === "undefined" ? "undefined" : (0, _typeof2.default)(window)) !== "undefined";
14
18
 
15
19
  var useTargetScroll = function useTargetScroll(target, effect, deps, throttleInterval) {
16
20
  var scrollPosition = (0, _react.useRef)({});
@@ -1,10 +1,15 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
3
5
  Object.defineProperty(exports, "__esModule", {
4
6
  value: true
5
7
  });
6
8
  exports.scrollableAncestor = void 0;
7
- var windowExists = typeof window !== "undefined"; // determine whether the target is scrollable
9
+
10
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
11
+
12
+ var windowExists = (typeof window === "undefined" ? "undefined" : (0, _typeof2.default)(window)) !== "undefined"; // determine whether the target is scrollable
8
13
 
9
14
  var scrollable = function scrollable(target) {
10
15
  var style = window.getComputedStyle(target);