support folder upload even with "accept" filter

Massimo Melina committed Mar 29, 2023 at 16:12 UTC 52ffa768f7f72fcd4e9e212ed2e5f748459f097a
1 file changed +12 -11
frontend/src/upload.ts
+12 -11
@@ -94,7 +94,7 @@ export function showUpload() {
94 !can_upload ? t('no_upload_here', "No upload permission for the current folder")
95 : h(Flex, { justifyContent: 'center', flexWrap: 'wrap', marginTop: '1em' },
96 h('button', { onClick: () => pickFiles({ accept: normalizeAccept(accept) }) }, t`Pick files`),
97 - !accept && h('button', { onClick: () => pickFiles({ folder: true }) }, t`Pick folder`),
97 + h('button', { onClick: () => pickFiles({ folder: true }) }, t`Pick folder`),
98 files.length > 0 && h('button', {
99 onClick() {
100 enqueue(files)
@@ -142,7 +142,9 @@ export function showUpload() {
142 )
143
144 function pickFiles(options: Parameters<typeof selectFiles>[1]) {
145 - selectFiles(list => setFiles([ ...files, ...list ||[] ] ), options)
145 + selectFiles(list => {
146 + setFiles([...files, ...Array.from(list || []).filter(simulateBrowserAccept)])
147 + }, options)
148 }
149 }
150
@@ -219,16 +221,15 @@ export async function enqueue(files: File[]) {
221 const to = location.pathname
222 _.find(uploadState.qs, { to })?.files.push(...files.map(ref))
223 || uploadState.qs.push({ to, files: files.map(ref) })
224 +}
225
223 - function simulateBrowserAccept(f: File) {
224 - const { accept } = state
225 - if (!accept) return true
226 - return normalizeAccept(accept)!.split(/ *[|,] */).some(pattern =>
227 - pattern.startsWith('.') ? f.name.endsWith(pattern)
228 - : f.type.match(pattern.replace('*', '.*'))
229 - )
230 - }
231 -
226 +function simulateBrowserAccept(f: File) {
227 + const { accept } = state
228 + if (!accept) return true
229 + return normalizeAccept(accept)!.split(/ *[|,] */).some(pattern =>
230 + pattern.startsWith('.') ? f.name.endsWith(pattern)
231 + : f.type.match(pattern.replace('*', '.*'))
232 + )
233 }
234
235 function normalizeAccept(accept?: string) {