@carbon/ibm-products 2.33.0 → 2.34.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (127) hide show
  1. package/css/index-full-carbon.css +303 -11
  2. package/css/index-full-carbon.css.map +1 -1
  3. package/css/index-full-carbon.min.css +1 -1
  4. package/css/index-full-carbon.min.css.map +1 -1
  5. package/css/index-without-carbon.css +303 -11
  6. package/css/index-without-carbon.css.map +1 -1
  7. package/css/index-without-carbon.min.css +1 -1
  8. package/css/index-without-carbon.min.css.map +1 -1
  9. package/css/index.css +303 -11
  10. package/css/index.css.map +1 -1
  11. package/css/index.min.css +1 -1
  12. package/css/index.min.css.map +1 -1
  13. package/es/components/CreateSidePanel/CreateSidePanel.d.ts +81 -2
  14. package/es/components/CreateSidePanel/CreateSidePanel.js +5 -2
  15. package/es/components/DataSpreadsheet/DataSpreadsheet.js +5 -117
  16. package/es/components/DataSpreadsheet/DataSpreadsheetBody.js +12 -111
  17. package/es/components/DataSpreadsheet/utils/commonEventHandlers.d.ts +4 -0
  18. package/es/components/DataSpreadsheet/utils/commonEventHandlers.js +304 -0
  19. package/es/components/Datagrid/Datagrid/DatagridContent.js +2 -1
  20. package/es/components/Datagrid/Datagrid/DatagridEmptyBody.js +4 -1
  21. package/es/components/Datagrid/Datagrid/DatagridRefBody.js +3 -1
  22. package/es/components/Datagrid/Datagrid/DatagridSimpleBody.js +4 -1
  23. package/es/components/Datagrid/Datagrid/DatagridVirtualBody.js +6 -2
  24. package/es/components/Datagrid/Datagrid/addons/CustomizeColumns/Columns.d.ts +1 -1
  25. package/es/components/Datagrid/Datagrid/addons/InlineEdit/InlineEditCell/InlineEditCell.js +4 -0
  26. package/es/components/Datagrid/Datagrid/addons/InlineEdit/handleGridKeyPress.d.ts +2 -1
  27. package/es/components/Datagrid/Datagrid/addons/InlineEdit/handleGridKeyPress.js +4 -3
  28. package/es/components/EditSidePanel/EditSidePanel.d.ts +92 -2
  29. package/es/components/EditSidePanel/EditSidePanel.js +8 -10
  30. package/es/components/FilterPanel/FilterPanelAccordion/FilterPanelAccordion.d.ts +5 -0
  31. package/es/components/FilterPanel/FilterPanelAccordion/FilterPanelAccordion.js +83 -0
  32. package/es/components/FilterPanel/FilterPanelAccordionItem/FilterPanelAccordionItem.d.ts +5 -0
  33. package/es/components/FilterPanel/FilterPanelAccordionItem/FilterPanelAccordionItem.js +94 -0
  34. package/es/components/FilterPanel/FilterPanelCheckbox/FilterPanelCheckbox.js +3 -1
  35. package/es/components/FilterPanel/FilterPanelCheckbox/index.d.ts +1 -0
  36. package/es/components/FilterPanel/FilterPanelCheckboxWithOverflow/FilterPanelCheckboxWithOverflow.d.ts +10 -0
  37. package/es/components/FilterPanel/FilterPanelCheckboxWithOverflow/FilterPanelCheckboxWithOverflow.js +157 -0
  38. package/es/components/FilterPanel/FilterPanelGroup/FilterPanelGroup.d.ts +5 -0
  39. package/es/components/FilterPanel/FilterPanelGroup/FilterPanelGroup.js +72 -0
  40. package/es/components/FilterPanel/FilterPanelLabel/FilterPanelLabel.js +2 -2
  41. package/es/components/FilterPanel/index.d.ts +4 -0
  42. package/es/components/OptionsTile/OptionsTile.d.ts +77 -3
  43. package/es/components/OptionsTile/OptionsTile.js +9 -20
  44. package/es/components/RemoveModal/RemoveModal.d.ts +81 -7
  45. package/es/components/RemoveModal/RemoveModal.js +1 -0
  46. package/es/components/ScrollGradient/ScrollGradient.d.ts +5 -0
  47. package/es/components/ScrollGradient/ScrollGradient.js +156 -0
  48. package/es/components/ScrollGradient/constants.d.ts +15 -0
  49. package/es/components/ScrollGradient/constants.js +121 -0
  50. package/es/components/ScrollGradient/index.d.ts +1 -0
  51. package/es/components/SidePanel/SidePanel.d.ts +144 -2
  52. package/es/components/SidePanel/SidePanel.js +57 -48
  53. package/es/components/StatusIcon/StatusIcon.d.ts +34 -2
  54. package/es/components/StatusIcon/StatusIcon.js +97 -95
  55. package/es/components/TruncatedList/TruncatedList.js +5 -3
  56. package/es/components/UserAvatar/UserAvatar.js +3 -2
  57. package/es/components/index.d.ts +2 -1
  58. package/es/global/js/package-settings.d.ts +5 -0
  59. package/es/global/js/package-settings.js +5 -0
  60. package/es/index.js +5 -0
  61. package/es/settings.d.ts +5 -0
  62. package/lib/components/CreateSidePanel/CreateSidePanel.d.ts +81 -2
  63. package/lib/components/CreateSidePanel/CreateSidePanel.js +5 -2
  64. package/lib/components/DataSpreadsheet/DataSpreadsheet.js +5 -117
  65. package/lib/components/DataSpreadsheet/DataSpreadsheetBody.js +12 -111
  66. package/lib/components/DataSpreadsheet/utils/commonEventHandlers.d.ts +4 -0
  67. package/lib/components/DataSpreadsheet/utils/commonEventHandlers.js +311 -0
  68. package/lib/components/Datagrid/Datagrid/DatagridContent.js +2 -1
  69. package/lib/components/Datagrid/Datagrid/DatagridEmptyBody.js +4 -1
  70. package/lib/components/Datagrid/Datagrid/DatagridRefBody.js +3 -1
  71. package/lib/components/Datagrid/Datagrid/DatagridSimpleBody.js +4 -1
  72. package/lib/components/Datagrid/Datagrid/DatagridVirtualBody.js +5 -1
  73. package/lib/components/Datagrid/Datagrid/addons/CustomizeColumns/Columns.d.ts +1 -1
  74. package/lib/components/Datagrid/Datagrid/addons/InlineEdit/InlineEditCell/InlineEditCell.js +4 -0
  75. package/lib/components/Datagrid/Datagrid/addons/InlineEdit/handleGridKeyPress.d.ts +2 -1
  76. package/lib/components/Datagrid/Datagrid/addons/InlineEdit/handleGridKeyPress.js +4 -3
  77. package/lib/components/EditSidePanel/EditSidePanel.d.ts +92 -2
  78. package/lib/components/EditSidePanel/EditSidePanel.js +8 -10
  79. package/lib/components/FilterPanel/FilterPanelAccordion/FilterPanelAccordion.d.ts +5 -0
  80. package/lib/components/FilterPanel/FilterPanelAccordion/FilterPanelAccordion.js +90 -0
  81. package/lib/components/FilterPanel/FilterPanelAccordionItem/FilterPanelAccordionItem.d.ts +5 -0
  82. package/lib/components/FilterPanel/FilterPanelAccordionItem/FilterPanelAccordionItem.js +101 -0
  83. package/lib/components/FilterPanel/FilterPanelCheckbox/FilterPanelCheckbox.js +3 -1
  84. package/lib/components/FilterPanel/FilterPanelCheckbox/index.d.ts +1 -0
  85. package/lib/components/FilterPanel/FilterPanelCheckboxWithOverflow/FilterPanelCheckboxWithOverflow.d.ts +10 -0
  86. package/lib/components/FilterPanel/FilterPanelCheckboxWithOverflow/FilterPanelCheckboxWithOverflow.js +164 -0
  87. package/lib/components/FilterPanel/FilterPanelGroup/FilterPanelGroup.d.ts +5 -0
  88. package/lib/components/FilterPanel/FilterPanelGroup/FilterPanelGroup.js +79 -0
  89. package/lib/components/FilterPanel/FilterPanelLabel/FilterPanelLabel.js +2 -2
  90. package/lib/components/FilterPanel/index.d.ts +4 -0
  91. package/lib/components/OptionsTile/OptionsTile.d.ts +77 -3
  92. package/lib/components/OptionsTile/OptionsTile.js +9 -20
  93. package/lib/components/RemoveModal/RemoveModal.d.ts +81 -7
  94. package/lib/components/RemoveModal/RemoveModal.js +1 -0
  95. package/lib/components/ScrollGradient/ScrollGradient.d.ts +5 -0
  96. package/lib/components/ScrollGradient/ScrollGradient.js +163 -0
  97. package/lib/components/ScrollGradient/constants.d.ts +15 -0
  98. package/lib/components/ScrollGradient/constants.js +128 -0
  99. package/lib/components/ScrollGradient/index.d.ts +1 -0
  100. package/lib/components/SidePanel/SidePanel.d.ts +144 -2
  101. package/lib/components/SidePanel/SidePanel.js +57 -48
  102. package/lib/components/StatusIcon/StatusIcon.d.ts +34 -2
  103. package/lib/components/StatusIcon/StatusIcon.js +97 -95
  104. package/lib/components/TruncatedList/TruncatedList.js +5 -3
  105. package/lib/components/UserAvatar/UserAvatar.js +3 -2
  106. package/lib/components/index.d.ts +2 -1
  107. package/lib/global/js/package-settings.d.ts +5 -0
  108. package/lib/global/js/package-settings.js +5 -0
  109. package/lib/index.js +25 -0
  110. package/lib/settings.d.ts +5 -0
  111. package/package.json +3 -3
  112. package/scss/components/FilterPanel/_filter-panel-accordion-item.scss +56 -0
  113. package/scss/components/FilterPanel/_filter-panel-accordion.scss +6 -0
  114. package/scss/components/FilterPanel/_filter-panel-checkbox-with-overflow.scss +62 -0
  115. package/scss/components/FilterPanel/_filter-panel-checkbox.scss +25 -3
  116. package/scss/components/FilterPanel/_filter-panel-group.scss +39 -0
  117. package/scss/components/FilterPanel/_filter-panel-label.scss +0 -8
  118. package/scss/components/FilterPanel/_filter-panel.scss +2 -0
  119. package/scss/components/FilterPanel/_index-with-carbon.scss +4 -0
  120. package/scss/components/FilterPanel/_index.scss +4 -0
  121. package/scss/components/ScrollGradient/_carbon-imports.scss +9 -0
  122. package/scss/components/ScrollGradient/_index-with-carbon.scss +9 -0
  123. package/scss/components/ScrollGradient/_index.scss +8 -0
  124. package/scss/components/ScrollGradient/_scroll-gradient.scss +102 -0
  125. package/scss/components/UserAvatar/_user-avatar.scss +37 -4
  126. package/scss/components/_index-with-carbon.scss +1 -0
  127. package/scss/components/_index.scss +1 -0
