1
1
import classNames from 'classnames' ;
2
2
import uniqBy from 'lodash/uniqBy' ;
3
3
import findIndex from 'lodash/findIndex' ;
4
+ import pick from 'lodash/pick' ;
4
5
import VcUpload from '../vc-upload' ;
5
6
import BaseMixin from '../_util/BaseMixin' ;
6
7
import { getOptionProps , initDefaultProps , hasProp , getListeners } from '../_util/props-util' ;
@@ -66,25 +67,12 @@ export default {
66
67
fileList : nextFileList ,
67
68
} ) ;
68
69
// fix ie progress
69
- if ( ! window . FormData ) {
70
+ if ( ! window . File || process . env . TEST_IE ) {
70
71
this . autoUpdateProgress ( 0 , targetItem ) ;
71
72
}
72
73
} ,
73
- autoUpdateProgress ( _ , file ) {
74
- const getPercent = genPercentAdd ( ) ;
75
- let curPercent = 0 ;
76
- this . clearProgressTimer ( ) ;
77
- this . progressTimer = setInterval ( ( ) => {
78
- curPercent = getPercent ( curPercent ) ;
79
- this . onProgress (
80
- {
81
- percent : curPercent * 100 ,
82
- } ,
83
- file ,
84
- ) ;
85
- } , 200 ) ;
86
- } ,
87
- onSuccess ( response , file ) {
74
+
75
+ onSuccess ( response , file , xhr ) {
88
76
this . clearProgressTimer ( ) ;
89
77
try {
90
78
if ( typeof response === 'string' ) {
@@ -101,6 +89,7 @@ export default {
101
89
}
102
90
targetItem . status = 'done' ;
103
91
targetItem . response = response ;
92
+ targetItem . xhr = xhr ;
104
93
this . onChange ( {
105
94
file : { ...targetItem } ,
106
95
fileList,
@@ -140,19 +129,24 @@ export default {
140
129
this . $emit ( 'reject' , fileList ) ;
141
130
} ,
142
131
handleRemove ( file ) {
143
- const { remove } = this ;
144
- const { status } = file ;
145
- file . status = 'removed' ; // eslint-disable-line
132
+ const { remove : onRemove } = this ;
133
+ const { sFileList : fileList } = this . $data ;
146
134
147
- Promise . resolve ( typeof remove === 'function' ? remove ( file ) : remove ) . then ( ret => {
135
+ Promise . resolve ( typeof onRemove === 'function' ? onRemove ( file ) : onRemove ) . then ( ret => {
148
136
// Prevent removing file
149
137
if ( ret === false ) {
150
- file . status = status ;
151
138
return ;
152
139
}
153
140
154
- const removedFileList = removeFileItem ( file , this . sFileList ) ;
141
+ const removedFileList = removeFileItem ( file , fileList ) ;
142
+
155
143
if ( removedFileList ) {
144
+ file . status = 'removed' ; // eslint-disable-line
145
+
146
+ if ( this . upload ) {
147
+ this . upload . abort ( file ) ;
148
+ }
149
+
156
150
this . onChange ( {
157
151
file,
158
152
fileList : removedFileList ,
@@ -178,14 +172,16 @@ export default {
178
172
} ) ;
179
173
} ,
180
174
reBeforeUpload ( file , fileList ) {
181
- if ( ! this . beforeUpload ) {
175
+ const { beforeUpload } = this . $props ;
176
+ const { sFileList : stateFileList } = this . $data ;
177
+ if ( ! beforeUpload ) {
182
178
return true ;
183
179
}
184
- const result = this . beforeUpload ( file , fileList ) ;
180
+ const result = beforeUpload ( file , fileList ) ;
185
181
if ( result === false ) {
186
182
this . onChange ( {
187
183
file,
188
- fileList : uniqBy ( this . sFileList . concat ( fileList . map ( fileToObject ) ) , item => item . uid ) ,
184
+ fileList : uniqBy ( stateFileList . concat ( fileList . map ( fileToObject ) ) , item => item . uid ) ,
189
185
} ) ;
190
186
return false ;
191
187
}
@@ -197,25 +193,45 @@ export default {
197
193
clearProgressTimer ( ) {
198
194
clearInterval ( this . progressTimer ) ;
199
195
} ,
196
+ autoUpdateProgress ( _ , file ) {
197
+ const getPercent = genPercentAdd ( ) ;
198
+ let curPercent = 0 ;
199
+ this . clearProgressTimer ( ) ;
200
+ this . progressTimer = setInterval ( ( ) => {
201
+ curPercent = getPercent ( curPercent ) ;
202
+ this . onProgress (
203
+ {
204
+ percent : curPercent * 100 ,
205
+ } ,
206
+ file ,
207
+ ) ;
208
+ } , 200 ) ;
209
+ } ,
200
210
renderUploadList ( locale ) {
201
- const { showUploadList = { } , listType } = getOptionProps ( this ) ;
202
- const { showRemoveIcon, showPreviewIcon } = showUploadList ;
211
+ const {
212
+ showUploadList = { } ,
213
+ listType,
214
+ previewFile,
215
+ disabled,
216
+ locale : propLocale ,
217
+ } = getOptionProps ( this ) ;
218
+ const { showRemoveIcon, showPreviewIcon, showDownloadIcon } = showUploadList ;
219
+ const { sFileList : fileList } = this . $data ;
203
220
const uploadListProps = {
204
221
props : {
205
222
listType,
206
- items : this . sFileList ,
207
- showRemoveIcon,
223
+ items : fileList ,
224
+ previewFile,
225
+ showRemoveIcon : ! disabled && showRemoveIcon ,
208
226
showPreviewIcon,
209
- locale : { ...locale , ...this . $props . locale } ,
227
+ showDownloadIcon,
228
+ locale : { ...locale , ...propLocale } ,
210
229
} ,
211
230
on : {
212
231
remove : this . handleManualRemove ,
232
+ ...pick ( getListeners ( this ) , [ 'download' , 'preview' ] ) , // 如果没有配置该事件,不要传递, uploadlist 会有相应逻辑
213
233
} ,
214
234
} ;
215
- const listeners = getListeners ( this ) ;
216
- if ( listeners . preview ) {
217
- uploadListProps . on . preview = listeners . preview ;
218
- }
219
235
return < UploadList { ...uploadListProps } /> ;
220
236
} ,
221
237
} ,
@@ -227,7 +243,7 @@ export default {
227
243
type,
228
244
disabled,
229
245
} = getOptionProps ( this ) ;
230
-
246
+ const { sFileList : fileList , dragState } = this . $data ;
231
247
const getPrefixCls = this . configProvider . getPrefixCls ;
232
248
const prefixCls = getPrefixCls ( 'upload' , customizePrefixCls ) ;
233
249
@@ -261,8 +277,8 @@ export default {
261
277
if ( type === 'drag' ) {
262
278
const dragCls = classNames ( prefixCls , {
263
279
[ `${ prefixCls } -drag` ] : true ,
264
- [ `${ prefixCls } -drag-uploading` ] : this . sFileList . some ( file => file . status === 'uploading' ) ,
265
- [ `${ prefixCls } -drag-hover` ] : this . dragState === 'dragover' ,
280
+ [ `${ prefixCls } -drag-uploading` ] : fileList . some ( file => file . status === 'uploading' ) ,
281
+ [ `${ prefixCls } -drag-hover` ] : dragState === 'dragover' ,
266
282
[ `${ prefixCls } -disabled` ] : disabled ,
267
283
} ) ;
268
284
return (
@@ -290,7 +306,7 @@ export default {
290
306
291
307
// Remove id to avoid open by label when trigger is hidden
292
308
// https://github.com/ant-design/ant-design/issues/14298
293
- if ( ! children ) {
309
+ if ( ! children || disabled ) {
294
310
delete vcUploadProps . props . id ;
295
311
}
296
312
@@ -302,7 +318,7 @@ export default {
302
318
303
319
if ( listType === 'picture-card' ) {
304
320
return (
305
- < span >
321
+ < span class = { ` ${ prefixCls } -picture-card-wrapper` } >
306
322
{ uploadList }
307
323
{ uploadButton }
308
324
</ span >
0 commit comments