Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions components/upload/__tests__/upload-866.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import { describe, expect, it } from 'vitest';
import { mount } from '@vue/test-utils';
import FUpload from '../upload';

describe('FUpload drag prop #866', () => {
it('renders drag zone when drag prop is true', async () => {
const wrapper = mount(FUpload, {
props: { drag: true },
slots: { default: () => 'Drop files here' },
});
await wrapper.vm.$nextTick();
const draggerEl = wrapper.find('.fes-upload-dragger');
expect(draggerEl.exists()).toBe(true);
});

it('renders normal trigger when drag prop is false', async () => {
const wrapper = mount(FUpload, {
props: { drag: false },
slots: { default: () => 'Click to upload' },
});
await wrapper.vm.$nextTick();
const draggerEl = wrapper.find('.fes-upload-dragger');
expect(draggerEl.exists()).toBe(false);
});

it('drop event triggers file handling', async () => {
const wrapper = mount(FUpload, {
props: { drag: true },
slots: { default: () => 'Drop here' },
});
await wrapper.vm.$nextTick();
const file = new File(['test'], 'test.txt', { type: 'text/plain' });
const dataTransfer = { files: [file] };
const dropEvent = new DragEvent('drop', { bubbles: true, cancelable: true });
Object.defineProperty(dropEvent, 'dataTransfer', { value: dataTransfer });
const draggerEl = wrapper.find('.fes-upload-dragger');
expect(draggerEl.exists()).toBe(true);
draggerEl.element.dispatchEvent(dropEvent);
});

it('drag zone has correct class structure', async () => {
const wrapper = mount(FUpload, {
props: { drag: true },
});
await wrapper.vm.$nextTick();
expect(wrapper.find('.fes-upload-dragger').exists()).toBe(true);
});
});
18 changes: 18 additions & 0 deletions components/upload/upload.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { useTheme } from '../_theme/useTheme';
import type { ExtractPublicPropTypes } from '../_util/interface';
import Trigger from './trigger.vue';
import FileList from './fileList.vue';
import UploadDragger from './uploadDragger';
import useUpload from './useUpload';

import type { FileItem } from './interface';
Expand Down Expand Up @@ -66,6 +67,10 @@ export const uploadProps = {
type: Function,
},
transformResponse: Function,
drag: {
type: Boolean,
default: false,
},
} as const satisfies ComponentObjectPropsOptions;

export type UploadProps = ExtractPublicPropTypes<typeof uploadProps>;
Expand Down Expand Up @@ -106,6 +111,19 @@ export default defineComponent({
});

return () => {
if (props.drag) {
return (
<>
<UploadDragger>
{ctx.slots.default?.({
uploadFiles: uploadFiles.value,
})}
</UploadDragger>
{ctx.slots.tip?.()}
{getFileList()}
</>
);
}
return (
<>
{ctx.slots.default
Expand Down
Loading