@carbon/ibm-products 1.8.0 → 1.11.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -11,6 +11,10 @@ exports.DataSpreadsheetBody = void 0;
11
11
 
12
12
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
13
 
14
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
+
16
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
17
+
14
18
  var _react = _interopRequireWildcard(require("react"));
15
19
 
16
20
  var _propTypes = _interopRequireDefault(require("prop-types"));
@@ -21,6 +25,18 @@ var _classnames = _interopRequireDefault(require("classnames"));
21
25
 
22
26
  var _settings = require("../../settings");
23
27
 
28
+ var _deepCloneObject = require("../../global/js/utils/deepCloneObject");
29
+
30
+ var _uuidv = _interopRequireDefault(require("../../global/js/utils/uuidv4"));
31
+
32
+ var _removeCellSelections = require("./utils/removeCellSelections");
33
+
34
+ var _createCellSelectionArea = require("./utils/createCellSelectionArea");
35
+
36
+ var _checkActiveHeaderCell = require("./utils/checkActiveHeaderCell");
37
+
38
+ var _handleHeaderCellSelection = require("./utils/handleHeaderCellSelection");
39
+
24
40
  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); }
25
41
 
26
42
  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; }
@@ -32,18 +48,89 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
32
48
  * LICENSE file in the root directory of this source tree.
33
49
  */
34
50
  var blockClass = "".concat(_settings.pkg.prefix, "--data-spreadsheet");
