@carbon/ibm-products 1.14.0 → 1.17.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. package/css/components/Datagrid/styles/datagrid.css +4 -0
  2. package/css/components/Datagrid/styles/datagrid.css.map +1 -1
  3. package/css/components/Datagrid/styles/index.css +5 -1
  4. package/css/components/Datagrid/styles/index.css.map +1 -1
  5. package/css/components/Datagrid/styles/useNestedRows.css +1 -1
  6. package/css/index-full-carbon.css +75 -16
  7. package/css/index-full-carbon.css.map +1 -1
  8. package/css/index-full-carbon.min.css +6 -3
  9. package/css/index-full-carbon.min.css.map +1 -1
  10. package/css/index-without-carbon-released-only.css +13 -7
  11. package/css/index-without-carbon-released-only.css.map +1 -1
  12. package/css/index-without-carbon-released-only.min.css +5 -2
  13. package/css/index-without-carbon-released-only.min.css.map +1 -1
  14. package/css/index-without-carbon.css +75 -16
  15. package/css/index-without-carbon.css.map +1 -1
  16. package/css/index-without-carbon.min.css +6 -3
  17. package/css/index-without-carbon.min.css.map +1 -1
  18. package/css/index.css +75 -16
  19. package/css/index.css.map +1 -1
  20. package/css/index.min.css +6 -3
  21. package/css/index.min.css.map +1 -1
  22. package/es/components/AddSelect/AddSelect.js +34 -23
  23. package/es/components/AddSelect/AddSelectFilter.js +52 -9
  24. package/es/components/DataSpreadsheet/DataSpreadsheet.js +186 -129
  25. package/es/components/DataSpreadsheet/DataSpreadsheetBody.js +67 -15
  26. package/es/components/DataSpreadsheet/DataSpreadsheetHeader.js +55 -11
  27. package/es/components/DataSpreadsheet/hooks/index.js +2 -1
  28. package/es/components/DataSpreadsheet/hooks/useMultipleKeyTracking.js +36 -8
  29. package/es/components/DataSpreadsheet/hooks/useSpreadsheetEdit.js +113 -0
  30. package/es/components/DataSpreadsheet/utils/checkSelectedHeaderCell.js +16 -0
  31. package/es/components/DataSpreadsheet/utils/createCellSelectionArea.js +29 -12
  32. package/es/components/DataSpreadsheet/utils/generateData.js +17 -9
  33. package/es/components/DataSpreadsheet/utils/getSelectionAreaPoints.js +18 -0
  34. package/es/components/DataSpreadsheet/utils/getSpreadsheetWidth.js +30 -0
  35. package/es/components/DataSpreadsheet/utils/handleActiveCellInSelectionEnter.js +121 -0
  36. package/es/components/DataSpreadsheet/utils/handleActiveCellInSelectionTab.js +108 -0
  37. package/es/components/DataSpreadsheet/utils/handleEditSubmit.js +87 -0
  38. package/es/components/DataSpreadsheet/utils/handleHeaderCellSelection.js +46 -8
  39. package/es/components/DataSpreadsheet/utils/handleMultipleKeys.js +153 -15
  40. package/es/components/DataSpreadsheet/utils/selectAllCells.js +53 -0
  41. package/es/components/Datagrid/Datagrid/Datagrid.js +24 -12
  42. package/es/components/Datagrid/Datagrid/DatagridHead.js +8 -16
  43. package/es/components/Datagrid/Datagrid/DatagridHeaderRow.js +10 -10
  44. package/es/components/Datagrid/Datagrid/DatagridRow.js +12 -2
  45. package/es/components/Datagrid/Datagrid/index.js +6 -7
  46. package/es/components/Datagrid/index.js +1 -1
  47. package/es/components/Datagrid/useNestedRows.js +3 -3
  48. package/es/components/Datagrid/useRowExpander.js +1 -1
  49. package/es/components/ExportModal/ExportModal.js +10 -5
  50. package/es/components/MultiAddSelect/MultiAddSelect.js +150 -3
  51. package/es/components/PageHeader/PageHeader.js +3 -1
  52. package/es/components/SidePanel/SidePanel.js +5 -1
  53. package/es/components/SingleAddSelect/SingleAddSelect.js +90 -4
  54. package/es/components/TagSet/TagSet.js +13 -6
  55. package/es/components/Tearsheet/TearsheetShell.js +34 -10
  56. package/es/components/WebTerminal/WebTerminal.js +36 -11
  57. package/es/components/WebTerminal/WebTerminalContentWrapper.js +49 -0
  58. package/es/components/WebTerminal/index.js +2 -1
  59. package/es/components/index.js +1 -1
  60. package/es/global/js/package-settings.js +3 -1
  61. package/lib/components/AddSelect/AddSelect.js +34 -23
  62. package/lib/components/AddSelect/AddSelectFilter.js +51 -8
  63. package/lib/components/DataSpreadsheet/DataSpreadsheet.js +190 -128
  64. package/lib/components/DataSpreadsheet/DataSpreadsheetBody.js +69 -15
  65. package/lib/components/DataSpreadsheet/DataSpreadsheetHeader.js +58 -12
  66. package/lib/components/DataSpreadsheet/hooks/index.js +9 -1
  67. package/lib/components/DataSpreadsheet/hooks/useMultipleKeyTracking.js +36 -8
  68. package/lib/components/DataSpreadsheet/hooks/useSpreadsheetEdit.js +129 -0
  69. package/lib/components/DataSpreadsheet/utils/checkSelectedHeaderCell.js +26 -0
  70. package/lib/components/DataSpreadsheet/utils/createCellSelectionArea.js +31 -13
  71. package/lib/components/DataSpreadsheet/utils/generateData.js +17 -9
  72. package/lib/components/DataSpreadsheet/utils/getSelectionAreaPoints.js +27 -0
  73. package/lib/components/DataSpreadsheet/utils/getSpreadsheetWidth.js +40 -0
  74. package/lib/components/DataSpreadsheet/utils/handleActiveCellInSelectionEnter.js +127 -0
  75. package/lib/components/DataSpreadsheet/utils/handleActiveCellInSelectionTab.js +118 -0
  76. package/lib/components/DataSpreadsheet/utils/handleEditSubmit.js +94 -0
  77. package/lib/components/DataSpreadsheet/utils/handleHeaderCellSelection.js +48 -8
  78. package/lib/components/DataSpreadsheet/utils/handleMultipleKeys.js +161 -22
  79. package/lib/components/DataSpreadsheet/utils/selectAllCells.js +60 -0
  80. package/lib/components/Datagrid/Datagrid/Datagrid.js +25 -8
  81. package/lib/components/Datagrid/Datagrid/DatagridHead.js +8 -16
  82. package/lib/components/Datagrid/Datagrid/DatagridHeaderRow.js +10 -10
  83. package/lib/components/Datagrid/Datagrid/DatagridRow.js +14 -2
  84. package/lib/components/Datagrid/Datagrid/index.js +3 -5
  85. package/lib/components/Datagrid/index.js +2 -2
  86. package/lib/components/Datagrid/useNestedRows.js +3 -3
  87. package/lib/components/Datagrid/useRowExpander.js +1 -1
  88. package/lib/components/ExportModal/ExportModal.js +9 -4
  89. package/lib/components/MultiAddSelect/MultiAddSelect.js +150 -2
  90. package/lib/components/PageHeader/PageHeader.js +3 -1
  91. package/lib/components/SidePanel/SidePanel.js +5 -1
  92. package/lib/components/SingleAddSelect/SingleAddSelect.js +91 -3
  93. package/lib/components/TagSet/TagSet.js +13 -6
  94. package/lib/components/Tearsheet/TearsheetShell.js +36 -10
  95. package/lib/components/WebTerminal/WebTerminal.js +36 -10
  96. package/lib/components/WebTerminal/WebTerminalContentWrapper.js +58 -0
  97. package/lib/components/WebTerminal/index.js +9 -1
  98. package/lib/components/index.js +6 -0
  99. package/lib/global/js/package-settings.js +3 -1
  100. package/package.json +13 -13
  101. package/scss/components/AboutModal/_about-modal.scss +4 -0
  102. package/scss/components/AddSelect/_add-select.scss +9 -2
  103. package/scss/components/DataSpreadsheet/_data-spreadsheet.scss +39 -2
  104. package/scss/components/Datagrid/styles/datagrid.scss +8 -0
  105. package/scss/components/Datagrid/styles/useNestedRows.scss +1 -1
  106. package/scss/components/ExportModal/_export-modal.scss +0 -4
  107. package/scss/components/SidePanel/_side-panel.scss +22 -3
  108. package/scss/components/WebTerminal/_storybook-styles.scss +5 -0
  109. package/scss/components/WebTerminal/_web-terminal.scss +14 -4
