diff --git a/packages/image/index.less b/packages/image/index.less
index 421dbeeb1..724f11161 100644
--- a/packages/image/index.less
+++ b/packages/image/index.less
@@ -18,6 +18,7 @@
top: 0;
left: 0;
display: flex;
+ flex-direction: column;
align-items: center;
justify-content: center;
color: @image-placeholder-text-color;
diff --git a/packages/uploader/index.js b/packages/uploader/index.js
index 77f5776ae..76ab6f453 100644
--- a/packages/uploader/index.js
+++ b/packages/uploader/index.js
@@ -6,6 +6,10 @@ import ImagePreview from '../image-preview';
const [sfc, bem] = use('uploader');
+function isImageDataUrl(dataUrl) {
+ return dataUrl.indexOf('data:image') === 0;
+}
+
export default sfc({
inheritAttrs: false,
@@ -136,10 +140,14 @@ export default sfc({
}
},
- onPreviewImage(startPosition) {
+ onPreviewImage(item) {
+ const imageFiles = this.fileList
+ .map(item => item.content)
+ .filter(content => isImageDataUrl(content));
+
ImagePreview({
- images: this.fileList.map(file => file.content),
- startPosition
+ images: imageFiles,
+ startPosition: imageFiles.indexOf(item.content)
});
},
@@ -148,23 +156,33 @@ export default sfc({
return;
}
- return this.fileList.map((file, index) => (
+ return this.fileList.map((item, index) => (
,
+
{item.file.name}
+ ];
+ }
+ }}
onClick={() => {
- this.onPreviewImage(index);
+ if (isImageDataUrl(item.content)) {
+ this.onPreviewImage(item);
+ }
}}
/>
{
- this.onDelete(file, index);
+ this.onDelete(item, index);
}}
/>
diff --git a/packages/uploader/index.less b/packages/uploader/index.less
index 541abe2c2..ba71eea3f 100644
--- a/packages/uploader/index.less
+++ b/packages/uploader/index.less
@@ -68,4 +68,19 @@
background-color: @uploader-delete-background-color;
}
}
+
+ &__file-icon {
+ color: @gray-darker;
+ font-size: 20px;
+ }
+
+ &__file-name {
+ box-sizing: border-box;
+ width: 100%;
+ margin-top: 5px;
+ padding: 0 5px;
+ color: @gray-darker;
+ font-size: 12px;
+ text-align: center;
+ }
}
diff --git a/packages/uploader/test/__snapshots__/index.spec.js.snap b/packages/uploader/test/__snapshots__/index.spec.js.snap
index 6c96128da..705231f65 100644
--- a/packages/uploader/test/__snapshots__/index.spec.js.snap
+++ b/packages/uploader/test/__snapshots__/index.spec.js.snap
@@ -22,7 +22,7 @@ exports[`max-count prop 1`] = `
-

+
@@ -32,11 +32,29 @@ exports[`max-count prop 1`] = `
`;
+exports[`preview not image file 1`] = `
+
+`;
+
exports[`preview-size prop 1`] = `
-

+
@@ -52,7 +70,7 @@ exports[`render preview image 1`] = `
-

+
diff --git a/packages/uploader/test/index.spec.js b/packages/uploader/test/index.spec.js
index 0002142cb..316a5d16a 100644
--- a/packages/uploader/test/index.spec.js
+++ b/packages/uploader/test/index.spec.js
@@ -5,22 +5,23 @@ window.File = function () {
this.size = 10000;
};
+const mockFileDataUrl = 'data:image/test';
+const mockFile = new File([], '/Users');
+const file = { target: { files: [mockFile] } };
+const multiFile = { target: { files: [mockFile, mockFile] } };
+
window.FileReader = function () {
this.readAsText = function () {
this.onload &&
this.onload({
target: {
- result: 'test'
+ result: mockFileDataUrl
}
});
};
this.readAsDataURL = this.readAsText;
};
-const mockFile = new File([], '/Users');
-const file = { target: { files: [mockFile] } };
-const multiFile = { target: { files: [mockFile, mockFile] } };
-
test('disabled', () => {
const afterRead = jest.fn();
const wrapper = mount(Uploader, {
@@ -39,7 +40,7 @@ it('read text', done => {
propsData: {
resultType: 'text',
afterRead: readFile => {
- expect(readFile.content).toEqual('test');
+ expect(readFile.content).toEqual(mockFileDataUrl);
done();
}
}
@@ -276,5 +277,26 @@ it('click to preview image', async () => {
wrapper.find('.van-image').trigger('click');
- expect(document.querySelector('.van-image-preview')).toBeTruthy();
+ const imagePreviewNode = document.querySelector('.van-image-preview');
+ expect(imagePreviewNode).toBeTruthy();
+ imagePreviewNode.remove();
+});
+
+it('preview not image file', async () => {
+ const wrapper = mount(Uploader, {
+ propsData: {
+ fileList: [{
+ content: 'data:application',
+ file: {
+ name: 'test.md'
+ }
+ }]
+ }
+ });
+
+ wrapper.find('img').trigger('error');
+ wrapper.find('.van-image').trigger('click');
+
+ expect(document.querySelector('.van-image-preview')).toBeFalsy();
+ expect(wrapper).toMatchSnapshot();
});