@carbon/ibm-products 1.6.1 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/css/index-full-carbon.css +224 -143
- package/css/index-full-carbon.css.map +1 -1
- package/css/index-full-carbon.min.css +3 -3
- package/css/index-full-carbon.min.css.map +1 -1
- package/css/index-without-carbon-released-only.css +1 -2
- package/css/index-without-carbon-released-only.css.map +1 -1
- package/css/index-without-carbon-released-only.min.css +1 -1
- package/css/index-without-carbon-released-only.min.css.map +1 -1
- package/css/index-without-carbon.css +178 -142
- package/css/index-without-carbon.css.map +1 -1
- package/css/index-without-carbon.min.css +3 -3
- package/css/index-without-carbon.min.css.map +1 -1
- package/css/index.css +178 -142
- package/css/index.css.map +1 -1
- package/css/index.min.css +3 -3
- package/css/index.min.css.map +1 -1
- package/es/components/APIKeyModal/APIKeyModal.js +10 -13
- package/es/components/ActionBar/ActionBar.js +0 -3
- package/es/components/ActionBar/ActionBarItem.js +2 -6
- package/es/components/ActionSet/ActionSet.js +11 -13
- package/es/components/AddSelect/AddSelect.js +121 -25
- package/es/components/AddSelect/AddSelectBreadcrumbs.js +5 -5
- package/es/components/AddSelect/AddSelectColumn.js +21 -0
- package/es/components/AddSelect/AddSelectList.js +68 -9
- package/es/components/AddSelect/AddSelectSidebar.js +43 -5
- package/es/components/BreadcrumbWithOverflow/BreadcrumbWithOverflow.js +0 -3
- package/es/components/ButtonMenu/ButtonMenu.js +6 -4
- package/es/components/ButtonMenu/ButtonMenuItem.js +1 -2
- package/es/components/Card/Card.js +31 -21
- package/es/components/Card/CardFooter.js +14 -10
- package/es/components/Card/CardHeader.js +8 -6
- package/es/components/Cascade/Cascade.js +5 -4
- package/es/components/ComboButton/ComboButton.js +0 -4
- package/es/components/ComboButton/ComboButtonItem/index.js +0 -5
- package/es/components/CreateFullPage/CreateFullPageStep.js +15 -8
- package/es/components/CreateModal/CreateModal.js +1 -4
- package/es/components/CreateTearsheet/CreateTearsheet.js +10 -11
- package/es/components/CreateTearsheet/CreateTearsheetStep.js +18 -14
- package/es/components/DataSpreadsheet/DataSpreadsheet.js +454 -0
- package/es/components/DataSpreadsheet/DataSpreadsheetBody.js +322 -0
- package/es/components/DataSpreadsheet/DataSpreadsheetHeader.js +64 -0
- package/es/components/DataSpreadsheet/createActiveCellFn.js +45 -0
- package/es/components/DataSpreadsheet/createCellSelectionArea.js +45 -0
- package/es/components/DataSpreadsheet/generateData.js +47 -0
- package/es/components/DataSpreadsheet/getCellSize.js +30 -0
- package/es/components/{CancelableTextEdit → DataSpreadsheet}/index.js +2 -2
- package/es/components/EditSidePanel/EditSidePanel.js +9 -10
- package/es/components/EmptyStates/EmptyState.js +7 -6
- package/es/components/EmptyStates/ErrorEmptyState/ErrorEmptyState.js +4 -8
- package/es/components/EmptyStates/NoDataEmptyState/NoDataEmptyState.js +4 -8
- package/es/components/EmptyStates/NoTagsEmptyState/NoTagsEmptyState.js +4 -8
- package/es/components/EmptyStates/NotFoundEmptyState/NotFoundEmptyState.js +4 -8
- package/es/components/EmptyStates/NotificationsEmptyState/NotificationsEmptyState.js +4 -8
- package/es/components/EmptyStates/UnauthorizedEmptyState/UnauthorizedEmptyState.js +4 -8
- package/es/components/ExampleComponent/ExampleComponent.js +12 -13
- package/es/components/ExportModal/ExportModal.js +13 -9
- package/es/components/ExpressiveCard/ExpressiveCard.js +0 -8
- package/es/components/ImportModal/ImportModal.js +7 -5
- package/es/components/InlineEdit/InlineEdit.js +51 -46
- package/es/components/LoadingBar/LoadingBar.js +13 -17
- package/es/components/ModifiedTabs/ModifiedTabLabelNew.js +0 -4
- package/es/components/ModifiedTabs/ModifiedTabLabelWithClose.js +0 -5
- package/es/components/ModifiedTabs/ModifiedTabs.js +24 -18
- package/es/components/NotificationsPanel/NotificationsPanel.js +109 -86
- package/es/components/OptionsTile/OptionsTile.js +6 -9
- package/es/components/PageHeader/PageHeader.js +10 -7
- package/es/components/ProductiveCard/ProductiveCard.js +23 -12
- package/es/components/RemoveModal/RemoveModal.js +0 -3
- package/es/components/SidePanel/SidePanel.js +22 -17
- package/es/components/TagSet/TagSet.js +13 -9
- package/es/components/TagSet/TagSetModal.js +16 -12
- package/es/components/TagSet/TagSetOverflow.js +21 -13
- package/es/components/Tearsheet/Tearsheet.js +27 -18
- package/es/components/Tearsheet/TearsheetNarrow.js +18 -15
- package/es/components/Tearsheet/TearsheetShell.js +3 -4
- package/es/components/Toolbar/ToolbarButton.js +0 -3
- package/es/components/WebTerminal/WebTerminal.js +17 -18
- package/es/components/index.js +2 -2
- package/es/global/js/hooks/index.js +1 -0
- package/es/global/js/hooks/useActiveElement.js +27 -0
- package/es/global/js/package-settings.js +2 -1
- package/es/global/js/utils/DisplayBox.js +31 -0
- package/es/global/js/utils/Wrap.js +7 -5
- package/es/global/js/utils/deepCloneObject.js +26 -0
- package/es/global/js/utils/getScrollbarWidth.js +14 -0
- package/lib/components/APIKeyModal/APIKeyModal.js +10 -13
- package/lib/components/ActionBar/ActionBar.js +0 -3
- package/lib/components/ActionBar/ActionBarItem.js +2 -6
- package/lib/components/ActionSet/ActionSet.js +11 -13
- package/lib/components/AddSelect/AddSelect.js +119 -24
- package/lib/components/AddSelect/AddSelectBreadcrumbs.js +3 -4
- package/lib/components/AddSelect/AddSelectColumn.js +37 -0
- package/lib/components/AddSelect/AddSelectList.js +66 -9
- package/lib/components/AddSelect/AddSelectSidebar.js +43 -4
- package/lib/components/BreadcrumbWithOverflow/BreadcrumbWithOverflow.js +0 -3
- package/lib/components/ButtonMenu/ButtonMenu.js +6 -4
- package/lib/components/ButtonMenu/ButtonMenuItem.js +1 -2
- package/lib/components/Card/Card.js +31 -21
- package/lib/components/Card/CardFooter.js +14 -10
- package/lib/components/Card/CardHeader.js +8 -6
- package/lib/components/Cascade/Cascade.js +5 -4
- package/lib/components/ComboButton/ComboButton.js +0 -4
- package/lib/components/ComboButton/ComboButtonItem/index.js +0 -5
- package/lib/components/CreateFullPage/CreateFullPageStep.js +17 -14
- package/lib/components/CreateModal/CreateModal.js +1 -4
- package/lib/components/CreateTearsheet/CreateTearsheet.js +10 -11
- package/lib/components/CreateTearsheet/CreateTearsheetStep.js +20 -20
- package/lib/components/DataSpreadsheet/DataSpreadsheet.js +478 -0
- package/lib/components/DataSpreadsheet/DataSpreadsheetBody.js +349 -0
- package/lib/components/DataSpreadsheet/DataSpreadsheetHeader.js +80 -0
- package/lib/components/DataSpreadsheet/createActiveCellFn.js +56 -0
- package/lib/components/DataSpreadsheet/createCellSelectionArea.js +56 -0
- package/lib/components/DataSpreadsheet/generateData.js +58 -0
- package/lib/components/DataSpreadsheet/getCellSize.js +39 -0
- package/lib/components/DataSpreadsheet/index.js +13 -0
- package/lib/components/EditSidePanel/EditSidePanel.js +9 -10
- package/lib/components/EmptyStates/EmptyState.js +9 -8
- package/lib/components/EmptyStates/ErrorEmptyState/ErrorEmptyState.js +3 -7
- package/lib/components/EmptyStates/NoDataEmptyState/NoDataEmptyState.js +3 -7
- package/lib/components/EmptyStates/NoTagsEmptyState/NoTagsEmptyState.js +3 -7
- package/lib/components/EmptyStates/NotFoundEmptyState/NotFoundEmptyState.js +3 -7
- package/lib/components/EmptyStates/NotificationsEmptyState/NotificationsEmptyState.js +3 -7
- package/lib/components/EmptyStates/UnauthorizedEmptyState/UnauthorizedEmptyState.js +3 -7
- package/lib/components/ExampleComponent/ExampleComponent.js +12 -13
- package/lib/components/ExportModal/ExportModal.js +13 -9
- package/lib/components/ExpressiveCard/ExpressiveCard.js +0 -8
- package/lib/components/ImportModal/ImportModal.js +7 -5
- package/lib/components/InlineEdit/InlineEdit.js +51 -46
- package/lib/components/LoadingBar/LoadingBar.js +13 -17
- package/lib/components/ModifiedTabs/ModifiedTabLabelNew.js +0 -4
- package/lib/components/ModifiedTabs/ModifiedTabLabelWithClose.js +0 -5
- package/lib/components/ModifiedTabs/ModifiedTabs.js +24 -18
- package/lib/components/NotificationsPanel/NotificationsPanel.js +109 -86
- package/lib/components/OptionsTile/OptionsTile.js +6 -9
- package/lib/components/PageHeader/PageHeader.js +9 -6
- package/lib/components/ProductiveCard/ProductiveCard.js +24 -18
- package/lib/components/RemoveModal/RemoveModal.js +0 -3
- package/lib/components/SidePanel/SidePanel.js +22 -17
- package/lib/components/TagSet/TagSet.js +13 -9
- package/lib/components/TagSet/TagSetModal.js +17 -13
- package/lib/components/TagSet/TagSetOverflow.js +24 -19
- package/lib/components/Tearsheet/Tearsheet.js +26 -17
- package/lib/components/Tearsheet/TearsheetNarrow.js +18 -15
- package/lib/components/Tearsheet/TearsheetShell.js +2 -3
- package/lib/components/Toolbar/ToolbarButton.js +0 -3
- package/lib/components/WebTerminal/WebTerminal.js +17 -18
- package/lib/components/index.js +8 -8
- package/lib/global/js/hooks/index.js +8 -0
- package/lib/global/js/hooks/useActiveElement.js +39 -0
- package/lib/global/js/package-settings.js +2 -1
- package/lib/global/js/utils/DisplayBox.js +46 -0
- package/lib/global/js/utils/Wrap.js +7 -5
- package/lib/global/js/utils/deepCloneObject.js +37 -0
- package/lib/global/js/utils/getScrollbarWidth.js +23 -0
- package/package.json +18 -16
- package/scss/components/{CancelableTextEdit → ActionBar}/_storybook-styles.scss +2 -2
- package/scss/components/ActionSet/_storybook-styles.scss +1 -3
- package/scss/components/AddSelect/_add-select.scss +77 -1
- package/scss/components/BreadcrumbWithOverflow/_storybook-styles.scss +8 -0
- package/scss/components/ButtonSetWithOverflow/_storybook-styles.scss +8 -0
- package/scss/components/DataSpreadsheet/_data-spreadsheet.scss +120 -0
- package/scss/components/{CancelableTextEdit → DataSpreadsheet}/_index.scss +2 -2
- package/scss/components/DataSpreadsheet/_storybook-styles.scss +6 -0
- package/scss/components/InlineEdit/_inline-edit.scss +22 -8
- package/scss/components/InlineEdit/_storybook-styles.scss +1 -0
- package/scss/components/TagSet/_storybook-styles.scss +8 -0
- package/scss/components/Tearsheet/_tearsheet.scss +1 -2
- package/scss/components/_index.scss +1 -1
- package/scss/global/styles/_display-box.scss +62 -0
- package/es/components/CancelableTextEdit/CancelableTextEdit.js +0 -245
- package/lib/components/CancelableTextEdit/CancelableTextEdit.js +0 -265
- package/lib/components/CancelableTextEdit/index.js +0 -13
- package/scss/components/CancelableTextEdit/_cancelable-text-edit.scss +0 -212
|
@@ -0,0 +1,454 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
3
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
4
|
+
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
|
|
5
|
+
var _excluded = ["cellSize", "className", "columns", "data", "id", "onActiveCellChange"];
|
|
6
|
+
|
|
7
|
+
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; }
|
|
8
|
+
|
|
9
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Copyright IBM Corp. 2022, 2022
|
|
13
|
+
*
|
|
14
|
+
* This source code is licensed under the Apache-2.0 license found in the
|
|
15
|
+
* LICENSE file in the root directory of this source tree.
|
|
16
|
+
*/
|
|
17
|
+
// Import portions of React that are needed.
|
|
18
|
+
import React, { useMemo, useRef, useEffect, useState, useCallback } from 'react';
|
|
19
|
+
import { useBlockLayout, useTable } from 'react-table'; // Other standard imports.
|
|
20
|
+
|
|
21
|
+
import PropTypes from 'prop-types';
|
|
22
|
+
import cx from 'classnames';
|
|
23
|
+
import { getDevtoolsProps } from '../../global/js/utils/devtools';
|
|
24
|
+
import { pkg } from '../../settings';
|
|
25
|
+
import { getScrollbarWidth } from '../../global/js/utils/getScrollbarWidth';
|
|
26
|
+
import { DataSpreadsheetBody } from './DataSpreadsheetBody';
|
|
27
|
+
import { getCellSize } from './getCellSize';
|
|
28
|
+
import { DataSpreadsheetHeader } from './DataSpreadsheetHeader';
|
|
29
|
+
import { useActiveElement } from '../../global/js/hooks';
|
|
30
|
+
import { createActiveCellFn } from './createActiveCellFn'; // cspell:words rowcount colcount
|
|
31
|
+
// The block part of our conventional BEM class names (blockClass__E--M).
|
|
32
|
+
|
|
33
|
+
var blockClass = "".concat(pkg.prefix, "--data-spreadsheet");
|
|
34
|
+
var componentName = 'DataSpreadsheet'; // Default values for props
|
|
35
|
+
|
|
36
|
+
var defaults = {
|
|
37
|
+
cellSize: 'standard',
|
|
38
|
+
columns: Object.freeze([]),
|
|
39
|
+
data: Object.freeze([])
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* DataSpreadsheet: used to organize and display large amounts of structured data, separated by columns and rows in a grid-like format.
|
|
43
|
+
*/
|
|
44
|
+
|
|
45
|
+
export var DataSpreadsheet = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
46
|
+
var _ref$cellSize = _ref.cellSize,
|
|
47
|
+
cellSize = _ref$cellSize === void 0 ? defaults.cellSize : _ref$cellSize,
|
|
48
|
+
className = _ref.className,
|
|
49
|
+
_ref$columns = _ref.columns,
|
|
50
|
+
columns = _ref$columns === void 0 ? defaults.columns : _ref$columns,
|
|
51
|
+
_ref$data = _ref.data,
|
|
52
|
+
data = _ref$data === void 0 ? defaults.data : _ref$data,
|
|
53
|
+
id = _ref.id,
|
|
54
|
+
onActiveCellChange = _ref.onActiveCellChange,
|
|
55
|
+
rest = _objectWithoutProperties(_ref, _excluded);
|
|
56
|
+
|
|
57
|
+
var focusedElement = useActiveElement();
|
|
58
|
+
|
|
59
|
+
var _useState = useState(false),
|
|
60
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
61
|
+
containerHasFocus = _useState2[0],
|
|
62
|
+
setContainerHasFocus = _useState2[1];
|
|
63
|
+
|
|
64
|
+
var _useState3 = useState(null),
|
|
65
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
66
|
+
activeCellCoordinates = _useState4[0],
|
|
67
|
+
setActiveCellCoordinates = _useState4[1];
|
|
68
|
+
|
|
69
|
+
var _useState5 = useState([]),
|
|
70
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
71
|
+
selectionAreas = _useState6[0],
|
|
72
|
+
setSelectionAreas = _useState6[1];
|
|
73
|
+
|
|
74
|
+
var _useState7 = useState(false),
|
|
75
|
+
_useState8 = _slicedToArray(_useState7, 2),
|
|
76
|
+
clickAndHoldActive = _useState8[0],
|
|
77
|
+
setClickAndHoldActive = _useState8[1];
|
|
78
|
+
|
|
79
|
+
var _useState9 = useState(null),
|
|
80
|
+
_useState10 = _slicedToArray(_useState9, 2),
|
|
81
|
+
currentMatcher = _useState10[0],
|
|
82
|
+
setCurrentMatcher = _useState10[1];
|
|
83
|
+
|
|
84
|
+
var cellSizeValue = getCellSize(cellSize);
|
|
85
|
+
var defaultColumn = useMemo(function () {
|
|
86
|
+
return {
|
|
87
|
+
width: 150,
|
|
88
|
+
rowHeaderWidth: 64,
|
|
89
|
+
rowHeight: cellSizeValue
|
|
90
|
+
};
|
|
91
|
+
}, [cellSizeValue]);
|
|
92
|
+
var scrollBarSize = useMemo(function () {
|
|
93
|
+
return getScrollbarWidth();
|
|
94
|
+
}, []);
|
|
95
|
+
|
|
96
|
+
var _useTable = useTable({
|
|
97
|
+
columns: columns,
|
|
98
|
+
data: data,
|
|
99
|
+
defaultColumn: defaultColumn
|
|
100
|
+
}, useBlockLayout),
|
|
101
|
+
getTableProps = _useTable.getTableProps,
|
|
102
|
+
getTableBodyProps = _useTable.getTableBodyProps,
|
|
103
|
+
headerGroups = _useTable.headerGroups,
|
|
104
|
+
rows = _useTable.rows,
|
|
105
|
+
totalColumnsWidth = _useTable.totalColumnsWidth,
|
|
106
|
+
prepareRow = _useTable.prepareRow; // Reset everything when spreadsheet loses focus
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
useEffect(function () {
|
|
110
|
+
if (!focusedElement.classList.contains("".concat(blockClass, "--interactive-cell-element"))) {
|
|
111
|
+
setContainerHasFocus(false);
|
|
112
|
+
removeActiveCell();
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (focusedElement.classList.contains(blockClass) || focusedElement.classList.contains("".concat(blockClass, "--interactive-cell-element"))) {
|
|
116
|
+
setContainerHasFocus(true);
|
|
117
|
+
}
|
|
118
|
+
}, [focusedElement, removeActiveCell]); // Removes the active cell element
|
|
119
|
+
|
|
120
|
+
var removeActiveCell = useCallback(function () {
|
|
121
|
+
var activeCellHighlight = spreadsheetRef.current.querySelector(".".concat(blockClass, "__active-cell--highlight"));
|
|
122
|
+
|
|
123
|
+
if (activeCellHighlight) {
|
|
124
|
+
activeCellHighlight.remove();
|
|
125
|
+
}
|
|
126
|
+
}, [spreadsheetRef]); // Removes the cell selection elements
|
|
127
|
+
|
|
128
|
+
var removeCellSelections = useCallback(function () {
|
|
129
|
+
var cellSelections = spreadsheetRef.current.querySelectorAll(".".concat(blockClass, "__selection-area--element"));
|
|
130
|
+
Array.from(cellSelections).forEach(function (element) {
|
|
131
|
+
return element.remove();
|
|
132
|
+
});
|
|
133
|
+
}, [spreadsheetRef]); // Click outside useEffect
|
|
134
|
+
|
|
135
|
+
useEffect(function () {
|
|
136
|
+
var handleOutsideClick = function handleOutsideClick(event) {
|
|
137
|
+
if (!spreadsheetRef.current || spreadsheetRef.current.contains(event.target) || event.target.classList.contains("".concat(blockClass, "__active-cell--highlight"))) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
setSelectionAreas([]);
|
|
142
|
+
removeActiveCell();
|
|
143
|
+
removeCellSelections();
|
|
144
|
+
setContainerHasFocus(false);
|
|
145
|
+
setActiveCellCoordinates(null);
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
document.addEventListener('click', handleOutsideClick);
|
|
149
|
+
return function () {
|
|
150
|
+
document.removeEventListener('click', handleOutsideClick);
|
|
151
|
+
};
|
|
152
|
+
}, [spreadsheetRef, removeActiveCell, removeCellSelections]);
|
|
153
|
+
var createActiveCell = useCallback(function (_ref2) {
|
|
154
|
+
var placementElement = _ref2.placementElement,
|
|
155
|
+
coords = _ref2.coords,
|
|
156
|
+
_ref2$addToHeader = _ref2.addToHeader,
|
|
157
|
+
addToHeader = _ref2$addToHeader === void 0 ? false : _ref2$addToHeader;
|
|
158
|
+
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;
|
|
159
|
+
var activeCellValue = activeCellFullData ? Object.values(activeCellFullData.row.values)[coords === null || coords === void 0 ? void 0 : coords.column] : null;
|
|
160
|
+
createActiveCellFn({
|
|
161
|
+
placementElement: placementElement,
|
|
162
|
+
coords: coords,
|
|
163
|
+
addToHeader: addToHeader,
|
|
164
|
+
contextRef: spreadsheetRef,
|
|
165
|
+
blockClass: blockClass,
|
|
166
|
+
onActiveCellChange: onActiveCellChange,
|
|
167
|
+
activeCellValue: activeCellValue
|
|
168
|
+
});
|
|
169
|
+
}, [spreadsheetRef, rows, onActiveCellChange]);
|
|
170
|
+
var handleInitialArrowPress = useCallback(function () {
|
|
171
|
+
// If activeCellCoordinates is null then we need to set an initial value
|
|
172
|
+
// which will place the activeCell on the select all cell/button
|
|
173
|
+
if (!activeCellCoordinates) {
|
|
174
|
+
setActiveCellCoordinates({
|
|
175
|
+
column: 'header',
|
|
176
|
+
row: 'header'
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return;
|
|
181
|
+
}, [activeCellCoordinates]);
|
|
182
|
+
|
|
183
|
+
var updateActiveCellCoordinates = function updateActiveCellCoordinates(_ref3) {
|
|
184
|
+
var coords = _ref3.coords,
|
|
185
|
+
updatedValue = _ref3.updatedValue;
|
|
186
|
+
setActiveCellCoordinates(_objectSpread(_objectSpread({}, coords), updatedValue));
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
var handleKeyPress = useCallback(function (event) {
|
|
190
|
+
var keyCode = event.keyCode; // Command keys need to be returned as there is default browser behavior with these keys
|
|
191
|
+
|
|
192
|
+
if (keyCode === 91 || keyCode === 93) {
|
|
193
|
+
return;
|
|
194
|
+
} // Prevent arrow keys, home key, and end key from scrolling the page when the data spreadsheet container has focus
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
if ([35, 36, 37, 38, 39, 40].indexOf(keyCode) > -1) {
|
|
198
|
+
event.preventDefault();
|
|
199
|
+
} // Clear out all cell selection areas if user uses any arrow key
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
if ([37, 38, 39, 40].indexOf(keyCode) > -1) {
|
|
203
|
+
if (selectionAreas !== null && selectionAreas !== void 0 && selectionAreas.length) {
|
|
204
|
+
setSelectionAreas([]);
|
|
205
|
+
removeCellSelections();
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
switch (keyCode) {
|
|
210
|
+
// Tab
|
|
211
|
+
case 9:
|
|
212
|
+
{
|
|
213
|
+
setSelectionAreas([]);
|
|
214
|
+
removeActiveCell();
|
|
215
|
+
setContainerHasFocus(false);
|
|
216
|
+
setActiveCellCoordinates(null);
|
|
217
|
+
break;
|
|
218
|
+
}
|
|
219
|
+
// Left
|
|
220
|
+
|
|
221
|
+
case 37:
|
|
222
|
+
{
|
|
223
|
+
handleInitialArrowPress();
|
|
224
|
+
|
|
225
|
+
var coordinatesClone = _objectSpread({}, activeCellCoordinates);
|
|
226
|
+
|
|
227
|
+
if (coordinatesClone.column === 'header') {
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
if (typeof coordinatesClone.column === 'number') {
|
|
232
|
+
if (coordinatesClone.column === 0) {
|
|
233
|
+
updateActiveCellCoordinates({
|
|
234
|
+
coords: coordinatesClone,
|
|
235
|
+
updatedValue: {
|
|
236
|
+
column: 'header'
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
updateActiveCellCoordinates({
|
|
243
|
+
coords: coordinatesClone,
|
|
244
|
+
updatedValue: {
|
|
245
|
+
column: coordinatesClone.column - 1
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
// Up
|
|
253
|
+
|
|
254
|
+
case 38:
|
|
255
|
+
{
|
|
256
|
+
handleInitialArrowPress();
|
|
257
|
+
|
|
258
|
+
var _coordinatesClone = _objectSpread({}, activeCellCoordinates);
|
|
259
|
+
|
|
260
|
+
if (_coordinatesClone.row === 'header') {
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
if (typeof _coordinatesClone.row === 'number') {
|
|
265
|
+
// set row back to header if we are at index 0
|
|
266
|
+
if (_coordinatesClone.row === 0) {
|
|
267
|
+
updateActiveCellCoordinates({
|
|
268
|
+
coords: _coordinatesClone,
|
|
269
|
+
updatedValue: {
|
|
270
|
+
row: 'header'
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
return;
|
|
274
|
+
} // if we are at any other index than 0, subtract 1 from current row index
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
updateActiveCellCoordinates({
|
|
278
|
+
coords: _coordinatesClone,
|
|
279
|
+
updatedValue: {
|
|
280
|
+
row: _coordinatesClone.row - 1
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
// Right
|
|
288
|
+
|
|
289
|
+
case 39:
|
|
290
|
+
{
|
|
291
|
+
handleInitialArrowPress();
|
|
292
|
+
|
|
293
|
+
var _coordinatesClone2 = _objectSpread({}, activeCellCoordinates);
|
|
294
|
+
|
|
295
|
+
if (_coordinatesClone2.column === 'header') {
|
|
296
|
+
updateActiveCellCoordinates({
|
|
297
|
+
coords: _coordinatesClone2,
|
|
298
|
+
updatedValue: {
|
|
299
|
+
column: 0
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
if (typeof _coordinatesClone2.column === 'number') {
|
|
305
|
+
// Prevent active cell coordinates from updating if the active
|
|
306
|
+
// cell is in the last column, ie we can't go any further to the right
|
|
307
|
+
if (columns.length - 1 === _coordinatesClone2.column) {
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
updateActiveCellCoordinates({
|
|
312
|
+
coords: _coordinatesClone2,
|
|
313
|
+
updatedValue: {
|
|
314
|
+
column: _coordinatesClone2.column + 1
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
break;
|
|
320
|
+
}
|
|
321
|
+
// Down
|
|
322
|
+
|
|
323
|
+
case 40:
|
|
324
|
+
{
|
|
325
|
+
handleInitialArrowPress();
|
|
326
|
+
|
|
327
|
+
var _coordinatesClone3 = _objectSpread({}, activeCellCoordinates);
|
|
328
|
+
|
|
329
|
+
if (_coordinatesClone3.row === 'header') {
|
|
330
|
+
updateActiveCellCoordinates({
|
|
331
|
+
coords: _coordinatesClone3,
|
|
332
|
+
updatedValue: {
|
|
333
|
+
row: 0
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
if (typeof _coordinatesClone3.row === 'number') {
|
|
339
|
+
// Prevent active cell coordinates from updating if the active
|
|
340
|
+
// cell is in the last row, ie we can't go any further down since
|
|
341
|
+
// we are in the last row
|
|
342
|
+
if (rows.length - 1 === _coordinatesClone3.row) {
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
updateActiveCellCoordinates({
|
|
347
|
+
coords: _coordinatesClone3,
|
|
348
|
+
updatedValue: {
|
|
349
|
+
row: _coordinatesClone3.row + 1
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
break;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}, [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
|
|
358
|
+
|
|
359
|
+
useEffect(function () {
|
|
360
|
+
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, "\"]"));
|
|
361
|
+
var shouldPlaceActiveCellInHeader = (activeCellCoordinates === null || activeCellCoordinates === void 0 ? void 0 : activeCellCoordinates.row) === 'header' && true;
|
|
362
|
+
var selectAllElement = spreadsheetRef === null || spreadsheetRef === void 0 ? void 0 : spreadsheetRef.current.querySelector("[data-row-index=\"header\"][data-column-index=\"header\"]");
|
|
363
|
+
|
|
364
|
+
if (containerHasFocus) {
|
|
365
|
+
createActiveCell({
|
|
366
|
+
placementElement: activeCellCoordinates ? activeCellPlacementElement : selectAllElement,
|
|
367
|
+
coords: activeCellCoordinates,
|
|
368
|
+
addToHeader: shouldPlaceActiveCellInHeader
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
}, [activeCellCoordinates, spreadsheetRef, createActiveCell, containerHasFocus]);
|
|
372
|
+
var localRef = useRef();
|
|
373
|
+
var spreadsheetRef = ref || localRef;
|
|
374
|
+
return /*#__PURE__*/React.createElement("div", _extends({}, rest, getTableProps(), getDevtoolsProps(componentName), {
|
|
375
|
+
className: cx(blockClass, className, _defineProperty({}, "".concat(blockClass, "__container-has-focus"), containerHasFocus)),
|
|
376
|
+
ref: spreadsheetRef,
|
|
377
|
+
role: "grid",
|
|
378
|
+
tabIndex: 0,
|
|
379
|
+
"aria-rowcount": (rows === null || rows === void 0 ? void 0 : rows.length) || 0,
|
|
380
|
+
"aria-colcount": (columns === null || columns === void 0 ? void 0 : columns.length) || 0,
|
|
381
|
+
onKeyDown: handleKeyPress,
|
|
382
|
+
onFocus: function onFocus() {
|
|
383
|
+
return setContainerHasFocus(true);
|
|
384
|
+
}
|
|
385
|
+
}), /*#__PURE__*/React.createElement(DataSpreadsheetHeader, {
|
|
386
|
+
cellSizeValue: cellSizeValue,
|
|
387
|
+
defaultColumn: defaultColumn,
|
|
388
|
+
headerGroups: headerGroups
|
|
389
|
+
}), /*#__PURE__*/React.createElement(DataSpreadsheetBody, {
|
|
390
|
+
clickAndHoldActive: clickAndHoldActive,
|
|
391
|
+
setClickAndHoldActive: setClickAndHoldActive,
|
|
392
|
+
currentMatcher: currentMatcher,
|
|
393
|
+
setCurrentMatcher: setCurrentMatcher,
|
|
394
|
+
setContainerHasFocus: setContainerHasFocus,
|
|
395
|
+
selectionAreas: selectionAreas,
|
|
396
|
+
setSelectionAreas: setSelectionAreas,
|
|
397
|
+
cellSize: cellSize,
|
|
398
|
+
defaultColumn: defaultColumn,
|
|
399
|
+
getTableBodyProps: getTableBodyProps,
|
|
400
|
+
onActiveCellChange: onActiveCellChange,
|
|
401
|
+
prepareRow: prepareRow,
|
|
402
|
+
rows: rows,
|
|
403
|
+
setActiveCellCoordinates: setActiveCellCoordinates,
|
|
404
|
+
scrollBarSize: scrollBarSize,
|
|
405
|
+
totalColumnsWidth: totalColumnsWidth,
|
|
406
|
+
id: id
|
|
407
|
+
}));
|
|
408
|
+
}); // Return a placeholder if not released and not enabled by feature flag
|
|
409
|
+
|
|
410
|
+
DataSpreadsheet = pkg.checkComponentEnabled(DataSpreadsheet, componentName); // The display name of the component, used by React. Note that displayName
|
|
411
|
+
// is used in preference to relying on function.name.
|
|
412
|
+
|
|
413
|
+
DataSpreadsheet.displayName = componentName; // The types and DocGen commentary for the component props,
|
|
414
|
+
// in alphabetical order (for consistency).
|
|
415
|
+
// See https://www.npmjs.com/package/prop-types#usage.
|
|
416
|
+
|
|
417
|
+
DataSpreadsheet.propTypes = {
|
|
418
|
+
/**
|
|
419
|
+
* Specifies the cell height
|
|
420
|
+
*/
|
|
421
|
+
cellSize: PropTypes.oneOf(['compact', 'standard', 'medium', 'large']),
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* Provide an optional class to be applied to the containing node.
|
|
425
|
+
*/
|
|
426
|
+
className: PropTypes.string,
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* The data that will build the column headers
|
|
430
|
+
*/
|
|
431
|
+
columns: PropTypes.arrayOf(PropTypes.shape({
|
|
432
|
+
Header: PropTypes.string,
|
|
433
|
+
accessor: PropTypes.oneOfType([PropTypes.string, PropTypes.func]),
|
|
434
|
+
Cell: PropTypes.func // optional cell formatter
|
|
435
|
+
|
|
436
|
+
})),
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* The spreadsheet data that will be rendered in the body of the spreadsheet component
|
|
440
|
+
*/
|
|
441
|
+
data: PropTypes.arrayOf(PropTypes.shape),
|
|
442
|
+
|
|
443
|
+
/**
|
|
444
|
+
* The spreadsheet id
|
|
445
|
+
*/
|
|
446
|
+
id: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
|
|
447
|
+
|
|
448
|
+
/**
|
|
449
|
+
* The event handler that is called when the active cell changes
|
|
450
|
+
*/
|
|
451
|
+
onActiveCellChange: PropTypes.func
|
|
452
|
+
/* TODO: add types and DocGen for all props. */
|
|
453
|
+
|
|
454
|
+
};
|