@carbon/ibm-products 1.8.0 → 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/css/index-full-carbon.css +270 -5656
  2. package/css/index-full-carbon.css.map +1 -1
  3. package/css/index-full-carbon.min.css +6 -6
  4. package/css/index-full-carbon.min.css.map +1 -1
  5. package/css/index-without-carbon-released-only.css +58 -3432
  6. package/css/index-without-carbon-released-only.css.map +1 -1
  7. package/css/index-without-carbon-released-only.min.css +3 -3
  8. package/css/index-without-carbon-released-only.min.css.map +1 -1
  9. package/css/index-without-carbon.css +238 -3922
  10. package/css/index-without-carbon.css.map +1 -1
  11. package/css/index-without-carbon.min.css +6 -6
  12. package/css/index-without-carbon.min.css.map +1 -1
  13. package/css/index.css +238 -3923
  14. package/css/index.css.map +1 -1
  15. package/css/index.min.css +6 -6
  16. package/css/index.min.css.map +1 -1
  17. package/es/components/AddSelect/AddSelect.js +147 -53
  18. package/es/components/AddSelect/AddSelectBreadcrumbs.js +4 -4
  19. package/es/components/AddSelect/AddSelectColumn.js +195 -0
  20. package/es/components/AddSelect/AddSelectList.js +67 -8
  21. package/es/components/AddSelect/AddSelectSidebar.js +8 -15
  22. package/es/components/AddSelect/add-select-utils.js +64 -0
  23. package/es/components/BreadcrumbWithOverflow/BreadcrumbWithOverflow.js +2 -1
  24. package/es/components/ButtonMenu/ButtonMenu.js +1 -1
  25. package/es/components/DataSpreadsheet/DataSpreadsheet.js +505 -167
  26. package/es/components/DataSpreadsheet/DataSpreadsheetBody.js +244 -17
  27. package/es/components/DataSpreadsheet/DataSpreadsheetHeader.js +74 -8
  28. package/es/components/DataSpreadsheet/hooks/useMoveActiveCell.js +27 -0
  29. package/es/components/DataSpreadsheet/hooks/useResetSpreadsheetFocus.js +28 -0
  30. package/es/components/DataSpreadsheet/hooks/useSpreadsheetOutsideClick.js +41 -0
  31. package/es/components/DataSpreadsheet/utils/checkActiveHeaderCell.js +34 -0
  32. package/es/components/DataSpreadsheet/utils/createActiveCellFn.js +58 -0
  33. package/es/components/DataSpreadsheet/utils/createCellSelectionArea.js +49 -0
  34. package/es/components/DataSpreadsheet/{generateData.js → utils/generateData.js} +6 -0
  35. package/es/components/DataSpreadsheet/{getCellSize.js → utils/getCellSize.js} +0 -0
  36. package/es/components/DataSpreadsheet/utils/handleHeaderCellSelection.js +46 -0
  37. package/es/components/DataSpreadsheet/utils/handleMultipleKeys.js +82 -0
  38. package/es/components/DataSpreadsheet/utils/removeCellSelections.js +30 -0
  39. package/es/components/InlineEdit/InlineEdit.js +80 -39
  40. package/es/components/OptionsTile/OptionsTile.js +31 -21
  41. package/es/components/OptionsTile/index.js +1 -1
  42. package/es/components/PageHeader/PageHeader.js +26 -15
  43. package/es/components/PageHeader/PageHeaderTitle.js +2 -1
  44. package/es/components/PageHeader/PageHeaderUtils.js +24 -29
  45. package/es/components/TagSet/TagSet.js +12 -3
  46. package/es/components/UserProfileImage/UserProfileImage.js +2 -1
  47. package/es/global/js/utils/DisplayBox.js +31 -0
  48. package/es/global/js/utils/deepCloneObject.js +26 -0
  49. package/lib/components/AddSelect/AddSelect.js +150 -54
  50. package/lib/components/AddSelect/AddSelectBreadcrumbs.js +2 -3
  51. package/lib/components/AddSelect/AddSelectColumn.js +219 -0
  52. package/lib/components/AddSelect/AddSelectList.js +65 -8
  53. package/lib/components/AddSelect/AddSelectSidebar.js +14 -15
  54. package/lib/components/AddSelect/add-select-utils.js +78 -0
  55. package/lib/components/BreadcrumbWithOverflow/BreadcrumbWithOverflow.js +2 -1
  56. package/lib/components/ButtonMenu/ButtonMenu.js +1 -1
  57. package/lib/components/DataSpreadsheet/DataSpreadsheet.js +514 -170
  58. package/lib/components/DataSpreadsheet/DataSpreadsheetBody.js +251 -18
  59. package/lib/components/DataSpreadsheet/DataSpreadsheetHeader.js +82 -9
  60. package/lib/components/DataSpreadsheet/hooks/useMoveActiveCell.js +37 -0
  61. package/lib/components/DataSpreadsheet/hooks/useResetSpreadsheetFocus.js +39 -0
  62. package/lib/components/DataSpreadsheet/hooks/useSpreadsheetOutsideClick.js +52 -0
  63. package/lib/components/DataSpreadsheet/utils/checkActiveHeaderCell.js +45 -0
  64. package/lib/components/DataSpreadsheet/{createActiveCellFn.js → utils/createActiveCellFn.js} +22 -9
  65. package/lib/components/DataSpreadsheet/utils/createCellSelectionArea.js +60 -0
  66. package/lib/components/DataSpreadsheet/{generateData.js → utils/generateData.js} +6 -0
  67. package/lib/components/DataSpreadsheet/{getCellSize.js → utils/getCellSize.js} +0 -0
  68. package/lib/components/DataSpreadsheet/utils/handleHeaderCellSelection.js +59 -0
  69. package/lib/components/DataSpreadsheet/utils/handleMultipleKeys.js +92 -0
  70. package/lib/components/DataSpreadsheet/utils/removeCellSelections.js +41 -0
  71. package/lib/components/InlineEdit/InlineEdit.js +82 -40
  72. package/lib/components/OptionsTile/OptionsTile.js +30 -20
  73. package/lib/components/PageHeader/PageHeader.js +25 -15
  74. package/lib/components/PageHeader/PageHeaderTitle.js +2 -1
  75. package/lib/components/PageHeader/PageHeaderUtils.js +24 -29
  76. package/lib/components/TagSet/TagSet.js +13 -3
  77. package/lib/components/UserProfileImage/UserProfileImage.js +2 -1
  78. package/lib/global/js/utils/DisplayBox.js +46 -0
  79. package/lib/global/js/utils/deepCloneObject.js +37 -0
  80. package/package.json +17 -17
  81. package/scss/components/ActionBar/_storybook-styles.scss +8 -0
  82. package/scss/components/ActionSet/_storybook-styles.scss +1 -3
  83. package/scss/components/AddSelect/_add-select.scss +99 -14
  84. package/scss/components/BreadcrumbWithOverflow/_breadcrumb-with-overflow.scss +7 -3
  85. package/scss/components/BreadcrumbWithOverflow/_storybook-styles.scss +8 -0
  86. package/scss/components/ButtonSetWithOverflow/_storybook-styles.scss +8 -0
  87. package/scss/components/CreateInfluencer/_create-influencer.scss +2 -0
  88. package/scss/components/CreateModal/_create-modal.scss +1 -0
  89. package/scss/components/CreateSidePanel/_create-side-panel.scss +1 -1
  90. package/scss/components/CreateSidePanel/_storybook-styles.scss +1 -1
  91. package/scss/components/CreateTearsheet/_create-tearsheet.scss +1 -0
  92. package/scss/components/CreateTearsheetNarrow/_create-tearsheet-narrow.scss +1 -0
  93. package/scss/components/DataSpreadsheet/_data-spreadsheet.scss +42 -6
  94. package/scss/components/EditSidePanel/_edit-side-panel.scss +9 -0
  95. package/scss/components/EditSidePanel/_storybook-styles.scss +1 -1
  96. package/scss/components/InlineEdit/_inline-edit.scss +53 -43
  97. package/scss/components/InlineEdit/_storybook-styles.scss +2 -0
  98. package/scss/components/LoadingBar/_loading-bar.scss +13 -0
  99. package/scss/components/NotificationsPanel/_notifications-panel.scss +3 -0
  100. package/scss/components/OptionsTile/_index.scss +1 -1
  101. package/scss/components/OptionsTile/_options-tile.scss +17 -17
  102. package/scss/components/OptionsTile/_storybook-styles.scss +4 -4
  103. package/scss/components/PageHeader/_page-header.scss +5 -2
  104. package/scss/components/SidePanel/_side-panel.scss +19 -12
  105. package/scss/components/StatusIcon/_status-icon.scss +1 -0
  106. package/scss/components/TagSet/_storybook-styles.scss +8 -0
  107. package/scss/components/Tearsheet/_tearsheet.scss +1 -2
  108. package/scss/components/UserProfileImage/_user-profile-image.scss +9 -0
  109. package/scss/components/WebTerminal/_web-terminal.scss +2 -0
  110. package/scss/global/styles/_display-box.scss +62 -0
  111. package/es/components/DataSpreadsheet/createActiveCellFn.js +0 -45
