box-ui-elements 20.0.1-beta.1 → 20.0.1-beta.1.1
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/es/components/table/makeSelectable.js +18 -4
- package/es/components/table/makeSelectable.js.flow +15 -4
- package/es/components/table/makeSelectable.js.map +1 -1
- package/package.json +12 -44
- package/src/components/table/makeSelectable.js +15 -4
- package/src/features/virtualized-table-renderers/__tests__/lastModifiedByCellRenderer.test.js +0 -4
- package/src/features/virtualized-table-renderers/__tests__/__snapshots__/lastModifiedByCellRenderer.test.js.snap +0 -3
|
@@ -93,6 +93,10 @@ function makeSelectable(BaseTable) {
|
|
|
93
93
|
key: 'down',
|
|
94
94
|
description: React.createElement(FormattedMessage, messages.downDescription),
|
|
95
95
|
handler: event => {
|
|
96
|
+
if (this.isQuickFilter(event)) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
|
|
96
100
|
const {
|
|
97
101
|
data
|
|
98
102
|
} = this.props;
|
|
@@ -110,6 +114,10 @@ function makeSelectable(BaseTable) {
|
|
|
110
114
|
key: 'up',
|
|
111
115
|
description: React.createElement(FormattedMessage, messages.upDescription),
|
|
112
116
|
handler: event => {
|
|
117
|
+
if (this.isQuickFilter(event)) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
|
|
113
121
|
const {
|
|
114
122
|
focusedIndex = 0
|
|
115
123
|
} = this.state;
|
|
@@ -166,7 +174,7 @@ function makeSelectable(BaseTable) {
|
|
|
166
174
|
key: 'right',
|
|
167
175
|
description: React.createElement(FormattedMessage, messages.downDescription),
|
|
168
176
|
handler: event => {
|
|
169
|
-
if (this.isTargetSlider(event)) {
|
|
177
|
+
if (this.isTargetSlider(event) || this.isQuickFilter(event)) {
|
|
170
178
|
return;
|
|
171
179
|
}
|
|
172
180
|
|
|
@@ -187,7 +195,7 @@ function makeSelectable(BaseTable) {
|
|
|
187
195
|
key: 'left',
|
|
188
196
|
description: React.createElement(FormattedMessage, messages.upDescription),
|
|
189
197
|
handler: event => {
|
|
190
|
-
if (this.isTargetSlider(event)) {
|
|
198
|
+
if (this.isTargetSlider(event) || this.isQuickFilter(event)) {
|
|
191
199
|
return;
|
|
192
200
|
}
|
|
193
201
|
|
|
@@ -205,7 +213,7 @@ function makeSelectable(BaseTable) {
|
|
|
205
213
|
key: 'down',
|
|
206
214
|
description: React.createElement(FormattedMessage, messages.downDescription),
|
|
207
215
|
handler: event => {
|
|
208
|
-
if (this.isTargetSlider(event)) {
|
|
216
|
+
if (this.isTargetSlider(event) || this.isQuickFilter(event)) {
|
|
209
217
|
return;
|
|
210
218
|
}
|
|
211
219
|
|
|
@@ -227,7 +235,7 @@ function makeSelectable(BaseTable) {
|
|
|
227
235
|
key: 'up',
|
|
228
236
|
description: React.createElement(FormattedMessage, messages.upDescription),
|
|
229
237
|
handler: event => {
|
|
230
|
-
if (this.isTargetSlider(event)) {
|
|
238
|
+
if (this.isTargetSlider(event) || this.isQuickFilter(event)) {
|
|
231
239
|
return;
|
|
232
240
|
}
|
|
233
241
|
|
|
@@ -581,6 +589,12 @@ function makeSelectable(BaseTable) {
|
|
|
581
589
|
return ((_event$target = event.target) === null || _event$target === void 0 ? void 0 : _event$target.role) === 'slider';
|
|
582
590
|
});
|
|
583
591
|
|
|
592
|
+
_defineProperty(this, "isQuickFilter", event => {
|
|
593
|
+
var _event$target2;
|
|
594
|
+
|
|
595
|
+
return ((_event$target2 = event.target) === null || _event$target2 === void 0 ? void 0 : _event$target2.dataset) && 'radixCollectionItem' in event.target.dataset;
|
|
596
|
+
});
|
|
597
|
+
|
|
584
598
|
this.anchorIndex = 0;
|
|
585
599
|
this.searchString = '';
|
|
586
600
|
this.searchTimeout = null; // we have to store the previously focused index because a focus event
|
|
@@ -148,6 +148,10 @@ function makeSelectable(BaseTable) {
|
|
|
148
148
|
key: 'down',
|
|
149
149
|
description: <FormattedMessage {...messages.downDescription} />,
|
|
150
150
|
handler: event => {
|
|
151
|
+
if (this.isQuickFilter(event)) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
|
|
151
155
|
const { data } = this.props;
|
|
152
156
|
const { focusedIndex } = this.state;
|
|
153
157
|
|
|
@@ -163,6 +167,10 @@ function makeSelectable(BaseTable) {
|
|
|
163
167
|
key: 'up',
|
|
164
168
|
description: <FormattedMessage {...messages.upDescription} />,
|
|
165
169
|
handler: event => {
|
|
170
|
+
if (this.isQuickFilter(event)) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
|
|
166
174
|
const { focusedIndex = 0 } = this.state;
|
|
167
175
|
|
|
168
176
|
event.preventDefault();
|
|
@@ -213,7 +221,7 @@ function makeSelectable(BaseTable) {
|
|
|
213
221
|
key: 'right',
|
|
214
222
|
description: <FormattedMessage {...messages.downDescription} />,
|
|
215
223
|
handler: event => {
|
|
216
|
-
if (this.isTargetSlider(event)) {
|
|
224
|
+
if (this.isTargetSlider(event) || this.isQuickFilter(event)) {
|
|
217
225
|
return;
|
|
218
226
|
}
|
|
219
227
|
|
|
@@ -232,7 +240,7 @@ function makeSelectable(BaseTable) {
|
|
|
232
240
|
key: 'left',
|
|
233
241
|
description: <FormattedMessage {...messages.upDescription} />,
|
|
234
242
|
handler: event => {
|
|
235
|
-
if (this.isTargetSlider(event)) {
|
|
243
|
+
if (this.isTargetSlider(event) || this.isQuickFilter(event)) {
|
|
236
244
|
return;
|
|
237
245
|
}
|
|
238
246
|
|
|
@@ -249,7 +257,7 @@ function makeSelectable(BaseTable) {
|
|
|
249
257
|
key: 'down',
|
|
250
258
|
description: <FormattedMessage {...messages.downDescription} />,
|
|
251
259
|
handler: event => {
|
|
252
|
-
if (this.isTargetSlider(event)) {
|
|
260
|
+
if (this.isTargetSlider(event) || this.isQuickFilter(event)) {
|
|
253
261
|
return;
|
|
254
262
|
}
|
|
255
263
|
|
|
@@ -268,7 +276,7 @@ function makeSelectable(BaseTable) {
|
|
|
268
276
|
key: 'up',
|
|
269
277
|
description: <FormattedMessage {...messages.upDescription} />,
|
|
270
278
|
handler: event => {
|
|
271
|
-
if (this.isTargetSlider(event)) {
|
|
279
|
+
if (this.isTargetSlider(event) || this.isQuickFilter(event)) {
|
|
272
280
|
return;
|
|
273
281
|
}
|
|
274
282
|
|
|
@@ -604,6 +612,9 @@ function makeSelectable(BaseTable) {
|
|
|
604
612
|
|
|
605
613
|
isTargetSlider = event => event.target?.role === 'slider';
|
|
606
614
|
|
|
615
|
+
// Workaround for focus conflicting with Blueprint components in Search Quick Filters, not needed once Blueprint table is integrated
|
|
616
|
+
isQuickFilter = event => event.target?.dataset && 'radixCollectionItem' in event.target.dataset;
|
|
617
|
+
|
|
607
618
|
render() {
|
|
608
619
|
const { className, data } = this.props;
|
|
609
620
|
const { focusedIndex } = this.state;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/table/makeSelectable.js"],"names":["PropTypes","React","Component","Set","ImmutablePropTypes","classNames","FormattedMessage","Hotkeys","HotkeyRecord","messages","shiftSelect","SEARCH_TIMER_DURATION","makeSelectable","BaseTable","originalDisplayName","displayName","name","SelectableTable","constructor","props","focusedIndex","undefined","selectedItems","newFocusedIndex","onSelect","previousIndex","state","setState","isSet","toJS","hotkeyType","key","description","shiftXDescription","handler","selectToggle","type","selectAllDescription","event","data","preventDefault","deselectAllDescription","downDescription","Math","min","length","upDescription","max","shiftDownDescription","handleShiftKeyDown","shiftUpDescription","isTargetSlider","gridColumnCount","handleShiftKeyDownForGrid","enableHotkeys","isGridView","hotkeys","viewSpecificHotKeyConfigs","getGridViewHotKeyConfigs","getListViewHotKeyConfigs","getSharedHotkeyConfigs","loadedData","rowIndex","getProcessedProps","has","delete","add","anchorIndex","selectedRows","reduce","rows","item","i","push","newSelectedRows","newSelectedItems","map","size","index","metaKey","ctrlKey","shiftKey","selectRange","selectOne","blurTimerID","setTimeout","clearFocus","clearTimeout","boundary","focusedIndexData","newFocusedIndexData","union","selectedItemIndecies","sourceIndex","targetIndex","dataSize","isSourceSelected","isTargetSelected","selectedItemIndices","isContiguousSelection","newSelectedItemIndices","searchStrings","target","hasAttribute","nodeName","which","searchTimeout","searchString","findIndex","string","trim","toLowerCase","indexOf","nativeEvent","role","componentDidMount","document","addEventListener","handleKeyboardSearch","componentDidUpdate","prevProps","prevState","onFocus","componentWillUnmount","removeEventListener","render","className","focusedItem","getHotkeyConfigs","handleCheckboxClick","handleRowClick","handleRowFocus","handleTableBlur","handleTableFocus","array","isRequired","number","bool","func","oneOfType","set"],"mappings":"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","sourcesContent":["import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { Set } from 'immutable';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport classNames from 'classnames';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Hotkeys, HotkeyRecord } from '../hotkeys';\nimport messages from './messages';\nimport shiftSelect from './shiftSelect';\n\nconst SEARCH_TIMER_DURATION = 1000;\n\nfunction makeSelectable(BaseTable) {\n const originalDisplayName = BaseTable.displayName || BaseTable.name || 'Table';\n\n return class SelectableTable extends Component {\n static displayName = `Selectable(${originalDisplayName})`;\n\n static propTypes = {\n className: PropTypes.string,\n /** Array of unique IDs of the items in the table. Each item should be a string or number, in the order they appear in the table. */\n data: PropTypes.array.isRequired,\n gridColumnCount: PropTypes.number,\n isGridView: PropTypes.bool,\n /** Called when focus changes. `(focusedIndex: number) => void` */\n onFocus: PropTypes.func,\n /** Called when selection changes. `(selectedItems: Array<string> | Array<number> | Set<string> | Set<number>) => void` */\n onSelect: PropTypes.func.isRequired,\n /**\n * Array of strings for keyboard search corresponding to the data prop. If not provided, keyboard search won't work.\n * Example: data = ['f_123', 'f_456'], and corresponding searchStrings = ['file.png', 'another file.pdf']\n */\n searchStrings: PropTypes.array,\n /**\n * Array of IDs that are currently selected, in any order.\n * If you pass a native JS array, then your onSelect function will be called with a native JS array;\n * likewise, if you pass an ImmutableJS Set, then your onSelect function will be called\n * with an ImmutableJS Set.\n */\n selectedItems: PropTypes.oneOfType([PropTypes.array, ImmutablePropTypes.set]),\n /** Array of unique IDs of the items in the table that are loaded and accessible. If not provided, this will default to all data */\n loadedData: PropTypes.array,\n enableHotkeys: PropTypes.bool,\n /** Translated type for hotkeys. If not provided, then the hotkeys will not appear in the help modal. */\n hotkeyType: PropTypes.string,\n };\n\n static defaultProps = {\n selectedItems: new Set(),\n };\n\n constructor(props) {\n super(props);\n\n this.anchorIndex = 0;\n\n this.searchString = '';\n this.searchTimeout = null;\n\n // we have to store the previously focused index because a focus event\n // will be fired before the click event; thus, in the click handler,\n // the focusedItem will already be the new item\n this.previousIndex = 0;\n\n this.blurTimerID = null;\n }\n\n state = {\n focusedIndex: undefined,\n };\n\n componentDidMount() {\n document.addEventListener('keypress', this.handleKeyboardSearch);\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevState.focusedIndex !== this.state.focusedIndex && this.props.onFocus) {\n this.props.onFocus(this.state.focusedIndex);\n }\n }\n\n componentWillUnmount() {\n document.removeEventListener('keypress', this.handleKeyboardSearch);\n clearTimeout(this.blurTimerID);\n }\n\n onSelect = (selectedItems, newFocusedIndex) => {\n const { onSelect } = this.props;\n\n this.previousIndex = this.state.focusedIndex || 0;\n\n this.setState({\n focusedIndex: newFocusedIndex,\n });\n\n if (onSelect) {\n // If selectedItems were given as an Immutable Set, they should also be returned as one,\n // and vice versa if they were given as a native JS array\n onSelect(Set.isSet(this.props.selectedItems) ? selectedItems : selectedItems.toJS());\n }\n };\n\n getSharedHotkeyConfigs = () => {\n const { hotkeyType } = this.props;\n return [\n new HotkeyRecord({\n key: 'shift+x',\n description: <FormattedMessage {...messages.shiftXDescription} />,\n handler: () => {\n const { focusedIndex } = this.state;\n\n if (focusedIndex === undefined) {\n return;\n }\n\n this.selectToggle(focusedIndex);\n },\n type: hotkeyType,\n }),\n new HotkeyRecord({\n key: ['meta+a', 'ctrl+a'],\n description: <FormattedMessage {...messages.selectAllDescription} />,\n handler: event => {\n const { data } = this.props;\n\n event.preventDefault();\n\n this.onSelect(new Set(data), this.state.focusedIndex);\n },\n type: hotkeyType,\n }),\n new HotkeyRecord({\n key: 'esc',\n description: <FormattedMessage {...messages.deselectAllDescription} />,\n handler: () => {\n this.onSelect(new Set(), this.state.focusedIndex);\n },\n type: hotkeyType,\n }),\n ];\n };\n\n getListViewHotKeyConfigs = () => {\n const { hotkeyType } = this.props;\n return [\n new HotkeyRecord({\n key: 'down',\n description: <FormattedMessage {...messages.downDescription} />,\n handler: event => {\n const { data } = this.props;\n const { focusedIndex } = this.state;\n\n event.preventDefault();\n\n const newFocusedIndex =\n focusedIndex !== undefined ? Math.min(focusedIndex + 1, data.length - 1) : 0;\n this.setState({ focusedIndex: newFocusedIndex });\n },\n type: hotkeyType,\n }),\n new HotkeyRecord({\n key: 'up',\n description: <FormattedMessage {...messages.upDescription} />,\n handler: event => {\n const { focusedIndex = 0 } = this.state;\n\n event.preventDefault();\n\n const newFocusedIndex = Math.max(focusedIndex - 1, 0);\n this.setState({ focusedIndex: newFocusedIndex });\n },\n type: hotkeyType,\n }),\n new HotkeyRecord({\n key: 'shift+down',\n description: <FormattedMessage {...messages.shiftDownDescription} />,\n handler: () => {\n const { data } = this.props;\n const { focusedIndex } = this.state;\n\n if (focusedIndex === undefined) {\n return;\n }\n\n const newFocusedIndex = Math.min(focusedIndex + 1, data.length - 1);\n this.handleShiftKeyDown(newFocusedIndex, data.length - 1);\n },\n type: hotkeyType,\n }),\n new HotkeyRecord({\n key: 'shift+up',\n description: <FormattedMessage {...messages.shiftUpDescription} />,\n handler: () => {\n const { focusedIndex } = this.state;\n\n if (focusedIndex === undefined) {\n return;\n }\n\n const newFocusedIndex = Math.max(focusedIndex - 1, 0);\n this.handleShiftKeyDown(newFocusedIndex, 0);\n },\n type: hotkeyType,\n }),\n ];\n };\n\n getGridViewHotKeyConfigs = () => {\n const { hotkeyType } = this.props;\n return [\n new HotkeyRecord({\n key: 'right',\n description: <FormattedMessage {...messages.downDescription} />,\n handler: event => {\n if (this.isTargetSlider(event)) {\n return;\n }\n\n const { data } = this.props;\n const { focusedIndex } = this.state;\n\n event.preventDefault();\n\n const newFocusedIndex =\n focusedIndex !== undefined ? Math.min(focusedIndex + 1, data.length - 1) : 0;\n this.setState({ focusedIndex: newFocusedIndex });\n },\n type: hotkeyType,\n }),\n new HotkeyRecord({\n key: 'left',\n description: <FormattedMessage {...messages.upDescription} />,\n handler: event => {\n if (this.isTargetSlider(event)) {\n return;\n }\n\n const { focusedIndex = 0 } = this.state;\n\n event.preventDefault();\n\n const newFocusedIndex = Math.max(focusedIndex - 1, 0);\n this.setState({ focusedIndex: newFocusedIndex });\n },\n type: hotkeyType,\n }),\n new HotkeyRecord({\n key: 'down',\n description: <FormattedMessage {...messages.downDescription} />,\n handler: event => {\n if (this.isTargetSlider(event)) {\n return;\n }\n\n const { data, gridColumnCount } = this.props;\n const { focusedIndex } = this.state;\n\n event.preventDefault();\n\n const newFocusedIndex =\n focusedIndex !== undefined ? Math.min(focusedIndex + gridColumnCount, data.length - 1) : 0;\n this.setState({ focusedIndex: newFocusedIndex });\n },\n type: hotkeyType,\n }),\n new HotkeyRecord({\n key: 'up',\n description: <FormattedMessage {...messages.upDescription} />,\n handler: event => {\n if (this.isTargetSlider(event)) {\n return;\n }\n\n const { gridColumnCount } = this.props;\n const { focusedIndex = 0 } = this.state;\n\n event.preventDefault();\n\n const newFocusedIndex = Math.max(focusedIndex - gridColumnCount, 0);\n this.setState({ focusedIndex: newFocusedIndex });\n },\n type: hotkeyType,\n }),\n new HotkeyRecord({\n key: 'shift+right',\n description: <FormattedMessage {...messages.shiftDownDescription} />,\n handler: () => {\n const { data } = this.props;\n const { focusedIndex } = this.state;\n\n if (focusedIndex === undefined) {\n return;\n }\n\n const newFocusedIndex = Math.min(focusedIndex + 1, data.length - 1);\n this.handleShiftKeyDownForGrid(newFocusedIndex, data.length - 1);\n },\n type: hotkeyType,\n }),\n new HotkeyRecord({\n key: 'shift+left',\n description: <FormattedMessage {...messages.shiftUpDescription} />,\n handler: () => {\n const { focusedIndex } = this.state;\n\n if (focusedIndex === undefined) {\n return;\n }\n\n const newFocusedIndex = Math.max(focusedIndex - 1, 0);\n this.handleShiftKeyDownForGrid(newFocusedIndex, 0);\n },\n type: hotkeyType,\n }),\n new HotkeyRecord({\n key: 'shift+down',\n description: <FormattedMessage {...messages.shiftDownDescription} />,\n handler: () => {\n const { data, gridColumnCount } = this.props;\n const { focusedIndex } = this.state;\n\n if (focusedIndex === undefined) {\n return;\n }\n\n const newFocusedIndex = Math.min(focusedIndex + gridColumnCount, data.length - 1);\n this.handleShiftKeyDownForGrid(newFocusedIndex, data.length - 1);\n },\n type: hotkeyType,\n }),\n new HotkeyRecord({\n key: 'shift+up',\n description: <FormattedMessage {...messages.shiftUpDescription} />,\n handler: () => {\n const { gridColumnCount } = this.props;\n const { focusedIndex } = this.state;\n\n if (focusedIndex === undefined) {\n return;\n }\n\n const newFocusedIndex = Math.max(focusedIndex - gridColumnCount, 0);\n this.handleShiftKeyDownForGrid(newFocusedIndex, 0);\n },\n type: hotkeyType,\n }),\n ];\n };\n\n getHotkeyConfigs = () => {\n const { enableHotkeys, isGridView, gridColumnCount } = this.props;\n\n if (!enableHotkeys && !this.hotkeys) {\n this.hotkeys = [];\n }\n\n if (!this.hotkeys) {\n const viewSpecificHotKeyConfigs =\n isGridView && gridColumnCount !== undefined\n ? this.getGridViewHotKeyConfigs()\n : this.getListViewHotKeyConfigs();\n\n this.hotkeys = [...this.getSharedHotkeyConfigs(), ...viewSpecificHotKeyConfigs];\n }\n\n return this.hotkeys;\n };\n\n getProcessedProps = () => {\n const { data, loadedData, selectedItems } = this.props;\n return {\n ...this.props,\n loadedData: loadedData ? Set(loadedData) : Set(data),\n selectedItems: Set.isSet(selectedItems) ? selectedItems : new Set(selectedItems),\n };\n };\n\n hotkeys = null;\n\n selectToggle = rowIndex => {\n const { data, selectedItems } = this.getProcessedProps();\n\n if (selectedItems.has(data[rowIndex])) {\n this.onSelect(selectedItems.delete(data[rowIndex]), rowIndex);\n } else {\n this.onSelect(selectedItems.add(data[rowIndex]), rowIndex);\n }\n\n this.anchorIndex = rowIndex;\n };\n\n selectRange = rowIndex => {\n const { data, selectedItems } = this.getProcessedProps();\n\n // Don't change selection if we're shift-clicking the same row\n if (rowIndex === this.previousIndex) {\n return;\n }\n\n // Converts set of items to set of indices to do some slicing magic\n const selectedRows = new Set(\n data.reduce((rows, item, i) => {\n if (selectedItems.has(item)) {\n rows.push(i);\n }\n return rows;\n }, []),\n );\n\n const newSelectedRows = shiftSelect(selectedRows, this.previousIndex, rowIndex, this.anchorIndex);\n\n // Converts set back to set of items\n const newSelectedItems = newSelectedRows.map(i => data[i]);\n\n this.onSelect(newSelectedItems, rowIndex);\n };\n\n selectOne = rowIndex => {\n const { data, selectedItems } = this.getProcessedProps();\n\n // Don't change selection if we're clicking on a row that we've already selected\n // This allows us to use the native onDoubleClick handler because we're referencing the\n // same DOM node on double-click.\n if (selectedItems.has(data[rowIndex]) && selectedItems.size === 1) {\n return;\n }\n\n this.onSelect(new Set([data[rowIndex]]), rowIndex);\n this.anchorIndex = rowIndex;\n };\n\n clearFocus = () => {\n this.setState({\n focusedIndex: undefined,\n });\n };\n\n handleRowClick = (event, index) => {\n if (event.metaKey || event.ctrlKey) {\n this.selectToggle(index);\n } else if (event.shiftKey) {\n this.selectRange(index);\n } else {\n this.selectOne(index);\n }\n };\n\n handleRowFocus = (event, index) => {\n const { selectedItems } = this.getProcessedProps();\n this.onSelect(selectedItems, index);\n };\n\n handleTableBlur = () => {\n const { focusedIndex } = this.state;\n if (focusedIndex !== undefined) {\n // table may get focus back right away in the same tick, in which case we shouldn't clear focus\n this.blurTimerID = setTimeout(this.clearFocus);\n }\n };\n\n handleTableFocus = () => {\n clearTimeout(this.blurTimerID);\n };\n\n handleShiftKeyDown = (newFocusedIndex, boundary) => {\n const { data, selectedItems } = this.getProcessedProps();\n const { focusedIndex } = this.state;\n\n const focusedIndexData = data[focusedIndex];\n const newFocusedIndexData = data[newFocusedIndex];\n\n // if we're at a boundary of the table and the row is selected, no-op\n if (focusedIndex === boundary && selectedItems.has(focusedIndexData)) {\n return;\n }\n\n // if both the target and source are not selected, select them both\n if (!selectedItems.has(focusedIndexData) && !selectedItems.has(newFocusedIndexData)) {\n this.onSelect(selectedItems.union([focusedIndexData, newFocusedIndexData]), newFocusedIndex);\n return;\n }\n\n // if target is not selected, select it\n if (!selectedItems.has(newFocusedIndexData)) {\n this.onSelect(selectedItems.add(newFocusedIndexData), newFocusedIndex);\n return;\n }\n\n // if both source and target are selected, deselect source\n if (selectedItems.has(newFocusedIndexData) && selectedItems.has(focusedIndexData)) {\n this.onSelect(selectedItems.delete(focusedIndexData), newFocusedIndex);\n return;\n }\n\n // if target is selected and source is not, select source\n this.onSelect(selectedItems.add(focusedIndexData), newFocusedIndex);\n };\n\n isContiguousSelection = (selectedItemIndecies, sourceIndex, targetIndex) => {\n if (sourceIndex < targetIndex && selectedItemIndecies.has(sourceIndex - 1)) {\n return true;\n }\n if (targetIndex < sourceIndex && selectedItemIndecies.has(sourceIndex + 1)) {\n return true;\n }\n return false;\n };\n\n handleShiftKeyDownForGrid = newFocusedIndex => {\n const { data, loadedData, selectedItems } = this.getProcessedProps();\n const { focusedIndex } = this.state;\n\n const dataSize = data.length;\n const targetIndex = newFocusedIndex < 0 ? 0 : Math.min(newFocusedIndex, dataSize - 1);\n const isSourceSelected = selectedItems.has(data[focusedIndex]);\n const isTargetSelected = selectedItems.has(data[targetIndex]);\n\n // if data is not loaded, we don't want it to be able to be selected\n if (!loadedData.has(data[targetIndex])) {\n return;\n }\n\n const selectedItemIndices = new Set(\n data.reduce((rows, item, i) => {\n if (selectedItems.has(item)) {\n rows.push(i);\n }\n return rows;\n }, []),\n );\n\n // reset the anchor on a new selection block\n if (\n !isSourceSelected &&\n !isTargetSelected &&\n // if we are starting a new mass selection adjacent selected block, we want to connect them\n !this.isContiguousSelection(selectedItemIndices, focusedIndex, targetIndex)\n ) {\n this.anchorIndex = focusedIndex;\n }\n\n const newSelectedItemIndices = shiftSelect(\n selectedItemIndices,\n focusedIndex,\n targetIndex,\n this.anchorIndex,\n );\n\n const newSelectedItems = newSelectedItemIndices.map(i => data[i]);\n\n this.onSelect(newSelectedItems, targetIndex);\n };\n\n handleKeyboardSearch = event => {\n const { searchStrings } = this.props;\n\n if (!searchStrings) {\n return;\n }\n\n if (\n event.target.hasAttribute('contenteditable') ||\n event.target.nodeName === 'INPUT' ||\n event.target.nodeName === 'TEXTAREA'\n ) {\n return;\n }\n\n // character keys have a value for event.which\n if (event.which === 0) {\n return;\n }\n\n if (this.searchTimeout) {\n clearTimeout(this.searchTimeout);\n }\n\n this.searchString += event.key;\n this.searchTimeout = setTimeout(() => {\n this.searchString = '';\n }, SEARCH_TIMER_DURATION);\n\n const index = searchStrings.findIndex(\n string =>\n string\n .trim()\n .toLowerCase()\n .indexOf(this.searchString) === 0,\n );\n\n if (index !== -1) {\n this.setState({ focusedIndex: index });\n }\n };\n\n handleCheckboxClick = (event, index) => {\n if (event.nativeEvent.shiftKey) {\n this.selectRange(index);\n } else {\n this.selectToggle(index);\n }\n };\n\n isTargetSlider = event => event.target?.role === 'slider';\n\n render() {\n const { className, data } = this.props;\n const { focusedIndex } = this.state;\n const focusedItem = data[focusedIndex];\n\n return (\n <Hotkeys configs={this.getHotkeyConfigs()}>\n <BaseTable\n {...this.props}\n className={classNames(className, 'is-selectable')}\n focusedIndex={focusedIndex}\n focusedItem={focusedItem}\n onCheckboxClick={this.handleCheckboxClick}\n onRowClick={this.handleRowClick}\n onRowFocus={this.handleRowFocus}\n onTableBlur={this.handleTableBlur}\n onTableFocus={this.handleTableFocus}\n />\n </Hotkeys>\n );\n }\n };\n}\n\nexport default makeSelectable;\n"],"file":"makeSelectable.js"}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/table/makeSelectable.js"],"names":["PropTypes","React","Component","Set","ImmutablePropTypes","classNames","FormattedMessage","Hotkeys","HotkeyRecord","messages","shiftSelect","SEARCH_TIMER_DURATION","makeSelectable","BaseTable","originalDisplayName","displayName","name","SelectableTable","constructor","props","focusedIndex","undefined","selectedItems","newFocusedIndex","onSelect","previousIndex","state","setState","isSet","toJS","hotkeyType","key","description","shiftXDescription","handler","selectToggle","type","selectAllDescription","event","data","preventDefault","deselectAllDescription","downDescription","isQuickFilter","Math","min","length","upDescription","max","shiftDownDescription","handleShiftKeyDown","shiftUpDescription","isTargetSlider","gridColumnCount","handleShiftKeyDownForGrid","enableHotkeys","isGridView","hotkeys","viewSpecificHotKeyConfigs","getGridViewHotKeyConfigs","getListViewHotKeyConfigs","getSharedHotkeyConfigs","loadedData","rowIndex","getProcessedProps","has","delete","add","anchorIndex","selectedRows","reduce","rows","item","i","push","newSelectedRows","newSelectedItems","map","size","index","metaKey","ctrlKey","shiftKey","selectRange","selectOne","blurTimerID","setTimeout","clearFocus","clearTimeout","boundary","focusedIndexData","newFocusedIndexData","union","selectedItemIndecies","sourceIndex","targetIndex","dataSize","isSourceSelected","isTargetSelected","selectedItemIndices","isContiguousSelection","newSelectedItemIndices","searchStrings","target","hasAttribute","nodeName","which","searchTimeout","searchString","findIndex","string","trim","toLowerCase","indexOf","nativeEvent","role","dataset","componentDidMount","document","addEventListener","handleKeyboardSearch","componentDidUpdate","prevProps","prevState","onFocus","componentWillUnmount","removeEventListener","render","className","focusedItem","getHotkeyConfigs","handleCheckboxClick","handleRowClick","handleRowFocus","handleTableBlur","handleTableFocus","array","isRequired","number","bool","func","oneOfType","set"],"mappings":"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","sourcesContent":["import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { Set } from 'immutable';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport classNames from 'classnames';\nimport { FormattedMessage } from 'react-intl';\n\nimport { Hotkeys, HotkeyRecord } from '../hotkeys';\nimport messages from './messages';\nimport shiftSelect from './shiftSelect';\n\nconst SEARCH_TIMER_DURATION = 1000;\n\nfunction makeSelectable(BaseTable) {\n const originalDisplayName = BaseTable.displayName || BaseTable.name || 'Table';\n\n return class SelectableTable extends Component {\n static displayName = `Selectable(${originalDisplayName})`;\n\n static propTypes = {\n className: PropTypes.string,\n /** Array of unique IDs of the items in the table. Each item should be a string or number, in the order they appear in the table. */\n data: PropTypes.array.isRequired,\n gridColumnCount: PropTypes.number,\n isGridView: PropTypes.bool,\n /** Called when focus changes. `(focusedIndex: number) => void` */\n onFocus: PropTypes.func,\n /** Called when selection changes. `(selectedItems: Array<string> | Array<number> | Set<string> | Set<number>) => void` */\n onSelect: PropTypes.func.isRequired,\n /**\n * Array of strings for keyboard search corresponding to the data prop. If not provided, keyboard search won't work.\n * Example: data = ['f_123', 'f_456'], and corresponding searchStrings = ['file.png', 'another file.pdf']\n */\n searchStrings: PropTypes.array,\n /**\n * Array of IDs that are currently selected, in any order.\n * If you pass a native JS array, then your onSelect function will be called with a native JS array;\n * likewise, if you pass an ImmutableJS Set, then your onSelect function will be called\n * with an ImmutableJS Set.\n */\n selectedItems: PropTypes.oneOfType([PropTypes.array, ImmutablePropTypes.set]),\n /** Array of unique IDs of the items in the table that are loaded and accessible. If not provided, this will default to all data */\n loadedData: PropTypes.array,\n enableHotkeys: PropTypes.bool,\n /** Translated type for hotkeys. If not provided, then the hotkeys will not appear in the help modal. */\n hotkeyType: PropTypes.string,\n };\n\n static defaultProps = {\n selectedItems: new Set(),\n };\n\n constructor(props) {\n super(props);\n\n this.anchorIndex = 0;\n\n this.searchString = '';\n this.searchTimeout = null;\n\n // we have to store the previously focused index because a focus event\n // will be fired before the click event; thus, in the click handler,\n // the focusedItem will already be the new item\n this.previousIndex = 0;\n\n this.blurTimerID = null;\n }\n\n state = {\n focusedIndex: undefined,\n };\n\n componentDidMount() {\n document.addEventListener('keypress', this.handleKeyboardSearch);\n }\n\n componentDidUpdate(prevProps, prevState) {\n if (prevState.focusedIndex !== this.state.focusedIndex && this.props.onFocus) {\n this.props.onFocus(this.state.focusedIndex);\n }\n }\n\n componentWillUnmount() {\n document.removeEventListener('keypress', this.handleKeyboardSearch);\n clearTimeout(this.blurTimerID);\n }\n\n onSelect = (selectedItems, newFocusedIndex) => {\n const { onSelect } = this.props;\n\n this.previousIndex = this.state.focusedIndex || 0;\n\n this.setState({\n focusedIndex: newFocusedIndex,\n });\n\n if (onSelect) {\n // If selectedItems were given as an Immutable Set, they should also be returned as one,\n // and vice versa if they were given as a native JS array\n onSelect(Set.isSet(this.props.selectedItems) ? selectedItems : selectedItems.toJS());\n }\n };\n\n getSharedHotkeyConfigs = () => {\n const { hotkeyType } = this.props;\n return [\n new HotkeyRecord({\n key: 'shift+x',\n description: <FormattedMessage {...messages.shiftXDescription} />,\n handler: () => {\n const { focusedIndex } = this.state;\n\n if (focusedIndex === undefined) {\n return;\n }\n\n this.selectToggle(focusedIndex);\n },\n type: hotkeyType,\n }),\n new HotkeyRecord({\n key: ['meta+a', 'ctrl+a'],\n description: <FormattedMessage {...messages.selectAllDescription} />,\n handler: event => {\n const { data } = this.props;\n\n event.preventDefault();\n\n this.onSelect(new Set(data), this.state.focusedIndex);\n },\n type: hotkeyType,\n }),\n new HotkeyRecord({\n key: 'esc',\n description: <FormattedMessage {...messages.deselectAllDescription} />,\n handler: () => {\n this.onSelect(new Set(), this.state.focusedIndex);\n },\n type: hotkeyType,\n }),\n ];\n };\n\n getListViewHotKeyConfigs = () => {\n const { hotkeyType } = this.props;\n return [\n new HotkeyRecord({\n key: 'down',\n description: <FormattedMessage {...messages.downDescription} />,\n handler: event => {\n if (this.isQuickFilter(event)) {\n return;\n }\n\n const { data } = this.props;\n const { focusedIndex } = this.state;\n\n event.preventDefault();\n\n const newFocusedIndex =\n focusedIndex !== undefined ? Math.min(focusedIndex + 1, data.length - 1) : 0;\n this.setState({ focusedIndex: newFocusedIndex });\n },\n type: hotkeyType,\n }),\n new HotkeyRecord({\n key: 'up',\n description: <FormattedMessage {...messages.upDescription} />,\n handler: event => {\n if (this.isQuickFilter(event)) {\n return;\n }\n\n const { focusedIndex = 0 } = this.state;\n\n event.preventDefault();\n\n const newFocusedIndex = Math.max(focusedIndex - 1, 0);\n this.setState({ focusedIndex: newFocusedIndex });\n },\n type: hotkeyType,\n }),\n new HotkeyRecord({\n key: 'shift+down',\n description: <FormattedMessage {...messages.shiftDownDescription} />,\n handler: () => {\n const { data } = this.props;\n const { focusedIndex } = this.state;\n\n if (focusedIndex === undefined) {\n return;\n }\n\n const newFocusedIndex = Math.min(focusedIndex + 1, data.length - 1);\n this.handleShiftKeyDown(newFocusedIndex, data.length - 1);\n },\n type: hotkeyType,\n }),\n new HotkeyRecord({\n key: 'shift+up',\n description: <FormattedMessage {...messages.shiftUpDescription} />,\n handler: () => {\n const { focusedIndex } = this.state;\n\n if (focusedIndex === undefined) {\n return;\n }\n\n const newFocusedIndex = Math.max(focusedIndex - 1, 0);\n this.handleShiftKeyDown(newFocusedIndex, 0);\n },\n type: hotkeyType,\n }),\n ];\n };\n\n getGridViewHotKeyConfigs = () => {\n const { hotkeyType } = this.props;\n return [\n new HotkeyRecord({\n key: 'right',\n description: <FormattedMessage {...messages.downDescription} />,\n handler: event => {\n if (this.isTargetSlider(event) || this.isQuickFilter(event)) {\n return;\n }\n\n const { data } = this.props;\n const { focusedIndex } = this.state;\n\n event.preventDefault();\n\n const newFocusedIndex =\n focusedIndex !== undefined ? Math.min(focusedIndex + 1, data.length - 1) : 0;\n this.setState({ focusedIndex: newFocusedIndex });\n },\n type: hotkeyType,\n }),\n new HotkeyRecord({\n key: 'left',\n description: <FormattedMessage {...messages.upDescription} />,\n handler: event => {\n if (this.isTargetSlider(event) || this.isQuickFilter(event)) {\n return;\n }\n\n const { focusedIndex = 0 } = this.state;\n\n event.preventDefault();\n\n const newFocusedIndex = Math.max(focusedIndex - 1, 0);\n this.setState({ focusedIndex: newFocusedIndex });\n },\n type: hotkeyType,\n }),\n new HotkeyRecord({\n key: 'down',\n description: <FormattedMessage {...messages.downDescription} />,\n handler: event => {\n if (this.isTargetSlider(event) || this.isQuickFilter(event)) {\n return;\n }\n\n const { data, gridColumnCount } = this.props;\n const { focusedIndex } = this.state;\n\n event.preventDefault();\n\n const newFocusedIndex =\n focusedIndex !== undefined ? Math.min(focusedIndex + gridColumnCount, data.length - 1) : 0;\n this.setState({ focusedIndex: newFocusedIndex });\n },\n type: hotkeyType,\n }),\n new HotkeyRecord({\n key: 'up',\n description: <FormattedMessage {...messages.upDescription} />,\n handler: event => {\n if (this.isTargetSlider(event) || this.isQuickFilter(event)) {\n return;\n }\n\n const { gridColumnCount } = this.props;\n const { focusedIndex = 0 } = this.state;\n\n event.preventDefault();\n\n const newFocusedIndex = Math.max(focusedIndex - gridColumnCount, 0);\n this.setState({ focusedIndex: newFocusedIndex });\n },\n type: hotkeyType,\n }),\n new HotkeyRecord({\n key: 'shift+right',\n description: <FormattedMessage {...messages.shiftDownDescription} />,\n handler: () => {\n const { data } = this.props;\n const { focusedIndex } = this.state;\n\n if (focusedIndex === undefined) {\n return;\n }\n\n const newFocusedIndex = Math.min(focusedIndex + 1, data.length - 1);\n this.handleShiftKeyDownForGrid(newFocusedIndex, data.length - 1);\n },\n type: hotkeyType,\n }),\n new HotkeyRecord({\n key: 'shift+left',\n description: <FormattedMessage {...messages.shiftUpDescription} />,\n handler: () => {\n const { focusedIndex } = this.state;\n\n if (focusedIndex === undefined) {\n return;\n }\n\n const newFocusedIndex = Math.max(focusedIndex - 1, 0);\n this.handleShiftKeyDownForGrid(newFocusedIndex, 0);\n },\n type: hotkeyType,\n }),\n new HotkeyRecord({\n key: 'shift+down',\n description: <FormattedMessage {...messages.shiftDownDescription} />,\n handler: () => {\n const { data, gridColumnCount } = this.props;\n const { focusedIndex } = this.state;\n\n if (focusedIndex === undefined) {\n return;\n }\n\n const newFocusedIndex = Math.min(focusedIndex + gridColumnCount, data.length - 1);\n this.handleShiftKeyDownForGrid(newFocusedIndex, data.length - 1);\n },\n type: hotkeyType,\n }),\n new HotkeyRecord({\n key: 'shift+up',\n description: <FormattedMessage {...messages.shiftUpDescription} />,\n handler: () => {\n const { gridColumnCount } = this.props;\n const { focusedIndex } = this.state;\n\n if (focusedIndex === undefined) {\n return;\n }\n\n const newFocusedIndex = Math.max(focusedIndex - gridColumnCount, 0);\n this.handleShiftKeyDownForGrid(newFocusedIndex, 0);\n },\n type: hotkeyType,\n }),\n ];\n };\n\n getHotkeyConfigs = () => {\n const { enableHotkeys, isGridView, gridColumnCount } = this.props;\n\n if (!enableHotkeys && !this.hotkeys) {\n this.hotkeys = [];\n }\n\n if (!this.hotkeys) {\n const viewSpecificHotKeyConfigs =\n isGridView && gridColumnCount !== undefined\n ? this.getGridViewHotKeyConfigs()\n : this.getListViewHotKeyConfigs();\n\n this.hotkeys = [...this.getSharedHotkeyConfigs(), ...viewSpecificHotKeyConfigs];\n }\n\n return this.hotkeys;\n };\n\n getProcessedProps = () => {\n const { data, loadedData, selectedItems } = this.props;\n return {\n ...this.props,\n loadedData: loadedData ? Set(loadedData) : Set(data),\n selectedItems: Set.isSet(selectedItems) ? selectedItems : new Set(selectedItems),\n };\n };\n\n hotkeys = null;\n\n selectToggle = rowIndex => {\n const { data, selectedItems } = this.getProcessedProps();\n\n if (selectedItems.has(data[rowIndex])) {\n this.onSelect(selectedItems.delete(data[rowIndex]), rowIndex);\n } else {\n this.onSelect(selectedItems.add(data[rowIndex]), rowIndex);\n }\n\n this.anchorIndex = rowIndex;\n };\n\n selectRange = rowIndex => {\n const { data, selectedItems } = this.getProcessedProps();\n\n // Don't change selection if we're shift-clicking the same row\n if (rowIndex === this.previousIndex) {\n return;\n }\n\n // Converts set of items to set of indices to do some slicing magic\n const selectedRows = new Set(\n data.reduce((rows, item, i) => {\n if (selectedItems.has(item)) {\n rows.push(i);\n }\n return rows;\n }, []),\n );\n\n const newSelectedRows = shiftSelect(selectedRows, this.previousIndex, rowIndex, this.anchorIndex);\n\n // Converts set back to set of items\n const newSelectedItems = newSelectedRows.map(i => data[i]);\n\n this.onSelect(newSelectedItems, rowIndex);\n };\n\n selectOne = rowIndex => {\n const { data, selectedItems } = this.getProcessedProps();\n\n // Don't change selection if we're clicking on a row that we've already selected\n // This allows us to use the native onDoubleClick handler because we're referencing the\n // same DOM node on double-click.\n if (selectedItems.has(data[rowIndex]) && selectedItems.size === 1) {\n return;\n }\n\n this.onSelect(new Set([data[rowIndex]]), rowIndex);\n this.anchorIndex = rowIndex;\n };\n\n clearFocus = () => {\n this.setState({\n focusedIndex: undefined,\n });\n };\n\n handleRowClick = (event, index) => {\n if (event.metaKey || event.ctrlKey) {\n this.selectToggle(index);\n } else if (event.shiftKey) {\n this.selectRange(index);\n } else {\n this.selectOne(index);\n }\n };\n\n handleRowFocus = (event, index) => {\n const { selectedItems } = this.getProcessedProps();\n this.onSelect(selectedItems, index);\n };\n\n handleTableBlur = () => {\n const { focusedIndex } = this.state;\n if (focusedIndex !== undefined) {\n // table may get focus back right away in the same tick, in which case we shouldn't clear focus\n this.blurTimerID = setTimeout(this.clearFocus);\n }\n };\n\n handleTableFocus = () => {\n clearTimeout(this.blurTimerID);\n };\n\n handleShiftKeyDown = (newFocusedIndex, boundary) => {\n const { data, selectedItems } = this.getProcessedProps();\n const { focusedIndex } = this.state;\n\n const focusedIndexData = data[focusedIndex];\n const newFocusedIndexData = data[newFocusedIndex];\n\n // if we're at a boundary of the table and the row is selected, no-op\n if (focusedIndex === boundary && selectedItems.has(focusedIndexData)) {\n return;\n }\n\n // if both the target and source are not selected, select them both\n if (!selectedItems.has(focusedIndexData) && !selectedItems.has(newFocusedIndexData)) {\n this.onSelect(selectedItems.union([focusedIndexData, newFocusedIndexData]), newFocusedIndex);\n return;\n }\n\n // if target is not selected, select it\n if (!selectedItems.has(newFocusedIndexData)) {\n this.onSelect(selectedItems.add(newFocusedIndexData), newFocusedIndex);\n return;\n }\n\n // if both source and target are selected, deselect source\n if (selectedItems.has(newFocusedIndexData) && selectedItems.has(focusedIndexData)) {\n this.onSelect(selectedItems.delete(focusedIndexData), newFocusedIndex);\n return;\n }\n\n // if target is selected and source is not, select source\n this.onSelect(selectedItems.add(focusedIndexData), newFocusedIndex);\n };\n\n isContiguousSelection = (selectedItemIndecies, sourceIndex, targetIndex) => {\n if (sourceIndex < targetIndex && selectedItemIndecies.has(sourceIndex - 1)) {\n return true;\n }\n if (targetIndex < sourceIndex && selectedItemIndecies.has(sourceIndex + 1)) {\n return true;\n }\n return false;\n };\n\n handleShiftKeyDownForGrid = newFocusedIndex => {\n const { data, loadedData, selectedItems } = this.getProcessedProps();\n const { focusedIndex } = this.state;\n\n const dataSize = data.length;\n const targetIndex = newFocusedIndex < 0 ? 0 : Math.min(newFocusedIndex, dataSize - 1);\n const isSourceSelected = selectedItems.has(data[focusedIndex]);\n const isTargetSelected = selectedItems.has(data[targetIndex]);\n\n // if data is not loaded, we don't want it to be able to be selected\n if (!loadedData.has(data[targetIndex])) {\n return;\n }\n\n const selectedItemIndices = new Set(\n data.reduce((rows, item, i) => {\n if (selectedItems.has(item)) {\n rows.push(i);\n }\n return rows;\n }, []),\n );\n\n // reset the anchor on a new selection block\n if (\n !isSourceSelected &&\n !isTargetSelected &&\n // if we are starting a new mass selection adjacent selected block, we want to connect them\n !this.isContiguousSelection(selectedItemIndices, focusedIndex, targetIndex)\n ) {\n this.anchorIndex = focusedIndex;\n }\n\n const newSelectedItemIndices = shiftSelect(\n selectedItemIndices,\n focusedIndex,\n targetIndex,\n this.anchorIndex,\n );\n\n const newSelectedItems = newSelectedItemIndices.map(i => data[i]);\n\n this.onSelect(newSelectedItems, targetIndex);\n };\n\n handleKeyboardSearch = event => {\n const { searchStrings } = this.props;\n\n if (!searchStrings) {\n return;\n }\n\n if (\n event.target.hasAttribute('contenteditable') ||\n event.target.nodeName === 'INPUT' ||\n event.target.nodeName === 'TEXTAREA'\n ) {\n return;\n }\n\n // character keys have a value for event.which\n if (event.which === 0) {\n return;\n }\n\n if (this.searchTimeout) {\n clearTimeout(this.searchTimeout);\n }\n\n this.searchString += event.key;\n this.searchTimeout = setTimeout(() => {\n this.searchString = '';\n }, SEARCH_TIMER_DURATION);\n\n const index = searchStrings.findIndex(\n string =>\n string\n .trim()\n .toLowerCase()\n .indexOf(this.searchString) === 0,\n );\n\n if (index !== -1) {\n this.setState({ focusedIndex: index });\n }\n };\n\n handleCheckboxClick = (event, index) => {\n if (event.nativeEvent.shiftKey) {\n this.selectRange(index);\n } else {\n this.selectToggle(index);\n }\n };\n\n isTargetSlider = event => event.target?.role === 'slider';\n\n // Workaround for focus conflicting with Blueprint components in Search Quick Filters, not needed once Blueprint table is integrated\n isQuickFilter = event => event.target?.dataset && 'radixCollectionItem' in event.target.dataset;\n\n render() {\n const { className, data } = this.props;\n const { focusedIndex } = this.state;\n const focusedItem = data[focusedIndex];\n\n return (\n <Hotkeys configs={this.getHotkeyConfigs()}>\n <BaseTable\n {...this.props}\n className={classNames(className, 'is-selectable')}\n focusedIndex={focusedIndex}\n focusedItem={focusedItem}\n onCheckboxClick={this.handleCheckboxClick}\n onRowClick={this.handleRowClick}\n onRowFocus={this.handleRowFocus}\n onTableBlur={this.handleTableBlur}\n onTableFocus={this.handleTableFocus}\n />\n </Hotkeys>\n );\n }\n };\n}\n\nexport default makeSelectable;\n"],"file":"makeSelectable.js"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "box-ui-elements",
|
|
3
|
-
"version": "20.0.1-beta.1",
|
|
3
|
+
"version": "20.0.1-beta.1.1",
|
|
4
4
|
"description": "Box UI Elements",
|
|
5
5
|
"author": "Box (https://www.box.com/)",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
"lint:css": "stylelint \"src/**/*.scss\" --syntax scss",
|
|
69
69
|
"prebuild:es": "npm-run-all copy:styles ts:defs copy:flow",
|
|
70
70
|
"release": "yarn release:beta",
|
|
71
|
-
"release:beta": "DIST=beta BRANCH=
|
|
71
|
+
"release:beta": "DIST=beta BRANCH=hotfix-v20.0.1-beta.1 ./scripts/release.sh",
|
|
72
72
|
"release:hotfix": "DIST=latest HOTFIX=true ./scripts/release.sh",
|
|
73
73
|
"release:latest": "DIST=latest BRANCH=master ./scripts/release.sh",
|
|
74
74
|
"release:next": "DIST=next BRANCH=next ./scripts/release.sh",
|
|
@@ -93,47 +93,17 @@
|
|
|
93
93
|
"last 2 Edge versions",
|
|
94
94
|
"last 2 iOS versions"
|
|
95
95
|
],
|
|
96
|
-
"development": [
|
|
97
|
-
"last 1 Chrome versions",
|
|
98
|
-
"last 1 Firefox versions",
|
|
99
|
-
"last 1 Safari versions"
|
|
100
|
-
]
|
|
96
|
+
"development": ["last 1 Chrome versions", "last 1 Firefox versions", "last 1 Safari versions"]
|
|
101
97
|
},
|
|
102
98
|
"lint-staged": {
|
|
103
|
-
"*.js": [
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
],
|
|
107
|
-
"*.
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
]
|
|
111
|
-
"*.tsx": [
|
|
112
|
-
"eslint --ext=.tsx --fix",
|
|
113
|
-
"git add"
|
|
114
|
-
],
|
|
115
|
-
"*.md": [
|
|
116
|
-
"prettier --write --parser=markdown",
|
|
117
|
-
"git add"
|
|
118
|
-
],
|
|
119
|
-
"*.json": [
|
|
120
|
-
"prettier --write --parser=json",
|
|
121
|
-
"git add"
|
|
122
|
-
],
|
|
123
|
-
"*.html": [
|
|
124
|
-
"prettier --write --parser=html",
|
|
125
|
-
"git add"
|
|
126
|
-
],
|
|
127
|
-
"*.scss": [
|
|
128
|
-
"prettier --write --parser=scss",
|
|
129
|
-
"stylelint --syntax scss --fix",
|
|
130
|
-
"git add"
|
|
131
|
-
],
|
|
132
|
-
"*.css": [
|
|
133
|
-
"prettier --write --parser=css",
|
|
134
|
-
"stylelint --syntax css --fix",
|
|
135
|
-
"git add"
|
|
136
|
-
]
|
|
99
|
+
"*.js": ["eslint --fix", "git add"],
|
|
100
|
+
"*.ts": ["eslint --ext=.ts --fix", "git add"],
|
|
101
|
+
"*.tsx": ["eslint --ext=.tsx --fix", "git add"],
|
|
102
|
+
"*.md": ["prettier --write --parser=markdown", "git add"],
|
|
103
|
+
"*.json": ["prettier --write --parser=json", "git add"],
|
|
104
|
+
"*.html": ["prettier --write --parser=html", "git add"],
|
|
105
|
+
"*.scss": ["prettier --write --parser=scss", "stylelint --syntax scss --fix", "git add"],
|
|
106
|
+
"*.css": ["prettier --write --parser=css", "stylelint --syntax css --fix", "git add"]
|
|
137
107
|
},
|
|
138
108
|
"husky": {
|
|
139
109
|
"hooks": {
|
|
@@ -423,8 +393,6 @@
|
|
|
423
393
|
}
|
|
424
394
|
},
|
|
425
395
|
"msw": {
|
|
426
|
-
"workerDirectory": [
|
|
427
|
-
".storybook/public"
|
|
428
|
-
]
|
|
396
|
+
"workerDirectory": [".storybook/public"]
|
|
429
397
|
}
|
|
430
398
|
}
|
|
@@ -148,6 +148,10 @@ function makeSelectable(BaseTable) {
|
|
|
148
148
|
key: 'down',
|
|
149
149
|
description: <FormattedMessage {...messages.downDescription} />,
|
|
150
150
|
handler: event => {
|
|
151
|
+
if (this.isQuickFilter(event)) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
|
|
151
155
|
const { data } = this.props;
|
|
152
156
|
const { focusedIndex } = this.state;
|
|
153
157
|
|
|
@@ -163,6 +167,10 @@ function makeSelectable(BaseTable) {
|
|
|
163
167
|
key: 'up',
|
|
164
168
|
description: <FormattedMessage {...messages.upDescription} />,
|
|
165
169
|
handler: event => {
|
|
170
|
+
if (this.isQuickFilter(event)) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
|
|
166
174
|
const { focusedIndex = 0 } = this.state;
|
|
167
175
|
|
|
168
176
|
event.preventDefault();
|
|
@@ -213,7 +221,7 @@ function makeSelectable(BaseTable) {
|
|
|
213
221
|
key: 'right',
|
|
214
222
|
description: <FormattedMessage {...messages.downDescription} />,
|
|
215
223
|
handler: event => {
|
|
216
|
-
if (this.isTargetSlider(event)) {
|
|
224
|
+
if (this.isTargetSlider(event) || this.isQuickFilter(event)) {
|
|
217
225
|
return;
|
|
218
226
|
}
|
|
219
227
|
|
|
@@ -232,7 +240,7 @@ function makeSelectable(BaseTable) {
|
|
|
232
240
|
key: 'left',
|
|
233
241
|
description: <FormattedMessage {...messages.upDescription} />,
|
|
234
242
|
handler: event => {
|
|
235
|
-
if (this.isTargetSlider(event)) {
|
|
243
|
+
if (this.isTargetSlider(event) || this.isQuickFilter(event)) {
|
|
236
244
|
return;
|
|
237
245
|
}
|
|
238
246
|
|
|
@@ -249,7 +257,7 @@ function makeSelectable(BaseTable) {
|
|
|
249
257
|
key: 'down',
|
|
250
258
|
description: <FormattedMessage {...messages.downDescription} />,
|
|
251
259
|
handler: event => {
|
|
252
|
-
if (this.isTargetSlider(event)) {
|
|
260
|
+
if (this.isTargetSlider(event) || this.isQuickFilter(event)) {
|
|
253
261
|
return;
|
|
254
262
|
}
|
|
255
263
|
|
|
@@ -268,7 +276,7 @@ function makeSelectable(BaseTable) {
|
|
|
268
276
|
key: 'up',
|
|
269
277
|
description: <FormattedMessage {...messages.upDescription} />,
|
|
270
278
|
handler: event => {
|
|
271
|
-
if (this.isTargetSlider(event)) {
|
|
279
|
+
if (this.isTargetSlider(event) || this.isQuickFilter(event)) {
|
|
272
280
|
return;
|
|
273
281
|
}
|
|
274
282
|
|
|
@@ -604,6 +612,9 @@ function makeSelectable(BaseTable) {
|
|
|
604
612
|
|
|
605
613
|
isTargetSlider = event => event.target?.role === 'slider';
|
|
606
614
|
|
|
615
|
+
// Workaround for focus conflicting with Blueprint components in Search Quick Filters, not needed once Blueprint table is integrated
|
|
616
|
+
isQuickFilter = event => event.target?.dataset && 'radixCollectionItem' in event.target.dataset;
|
|
617
|
+
|
|
607
618
|
render() {
|
|
608
619
|
const { className, data } = this.props;
|
|
609
620
|
const { focusedIndex } = this.state;
|
package/src/features/virtualized-table-renderers/__tests__/lastModifiedByCellRenderer.test.js
CHANGED
|
@@ -42,10 +42,6 @@ describe('features/virtualized-table-renderers/lastModifiedByCellRenderer', () =
|
|
|
42
42
|
expect(lastModifiedByCellRenderer(intl)(cellRendererParams)).toBe('--');
|
|
43
43
|
});
|
|
44
44
|
|
|
45
|
-
test('should render a LastModifiedByCell', () => {
|
|
46
|
-
expect(lastModifiedByCellRenderer(intl)(cellRendererParams)).toMatchSnapshot();
|
|
47
|
-
});
|
|
48
|
-
|
|
49
45
|
test('should call support functions with appropriate values', () => {
|
|
50
46
|
const { cellData } = cellRendererParams;
|
|
51
47
|
const { modified_at, modified_by } = cellData;
|