@@ -39,8 +39,12 @@ var _createCellSelectionArea = require("./utils/createCellSelectionArea");
39
39
 
40
40
  var _checkActiveHeaderCell = require("./utils/checkActiveHeaderCell");
41
41
 
42
+ var _checkSelectedHeaderCell = require("./utils/checkSelectedHeaderCell");
43
+
42
44
  var _handleHeaderCellSelection = require("./utils/handleHeaderCellSelection");
43
45
 
46
+ var _getSpreadsheetWidth = require("./utils/getSpreadsheetWidth");
47
+
44
48
  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); }
45
49
 
46
50
  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; }
@@ -73,7 +77,10 @@ var DataSpreadsheetBody = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, re
73
77
  setClickAndHoldActive = _ref.setClickAndHoldActive,
74
78
  currentMatcher = _ref.currentMatcher,
75
79
  setCurrentMatcher = _ref.setCurrentMatcher,
76
- onSelectionAreaChange = _ref.onSelectionAreaChange;
80
+ onSelectionAreaChange = _ref.onSelectionAreaChange,
81
+ setActiveCellInsideSelectionArea = _ref.setActiveCellInsideSelectionArea,
82
+ totalVisibleColumns = _ref.totalVisibleColumns;
83
+ var contentScrollRef = (0, _react.useRef)();
77
84
  var previousState = (0, _hooks.usePreviousValue)({
78
85
  selectionAreaData: selectionAreaData,
79
86
  clickAndHoldActive: clickAndHoldActive
@@ -131,18 +138,21 @@ var DataSpreadsheetBody = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, re
131
138
 
132
139
  if (!area.areaCreated && area.point1 && area.point2 && area.matcher) {
133
140
  (0, _createCellSelectionArea.createCellSelectionArea)({
141
+ ref: ref,
134
142
  area: area,
135
143
  blockClass: blockClass,
144
+ columns: columns,
136
145
  defaultColumn: defaultColumn,
137
146
  selectionAreas: selectionAreas,
138
- setSelectionAreas: setSelectionAreas
147
+ setSelectionAreas: setSelectionAreas,
148
+ setActiveCellInsideSelectionArea: setActiveCellInsideSelectionArea
139
149
  });
140
150
  }
141
151
 
142
152
  return;
143
153
  });