35
-
36
- var DataSpreadsheetBody = function DataSpreadsheetBody(_ref) {
37
- var defaultColumn = _ref.defaultColumn,
51
+ var DataSpreadsheetBody = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
52
+ var columns = _ref.columns,
53
+ activeCellCoordinates = _ref.activeCellCoordinates,
54
+ defaultColumn = _ref.defaultColumn,
38
55
  getTableBodyProps = _ref.getTableBodyProps,
39
56
  id = _ref.id,
40
57
  prepareRow = _ref.prepareRow,
41
58
  rows = _ref.rows,
42
59
  setActiveCellCoordinates = _ref.setActiveCellCoordinates,
60
+ selectionAreas = _ref.selectionAreas,
61
+ setContainerHasFocus = _ref.setContainerHasFocus,
62
+ setSelectionAreas = _ref.setSelectionAreas,
43
63
  scrollBarSize = _ref.scrollBarSize,
44
- totalColumnsWidth = _ref.totalColumnsWidth;
45
- // Make sure that if the cellSize prop changes, the active
64
+ totalColumnsWidth = _ref.totalColumnsWidth,
65
+ clickAndHoldActive = _ref.clickAndHoldActive,
66
+ setClickAndHoldActive = _ref.setClickAndHoldActive,
67
+ currentMatcher = _ref.currentMatcher,
68
+ setCurrentMatcher = _ref.setCurrentMatcher;
69
+ // Create cell selection areas based on selectionAreas array
70
+ (0, _react.useEffect)(function () {
71
+ if (selectionAreas && selectionAreas.length) {
72
+ selectionAreas.map(function (area) {
73
+ if (!area.areaCreated && area.point1 && area.point2 && area.matcher) {
74
+ // Do not create a cell selection area if point1 and point2 have the same values
75
+ // Cell selections must have two distinctly different points for an area to be created
76
+ if (area.point1.row === area.point2.row && area.point1.column === area.point2.column) {
77
+ var selectionAreasClone = (0, _deepCloneObject.deepCloneObject)(selectionAreas);
78
+ var indexOfCurrentArea = selectionAreasClone.findIndex(function (item) {
79
+ return item.matcher === area.matcher;
80
+ });
81
+ selectionAreasClone[indexOfCurrentArea].areaCreated = false;
82
+ selectionAreasClone[indexOfCurrentArea].point2 = null;
83
+ return setSelectionAreas(selectionAreasClone);
84
+ }
85
+
86
+ (0, _createCellSelectionArea.createCellSelectionArea)({
87
+ area: area,
88
+ blockClass: blockClass,
89
+ defaultColumn: defaultColumn,
90
+ selectionAreas: selectionAreas,
91
+ setSelectionAreas: setSelectionAreas
92
+ });
93
+ }
94
+
95
+ return;
96
+ });
97
+ }
98
+ }, [selectionAreas, setSelectionAreas, defaultColumn]); // Mouse up
99
+
100
+ (0, _react.useEffect)(function () {
101
+ var handleMouseUp = function handleMouseUp(event) {
102
+ setClickAndHoldActive(false);
103
+ var cellButton = event.target.closest(".".concat(blockClass, "__body--td"));
104
+
105
+ if (cellButton) {
106
+ var endCellCoordinates = {
107
+ row: Number(cellButton.getAttribute('data-row-index')),
108
+ column: Number(cellButton.getAttribute('data-column-index'))
109
+ };
110
+ setSelectionAreas(function (prev) {
111
+ var selectionAreaClone = (0, _deepCloneObject.deepCloneObject)(prev);
112
+ var indexOfItemToUpdate = selectionAreaClone.findIndex(function (item) {
113
+ return item.matcher === currentMatcher;
114
+ }); // No items in the array have an object that matches the value of currentMatcher
115
+
116
+ if (indexOfItemToUpdate === -1) {
117
+ return prev;
118
+ }
119
+
120
+ selectionAreaClone[indexOfItemToUpdate].point2 = endCellCoordinates;
121
+ selectionAreaClone[indexOfItemToUpdate].areaCreated = false;
122
+ return selectionAreaClone;
123
+ });
124
+ }
125
+ };
126
+
127
+ document.addEventListener('mouseup', handleMouseUp);
128
+ return function () {
129
+ document.removeEventListener('mouseup', handleMouseUp);
130
+ };
131
+ }, [selectionAreas, currentMatcher, setSelectionAreas, setClickAndHoldActive, setCurrentMatcher, ref]); // Make sure that if the cellSize prop changes, the active
46
132
  // cell also gets updated with the new size
133
+
47
134
  (0, _react.useEffect)(function () {
48
135
  var listContainer = spreadsheetBodyRef === null || spreadsheetBodyRef === void 0 ? void 0 : spreadsheetBodyRef.current;
49
136
  var activeCellButton = listContainer.querySelector(".".concat(blockClass, "__active-cell--highlight"));
@@ -55,11 +142,109 @@ var DataSpreadsheetBody = function DataSpreadsheetBody(_ref) {
55
142
  // adds the active cell highlight
56
143
 
57
144
  var handleBodyCellClick = (0, _react.useCallback)(function (cell, columnIndex) {
58
- setActiveCellCoordinates({
59
- row: cell.row.index,
60
- column: columnIndex
61
- });
62
- }, [setActiveCellCoordinates]); // Renders each cell in the spreadsheet body
145
+ return function (event) {
146
+ event.preventDefault();
147
+ var isHoldingCommandKey = event.metaKey || event.ctrlKey;
148
+ var isHoldingShiftKey = event.shiftKey;
149
+ setContainerHasFocus(true);
150
+ var activeCoordinates = {
151
+ row: cell.row.index,
152
+ column: columnIndex
153
+ };
154
+ var tempMatcher = (0, _uuidv.default)();
155
+ setClickAndHoldActive(true); // prevent multiple selections unless cmd key is held
156
+ // meaning that selectionAreas should only have one item by default
157
+
158
+ if (isHoldingCommandKey) {
159
+ setActiveCellCoordinates(activeCoordinates);
160
+ setCurrentMatcher(tempMatcher);
161
+ setSelectionAreas(function (prev) {
162
+ return [].concat((0, _toConsumableArray2.default)(prev), [{
163
+ point1: activeCoordinates,
164
+ matcher: tempMatcher
165
+ }]);
166
+ });
167
+ } else if (isHoldingShiftKey) {
168
+ setContainerHasFocus(true);
169
+ var selectionAreaClone = (0, _deepCloneObject.deepCloneObject)(selectionAreas);
170
+ var indexOfItemToUpdate = selectionAreaClone.findIndex(function (item) {
171
+ return item.matcher === currentMatcher;
172
+ });
173
+
174
+ if (indexOfItemToUpdate === -1) {
175
+ // There is always a selectionArea with a point1 object that updates
176
+ // whenever the activeCellCoordinates update, we should always be able
177
+ // to find an index, but if we do not for some reason we should return
178
+ // at this point.
179
+ return;
180
+ } else {
181
+ // Update the selectionArea that was found, do not update currentMatcher
182
+ selectionAreaClone[indexOfItemToUpdate].point1 = activeCellCoordinates;
183
+ selectionAreaClone[indexOfItemToUpdate].point2 = activeCoordinates;
184
+ selectionAreaClone[indexOfItemToUpdate].areaCreated = false;
185
+ selectionAreaClone[indexOfItemToUpdate].matcher = currentMatcher;
186
+ setSelectionAreas(selectionAreaClone);
187
+ }
188
+ } else {
189
+ setActiveCellCoordinates(activeCoordinates); // remove all previous cell selections
190
+
191
+ (0, _removeCellSelections.removeCellSelections)({
192
+ spreadsheetRef: ref
193
+ });
194
+ setSelectionAreas([{
195
+ point1: activeCoordinates,
196
+ matcher: tempMatcher
197
+ }]);
198
+ setCurrentMatcher(tempMatcher);
199
+ }
200
+ };
201
+ }, [currentMatcher, activeCellCoordinates, selectionAreas, setActiveCellCoordinates, setSelectionAreas, setContainerHasFocus, setClickAndHoldActive, setCurrentMatcher, ref]);
202
+ var handleBodyCellHover = (0, _react.useCallback)(function (cell, columnIndex) {
203
+ return function () {
204
+ if (clickAndHoldActive) {
205
+ var cellCoordinates = {
206
+ row: cell.row.index,
207
+ column: columnIndex
208
+ };
209
+ setSelectionAreas(function (prev) {
210
+ var _selectionAreaClone$i, _selectionAreaClone$i2;
211
+
212
+ var selectionAreaClone = (0, _deepCloneObject.deepCloneObject)(prev);
213
+ var indexOfItemToUpdate = selectionAreaClone.findIndex(function (item) {
214
+ return item.matcher === currentMatcher;
215
+ }); // No items in the array match up with the currentMatcher value
216
+
217
+ if (indexOfItemToUpdate === -1) {
218
+ return prev;
219
+ } // Do not update state if you're still hovering on the same cell
220
+
221
+
222
+ if (((_selectionAreaClone$i = selectionAreaClone[indexOfItemToUpdate].point2) === null || _selectionAreaClone$i === void 0 ? void 0 : _selectionAreaClone$i.row) === cellCoordinates.row && ((_selectionAreaClone$i2 = selectionAreaClone[indexOfItemToUpdate].point2) === null || _selectionAreaClone$i2 === void 0 ? void 0 : _selectionAreaClone$i2.column) === cellCoordinates.column) {
223
+ return prev;
224
+ }
225
+
226
+ selectionAreaClone[indexOfItemToUpdate].point2 = cellCoordinates;
227
+ selectionAreaClone[indexOfItemToUpdate].areaCreated = false;
228
+ return selectionAreaClone;
229
+ });
230
+ }
231
+ };
232
+ }, [clickAndHoldActive, currentMatcher, setSelectionAreas]);
233
+ var handleRowHeaderClick = (0, _react.useCallback)(function (index) {
234
+ return function () {
235
+ (0, _handleHeaderCellSelection.handleHeaderCellSelection)({
236
+ type: 'row',
237
+ activeCellCoordinates: activeCellCoordinates,
238
+ rows: rows,
239
+ columns: columns,
240
+ setActiveCellCoordinates: setActiveCellCoordinates,
241
+ setCurrentMatcher: setCurrentMatcher,
242
+ setSelectionAreas: setSelectionAreas,
243
+ spreadsheetRef: ref,
244
+ index: index
245
+ });
246
+ };
247
+ }, [columns, ref, setSelectionAreas, setCurrentMatcher, setActiveCellCoordinates, activeCellCoordinates, rows]); // Renders each row/cell in the spreadsheet body
63
248
 
64
249
  var RenderRow = (0, _react.useCallback)(function (_ref2) {
65
250
  var index = _ref2.index,
@@ -76,7 +261,8 @@ var DataSpreadsheetBody = function DataSpreadsheetBody(_ref) {
76
261
  "data-row-index": index,
77
262
  "data-column-index": "header",
78
263
  type: "button",
79
- className: (0, _classnames.default)("".concat(blockClass, "__td"), "".concat(blockClass, "__td-th"), "".concat(blockClass, "--interactive-cell-element")),
264
+ onClick: handleRowHeaderClick(index),
265
+ className: (0, _classnames.default)("".concat(blockClass, "__td"), "".concat(blockClass, "__td-th"), "".concat(blockClass, "--interactive-cell-element"), (0, _defineProperty2.default)({}, "".concat(blockClass, "__td-th--active-header"), (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row) === index || (0, _checkActiveHeaderCell.checkActiveHeaderCell)(index, selectionAreas, 'row'))),
80
266
  style: {
81
267
  width: defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.rowHeaderWidth
82
268
  }
@@ -86,15 +272,15 @@ var DataSpreadsheetBody = function DataSpreadsheetBody(_ref) {
86
272
  "data-row-index": cell.row.index,
87
273
  "data-column-index": index
88
274
  }, cell.getCellProps(), {
89
- className: (0, _classnames.default)("".concat(blockClass, "__td"), "".concat(blockClass, "--interactive-cell-element")),
275
+ className: (0, _classnames.default)("".concat(blockClass, "__td"), "".concat(blockClass, "__body--td"), "".concat(blockClass, "--interactive-cell-element")),
90
276
  key: "cell_".concat(index),
91
- onClick: function onClick() {
92
- return handleBodyCellClick(cell, index);
93
- },
277
+ onMouseDown: handleBodyCellClick(cell, index),
278
+ onMouseOver: handleBodyCellHover(cell, index),
279
+ onFocus: function onFocus() {},
94
280
  type: "button"
95
281
  }), cell.render('Cell'));
96
282
  }));
