@carbon/ibm-products 1.11.2 → 1.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. package/README.md +0 -3
  2. package/css/index-full-carbon.css +1387 -358
  3. package/css/index-full-carbon.css.map +1 -1
  4. package/css/index-full-carbon.min.css +2 -2
  5. package/css/index-full-carbon.min.css.map +1 -1
  6. package/css/index-without-carbon-released-only.css +1 -0
  7. package/css/index-without-carbon-released-only.css.map +1 -1
  8. package/css/index-without-carbon-released-only.min.css +1 -1
  9. package/css/index-without-carbon-released-only.min.css.map +1 -1
  10. package/css/index-without-carbon.css +51 -5
  11. package/css/index-without-carbon.css.map +1 -1
  12. package/css/index-without-carbon.min.css +2 -2
  13. package/css/index-without-carbon.min.css.map +1 -1
  14. package/css/index.css +51 -5
  15. package/css/index.css.map +1 -1
  16. package/css/index.min.css +2 -2
  17. package/css/index.min.css.map +1 -1
  18. package/es/components/AddSelect/AddSelect.js +63 -12
  19. package/es/components/AddSelect/AddSelectColumn.js +0 -1
  20. package/es/components/AddSelect/AddSelectList.js +33 -13
  21. package/es/components/DataSpreadsheet/DataSpreadsheet.js +107 -89
  22. package/es/components/DataSpreadsheet/DataSpreadsheetBody.js +93 -20
  23. package/es/components/DataSpreadsheet/DataSpreadsheetHeader.js +50 -2
  24. package/es/components/DataSpreadsheet/utils/handleHeaderCellSelection.js +3 -1
  25. package/es/components/ImportModal/ImportModal.js +2 -2
  26. package/es/components/UserProfileImage/UserProfileImage.js +1 -1
  27. package/lib/components/AddSelect/AddSelect.js +63 -12
  28. package/lib/components/AddSelect/AddSelectColumn.js +0 -1
  29. package/lib/components/AddSelect/AddSelectList.js +34 -12
  30. package/lib/components/DataSpreadsheet/DataSpreadsheet.js +108 -91
  31. package/lib/components/DataSpreadsheet/DataSpreadsheetBody.js +94 -20
  32. package/lib/components/DataSpreadsheet/DataSpreadsheetHeader.js +52 -7
  33. package/lib/components/DataSpreadsheet/utils/handleHeaderCellSelection.js +3 -1
  34. package/lib/components/ImportModal/ImportModal.js +1 -1
  35. package/lib/components/UserProfileImage/UserProfileImage.js +1 -1
  36. package/package.json +13 -13
  37. package/scss/components/AboutModal/_about-modal.scss +2 -2
  38. package/scss/components/ActionSet/_action-set.scss +3 -1
  39. package/scss/components/AddSelect/_add-select.scss +37 -2
  40. package/scss/components/CreateModal/_create-modal.scss +7 -5
  41. package/scss/components/CreateModal/_storybook-styles.scss +8 -7
  42. package/scss/components/DataSpreadsheet/_data-spreadsheet.scss +21 -3
  43. package/scss/components/ExportModal/_export-modal.scss +3 -3
  44. package/scss/components/InlineEdit/_inline-edit.scss +0 -1
  45. package/scss/components/ModifiedTabs/_modified-tabs.scss +0 -10
  46. package/scss/components/NotificationsPanel/_notifications-panel.scss +3 -3
  47. package/scss/components/OptionsTile/_options-tile.scss +0 -1
  48. package/scss/components/RemoveModal/_remove-modal.scss +3 -3
  49. package/scss/components/TagSet/_tag-set.scss +2 -1
  50. package/scss/components/Tearsheet/_tearsheet.scss +1 -2
@@ -1,3 +1,4 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
1
2
  import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
3
  //
3
4
  // Copyright IBM Corp. 2022
@@ -6,14 +7,15 @@ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
6
7
  // LICENSE file in the root directory of this source tree.
7
8
  //
8
9
  import React from 'react';
9
- import { Checkbox, RadioButton, StructuredListRow, StructuredListWrapper, StructuredListBody, StructuredListCell } from 'carbon-components-react';
10
+ import { Checkbox, RadioButton, StructuredListRow, StructuredListWrapper, StructuredListBody, StructuredListCell, Dropdown } from 'carbon-components-react';
10
11
  import { ChevronRight16 } from '@carbon/icons-react';
11
12
  import PropTypes from 'prop-types';
13
+ import cx from 'classnames';
12
14
  import { pkg } from '../../settings';
13
15
  var componentName = 'AddSelectList';
