Skip to content

Commit 464a743

Browse files
authored
Merge pull request #1789 from akksi/fix/data-table-area-selection
2 parents 3f77904 + 2cd99dd commit 464a743

File tree

2 files changed

+39
-8
lines changed

2 files changed

+39
-8
lines changed

components/dash-table/src/dash-table/components/ControlledTable/index.tsx

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ export default class ControlledTable extends PureComponent<ControlledTableProps>
127127
window.addEventListener('resize', this.forceHandleResize);
128128
document.addEventListener('mousedown', this.handleClick);
129129
document.addEventListener('paste', this.handlePaste);
130+
document.addEventListener('copy', this.handleCopy);
130131

131132
const {active_cell, selected_cells, setProps} = this.props;
132133

@@ -146,6 +147,7 @@ export default class ControlledTable extends PureComponent<ControlledTableProps>
146147
window.removeEventListener('resize', this.forceHandleResize);
147148
document.removeEventListener('mousedown', this.handleClick);
148149
document.removeEventListener('paste', this.handlePaste);
150+
document.removeEventListener('copy', this.handleCopy);
149151
}
150152

151153
componentDidUpdate() {
@@ -242,16 +244,23 @@ export default class ControlledTable extends PureComponent<ControlledTableProps>
242244
}
243245
};
244246

245-
handlePaste = (event: any) => {
246-
// no need to check for target as this will only be called if
247-
// a child fails to handle the paste event (e.g table, table input)
248-
// make sure the active element is in the scope of the component
249-
const $el = this.$el;
250-
if ($el && $el.contains(document.activeElement)) {
251-
this.onPaste(event);
247+
handleClipboardEvent = (
248+
event: ClipboardEvent,
249+
handler: (e: ClipboardEvent) => void
250+
) => {
251+
if (this.containsActiveElement()) {
252+
handler(event);
252253
}
253254
};
254255

256+
handleCopy = (event: ClipboardEvent) => {
257+
this.handleClipboardEvent(event, this.onCopy);
258+
};
259+
260+
handlePaste = (event: ClipboardEvent) => {
261+
this.handleClipboardEvent(event, this.onPaste);
262+
};
263+
255264
private clearCellWidth(cell: HTMLElement) {
256265
cell.style.width = '';
257266
cell.style.minWidth = '';
@@ -978,7 +987,6 @@ export default class ControlledTable extends PureComponent<ControlledTableProps>
978987
<div
979988
id={id}
980989
className='dash-table-container'
981-
onCopy={this.onCopy}
982990
onKeyDown={this.handleKeyDown}
983991
onPaste={this.onPaste}
984992
style={{position: 'relative'}}

components/dash-table/tests/selenium/test_basic_copy_paste.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,3 +278,26 @@ def test_tbcp008_copy_paste_between_tables_with_hidden_columns(test):
278278
)
279279

280280
assert test.get_log_errors() == []
281+
282+
283+
def test_tbcp009_copy_9_and_10_click(test):
284+
test.start_server(get_app())
285+
286+
source = test.table("table")
287+
target = test.table("table2")
288+
289+
source.cell(9, 0).click()
290+
with test.hold(Keys.SHIFT):
291+
source.cell(10, 0).click()
292+
293+
test.copy()
294+
target.cell(0, 0).click()
295+
test.paste()
296+
297+
for row in range(2):
298+
for col in range(1):
299+
assert (
300+
target.cell(row, col).get_text() == source.cell(row + 9, col).get_text()
301+
)
302+
303+
assert test.get_log_errors() == []

0 commit comments

Comments
 (0)