@carbon/ibm-products 1.17.0 → 1.18.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. package/README.md +30 -27
  2. package/css/components/Datagrid/styles/datagrid.css +24 -4
  3. package/css/components/Datagrid/styles/datagrid.css.map +1 -1
  4. package/css/components/Datagrid/styles/index.css +24 -4
  5. package/css/components/Datagrid/styles/index.css.map +1 -1
  6. package/css/index-full-carbon.css +215 -90
  7. package/css/index-full-carbon.css.map +1 -1
  8. package/css/index-full-carbon.min.css +4 -4
  9. package/css/index-full-carbon.min.css.map +1 -1
  10. package/css/index-without-carbon.css +98 -24
  11. package/css/index-without-carbon.css.map +1 -1
  12. package/css/index-without-carbon.min.css +2 -2
  13. package/css/index-without-carbon.min.css.map +1 -1
  14. package/css/index.css +124 -55
  15. package/css/index.css.map +1 -1
  16. package/css/index.min.css +4 -4
  17. package/css/index.min.css.map +1 -1
  18. package/es/components/AddSelect/AddSelect.js +57 -8
  19. package/es/components/AddSelect/AddSelectColumn.js +31 -73
  20. package/es/components/AddSelect/AddSelectFilter.js +2 -2
  21. package/es/components/AddSelect/AddSelectList.js +32 -6
  22. package/es/components/AddSelect/AddSelectMetaPanel.js +54 -0
  23. package/es/components/AddSelect/AddSelectSidebar.js +19 -1
  24. package/es/components/AddSelect/AddSelectSort.js +61 -0
  25. package/es/components/AddSelect/add-select-utils.js +21 -0
  26. package/es/components/AddSelect/hooks/useItemSort.js +20 -0
  27. package/es/components/DataSpreadsheet/DataSpreadsheet.js +29 -15
  28. package/es/components/DataSpreadsheet/DataSpreadsheetBody.js +89 -46
  29. package/es/components/DataSpreadsheet/DataSpreadsheetHeader.js +70 -6
  30. package/es/components/DataSpreadsheet/hooks/index.js +3 -1
  31. package/es/components/DataSpreadsheet/hooks/useSpreadsheetEdit.js +15 -14
  32. package/es/components/DataSpreadsheet/hooks/useSpreadsheetMouseMove.js +64 -0
  33. package/es/components/DataSpreadsheet/hooks/useSpreadsheetMouseUp.js +155 -0
  34. package/es/components/DataSpreadsheet/utils/createCellSelectionArea.js +3 -3
  35. package/es/components/DataSpreadsheet/utils/getCellSize.js +10 -10
  36. package/es/components/DataSpreadsheet/utils/getSpreadsheetWidth.js +8 -2
  37. package/es/components/DataSpreadsheet/utils/handleHeaderCellSelection.js +1 -1
  38. package/es/components/DataSpreadsheet/utils/moveColumnIndicatorLine.js +35 -0
  39. package/es/components/Datagrid/Datagrid/Datagrid.js +1 -1
  40. package/es/components/Datagrid/Datagrid/DatagridEmptyBody.js +22 -3
  41. package/es/components/Datagrid/Datagrid/addons/RowSize/RowSizeDropdown.js +3 -3
  42. package/es/components/Datagrid/Datagrid/addons/RowSize/RowSizeRadioGroup.js +1 -1
  43. package/es/components/ExportModal/ExportModal.js +1 -1
  44. package/lib/components/AddSelect/AddSelect.js +58 -8
  45. package/lib/components/AddSelect/AddSelectColumn.js +32 -71
  46. package/lib/components/AddSelect/AddSelectFilter.js +2 -2
  47. package/lib/components/AddSelect/AddSelectList.js +30 -4
  48. package/lib/components/AddSelect/AddSelectMetaPanel.js +77 -0
  49. package/lib/components/AddSelect/AddSelectSidebar.js +20 -1
  50. package/lib/components/AddSelect/AddSelectSort.js +79 -0
  51. package/lib/components/AddSelect/add-select-utils.js +29 -2
  52. package/lib/components/AddSelect/hooks/useItemSort.js +33 -0
  53. package/lib/components/DataSpreadsheet/DataSpreadsheet.js +28 -14
  54. package/lib/components/DataSpreadsheet/DataSpreadsheetBody.js +90 -45
  55. package/lib/components/DataSpreadsheet/DataSpreadsheetHeader.js +72 -6
  56. package/lib/components/DataSpreadsheet/hooks/index.js +17 -1
  57. package/lib/components/DataSpreadsheet/hooks/useSpreadsheetEdit.js +14 -14
  58. package/lib/components/DataSpreadsheet/hooks/useSpreadsheetMouseMove.js +78 -0
  59. package/lib/components/DataSpreadsheet/hooks/useSpreadsheetMouseUp.js +163 -0
  60. package/lib/components/DataSpreadsheet/utils/createCellSelectionArea.js +3 -3
  61. package/lib/components/DataSpreadsheet/utils/getCellSize.js +4 -4
  62. package/lib/components/DataSpreadsheet/utils/getSpreadsheetWidth.js +8 -2
  63. package/lib/components/DataSpreadsheet/utils/handleHeaderCellSelection.js +1 -1
  64. package/lib/components/DataSpreadsheet/utils/moveColumnIndicatorLine.js +46 -0
  65. package/lib/components/Datagrid/Datagrid/Datagrid.js +1 -1
  66. package/lib/components/Datagrid/Datagrid/DatagridEmptyBody.js +24 -3
  67. package/lib/components/Datagrid/Datagrid/addons/RowSize/RowSizeDropdown.js +3 -3
  68. package/lib/components/Datagrid/Datagrid/addons/RowSize/RowSizeRadioGroup.js +1 -1
  69. package/lib/components/ExportModal/ExportModal.js +1 -1
  70. package/package.json +13 -12
  71. package/scss/components/AddSelect/_add-select.scss +45 -5
  72. package/scss/components/DataSpreadsheet/_data-spreadsheet.scss +28 -14
  73. package/scss/components/Datagrid/_storybook-styles.scss +5 -0
  74. package/scss/components/Datagrid/styles/datagrid.scss +43 -5
