Skip to content

Commit 570e238

Browse files
authored
fix: enable multiple files selection in FwbFileInput
Improve file handling and layout for file inputs
2 parents 8b5a96e + 167750c commit 570e238

File tree

2 files changed

+24
-8
lines changed

2 files changed

+24
-8
lines changed

src/components/FwbFileInput/FwbFileInput.vue

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
:multiple="multiple"
5656
class="hidden"
5757
type="file"
58+
@change="handleChange"
5859
>
5960
</label>
6061
</div>
@@ -112,7 +113,12 @@ const model = computed({
112113
const handleChange = (event: Event) => {
113114
const target = event.target as HTMLInputElement
114115
if (props.multiple) {
115-
model.value = Array.from(target.files ?? [])
116+
const newFiles = Array.from(target.files ?? [])
117+
if (Array.isArray(model.value) && model.value.length > 0) {
118+
model.value = [...model.value, ...newFiles]
119+
} else {
120+
model.value = newFiles
121+
}
116122
} else {
117123
model.value = target.files?.[0] ?? null
118124
}
@@ -129,15 +135,25 @@ const dropFileHandler = (event: DragEvent) => {
129135
}
130136
})
131137
if (props.multiple) {
132-
model.value = arr
138+
if (Array.isArray(model.value) && model.value.length > 0) {
139+
model.value = [...model.value, ...arr]
140+
} else {
141+
model.value = arr
142+
}
133143
} else {
134-
model.value = arr[0]
144+
model.value = arr[0] || null
135145
}
136146
} else if (event.dataTransfer?.files) {
137-
Object.values(event.dataTransfer.files)
138-
.forEach((file: File) => {
139-
model.value = file
140-
})
147+
const files = Array.from(event.dataTransfer.files)
148+
if (props.multiple) {
149+
if (Array.isArray(model.value) && model.value.length > 0) {
150+
model.value = [...model.value, ...files]
151+
} else {
152+
model.value = files
153+
}
154+
} else {
155+
model.value = files[0] || null
156+
}
141157
}
142158
}
143159

src/components/FwbFileInput/composables/useFileInputClasses.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { computed } from 'vue'
22

33
import { simplifyTailwindClasses } from '@/utils/simplifyTailwindClasses'
44

5-
const fileInpDefaultClasses = 'block w-full text-sm text-gray-900 border-[1px] border-gray-300 rounded-lg cursor-pointer bg-gray-50 dark:text-gray-400 focus:outline-none dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400'
5+
const fileInpDefaultClasses = 'block w-full py-1 px-2 text-sm text-gray-900 border-[1px] border-gray-300 rounded-lg cursor-pointer bg-gray-50 dark:text-gray-400 focus:outline-none dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400'
66
const fileInpLabelClasses = 'block mb-2 text-sm font-medium text-gray-900 dark:text-white'
77
const fileInpDropzoneClasses = 'flex flex-col items-center justify-center w-full h-64 border-2 border-gray-300 border-dashed rounded-lg cursor-pointer bg-gray-50 dark:hover:bg-bray-800 dark:bg-gray-700 hover:bg-gray-100 dark:border-gray-600 dark:hover:border-gray-500 dark:hover:bg-gray-600'
88
const fileDropzoneWrapClasses = 'flex flex-col items-center justify-center pt-5 pb-6'

0 commit comments

Comments
 (0)