@@ -2,7 +2,7 @@
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
 
5
- var _typeof = require("@babel/runtime/helpers/typeof");
5
+ var _typeof3 = require("@babel/runtime/helpers/typeof");
6
6
 
7
7
  Object.defineProperty(exports, "__esModule", {
8
8
  value: true
@@ -11,6 +11,10 @@ exports.DataSpreadsheet = void 0;
11
11
 
12
12
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
13
 
14
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
15
+
16
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
17
+
14
18
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
19
 
16
20
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
@@ -25,27 +29,43 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
25
29
 
26
30
  var _classnames = _interopRequireDefault(require("classnames"));
27
31
 
28
- var _devtools = require("../../global/js/utils/devtools");
32
+ var _carbonComponentsReact = require("carbon-components-react");
29
33
 
30
34
  var _settings = require("../../settings");
31
35
 
32
- var _getScrollbarWidth = require("../../global/js/utils/getScrollbarWidth");
33
-
34
36
  var _DataSpreadsheetBody = require("./DataSpreadsheetBody");
35
37
 
36
- var _getCellSize = require("./getCellSize");
37
-
38
38
  var _DataSpreadsheetHeader = require("./DataSpreadsheetHeader");
39
39
 
40
+ var _devtools = require("../../global/js/utils/devtools");
41
+
42
+ var _getScrollbarWidth = require("../../global/js/utils/getScrollbarWidth");
43
+
40
44
  var _hooks = require("../../global/js/hooks");
41
45
 
42
- var _createActiveCellFn = require("./createActiveCellFn");
46
+ var _deepCloneObject = require("../../global/js/utils/deepCloneObject");
43
47
 
44
- var _excluded = ["cellSize", "className", "columns", "data", "id", "onActiveCellChange"];
48
+ var _uuidv = _interopRequireDefault(require("../../global/js/utils/uuidv4"));
49
+
50
+ var _useResetSpreadsheetFocus = require("./hooks/useResetSpreadsheetFocus");
51
+
52
+ var _useSpreadsheetOutsideClick = require("./hooks/useSpreadsheetOutsideClick");
53
+
54
+ var _useMoveActiveCell = require("./hooks/useMoveActiveCell");
55
+
56
+ var _createActiveCellFn = require("./utils/createActiveCellFn");
57
+
58
+ var _getCellSize = require("./utils/getCellSize");
59
+
60
+ var _handleMultipleKeys = require("./utils/handleMultipleKeys");
61
+
62
+ var _handleHeaderCellSelection = require("./utils/handleHeaderCellSelection");
63
+
64
+ var _excluded = ["cellSize", "className", "columns", "data", "onDataUpdate", "id", "onActiveCellChange"];
45
65
 
46
66
  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); }
47
67
 
48
- 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; }
68
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof3(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; }
49
69
 
50
70
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
51
71
 
@@ -59,7 +79,8 @@ var componentName = 'DataSpreadsheet'; // Default values for props
59
79
  var defaults = {
60
80
  cellSize: 'standard',
61
81
  columns: Object.freeze([]),
62
- data: Object.freeze([])
82
+ data: Object.freeze([]),
83
+ onDataUpdate: Object.freeze(function () {})
63
84
  };
