Skip to content

Commit 1afddba

Browse files
committed
[bugfix] when in edit mode, copying only copied previously held cell data and not selected text
1 parent 74acbe1 commit 1afddba

File tree

4 files changed

+56
-45
lines changed

4 files changed

+56
-45
lines changed

lib/DataSheet.js

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -114,43 +114,44 @@ var DataSheet = function (_PureComponent) {
114114
}, {
115115
key: 'handleCopy',
116116
value: function handleCopy(e) {
117-
e.preventDefault();
118-
var _props = this.props,
119-
dataRenderer = _props.dataRenderer,
120-
valueRenderer = _props.valueRenderer,
121-
data = _props.data;
122-
var _state = this.state,
123-
start = _state.start,
124-
end = _state.end;
125-
126-
127-
var text = range(start.i, end.i).map(function (i) {
128-
return range(start.j, end.j).map(function (j) {
129-
return data[i][j];
130-
}).map(function (cell) {
131-
var value = dataRenderer ? dataRenderer(cell) : null;
132-
if (value === '' || value === null || typeof value === 'undefined') {
133-
return valueRenderer(cell);
134-
}
135-
return value;
136-
}).join('\t');
137-
}).join('\n');
138-
e.clipboardData.setData('text/plain', text);
139-
document.removeEventListener('copy', this.handlePaste);
117+
if (isEmpty(this.state.editing)) {
118+
e.preventDefault();
119+
var _props = this.props,
120+
dataRenderer = _props.dataRenderer,
121+
valueRenderer = _props.valueRenderer,
122+
data = _props.data;
123+
var _state = this.state,
124+
start = _state.start,
125+
end = _state.end;
126+
127+
128+
var text = range(start.i, end.i).map(function (i) {
129+
return range(start.j, end.j).map(function (j) {
130+
return data[i][j];
131+
}).map(function (cell) {
132+
var value = dataRenderer ? dataRenderer(cell) : null;
133+
if (value === '' || value === null || typeof value === 'undefined') {
134+
return valueRenderer(cell);
135+
}
136+
return value;
137+
}).join('\t');
138+
}).join('\n');
139+
e.clipboardData.setData('text/plain', text);
140+
}
140141
}
141142
}, {
142143
key: 'handlePaste',
143144
value: function handlePaste(e) {
144145
var _this2 = this;
145146

146-
this.dgDom.removeEventListener('paste', this.handlePaste);
147-
148147
if (isEmpty(this.state.editing)) {
149148
var start = this.state.start;
149+
150150
var pastedMap = [];
151151
var pasteData = e.clipboardData.getData('text/plain').split(/\n|\r/).map(function (row) {
152152
return row.split('\t');
153153
});
154+
var end = {};
154155

155156
pasteData.map(function (row, i) {
156157
var rowData = [];
@@ -159,12 +160,13 @@ var DataSheet = function (_PureComponent) {
159160
rowData.push({ cell: cell, data: pastedData });
160161
if (cell && !cell.readOnly && !_this2.props.onPaste) {
161162
_this2.onChange(start.i + i, start.j + j, pastedData);
163+
end = { i: start.i + i, j: start.j + j };
162164
}
163165
});
164166
pastedMap.push(rowData);
165167
});
166168
this.props.onPaste && this.props.onPaste(pastedMap);
167-
this.setState(this.defaultState);
169+
this.setState({ end: end });
168170
}
169171
}
170172
}, {

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-datasheet",
3-
"version": "1.2.8",
3+
"version": "1.2.9",
44
"description": "Excel-like data grid for React",
55
"repository": {
66
"type": "git",

src/DataSheet.js

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -73,35 +73,36 @@ export default class DataSheet extends PureComponent {
7373
}
7474

7575
handleCopy(e) {
76-
e.preventDefault();
77-
const {dataRenderer, valueRenderer, data} = this.props;
78-
const {start, end} = this.state;
76+
if(isEmpty(this.state.editing)) {
77+
e.preventDefault();
78+
const {dataRenderer, valueRenderer, data} = this.props;
79+
const {start, end} = this.state;
7980

8081

81-
const text = range(start.i, end.i).map((i) =>
82-
range(start.j, end.j).map(j => data[i][j])
83-
.map(cell => {
84-
let value = dataRenderer ? dataRenderer(cell) : null;
85-
if (value === '' || value === null || typeof(value) === 'undefined') {
86-
return valueRenderer(cell);
87-
}
88-
return value;
89-
}).join('\t')
90-
).join('\n');
91-
e.clipboardData.setData('text/plain', text);
92-
document.removeEventListener('copy', this.handlePaste);
82+
const text = range(start.i, end.i).map((i) =>
83+
range(start.j, end.j).map(j => data[i][j])
84+
.map(cell => {
85+
let value = dataRenderer ? dataRenderer(cell) : null;
86+
if (value === '' || value === null || typeof(value) === 'undefined') {
87+
return valueRenderer(cell);
88+
}
89+
return value;
90+
}).join('\t')
91+
).join('\n');
92+
e.clipboardData.setData('text/plain', text);
93+
}
9394
}
9495

9596
handlePaste(e) {
96-
this.dgDom.removeEventListener('paste', this.handlePaste);
97-
9897
if(isEmpty(this.state.editing)) {
9998
const start = this.state.start;
99+
100100
const pastedMap = [];
101101
const pasteData = e.clipboardData
102102
.getData('text/plain')
103103
.split(/\n|\r/)
104104
.map((row) => row.split('\t'));
105+
let end = {};
105106

106107
pasteData.map((row, i) => {
107108
const rowData = [];
@@ -110,12 +111,14 @@ export default class DataSheet extends PureComponent {
110111
rowData.push({cell: cell, data: pastedData});
111112
if (cell && !cell.readOnly && !this.props.onPaste) {
112113
this.onChange(start.i + i, start.j + j, pastedData);
114+
end = {i: start.i + i, j: start.j + j};
113115
}
116+
114117
});
115118
pastedMap.push(rowData);
116119
});
117120
this.props.onPaste && this.props.onPaste(pastedMap);
118-
this.setState(this.defaultState);
121+
this.setState({end: end});
119122
}
120123
}
121124

@@ -190,6 +193,7 @@ export default class DataSheet extends PureComponent {
190193
return true;
191194
}
192195

196+
193197
if (deleteKeysPressed && !isEditing) {
194198
this.getSelectedCells(data, start, end).map(({cell, i, j}) =>
195199
(!cell.readOnly) ? this.onChange(i, j, '') : null

test/Datasheet.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -795,12 +795,17 @@ describe('Component', () => {
795795
});
796796
it('pastes data properly', () => {
797797
cells.at(0).simulate('mouseDown');
798+
expect(wrapper.state('end')).toEqual({i: 0, j: 0});
799+
798800
const evt = document.createEvent("HTMLEvents");
799801
evt.initEvent("paste", false, true);
800802
evt.clipboardData = { getData: (type)=> '99\t100\n1001\t1002'};
801803
document.dispatchEvent(evt);
804+
802805
expect(data[0].map(d => d.data)).toEqual(['99', '100']);
803806
expect(data[1].map(d => d.data)).toEqual(['1001', '1002']);
807+
expect(wrapper.state('end')).toEqual({i: 1, j: 1});
808+
804809
});
805810

806811
it('pastes data properly on a different cell', () => {

0 commit comments

Comments
 (0)