44 <label >
55 <span :class =" labelClasses" >{{ label }}</span >
66 <input
7+ :accept =" accept"
78 :class =" fileInpClasses"
89 :multiple =" multiple"
910 type =" file"
10- :accept =" accept"
1111 @change =" handleChange"
1212 >
1313 </label >
1414 <slot />
1515 </div >
1616 <div
1717 v-else
18- class =" flex items-center justify-center"
18+ class =" flex flex-col items-start justify-center"
1919 @change =" handleChange"
2020 @dragover =" dragOverHandler"
2121 @drop =" dropFileHandler"
2222 >
23+ <span
24+ v-if =" label !== ''"
25+ :class =" labelClasses"
26+ >{{ label }}</span >
2327 <label :class =" dropzoneLabelClasses" >
2428 <div :class =" dropzoneWrapClasses" >
2529 <svg
4751 <p v-else >File: {{ dropZoneText }}</p >
4852 </div >
4953 <input
50- :multiple =" multiple"
51- type =" file"
5254 :accept =" accept"
55+ :multiple =" multiple"
5356 class =" hidden"
57+ type =" file"
5458 >
5559 </label >
5660 </div >
@@ -64,21 +68,21 @@ import { computed } from 'vue'
6468import { useFileInputClasses } from ' ./composables/useFileInputClasses'
6569
6670interface FileInputProps {
71+ accept? : string
6772 dropzone? : boolean
6873 label? : string
6974 modelValue? : File | File [] | null
7075 multiple? : boolean
7176 size? : string
72- accept? : string
7377}
7478
7579const props = withDefaults (defineProps <FileInputProps >(), {
80+ accept: ' ' ,
7681 dropzone: false ,
7782 label: ' ' ,
7883 modelValue: null ,
7984 multiple: false ,
8085 size: ' sm' ,
81- accept: ' ' ,
8286})
8387
8488const dropZoneText = computed (() => {
@@ -118,20 +122,22 @@ const dropFileHandler = (event: DragEvent) => {
118122 event .preventDefault ()
119123 const arr: File [] = []
120124 if (event .dataTransfer ?.items ) {
121- Object .values (event .dataTransfer .items ).forEach ((item : DataTransferItem ) => {
122- if (item .kind === ' file' ) {
123- arr .push (item .getAsFile () as File )
124- }
125- })
125+ Object .values (event .dataTransfer .items )
126+ .forEach ((item : DataTransferItem ) => {
127+ if (item .kind === ' file' ) {
128+ arr .push (item .getAsFile () as File )
129+ }
130+ })
126131 if (props .multiple ) {
127132 model .value = arr
128133 } else {
129134 model .value = arr [0 ]
130135 }
131136 } else if (event .dataTransfer ?.files ) {
132- Object .values (event .dataTransfer .files ).forEach ((file : File ) => {
133- model .value = file
134- })
137+ Object .values (event .dataTransfer .files )
138+ .forEach ((file : File ) => {
139+ model .value = file
140+ })
135141 }
136142}
137143
@@ -140,10 +146,10 @@ const dragOverHandler = (event: Event) => {
140146}
141147
142148const {
143- fileInpClasses,
144- labelClasses,
145149 dropzoneLabelClasses,
146- dropzoneWrapClasses,
147150 dropzoneTextClasses,
151+ dropzoneWrapClasses,
152+ fileInpClasses,
153+ labelClasses,
148154} = useFileInputClasses (props .size )
149155 </script >
0 commit comments