@@ -15,6 +15,8 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
15
15
 
16
16
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
17
17
 
18
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
19
+
18
20
  var _react = _interopRequireWildcard(require("react"));
19
21
 
20
22
  var _propTypes = _interopRequireDefault(require("prop-types"));
@@ -45,6 +47,8 @@ var _handleHeaderCellSelection = require("./utils/handleHeaderCellSelection");
45
47
 
46
48
  var _getSpreadsheetWidth = require("./utils/getSpreadsheetWidth");
47
49
 
50
+ var _hooks2 = require("./hooks");
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
 
50
54
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -79,11 +83,21 @@ var DataSpreadsheetBody = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, re
79
83
  setCurrentMatcher = _ref.setCurrentMatcher,
80
84
  onSelectionAreaChange = _ref.onSelectionAreaChange,
81
85
  setActiveCellInsideSelectionArea = _ref.setActiveCellInsideSelectionArea,
82
- totalVisibleColumns = _ref.totalVisibleColumns;
86
+ totalVisibleColumns = _ref.totalVisibleColumns,
87
+ setHeaderCellHoldActive = _ref.setHeaderCellHoldActive,
88
+ setColumnOrder = _ref.setColumnOrder,
89
+ visibleColumns = _ref.visibleColumns;
90
+
91
+ var _useState = (0, _react.useState)(false),
92
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
93
+ validStartingPoint = _useState2[0],
94
+ setValidStartingPoint = _useState2[1];
95
+
83
96
  var contentScrollRef = (0, _react.useRef)();
84
97
  var previousState = (0, _hooks.usePreviousValue)({
85
98
  selectionAreaData: selectionAreaData,
86
- clickAndHoldActive: clickAndHoldActive
99
+ clickAndHoldActive: clickAndHoldActive,
100
+ rowHeight: defaultColumn.rowHeight
87
101
  }); // Set custom css property containing the spreadsheet total width
88
102
 
89
103
  (0, _react.useEffect)(function () {
@@ -141,18 +155,18 @@ var DataSpreadsheetBody = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, re
141
155
  ref: ref,
142
156
  area: area,
143
157
  blockClass: blockClass,
144
- columns: columns,
145
158
  defaultColumn: defaultColumn,
146
159
  selectionAreas: selectionAreas,
147
160
  setSelectionAreas: setSelectionAreas,
148
- setActiveCellInsideSelectionArea: setActiveCellInsideSelectionArea
161
+ setActiveCellInsideSelectionArea: setActiveCellInsideSelectionArea,
162
+ visibleColumns: visibleColumns
149
163
  });
150
164
  }
151
165
 
152
166
  return;
153
167
  });
154
168
  }
155
- }, [selectionAreas, setSelectionAreas, defaultColumn, onSelectionAreaChange, setSelectionAreaData, ref, activeCellCoordinates, setActiveCellInsideSelectionArea, columns]);
169
+ }, [selectionAreas, setSelectionAreas, defaultColumn, onSelectionAreaChange, setSelectionAreaData, ref, activeCellCoordinates, setActiveCellInsideSelectionArea, visibleColumns]);
156
170
 