@@ -23,14 +23,11 @@ var uuidv4 = require('../../global/js/utils/uuidv4.js');
23
23
  var deepCloneObject = require('../../global/js/utils/deepCloneObject.js');
24
24
  var createActiveCellFn = require('./utils/createActiveCellFn.js');
25
25
  var getCellSize = require('./utils/getCellSize.js');
26
- var handleMultipleKeys = require('./utils/handleMultipleKeys.js');
27
26
  var handleHeaderCellSelection = require('./utils/handleHeaderCellSelection.js');
28
27
  var removeCellSelections = require('./utils/removeCellSelections.js');
29
28
  var selectAllCells = require('./utils/selectAllCells.js');
30
29
  var handleEditSubmit = require('./utils/handleEditSubmit.js');
31
- var handleActiveCellInSelectionEnter = require('./utils/handleActiveCellInSelectionEnter.js');
32
- var handleActiveCellInSelectionTab = require('./utils/handleActiveCellInSelectionTab.js');
33
- var handleCellDeletion = require('./utils/handleCellDeletion.js');
30
+ var commonEventHandlers = require('./utils/commonEventHandlers.js');
34
31
  var useActiveElement = require('../../global/js/hooks/useActiveElement.js');
35
32
  var usePreviousValue = require('../../global/js/hooks/usePreviousValue.js');