14
16
  export var AddSelectList = function AddSelectList(_ref) {
15
17
  var filteredItems = _ref.filteredItems,
16
- inColumn = _ref.inColumn,
18
+ modifiers = _ref.modifiers,
17
19
  multi = _ref.multi,
18
20
  multiSelection = _ref.multiSelection,
19
21
  path = _ref.path,
@@ -99,32 +101,50 @@ export var AddSelectList = function AddSelectList(_ref) {
99
101
  }
100
102
  };
101
103
 
104
+ var isSelected = function isSelected(id) {
105
+ return multiSelection.includes(id);
106
+ };
107
+
102
108
  return /*#__PURE__*/React.createElement("div", {
103
109
  className: "".concat(blockClass, "-wrapper")
104
110
  }, /*#__PURE__*/React.createElement(StructuredListWrapper, {
105
111
  selection: true,
106
112
  className: "".concat(blockClass)
107
113
  }, /*#__PURE__*/React.createElement(StructuredListBody, null, filteredItems.map(function (item) {
114
+ var _modifiers$options;
115
+
108
116
  return /*#__PURE__*/React.createElement(StructuredListRow, {
109
117
  key: item.id,
110
- className: "".concat(blockClass, "-row")
118
+ className: cx("".concat(blockClass, "-row"), _defineProperty({}, "".concat(blockClass, "-row-selected"), isSelected(item.id)))
111
119
  }, /*#__PURE__*/React.createElement(StructuredListCell, {
112
120
  className: "".concat(blockClass, "-cell")
113
121
  }, /*#__PURE__*/React.createElement("div", {
114
122
  className: "".concat(blockClass, "-cell-wrapper")
115
- }, multi ? /*#__PURE__*/React.createElement(Checkbox, {
116
- className: "".concat(blockClass, "-checkbox"),
123
+ }, multi ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
124
+ className: "".concat(blockClass, "-checkbox")
125
+ }, /*#__PURE__*/React.createElement(Checkbox, {
117
126
  onChange: function onChange(checked) {
118
127
  return handleMultiSelection(item.id, checked);
119
128
  },
120
- labelText: !inColumn ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("span", {
121
- className: "".concat(blockClass, "-cell-title")
122
- }, item.title), /*#__PURE__*/React.createElement("span", {
123
- className: "".concat(blockClass, "-cell-subtitle")
124
- }, item.subtitle)) : item.title,
129
+ labelText: item.title,
125
130
  id: item.id,
126
- checked: multiSelection.includes(item.id)
127
- }) : /*#__PURE__*/React.createElement(RadioButton, {
131
+ checked: isSelected(item.id),
132
+ className: "".concat(blockClass, "-checkbox-wrapper")
133
+ }), /*#__PURE__*/React.createElement("div", {
134
+ className: "".concat(blockClass, "-checkbox-label-text")
135
+ }, /*#__PURE__*/React.createElement("span", {
136
+ className: "".concat(blockClass, "-cell-title")
137
+ }, item.title), item.subtitle && /*#__PURE__*/React.createElement("span", {
138
+ className: "".concat(blockClass, "-cell-subtitle")
139
+ }, item.subtitle))), (modifiers === null || modifiers === void 0 ? void 0 : (_modifiers$options = modifiers.options) === null || _modifiers$options === void 0 ? void 0 : _modifiers$options.length) && /*#__PURE__*/React.createElement(Dropdown, {
140
+ id: "".concat(item.id, "-modifier"),
141
+ type: "inline",
142
+ items: modifiers === null || modifiers === void 0 ? void 0 : modifiers.options,
143
+ light: true,
144
+ label: modifiers === null || modifiers === void 0 ? void 0 : modifiers.label,
145
+ disabled: !isSelected(item.id),
146
+ className: "".concat(blockClass, "-dropdown")
147
+ })) : /*#__PURE__*/React.createElement(RadioButton, {
128
148
  className: "".concat(blockClass, "-radio"),
129
149
  name: "add-select-selections",
130
150
  id: item.id,
@@ -141,7 +161,7 @@ export var AddSelectList = function AddSelectList(_ref) {
141
161
  };
142
162
  AddSelectList.propTypes = {
143
163
  filteredItems: PropTypes.array,
144
- inColumn: PropTypes.bool,
164
+ modifiers: PropTypes.object,
145
165
  multi: PropTypes.bool,
146
166
  multiSelection: PropTypes.array,
147
167
  path: PropTypes.array,
@@ -1,10 +1,9 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
- import _typeof from "@babel/runtime/helpers/typeof";
3
2
  import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
4
3
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
5
4
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
6
5
  import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
7
- var _excluded = ["cellSize", "className", "columns", "data", "onDataUpdate", "id", "onActiveCellChange"];
6
+ var _excluded = ["cellSize", "className", "columns", "data", "onDataUpdate", "id", "onActiveCellChange", "onSelectionAreaChange"];
8
7
 
9
8
  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; }
10
9
 
@@ -28,9 +27,7 @@ import { DataSpreadsheetBody } from './DataSpreadsheetBody';
28
27
  import { DataSpreadsheetHeader } from './DataSpreadsheetHeader';
29
28
  import { getDevtoolsProps } from '../../global/js/utils/devtools';
30
29
  import { getScrollbarWidth } from '../../global/js/utils/getScrollbarWidth';
31
- import { useActiveElement } from '../../global/js/hooks';
32
- import { deepCloneObject } from '../../global/js/utils/deepCloneObject';
33
- import { usePreviousValue } from '../../global/js/hooks';
30
+ import { useActiveElement, usePreviousValue } from '../../global/js/hooks';
34
31
  import uuidv4 from '../../global/js/utils/uuidv4';
35
32
  import { useResetSpreadsheetFocus } from './hooks/useResetSpreadsheetFocus';
36
33
  import { useSpreadsheetOutsideClick } from './hooks/useSpreadsheetOutsideClick';
@@ -48,7 +45,9 @@ var defaults = {
48
45
  cellSize: 'standard',
49
46
  columns: Object.freeze([]),
50
47
  data: Object.freeze([]),
51
- onDataUpdate: Object.freeze(function () {})
48
+ onDataUpdate: Object.freeze(function () {}),
49
+ onActiveCellChange: Object.freeze(function () {}),
50
+ onSelectionAreaChange: Object.freeze(function () {})
52
51
  };
53
52
  /**
54
53
  * DataSpreadsheet: used to organize and display large amounts of structured data, separated by columns and rows in a grid-like format.
@@ -65,7 +64,10 @@ export var DataSpreadsheet = /*#__PURE__*/React.forwardRef(function (_ref, ref)
65
64
  _ref$onDataUpdate = _ref.onDataUpdate,
66
65
  onDataUpdate = _ref$onDataUpdate === void 0 ? defaults.onDataUpdate : _ref$onDataUpdate,
67
66
  id = _ref.id,
68
- onActiveCellChange = _ref.onActiveCellChange,
67
+ _ref$onActiveCellChan = _ref.onActiveCellChange,
68
+ onActiveCellChange = _ref$onActiveCellChan === void 0 ? defaults.onActiveCellChange : _ref$onActiveCellChan,
69
+ _ref$onSelectionAreaC = _ref.onSelectionAreaChange,
70
+ onSelectionAreaChange = _ref$onSelectionAreaC === void 0 ? defaults.onSelectionAreaChange : _ref$onSelectionAreaC,
69
71
  rest = _objectWithoutProperties(_ref, _excluded);
70
72
 
71
73
  var localRef = useRef();
@@ -87,32 +89,42 @@ export var DataSpreadsheet = /*#__PURE__*/React.forwardRef(function (_ref, ref)
87
89
  selectionAreas = _useState6[0],
88
90
  setSelectionAreas = _useState6[1];
89
91
 
90
- var _useState7 = useState(false),
92
+ var _useState7 = useState([]),
91
93
  _useState8 = _slicedToArray(_useState7, 2),
92
- clickAndHoldActive = _useState8[0],
93
- setClickAndHoldActive = _useState8[1];
94
+ selectionAreaData = _useState8[0],
95
+ setSelectionAreaData = _useState8[1];
94
96
 
95
- var _useState9 = useState(''),
97
+ var _useState9 = useState(false),
96
98
  _useState10 = _slicedToArray(_useState9, 2),
97
- currentMatcher = _useState10[0],
98
- setCurrentMatcher = _useState10[1];
99
+ clickAndHoldActive = _useState10[0],
100
+ setClickAndHoldActive = _useState10[1];
99
101
 
100
- var _useState11 = useState(false),
102
+ var _useState11 = useState(''),
101
103
  _useState12 = _slicedToArray(_useState11, 2),
102
- isEditing = _useState12[0],
103
- setIsEditing = _useState12[1];
104
+ currentMatcher = _useState12[0],
105
+ setCurrentMatcher = _useState12[1];
104
106
 
105
- var _useState13 = useState(''),
107
+ var _useState13 = useState(false),
106
108
  _useState14 = _slicedToArray(_useState13, 2),
107
- cellEditorValue = _useState14[0],
108
- setCellEditorValue = _useState14[1];
109
+ isEditing = _useState14[0],
110
+ setIsEditing = _useState14[1];
111
+
112
+ var _useState15 = useState(''),
113
+ _useState16 = _slicedToArray(_useState15, 2),
114
+ cellEditorValue = _useState16[0],
115
+ setCellEditorValue = _useState16[1];
109
116
 
110
117
  var previousState = usePreviousValue({
111
118
  activeCellCoordinates: activeCellCoordinates
112
119
  });
113
120
  var cellSizeValue = getCellSize(cellSize);
114
121
  var cellEditorRef = useRef();
115
- var currentMatcherRef = useRef();
122
+
123
+ var _useState17 = useState(),
124
+ _useState18 = _slicedToArray(_useState17, 2),
125
+ activeCellContent = _useState18[0],
126
+ setActiveCellContent = _useState18[1];
127
+
116
128
  var activeKeys = useRef([]);
117
129
  var activeCellRef = useRef();
118
130
  var defaultColumn = useMemo(function () {
@@ -189,10 +201,18 @@ export var DataSpreadsheet = /*#__PURE__*/React.forwardRef(function (_ref, ref)
189
201
  removeCellEditor();
190
202
  updateData(prevCoords === null || prevCoords === void 0 ? void 0 : prevCoords.row, cellProps.column.id);
191
203
  }
192
- }, [activeCellCoordinates, previousState === null || previousState === void 0 ? void 0 : previousState.activeCellCoordinates, updateData, rows, isEditing, removeCellEditor]);
193
- var handleActiveCellMouseEnter = useCallback(function () {
194
- handleActiveCellMouseEnterCallback(selectionAreas, clickAndHoldActive);
195
- }, [clickAndHoldActive, selectionAreas, handleActiveCellMouseEnterCallback]);
204
+
205
+ 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)) {
206
+ if (activeCellCoordinates && (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row) !== 'header' && (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column) !== 'header') {
207
+ 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;
208
+ setActiveCellContent(activeCellFullData.render('Cell'));
209
+ }
210
+
211
+ if (activeCellCoordinates && (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row) === 'header' || (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column) === 'header') {
212
+ setActiveCellContent(null);
213
+ }
214
+ }
215
+ }, [activeCellCoordinates, previousState === null || previousState === void 0 ? void 0 : previousState.activeCellCoordinates, updateData, rows, isEditing, removeCellEditor, activeCellContent]);
196
216
  var createActiveCell = useCallback(function (_ref2) {
197
217
  var placementElement = _ref2.placementElement,
198
218
  coords = _ref2.coords,
@@ -296,6 +316,7 @@ export var DataSpreadsheet = /*#__PURE__*/React.forwardRef(function (_ref, ref)
296
316
 
297
317
  if (selectionAreas !== null && selectionAreas !== void 0 && selectionAreas.length && key !== 'Shift' && !activeKeys.current.includes('Shift')) {
298
318
  setSelectionAreas([]);
319
+ setSelectionAreaData([]);
299
320
  removeCellSelections({
300
321
  spreadsheetRef: spreadsheetRef
301
322
  });
@@ -480,6 +501,18 @@ export var DataSpreadsheet = /*#__PURE__*/React.forwardRef(function (_ref, ref)
480
501
  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;
481
502
  var activeCellValue = activeCellFullData ? Object.values(activeCellFullData.row.values)[activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column] : null;
482
503
  setCellEditorValue(activeCellValue);
504
+ };
505
+
506
+ var handleActiveCellClick = function handleActiveCellClick() {
507
+ if ((activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row) === 'header' || (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column) === 'header') {
508
+ var indexValue = (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row) === 'header' ? activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column : activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row;
509
+ handleRowColumnHeaderClick({
510
+ isKeyboard: false,
511
+ index: indexValue
512
+ });
513
+ }
514
+
515
+ return;
483
516
  }; // Go into edit mode if 'Enter' key is pressed on activeCellRef
484
517
 
485
518
 
@@ -492,31 +525,42 @@ export var DataSpreadsheet = /*#__PURE__*/React.forwardRef(function (_ref, ref)
492
525
  }
493
526
 
494
527
  if ((activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row) === 'header' || (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column) === 'header') {
495
- var handleHeaderCellProps = {
496
- activeCellCoordinates: activeCellCoordinates,
497
- rows: rows,
498
- columns: columns,
499
- setActiveCellCoordinates: setActiveCellCoordinates,
500
- setCurrentMatcher: setCurrentMatcher,
501
- setSelectionAreas: setSelectionAreas,
502
- spreadsheetRef: spreadsheetRef,
528
+ handleRowColumnHeaderClick({
503
529
  isKeyboard: true
504
- }; // Select an entire column
505
-
506
- if ((activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row) === 'header') {
507
- handleHeaderCellSelection(_objectSpread({
508
- type: 'column'
509
- }, handleHeaderCellProps));
510
- } // Select an entire row
511
-
512
-
513
- if ((activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column) === 'header') {
514
- handleHeaderCellSelection(_objectSpread({
515
- type: 'row'
516
- }, handleHeaderCellProps));
517
- }
530
+ });
518
531
  }
519
532
  }
533
+ };
534
+
535
+ var handleRowColumnHeaderClick = function handleRowColumnHeaderClick(_ref4) {
536
+ var isKeyboard = _ref4.isKeyboard,
537
+ _ref4$index = _ref4.index,
538
+ index = _ref4$index === void 0 ? null : _ref4$index;
539
+ var handleHeaderCellProps = {
540
+ activeCellCoordinates: activeCellCoordinates,
541
+ rows: rows,
542
+ columns: columns,
543
+ setActiveCellCoordinates: setActiveCellCoordinates,
544
+ setCurrentMatcher: setCurrentMatcher,
545
+ setSelectionAreas: setSelectionAreas,
546
+ spreadsheetRef: spreadsheetRef,
547
+ isKeyboard: isKeyboard,
548
+ setSelectionAreaData: setSelectionAreaData,
549
+ index: index
550
+ }; // Select an entire column
551
+
552
+ if ((activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row) === 'header') {
553
+ handleHeaderCellSelection(_objectSpread({
554
+ type: 'column'
555
+ }, handleHeaderCellProps));
556
+ } // Select an entire row
557
+
558
+
559
+ if ((activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column) === 'header') {
560
+ handleHeaderCellSelection(_objectSpread({
561
+ type: 'row'
562
+ }, handleHeaderCellProps));
563
+ }
520
564
  }; // Go into edit mode if double click is detected on activeCellRef
521
565
 
522
566
 
@@ -557,44 +601,8 @@ export var DataSpreadsheet = /*#__PURE__*/React.forwardRef(function (_ref, ref)
557
601
  }
558
602
 
559
603
  return;
560
- }; // Only update if there are cell selection areas
561
- // Find point object that matches currentMatcher and remove the second point
562
- // because hovering over the active cell while clicking and holding should
563
- // remove the previously existing selection area
564
-
565
-
566
- var handleActiveCellMouseEnterCallback = useCallback(function (areas, clickHold) {
567
- var freshMatcherValue = currentMatcherRef.current;
568
-
569
- if (!freshMatcherValue) {
570
- return;
571
- }
572
-
573
- if (areas && areas.length && clickHold && freshMatcherValue) {
574
- setSelectionAreas(function (prev) {
575
- var selectionAreaClone = deepCloneObject(prev);
576
- var indexOfItemToUpdate = selectionAreaClone.findIndex(function (item) {
577
- return item.matcher === freshMatcherValue;
578
- });
579
-
580
- if (indexOfItemToUpdate === -1) {
581
- return prev;
582
- }
583
-
584
- if (_typeof(selectionAreaClone[indexOfItemToUpdate].point2) === 'object' && selectionAreaClone[indexOfItemToUpdate].areaCreated) {
585
- selectionAreaClone[indexOfItemToUpdate].point2 = null;
586
- selectionAreaClone[indexOfItemToUpdate].areaCreated = false;
587
- removeCellSelections({
588
- matcher: freshMatcherValue,
589
- spreadsheetRef: spreadsheetRef
590
- });
591
- return selectionAreaClone;
592
- }
604
+ };
593
605
 
594
- return prev;
595
- });
596
- }
597
- }, [spreadsheetRef, removeCellSelections]);
598
606
  useEffect(function () {
599
607
  if (isEditing) {
600
608
  var _rows$activeCellCoord, _cellProps$column, _cellEditorRef$curren;
@@ -607,7 +615,7 @@ export var DataSpreadsheet = /*#__PURE__*/React.forwardRef(function (_ref, ref)
607
615
  cellEditorRef.current.style.display = 'block';
608
616
  cellEditorRef.current.style.width = activeCellRef === null || activeCellRef === void 0 ? void 0 : activeCellRef.current.style.width;
609
617
  cellEditorRef.current.style.height = activeCellRef === null || activeCellRef === void 0 ? void 0 : activeCellRef.current.style.height;
610
- 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
618
+ cellEditorRef.current.style.paddingTop = "".concat((parseInt(activeCellRef === null || activeCellRef === void 0 ? void 0 : activeCellRef.current.style.height) - 16) / 2 - 1, "px"); // calculate paddingTop based on cellHeight which could be variable depending on the cellSize prop
611
619
 
612
620
  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';
613
621
  (_cellEditorRef$curren = cellEditorRef.current) === null || _cellEditorRef$curren === void 0 ? void 0 : _cellEditorRef$curren.focus();
@@ -650,15 +658,17 @@ export var DataSpreadsheet = /*#__PURE__*/React.forwardRef(function (_ref, ref)
650
658
  }), /*#__PURE__*/React.createElement(DataSpreadsheetHeader, {
651
659
  ref: spreadsheetRef,
652
660
  activeCellCoordinates: activeCellCoordinates,
653
- cellSizeValue: cellSizeValue,
661
+ cellSize: cellSize,
654
662
  columns: columns,
655
663
  defaultColumn: defaultColumn,
656
664
  headerGroups: headerGroups,
657
665
  rows: rows,
666
+ scrollBarSize: scrollBarSize,
658
667
  selectionAreas: selectionAreas,
659
668
  setActiveCellCoordinates: setActiveCellCoordinates,
660
669
  setSelectionAreas: setSelectionAreas,
661
- setCurrentMatcher: setCurrentMatcher
670
+ setCurrentMatcher: setCurrentMatcher,
671
+ setSelectionAreaData: setSelectionAreaData
662
672
  }), /*#__PURE__*/React.createElement(DataSpreadsheetBody, {
663
673
  activeCellCoordinates: activeCellCoordinates,
664
674
  ref: spreadsheetRef,
@@ -673,21 +683,24 @@ export var DataSpreadsheet = /*#__PURE__*/React.forwardRef(function (_ref, ref)
673
683
  defaultColumn: defaultColumn,
674
684
  getTableBodyProps: getTableBodyProps,
675
685
  onActiveCellChange: onActiveCellChange,
686
+ onSelectionAreaChange: onSelectionAreaChange,
676
687
  prepareRow: prepareRow,
677
688
  rows: rows,
689
+ selectionAreaData: selectionAreaData,
690
+ setSelectionAreaData: setSelectionAreaData,
678
691
  setActiveCellCoordinates: setActiveCellCoordinates,
679
692
  scrollBarSize: scrollBarSize,
680
693
  totalColumnsWidth: totalColumnsWidth,
681
694
  id: id,
682
695
  columns: columns
683
696
  }), /*#__PURE__*/React.createElement("button", {
697
+ onClick: handleActiveCellClick,
684
698
  onKeyDown: handleActiveCellKeyDown,
685
- onMouseEnter: handleActiveCellMouseEnter,
686
699
  onDoubleClick: handleActiveCellDoubleClick,
687
700
  ref: activeCellRef,
688
701
  className: cx("".concat(blockClass, "--interactive-cell-element"), "".concat(blockClass, "__active-cell--highlight")),
689
702
  type: "button"
690
- }), /*#__PURE__*/React.createElement(TextArea, {
703
+ }, activeCellContent), /*#__PURE__*/React.createElement(TextArea, {
691
704
  value: cellEditorValue,
692
705
  onKeyDown: handleEditSubmit,
693
706
  onChange: function onChange(event) {
@@ -746,7 +759,12 @@ DataSpreadsheet.propTypes = {
746
759
  /**
747
760
  * The setter fn for the data prop
748
761
  */
749
- onDataUpdate: PropTypes.func
762
+ onDataUpdate: PropTypes.func,
763
+
764
+ /**
765
+ * The event handler that is called when the selection area values change
766
+ */
767
+ onSelectionAreaChange: PropTypes.func
750
768
  /* TODO: add types and DocGen for all props. */
751
769
 
752
770
  };
@@ -15,6 +15,7 @@ import cx from 'classnames';
15
15
  import { pkg } from '../../settings';
16
16
  import { deepCloneObject } from '../../global/js/utils/deepCloneObject';
17
17
  import uuidv4 from '../../global/js/utils/uuidv4';
18
+ import { usePreviousValue } from '../../global/js/hooks';
18
19
  import { removeCellSelections } from './utils/removeCellSelections';
19
20
  import { createCellSelectionArea } from './utils/createCellSelectionArea';
20
21
  import { checkActiveHeaderCell } from './utils/checkActiveHeaderCell';
@@ -28,6 +29,8 @@ export var DataSpreadsheetBody = /*#__PURE__*/forwardRef(function (_ref, ref) {
28
29
  id = _ref.id,
29
30
  prepareRow = _ref.prepareRow,
30
31
  rows = _ref.rows,
32
+ selectionAreaData = _ref.selectionAreaData,
33
+ setSelectionAreaData = _ref.setSelectionAreaData,
31
34
  setActiveCellCoordinates = _ref.setActiveCellCoordinates,
32
35
  selectionAreas = _ref.selectionAreas,
33
36
  setContainerHasFocus = _ref.setContainerHasFocus,
@@ -37,24 +40,60 @@ export var DataSpreadsheetBody = /*#__PURE__*/forwardRef(function (_ref, ref) {
37
40
  clickAndHoldActive = _ref.clickAndHoldActive,
38
41
  setClickAndHoldActive = _ref.setClickAndHoldActive,
39
42
  currentMatcher = _ref.currentMatcher,
40
- setCurrentMatcher = _ref.setCurrentMatcher;
41
- // Create cell selection areas based on selectionAreas array
43
+ setCurrentMatcher = _ref.setCurrentMatcher,
44
+ onSelectionAreaChange = _ref.onSelectionAreaChange;
45
+ var previousState = usePreviousValue({
46
+ selectionAreaData: selectionAreaData,
47
+ clickAndHoldActive: clickAndHoldActive
48
+ }); // Call the `onSelectionAreaChange` handler to send selection area data
49
+ // back to the consumer
50
+
51
+ useEffect(function () {
52
+ if (selectionAreaData.length) {
53
+ var _previousState$select;
54
+
55
+ if (!clickAndHoldActive && previousState !== null && previousState !== void 0 && previousState.clickAndHoldActive || (previousState === null || previousState === void 0 ? void 0 : (_previousState$select = previousState.selectionAreaData) === null || _previousState$select === void 0 ? void 0 : _previousState$select.length) !== (selectionAreaData === null || selectionAreaData === void 0 ? void 0 : selectionAreaData.length)) {
56
+ onSelectionAreaChange(selectionAreaData);
57
+ }
58
+ }
59
+ }, [previousState === null || previousState === void 0 ? void 0 : previousState.selectionAreaData, selectionAreaData, onSelectionAreaChange, clickAndHoldActive, previousState === null || previousState === void 0 ? void 0 : previousState.clickAndHoldActive]); // Create cell selection areas based on selectionAreas array
60
+
42
61
  useEffect(function () {
43
62
  if (selectionAreas && selectionAreas.length) {
44
63
  selectionAreas.map(function (area) {
45
- if (!area.areaCreated && area.point1 && area.point2 && area.matcher) {
46
- // Do not create a cell selection area if point1 and point2 have the same values
47
- // Cell selections must have two distinctly different points for an area to be created
48
- if (area.point1.row === area.point2.row && area.point1.column === area.point2.column) {
49
- var selectionAreasClone = deepCloneObject(selectionAreas);
50
- var indexOfCurrentArea = selectionAreasClone.findIndex(function (item) {
51
- return item.matcher === area.matcher;
64
+ // Setup selection area data that will be sent back to consumer via onSelectionAreaChange prop
65
+ if (area.areaCreated) {
66
+ var rowStart = Math.min(area.point1.row, area.point2.row);
67
+ var rowEnd = Math.max(area.point1.row, area.point2.row);
68
+ var columnStart = Math.min(area.point1.column, area.point2.column);
69
+ var columnEnd = Math.max(area.point1.column, area.point2.column);
70
+ var selectionData = {
71
+ rows: {
72
+ start: rowStart,
73
+ end: rowEnd
74
+ },
75
+ columns: {
76
+ start: columnStart,
77
+ end: columnEnd
78
+ },
79
+ cells: populateSelectionAreaCellData({
80
+ rowStart: rowStart,
81
+ rowEnd: rowEnd,
82
+ columnStart: columnStart,
83
+ columnEnd: columnEnd
84
+ }),
85
+ selectionId: area.matcher
86
+ };
87
+ setSelectionAreaData(function (prev) {
88
+ var prevValues = deepCloneObject(prev);
89
+ var newAreaData = prevValues.filter(function (item) {
90
+ return item.selectionId !== area.matcher;
52
91
  });
53
- selectionAreasClone[indexOfCurrentArea].areaCreated = false;
54
- selectionAreasClone[indexOfCurrentArea].point2 = null;
55
- return setSelectionAreas(selectionAreasClone);
56
- }
92
+ return [].concat(_toConsumableArray(newAreaData), [selectionData]);
93
+ });
94
+ }
57
95
 
96
+ if (!area.areaCreated && area.point1 && area.point2 && area.matcher) {
58
97
  createCellSelectionArea({
59
98
  area: area,
60
99
  blockClass: blockClass,
@@ -67,7 +106,24 @@ export var DataSpreadsheetBody = /*#__PURE__*/forwardRef(function (_ref, ref) {
67
106
  return;
68
107
  });
69
108
  }
70
- }, [selectionAreas, setSelectionAreas, defaultColumn]); // Mouse up
109
+ }, [selectionAreas, setSelectionAreas, defaultColumn, onSelectionAreaChange, setSelectionAreaData]);
110
+
111
+ var populateSelectionAreaCellData = function populateSelectionAreaCellData(_ref2) {
112
+ var rowStart = _ref2.rowStart,
113
+ rowEnd = _ref2.rowEnd,
114
+ columnStart = _ref2.columnStart,
115
+ columnEnd = _ref2.columnEnd;
116
+ var cellContainer = [];
117
+
118
+ for (var rowIndex = rowStart; rowIndex <= rowEnd; rowIndex++) {
119
+ for (var columnIndex = columnStart; columnIndex <= columnEnd; columnIndex++) {
120
+ cellContainer.push([rowIndex, columnIndex]);
121
+ }
122
+ }
123
+
124
+ return cellContainer;
125
+ }; // Mouse up
126
+
71
127
 
72
128
  useEffect(function () {
73
129
  var handleMouseUp = function handleMouseUp(event) {
@@ -168,9 +224,10 @@ export var DataSpreadsheetBody = /*#__PURE__*/forwardRef(function (_ref, ref) {
168
224
  matcher: tempMatcher
169
225
  }]);
170
226
  setCurrentMatcher(tempMatcher);
227
+ setSelectionAreaData([]);
171
228
  }
172
229
  };
173
- }, [currentMatcher, activeCellCoordinates, selectionAreas, setActiveCellCoordinates, setSelectionAreas, setContainerHasFocus, setClickAndHoldActive, setCurrentMatcher, ref]);
230
+ }, [currentMatcher, activeCellCoordinates, selectionAreas, setActiveCellCoordinates, setSelectionAreas, setContainerHasFocus, setClickAndHoldActive, setCurrentMatcher, ref, setSelectionAreaData]);
174
231
  var handleBodyCellHover = useCallback(function (cell, columnIndex) {
175
232
  return function () {
176
233
  if (clickAndHoldActive) {
@@ -213,14 +270,15 @@ export var DataSpreadsheetBody = /*#__PURE__*/forwardRef(function (_ref, ref) {
213
270
  setCurrentMatcher: setCurrentMatcher,
214
271
  setSelectionAreas: setSelectionAreas,
215
272
  spreadsheetRef: ref,
216
- index: index
273
+ index: index,
274
+ setSelectionAreaData: setSelectionAreaData
217
275
  });
218
276
  };
219
- }, [columns, ref, setSelectionAreas, setCurrentMatcher, setActiveCellCoordinates, activeCellCoordinates, rows]); // Renders each row/cell in the spreadsheet body
277
+ }, [columns, ref, setSelectionAreas, setCurrentMatcher, setActiveCellCoordinates, activeCellCoordinates, rows, setSelectionAreaData]); // Renders each row/cell in the spreadsheet body
220
278
 
221
- var RenderRow = useCallback(function (_ref2) {
222
- var index = _ref2.index,
223
- style = _ref2.style;
279
+ var RenderRow = useCallback(function (_ref3) {
280
+ var index = _ref3.index,
281
+ style = _ref3.style;
224
282
  var row = rows[index];
225
283
  prepareRow(row);
226
284
  return /*#__PURE__*/React.createElement("div", _extends({}, row.getRowProps({
@@ -313,6 +371,11 @@ DataSpreadsheetBody.propTypes = {
313
371
  */
314
372
  onActiveCellChange: PropTypes.func,
315
373
 
374
+ /**
375
+ * The event handler that is called when the selection areas change
376
+ */
377
+ onSelectionAreaChange: PropTypes.func,
378
+
316
379
  /**
317
380
  * Prepare row function from react-table
318
381
  */
@@ -328,6 +391,11 @@ DataSpreadsheetBody.propTypes = {
328
391
  */
329
392
  scrollBarSize: PropTypes.number,
330
393
 
394
+ /**
395
+ * Array of selection area data
396
+ */
397
+ selectionAreaData: PropTypes.array,
398
+
331
399
  /**
332
400
  * Array of selection areas
333
401
  */
@@ -353,6 +421,11 @@ DataSpreadsheetBody.propTypes = {
353
421
  */
354
422
  setCurrentMatcher: PropTypes.func,
355
423
 
424
+ /**
425
+ * Setter fn for selectionAreaData state value
426
+ */
427
+ setSelectionAreaData: PropTypes.func,
428
+
356
429
  /**
357
430
  * Setter fn for selectionAreas state value
358
431
  */