157
171
  var populateSelectionAreaCellData = function populateSelectionAreaCellData(_ref2) {
158
172
  var rowStart = _ref2.rowStart,
@@ -163,61 +177,74 @@ var DataSpreadsheetBody = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, re
163
177
 
164
178
  for (var rowIndex = rowStart; rowIndex <= rowEnd; rowIndex++) {
165
179
  for (var columnIndex = columnStart; columnIndex <= columnEnd; columnIndex++) {
166
- cellContainer.push([rowIndex, columnIndex]);
180
+ cellContainer.push([rowIndex, columnIndex, "".concat(blockClass, "__cell--").concat(rowIndex, "--").concat(columnIndex)]);
167
181
  }
168
182
  }
169
183
 
170
184
  return cellContainer;
171
- }; // Mouse up
185
+ };
172
186
 
187
+ (0, _hooks2.useSpreadsheetMouseUp)({
188
+ currentMatcher: currentMatcher,
189
+ setClickAndHoldActive: setClickAndHoldActive,
190
+ setSelectionAreas: setSelectionAreas,
191
+ setValidStartingPoint: setValidStartingPoint,
192
+ validStartingPoint: validStartingPoint,
193
+ ref: ref,
194
+ setHeaderCellHoldActive: setHeaderCellHoldActive,
195
+ setColumnOrder: setColumnOrder,
196
+ visibleColumns: visibleColumns,
197
+ setActiveCellCoordinates: setActiveCellCoordinates,
198
+ rows: rows,
199
+ activeCellCoordinates: activeCellCoordinates,
200
+ defaultColumn: defaultColumn
201
+ }); // Make sure that if the cellSize prop changes, the active
202
+ // cell also gets updated with the new size and new top placement
203
+ // value. All of the cell selections will be updated as well
173
204
 
174
205
  (0, _react.useEffect)(function () {
175
- var handleMouseUp = function handleMouseUp(event) {
176
- setClickAndHoldActive(false);
177
- var cellButton = event.target.closest(".".concat(blockClass, "__body--td"));
178
-
179
- if (cellButton) {
180
- var endCellCoordinates = {
181
- row: Number(cellButton.getAttribute('data-row-index')),
182
- column: Number(cellButton.getAttribute('data-column-index'))
183
- };
184
- setSelectionAreas(function (prev) {
185
- var selectionAreaClone = (0, _deepCloneObject.deepCloneObject)(prev);
186
- var indexOfItemToUpdate = selectionAreaClone.findIndex(function (item) {
187
- return item.matcher === currentMatcher;
188
- }); // No items in the array have an object that matches the value of currentMatcher
206
+ var listContainer = spreadsheetBodyRef === null || spreadsheetBodyRef === void 0 ? void 0 : spreadsheetBodyRef.current;
207
+ var activeCellButton = listContainer.querySelector(".".concat(blockClass, "__active-cell--highlight"));
189
208
 
190
- if (indexOfItemToUpdate === -1) {
191
- return prev;
192
- }
209
+ if (activeCellButton && defaultColumn.rowHeight !== previousState.rowHeight) {
210
+ activeCellButton.style.height = "".concat(defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.rowHeight, "px");
193
211
 
194
- selectionAreaClone[indexOfItemToUpdate].point2 = endCellCoordinates;
195
- selectionAreaClone[indexOfItemToUpdate].areaCreated = false;
196
- return selectionAreaClone;
197
- });
198
- }
199
- };
212
+ if (activeCellCoordinates) {
213
+ var activeTargetElement = ref.current.querySelector("[data-row-index=\"".concat(activeCellCoordinates.row, "\"][data-column-index=\"").concat(activeCellCoordinates.column, "\"]"));
200
214
 
201
- document.addEventListener('mouseup', handleMouseUp);
202
- return function () {
203
- document.removeEventListener('mouseup', handleMouseUp);
204
- };
205
- }, [selectionAreas, currentMatcher, setSelectionAreas, setClickAndHoldActive, setCurrentMatcher, ref]); // Make sure that if the cellSize prop changes, the active
206
- // cell also gets updated with the new size
215
+ var _listContainer = ref.current.querySelector(".".concat(blockClass, "__list--container"));
207
216
 
208
- (0, _react.useEffect)(function () {
209
- var listContainer = spreadsheetBodyRef === null || spreadsheetBodyRef === void 0 ? void 0 : spreadsheetBodyRef.current;
210
- var activeCellButton = listContainer.querySelector(".".concat(blockClass, "__active-cell--highlight"));
217
+ var newActiveCellTopPosition = activeTargetElement.getBoundingClientRect().top - _listContainer.getBoundingClientRect().top;
211
218
 
212
- if (activeCellButton) {
213
- activeCellButton.style.height = "".concat(defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.rowHeight, "px");
219
+ activeCellButton.style.top = (0, _layout.px)(newActiveCellTopPosition);
220
+ (0, _removeCellSelections.removeCellSelections)({
221
+ spreadsheetRef: ref
222
+ });
223
+ selectionAreas.map(function (area) {
224
+ if (!area.areaCreated && area.point1 && area.point2 && area.matcher) {
225
+ return (0, _createCellSelectionArea.createCellSelectionArea)({
226
+ ref: ref,
227
+ area: area,
228
+ blockClass: blockClass,
229
+ defaultColumn: defaultColumn,
230
+ selectionAreas: selectionAreas,
231
+ setSelectionAreas: setSelectionAreas,
232
+ setActiveCellInsideSelectionArea: setActiveCellInsideSelectionArea,
233
+ visibleColumns: visibleColumns
234
+ });
235
+ }
236
+ });
237
+ }
214
238
  }
215
- }, [defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.rowHeight]); // onClick fn for each cell in the data spreadsheet body,
239
+ }, [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,
216
240
  // adds the active cell highlight
217
241
 
218
242
  var handleBodyCellClick = (0, _react.useCallback)(function (cell, columnIndex) {
219
243
  return function (event) {
220
244
  event.preventDefault();
245
+ var closestBodyCell = event.target.closest(".".concat(blockClass, "__body--td"));
246
+ var isValidSelectionAreaStart = closestBodyCell.classList.contains("".concat(blockClass, "__body--td"));
247
+ setValidStartingPoint(isValidSelectionAreaStart);
221
248
  var isHoldingCommandKey = event.metaKey || event.ctrlKey;
222
249
  var isHoldingShiftKey = event.shiftKey;
223
250
  setContainerHasFocus(true);
@@ -399,6 +426,8 @@ var DataSpreadsheetBody = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, re
399
426
  width: defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.rowHeaderWidth
400
427
  }
401
428
  }, index + 1)), row.cells.map(function (cell, index) {
429
+ var _cell$column;
430
+
402
431
  return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({
403
432
  key: "cell_".concat(index),
404
433
  "aria-colindex": index + 1
@@ -406,7 +435,7 @@ var DataSpreadsheetBody = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, re
406
435
  role: "gridcell",
407
436
  style: _objectSpread(_objectSpread({}, cell.getCellProps().style), {}, {
408
437
  display: 'grid',
409
- minWidth: defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.width
438
+ minWidth: (cell === null || cell === void 0 ? void 0 : (_cell$column = cell.column) === null || _cell$column === void 0 ? void 0 : _cell$column.width) || (defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.width)
410
439
  })
411
440
  }), /*#__PURE__*/_react.default.createElement("button", {
412
441
  id: "".concat(blockClass, "__cell--").concat(cell.row.index, "--").concat(index),
@@ -435,7 +464,8 @@ var DataSpreadsheetBody = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, re
435
464
  scrollBarSizeValue: scrollBarSize,
436
465
  totalVisibleColumns: totalVisibleColumns,
437
466
  defaultColumn: defaultColumn,
438
- totalColumnsWidth: totalColumnsWidth
467
+ totalColumnsWidth: totalColumnsWidth,
468
+ visibleColumns: visibleColumns
439
469
  }),
440
470
  outerRef: contentScrollRef
441
471
  }, rows !== null && rows !== void 0 && rows.length ? RenderRow : RenderEmptyRows));
