@carbon/ibm-products 1.9.0 → 1.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. package/css/index-full-carbon.css +123 -5628
  2. package/css/index-full-carbon.css.map +1 -1
  3. package/css/index-full-carbon.min.css +4 -4
  4. package/css/index-full-carbon.min.css.map +1 -1
  5. package/css/index-without-carbon-released-only.css +45 -3424
  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 +91 -3894
  10. package/css/index-without-carbon.css.map +1 -1
  11. package/css/index-without-carbon.min.css +4 -4
  12. package/css/index-without-carbon.min.css.map +1 -1
  13. package/css/index.css +91 -3895
  14. package/css/index.css.map +1 -1
  15. package/css/index.min.css +4 -4
  16. package/css/index.min.css.map +1 -1
  17. package/es/components/AddSelect/AddSelect.js +11 -6
  18. package/es/components/AddSelect/AddSelectColumn.js +44 -7
  19. package/es/components/ButtonMenu/ButtonMenu.js +1 -1
  20. package/es/components/DataSpreadsheet/DataSpreadsheet.js +316 -133
  21. package/es/components/DataSpreadsheet/DataSpreadsheetBody.js +113 -69
  22. package/es/components/DataSpreadsheet/DataSpreadsheetHeader.js +22 -5
  23. package/es/components/DataSpreadsheet/checkActiveHeaderCell.js +34 -0
  24. package/es/components/DataSpreadsheet/createActiveCellFn.js +3 -1
  25. package/es/components/InlineEdit/InlineEdit.js +11 -21
  26. package/es/components/OptionsTile/OptionsTile.js +11 -1
  27. package/es/components/PageHeader/PageHeader.js +48 -40
  28. package/es/components/PageHeader/PageHeaderUtils.js +3 -7
  29. package/es/components/TagSet/TagSet.js +12 -3
  30. package/es/components/UserProfileImage/UserProfileImage.js +2 -1
  31. package/lib/components/AddSelect/AddSelect.js +11 -6
  32. package/lib/components/AddSelect/AddSelectColumn.js +55 -13
  33. package/lib/components/ButtonMenu/ButtonMenu.js +1 -1
  34. package/lib/components/DataSpreadsheet/DataSpreadsheet.js +317 -134
  35. package/lib/components/DataSpreadsheet/DataSpreadsheetBody.js +112 -70
  36. package/lib/components/DataSpreadsheet/DataSpreadsheetHeader.js +24 -5
  37. package/lib/components/DataSpreadsheet/checkActiveHeaderCell.js +45 -0
  38. package/lib/components/DataSpreadsheet/createActiveCellFn.js +3 -1
  39. package/lib/components/InlineEdit/InlineEdit.js +10 -20
  40. package/lib/components/OptionsTile/OptionsTile.js +11 -1
  41. package/lib/components/PageHeader/PageHeader.js +47 -40
  42. package/lib/components/PageHeader/PageHeaderUtils.js +3 -7
  43. package/lib/components/TagSet/TagSet.js +13 -3
  44. package/lib/components/UserProfileImage/UserProfileImage.js +2 -1
  45. package/package.json +14 -14
  46. package/scss/components/AddSelect/_add-select.scss +27 -14
  47. package/scss/components/CreateInfluencer/_create-influencer.scss +2 -0
  48. package/scss/components/CreateModal/_create-modal.scss +1 -0
  49. package/scss/components/CreateTearsheet/_create-tearsheet.scss +1 -0
  50. package/scss/components/CreateTearsheetNarrow/_create-tearsheet-narrow.scss +1 -0
  51. package/scss/components/DataSpreadsheet/_data-spreadsheet.scss +12 -7
  52. package/scss/components/InlineEdit/_inline-edit.scss +20 -11
  53. package/scss/components/InlineEdit/_storybook-styles.scss +1 -0
  54. package/scss/components/LoadingBar/_loading-bar.scss +13 -0
  55. package/scss/components/NotificationsPanel/_notifications-panel.scss +3 -0
  56. package/scss/components/PageHeader/_page-header.scss +2 -0
  57. package/scss/components/SidePanel/_side-panel.scss +11 -4
  58. package/scss/components/StatusIcon/_status-icon.scss +1 -0
  59. package/scss/components/UserProfileImage/_user-profile-image.scss +9 -0
  60. package/scss/components/WebTerminal/_web-terminal.scss +2 -0