97
- }, [prepareRow, rows, defaultColumn.rowHeaderWidth, handleBodyCellClick]);
283
+ }, [prepareRow, rows, defaultColumn.rowHeaderWidth, activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row, selectionAreas, handleRowHeaderClick, handleBodyCellClick, handleBodyCellHover]);
98
284
  var spreadsheetBodyRef = (0, _react.useRef)();
99
285
  return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({
100
286
  ref: spreadsheetBodyRef,
@@ -106,10 +292,32 @@ var DataSpreadsheetBody = function DataSpreadsheetBody(_ref) {
106
292
  itemSize: defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.rowHeight,
107
293
  width: totalColumnsWidth + scrollBarSize
108
294
  }, RenderRow));
109
- };
110
-
295
+ });
111
296
  exports.DataSpreadsheetBody = DataSpreadsheetBody;
112
297
  DataSpreadsheetBody.propTypes = {
298
+ /**
299
+ * Object containing the active cell coordinates
300
+ */
301
+ activeCellCoordinates: _propTypes.default.shape({
302
+ row: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number]),
303
+ column: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number])
304
+ }),
305
+
306
+ /**
307
+ * Is the user clicking and holding in the data spreadsheet body
308
+ */
309
+ clickAndHoldActive: _propTypes.default.bool,
310
+
311
+ /**
312
+ * All of the spreadsheet columns
313
+ */
314
+ columns: _propTypes.default.array,
315
+
316
+ /**
317
+ * This represents the id of the current cell selection area
318
+ */
319
+ currentMatcher: _propTypes.default.string,
320
+
113
321
  /**
114
322
  * Default spreadsheet sizing values
115
323
  */