144
154
  }
145
- }, [selectionAreas, setSelectionAreas, defaultColumn, onSelectionAreaChange, setSelectionAreaData]);
155
+ }, [selectionAreas, setSelectionAreas, defaultColumn, onSelectionAreaChange, setSelectionAreaData, ref, activeCellCoordinates, setActiveCellInsideSelectionArea, columns]);
146
156
 
147
157
  var populateSelectionAreaCellData = function populateSelectionAreaCellData(_ref2) {
148
158
  var rowStart = _ref2.rowStart,
@@ -220,6 +230,9 @@ var DataSpreadsheetBody = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, re
220
230
  // meaning that selectionAreas should only have one item by default
221
231
 
222
232
  if (isHoldingCommandKey) {
233
+ var activeCellElement = ref.current.querySelector(".".concat(blockClass, "__active-cell--highlight"));
234
+ activeCellElement.setAttribute('data-selection-id', tempMatcher);
235
+ setActiveCellInsideSelectionArea(true);
223
236
  setActiveCellCoordinates(activeCoordinates);
224
237
  setCurrentMatcher(tempMatcher);
225
238
  setSelectionAreas(function (prev) {
@@ -250,6 +263,7 @@ var DataSpreadsheetBody = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, re
250
263
  setSelectionAreas(selectionAreaClone);
251
264
  }
252
265
  } else {
266
+ setActiveCellInsideSelectionArea(false);
253
267
  setActiveCellCoordinates(activeCoordinates); // remove all previous cell selections
254
268
 
255
269
  (0, _removeCellSelections.removeCellSelections)({
@@ -263,7 +277,22 @@ var DataSpreadsheetBody = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, re
263
277
  setSelectionAreaData([]);
264
278
  }
265
279
  };
266
- }, [currentMatcher, activeCellCoordinates, selectionAreas, setActiveCellCoordinates, setSelectionAreas, setContainerHasFocus, setClickAndHoldActive, setCurrentMatcher, ref, setSelectionAreaData]);
280
+ }, [currentMatcher, activeCellCoordinates, selectionAreas, setActiveCellCoordinates, setSelectionAreas, setContainerHasFocus, setClickAndHoldActive, setCurrentMatcher, ref, setSelectionAreaData, setActiveCellInsideSelectionArea]);
281
+
282
+ var handleBodyScroll = function handleBodyScroll() {
283
+ var headerRowElement = ref.current.querySelector("\n .".concat(blockClass, "__header--container .").concat(blockClass, "__tr"));
284
+ headerRowElement.scrollLeft = contentScrollRef.current.scrollLeft;
285
+ };
286
+
287
+ (0, _react.useEffect)(function () {
288
+ contentScrollRef.current.addEventListener('scroll', function (event) {
289
+ return handleBodyScroll(event);
290
+ });
291
+ var contentScrollElementRef = contentScrollRef.current;
292
+ return function () {
293
+ contentScrollElementRef.removeEventListener('scroll', handleBodyScroll);
294
+ };
295
+ });
267
296
  var handleBodyCellHover = (0, _react.useCallback)(function (cell, columnIndex) {
268
297
  return function () {
269
298
  if (clickAndHoldActive) {
@@ -296,7 +325,8 @@ var DataSpreadsheetBody = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, re
296
325
  };
297
326
  }, [clickAndHoldActive, currentMatcher, setSelectionAreas]);
298
327
  var handleRowHeaderClick = (0, _react.useCallback)(function (index) {
299
- return function () {
328
+ return function (event) {
329
+ var isHoldingCommandKey = event.metaKey || event.ctrlKey;
300
330
  (0, _handleHeaderCellSelection.handleHeaderCellSelection)({
301
331
  type: 'row',
302
332
  activeCellCoordinates: activeCellCoordinates,
@@ -307,7 +337,8 @@ var DataSpreadsheetBody = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, re
307
337
  setSelectionAreas: setSelectionAreas,
308
338
  spreadsheetRef: ref,
309
339
  index: index,
310
- setSelectionAreaData: setSelectionAreaData
340
+ setSelectionAreaData: setSelectionAreaData,
341
+ isHoldingCommandKey: isHoldingCommandKey
311
342
  });
312
343
  };
313
344
  }, [columns, ref, setSelectionAreas, setCurrentMatcher, setActiveCellCoordinates, activeCellCoordinates, rows, setSelectionAreaData]); // Builds the empty rows and calls `onDataUpdate` to set the new empty rows
@@ -344,35 +375,41 @@ var DataSpreadsheetBody = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, re
344
375
  var row = rows[index];
345
376
 
346
377
  if (rows && rows.length) {
378
+ var _cx;
379
+
347
380
  prepareRow(row);
348
381
  return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({}, row.getRowProps({
349
382
  style: style
350
383
  }), {
351
384
  className: (0, _classnames.default)("".concat(blockClass, "__tr")),
352
385
  "data-row-index": index,
353
- "aria-rowindex": index
386
+ "aria-rowindex": index + 1
354
387
  }), /*#__PURE__*/_react.default.createElement("div", {
355
- role: "rowheader"
388
+ role: "rowheader",
389
+ className: "".concat(blockClass, "__td-th--cell-container")
356
390
  }, /*#__PURE__*/_react.default.createElement("button", {
391
+ id: "".concat(blockClass, "__cell--").concat(index, "--header"),
357
392
  tabIndex: -1,
358
393
  "data-row-index": index,
359
394
  "data-column-index": "header",
360
395
  type: "button",
361
396
  onClick: handleRowHeaderClick(index),
362
- className: (0, _classnames.default)("".concat(blockClass, "__td"), "".concat(blockClass, "__td-th"), "".concat(blockClass, "--interactive-cell-element"), (0, _defineProperty2.default)({}, "".concat(blockClass, "__td-th--active-header"), (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row) === index || (0, _checkActiveHeaderCell.checkActiveHeaderCell)(index, selectionAreas, 'row'))),
397
+ 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)),
363
398
  style: {
364
- width: (defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.rowHeaderWidth) - 4
399
+ width: defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.rowHeaderWidth
365
400
  }
366
401
  }, index + 1)), row.cells.map(function (cell, index) {
367
402
  return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({
368
403
  key: "cell_".concat(index),
369
- "aria-colindex": index
404
+ "aria-colindex": index + 1
370
405
  }, cell.getCellProps(), {
371
406
  role: "gridcell",
372
407
  style: _objectSpread(_objectSpread({}, cell.getCellProps().style), {}, {
373
- display: 'grid'
408
+ display: 'grid',
409
+ minWidth: defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.width
374
410
  })
375
411
  }), /*#__PURE__*/_react.default.createElement("button", {
412
+ id: "".concat(blockClass, "__cell--").concat(cell.row.index, "--").concat(index),
376
413
  tabIndex: -1,
377
414
  "data-row-index": cell.row.index,
378
415
  "data-column-index": index,
@@ -384,7 +421,7 @@ var DataSpreadsheetBody = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, re
384
421
  }, cell.render('Cell')));
385
422
  }));