@@ -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,8 +11,12 @@ 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
+
14
16
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
17
 
18
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
19
+
16
20
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
17
21
 
18
22
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
@@ -41,11 +45,15 @@ var _hooks = require("../../global/js/hooks");
41
45
 
42
46
  var _createActiveCellFn = require("./createActiveCellFn");
43
47
 
48
+ var _deepCloneObject = require("../../global/js/utils/deepCloneObject");
49
+
50
+ var _uuidv = _interopRequireDefault(require("../../global/js/utils/uuidv4"));
51
+
44
52
  var _excluded = ["cellSize", "className", "columns", "data", "id", "onActiveCellChange"];
45
53
 
46
54
  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
55
 
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; }
56
+ 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
57
 
50
58
  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
59
 
@@ -98,12 +106,17 @@ var DataSpreadsheet = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref
98
106
  clickAndHoldActive = _useState8[0],
99
107
  setClickAndHoldActive = _useState8[1];
100
108
 
101
- var _useState9 = (0, _react.useState)(null),
109
+ var _useState9 = (0, _react.useState)(''),
102
110
  _useState10 = (0, _slicedToArray2.default)(_useState9, 2),
103
111
  currentMatcher = _useState10[0],
104
112
  setCurrentMatcher = _useState10[1];
105
113
 
114
+ var previousState = (0, _hooks.usePreviousValue)({
115
+ activeCellCoordinates: activeCellCoordinates
116
+ });
106
117
  var cellSizeValue = (0, _getCellSize.getCellSize)(cellSize);
118
+ var currentMatcherRef = (0, _react.useRef)();
119
+ var activeKeys = (0, _react.useRef)([]);
107
120
  var defaultColumn = (0, _react.useMemo)(function () {
108
121
  return {
109
122
  width: 150,
@@ -132,6 +145,7 @@ var DataSpreadsheet = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref
132
145
  if (!focusedElement.classList.contains("".concat(blockClass, "--interactive-cell-element"))) {
133
146
  setContainerHasFocus(false);
134
147
  removeActiveCell();
148
+ activeKeys.current = [];
135
149
  }
136
150
 
137
151
  if (focusedElement.classList.contains(blockClass) || focusedElement.classList.contains("".concat(blockClass, "--interactive-cell-element"))) {
@@ -147,11 +161,19 @@ var DataSpreadsheet = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref
147
161
  }
148
162
  }, [spreadsheetRef]); // Removes the cell selection elements
149
163
 
150
- var removeCellSelections = (0, _react.useCallback)(function () {
151
- var cellSelections = spreadsheetRef.current.querySelectorAll(".".concat(blockClass, "__selection-area--element"));
152
- Array.from(cellSelections).forEach(function (element) {
153
- return element.remove();
154
- });
164
+ var removeCellSelections = (0, _react.useCallback)(function (matcher) {
165
+ if (matcher && typeof matcher === 'string') {
166
+ var selectionToRemove = spreadsheetRef.current.querySelector("[data-matcher-id=\"".concat(matcher, "\"]"));
167
+
168
+ if (selectionToRemove) {
169
+ selectionToRemove.remove();
170
+ }
171
+ } else {
172
+ var cellSelections = spreadsheetRef.current.querySelectorAll(".".concat(blockClass, "__selection-area--element"));
173
+ (0, _toConsumableArray2.default)(cellSelections).forEach(function (element) {
174
+ return element.remove();
175
+ });
176
+ }
155
177
  }, [spreadsheetRef]); // Click outside useEffect
156
178
 
157
179
  (0, _react.useEffect)(function () {
@@ -160,11 +182,12 @@ var DataSpreadsheet = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref
160
182
  return;
161
183
  }
162
184
 
185
+ setActiveCellCoordinates(null);
163
186
  setSelectionAreas([]);
164
187
  removeActiveCell();
165
188
  removeCellSelections();
166
189
  setContainerHasFocus(false);
167
- setActiveCellCoordinates(null);
190
+ activeKeys.current = [];
168
191
  };
169
192
 
170
193
  document.addEventListener('click', handleOutsideClick);
@@ -179,16 +202,26 @@ var DataSpreadsheet = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref
179
202
  addToHeader = _ref2$addToHeader === void 0 ? false : _ref2$addToHeader;
180
203
  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;
181
204
  var activeCellValue = activeCellFullData ? Object.values(activeCellFullData.row.values)[coords === null || coords === void 0 ? void 0 : coords.column] : null;
182
- (0, _createActiveCellFn.createActiveCellFn)({
183
- placementElement: placementElement,
184
- coords: coords,
185
- addToHeader: addToHeader,
186
- contextRef: spreadsheetRef,
187
- blockClass: blockClass,
188
- onActiveCellChange: onActiveCellChange,
189
- activeCellValue: activeCellValue
190
- });
191
- }, [spreadsheetRef, rows, onActiveCellChange]);
205
+
206
+ var handleActiveCellMouseEnter = function handleActiveCellMouseEnter() {
207
+ handleActiveCellMouseEnterCallback(selectionAreas, clickAndHoldActive);
208
+ };
209
+
210
+ var prevCoords = previousState === null || previousState === void 0 ? void 0 : previousState.activeCellCoordinates; // Only create an active cell if the activeCellCoordinates have changed
211
+
212
+ 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)) {
213
+ (0, _createActiveCellFn.createActiveCellFn)({
214
+ placementElement: placementElement,
215
+ coords: coords,
216
+ addToHeader: addToHeader,
217
+ contextRef: spreadsheetRef,
218
+ blockClass: blockClass,
219
+ onActiveCellChange: onActiveCellChange,
220
+ activeCellValue: activeCellValue,
221
+ handleActiveCellMouseEnter: handleActiveCellMouseEnter
222
+ });
223
+ }
224
+ }, [spreadsheetRef, rows, onActiveCellChange, clickAndHoldActive, handleActiveCellMouseEnterCallback, selectionAreas, previousState === null || previousState === void 0 ? void 0 : previousState.activeCellCoordinates]);
192
225
  var handleInitialArrowPress = (0, _react.useCallback)(function () {
193
226
  // If activeCellCoordinates is null then we need to set an initial value
194
227
  // which will place the activeCell on the select all cell/button
@@ -201,182 +234,312 @@ var DataSpreadsheet = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref
201
234
 
202
235
  return;
203
236
  }, [activeCellCoordinates]);
