feat: update upload
parent
e51a6e9691
commit
44d55b329d
|
@ -48,10 +48,15 @@ export default {
|
|||
},
|
||||
methods: {
|
||||
onStart (file) {
|
||||
const nextFileList = this.sFileList.concat()
|
||||
const targetItem = fileToObject(file)
|
||||
targetItem.status = 'uploading'
|
||||
nextFileList.push(targetItem)
|
||||
const nextFileList = this.sFileList.concat()
|
||||
const fileIndex = nextFileList.findIndex(({ uid }) => uid === targetItem.uid)
|
||||
if (fileIndex === -1) {
|
||||
nextFileList.push(targetItem)
|
||||
} else {
|
||||
nextFileList[fileIndex] = targetItem
|
||||
}
|
||||
this.onChange({
|
||||
file: targetItem,
|
||||
fileList: nextFileList,
|
||||
|
|
|
@ -7,8 +7,12 @@ import Progress from '../progress'
|
|||
import classNames from 'classnames'
|
||||
import { UploadListProps } from './interface'
|
||||
|
||||
const imageTypes = ['image', 'webp', 'png', 'svg', 'gif', 'jpg', 'jpeg', 'bmp']
|
||||
// https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL
|
||||
const previewFile = (file, callback) => {
|
||||
if (file.type && !imageTypes.includes(file.type)) {
|
||||
callback('')
|
||||
}
|
||||
const reader = new window.FileReader()
|
||||
reader.onloadend = () => callback(reader.result)
|
||||
reader.readAsDataURL(file)
|
||||
|
@ -23,7 +27,7 @@ const extname = (url) => {
|
|||
const filenameWithoutSuffix = filename.split(/#|\?/)[0]
|
||||
return (/\.[^./\\]*$/.exec(filenameWithoutSuffix) || [''])[0]
|
||||
}
|
||||
const imageTypes = ['image', 'webp', 'png', 'svg', 'gif', 'jpg', 'jpeg', 'bmp']
|
||||
|
||||
const isImageUrl = (file) => {
|
||||
if (imageTypes.includes(file.type)) {
|
||||
return true
|
||||
|
@ -148,15 +152,17 @@ export default {
|
|||
[`${prefixCls}-list-item`]: true,
|
||||
[`${prefixCls}-list-item-${file.status}`]: true,
|
||||
})
|
||||
const linkProps = typeof file.linkProps === 'string'
|
||||
? JSON.parse(file.linkProps) : file.linkProps
|
||||
const preview = file.url ? (
|
||||
<a
|
||||
{...file.linkProps}
|
||||
href={file.url}
|
||||
target='_blank'
|
||||
rel='noopener noreferrer'
|
||||
class={`${prefixCls}-list-item-name`}
|
||||
onClick={e => this.handlePreview(file, e)}
|
||||
title={file.name}
|
||||
{...linkProps}
|
||||
href={file.url}
|
||||
onClick={e => this.handlePreview(file, e)}
|
||||
>
|
||||
{file.name}
|
||||
</a>
|
||||
|
@ -196,16 +202,16 @@ export default {
|
|||
}
|
||||
},
|
||||
}
|
||||
const iconProps1 = {...iconProps, ...{props: {type: 'cross'}}}
|
||||
const iconProps1 = {...iconProps, ...{props: {type: 'close'}}}
|
||||
const removeIcon = showRemoveIcon ? (
|
||||
<Icon {...iconProps} />
|
||||
) : null
|
||||
const removeIconCross = showRemoveIcon ? (
|
||||
const removeIconClose = showRemoveIcon ? (
|
||||
<Icon {...iconProps1}/>
|
||||
) : null
|
||||
const actions = (listType === 'picture-card' && file.status !== 'uploading')
|
||||
? <span class={`${prefixCls}-list-item-actions`}>{previewIcon}{removeIcon}</span>
|
||||
: removeIconCross
|
||||
: removeIconClose
|
||||
let message
|
||||
if (file.response && typeof file.response === 'string') {
|
||||
message = file.response
|
||||
|
|
|
@ -176,4 +176,55 @@ describe('Upload', () => {
|
|||
})
|
||||
})
|
||||
})
|
||||
|
||||
it('should support linkProps as object', () => {
|
||||
const fileList = [{
|
||||
uid: '-1',
|
||||
name: 'foo.png',
|
||||
status: 'done',
|
||||
url: 'http://www.baidu.com/xxx.png',
|
||||
linkProps: {
|
||||
download: 'image',
|
||||
rel: 'noopener',
|
||||
},
|
||||
}]
|
||||
const props = {
|
||||
propsData: {
|
||||
fileList,
|
||||
},
|
||||
sync: false,
|
||||
}
|
||||
const wrapper = mount(Upload, props)
|
||||
setTimeout(() => {
|
||||
const linkNode = wrapper.find('a.ant-upload-list-item-name')
|
||||
expect(linkNode.props().download).toBe('image')
|
||||
expect(linkNode.props().rel).toBe('noopener')
|
||||
}, 0)
|
||||
})
|
||||
|
||||
it('should support linkProps as json stringify', () => {
|
||||
const linkPropsString = JSON.stringify({
|
||||
download: 'image',
|
||||
rel: 'noopener',
|
||||
})
|
||||
const fileList = [{
|
||||
uid: '-1',
|
||||
name: 'foo.png',
|
||||
status: 'done',
|
||||
url: 'http://www.baidu.com/xxx.png',
|
||||
linkProps: linkPropsString,
|
||||
}]
|
||||
const props = {
|
||||
propsData: {
|
||||
fileList,
|
||||
},
|
||||
sync: false,
|
||||
}
|
||||
const wrapper = mount(Upload, props)
|
||||
setTimeout(() => {
|
||||
const linkNode = wrapper.find('a.ant-upload-list-item-name')
|
||||
expect(linkNode.props().download).toBe('image')
|
||||
expect(linkNode.props().rel).toBe('noopener')
|
||||
}, 0)
|
||||
})
|
||||
})
|
||||
|
|
|
@ -76,7 +76,7 @@ describe('Upload List', () => {
|
|||
const wrapper = mount(Upload, props)
|
||||
setTimeout(async () => {
|
||||
expect(wrapper.findAll('.ant-upload-list-item').length).toBe(2)
|
||||
wrapper.findAll('.ant-upload-list-item').at(0).find('.anticon-cross').trigger('click')
|
||||
wrapper.findAll('.ant-upload-list-item').at(0).find('.anticon-close').trigger('click')
|
||||
await delay(400)
|
||||
// wrapper.update();
|
||||
expect(wrapper.findAll('.ant-upload-list-item').length).toBe(1)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<cn>
|
||||
#### 用户头像
|
||||
点击上传用户头像,并使用 `beforeUpload` 限制用户上传的图片格式和大小。
|
||||
`beforeUpload` 的返回值可以是一个 Promise 以支持也支持异步检查
|
||||
`beforeUpload` 的返回值可以是一个 Promise 以支持异步处理,如服务端校验等
|
||||
</cn>
|
||||
|
||||
<us>
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
| showUploadList | Whether to show default upload list, could be an object to specify `showPreviewIcon` and `showRemoveIcon` individually | Boolean or { showPreviewIcon?: boolean, showRemoveIcon?: boolean } | true |
|
||||
| supportServerRender | Need to be turned on while the server side is rendering. | boolean | false |
|
||||
| withCredentials | ajax upload with cookie sent | boolean | false |
|
||||
| openFileDialogOnClick | click open file dialog | boolean | true |
|
||||
| remove | A callback function, will be executed when removing file button is clicked, remove event will be prevented when return value is `false` or a Promise which resolve(false) or reject. | Function(file): `boolean | Promise` | - |
|
||||
|
||||
### events
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
| showUploadList | 是否展示 uploadList, 可设为一个对象,用于单独设定 showPreviewIcon 和 showRemoveIcon | Boolean or { showPreviewIcon?: boolean, showRemoveIcon?: boolean } | true |
|
||||
| supportServerRender | 服务端渲染时需要打开这个 | boolean | false |
|
||||
| withCredentials | 上传请求时是否携带 cookie | boolean | false |
|
||||
| openFileDialogOnClick | 点击打开文件对话框 | boolean | true |
|
||||
| remove | 点击移除文件时的回调,返回值为 false 时不移除。支持返回一个 Promise 对象,Promise 对象 resolve(false) 或 reject 时不移除。 | Function(file): `boolean | Promise` | 无 |
|
||||
|
||||
### 事件
|
||||
|
|
|
@ -76,6 +76,7 @@ export const UploadProps = {
|
|||
prefixCls: PropsTypes.string,
|
||||
customRequest: PropsTypes.func,
|
||||
withCredentials: PropsTypes.bool,
|
||||
openFileDialogOnClick: PropsTypes.bool,
|
||||
locale: UploadLocale,
|
||||
height: PropsTypes.number,
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@ import Api from './components/api'
|
|||
import './components'
|
||||
import demoBox from './components/demoBox'
|
||||
import demoContainer from './components/demoContainer'
|
||||
import Test from '../components/avatar/demo/index'
|
||||
import Test from '../components/test/index.vue'
|
||||
import zhCN from './theme/zh-CN'
|
||||
import enUS from './theme/en-US'
|
||||
Vue.use(VueClipboard)
|
||||
|
|
Loading…
Reference in New Issue