386
423
  }
387
- }, [prepareRow, rows, defaultColumn.rowHeaderWidth, activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row, selectionAreas, handleRowHeaderClick, handleBodyCellClick, handleBodyCellHover]);
424
+ }, [prepareRow, rows, activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row, selectionAreas, handleRowHeaderClick, handleBodyCellClick, handleBodyCellHover, defaultColumn]);
388
425
  var spreadsheetBodyRef = (0, _react.useRef)();
389
426
  return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({
390
427
  ref: spreadsheetBodyRef,
@@ -394,7 +431,13 @@ var DataSpreadsheetBody = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, re
394
431
  height: 400,
395
432
  itemCount: rows.length || defaultEmptyRowCount,
396
433
  itemSize: defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.rowHeight,
397
- width: totalColumnsWidth + scrollBarSize
434
+ width: (0, _getSpreadsheetWidth.getSpreadsheetWidth)({
435
+ scrollBarSizeValue: scrollBarSize,
436
+ totalVisibleColumns: totalVisibleColumns,
437
+ defaultColumn: defaultColumn,
438
+ totalColumnsWidth: totalColumnsWidth
439
+ }),
440
+ outerRef: contentScrollRef
398
441
  }, rows !== null && rows !== void 0 && rows.length ? RenderRow : RenderEmptyRows));
399
442
  });
400
443
  exports.DataSpreadsheetBody = DataSpreadsheetBody;