@@ -549,6 +579,11 @@ DataSpreadsheetBody.propTypes = {
549
579
  */
550
580
  setClickAndHoldActive: _propTypes.default.func,
551
581
 
582
+ /**
583
+ * Setter fn for column ordering, provided from react-table
584
+ */
585
+ setColumnOrder: _propTypes.default.func,
586
+
552
587
  /**
553
588
  * Setter fn for containerHasFocus state value
554
589
  */
@@ -559,6 +594,11 @@ DataSpreadsheetBody.propTypes = {
559
594
  */
560
595
  setCurrentMatcher: _propTypes.default.func,
561
596
 
597
+ /**
598
+ * Setter fn for header cell hold active value
599
+ */
600
+ setHeaderCellHoldActive: _propTypes.default.func,
601
+
562
602
  /**
563
603
  * Setter fn for selectionAreaData state value
564
604
  */
@@ -578,5 +618,10 @@ DataSpreadsheetBody.propTypes = {
578
618
  * The total number of columns to be initially visible, additional columns will be rendered and
579
619
  * visible via horizontal scrollbar
580
620
  */
581
- totalVisibleColumns: _propTypes.default.number
621
+ totalVisibleColumns: _propTypes.default.number,
622
+
623
+ /**
624
+ * Prop from react-table used to reorder columns
625
+ */
626
+ visibleColumns: _propTypes.default.array
582
627
  };
@@ -21,6 +21,8 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
21
21
 
22
22
  var _classnames = _interopRequireDefault(require("classnames"));
23
23
 
24
+ var _layout = require("@carbon/layout");
25
+
24
26
  var _settings = require("../../settings");
25
27
 
26
28
  var _hooks = require("../../global/js/hooks");
@@ -35,6 +37,8 @@ var _selectAllCells = require("./utils/selectAllCells");
35
37
 
36
38
  var _getSpreadsheetWidth = require("./utils/getSpreadsheetWidth");
37
39
 
40
+ var _hooks2 = require("./hooks");
41
+
38
42
  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); }