@@ -149,11 +357,36 @@ DataSpreadsheetBody.propTypes = {
149
357
  */
150
358
  scrollBarSize: _propTypes.default.number,
151
359
 
360
+ /**
361
+ * Array of selection areas
362
+ */
363
+ selectionAreas: _propTypes.default.array,
364
+
152
365
  /**
153
366
  * Setter fn for activeCellCoordinates state value
154
367
  */
155
368
  setActiveCellCoordinates: _propTypes.default.func,
156
369
 
370
+ /**
371
+ * Setter fn for clickAndHold state value
372
+ */
373
+ setClickAndHoldActive: _propTypes.default.func,
374
+
375
+ /**
376
+ * Setter fn for containerHasFocus state value
377
+ */
378
+ setContainerHasFocus: _propTypes.default.func,
379
+
380
+ /**
381
+ * Setter fn for currentMatcher state value
382
+ */
383
+ setCurrentMatcher: _propTypes.default.func,
384
+
385
+ /**
386
+ * Setter fn for selectionAreas state value
387
+ */
388
+ setSelectionAreas: _propTypes.default.func,
389
+
157
390
  /**
158
391
  * The total columns width
159
392
  */
@@ -2,6 +2,8 @@
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
 
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
5
7
  Object.defineProperty(exports, "__esModule", {
6
8
  value: true
7
9
  });
@@ -9,7 +11,9 @@ exports.DataSpreadsheetHeader = void 0;
9
11
 
10
12
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
13
 
12
- var _react = _interopRequireDefault(require("react"));
14
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
+
16
+ var _react = _interopRequireWildcard(require("react"));
13
17
 
14
18
  var _propTypes = _interopRequireDefault(require("prop-types"));
15
19
 
@@ -17,6 +21,14 @@ var _classnames = _interopRequireDefault(require("classnames"));
17
21
 
18
22
  var _settings = require("../../settings");
19
23
 
24
+ var _checkActiveHeaderCell = require("./utils/checkActiveHeaderCell");
25
+
26
+ var _handleHeaderCellSelection = require("./utils/handleHeaderCellSelection");
27
+
28
+ 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); }
29
+
30
+ 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; }
31
+
20
32
  /**
21
33
  * Copyright IBM Corp. 2022, 2022
22
34
  *
@@ -24,10 +36,33 @@ var _settings = require("../../settings");
24
36
  * LICENSE file in the root directory of this source tree.
25
37
  */