36
33
  var useMultipleKeyTracking = require('./hooks/useMultipleKeyTracking.js');
@@ -45,7 +42,6 @@ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
45
42
  var cx__default = /*#__PURE__*/_interopDefaultLegacy(cx);
46
43
 
47
44
  var _excluded = ["cellSize", "className", "columns", "data", "defaultEmptyRowCount", "onDataUpdate", "id", "onActiveCellChange", "onSelectionAreaChange", "selectAllAriaLabel", "spreadsheetAriaLabel", "theme", "totalVisibleColumns"];
48
- // cspell:words rowcount colcount
49
45
 
50
46
  // The block part of our conventional BEM class names (blockClass__E--M).
51
47
  var blockClass = "".concat(settings.pkg.prefix, "--data-spreadsheet");
@@ -413,117 +409,8 @@ exports.DataSpreadsheet = /*#__PURE__*/React__default["default"].forwardRef(func
413
409
  });
414
410
  }
415
411
  }, [handleInitialArrowPress, updateActiveCellCoordinates, activeCellCoordinates, columns, rows]);
416
- var handleKeyPress = React.useCallback(function (event) {
417
- var key = event.key;
418
- // Command keys need to be returned as there is default browser behavior with these keys
419
- // Needs to be returned in editing mode
420
- if (checkForReturnCondition(key)) {
421
- return;
422
- }
423
-
424
- // Clear out all cell selection areas if user uses any arrow key, except if the shift key is being held
425
- if (['ArrowLeft', 'ArrowUp', 'ArrowRight', 'ArrowDown'].indexOf(key) > -1) {
426
- if (selectionAreas !== null && selectionAreas !== void 0 && selectionAreas.length && keysPressedList.length < 2 && !handleMultipleKeys.includesShift(keysPressedList)) {
427
- setSelectionAreas([]);
428
- setSelectionAreaData([]);
429
- removeCellSelections.removeCellSelections({
430
- spreadsheetRef: spreadsheetRef
431
- });
432
- }
433
- }
434
- if ((keysPressedList === null || keysPressedList === void 0 ? void 0 : keysPressedList.length) > 1) {
435
- handleMultipleKeys.handleMultipleKeys({
436
- activeCellCoordinates: activeCellCoordinates,
437
- event: event,
438
- keysPressedList: keysPressedList,
439
- selectionAreas: selectionAreas,
440
- currentMatcher: currentMatcher,
441
- rows: rows,
442
- setSelectionAreas: setSelectionAreas,
443
- columns: columns,
444
- updateActiveCellCoordinates: updateActiveCellCoordinates,
445
- spreadsheetRef: spreadsheetRef,
446
- removeCellSelections: removeCellSelections.removeCellSelections,
447
- blockClass: blockClass,
448
- setCurrentMatcher: setCurrentMatcher,
449
- usingMac: usingMac
450
- });
451
- }
452
-
453
- // Allow arrow key navigation if there are less than two activeKeys OR
454
- // if one of the activeCellCoordinates is in a header position
455
- // Prevent arrow keys, home key, and end key from scrolling the page when the data spreadsheet container has focus
456
-
457
- if (keysPressedList.length < 2 && !handleMultipleKeys.includesShift(keysPressedList) || activeCellCoordinates.row === 'header' || activeCellCoordinates.column === 'header') {
458
- switch (key) {
459
- case 'Backspace':
460
- case 'Delete':
461
- {
462
- var deleteParams = {
463
- selectionAreas: selectionAreas,
464
- currentMatcher: currentMatcher,
465
- rows: rows,
466
- setActiveCellContent: setActiveCellContent,
467
- updateData: updateData,
468
- activeCellCoordinates: activeCellCoordinates
469
- };
470
- handleCellDeletion.handleCellDeletion(deleteParams);
471
- break;
472
- }
473
- // Enter
474
- case 'Enter':
475
- {
476
- handleActiveCellInSelectionEnter.handleActiveCellInSelectionEnter({
477
- activeCellInsideSelectionArea: activeCellInsideSelectionArea,
478
- activeCellCoordinates: activeCellCoordinates,
479
- activeCellRef: activeCellRef,
480
- selectionAreas: selectionAreas,
481
- updateActiveCellCoordinates: updateActiveCellCoordinates
482
- });
483
- break;
484
- }
485
- // HOME
486
- case 'Home':
487
- case 'End':
488
- {
489
- event.preventDefault();
490
- if (handleMultipleKeys.includesResourceKey(keysPressedList, usingMac)) {
491
- return;
492
- }
493
- handleHomeEndKey({
494
- type: key
495
- });
496
- break;
497
- }
498
- // Tab
499
- case 'Tab':
500
- {
501
- if (activeCellInsideSelectionArea) {
502
- event.preventDefault();
503
- return handleActiveCellInSelectionTab.handleActiveCellInSelectionTab({
504
- activeCellInsideSelectionArea: activeCellInsideSelectionArea,
505
- activeCellCoordinates: activeCellCoordinates,
506
- activeCellRef: activeCellRef,
507
- selectionAreas: selectionAreas,
508
- updateActiveCellCoordinates: updateActiveCellCoordinates
509
- });
510
- }
511
- setSelectionAreas([]);
512
- removeActiveCell();
513
- removeCellEditor();
514
- setContainerHasFocus(false);
515
- setActiveCellCoordinates(null);
516
- break;
517
- }
518
- case 'ArrowLeft':
519
- case 'ArrowUp':
520
- case 'ArrowRight':
521
- case 'ArrowDown':
522
- {
523
- handleArrowKeyPress(key);
524
- }
525
- }
526
- }
412
+ var handleKeyPressEvent = React.useCallback(function (event) {
413
+ commonEventHandlers.handleKeyPress(event, activeCellInsideSelectionArea, updateActiveCellCoordinates, activeCellCoordinates, removeActiveCell, columns, rows, spreadsheetRef, currentMatcher, removeCellEditor, selectionAreas, handleHomeEndKey, keysPressedList, usingMac, updateData, checkForReturnCondition, handleArrowKeyPress, setSelectionAreas, setSelectionAreaData, setCurrentMatcher, activeCellRef, setActiveCellCoordinates, setContainerHasFocus, setActiveCellContent);
527
414
  }, [activeCellInsideSelectionArea, updateActiveCellCoordinates, activeCellCoordinates, removeActiveCell, columns, rows, spreadsheetRef, currentMatcher, removeCellEditor, selectionAreas, handleHomeEndKey, keysPressedList, usingMac, updateData, checkForReturnCondition, handleArrowKeyPress]);
528
415
  var startEditMode = function startEditMode() {
529
416
  setIsEditing(true);
@@ -687,6 +574,7 @@ exports.DataSpreadsheet = /*#__PURE__*/React__default["default"].forwardRef(func
687
574
  var handleActiveCellMouseEnter = React.useCallback(function () {
688
575
  handleActiveCellMouseEnterCallback(selectionAreas, clickAndHoldActive);
689
576
  }, [clickAndHoldActive, selectionAreas, handleActiveCellMouseEnterCallback]);
577
+ // cspell:words rowcount colcount
690
578
  return /*#__PURE__*/React__default["default"].createElement("div", _rollupPluginBabelHelpers["extends"]({}, rest, getTableProps(), devtools.getDevtoolsProps(componentName), {
691
579
  className: cx__default["default"](blockClass, className, "".concat(blockClass, "--interactive-cell-element"), _rollupPluginBabelHelpers.defineProperty(_rollupPluginBabelHelpers.defineProperty({}, "".concat(blockClass, "__container-has-focus"), containerHasFocus), "".concat(blockClass, "__").concat(theme), theme === 'dark')),
692
580
  ref: spreadsheetRef,
@@ -695,7 +583,7 @@ exports.DataSpreadsheet = /*#__PURE__*/React__default["default"].forwardRef(func
695
583
  "aria-rowcount": (rows === null || rows === void 0 ? void 0 : rows.length) || 0,
696
584
  "aria-colcount": (columns === null || columns === void 0 ? void 0 : columns.length) || 0,
697
585
  "aria-label": spreadsheetAriaLabel,
698
- onKeyDown: handleKeyPress,
586
+ onKeyDown: handleKeyPressEvent,
699
587
  onFocus: function onFocus() {
700
588
  return setContainerHasFocus(true);
701
589
  }
@@ -17,14 +17,12 @@ var cx = require('classnames');
17
17
  var layout = require('@carbon/layout');
18
18
  var settings = require('../../settings.js');
19
19
  var deepCloneObject = require('../../global/js/utils/deepCloneObject.js');
20
- var uuidv4 = require('../../global/js/utils/uuidv4.js');
21
20
  var removeCellSelections = require('./utils/removeCellSelections.js');
22
21
  var createCellSelectionArea = require('./utils/createCellSelectionArea.js');
23
22
  var checkActiveHeaderCell = require('./utils/checkActiveHeaderCell.js');
24
23
  var checkSelectedHeaderCell = require('./utils/checkSelectedHeaderCell.js');
25
- var handleHeaderCellSelection = require('./utils/handleHeaderCellSelection.js');
26
24
  var getSpreadsheetWidth = require('./utils/getSpreadsheetWidth.js');
27
- var checkForHoldingKey = require('./utils/checkForHoldingKey.js');
25
+ var commonEventHandlers = require('./utils/commonEventHandlers.js');
28
26
  var usePreviousValue = require('../../global/js/hooks/usePreviousValue.js');
29
27
  var useSpreadsheetMouseUp = require('./hooks/useSpreadsheetMouseUp.js');
30
28
 
@@ -250,71 +248,10 @@ var DataSpreadsheetBody = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
250
248
 
251
249
  // onClick fn for each cell in the data spreadsheet body,
252
250
  // adds the active cell highlight
253
- var handleBodyCellClick = React.useCallback(function (cell, columnIndex) {
254
- return function (event) {
255
- event.preventDefault();
256
- var closestBodyCell = event.target.closest(".".concat(blockClass, "__body--td"));
257
- var isValidSelectionAreaStart = closestBodyCell.classList.contains("".concat(blockClass, "__body--td"));
258
- setValidStartingPoint(isValidSelectionAreaStart);
259
- var isHoldingCommandKey = checkForHoldingKey.checkForHoldingKey(event, 'cmd');
260
- var isHoldingShiftKey = checkForHoldingKey.checkForHoldingKey(event, 'shiftKey');
261
- setContainerHasFocus(true);
262
- var activeCoordinates = {
263
- row: cell.row.index,
264
- column: columnIndex
265
- };
266
- var tempMatcher = uuidv4["default"]();
267
- setClickAndHoldActive(true);
268
251
 
269
- // prevent multiple selections unless cmd key is held
270
- // meaning that selectionAreas should only have one item by default
271
- if (isHoldingCommandKey) {
272
- var activeCellElement = ref.current.querySelector(".".concat(blockClass, "__active-cell--highlight"));
273
- activeCellElement.setAttribute('data-selection-id', tempMatcher);
274
- setActiveCellInsideSelectionArea(true);
275
- setActiveCellCoordinates(activeCoordinates);
276
- setCurrentMatcher(tempMatcher);
277
- setSelectionAreas(function (prev) {
278
- return [].concat(_rollupPluginBabelHelpers.toConsumableArray(prev), [{
279
- point1: activeCoordinates,
280
- matcher: tempMatcher
281
- }]);
282
- });
283
- } else if (isHoldingShiftKey) {
284
- setContainerHasFocus(true);
285
- var selectionAreaClone = deepCloneObject.deepCloneObject(selectionAreas);
286
- var indexOfItemToUpdate = selectionAreaClone.findIndex(function (item) {
287
- return item.matcher === currentMatcher;
288
- });
289
- if (indexOfItemToUpdate === -1) {
290
- // There is always a selectionArea with a point1 object that updates
291
- // whenever the activeCellCoordinates update, we should always be able
292
- // to find an index, but if we do not for some reason we should return
293
- // at this point.
294
- return;
295
- } else {
296
- // Update the selectionArea that was found, do not update currentMatcher
297
- selectionAreaClone[indexOfItemToUpdate].point1 = activeCellCoordinates;
298
- selectionAreaClone[indexOfItemToUpdate].point2 = activeCoordinates;
299
- selectionAreaClone[indexOfItemToUpdate].areaCreated = false;
300
- selectionAreaClone[indexOfItemToUpdate].matcher = currentMatcher;
301
- setSelectionAreas(selectionAreaClone);
302
- }
303
- } else {
304
- activeCellRef.current.style.display = 'none';
305
- setActiveCellInsideSelectionArea(false);
306
- setActiveCellCoordinates(activeCoordinates);
307
- // remove all previous cell selections
308
- removeCellSelections.removeCellSelections({
309
- spreadsheetRef: ref
310
- });
311
- setSelectionAreas([{
312
- point1: activeCoordinates,
313
- matcher: tempMatcher
314
- }]);
315
- setCurrentMatcher(tempMatcher);
316
- setSelectionAreaData([]);
317
- }
252
+ var handleBodyCellClickEvent = React.useCallback(function (cell, columnIndex) {
253
+ return function (event) {
254
+ commonEventHandlers.handleBodyCellClick(cell, columnIndex, event, currentMatcher, activeCellCoordinates, selectionAreas, setActiveCellCoordinates, setSelectionAreas, setContainerHasFocus, setClickAndHoldActive, setCurrentMatcher, ref, setSelectionAreaData, setActiveCellInsideSelectionArea, activeCellRef, setValidStartingPoint);
318
255
  };
319
256
  }, [currentMatcher, activeCellCoordinates, selectionAreas, setActiveCellCoordinates, setSelectionAreas, setContainerHasFocus, setClickAndHoldActive, setCurrentMatcher, ref, setSelectionAreaData, setActiveCellInsideSelectionArea, activeCellRef]);
320
257
  var handleBodyScroll = function handleBodyScroll() {
@@ -330,50 +267,14 @@ var DataSpreadsheetBody = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
330
267
  contentScrollElementRef.removeEventListener('scroll', handleBodyScroll);
331
268
  };
332
269
  });
333
- var handleBodyCellHover = React.useCallback(function (cell, columnIndex) {
270
+ var handleBodyCellHoverEvent = React.useCallback(function (cell, columnIndex) {
334
271
  return function () {
335
- if (clickAndHoldActive) {
336
- var cellCoordinates = {
337
- row: cell.row.index,
338
- column: columnIndex
339
- };
340
- setSelectionAreas(function (prev) {
341
- var _selectionAreaClone$i, _selectionAreaClone$i2;
342
- var selectionAreaClone = deepCloneObject.deepCloneObject(prev);
343
- var indexOfItemToUpdate = selectionAreaClone.findIndex(function (item) {
344
- return item.matcher === currentMatcher;
345
- });
346
- // No items in the array match up with the currentMatcher value
347
- if (indexOfItemToUpdate === -1) {
348
- return prev;
349
- }
350
- // Do not update state if you're still hovering on the same cell
351
- if (((_selectionAreaClone$i = selectionAreaClone[indexOfItemToUpdate].point2) === null || _selectionAreaClone$i === void 0 ? void 0 : _selectionAreaClone$i.row) === cellCoordinates.row && ((_selectionAreaClone$i2 = selectionAreaClone[indexOfItemToUpdate].point2) === null || _selectionAreaClone$i2 === void 0 ? void 0 : _selectionAreaClone$i2.column) === cellCoordinates.column) {
352
- return prev;
353
- }
354
- selectionAreaClone[indexOfItemToUpdate].point2 = cellCoordinates;
355
- selectionAreaClone[indexOfItemToUpdate].areaCreated = false;
356
- return selectionAreaClone;
357
- });
358
- }
272
+ commonEventHandlers.handleBodyCellHover(cell, columnIndex, clickAndHoldActive, currentMatcher, setSelectionAreas);
359
273
  };
360
274
  }, [clickAndHoldActive, currentMatcher, setSelectionAreas]);
361
- var handleRowHeaderClick = React.useCallback(function (index) {
275
+ var handleRowHeaderClickEvent = React.useCallback(function (index) {
362
276
  return function (event) {
363
- var isHoldingCommandKey = checkForHoldingKey.checkForHoldingKey(event, 'cmd');
364
- handleHeaderCellSelection.handleHeaderCellSelection({
365
- type: 'row',
366
- activeCellCoordinates: activeCellCoordinates,
367
- rows: rows,
368
- columns: columns,
369
- setActiveCellCoordinates: setActiveCellCoordinates,
370
- setCurrentMatcher: setCurrentMatcher,
371
- setSelectionAreas: setSelectionAreas,
372
- spreadsheetRef: ref,
373
- index: index,
374
- setSelectionAreaData: setSelectionAreaData,
375
- isHoldingCommandKey: isHoldingCommandKey
376
- });
277
+ commonEventHandlers.handleRowHeaderClick(index, event, columns, ref, setSelectionAreas, setCurrentMatcher, setActiveCellCoordinates, activeCellCoordinates, rows, setSelectionAreaData);
377
278
  };
378
279
  }, [columns, ref, setSelectionAreas, setCurrentMatcher, setActiveCellCoordinates, activeCellCoordinates, rows, setSelectionAreaData]);
379
280
 
@@ -423,7 +324,7 @@ var DataSpreadsheetBody = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
423
324
  "data-row-index": index,
424
325
  "data-column-index": "header",
425
326
  type: "button",
426
- onClick: handleRowHeaderClick(index),
327
+ onClick: handleRowHeaderClickEvent(index),
427
328
  className: cx__default["default"]("".concat(blockClass, "__td"), "".concat(blockClass, "__td-th"), "".concat(blockClass, "--interactive-cell-element"), _rollupPluginBabelHelpers.defineProperty(_rollupPluginBabelHelpers.defineProperty({}, "".concat(blockClass, "__td-th--active-header"), (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row) === index || checkActiveHeaderCell.checkActiveHeaderCell(index, selectionAreas, 'row')), "".concat(blockClass, "__td-th--selected-header"), checkSelectedHeaderCell.checkSelectedHeaderCell(index, selectionAreas, 'row', columns))),
428
329
  style: {
429
330
  width: defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.rowHeaderWidth
@@ -445,14 +346,14 @@ var DataSpreadsheetBody = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
445
346
  "data-row-index": cell.row.index,
446
347
  "data-column-index": index,
447
348
  className: cx__default["default"]("".concat(blockClass, "__td"), "".concat(blockClass, "__body--td"), "".concat(blockClass, "--interactive-cell-element")),
448
- onMouseDown: handleBodyCellClick(cell, index),
449
- onMouseOver: handleBodyCellHover(cell, index),
349
+ onMouseDown: handleBodyCellClickEvent(cell, index),
350
+ onMouseOver: handleBodyCellHoverEvent(cell, index),
450
351
  onFocus: function onFocus() {},
451
352
  type: "button"
452
353
  }, cell.render('Cell')));
453
354
  }));
454
355
  }
455
- }, [prepareRow, rows, activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row, selectionAreas, handleRowHeaderClick, handleBodyCellClick, handleBodyCellHover, defaultColumn, columns]);
356
+ }, [prepareRow, rows, activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row, selectionAreas, handleRowHeaderClickEvent, handleBodyCellClickEvent, handleBodyCellHoverEvent, defaultColumn, columns]);
456
357
  var spreadsheetBodyRef = React.useRef();
457
358
  return /*#__PURE__*/React__default["default"].createElement("div", _rollupPluginBabelHelpers["extends"]({
458
359
  ref: spreadsheetBodyRef,
@@ -0,0 +1,4 @@
1
+ export function handleBodyCellClick(cell: any, columnIndex: any, event: any, ...rest: any[]): void;
2
+ export function handleBodyCellHover(cell: any, columnIndex: any, ...rest: any[]): void;
3
+ export function handleRowHeaderClick(index: any, event: any, ...rest: any[]): void;
4
+ export function handleKeyPress(event: any, ...rest: any[]): any;
@@ -0,0 +1,311 @@
1
+ /**
2
+ * Copyright IBM Corp. 2020, 2024
3
+ *
4
+ * This source code is licensed under the Apache-2.0 license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ */
7
+
8
+ 'use strict';
9
+
10
+ Object.defineProperty(exports, '__esModule', { value: true });
11
+
12
+ var _rollupPluginBabelHelpers = require('../../../_virtual/_rollupPluginBabelHelpers.js');
13
+ var settings = require('../../../settings.js');
14
+ var checkForHoldingKey = require('./checkForHoldingKey.js');
15
+ var deepCloneObject = require('../../../global/js/utils/deepCloneObject.js');
16
+ var uuidv4 = require('../../../global/js/utils/uuidv4.js');
17
+ var removeCellSelections = require('./removeCellSelections.js');
18
+ var handleHeaderCellSelection = require('./handleHeaderCellSelection.js');
19
+ var handleMultipleKeys = require('./handleMultipleKeys.js');
20
+ var handleActiveCellInSelectionEnter = require('./handleActiveCellInSelectionEnter.js');
21
+ var handleActiveCellInSelectionTab = require('./handleActiveCellInSelectionTab.js');
22
+ var handleCellDeletion = require('./handleCellDeletion.js');
23
+
24
+ var blockClass = "".concat(settings.pkg.prefix, "--data-spreadsheet");
25
+
26
+ // onClick fn for each cell in the data spreadsheet body,
27
+ // adds the active cell highlight
28
+
29
+ var handleBodyCellClick = function handleBodyCellClick(cell, columnIndex, event) {
30
+ for (var _len = arguments.length, rest = new Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
31
+ rest[_key - 3] = arguments[_key];
32
+ }
33
+ var currentMatcher = rest[0],
34
+ activeCellCoordinates = rest[1],
35
+ selectionAreas = rest[2],
36
+ setActiveCellCoordinates = rest[3],
37
+ setSelectionAreas = rest[4],
38
+ setContainerHasFocus = rest[5],
39
+ setClickAndHoldActive = rest[6],
40
+ setCurrentMatcher = rest[7],
41
+ ref = rest[8],
42
+ setSelectionAreaData = rest[9],
43
+ setActiveCellInsideSelectionArea = rest[10],
44
+ activeCellRef = rest[11],
45
+ setValidStartingPoint = rest[12];
46
+ event.preventDefault();
47
+ var closestBodyCell = event.target.closest(".".concat(blockClass, "__body--td"));
48
+ var isValidSelectionAreaStart = closestBodyCell.classList.contains("".concat(blockClass, "__body--td"));
49
+ setValidStartingPoint(isValidSelectionAreaStart);
50
+ var isHoldingCommandKey = checkForHoldingKey.checkForHoldingKey(event, 'cmd');
51
+ var isHoldingShiftKey = checkForHoldingKey.checkForHoldingKey(event, 'shiftKey');
52
+ setContainerHasFocus(true);
53
+ var activeCoordinates = {
54
+ row: cell.row.index,
55
+ column: columnIndex
56
+ };
57
+ var tempMatcher = uuidv4["default"]();
58
+ setClickAndHoldActive(true);
59
+
60
+ // prevent multiple selections unless cmd key is held
61
+ // meaning that selectionAreas should only have one item by default
62
+ if (isHoldingCommandKey) {
63
+ var activeCellElement = ref.current.querySelector(".".concat(blockClass, "__active-cell--highlight"));
64
+ activeCellElement.setAttribute('data-selection-id', tempMatcher);
65
+ setActiveCellInsideSelectionArea(true);
66
+ setActiveCellCoordinates(activeCoordinates);
67
+ setCurrentMatcher(tempMatcher);
68
+ setSelectionAreas(function (prev) {
69
+ return [].concat(_rollupPluginBabelHelpers.toConsumableArray(prev), [{
70
+ point1: activeCoordinates,
71
+ matcher: tempMatcher
72
+ }]);
73
+ });
74
+ } else if (isHoldingShiftKey) {
75
+ setContainerHasFocus(true);
76
+ var selectionAreaClone = deepCloneObject.deepCloneObject(selectionAreas);
77
+ var indexOfItemToUpdate = selectionAreaClone.findIndex(function (item) {
78
+ return item.matcher === currentMatcher;
79
+ });
80
+ if (indexOfItemToUpdate === -1) {
81
+ // There is always a selectionArea with a point1 object that updates
82
+ // whenever the activeCellCoordinates update, we should always be able
83
+ // to find an index, but if we do not for some reason we should return
84
+ // at this point.
85
+ return;
86
+ } else {
87
+ // Update the selectionArea that was found, do not update currentMatcher
88
+ selectionAreaClone[indexOfItemToUpdate].point1 = activeCellCoordinates;
89
+ selectionAreaClone[indexOfItemToUpdate].point2 = activeCoordinates;
90
+ selectionAreaClone[indexOfItemToUpdate].areaCreated = false;
91
+ selectionAreaClone[indexOfItemToUpdate].matcher = currentMatcher;
92
+ setSelectionAreas(selectionAreaClone);
93
+ }
94
+ } else {
95
+ activeCellRef.current.style.display = 'none';
96
+ setActiveCellInsideSelectionArea(false);
97
+ setActiveCellCoordinates(activeCoordinates);
98
+ // remove all previous cell selections
99
+ removeCellSelections.removeCellSelections({
100
+ spreadsheetRef: ref
101
+ });
102
+ setSelectionAreas([{
103
+ point1: activeCoordinates,
104
+ matcher: tempMatcher
105
+ }]);
106
+ setCurrentMatcher(tempMatcher);
107
+ setSelectionAreaData([]);
108
+ }
109
+ };
110
+ var handleBodyCellHover = function handleBodyCellHover(cell, columnIndex) {
111
+ for (var _len2 = arguments.length, rest = new Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {
112
+ rest[_key2 - 2] = arguments[_key2];
113
+ }
114
+ var clickAndHoldActive = rest[0],
115
+ currentMatcher = rest[1],
116
+ setSelectionAreas = rest[2];
117
+ if (clickAndHoldActive) {
118
+ var cellCoordinates = {
119
+ row: cell.row.index,
120
+ column: columnIndex
121
+ };
122
+ setSelectionAreas(function (prev) {
123
+ var _selectionAreaClone$i, _selectionAreaClone$i2;
124
+ var selectionAreaClone = deepCloneObject.deepCloneObject(prev);
125
+ var indexOfItemToUpdate = selectionAreaClone.findIndex(function (item) {
126
+ return item.matcher === currentMatcher;
127
+ });
128
+ // No items in the array match up with the currentMatcher value
129
+ if (indexOfItemToUpdate === -1) {
130
+ return prev;
131
+ }
132
+ // Do not update state if you're still hovering on the same cell
133
+ if (((_selectionAreaClone$i = selectionAreaClone[indexOfItemToUpdate].point2) === null || _selectionAreaClone$i === void 0 ? void 0 : _selectionAreaClone$i.row) === cellCoordinates.row && ((_selectionAreaClone$i2 = selectionAreaClone[indexOfItemToUpdate].point2) === null || _selectionAreaClone$i2 === void 0 ? void 0 : _selectionAreaClone$i2.column) === cellCoordinates.column) {
134
+ return prev;
135
+ }
136
+ selectionAreaClone[indexOfItemToUpdate].point2 = cellCoordinates;
137
+ selectionAreaClone[indexOfItemToUpdate].areaCreated = false;
138
+ return selectionAreaClone;
139
+ });
140
+ }
141
+ };
142
+ var handleRowHeaderClick = function handleRowHeaderClick(index, event) {
143
+ for (var _len3 = arguments.length, rest = new Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {
144
+ rest[_key3 - 2] = arguments[_key3];
145
+ }
146
+ var columns = rest[0],
147
+ ref = rest[1],
148
+ setSelectionAreas = rest[2],
149
+ setCurrentMatcher = rest[3],
150
+ setActiveCellCoordinates = rest[4],
151
+ activeCellCoordinates = rest[5],
152
+ rows = rest[6],
153
+ setSelectionAreaData = rest[7];
154
+ var isHoldingCommandKey = checkForHoldingKey.checkForHoldingKey(event, 'cmd');
155
+ handleHeaderCellSelection.handleHeaderCellSelection({
156
+ type: 'row',
157
+ activeCellCoordinates: activeCellCoordinates,
158
+ rows: rows,
159
+ columns: columns,
160
+ setActiveCellCoordinates: setActiveCellCoordinates,
161
+ setCurrentMatcher: setCurrentMatcher,
162
+ setSelectionAreas: setSelectionAreas,
163
+ spreadsheetRef: ref,
164
+ index: index,
165
+ setSelectionAreaData: setSelectionAreaData,
166
+ isHoldingCommandKey: isHoldingCommandKey
167
+ });
168
+ };
169
+ var handleKeyPress = function handleKeyPress(event) {
170
+ for (var _len4 = arguments.length, rest = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
171
+ rest[_key4 - 1] = arguments[_key4];
172
+ }
173
+ var activeCellInsideSelectionArea = rest[0],
174
+ updateActiveCellCoordinates = rest[1],
175
+ activeCellCoordinates = rest[2],
176
+ removeActiveCell = rest[3],
177
+ columns = rest[4],
178
+ rows = rest[5],
179
+ spreadsheetRef = rest[6],
180
+ currentMatcher = rest[7],
181
+ removeCellEditor = rest[8],
182
+ selectionAreas = rest[9],
183
+ handleHomeEndKey = rest[10],
184
+ keysPressedList = rest[11],
185
+ usingMac = rest[12],
186
+ updateData = rest[13],
187
+ checkForReturnCondition = rest[14],
188
+ handleArrowKeyPress = rest[15],
189
+ setSelectionAreas = rest[16],
190
+ setSelectionAreaData = rest[17],
191
+ setCurrentMatcher = rest[18],
192
+ activeCellRef = rest[19],
193
+ setActiveCellCoordinates = rest[20],
194
+ setContainerHasFocus = rest[21],
195
+ setActiveCellContent = rest[22];
196
+ var key = event.key;
197
+ // Command keys need to be returned as there is default browser behavior with these keys
198
+ // Needs to be returned in editing mode
199
+ if (checkForReturnCondition(key)) {
200
+ return;
201
+ }
202
+
203
+ // Clear out all cell selection areas if user uses any arrow key, except if the shift key is being held
204
+ if (['ArrowLeft', 'ArrowUp', 'ArrowRight', 'ArrowDown'].indexOf(key) > -1) {
205
+ if (selectionAreas !== null && selectionAreas !== void 0 && selectionAreas.length && keysPressedList.length < 2 && !handleMultipleKeys.includesShift(keysPressedList)) {
206
+ setSelectionAreas([]);
207
+ setSelectionAreaData([]);
208
+ removeCellSelections.removeCellSelections({
209
+ spreadsheetRef: spreadsheetRef
210
+ });
211
+ }
212
+ }
213
+ if ((keysPressedList === null || keysPressedList === void 0 ? void 0 : keysPressedList.length) > 1) {
214
+ handleMultipleKeys.handleMultipleKeys({
215
+ activeCellCoordinates: activeCellCoordinates,
216
+ event: event,
217
+ keysPressedList: keysPressedList,
218
+ selectionAreas: selectionAreas,
219
+ currentMatcher: currentMatcher,
220
+ rows: rows,
221
+ setSelectionAreas: setSelectionAreas,
222
+ columns: columns,
223
+ updateActiveCellCoordinates: updateActiveCellCoordinates,
224
+ spreadsheetRef: spreadsheetRef,
225
+ removeCellSelections: removeCellSelections.removeCellSelections,
226
+ blockClass: blockClass,
227
+ setCurrentMatcher: setCurrentMatcher,
228
+ usingMac: usingMac
229
+ });
230
+ }
231
+
232
+ // Allow arrow key navigation if there are less than two activeKeys OR
233
+ // if one of the activeCellCoordinates is in a header position
234
+ // Prevent arrow keys, home key, and end key from scrolling the page when the data spreadsheet container has focus
235
+
236
+ if (keysPressedList.length < 2 && !handleMultipleKeys.includesShift(keysPressedList) || activeCellCoordinates.row === 'header' || activeCellCoordinates.column === 'header') {
237
+ switch (key) {
238
+ case 'Backspace':
239
+ case 'Delete':
240
+ {
241
+ var deleteParams = {
242
+ selectionAreas: selectionAreas,
243
+ currentMatcher: currentMatcher,
244
+ rows: rows,
245
+ setActiveCellContent: setActiveCellContent,
246
+ updateData: updateData,
247
+ activeCellCoordinates: activeCellCoordinates
248
+ };
249
+ handleCellDeletion.handleCellDeletion(deleteParams);
250
+ break;
251
+ }
252
+ // Enter
253
+ case 'Enter':
254
+ {
255
+ handleActiveCellInSelectionEnter.handleActiveCellInSelectionEnter({
256
+ activeCellInsideSelectionArea: activeCellInsideSelectionArea,
257
+ activeCellCoordinates: activeCellCoordinates,
258
+ activeCellRef: activeCellRef,
259
+ selectionAreas: selectionAreas,
260
+ updateActiveCellCoordinates: updateActiveCellCoordinates
261
+ });
262
+ break;
263
+ }
264
+ // HOME
265
+ case 'Home':
266
+ case 'End':
267
+ {
268
+ event.preventDefault();
269
+ if (handleMultipleKeys.includesResourceKey(keysPressedList, usingMac)) {
270
+ return;
271
+ }
272
+ handleHomeEndKey({
273
+ type: key
274
+ });
275
+ break;
276
+ }
277
+ // Tab
278
+ case 'Tab':
279
+ {
280
+ if (activeCellInsideSelectionArea) {
281
+ event.preventDefault();
282
+ return handleActiveCellInSelectionTab.handleActiveCellInSelectionTab({
283
+ activeCellInsideSelectionArea: activeCellInsideSelectionArea,
284
+ activeCellCoordinates: activeCellCoordinates,
285
+ activeCellRef: activeCellRef,
286
+ selectionAreas: selectionAreas,
287
+ updateActiveCellCoordinates: updateActiveCellCoordinates
288
+ });
289
+ }
290
+ setSelectionAreas([]);
291
+ removeActiveCell();
292
+ removeCellEditor();
293
+ setContainerHasFocus(false);
294
+ setActiveCellCoordinates(null);
295
+ break;
296
+ }
297
+ case 'ArrowLeft':
298
+ case 'ArrowUp':
299
+ case 'ArrowRight':
300
+ case 'ArrowDown':
301
+ {
302
+ handleArrowKeyPress(key);
303
+ }
304
+ }
305
+ }
306
+ };
307
+
308
+ exports.handleBodyCellClick = handleBodyCellClick;
309
+ exports.handleBodyCellHover = handleBodyCellHover;
310
+ exports.handleKeyPress = handleKeyPress;
311
+ exports.handleRowHeaderClick = handleRowHeaderClick;
@@ -107,7 +107,8 @@ var DatagridContent = function DatagridContent(_ref) {
107
107
  instance: datagridState,
108
108
  keysPressedList: keysPressedList,
109
109
  state: inlineEditState,
110
- usingMac: usingMac
110
+ usingMac: usingMac,
111
+ ref: multiKeyTrackingRef
111
112
  });
112
113
  },
113
114
  onFocus: withInlineEdit && function () {
@@ -43,7 +43,10 @@ var DatagridEmptyBody = function DatagridEmptyBody(datagridState) {
43
43
  link: emptyStateLink
44
44
  };
45
45
  var validEmptyStates = ['error', 'noData', 'notFound'];
46
- return /*#__PURE__*/React__default["default"].createElement(react.TableBody, _rollupPluginBabelHelpers["extends"]({}, getTableBodyProps(), {
46
+ return /*#__PURE__*/React__default["default"].createElement(react.TableBody, _rollupPluginBabelHelpers["extends"]({}, getTableBodyProps({
47
+ role: undefined
48
+ }), {
49
+ "aria-live": null,
47
50
  className: "".concat(blockClass, "__empty-state-body")
48
51
  }), /*#__PURE__*/React__default["default"].createElement(react.TableRow, null, /*#__PURE__*/React__default["default"].createElement(react.TableCell, {
49
52
  colSpan: headers.length,