39
43
 
40
44
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -58,13 +62,21 @@ var DataSpreadsheetHeader = /*#__PURE__*/(0, _react.forwardRef)(function (_ref,
58
62
  setSelectionAreaData = _ref.setSelectionAreaData,
59
63
  rows = _ref.rows,
60
64
  totalVisibleColumns = _ref.totalVisibleColumns,
61
- updateActiveCellCoordinates = _ref.updateActiveCellCoordinates;
65
+ updateActiveCellCoordinates = _ref.updateActiveCellCoordinates,
66
+ setHeaderCellHoldActive = _ref.setHeaderCellHoldActive,
67
+ headerCellHoldActive = _ref.headerCellHoldActive,
68
+ visibleColumns = _ref.visibleColumns;
62
69
 
63
70
  var _useState = (0, _react.useState)(0),
64
71
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
65
72
  scrollBarSizeValue = _useState2[0],
66
73
  setScrollBarSizeValue = _useState2[1];
67
74
 
75
+ var _useState3 = (0, _react.useState)(false),
76
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
77
+ selectedHeaderReorderActive = _useState4[0],
78
+ setSelectedHeaderReorderActive = _useState4[1];
79
+
68
80
  var previousState = (0, _hooks.usePreviousValue)({
69
81
  cellSize: cellSize
70
82
  });
@@ -110,6 +122,39 @@ var DataSpreadsheetHeader = /*#__PURE__*/(0, _react.forwardRef)(function (_ref,
110
122
  });
111
123
  };
112
124
 
125
+ var handleHeaderMouseDown = function handleHeaderMouseDown(index) {
126
+ return function (event) {
127
+ var _selectionAreaToClone;
128
+
129
+ setSelectedHeaderReorderActive(true);
130
+ var clickXPosition = event.clientX;
131
+ var headerButtonCoords = event.target.getBoundingClientRect();
132
+ var offsetXValue = clickXPosition - headerButtonCoords.left;
133
+ 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
+ var selectionAreaClonedElement = selectionAreaElement.cloneNode();
141
+ var reorderIndicatorLine = selectionAreaElement.cloneNode();
142
+ reorderIndicatorLine.className = "".concat(blockClass, "__reorder-indicator-line");
143
+ reorderIndicatorLine.style.width = (0, _layout.px)(2);
144
+ selectionAreaClonedElement.classList.add("".concat(blockClass, "__selection-area--element-cloned"));
145
+ selectionAreaClonedElement.setAttribute('data-clone-offset-x', offsetXValue);
146
+ selectionAreaClonedElement.setAttribute('data-column-index-original', index);
147
+ bodyContainer.appendChild(selectionAreaClonedElement);
148
+ bodyContainer.appendChild(reorderIndicatorLine);
149
+ setHeaderCellHoldActive(true);
150
+ };
151
+ };
152
+
153
+ (0, _hooks2.useSpreadsheetMouseMove)({
154
+ ref: ref,
155
+ headerCellHoldActive: headerCellHoldActive,
156
+ defaultColumn: defaultColumn
157
+ });
113
158
  return /*#__PURE__*/_react.default.createElement("div", {
114
159
  className: (0, _classnames.default)("".concat(blockClass, "__header--container")),
115
160
  role: "rowgroup"
@@ -123,7 +168,8 @@ var DataSpreadsheetHeader = /*#__PURE__*/(0, _react.forwardRef)(function (_ref,
123
168
  headerGroup: headerGroup,
124
169
  scrollBarSizeValue: scrollBarSizeValue,
125
170
  totalVisibleColumns: totalVisibleColumns,
126
- defaultColumn: defaultColumn
171
+ defaultColumn: defaultColumn,
172
+ visibleColumns: visibleColumns
127
173
  }),
128
174
  overflow: 'hidden'
129
175
  }),
@@ -146,6 +192,7 @@ var DataSpreadsheetHeader = /*#__PURE__*/(0, _react.forwardRef)(function (_ref,
146
192
  }, "\xA0")), headerGroup.headers.map(function (column, index) {
147
193
  var _cx2;
148
194
 
195
+ var selectedHeader = (0, _checkSelectedHeaderCell.checkSelectedHeaderCell)(index, selectionAreas, 'column');
149
196
  return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({
150
197
  key: "column_".concat(index),
151
198
  role: "columnheader",
@@ -155,12 +202,16 @@ var DataSpreadsheetHeader = /*#__PURE__*/(0, _react.forwardRef)(function (_ref,
155
202
  "data-row-index": "header",
156
203
  "data-column-index": index,
157
204
  tabIndex: -1,
158
- onClick: handleColumnHeaderClick(index),
205
+ onMouseDown: selectedHeader ? handleHeaderMouseDown(index) : null,
206
+ onMouseUp: selectedHeader ? function () {
207
+ return setSelectedHeaderReorderActive(false);
208
+ } : null,
209
+ onClick: !selectedHeader ? handleColumnHeaderClick(index) : null,
159
210
  style: {
160
211
  height: defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.rowHeight,
161
212
  width: (column === null || column === void 0 ? void 0 : column.width) || (defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.width)
162
213
  },
163
- className: (0, _classnames.default)("".concat(blockClass, "__th"), "".concat(blockClass, "--interactive-cell-element"), (_cx2 = {}, (0, _defineProperty2.default)(_cx2, "".concat(blockClass, "__th--active-header"), (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column) === index || (0, _checkActiveHeaderCell.checkActiveHeaderCell)(index, selectionAreas, 'column')), (0, _defineProperty2.default)(_cx2, "".concat(blockClass, "__th--selected-header"), (0, _checkSelectedHeaderCell.checkSelectedHeaderCell)(index, selectionAreas, 'column')), _cx2)),
214
+ className: (0, _classnames.default)("".concat(blockClass, "__th"), "".concat(blockClass, "--interactive-cell-element"), (_cx2 = {}, (0, _defineProperty2.default)(_cx2, "".concat(blockClass, "__th--active-header"), (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column) === index || (0, _checkActiveHeaderCell.checkActiveHeaderCell)(index, selectionAreas, 'column')), (0, _defineProperty2.default)(_cx2, "".concat(blockClass, "__th--selected-header"), selectedHeader), (0, _defineProperty2.default)(_cx2, "".concat(blockClass, "__th--selected-header-reorder-active"), selectedHeaderReorderActive), _cx2)),
164
215
  type: "button"
165
216
  }, column.render('Header')));
166
217
  }));