26
38
  var blockClass = "".concat(_settings.pkg.prefix, "--data-spreadsheet");
39
+ var DataSpreadsheetHeader = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
40
+ var activeCellCoordinates = _ref.activeCellCoordinates,
41
+ columns = _ref.columns,
42
+ defaultColumn = _ref.defaultColumn,
43
+ headerGroups = _ref.headerGroups,
44
+ selectionAreas = _ref.selectionAreas,
45
+ setActiveCellCoordinates = _ref.setActiveCellCoordinates,
46
+ setCurrentMatcher = _ref.setCurrentMatcher,
47
+ setSelectionAreas = _ref.setSelectionAreas,
48
+ rows = _ref.rows;
49
+
50
+ var handleColumnHeaderClick = function handleColumnHeaderClick(index) {
51
+ return function () {
52
+ (0, _handleHeaderCellSelection.handleHeaderCellSelection)({
53
+ type: 'column',
54
+ activeCellCoordinates: activeCellCoordinates,
55
+ rows: rows,
56
+ columns: columns,
57
+ setActiveCellCoordinates: setActiveCellCoordinates,
58
+ setCurrentMatcher: setCurrentMatcher,
59
+ setSelectionAreas: setSelectionAreas,
60
+ spreadsheetRef: ref,
61
+ index: index
62
+ });
63
+ };
64
+ };
27
65
 