204
-
205
- var updateActiveCellCoordinates = function updateActiveCellCoordinates(_ref3) {
237
+ var updateActiveCellCoordinates = (0, _react.useCallback)(function (_ref3) {
206
238
  var coords = _ref3.coords,
207
239
  updatedValue = _ref3.updatedValue;
208
- setActiveCellCoordinates(_objectSpread(_objectSpread({}, coords), updatedValue));
209
- };
210
240
 
241
+ var newActiveCell = _objectSpread(_objectSpread({}, coords), updatedValue);
242
+
243
+ setActiveCellCoordinates(newActiveCell); // Only run if the active cell is _not_ a header cell. This will add a point1 object
244
+ // to selectionAreas every time the active cell changes, allowing us to create cell
245
+ // selections using keyboard
246
+
247
+ if (newActiveCell.row !== 'header' && newActiveCell.column !== 'header') {
248
+ var tempMatcher = (0, _uuidv.default)();
249
+ setSelectionAreas([{
250
+ point1: newActiveCell,
251
+ matcher: tempMatcher
252
+ }]);
253
+ setCurrentMatcher(tempMatcher);
254
+ }
255
+ }, []);
256
+ var handleMultipleKeys = (0, _react.useCallback)(function () {
257
+ var _selectionAreasClone$;
258
+
259
+ var activeKeyValues = activeKeys.current;
260
+ var selectionAreasClone = (0, _deepCloneObject.deepCloneObject)(selectionAreas);
261
+ var indexOfCurrentArea = selectionAreasClone.findIndex(function (item) {
262
+ return item.matcher === currentMatcher;
263
+ });
264
+ var pointToUpdate = (_selectionAreasClone$ = selectionAreasClone[indexOfCurrentArea]) !== null && _selectionAreasClone$ !== void 0 && _selectionAreasClone$.point2 ? selectionAreasClone[indexOfCurrentArea].point2 : selectionAreasClone[indexOfCurrentArea].point1; // Down + Shift
265
+
266
+ if (activeKeyValues.includes('Shift') && activeKeyValues.includes('ArrowDown')) {
267
+ if (rows.length - 1 === pointToUpdate.row) {
268
+ return;
269
+ }
270
+
271
+ var newPoint = {
272
+ row: pointToUpdate.row + 1,
273
+ column: pointToUpdate.column
274
+ };
275
+ selectionAreasClone[indexOfCurrentArea].point2 = newPoint;
276
+ selectionAreasClone[indexOfCurrentArea].areaCreated = false;
277
+ setSelectionAreas(selectionAreasClone);
278
+ } // Right + Shift
279
+
280
+
281
+ if (activeKeyValues.includes('Shift') && activeKeyValues.includes('ArrowRight')) {
282
+ if (columns.length - 1 === pointToUpdate.column) {
283
+ return;
284
+ }
285
+
286
+ var _newPoint = {
287
+ row: pointToUpdate.row,
288
+ column: pointToUpdate.column + 1
289
+ };
290
+ selectionAreasClone[indexOfCurrentArea].point2 = _newPoint;
291
+ selectionAreasClone[indexOfCurrentArea].areaCreated = false;
292
+ setSelectionAreas(selectionAreasClone);
293
+ } // Up + Shift
294
+
295
+
296
+ if (activeKeyValues.includes('Shift') && activeKeyValues.includes('ArrowUp')) {
297
+ if (pointToUpdate.row === 0) {
298
+ return;
299
+ }
300
+
301
+ var _newPoint2 = {
302
+ row: pointToUpdate.row - 1,
303
+ column: pointToUpdate.column
304
+ };
305
+ selectionAreasClone[indexOfCurrentArea].point2 = _newPoint2;
306
+ selectionAreasClone[indexOfCurrentArea].areaCreated = false;
307
+ setSelectionAreas(selectionAreasClone);
308
+ } // Left + Shift
309
+
310
+
311
+ if (activeKeyValues.includes('Shift') && activeKeyValues.includes('ArrowLeft')) {
312
+ if (pointToUpdate.column === 0) {
313
+ return;
314
+ }
315
+
316
+ var _newPoint3 = {
317
+ row: pointToUpdate.row,
318
+ column: pointToUpdate.column - 1
319
+ };
320
+ selectionAreasClone[indexOfCurrentArea].point2 = _newPoint3;
321
+ selectionAreasClone[indexOfCurrentArea].areaCreated = false;
322
+ setSelectionAreas(selectionAreasClone);
323
+ }
324
+ }, [selectionAreas, currentMatcher, columns, rows]);
211
325
  var handleKeyPress = (0, _react.useCallback)(function (event) {
212
- var keyCode = event.keyCode; // Command keys need to be returned as there is default browser behavior with these keys
326
+ var _activeKeys$current, _activeKeys$current2;
327
+
328
+ var key = event.key; // Command keys need to be returned as there is default browser behavior with these keys
213
329
 
214
- if (keyCode === 91 || keyCode === 93) {
330
+ if (key === 'Meta' || key === 'Control') {
215
331
  return;
216
332
  } // Prevent arrow keys, home key, and end key from scrolling the page when the data spreadsheet container has focus
217
333
 
218
334
 
219
- if ([35, 36, 37, 38, 39, 40].indexOf(keyCode) > -1) {
335
+ if (['End', 'Home', 'ArrowLeft', 'ArrowUp', 'ArrowRight', 'ArrowDown'].indexOf(key) > -1) {
220
336
  event.preventDefault();
221
- } // Clear out all cell selection areas if user uses any arrow key
337
+ } // Clear out all cell selection areas if user uses any arrow key, except if the shift key is being held
222
338
 
223
339
 
224
- if ([37, 38, 39, 40].indexOf(keyCode) > -1) {
225
- if (selectionAreas !== null && selectionAreas !== void 0 && selectionAreas.length) {
340
+ if (['ArrowLeft', 'ArrowUp', 'ArrowRight', 'ArrowDown'].indexOf(key) > -1) {
341
+ if (selectionAreas !== null && selectionAreas !== void 0 && selectionAreas.length && key !== 'Shift' && !activeKeys.current.includes('Shift')) {
226
342
  setSelectionAreas([]);
227
343
  removeCellSelections();
228
344
  }
345
+ } // Update list of activeKeys
346
+
347
+
348
+ if (!((_activeKeys$current = activeKeys.current) !== null && _activeKeys$current !== void 0 && _activeKeys$current.includes(key))) {
349
+ var activeClone = (0, _toConsumableArray2.default)(activeKeys.current);
350
+ activeKeys.current = [].concat((0, _toConsumableArray2.default)(activeClone), [key]);
229
351
  }
230
352
 
231
- switch (keyCode) {
232
- // Tab
233
- case 9:
234
- {
235
- setSelectionAreas([]);
236
- removeActiveCell();
237
- setContainerHasFocus(false);
238
- setActiveCellCoordinates(null);
239
- break;
240
- }
241
- // Left
353
+ if (((_activeKeys$current2 = activeKeys.current) === null || _activeKeys$current2 === void 0 ? void 0 : _activeKeys$current2.length) > 1) {
354
+ handleMultipleKeys();
355
+ } // Allow arrow key navigation if there are less than two activeKeys OR
356
+ // if one of the activeCellCoordinates is in a header position
357
+
358
+
359
+ if (!activeKeys.current.includes('Shift') || activeCellCoordinates.row === 'header' || activeCellCoordinates.column === 'header') {
360
+ switch (key) {
361
+ // Tab
362
+ case 'Tab':
363
+ {
364
+ setSelectionAreas([]);
365
+ removeActiveCell();
366
+ setContainerHasFocus(false);
367
+ setActiveCellCoordinates(null);
368
+ break;
369
+ }
370
+ // Left
242
371
 
243
- case 37:
244
- {
245
- handleInitialArrowPress();
372
+ case 'ArrowLeft':
373
+ {
374
+ handleInitialArrowPress();
246
375
 
247
- var coordinatesClone = _objectSpread({}, activeCellCoordinates);
376
+ var coordinatesClone = _objectSpread({}, activeCellCoordinates);
248
377
 
249
- if (coordinatesClone.column === 'header') {
250
- return;
251
- }
378
+ if (coordinatesClone.column === 'header') {
379
+ return;
380
+ }
381
+
382
+ if (typeof coordinatesClone.column === 'number') {
383
+ if (coordinatesClone.column === 0) {
384
+ updateActiveCellCoordinates({
385
+ coords: coordinatesClone,
386
+ updatedValue: {
387
+ column: 'header'
388
+ }
389
+ });
390
+ return;
391
+ }
252
392
 
253
- if (typeof coordinatesClone.column === 'number') {
254
- if (coordinatesClone.column === 0) {
255
393
  updateActiveCellCoordinates({
256
394
  coords: coordinatesClone,
257
395
  updatedValue: {
258
- column: 'header'
396
+ column: coordinatesClone.column - 1
259
397
  }
260
398
  });
261
- return;
262
399
  }
263
400
 
264
- updateActiveCellCoordinates({
265
- coords: coordinatesClone,
266
- updatedValue: {
267
- column: coordinatesClone.column - 1
268
- }
269
- });
401
+ break;
270
402
  }
403
+ // Up
271
404
 
272
- break;
273
- }
274
- // Up
405
+ case 'ArrowUp':
406
+ {
407
+ handleInitialArrowPress();
275
408
 
276
- case 38:
277
- {
278
- handleInitialArrowPress();
409
+ var _coordinatesClone = _objectSpread({}, activeCellCoordinates);
279
410
 
280
- var _coordinatesClone = _objectSpread({}, activeCellCoordinates);
411
+ if (_coordinatesClone.row === 'header') {
412
+ return;
413
+ }
414
+
415
+ if (typeof _coordinatesClone.row === 'number') {
416
+ // set row back to header if we are at index 0
417
+ if (_coordinatesClone.row === 0) {
418
+ updateActiveCellCoordinates({
419
+ coords: _coordinatesClone,
420
+ updatedValue: {
421
+ row: 'header'
422
+ }
423
+ });
424
+ return;
425
+ } // if we are at any other index than 0, subtract 1 from current row index
281
426
 
282
- if (_coordinatesClone.row === 'header') {
283
- return;
284
- }
285
427
 
286
- if (typeof _coordinatesClone.row === 'number') {
287
- // set row back to header if we are at index 0
288
- if (_coordinatesClone.row === 0) {
289
428
  updateActiveCellCoordinates({
290
429
  coords: _coordinatesClone,
291
430
  updatedValue: {
292
- row: 'header'
431
+ row: _coordinatesClone.row - 1
293
432
  }
294
433
  });
295
- return;
296
- } // if we are at any other index than 0, subtract 1 from current row index
297
-
434
+ }
298
435
 
299
- updateActiveCellCoordinates({
300
- coords: _coordinatesClone,
301
- updatedValue: {
302
- row: _coordinatesClone.row - 1
303
- }
304
- });
436
+ break;
305
437
  }
438
+ // Right
306
439
 
307
- break;
308
- }
309
- // Right
440
+ case 'ArrowRight':
441
+ {
442
+ handleInitialArrowPress();
310
443
 
311
- case 39:
312
- {
313
- handleInitialArrowPress();
444
+ var _coordinatesClone2 = _objectSpread({}, activeCellCoordinates);
314
445
 
315
- var _coordinatesClone2 = _objectSpread({}, activeCellCoordinates);
446
+ if (_coordinatesClone2.column === 'header') {
447
+ updateActiveCellCoordinates({
448
+ coords: _coordinatesClone2,
449
+ updatedValue: {
450
+ column: 0
451
+ }
452
+ });
453
+ }
316
454
 
317
- if (_coordinatesClone2.column === 'header') {
318
- updateActiveCellCoordinates({
319
- coords: _coordinatesClone2,
320
- updatedValue: {
321
- column: 0
455
+ if (typeof _coordinatesClone2.column === 'number') {
456
+ // Prevent active cell coordinates from updating if the active
457
+ // cell is in the last column, ie we can't go any further to the right
458
+ if (columns.length - 1 === _coordinatesClone2.column) {
459
+ return;
322
460
  }
323
- });
324
- }
325
461
 
326
- if (typeof _coordinatesClone2.column === 'number') {
327
- // Prevent active cell coordinates from updating if the active
328
- // cell is in the last column, ie we can't go any further to the right
329
- if (columns.length - 1 === _coordinatesClone2.column) {
330
- return;
462
+ updateActiveCellCoordinates({
463
+ coords: _coordinatesClone2,
464
+ updatedValue: {
465
+ column: _coordinatesClone2.column + 1
466
+ }
467
+ });
331
468
  }
332
469
 
333
- updateActiveCellCoordinates({
334
- coords: _coordinatesClone2,
335
- updatedValue: {
336
- column: _coordinatesClone2.column + 1
337
- }
338
- });
470
+ break;
339
471
  }
472
+ // Down
340
473
 
341
- break;
342
- }
343
- // Down
474
+ case 'ArrowDown':
475
+ {
476
+ handleInitialArrowPress();
344
477
 
345
- case 40:
346
- {
347
- handleInitialArrowPress();
478
+ var _coordinatesClone3 = _objectSpread({}, activeCellCoordinates);
348
479
 
349
- var _coordinatesClone3 = _objectSpread({}, activeCellCoordinates);
480
+ if (_coordinatesClone3.row === 'header') {
481
+ updateActiveCellCoordinates({
482
+ coords: _coordinatesClone3,
483
+ updatedValue: {
484
+ row: 0
485
+ }
486
+ });
487
+ }
350
488
 
351
- if (_coordinatesClone3.row === 'header') {
352
- updateActiveCellCoordinates({
353
- coords: _coordinatesClone3,
354
- updatedValue: {
355
- row: 0
489
+ if (typeof _coordinatesClone3.row === 'number') {
490
+ // Prevent active cell coordinates from updating if the active
491
+ // cell is in the last row, ie we can't go any further down since
492
+ // we are in the last row
493
+ if (rows.length - 1 === _coordinatesClone3.row) {
494
+ return;
356
495
  }
357
- });
358
- }
359
496
 
360
- if (typeof _coordinatesClone3.row === 'number') {
361
- // Prevent active cell coordinates from updating if the active
362
- // cell is in the last row, ie we can't go any further down since
363
- // we are in the last row
364
- if (rows.length - 1 === _coordinatesClone3.row) {
365
- return;
497
+ updateActiveCellCoordinates({
498
+ coords: _coordinatesClone3,
499
+ updatedValue: {
500
+ row: _coordinatesClone3.row + 1
501
+ }
502
+ });
366
503
  }
367
504
 
368
- updateActiveCellCoordinates({
369
- coords: _coordinatesClone3,
370
- updatedValue: {
371
- row: _coordinatesClone3.row + 1
372
- }
373
- });
505
+ break;
374
506
  }
507
+ }
508
+ }
509
+ }, [updateActiveCellCoordinates, handleInitialArrowPress, handleMultipleKeys, activeCellCoordinates, selectionAreas === null || selectionAreas === void 0 ? void 0 : selectionAreas.length, removeCellSelections, removeActiveCell, columns.length, rows.length]); // Only update if there are cell selection areas
510
+ // Find point object that matches currentMatcher and remove the second point
511
+ // because hovering over the active cell while clicking and holding should
512
+ // remove the previously existing selection area
375
513
 
376
- break;
514
+ var handleActiveCellMouseEnterCallback = (0, _react.useCallback)(function (areas, clickHold) {
515
+ var freshMatcherValue = currentMatcherRef.current;
516
+
517
+ if (!freshMatcherValue) {
518
+ return;
519
+ }
520
+
521
+ if (areas && areas.length && clickHold && freshMatcherValue) {
522
+ setSelectionAreas(function (prev) {
523
+ var selectionAreaClone = (0, _deepCloneObject.deepCloneObject)(prev);
524
+ var indexOfItemToUpdate = selectionAreaClone.findIndex(function (item) {
525
+ return item.matcher === freshMatcherValue;
526
+ });
527
+
528
+ if (indexOfItemToUpdate === -1) {
529
+ return prev;
530
+ }
531
+
532
+ if ((0, _typeof2.default)(selectionAreaClone[indexOfItemToUpdate].point2) === 'object' && selectionAreaClone[indexOfItemToUpdate].areaCreated) {
533
+ selectionAreaClone[indexOfItemToUpdate].point2 = null;
534
+ selectionAreaClone[indexOfItemToUpdate].areaCreated = false;
535
+ removeCellSelections(freshMatcherValue);
536
+ return selectionAreaClone;
377
537
  }
538
+
539
+ return prev;
540
+ });
378
541
  }
379
- }, [handleInitialArrowPress, activeCellCoordinates, selectionAreas === null || selectionAreas === void 0 ? void 0 : selectionAreas.length, removeCellSelections, removeActiveCell, columns.length, rows.length]); // Adds active cell highlight to correct cell onKeyDown
542
+ }, [removeCellSelections]); // Adds active cell highlight to correct cell onKeyDown
380
543
 
381
544
  (0, _react.useEffect)(function () {
382
545
  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, "\"]"));
@@ -391,6 +554,21 @@ var DataSpreadsheet = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref
391
554
  });
392
555
  }
393
556
  }, [activeCellCoordinates, spreadsheetRef, createActiveCell, containerHasFocus]);
557
+
558
+ var handleKeyUp = function handleKeyUp(event) {
559
+ var _activeKeys$current3;
560
+
561
+ var key = event.key; // Remove key from active keys array on key up
562
+
563
+ if ((_activeKeys$current3 = activeKeys.current) !== null && _activeKeys$current3 !== void 0 && _activeKeys$current3.includes(key)) {
564
+ var activeKeysClone = (0, _toConsumableArray2.default)(activeKeys.current);
565
+ var filteredKeysClone = activeKeysClone.filter(function (item) {
566
+ return item !== key;
567
+ });
568
+ activeKeys.current = filteredKeysClone;
569
+ }
570
+ };
571
+
394
572
  var localRef = (0, _react.useRef)();
395
573
  var spreadsheetRef = ref || localRef;
396
574
  return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({}, rest, getTableProps(), (0, _devtools.getDevtoolsProps)(componentName), {
@@ -401,14 +579,19 @@ var DataSpreadsheet = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref
401
579
  "aria-rowcount": (rows === null || rows === void 0 ? void 0 : rows.length) || 0,
402
580
  "aria-colcount": (columns === null || columns === void 0 ? void 0 : columns.length) || 0,
403
581
  onKeyDown: handleKeyPress,
582
+ onKeyUp: handleKeyUp,
404
583
  onFocus: function onFocus() {
405
584
  return setContainerHasFocus(true);
406
585
  }
407
586
  }), /*#__PURE__*/_react.default.createElement(_DataSpreadsheetHeader.DataSpreadsheetHeader, {
587
+ activeCellCoordinates: activeCellCoordinates,
408
588
  cellSizeValue: cellSizeValue,
409
589
  defaultColumn: defaultColumn,
410
- headerGroups: headerGroups
590
+ headerGroups: headerGroups,
591
+ selectionAreas: selectionAreas
411
592
  }), /*#__PURE__*/_react.default.createElement(_DataSpreadsheetBody.DataSpreadsheetBody, {
593
+ activeCellCoordinates: activeCellCoordinates,
594
+ ref: currentMatcherRef,
412
595
  clickAndHoldActive: clickAndHoldActive,
413
596
  setClickAndHoldActive: setClickAndHoldActive,
414
597
  currentMatcher: currentMatcher,