64
85
  /**
65
86
  * DataSpreadsheet: used to organize and display large amounts of structured data, separated by columns and rows in a grid-like format.
@@ -73,9 +94,13 @@ var DataSpreadsheet = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref
73
94
  columns = _ref$columns === void 0 ? defaults.columns : _ref$columns,
74
95
  _ref$data = _ref.data,
75
96
  data = _ref$data === void 0 ? defaults.data : _ref$data,
97
+ _ref$onDataUpdate = _ref.onDataUpdate,
98
+ onDataUpdate = _ref$onDataUpdate === void 0 ? defaults.onDataUpdate : _ref$onDataUpdate,
76
99
  id = _ref.id,
77
100
  onActiveCellChange = _ref.onActiveCellChange,
78
101
  rest = (0, _objectWithoutProperties2.default)(_ref, _excluded);
102
+ var localRef = (0, _react.useRef)();
103
+ var spreadsheetRef = ref || localRef;
79
104
  var focusedElement = (0, _hooks.useActiveElement)();
80
105
 
81
106
  var _useState = (0, _react.useState)(false),
@@ -88,7 +113,39 @@ var DataSpreadsheet = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref
88
113
  activeCellCoordinates = _useState4[0],
89
114
  setActiveCellCoordinates = _useState4[1];
90
115
 
116
+ var _useState5 = (0, _react.useState)([]),
117
+ _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
118
+ selectionAreas = _useState6[0],
119
+ setSelectionAreas = _useState6[1];
120
+
121
+ var _useState7 = (0, _react.useState)(false),
122
+ _useState8 = (0, _slicedToArray2.default)(_useState7, 2),
123
+ clickAndHoldActive = _useState8[0],
124
+ setClickAndHoldActive = _useState8[1];
125
+
126
+ var _useState9 = (0, _react.useState)(''),
127
+ _useState10 = (0, _slicedToArray2.default)(_useState9, 2),
128
+ currentMatcher = _useState10[0],
129
+ setCurrentMatcher = _useState10[1];
130
+
131
+ var _useState11 = (0, _react.useState)(false),
132
+ _useState12 = (0, _slicedToArray2.default)(_useState11, 2),
133
+ isEditing = _useState12[0],
134
+ setIsEditing = _useState12[1];
135
+
136
+ var _useState13 = (0, _react.useState)(''),
137
+ _useState14 = (0, _slicedToArray2.default)(_useState13, 2),
138
+ cellEditorValue = _useState14[0],
139
+ setCellEditorValue = _useState14[1];
140
+
141
+ var previousState = (0, _hooks.usePreviousValue)({
142
+ activeCellCoordinates: activeCellCoordinates
143
+ });
91
144
  var cellSizeValue = (0, _getCellSize.getCellSize)(cellSize);
145
+ var cellEditorRef = (0, _react.useRef)();
146
+ var currentMatcherRef = (0, _react.useRef)();
147
+ var activeKeys = (0, _react.useRef)([]);
148
+ var activeCellRef = (0, _react.useRef)();
92
149
  var defaultColumn = (0, _react.useMemo)(function () {
93
150
  return {
94
151
  width: 150,
@@ -110,44 +167,62 @@ var DataSpreadsheet = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref
110
167
  headerGroups = _useTable.headerGroups,
111
168
  rows = _useTable.rows,
112
169
  totalColumnsWidth = _useTable.totalColumnsWidth,
113
- prepareRow = _useTable.prepareRow; // Reset everything when spreadsheet loses focus
170
+ prepareRow = _useTable.prepareRow; // Update the spreadsheet data after editing a cell
114
171
 
115
172
 
116
- (0, _react.useEffect)(function () {
117
- if (!focusedElement.classList.contains("".concat(blockClass, "--interactive-cell-element"))) {
118
- setContainerHasFocus(false);
119
- removeActiveCell();
120
- }
173
+ var updateData = (0, _react.useCallback)(function (rowIndex, columnId) {
174
+ onDataUpdate(function (prev) {
175
+ return prev.map(function (row, index) {
176
+ if (index === rowIndex) {
177
+ return _objectSpread(_objectSpread({}, prev[rowIndex]), {}, (0, _defineProperty2.default)({}, columnId, cellEditorValue));
178
+ }
121
179
 
122
- if (focusedElement.classList.contains(blockClass) || focusedElement.classList.contains("".concat(blockClass, "--interactive-cell-element"))) {
123
- setContainerHasFocus(true);
124
- }
125
- }, [focusedElement, removeActiveCell]); // Removes the active cell element
180
+ return row;
181
+ });
182
+ });
183
+ }, [cellEditorValue, onDataUpdate]); // Removes the active cell element
126
184
 
127
185
  var removeActiveCell = (0, _react.useCallback)(function () {
128
186
  var activeCellHighlight = spreadsheetRef.current.querySelector(".".concat(blockClass, "__active-cell--highlight"));
129
187
 
130
188
  if (activeCellHighlight) {
131
- activeCellHighlight.remove();
189
+ activeCellHighlight.style.display = 'none';
132
190
  }
133
- }, [spreadsheetRef]); // Click outside useEffect
134
-
135
- (0, _react.useEffect)(function () {
136
- var handleOutsideClick = function handleOutsideClick(event) {
137
- if (!spreadsheetRef.current || spreadsheetRef.current.contains(event.target) || event.target.classList.contains("".concat(blockClass, "__active-cell--highlight"))) {
138
- return;
191
+ }, [spreadsheetRef]);
192
+ var removeCellEditor = (0, _react.useCallback)(function () {
193
+ setCellEditorValue('');
194
+ setIsEditing(false);
195
+ cellEditorRef.current.style.display = 'none';
196
+ }, []); // Removes the cell selection elements
197
+
198
+ var removeCellSelections = (0, _react.useCallback)(function (matcher) {
199
+ if (matcher && typeof matcher === 'string') {
200
+ var selectionToRemove = spreadsheetRef.current.querySelector("[data-matcher-id=\"".concat(matcher, "\"]"));
201
+
202
+ if (selectionToRemove) {
203
+ selectionToRemove.remove();
139
204
  }
205
+ } else {
206
+ var cellSelections = spreadsheetRef.current.querySelectorAll(".".concat(blockClass, "__selection-area--element"));
207
+ (0, _toConsumableArray2.default)(cellSelections).forEach(function (element) {
208
+ return element.remove();
209
+ });
210
+ }
211
+ }, [spreadsheetRef]); // Remove cell editor if the active cell coordinates change and save with new cell data, this will
212
+ // happen if you click on another cell while isEditing is true
140
213
 
141
- removeActiveCell();
142
- setContainerHasFocus(false);
143
- setActiveCellCoordinates(null);
144
- };
214
+ (0, _react.useEffect)(function () {
215
+ var prevCoords = previousState === null || previousState === void 0 ? void 0 : previousState.activeCellCoordinates;
145
216
 
146
- document.addEventListener('click', handleOutsideClick);
147
- return function () {
148
- document.removeEventListener('click', handleOutsideClick);
149
- };
150
- }, [spreadsheetRef, removeActiveCell]);
217
+ if (((prevCoords === null || prevCoords === void 0 ? void 0 : prevCoords.row) !== (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row) || (prevCoords === null || prevCoords === void 0 ? void 0 : prevCoords.column) !== (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column)) && isEditing) {
218
+ var cellProps = rows[prevCoords === null || prevCoords === void 0 ? void 0 : prevCoords.row].cells[prevCoords === null || prevCoords === void 0 ? void 0 : prevCoords.column];
219
+ removeCellEditor();
220
+ updateData(prevCoords === null || prevCoords === void 0 ? void 0 : prevCoords.row, cellProps.column.id);
221
+ }
222
+ }, [activeCellCoordinates, previousState === null || previousState === void 0 ? void 0 : previousState.activeCellCoordinates, updateData, rows, isEditing, removeCellEditor]);
223
+ var handleActiveCellMouseEnter = (0, _react.useCallback)(function () {
224
+ handleActiveCellMouseEnterCallback(selectionAreas, clickAndHoldActive);
225
+ }, [clickAndHoldActive, selectionAreas, handleActiveCellMouseEnterCallback]);
151
226
  var createActiveCell = (0, _react.useCallback)(function (_ref2) {
152
227
  var placementElement = _ref2.placementElement,
153
228
  coords = _ref2.coords,
@@ -155,16 +230,45 @@ var DataSpreadsheet = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref
155
230
  addToHeader = _ref2$addToHeader === void 0 ? false : _ref2$addToHeader;
156
231
  var activeCellFullData = typeof (coords === null || coords === void 0 ? void 0 : coords.column) === 'number' && typeof (coords === null || coords === void 0 ? void 0 : coords.row) === 'number' ? rows[coords === null || coords === void 0 ? void 0 : coords.row].cells[coords === null || coords === void 0 ? void 0 : coords.column] : null;
157
232
  var activeCellValue = activeCellFullData ? Object.values(activeCellFullData.row.values)[coords === null || coords === void 0 ? void 0 : coords.column] : null;
158
- (0, _createActiveCellFn.createActiveCellFn)({
159
- placementElement: placementElement,
160
- coords: coords,
161
- addToHeader: addToHeader,
162
- contextRef: spreadsheetRef,
163
- blockClass: blockClass,
164
- onActiveCellChange: onActiveCellChange,
165
- activeCellValue: activeCellValue
166
- });
167
- }, [spreadsheetRef, rows, onActiveCellChange]);
233
+ var prevCoords = previousState === null || previousState === void 0 ? void 0 : previousState.activeCellCoordinates; // Only create an active cell if the activeCellCoordinates have changed
234
+
235
+ if ((prevCoords === null || prevCoords === void 0 ? void 0 : prevCoords.row) !== (coords === null || coords === void 0 ? void 0 : coords.row) || (prevCoords === null || prevCoords === void 0 ? void 0 : prevCoords.column) !== (coords === null || coords === void 0 ? void 0 : coords.column)) {
236
+ (0, _createActiveCellFn.createActiveCellFn)({
237
+ placementElement: placementElement,
238
+ coords: coords,
239
+ addToHeader: addToHeader,
240
+ contextRef: spreadsheetRef,
241
+ blockClass: blockClass,
242
+ onActiveCellChange: onActiveCellChange,
243
+ activeCellValue: activeCellValue,
244
+ activeCellRef: activeCellRef,
245
+ cellEditorRef: cellEditorRef,
246
+ defaultColumn: defaultColumn
247
+ });
248
+ }
249
+ }, [spreadsheetRef, rows, onActiveCellChange, previousState === null || previousState === void 0 ? void 0 : previousState.activeCellCoordinates, defaultColumn]);
250
+ (0, _useResetSpreadsheetFocus.useResetSpreadsheetFocus)({
251
+ activeKeys: activeKeys,
252
+ focusedElement: focusedElement,
253
+ removeActiveCell: removeActiveCell,
254
+ setContainerHasFocus: setContainerHasFocus
255
+ });
256
+ (0, _useSpreadsheetOutsideClick.useSpreadsheetOutsideClick)({
257
+ spreadsheetRef: spreadsheetRef,
258
+ setActiveCellCoordinates: setActiveCellCoordinates,
259
+ setSelectionAreas: setSelectionAreas,
260
+ removeActiveCell: removeActiveCell,
261
+ removeCellSelections: removeCellSelections,
262
+ setContainerHasFocus: setContainerHasFocus,
263
+ activeKeys: activeKeys,
264
+ removeCellEditor: removeCellEditor
265
+ });
266
+ (0, _useMoveActiveCell.useMoveActiveCell)({
267
+ spreadsheetRef: spreadsheetRef,
268
+ activeCellCoordinates: activeCellCoordinates,
269
+ containerHasFocus: containerHasFocus,
270
+ createActiveCell: createActiveCell
271
+ });
168
272
  var handleInitialArrowPress = (0, _react.useCallback)(function () {
169
273
  // If activeCellCoordinates is null then we need to set an initial value
170
274
  // which will place the activeCell on the select all cell/button
@@ -177,189 +281,388 @@ var DataSpreadsheet = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref
177
281
 
178
282
  return;
179
283
  }, [activeCellCoordinates]);
180
-
181
- var updateActiveCellCoordinates = function updateActiveCellCoordinates(_ref3) {
284
+ var updateActiveCellCoordinates = (0, _react.useCallback)(function (_ref3) {
182
285
  var coords = _ref3.coords,
183
286
  updatedValue = _ref3.updatedValue;
184
- setActiveCellCoordinates(_objectSpread(_objectSpread({}, coords), updatedValue));
185
- };
186
287
 
288
+ var newActiveCell = _objectSpread(_objectSpread({}, coords), updatedValue);
289
+
290
+ setActiveCellCoordinates(newActiveCell); // Only run if the active cell is _not_ a header cell. This will add a point1 object
291
+ // to selectionAreas every time the active cell changes, allowing us to create cell
292
+ // selections using keyboard
293
+
294
+ if (newActiveCell.row !== 'header' && newActiveCell.column !== 'header') {
295
+ var tempMatcher = (0, _uuidv.default)();
296
+ setSelectionAreas([{
297
+ point1: newActiveCell,
298
+ matcher: tempMatcher
299
+ }]);
300
+ setCurrentMatcher(tempMatcher);
301
+ }
302
+ }, []);
187
303
  var handleKeyPress = (0, _react.useCallback)(function (event) {
188
- var keyCode = event.keyCode; // Command keys need to be returned as there is default browser behavior with these keys
304
+ var _activeKeys$current, _activeKeys$current2;
305
+
306
+ var key = event.key; // Command keys need to be returned as there is default browser behavior with these keys
189
307
 
190
- if (keyCode === 91 || keyCode === 93) {
308
+ if (key === 'Meta' || key === 'Control') {
191
309
  return;
192
310
  } // Prevent arrow keys, home key, and end key from scrolling the page when the data spreadsheet container has focus
193
311
 
194
312
 
195
- if ([35, 36, 37, 38, 39, 40].indexOf(keyCode) > -1) {
313
+ if (['End', 'Home', 'ArrowLeft', 'ArrowUp', 'ArrowRight', 'ArrowDown'].indexOf(key) > -1 && !isEditing) {
196
314
  event.preventDefault();
197
315
  }
198
316
 
199
- switch (keyCode) {
200
- // Tab
201
- case 9:
202
- {
203
- removeActiveCell();
204
- setContainerHasFocus(false);
205
- setActiveCellCoordinates(null);
206
- break;
207
- }
208
- // Left
317
+ if (['Tab'].indexOf(key) > -1 && isEditing) {
318
+ return;
319
+ } // Clear out all cell selection areas if user uses any arrow key, except if the shift key is being held
320
+
321
+
322
+ if (['ArrowLeft', 'ArrowUp', 'ArrowRight', 'ArrowDown'].indexOf(key) > -1) {
323
+ if (isEditing) {
324
+ return;
325
+ }
326
+
327
+ if (selectionAreas !== null && selectionAreas !== void 0 && selectionAreas.length && key !== 'Shift' && !activeKeys.current.includes('Shift')) {
328
+ setSelectionAreas([]);
329
+ removeCellSelections({
330
+ spreadsheetRef: spreadsheetRef
331
+ });
332
+ }
333
+ } // Update list of activeKeys
209
334
 
210
- case 37:
211
- {
212
- handleInitialArrowPress();
213
335
 
214
- var coordinatesClone = _objectSpread({}, activeCellCoordinates);
336
+ if (!((_activeKeys$current = activeKeys.current) !== null && _activeKeys$current !== void 0 && _activeKeys$current.includes(key))) {
337
+ var activeClone = (0, _toConsumableArray2.default)(activeKeys.current);
338
+ activeKeys.current = [].concat((0, _toConsumableArray2.default)(activeClone), [key]);
339
+ }
215
340
 
216
- if (coordinatesClone.column === 'header') {
217
- return;
341
+ if (((_activeKeys$current2 = activeKeys.current) === null || _activeKeys$current2 === void 0 ? void 0 : _activeKeys$current2.length) > 1) {
342
+ (0, _handleMultipleKeys.handleMultipleKeys)({
343
+ activeKeys: activeKeys,
344
+ selectionAreas: selectionAreas,
345
+ currentMatcher: currentMatcher,
346
+ rows: rows,
347
+ setSelectionAreas: setSelectionAreas,
348
+ columns: columns
349
+ });
350
+ } // Allow arrow key navigation if there are less than two activeKeys OR
351
+ // if one of the activeCellCoordinates is in a header position
352
+
353
+
354
+ if (!activeKeys.current.includes('Shift') || activeCellCoordinates.row === 'header' || activeCellCoordinates.column === 'header') {
355
+ switch (key) {
356
+ // Tab
357
+ case 'Tab':
358
+ {
359
+ setSelectionAreas([]);
360
+ removeActiveCell();
361
+ removeCellEditor();
362
+ setContainerHasFocus(false);
363
+ setActiveCellCoordinates(null);
364
+ break;
218
365
  }
366
+ // Left
367
+
368
+ case 'ArrowLeft':
369
+ {
370
+ handleInitialArrowPress();
371
+
372
+ var coordinatesClone = _objectSpread({}, activeCellCoordinates);
373
+
374
+ if (coordinatesClone.column === 'header') {
375
+ return;
376
+ }
377
+
378
+ if (typeof coordinatesClone.column === 'number') {
379
+ if (coordinatesClone.column === 0) {
380
+ updateActiveCellCoordinates({
381
+ coords: coordinatesClone,
382
+ updatedValue: {
383
+ column: 'header'
384
+ }
385
+ });
386
+ return;
387
+ }
219
388
 
220
- if (typeof coordinatesClone.column === 'number') {
221
- if (coordinatesClone.column === 0) {
222
389
  updateActiveCellCoordinates({
223
390
  coords: coordinatesClone,
224
391
  updatedValue: {
225
- column: 'header'
392
+ column: coordinatesClone.column - 1
226
393
  }
227
394
  });
228
- return;
229
395
  }
230
396
 
231
- updateActiveCellCoordinates({
232
- coords: coordinatesClone,
233
- updatedValue: {
234
- column: coordinatesClone.column - 1
235
- }
236
- });
397
+ break;
237
398
  }
399
+ // Up
238
400
 
239
- break;
240
- }
241
- // Up
401
+ case 'ArrowUp':
402
+ {
403
+ handleInitialArrowPress();
242
404
 
243
- case 38:
244
- {
245
- handleInitialArrowPress();
405
+ var _coordinatesClone = _objectSpread({}, activeCellCoordinates);
246
406
 
247
- var _coordinatesClone = _objectSpread({}, activeCellCoordinates);
407
+ if (_coordinatesClone.row === 'header') {
408
+ return;
409
+ }
410
+
411
+ if (typeof _coordinatesClone.row === 'number') {
412
+ // set row back to header if we are at index 0
413
+ if (_coordinatesClone.row === 0) {
414
+ updateActiveCellCoordinates({
415
+ coords: _coordinatesClone,
416
+ updatedValue: {
417
+ row: 'header'
418
+ }
419
+ });
420
+ return;
421
+ } // if we are at any other index than 0, subtract 1 from current row index
248
422
 
249
- if (_coordinatesClone.row === 'header') {
250
- return;
251
- }
252
423
 
253
- if (typeof _coordinatesClone.row === 'number') {
254
- // set row back to header if we are at index 0
255
- if (_coordinatesClone.row === 0) {
256
424
  updateActiveCellCoordinates({
257
425
  coords: _coordinatesClone,
258
426
  updatedValue: {
259
- row: 'header'
427
+ row: _coordinatesClone.row - 1
260
428
  }
261
429
  });
262
- return;
263
- } // if we are at any other index than 0, subtract 1 from current row index
264
-
430
+ }
265
431
 
266
- updateActiveCellCoordinates({
267
- coords: _coordinatesClone,
268
- updatedValue: {
269
- row: _coordinatesClone.row - 1
270
- }
271
- });
432
+ break;
272
433
  }
434
+ // Right
273
435
 
274
- break;
275
- }
276
- // Right
436
+ case 'ArrowRight':
437
+ {
438
+ handleInitialArrowPress();
277
439
 
278
- case 39:
279
- {
280
- handleInitialArrowPress();
440
+ var _coordinatesClone2 = _objectSpread({}, activeCellCoordinates);
281
441
 
282
- var _coordinatesClone2 = _objectSpread({}, activeCellCoordinates);
442
+ if (_coordinatesClone2.column === 'header') {
443
+ updateActiveCellCoordinates({
444
+ coords: _coordinatesClone2,
445
+ updatedValue: {
446
+ column: 0
447
+ }
448
+ });
449
+ }
283
450
 
284
- if (_coordinatesClone2.column === 'header') {
285
- updateActiveCellCoordinates({
286
- coords: _coordinatesClone2,
287
- updatedValue: {
288
- column: 0
451
+ if (typeof _coordinatesClone2.column === 'number') {
452
+ // Prevent active cell coordinates from updating if the active
453
+ // cell is in the last column, ie we can't go any further to the right
454
+ if (columns.length - 1 === _coordinatesClone2.column) {
455
+ return;
289
456
  }
290
- });
291
- }
292
457
 
293
- if (typeof _coordinatesClone2.column === 'number') {
294
- // Prevent active cell coordinates from updating if the active
295
- // cell is in the last column, ie we can't go any further to the right
296
- if (columns.length - 1 === _coordinatesClone2.column) {
297
- return;
458
+ updateActiveCellCoordinates({
459
+ coords: _coordinatesClone2,
460
+ updatedValue: {
461
+ column: _coordinatesClone2.column + 1
462
+ }
463
+ });
298
464
  }
299
465
 
300
- updateActiveCellCoordinates({
301
- coords: _coordinatesClone2,
302
- updatedValue: {
303
- column: _coordinatesClone2.column + 1
304
- }
305
- });
466
+ break;
306
467
  }
468
+ // Down
307
469
 
308
- break;
309
- }
310
- // Down
470
+ case 'ArrowDown':
471
+ {
472
+ handleInitialArrowPress();
311
473
 
312
- case 40:
313
- {
314
- handleInitialArrowPress();
474
+ var _coordinatesClone3 = _objectSpread({}, activeCellCoordinates);
315
475
 
316
- var _coordinatesClone3 = _objectSpread({}, activeCellCoordinates);
476
+ if (_coordinatesClone3.row === 'header') {
477
+ updateActiveCellCoordinates({
478
+ coords: _coordinatesClone3,
479
+ updatedValue: {
480
+ row: 0
481
+ }
482
+ });
483
+ }
317
484
 
318
- if (_coordinatesClone3.row === 'header') {
319
- updateActiveCellCoordinates({
320
- coords: _coordinatesClone3,
321
- updatedValue: {
322
- row: 0
485
+ if (typeof _coordinatesClone3.row === 'number') {
486
+ // Prevent active cell coordinates from updating if the active
487
+ // cell is in the last row, ie we can't go any further down since
488
+ // we are in the last row
489
+ if (rows.length - 1 === _coordinatesClone3.row) {
490
+ return;
323
491
  }
324
- });
325
- }
326
492
 
327
- if (typeof _coordinatesClone3.row === 'number') {
328
- // Prevent active cell coordinates from updating if the active
329
- // cell is in the last row, ie we can't go any further down since
330
- // we are in the last row
331
- if (rows.length - 1 === _coordinatesClone3.row) {
332
- return;
493
+ updateActiveCellCoordinates({
494
+ coords: _coordinatesClone3,
495
+ updatedValue: {
496
+ row: _coordinatesClone3.row + 1
497
+ }
498
+ });
333
499
  }
334
500
 
335
- updateActiveCellCoordinates({
336
- coords: _coordinatesClone3,
337
- updatedValue: {
338
- row: _coordinatesClone3.row + 1
339
- }
340
- });
501
+ break;
341
502
  }
503
+ }
504
+ }
505
+ }, [updateActiveCellCoordinates, handleInitialArrowPress, activeCellCoordinates, removeActiveCell, columns, rows, spreadsheetRef, currentMatcher, isEditing, removeCellEditor, removeCellSelections, selectionAreas]);
506
+
507
+ var startEditMode = function startEditMode() {
508
+ setIsEditing(true);
509
+ var activeCellFullData = typeof (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column) === 'number' && typeof (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row) === 'number' ? rows[activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row].cells[activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column] : null;
510
+ var activeCellValue = activeCellFullData ? Object.values(activeCellFullData.row.values)[activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column] : null;
511
+ setCellEditorValue(activeCellValue);
512
+ }; // Go into edit mode if 'Enter' key is pressed on activeCellRef
342
513
 
343
- break;
514
+
515
+ var handleActiveCellKeyDown = function handleActiveCellKeyDown(event) {
516
+ var key = event.key;
517
+
518
+ if (key === 'Enter') {
519
+ if ((activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column) !== 'header' && (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row) !== 'header') {
520
+ startEditMode();
521
+ }
522
+
523
+ if ((activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row) === 'header' || (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column) === 'header') {
524
+ var handleHeaderCellProps = {
525
+ activeCellCoordinates: activeCellCoordinates,
526
+ rows: rows,
527
+ columns: columns,
528
+ setActiveCellCoordinates: setActiveCellCoordinates,
529
+ setCurrentMatcher: setCurrentMatcher,
530
+ setSelectionAreas: setSelectionAreas,
531
+ spreadsheetRef: spreadsheetRef,
532
+ isKeyboard: true
533
+ }; // Select an entire column
534
+
535
+ if ((activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row) === 'header') {
536
+ (0, _handleHeaderCellSelection.handleHeaderCellSelection)(_objectSpread({
537
+ type: 'column'
538
+ }, handleHeaderCellProps));
539
+ } // Select an entire row
540
+
541
+
542
+ if ((activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column) === 'header') {
543
+ (0, _handleHeaderCellSelection.handleHeaderCellSelection)(_objectSpread({
544
+ type: 'row'
545
+ }, handleHeaderCellProps));
344
546
  }
547
+ }
345
548
  }
346
- }, [handleInitialArrowPress, activeCellCoordinates, removeActiveCell, columns.length, rows.length]); // Adds active cell highlight to correct cell onKeyDown
549
+ }; // Go into edit mode if double click is detected on activeCellRef
347
550
 
551
+
552
+ var handleActiveCellDoubleClick = function handleActiveCellDoubleClick() {
553
+ startEditMode();
554
+ }; // Update the data
555
+
556
+
557
+ var handleEditSubmit = function handleEditSubmit(event) {
558
+ var key = event.key;
559
+
560
+ var submitEditChanges = function submitEditChanges() {
561
+ var prevCoords = previousState === null || previousState === void 0 ? void 0 : previousState.activeCellCoordinates;
562
+ var cellProps = rows[prevCoords === null || prevCoords === void 0 ? void 0 : prevCoords.row].cells[prevCoords === null || prevCoords === void 0 ? void 0 : prevCoords.column];
563
+ removeCellEditor();
564
+ updateData(prevCoords === null || prevCoords === void 0 ? void 0 : prevCoords.row, cellProps.column.id);
565
+ };
566
+
567
+ if (key === 'Enter') {
568
+ submitEditChanges();
569
+ setActiveCellCoordinates(function (prev) {
570
+ return _objectSpread(_objectSpread({}, prev), {}, {
571
+ row: prev.row === rows.length - 1 ? prev.row : prev.row + 1 // do not move to next cell below if we're already in the last row
572
+
573
+ });
574
+ });
575
+ }
576
+
577
+ if (key === 'Tab') {
578
+ event.preventDefault();
579
+ submitEditChanges();
580
+ setActiveCellCoordinates(function (prev) {
581
+ return _objectSpread(_objectSpread({}, prev), {}, {
582
+ column: prev.column === columns.length - 1 ? prev.column : prev.column + 1 // do not move to next cell below if we're already in the last column
583
+
584
+ });
585
+ });
586
+ }
587
+
588
+ return;
589
+ }; // Only update if there are cell selection areas
590
+ // Find point object that matches currentMatcher and remove the second point
591
+ // because hovering over the active cell while clicking and holding should
592
+ // remove the previously existing selection area
593
+
594
+
595
+ var handleActiveCellMouseEnterCallback = (0, _react.useCallback)(function (areas, clickHold) {
596
+ var freshMatcherValue = currentMatcherRef.current;
597
+
598
+ if (!freshMatcherValue) {
599
+ return;
600
+ }
601
+
602
+ if (areas && areas.length && clickHold && freshMatcherValue) {
603
+ setSelectionAreas(function (prev) {
604
+ var selectionAreaClone = (0, _deepCloneObject.deepCloneObject)(prev);
605
+ var indexOfItemToUpdate = selectionAreaClone.findIndex(function (item) {
606
+ return item.matcher === freshMatcherValue;
607
+ });
608
+
609
+ if (indexOfItemToUpdate === -1) {
610
+ return prev;
611
+ }
612
+
613
+ if ((0, _typeof2.default)(selectionAreaClone[indexOfItemToUpdate].point2) === 'object' && selectionAreaClone[indexOfItemToUpdate].areaCreated) {
614
+ selectionAreaClone[indexOfItemToUpdate].point2 = null;
615
+ selectionAreaClone[indexOfItemToUpdate].areaCreated = false;
616
+ removeCellSelections({
617
+ matcher: freshMatcherValue,
618
+ spreadsheetRef: spreadsheetRef
619
+ });
620
+ return selectionAreaClone;
621
+ }
622
+
623
+ return prev;
624
+ });
625
+ }
626
+ }, [spreadsheetRef, removeCellSelections]);
348
627
  (0, _react.useEffect)(function () {
349
- var activeCellPlacementElement = spreadsheetRef === null || spreadsheetRef === void 0 ? void 0 : spreadsheetRef.current.querySelector("[data-row-index=\"".concat(activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row, "\"][data-column-index=\"").concat(activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column, "\"]"));
350
- var shouldPlaceActiveCellInHeader = (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row) === 'header' && true;
351
- var selectAllElement = spreadsheetRef === null || spreadsheetRef === void 0 ? void 0 : spreadsheetRef.current.querySelector("[data-row-index=\"header\"][data-column-index=\"header\"]");
352
-
353
- if (containerHasFocus) {
354
- createActiveCell({
355
- placementElement: activeCellCoordinates ? activeCellPlacementElement : selectAllElement,
356
- coords: activeCellCoordinates,
357
- addToHeader: shouldPlaceActiveCellInHeader
628
+ if (isEditing) {
629
+ var _rows$activeCellCoord, _cellProps$column, _cellEditorRef$curren;
630
+
631
+ 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];
632
+ var activeCellLeftPosition = activeCellRef === null || activeCellRef === void 0 ? void 0 : activeCellRef.current.style.left;
633
+ var activeCellTopPosition = activeCellRef === null || activeCellRef === void 0 ? void 0 : activeCellRef.current.style.top;
634
+ cellEditorRef.current.style.left = activeCellLeftPosition;
635
+ cellEditorRef.current.style.top = activeCellTopPosition;
636
+ cellEditorRef.current.style.display = 'block';
637
+ cellEditorRef.current.style.width = activeCellRef === null || activeCellRef === void 0 ? void 0 : activeCellRef.current.style.width;
638
+ cellEditorRef.current.style.height = activeCellRef === null || activeCellRef === void 0 ? void 0 : activeCellRef.current.style.height;
639
+ cellEditorRef.current.style.paddingTop = "".concat((parseInt(activeCellRef === null || activeCellRef === void 0 ? void 0 : activeCellRef.current.style.height) - 16) / 2, "px"); // calculate paddingTop based on cellHeight which could be variable depending on the cellSize prop
640
+
641
+ 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';
642
+ (_cellEditorRef$curren = cellEditorRef.current) === null || _cellEditorRef$curren === void 0 ? void 0 : _cellEditorRef$curren.focus();
643
+ }
644
+
645
+ if (!isEditing) {
646
+ cellEditorRef.current.style.display = 'none';
647
+ cellEditorRef.current.blur();
648
+ activeCellRef.current.focus();
649
+ }
650
+ }, [isEditing, activeCellCoordinates, rows]);
651
+
652
+ var handleKeyUp = function handleKeyUp(event) {
653
+ var _activeKeys$current3;
654
+
655
+ var key = event.key; // Remove key from active keys array on key up
656
+
657
+ if ((_activeKeys$current3 = activeKeys.current) !== null && _activeKeys$current3 !== void 0 && _activeKeys$current3.includes(key)) {
658
+ var activeKeysClone = (0, _toConsumableArray2.default)(activeKeys.current);
659
+ var filteredKeysClone = activeKeysClone.filter(function (item) {
660
+ return item !== key;
358
661
  });
662
+ activeKeys.current = filteredKeysClone;
359
663
  }
360
- }, [activeCellCoordinates, spreadsheetRef, createActiveCell, containerHasFocus]);
361
- var localRef = (0, _react.useRef)();
362
- var spreadsheetRef = ref || localRef;
664
+ };
665
+
363
666
  return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({}, rest, getTableProps(), (0, _devtools.getDevtoolsProps)(componentName), {
364
667
  className: (0, _classnames.default)(blockClass, className, (0, _defineProperty2.default)({}, "".concat(blockClass, "__container-has-focus"), containerHasFocus)),
365
668
  ref: spreadsheetRef,
@@ -368,14 +671,32 @@ var DataSpreadsheet = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref
368
671
  "aria-rowcount": (rows === null || rows === void 0 ? void 0 : rows.length) || 0,
369
672
  "aria-colcount": (columns === null || columns === void 0 ? void 0 : columns.length) || 0,
370
673
  onKeyDown: handleKeyPress,
674
+ onKeyUp: handleKeyUp,
371
675
  onFocus: function onFocus() {
372
676
  return setContainerHasFocus(true);
373
677
  }
374
678
  }), /*#__PURE__*/_react.default.createElement(_DataSpreadsheetHeader.DataSpreadsheetHeader, {
679
+ ref: spreadsheetRef,
680
+ activeCellCoordinates: activeCellCoordinates,
375
681
  cellSizeValue: cellSizeValue,
682
+ columns: columns,
376
683
  defaultColumn: defaultColumn,
377
- headerGroups: headerGroups
684
+ headerGroups: headerGroups,
685
+ rows: rows,
686
+ selectionAreas: selectionAreas,
687
+ setActiveCellCoordinates: setActiveCellCoordinates,
688
+ setSelectionAreas: setSelectionAreas,
689
+ setCurrentMatcher: setCurrentMatcher
378
690
  }), /*#__PURE__*/_react.default.createElement(_DataSpreadsheetBody.DataSpreadsheetBody, {
691
+ activeCellCoordinates: activeCellCoordinates,
692
+ ref: spreadsheetRef,
693
+ clickAndHoldActive: clickAndHoldActive,
694
+ setClickAndHoldActive: setClickAndHoldActive,
695
+ currentMatcher: currentMatcher,
696
+ setCurrentMatcher: setCurrentMatcher,
697
+ setContainerHasFocus: setContainerHasFocus,
698
+ selectionAreas: selectionAreas,
699
+ setSelectionAreas: setSelectionAreas,
379
700
  cellSize: cellSize,
380
701
  defaultColumn: defaultColumn,
381
702
  getTableBodyProps: getTableBodyProps,
@@ -385,7 +706,25 @@ var DataSpreadsheet = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref
385
706
  setActiveCellCoordinates: setActiveCellCoordinates,
386
707
  scrollBarSize: scrollBarSize,
387
708
  totalColumnsWidth: totalColumnsWidth,
388
- id: id
709
+ id: id,
710
+ columns: columns
711
+ }), /*#__PURE__*/_react.default.createElement("button", {
712
+ onKeyDown: handleActiveCellKeyDown,
713
+ onMouseEnter: handleActiveCellMouseEnter,
714
+ onDoubleClick: handleActiveCellDoubleClick,
715
+ ref: activeCellRef,
716
+ className: (0, _classnames.default)("".concat(blockClass, "--interactive-cell-element"), "".concat(blockClass, "__active-cell--highlight")),
717
+ type: "button"
718
+ }), /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.TextArea, {
719
+ value: cellEditorValue,
720
+ onKeyDown: handleEditSubmit,
721
+ onChange: function onChange(event) {
722
+ return setCellEditorValue(event.target.value);
723
+ },
724
+ ref: cellEditorRef,
725
+ labelText: "",
726
+ "aria-labelledby": activeCellCoordinates ? "[data-row-index=\"".concat(activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row, "\"][data-column-index=\"").concat(activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column, "\"]") : null,
727
+ className: (0, _classnames.default)("".concat(blockClass, "__cell-editor"), "".concat(blockClass, "--interactive-cell-element"), "".concat(blockClass, "__cell-editor--").concat(cellSize), (0, _defineProperty2.default)({}, "".concat(blockClass, "__cell-editor--active"), isEditing))
389
728
  }));
390
729
  }); // Return a placeholder if not released and not enabled by feature flag
391
730
 
@@ -432,7 +771,12 @@ DataSpreadsheet.propTypes = {
432
771
  /**
433
772
  * The event handler that is called when the active cell changes
434
773
  */
435
- onActiveCellChange: _propTypes.default.func
774
+ onActiveCellChange: _propTypes.default.func,
775
+
776
+ /**
777
+ * The setter fn for the data prop
778
+ */
779
+ onDataUpdate: _propTypes.default.func
436
780
  /* TODO: add types and DocGen for all props. */
437
781
 
438
782
  };