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`] = ` +
+
+
+
+
+ +
test.md
+
+
+ +
+
+
+
+
+`; + 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(); });