28
- var DataSpreadsheetHeader = function DataSpreadsheetHeader(_ref) {
29
- var defaultColumn = _ref.defaultColumn,
30
- headerGroups = _ref.headerGroups;
31
66
  return /*#__PURE__*/_react.default.createElement("div", {
32
67
  className: (0, _classnames.default)("".concat(blockClass, "__header--container"))
33
68
  }, headerGroups.map(function (headerGroup, index) {
@@ -40,7 +75,7 @@ var DataSpreadsheetHeader = function DataSpreadsheetHeader(_ref) {
40
75
  "data-column-index": "header",
41
76
  type: "button",
42
77
  tabIndex: -1,
43
- className: (0, _classnames.default)("".concat(blockClass, "__th"), "".concat(blockClass, "--interactive-cell-element")),
78
+ className: (0, _classnames.default)("".concat(blockClass, "__th"), "".concat(blockClass, "--interactive-cell-element"), (0, _defineProperty2.default)({}, "".concat(blockClass, "__th--active-header"), (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column) === 'header' && (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row) === 'header')),
44
79
  style: {
45
80
  width: defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.rowHeaderWidth,
46
81
  height: defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.rowHeight
@@ -51,19 +86,32 @@ var DataSpreadsheetHeader = function DataSpreadsheetHeader(_ref) {
51
86
  "data-row-index": "header",
52
87
  "data-column-index": index,
53
88
  tabIndex: -1,
89
+ onClick: handleColumnHeaderClick(index),
54
90
  style: {
55
91
  height: defaultColumn === null || defaultColumn === void 0 ? void 0 : defaultColumn.rowHeight
56
92
  }
57
93
  }, column.getHeaderProps(), {
58
- className: (0, _classnames.default)("".concat(blockClass, "__th"), "".concat(blockClass, "--interactive-cell-element")),
94
+ className: (0, _classnames.default)("".concat(blockClass, "__th"), "".concat(blockClass, "--interactive-cell-element"), (0, _defineProperty2.default)({}, "".concat(blockClass, "__th--active-header"), (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.column) === index || (0, _checkActiveHeaderCell.checkActiveHeaderCell)(index, selectionAreas, 'column'))),
59
95
  type: "button"
60
96
  }), column.render('Header'));
61
97
  }));
62
98
  }));
63
- };
64
-
99
+ });
65
100
  exports.DataSpreadsheetHeader = DataSpreadsheetHeader;
66
101
  DataSpreadsheetHeader.propTypes = {
102
+ /**
103
+ * Object containing the active cell coordinates
104
+ */
105
+ activeCellCoordinates: _propTypes.default.shape({
106
+ row: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]),
107
+ column: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string])
108
+ }),
109
+
110
+ /**
111
+ * All of the spreadsheet columns
112
+ */
113
+ columns: _propTypes.default.array,
114
+
67
115
  /**
68
116
  * Default spreadsheet sizing values
69
117
  */