@@ -496,6 +539,11 @@ DataSpreadsheetBody.propTypes = {
496
539
  */
497
540
  setActiveCellCoordinates: _propTypes.default.func,
498
541
 
542
+ /**
543
+ * Setter fn for active cell inside of selection area
544
+ */
545
+ setActiveCellInsideSelectionArea: _propTypes.default.func,
546
+
499
547
  /**
500
548
  * Setter fn for clickAndHold state value
501
549
  */
@@ -524,5 +572,11 @@ DataSpreadsheetBody.propTypes = {
524
572
  /**
525
573
  * The total columns width
526
574
  */
527
- totalColumnsWidth: _propTypes.default.number
575
+ totalColumnsWidth: _propTypes.default.number,
576
+
577
+ /**
578
+ * The total number of columns to be initially visible, additional columns will be rendered and
579
+ * visible via horizontal scrollbar
580
+ */
581
+ totalVisibleColumns: _propTypes.default.number
528
582
  };
@@ -21,15 +21,19 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
21
21
 
22
22
  var _classnames = _interopRequireDefault(require("classnames"));
23
23
 
24
- var _layout = require("@carbon/layout");
25
-
26
24
  var _settings = require("../../settings");
27
25
 
26
+ var _hooks = require("../../global/js/hooks");
27
+
28
28
  var _checkActiveHeaderCell = require("./utils/checkActiveHeaderCell");
29
29
 
30
+ var _checkSelectedHeaderCell = require("./utils/checkSelectedHeaderCell");
31
+
30
32
  var _handleHeaderCellSelection = require("./utils/handleHeaderCellSelection");
31
33
 
32
- var _hooks = require("../../global/js/hooks");
34
+ var _selectAllCells = require("./utils/selectAllCells");
35
+
36
+ var _getSpreadsheetWidth = require("./utils/getSpreadsheetWidth");
33
37
 
34
38
  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); }
35
39
 