@@ -179,7 +230,7 @@ DataSpreadsheetHeader.propTypes = {
179
230
  /**
180
231
  * Specifies the cell height
181
232
  */
182
- cellSize: _propTypes.default.oneOf(['compact', 'standard', 'medium', 'large']),
233
+ cellSize: _propTypes.default.oneOf(['xs', 'sm', 'md', 'lg']),
183
234
 
184
235
  /**
185
236
  * All of the spreadsheet columns
@@ -195,6 +246,11 @@ DataSpreadsheetHeader.propTypes = {
195
246
  width: _propTypes.default.number
196
247
  }),
197
248
 
249
+ /**
250
+ * Whether or not a click/hold is active on a header cell
251
+ */
252
+ headerCellHoldActive: _propTypes.default.bool,
253
+
198
254
  /**
199
255
  * Headers provided from useTable hook
200
256
  */
@@ -225,6 +281,11 @@ DataSpreadsheetHeader.propTypes = {
225
281
  */
226
282
  setCurrentMatcher: _propTypes.default.func,
227
283
 
284
+ /**
285
+ * Setter fn for header cell hold active value
286
+ */
287
+ setHeaderCellHoldActive: _propTypes.default.func,
288
+
228
289
  /**
229
290
  * Setter fn for selectionAreaData state value
230
291
  */
@@ -244,5 +305,10 @@ DataSpreadsheetHeader.propTypes = {
244
305
  /**
245
306
  * Function used to update the active cell coordinates
246
307
  */
247
- updateActiveCellCoordinates: _propTypes.default.func
308
+ updateActiveCellCoordinates: _propTypes.default.func,
309
+
310
+ /**
311
+ * Array of visible columns provided by react-table useTable hook
312
+ */
313
+ visibleColumns: _propTypes.default.array
248
314
  };
@@ -27,6 +27,18 @@ Object.defineProperty(exports, "useSpreadsheetEdit", {
27
27
  return _useSpreadsheetEdit.useSpreadsheetEdit;
28
28
  }
29
29
  });
30
+ Object.defineProperty(exports, "useSpreadsheetMouseMove", {
31
+ enumerable: true,
32
+ get: function get() {
33
+ return _useSpreadsheetMouseMove.useSpreadsheetMouseMove;
34
+ }
35
+ });
36
+ Object.defineProperty(exports, "useSpreadsheetMouseUp", {
37
+ enumerable: true,
38
+ get: function get() {
39
+ return _useSpreadsheetMouseUp.useSpreadsheetMouseUp;
40
+ }
41
+ });
30
42
  Object.defineProperty(exports, "useSpreadsheetOutsideClick", {
31
43
  enumerable: true,
32
44
  get: function get() {
@@ -42,4 +54,8 @@ var _useResetSpreadsheetFocus = require("./useResetSpreadsheetFocus");
42
54
 
43
55
  var _useSpreadsheetOutsideClick = require("./useSpreadsheetOutsideClick");
44
56
 
45
- var _useSpreadsheetEdit = require("./useSpreadsheetEdit");
57
+ var _useSpreadsheetEdit = require("./useSpreadsheetEdit");
58
+
59
+ var _useSpreadsheetMouseUp = require("./useSpreadsheetMouseUp");
60
+
61
+ var _useSpreadsheetMouseMove = require("./useSpreadsheetMouseMove");
@@ -17,12 +17,12 @@ var _settings = require("../../../settings");
17
17
 
18
18
  var _hooks = require("../../../global/js/hooks");
19
19
 
20
- // /**
21
- // * Copyright IBM Corp. 2022, 2022
22
- // *
23
- // * This source code is licensed under the Apache-2.0 license found in the
24
- // * LICENSE file in the root directory of this source tree.
25
- // */
20
+ /**
21
+ * Copyright IBM Corp. 2022, 2022
22
+ *
23
+ * This source code is licensed under the Apache-2.0 license found in the
24
+ * LICENSE file in the root directory of this source tree.
25
+ */
26
26
  var useSpreadsheetEdit = function useSpreadsheetEdit(_ref) {
27
27
  var isEditing = _ref.isEditing,
28
28
  rows = _ref.rows,
@@ -30,7 +30,7 @@ var useSpreadsheetEdit = function useSpreadsheetEdit(_ref) {
30
30
  activeCellRef = _ref.activeCellRef,
31
31
  cellEditorRef = _ref.cellEditorRef,
32
32
  cellEditorRulerRef = _ref.cellEditorRulerRef,
33
- columns = _ref.columns,
33
+ visibleColumns = _ref.visibleColumns,
34
34
  defaultColumn = _ref.defaultColumn,
35
35
  cellEditorValue = _ref.cellEditorValue,
36
36
  _ref$blockClass = _ref.blockClass,
@@ -69,9 +69,9 @@ var useSpreadsheetEdit = function useSpreadsheetEdit(_ref) {
69
69
  (_cellEditorRef$curren = cellEditorRef.current) === null || _cellEditorRef$curren === void 0 ? void 0 : _cellEditorRef$curren.focus();
70
70
 
71
71
  if (rulerWidth < cellEditorCurrentWidth) {
72
- var _columns$nextIndex;
72
+ var _visibleColumns$nextI;
73
73
 
74
- var currentColumnWidth = ((_columns$nextIndex = columns[nextIndex]) === null || _columns$nextIndex === void 0 ? void 0 : _columns$nextIndex.width) || (defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.width); // If the contents of the cell editor is deleted past the point of the next column
74
+ var currentColumnWidth = ((_visibleColumns$nextI = visibleColumns[nextIndex]) === null || _visibleColumns$nextI === void 0 ? void 0 : _visibleColumns$nextI.width) || (defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.width); // If the contents of the cell editor is deleted past the point of the next column
75
75
 
76
76
  if (rulerWidth < cellEditorCurrentWidth - currentColumnWidth) {
77
77
  cellEditorRef.current.style.width = (0, _layout.px)(parseInt(cellEditorRef.current.style.width) - currentColumnWidth);
@@ -87,17 +87,17 @@ var useSpreadsheetEdit = function useSpreadsheetEdit(_ref) {
87
87
  }
88
88
 
89
89
  if (rulerWidth >= cellEditorCurrentWidth) {
90
- var _columns;
90
+ var _visibleColumns;
91
91
 
92
92
  setNextIndex(function (prev) {
93
- if (prev === columns.length - 1) {
93
+ if (prev === visibleColumns.length - 1) {
94
94
  return prev;
95
95
  }
96
96
 
97
97
  return prev + 1;
98
98
  });
99
- var onLastColumnIndex = nextIndex + 1 === columns.length;
100
- var nextColumnWidth = onLastColumnIndex ? 0 : ((_columns = columns[nextIndex + 1]) === null || _columns === void 0 ? void 0 : _columns.width) || (defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.width);
99
+ var onLastColumnIndex = nextIndex + 1 === visibleColumns.length;
100
+ var nextColumnWidth = onLastColumnIndex ? 0 : ((_visibleColumns = visibleColumns[nextIndex + 1]) === null || _visibleColumns === void 0 ? void 0 : _visibleColumns.width) || (defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.width);
101
101
  var startingRowPosition = activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row;
102
102
  var totalRows = rows.length;
103
103
  var totalCellEditorMaxHeight = (totalRows - startingRowPosition) * defaultColumn.rowHeight;
@@ -123,7 +123,7 @@ var useSpreadsheetEdit = function useSpreadsheetEdit(_ref) {
123
123
  activeCellRef.current.focus();
124
124
  setNextIndex(activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column);
125
125
  }
126
- }, [isEditing, activeCellCoordinates, rows, cellEditorValue, columns.length, defaultColumn, activeCellRef, cellEditorRef, cellEditorRulerRef, columns, blockClass, previousState === null || previousState === void 0 ? void 0 : previousState.cellEditorValue, nextIndex]);
126
+ }, [isEditing, activeCellCoordinates, rows, cellEditorValue, defaultColumn, activeCellRef, cellEditorRef, cellEditorRulerRef, visibleColumns, blockClass, previousState === null || previousState === void 0 ? void 0 : previousState.cellEditorValue, nextIndex]);
127
127
  };
128
128
 
129
129
  exports.useSpreadsheetEdit = useSpreadsheetEdit;
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useSpreadsheetMouseMove = void 0;
7
+
8
+ var _react = require("react");
9
+
10
+ var _layout = require("@carbon/layout");
11
+
12
+ var _settings = require("../../../settings");
13
+
14
+ var _getScrollbarWidth = require("../../../global/js/utils/getScrollbarWidth");
15
+
16
+ var _moveColumnIndicatorLine = require("../utils/moveColumnIndicatorLine");
17
+
18
+ /**
19
+ * Copyright IBM Corp. 2022, 2022
20
+ *
21
+ * This source code is licensed under the Apache-2.0 license found in the
22
+ * LICENSE file in the root directory of this source tree.
23
+ */
24
+ // Used specifically for reordering columns, will move the position of the
25
+ // cloned selection area to follow the position of the cursor
26
+ var useSpreadsheetMouseMove = function useSpreadsheetMouseMove(_ref) {
27
+ var ref = _ref.ref,
28
+ _ref$blockClass = _ref.blockClass,
29
+ blockClass = _ref$blockClass === void 0 ? "".concat(_settings.pkg.prefix, "--data-spreadsheet") : _ref$blockClass,
30
+ headerCellHoldActive = _ref.headerCellHoldActive,
31
+ defaultColumn = _ref.defaultColumn;
32
+ (0, _react.useEffect)(function () {
33
+ var handleMouseMove = function handleMouseMove(event) {
34
+ var clonedSelectionElement = ref.current.querySelector(".".concat(blockClass, "__selection-area--element-cloned"));
35
+
36
+ if (clonedSelectionElement) {
37
+ ref.current.addEventListener('mousemove', handleMouseMove);
38
+ }
39
+
40
+ var spreadsheetCoords = ref.current.getBoundingClientRect();
41
+ var listContainer = ref.current.querySelector(".".concat(blockClass, "__list--container"));
42
+ var scrollAmount = listContainer.scrollLeft;
43
+ (0, _moveColumnIndicatorLine.moveColumnIndicatorLine)({
44
+ clonedSelectionElement: clonedSelectionElement,
45
+ ref: ref,
46
+ spreadsheetCoords: spreadsheetCoords,
47
+ leftScrollAmount: scrollAmount
48
+ });
49
+ var scrollbarWidth = (0, _getScrollbarWidth.getScrollbarWidth)();
50
+ var spreadsheetWrapperElement = ref.current;
51
+ spreadsheetWrapperElement.getBoundingClientRect();
52
+ var xPositionRelativeToSpreadsheet = event.clientX - spreadsheetCoords.left;
53
+ var offsetXValue = clonedSelectionElement === null || clonedSelectionElement === void 0 ? void 0 : clonedSelectionElement.getAttribute('data-clone-offset-x');
54
+ var totalSpreadsheetScrollingWidth = listContainer.scrollWidth;
55
+ var clonedSelectionWidth = clonedSelectionElement.offsetWidth;
56
+ 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
57
+ // add the amount horizontally scrolled
58
+
59
+ clonedSelectionElement.style.left = (0, _layout.px)(totalSpreadsheetScrollingWidth - clonedSelectionWidth - scrollbarWidth >= clonePlacement ? clonePlacement + scrollAmount : totalSpreadsheetScrollingWidth - clonedSelectionWidth - scrollbarWidth);
60
+ };
61
+
62
+ if (headerCellHoldActive) {
63
+ ref.current.addEventListener('mousemove', handleMouseMove);
64
+ }
65
+
66
+ var spreadsheetRef = ref.current;
67
+
68
+ if (!headerCellHoldActive) {
69
+ spreadsheetRef === null || spreadsheetRef === void 0 ? void 0 : spreadsheetRef.removeEventListener('mousemove', handleMouseMove);
70
+ }
71
+
72
+ return function () {
73
+ spreadsheetRef === null || spreadsheetRef === void 0 ? void 0 : spreadsheetRef.removeEventListener('mousemove', handleMouseMove);
74
+ };
75
+ });
76
+ };
77
+
78
+ exports.useSpreadsheetMouseMove = useSpreadsheetMouseMove;