@@ -76,5 +124,30 @@ DataSpreadsheetHeader.propTypes = {
76
124
  /**
77
125
  * Headers provided from useTable hook
78
126
  */
79
- headerGroups: _propTypes.default.arrayOf(_propTypes.default.object)
127
+ headerGroups: _propTypes.default.arrayOf(_propTypes.default.object),
128
+
129
+ /**
130
+ * All of the spreadsheet row data
131
+ */
132
+ rows: _propTypes.default.arrayOf(_propTypes.default.object),
133
+
134
+ /**
135
+ * All of the cell selection area items
136
+ */
137
+ selectionAreas: _propTypes.default.arrayOf(_propTypes.default.object),
138
+
139
+ /**
140
+ * Setter fn for activeCellCoordinates value
141
+ */
142
+ setActiveCellCoordinates: _propTypes.default.func,
143
+
144
+ /**
145
+ * Setter fn for currentMatcher value
146
+ */
147
+ setCurrentMatcher: _propTypes.default.func,
148
+
149
+ /**
150
+ * Setter fn for selectionAreas value
151
+ */
152
+ setSelectionAreas: _propTypes.default.func
80
153
  };
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useMoveActiveCell = void 0;
7
+
8
+ var _react = require("react");
9
+
10
+ /**
11
+ * Copyright IBM Corp. 2022, 2022
12
+ *
13
+ * This source code is licensed under the Apache-2.0 license found in the
14
+ * LICENSE file in the root directory of this source tree.
15
+ */
16
+ // Moves the placement of the active cell
17
+ var useMoveActiveCell = function useMoveActiveCell(_ref) {
18
+ var spreadsheetRef = _ref.spreadsheetRef,
19
+ activeCellCoordinates = _ref.activeCellCoordinates,
20
+ containerHasFocus = _ref.containerHasFocus,
21
+ createActiveCell = _ref.createActiveCell;
22
+ (0, _react.useEffect)(function () {
23
+ 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, "\"]"));
24
+ var shouldPlaceActiveCellInHeader = (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row) === 'header' && true;
25
+ var selectAllElement = spreadsheetRef === null || spreadsheetRef === void 0 ? void 0 : spreadsheetRef.current.querySelector("[data-row-index=\"header\"][data-column-index=\"header\"]");
26
+
27
+ if (containerHasFocus) {
28
+ createActiveCell({
29
+ placementElement: activeCellCoordinates ? activeCellPlacementElement : selectAllElement,
30
+ coords: activeCellCoordinates,
31
+ addToHeader: shouldPlaceActiveCellInHeader
32
+ });
33
+ }
34
+ }, [activeCellCoordinates, spreadsheetRef, createActiveCell, containerHasFocus]);
35
+ };
36
+
37
+ exports.useMoveActiveCell = useMoveActiveCell;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useResetSpreadsheetFocus = void 0;
7
+
8
+ var _react = require("react");
9
+
10
+ var _settings = require("../../../settings");
11
+
12
+ /**
13
+ * Copyright IBM Corp. 2022, 2022
14
+ *
15
+ * This source code is licensed under the Apache-2.0 license found in the
16
+ * LICENSE file in the root directory of this source tree.
17
+ */
18
+ var useResetSpreadsheetFocus = function useResetSpreadsheetFocus(_ref) {
19
+ var activeKeys = _ref.activeKeys,
20
+ _ref$blockClass = _ref.blockClass,
21
+ blockClass = _ref$blockClass === void 0 ? "".concat(_settings.pkg.prefix, "--data-spreadsheet") : _ref$blockClass,
22
+ focusedElement = _ref.focusedElement,
23
+ removeActiveCell = _ref.removeActiveCell,
24
+ setContainerHasFocus = _ref.setContainerHasFocus;
25
+ // Reset everything when spreadsheet loses focus
26
+ (0, _react.useEffect)(function () {
27
+ if (!focusedElement.classList.contains("".concat(blockClass, "--interactive-cell-element"))) {
28
+ setContainerHasFocus(false);
29
+ removeActiveCell();
30
+ activeKeys.current = [];
31
+ }
32
+
33
+ if (focusedElement.classList.contains(blockClass) || focusedElement.classList.contains("".concat(blockClass, "--interactive-cell-element"))) {
34
+ setContainerHasFocus(true);
35
+ }
36
+ }, [focusedElement, removeActiveCell, activeKeys, blockClass, setContainerHasFocus]);
37
+ };
38
+
39
+ exports.useResetSpreadsheetFocus = useResetSpreadsheetFocus;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useSpreadsheetOutsideClick = void 0;
7
+
8
+ var _react = require("react");
9
+
10
+ var _settings = require("../../../settings");
11
+
12
+ /**
13
+ * Copyright IBM Corp. 2022, 2022
14
+ *
15
+ * This source code is licensed under the Apache-2.0 license found in the
16
+ * LICENSE file in the root directory of this source tree.
17
+ */
18
+ // Click outside useEffect for spreadsheet
19
+ var useSpreadsheetOutsideClick = function useSpreadsheetOutsideClick(_ref) {
20
+ var spreadsheetRef = _ref.spreadsheetRef,
21
+ _ref$blockClass = _ref.blockClass,
22
+ blockClass = _ref$blockClass === void 0 ? "".concat(_settings.pkg.prefix, "--data-spreadsheet") : _ref$blockClass,
23
+ setActiveCellCoordinates = _ref.setActiveCellCoordinates,
24
+ setSelectionAreas = _ref.setSelectionAreas,
25
+ removeActiveCell = _ref.removeActiveCell,
26
+ removeCellSelections = _ref.removeCellSelections,
27
+ setContainerHasFocus = _ref.setContainerHasFocus,
28
+ activeKeys = _ref.activeKeys,
29
+ removeCellEditor = _ref.removeCellEditor;
30
+ (0, _react.useEffect)(function () {
31
+ var handleOutsideClick = function handleOutsideClick(event) {
32
+ if (!spreadsheetRef.current || spreadsheetRef.current.contains(event.target) || event.target.classList.contains("".concat(blockClass, "__active-cell--highlight")) || event.target.classList.contains("".concat(blockClass, "--interactive-cell-element"))) {
33
+ return;
34
+ }
35
+
36
+ setActiveCellCoordinates(null);
37
+ setSelectionAreas([]);
38
+ removeActiveCell();
39
+ removeCellSelections();
40
+ setContainerHasFocus(false);
41
+ removeCellEditor();
42
+ activeKeys.current = [];
43
+ };
44
+
45
+ document.addEventListener('click', handleOutsideClick);
46
+ return function () {
47
+ document.removeEventListener('click', handleOutsideClick);
48
+ };
49
+ }, [spreadsheetRef, removeActiveCell, removeCellSelections, activeKeys, blockClass, setActiveCellCoordinates, setContainerHasFocus, setSelectionAreas, removeCellEditor]);
50
+ };
51
+
52
+ exports.useSpreadsheetOutsideClick = useSpreadsheetOutsideClick;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.checkActiveHeaderCell = void 0;
9
+
10
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
11
+
12
+ var _deepCloneObject = require("../../../global/js/utils/deepCloneObject");
13
+
14
+ /**
15
+ * Copyright IBM Corp. 2022, 2022
16
+ *
17
+ * This source code is licensed under the Apache-2.0 license found in the
18
+ * LICENSE file in the root directory of this source tree.
19
+ */
20
+ // Determines if a row or column header cell should receive a highlight/active background color
21
+ // Check each object in selectionAreas and see if the headerIndex is between
22
+ // point1.row and point2.row, inclusive
23
+ var checkActiveHeaderCell = function checkActiveHeaderCell(headerIndex, selectionAreas, headerType) {
24
+ var areasCloned = (0, _deepCloneObject.deepCloneObject)(selectionAreas);
25
+ var activeRowIndexes = [];
26
+ areasCloned.forEach(function (area) {
27
+ var _area$point, _area$point2, _area$point3, _area$point4;
28
+
29
+ var greatestRowIndex = Math.max((_area$point = area.point1) === null || _area$point === void 0 ? void 0 : _area$point[headerType], (_area$point2 = area.point2) === null || _area$point2 === void 0 ? void 0 : _area$point2[headerType]);
30
+ var lowestRowIndex = Math.min((_area$point3 = area.point1) === null || _area$point3 === void 0 ? void 0 : _area$point3[headerType], (_area$point4 = area.point2) === null || _area$point4 === void 0 ? void 0 : _area$point4[headerType]);
31
+
32
+ for (var i = lowestRowIndex; i <= greatestRowIndex; i++) {
33
+ activeRowIndexes.push(i);
34
+ }
35
+ });
36
+ var activeRowIndexesNoDuplicates = (0, _toConsumableArray2.default)(new Set(activeRowIndexes));
37
+
38
+ if (areasCloned !== null && areasCloned !== void 0 && areasCloned.length && activeRowIndexesNoDuplicates.includes(headerIndex)) {
39
+ return true;
40
+ }
41
+
42
+ return false;
43
+ };
44
+
45
+ exports.checkActiveHeaderCell = checkActiveHeaderCell;