@@ -52,7 +56,9 @@ var DataSpreadsheetHeader = /*#__PURE__*/(0, _react.forwardRef)(function (_ref,
52
56
  setCurrentMatcher = _ref.setCurrentMatcher,
53
57
  setSelectionAreas = _ref.setSelectionAreas,
54
58
  setSelectionAreaData = _ref.setSelectionAreaData,
55
- rows = _ref.rows;
59
+ rows = _ref.rows,
60
+ totalVisibleColumns = _ref.totalVisibleColumns,
61
+ updateActiveCellCoordinates = _ref.updateActiveCellCoordinates;
56
62
 
57
63
  var _useState = (0, _react.useState)(0),
58
64
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
@@ -74,7 +80,8 @@ var DataSpreadsheetHeader = /*#__PURE__*/(0, _react.forwardRef)(function (_ref,
74
80
  }, [cellSize, ref, scrollBarSize, previousState === null || previousState === void 0 ? void 0 : previousState.cellSize]);
75
81
 
76
82
  var handleColumnHeaderClick = function handleColumnHeaderClick(index) {
77
- return function () {
83
+ return function (event) {
84
+ var isHoldingCommandKey = event.metaKey || event.ctrlKey;
78
85
  (0, _handleHeaderCellSelection.handleHeaderCellSelection)({
79
86
  type: 'column',
80
87
  activeCellCoordinates: activeCellCoordinates,
@@ -85,47 +92,75 @@ var DataSpreadsheetHeader = /*#__PURE__*/(0, _react.forwardRef)(function (_ref,
85
92
  setSelectionAreas: setSelectionAreas,
86
93
  spreadsheetRef: ref,
87
94
  index: index,
88
- setSelectionAreaData: setSelectionAreaData
95
+ setSelectionAreaData: setSelectionAreaData,
96
+ isHoldingCommandKey: isHoldingCommandKey
89
97
  });
90
98
  };
91
99
  };
92
100
 
101
+ var handleSelectAllClick = function handleSelectAllClick() {
102
+ (0, _selectAllCells.selectAllCells)({
103
+ ref: ref,
104
+ setCurrentMatcher: setCurrentMatcher,
105
+ setSelectionAreas: setSelectionAreas,
106
+ rows: rows,
107
+ columns: columns,
108
+ activeCellCoordinates: activeCellCoordinates,
109
+ updateActiveCellCoordinates: updateActiveCellCoordinates
110
+ });
111
+ };
112
+
93
113
  return /*#__PURE__*/_react.default.createElement("div", {
94
- className: (0, _classnames.default)("".concat(blockClass, "__header--container"))
114
+ className: (0, _classnames.default)("".concat(blockClass, "__header--container")),
115
+ role: "rowgroup"
95
116
  }, headerGroups.map(function (headerGroup, index) {
96
117
  return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({
97
118
  key: "header_".concat(index)
98
119
  }, headerGroup.getHeaderGroupProps(), {
99
120
  style: _objectSpread(_objectSpread({}, headerGroup.getHeaderGroupProps().style), {}, {
100
- width: (0, _layout.px)(parseInt(headerGroup.getHeaderGroupProps().style.width) + scrollBarSizeValue)
121
+ width: (0, _getSpreadsheetWidth.getSpreadsheetWidth)({
122
+ type: 'header',
123
+ headerGroup: headerGroup,
124
+ scrollBarSizeValue: scrollBarSizeValue,
125
+ totalVisibleColumns: totalVisibleColumns,
126
+ defaultColumn: defaultColumn
127
+ }),
128
+ overflow: 'hidden'
101
129
  }),
102
130
  className: "".concat(blockClass, "__tr")
103
131
  }), /*#__PURE__*/_react.default.createElement("div", {
104
132
  role: "columnheader",
133
+ className: "".concat(blockClass, "__select-all-cell-container"),
105
134
  style: {
106
- width: (defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.rowHeaderWidth) - 4,
135
+ width: defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.rowHeaderWidth,
107
136
  height: defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.rowHeight
108
137
  }
109
138
  }, /*#__PURE__*/_react.default.createElement("button", {
139
+ id: "".concat(blockClass, "__cell--header--header"),
110
140
  "data-row-index": "header",
111
141
  "data-column-index": "header",
112
142
  type: "button",
113
143
  tabIndex: -1,
144
+ onClick: handleSelectAllClick,
114
145
  className: (0, _classnames.default)("".concat(blockClass, "__th"), "".concat(blockClass, "--interactive-cell-element"), "".concat(blockClass, "__th--select-all"), (0, _defineProperty2.default)({}, "".concat(blockClass, "__th--active-header"), (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column) === 'header' && (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row) === 'header'))
115
146
  }, "\xA0")), headerGroup.headers.map(function (column, index) {
147
+ var _cx2;
148
+
116
149
  return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({
117
150
  key: "column_".concat(index),
118
151
  role: "columnheader",
119
152
  className: "".concat(blockClass, "__columnheader")
120
153
  }, column.getHeaderProps()), /*#__PURE__*/_react.default.createElement("button", {
154
+ id: "".concat(blockClass, "__cell--header--").concat(index),
121
155
  "data-row-index": "header",
122
156
  "data-column-index": index,
123
157
  tabIndex: -1,
124
158
  onClick: handleColumnHeaderClick(index),
125
159
  style: {
126
- height: defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.rowHeight
160
+ height: defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.rowHeight,
161
+ width: (column === null || column === void 0 ? void 0 : column.width) || (defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.width)
127
162
  },
128
- className: (0, _classnames.default)("".concat(blockClass, "__th"), "".concat(blockClass, "--interactive-cell-element"), (0, _defineProperty2.default)({}, "".concat(blockClass, "__th--active-header"), (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column) === index || (0, _checkActiveHeaderCell.checkActiveHeaderCell)(index, selectionAreas, 'column'))),
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)),
129
164
  type: "button"
130
165
  }, column.render('Header')));
131
166
  }));
@@ -198,5 +233,16 @@ DataSpreadsheetHeader.propTypes = {
198
233
  /**
199
234
  * Setter fn for selectionAreas value
200
235
  */
201
- setSelectionAreas: _propTypes.default.func
236
+ setSelectionAreas: _propTypes.default.func,
237
+
238
+ /**
239
+ * The total number of columns to be initially visible, additional columns will be rendered and
240
+ * visible via horizontal scrollbar
241
+ */
242
+ totalVisibleColumns: _propTypes.default.number,
243
+
244
+ /**
245
+ * Function used to update the active cell coordinates
246
+ */
247
+ updateActiveCellCoordinates: _propTypes.default.func
202
248
  };
@@ -21,6 +21,12 @@ Object.defineProperty(exports, "useResetSpreadsheetFocus", {
21
21
  return _useResetSpreadsheetFocus.useResetSpreadsheetFocus;
22
22
  }
23
23
  });
24
+ Object.defineProperty(exports, "useSpreadsheetEdit", {
25
+ enumerable: true,
26
+ get: function get() {
27
+ return _useSpreadsheetEdit.useSpreadsheetEdit;
28
+ }
29
+ });
24
30
  Object.defineProperty(exports, "useSpreadsheetOutsideClick", {
25
31
  enumerable: true,
26
32
  get: function get() {
@@ -34,4 +40,6 @@ var _useMultipleKeyTracking = require("./useMultipleKeyTracking");
34
40
 
35
41
  var _useResetSpreadsheetFocus = require("./useResetSpreadsheetFocus");
36
42
 
37
- var _useSpreadsheetOutsideClick = require("./useSpreadsheetOutsideClick");
43
+ var _useSpreadsheetOutsideClick = require("./useSpreadsheetOutsideClick");
44
+
45
+ var _useSpreadsheetEdit = require("./useSpreadsheetEdit");
@@ -15,6 +15,8 @@ var _react = require("react");
15
15
 
16
16
  var _hooks = require("../../../global/js/hooks");
17
17
 
18
+ var _handleMultipleKeys = require("../utils/handleMultipleKeys");
19
+
18
20
  /**
19
21
  * Copyright IBM Corp. 2022, 2022
20
22
  *
@@ -30,15 +32,20 @@ var useMultipleKeyTracking = function useMultipleKeyTracking(_ref) {
30
32
  containerHasFocus = _ref.containerHasFocus,
31
33
  isEditing = _ref.isEditing;
32
34
 
33
- var _useState = (0, _react.useState)(hasFocus),
35
+ var _useState = (0, _react.useState)(''),
34
36
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
35
- windowFocused = _useState2[0],
36
- setWindowFocused = _useState2[1];
37
+ usingMac = _useState2[0],
38
+ setUsingMac = _useState2[1];
37
39
 
38
- var _useState3 = (0, _react.useState)([]),
40
+ var _useState3 = (0, _react.useState)(hasFocus),
39
41
  _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
40
- keysPressedList = _useState4[0],
41
- setKeysPressedList = _useState4[1];
42
+ windowFocused = _useState4[0],
43
+ setWindowFocused = _useState4[1];
44
+
45
+ var _useState5 = (0, _react.useState)([]),
46
+ _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
47
+ keysPressedList = _useState6[0],
48
+ setKeysPressedList = _useState6[1];
42
49
 
43
50
  var previousState = (0, _hooks.usePreviousValue)({
44
51
  isEditing: isEditing,
@@ -47,6 +54,14 @@ var useMultipleKeyTracking = function useMultipleKeyTracking(_ref) {
47
54
  // we need to clear out the keysPressedList
48
55
 
49
56
  (0, _react.useEffect)(function () {
57
+ var userAgentString = window.navigator.userAgent;
58
+
59
+ if (userAgentString.includes('Macintosh')) {
60
+ setUsingMac(true);
61
+ } else {
62
+ setUsingMac(false);
63
+ }
64
+
50
65
  setWindowFocused(hasFocus());
51
66
 
52
67
  var onWindowFocus = function onWindowFocus() {
@@ -72,6 +87,18 @@ var useMultipleKeyTracking = function useMultipleKeyTracking(_ref) {
72
87
  // Prevent multiple keys of the same type being added to our keysPressedList array
73
88
  if (keysPressedList.includes(event.code)) {
74
89
  return;
90
+ } // Because keyup events are lost when using the Command key
91
+ // we need to remove the previously pressed keys so that we
92
+ // do not have keys in the pressed list that should not be
93
+
94
+
95
+ if ((0, _handleMultipleKeys.includesResourceKey)(keysPressedList, usingMac) && keysPressedList.length > 1) {
96
+ var clonedKeys = (0, _toConsumableArray2.default)(keysPressedList);
97
+ var filteredClonedKeys = clonedKeys.filter(function (item) {
98
+ return item === 'MetaLeft' || item === 'MetaRight';
99
+ });
100
+ filteredClonedKeys.push(event.code);
101
+ return setKeysPressedList((0, _toConsumableArray2.default)(new Set(filteredClonedKeys)));
75
102
  }
76
103
 
77
104
  var tempKeys = (0, _toConsumableArray2.default)(keysPressedList);
@@ -113,10 +140,11 @@ var useMultipleKeyTracking = function useMultipleKeyTracking(_ref) {
113
140
  setKeysPressedList([]);
114
141
  }
115
142
  }
116
- }, [keysPressedList, containerHasFocus, ref, isEditing, previousState === null || previousState === void 0 ? void 0 : previousState.isEditing, windowFocused, previousState === null || previousState === void 0 ? void 0 : previousState.windowFocused]);
143
+ }, [keysPressedList, containerHasFocus, ref, isEditing, previousState === null || previousState === void 0 ? void 0 : previousState.isEditing, windowFocused, previousState === null || previousState === void 0 ? void 0 : previousState.windowFocused, usingMac]);
117
144
  return {
118
145
  keysPressedList: keysPressedList,
119
- windowFocused: windowFocused
146
+ windowFocused: windowFocused,
147
+ usingMac: usingMac
120
148
  };
121
149
  };
122
150
 
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.useSpreadsheetEdit = void 0;
9
+
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
+
12
+ var _react = require("react");
13
+
14
+ var _layout = require("@carbon/layout");
15
+
16
+ var _settings = require("../../../settings");
17
+
18
+ var _hooks = require("../../../global/js/hooks");
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
+ // */
26
+ var useSpreadsheetEdit = function useSpreadsheetEdit(_ref) {
27
+ var isEditing = _ref.isEditing,
28
+ rows = _ref.rows,
29
+ activeCellCoordinates = _ref.activeCellCoordinates,
30
+ activeCellRef = _ref.activeCellRef,
31
+ cellEditorRef = _ref.cellEditorRef,
32
+ cellEditorRulerRef = _ref.cellEditorRulerRef,
33
+ columns = _ref.columns,
34
+ defaultColumn = _ref.defaultColumn,
35
+ cellEditorValue = _ref.cellEditorValue,
36
+ _ref$blockClass = _ref.blockClass,
37
+ blockClass = _ref$blockClass === void 0 ? "".concat(_settings.pkg.prefix, "--data-spreadsheet") : _ref$blockClass;
38
+
39
+ var _useState = (0, _react.useState)(null),
40
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
41
+ nextIndex = _useState2[0],
42
+ setNextIndex = _useState2[1];
43
+
44
+ var previousState = (0, _hooks.usePreviousValue)({
45
+ nextIndex: nextIndex
46
+ });
47
+ (0, _react.useEffect)(function () {
48
+ if (!(previousState !== null && previousState !== void 0 && previousState.nextIndex)) {
49
+ setNextIndex(activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column);
50
+ }
51
+ }, [previousState === null || previousState === void 0 ? void 0 : previousState.nextIndex, activeCellCoordinates]);
52
+ (0, _react.useEffect)(function () {
53
+ var rulerWidth = cellEditorRulerRef.current.offsetWidth;
54
+ var cellEditorCurrentWidth = parseInt(cellEditorRef.current.style.width);
55
+
56
+ if (isEditing) {
57
+ var _rows$activeCellCoord, _cellProps$column, _cellEditorRef$curren;
58
+
59
+ var cellProps = (_rows$activeCellCoord = rows[activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row]) === null || _rows$activeCellCoord === void 0 ? void 0 : _rows$activeCellCoord.cells[activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column];
60
+ var activeCellLeftPosition = activeCellRef === null || activeCellRef === void 0 ? void 0 : activeCellRef.current.style.left;
61
+ var activeCellTopPosition = activeCellRef === null || activeCellRef === void 0 ? void 0 : activeCellRef.current.style.top;
62
+ cellEditorRef.current.style.left = activeCellLeftPosition;
63
+ cellEditorRef.current.style.top = activeCellTopPosition;
64
+ cellEditorRef.current.style.display = 'block';
65
+ cellEditorRef.current.style.height = activeCellRef === null || activeCellRef === void 0 ? void 0 : activeCellRef.current.style.height;
66
+ cellEditorRef.current.style.paddingTop = "".concat((parseInt(activeCellRef === null || activeCellRef === void 0 ? void 0 : activeCellRef.current.style.height) - 16) / 2 - 1, "px"); // calculate paddingTop based on cellHeight which could be variable depending on the cellSize prop
67
+
68
+ cellEditorRef.current.style.textAlign = (cellProps === null || cellProps === void 0 ? void 0 : (_cellProps$column = cellProps.column) === null || _cellProps$column === void 0 ? void 0 : _cellProps$column.placement) === 'right' ? 'right' : 'left';
69
+ (_cellEditorRef$curren = cellEditorRef.current) === null || _cellEditorRef$curren === void 0 ? void 0 : _cellEditorRef$curren.focus();
70
+
71
+ if (rulerWidth < cellEditorCurrentWidth) {
72
+ var _columns$nextIndex;
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
75
+
76
+ if (rulerWidth < cellEditorCurrentWidth - currentColumnWidth) {
77
+ cellEditorRef.current.style.width = (0, _layout.px)(parseInt(cellEditorRef.current.style.width) - currentColumnWidth);
78
+ setNextIndex(function (prev) {
79
+ if (prev === 0) {
80
+ return prev;
81
+ }
82
+
83
+ return prev - 1;
84
+ });
85
+ } // Decrease cell editor width by increment of current column width
86
+
87
+ }
88
+
89
+ if (rulerWidth >= cellEditorCurrentWidth) {
90
+ var _columns;
91
+
92
+ setNextIndex(function (prev) {
93
+ if (prev === columns.length - 1) {
94
+ return prev;
95
+ }
96
+
97
+ return prev + 1;
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);
101
+ var startingRowPosition = activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row;
102
+ var totalRows = rows.length;
103
+ var totalCellEditorMaxHeight = (totalRows - startingRowPosition) * defaultColumn.rowHeight;
104
+ cellEditorRef.current.style.maxHeight = (0, _layout.px)(totalCellEditorMaxHeight);
105
+ cellEditorRef.current.style.width = (0, _layout.px)(nextColumnWidth + cellEditorCurrentWidth);
106
+ cellEditorRef.current.style.height = (0, _layout.px)(cellEditorRef.current.scrollHeight); // adds dynamic height to cell editor
107
+ // Cell editor has reached max height, we need to add the scrolling back.
108
+ // We also need to subtract 1 to account for the fact that the cell editor
109
+ // is placed one pixel below the cell being edited to account for the border
110
+
111
+ if (cellEditorRef.current.clientHeight === totalCellEditorMaxHeight - 1) {
112
+ cellEditorRef.current.style.overflow = 'auto';
113
+ } else {
114
+ cellEditorRef.current.style.overflow = 'hidden';
115
+ }
116
+ }
117
+ }
118
+
119
+ if (!isEditing) {
120
+ cellEditorRef.current.style.overflow = 'hidden';
121
+ cellEditorRef.current.style.display = 'none';
122
+ cellEditorRef.current.blur();
123
+ activeCellRef.current.focus();
124
+ setNextIndex(activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column);
125
+ }
126
+ }, [isEditing, activeCellCoordinates, rows, cellEditorValue, columns.length, defaultColumn, activeCellRef, cellEditorRef, cellEditorRulerRef, columns, blockClass, previousState === null || previousState === void 0 ? void 0 : previousState.cellEditorValue, nextIndex]);
127
+ };
128
+
129
+ exports.useSpreadsheetEdit = useSpreadsheetEdit;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.checkSelectedHeaderCell = void 0;
7
+
8
+ var _deepCloneObject = require("../../../global/js/utils/deepCloneObject");
9
+
10
+ /**
11
+ * Copyright IBM Corp. 2022, 2022
12
+ *
13
+ * This source code is licensed under the Apache-2.0 license found in the
14
+ * LICENSE file in the root directory of this source tree.
15
+ */
16
+ var checkSelectedHeaderCell = function checkSelectedHeaderCell(headerIndex, selectionAreas, headerType) {
17
+ var areasCloned = (0, _deepCloneObject.deepCloneObject)(selectionAreas);
18
+ var isSelectedHeader = areasCloned.some(function (area) {
19
+ var _area$header, _area$header2;
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);
22
+ });
23
+ return isSelectedHeader;
24
+ };
25
+
26
+ exports.checkSelectedHeaderCell = checkSelectedHeaderCell;