react-dropzone 4.2.12 → 5.0.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/dist/es/index.js +73 -58
- package/dist/es/utils/index.js +2 -0
- package/dist/index.js +2 -2
- package/package.json +4 -4
- package/src/__snapshots__/index.spec.js.snap +7 -7
- package/src/index.js +72 -52
- package/src/index.spec.js +93 -90
- package/src/utils/index.js +2 -0
package/dist/es/index.js
CHANGED
|
@@ -16,7 +16,7 @@ function _inherits(subClass, superClass) { if (typeof superClass !== "function"
|
|
|
16
16
|
|
|
17
17
|
import React from 'react';
|
|
18
18
|
import PropTypes from 'prop-types';
|
|
19
|
-
import { supportMultiple, fileAccepted, allFilesAccepted, fileMatchSize, onDocumentDragOver, getDataTransferItems, isIeOrEdge } from './utils';
|
|
19
|
+
import { supportMultiple, fileAccepted, allFilesAccepted, fileMatchSize, onDocumentDragOver, getDataTransferItems as defaultGetDataTransferItem, isIeOrEdge } from './utils';
|
|
20
20
|
import styles from './utils/styles';
|
|
21
21
|
|
|
22
22
|
var Dropzone = function (_React$Component) {
|
|
@@ -73,7 +73,9 @@ var Dropzone = function (_React$Component) {
|
|
|
73
73
|
document.addEventListener('dragover', onDocumentDragOver, false);
|
|
74
74
|
document.addEventListener('drop', this.onDocumentDrop, false);
|
|
75
75
|
}
|
|
76
|
-
this.fileInputEl
|
|
76
|
+
if (this.fileInputEl != null) {
|
|
77
|
+
this.fileInputEl.addEventListener('click', this.onInputElementClick, false);
|
|
78
|
+
}
|
|
77
79
|
window.addEventListener('focus', this.onFileDialogCancel, false);
|
|
78
80
|
}
|
|
79
81
|
}, {
|
|
@@ -119,6 +121,8 @@ var Dropzone = function (_React$Component) {
|
|
|
119
121
|
}, {
|
|
120
122
|
key: 'onDragEnter',
|
|
121
123
|
value: function onDragEnter(evt) {
|
|
124
|
+
var _this2 = this;
|
|
125
|
+
|
|
122
126
|
evt.preventDefault();
|
|
123
127
|
|
|
124
128
|
// Count the dropzone and any children that are entered.
|
|
@@ -126,11 +130,12 @@ var Dropzone = function (_React$Component) {
|
|
|
126
130
|
this.dragTargets.push(evt.target);
|
|
127
131
|
}
|
|
128
132
|
|
|
129
|
-
this.
|
|
130
|
-
|
|
131
|
-
|
|
133
|
+
Promise.resolve(this.props.getDataTransferItems(evt)).then(function (draggedFiles) {
|
|
134
|
+
_this2.setState({
|
|
135
|
+
isDragActive: true, // Do not rely on files for the drag state. It doesn't work in Safari.
|
|
136
|
+
draggedFiles: draggedFiles
|
|
137
|
+
});
|
|
132
138
|
});
|
|
133
|
-
|
|
134
139
|
if (this.props.onDragEnter) {
|
|
135
140
|
this.props.onDragEnter.call(this, evt);
|
|
136
141
|
}
|
|
@@ -158,13 +163,13 @@ var Dropzone = function (_React$Component) {
|
|
|
158
163
|
}, {
|
|
159
164
|
key: 'onDragLeave',
|
|
160
165
|
value: function onDragLeave(evt) {
|
|
161
|
-
var
|
|
166
|
+
var _this3 = this;
|
|
162
167
|
|
|
163
168
|
evt.preventDefault();
|
|
164
169
|
|
|
165
170
|
// Only deactivate once the dropzone and all children have been left.
|
|
166
171
|
this.dragTargets = this.dragTargets.filter(function (el) {
|
|
167
|
-
return el !== evt.target &&
|
|
172
|
+
return el !== evt.target && _this3.node.contains(el);
|
|
168
173
|
});
|
|
169
174
|
if (this.dragTargets.length > 0) {
|
|
170
175
|
return;
|
|
@@ -183,7 +188,7 @@ var Dropzone = function (_React$Component) {
|
|
|
183
188
|
}, {
|
|
184
189
|
key: 'onDrop',
|
|
185
190
|
value: function onDrop(evt) {
|
|
186
|
-
var
|
|
191
|
+
var _this4 = this;
|
|
187
192
|
|
|
188
193
|
var _props = this.props,
|
|
189
194
|
onDrop = _props.onDrop,
|
|
@@ -191,64 +196,65 @@ var Dropzone = function (_React$Component) {
|
|
|
191
196
|
onDropRejected = _props.onDropRejected,
|
|
192
197
|
multiple = _props.multiple,
|
|
193
198
|
disablePreview = _props.disablePreview,
|
|
194
|
-
accept = _props.accept
|
|
195
|
-
|
|
196
|
-
var fileList = getDataTransferItems(evt);
|
|
197
|
-
var acceptedFiles = [];
|
|
198
|
-
var rejectedFiles = [];
|
|
199
|
+
accept = _props.accept,
|
|
200
|
+
getDataTransferItems = _props.getDataTransferItems;
|
|
199
201
|
|
|
200
202
|
// Stop default browser behavior
|
|
203
|
+
|
|
201
204
|
evt.preventDefault();
|
|
202
205
|
|
|
203
206
|
// Reset the counter along with the drag on a drop.
|
|
204
207
|
this.dragTargets = [];
|
|
205
208
|
this.isFileDialogActive = false;
|
|
206
209
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
try {
|
|
210
|
-
file.preview = window.URL.createObjectURL(file); // eslint-disable-line no-param-reassign
|
|
211
|
-
} catch (err) {
|
|
212
|
-
if (process.env.NODE_ENV !== 'production') {
|
|
213
|
-
console.error('Failed to generate preview for file', file, err); // eslint-disable-line no-console
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
}
|
|
210
|
+
// Clear files value
|
|
211
|
+
this.draggedFiles = null;
|
|
217
212
|
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
}
|
|
213
|
+
// Reset drag state
|
|
214
|
+
this.setState({
|
|
215
|
+
isDragActive: false,
|
|
216
|
+
draggedFiles: []
|
|
223
217
|
});
|
|
224
218
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
219
|
+
Promise.resolve(getDataTransferItems(evt)).then(function (fileList) {
|
|
220
|
+
var acceptedFiles = [];
|
|
221
|
+
var rejectedFiles = [];
|
|
222
|
+
|
|
223
|
+
fileList.forEach(function (file) {
|
|
224
|
+
if (!disablePreview) {
|
|
225
|
+
try {
|
|
226
|
+
file.preview = window.URL.createObjectURL(file); // eslint-disable-line no-param-reassign
|
|
227
|
+
} catch (err) {
|
|
228
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
229
|
+
console.error('Failed to generate preview for file', file, err); // eslint-disable-line no-console
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
230
233
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
+
if (fileAccepted(file, accept) && fileMatchSize(file, _this4.props.maxSize, _this4.props.minSize)) {
|
|
235
|
+
acceptedFiles.push(file);
|
|
236
|
+
} else {
|
|
237
|
+
rejectedFiles.push(file);
|
|
238
|
+
}
|
|
239
|
+
});
|
|
234
240
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
241
|
+
if (!multiple && acceptedFiles.length > 1) {
|
|
242
|
+
// if not in multi mode add any extra accepted files to rejected.
|
|
243
|
+
// This will allow end users to easily ignore a multi file drop in "single" mode.
|
|
244
|
+
rejectedFiles.push.apply(rejectedFiles, _toConsumableArray(acceptedFiles.splice(0)));
|
|
245
|
+
}
|
|
238
246
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
247
|
+
if (onDrop) {
|
|
248
|
+
onDrop.call(_this4, acceptedFiles, rejectedFiles, evt);
|
|
249
|
+
}
|
|
242
250
|
|
|
243
|
-
|
|
244
|
-
|
|
251
|
+
if (rejectedFiles.length > 0 && onDropRejected) {
|
|
252
|
+
onDropRejected.call(_this4, rejectedFiles, evt);
|
|
253
|
+
}
|
|
245
254
|
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
draggedFiles: [],
|
|
250
|
-
acceptedFiles: acceptedFiles,
|
|
251
|
-
rejectedFiles: rejectedFiles
|
|
255
|
+
if (acceptedFiles.length > 0 && onDropAccepted) {
|
|
256
|
+
onDropAccepted.call(_this4, acceptedFiles, evt);
|
|
257
|
+
}
|
|
252
258
|
});
|
|
253
259
|
}
|
|
254
260
|
}, {
|
|
@@ -286,7 +292,7 @@ var Dropzone = function (_React$Component) {
|
|
|
286
292
|
}, {
|
|
287
293
|
key: 'onFileDialogCancel',
|
|
288
294
|
value: function onFileDialogCancel() {
|
|
289
|
-
var
|
|
295
|
+
var _this5 = this;
|
|
290
296
|
|
|
291
297
|
// timeout will not recognize context of this method
|
|
292
298
|
var onFileDialogCancel = this.props.onFileDialogCancel;
|
|
@@ -294,13 +300,13 @@ var Dropzone = function (_React$Component) {
|
|
|
294
300
|
|
|
295
301
|
if (this.isFileDialogActive) {
|
|
296
302
|
setTimeout(function () {
|
|
297
|
-
if (
|
|
303
|
+
if (_this5.fileInputEl != null) {
|
|
298
304
|
// Returns an object as FileList
|
|
299
|
-
var files =
|
|
305
|
+
var files = _this5.fileInputEl.files;
|
|
300
306
|
|
|
301
307
|
|
|
302
308
|
if (!files.length) {
|
|
303
|
-
|
|
309
|
+
_this5.isFileDialogActive = false;
|
|
304
310
|
}
|
|
305
311
|
}
|
|
306
312
|
|
|
@@ -384,7 +390,7 @@ var Dropzone = function (_React$Component) {
|
|
|
384
390
|
if (noStyles) {
|
|
385
391
|
style = styles.default;
|
|
386
392
|
activeStyle = styles.active;
|
|
387
|
-
acceptStyle =
|
|
393
|
+
acceptStyle = styles.active;
|
|
388
394
|
rejectStyle = styles.rejected;
|
|
389
395
|
disabledStyle = styles.disabled;
|
|
390
396
|
}
|
|
@@ -437,7 +443,8 @@ var Dropzone = function (_React$Component) {
|
|
|
437
443
|
onFileDialogCancel = props.onFileDialogCancel,
|
|
438
444
|
maxSize = props.maxSize,
|
|
439
445
|
minSize = props.minSize,
|
|
440
|
-
|
|
446
|
+
getDataTransferItems = props.getDataTransferItems,
|
|
447
|
+
divProps = _objectWithoutProperties(props, ['acceptedFiles', 'preventDropOnDocument', 'disablePreview', 'disableClick', 'onDropAccepted', 'onDropRejected', 'onFileDialogCancel', 'maxSize', 'minSize', 'getDataTransferItems']);
|
|
441
448
|
|
|
442
449
|
return React.createElement(
|
|
443
450
|
'div',
|
|
@@ -575,6 +582,13 @@ Dropzone.propTypes = {
|
|
|
575
582
|
*/
|
|
576
583
|
disabledStyle: PropTypes.object,
|
|
577
584
|
|
|
585
|
+
/**
|
|
586
|
+
* getDataTransferItems handler
|
|
587
|
+
* @param {Event} event
|
|
588
|
+
* @returns {Array} array of File objects
|
|
589
|
+
*/
|
|
590
|
+
getDataTransferItems: PropTypes.func,
|
|
591
|
+
|
|
578
592
|
/**
|
|
579
593
|
* onClick callback
|
|
580
594
|
* @param {Event} event
|
|
@@ -630,5 +644,6 @@ Dropzone.defaultProps = {
|
|
|
630
644
|
inputProps: {},
|
|
631
645
|
multiple: true,
|
|
632
646
|
maxSize: Infinity,
|
|
633
|
-
minSize: 0
|
|
647
|
+
minSize: 0,
|
|
648
|
+
getDataTransferItems: defaultGetDataTransferItem
|
|
634
649
|
};
|
package/dist/es/utils/index.js
CHANGED
|
@@ -6,6 +6,7 @@ export function getDataTransferItems(event) {
|
|
|
6
6
|
var dataTransferItemsList = [];
|
|
7
7
|
if (event.dataTransfer) {
|
|
8
8
|
var dt = event.dataTransfer;
|
|
9
|
+
|
|
9
10
|
if (dt.files && dt.files.length) {
|
|
10
11
|
dataTransferItemsList = dt.files;
|
|
11
12
|
} else if (dt.items && dt.items.length) {
|
|
@@ -16,6 +17,7 @@ export function getDataTransferItems(event) {
|
|
|
16
17
|
} else if (event.target && event.target.files) {
|
|
17
18
|
dataTransferItemsList = event.target.files;
|
|
18
19
|
}
|
|
20
|
+
|
|
19
21
|
// Convert from DataTransferItemsList to the native Array
|
|
20
22
|
return Array.prototype.slice.call(dataTransferItemsList);
|
|
21
23
|
}
|