Multiple file downloads via Filesystem API, and other tuning.
This commit is contained in:
		| @@ -3,7 +3,8 @@ import type { | ||||
|   DirEntry, | ||||
|   FileEntry, | ||||
|   FUID, | ||||
|   DirList | ||||
|   DirList, | ||||
|   SelectedItems, | ||||
| } from '@/repositories/Document' | ||||
| import { formatSize, formatUnixDate } from '@/utils' | ||||
| import { defineStore } from 'pinia' | ||||
| @@ -162,6 +163,50 @@ export const useDocumentStore = defineStore({ | ||||
|     }, | ||||
|     isUserLogged(): boolean { | ||||
|       return this.user.isLoggedIn | ||||
|     }, | ||||
|     selectedFiles(): SelectedItems { | ||||
|       function traverseDir(data: DirEntry | FileEntry, path: string, relpath: string) { | ||||
|         if (!('dir' in data)) return | ||||
|         for (const [name, attr] of Object.entries(data.dir)) { | ||||
|           const fullname = path ? `${path}/${name}` : name | ||||
|           // Is this the file we are looking for? Ignore if nested within another selection. | ||||
|           let r = relpath | ||||
|           if (selected.has(attr.id) && !relpath) { | ||||
|             ret.selected.add(attr.id) | ||||
|             ret.rootdir[name] = attr | ||||
|             r = name | ||||
|           } else if (relpath) { | ||||
|             r = `${relpath}/${name}` | ||||
|           } | ||||
|           if (r) { | ||||
|             ret.entries[attr.id] = attr | ||||
|             ret.fullpath[attr.id] = fullname | ||||
|             ret.relpath[attr.id] = r | ||||
|             ret.ids.push(attr.id) | ||||
|             if (!("dir" in attr)) ret.url[attr.id] = `/files/${fullname}` | ||||
|           } | ||||
|           traverseDir(attr, fullname, r) | ||||
|         } | ||||
|       } | ||||
|       const selected = this.selected | ||||
|       const ret: SelectedItems = { | ||||
|         selected: new Set<FUID>(), | ||||
|         missing: new Set<FUID>(), | ||||
|         rootdir: {} as DirList, | ||||
|         entries: {} as Record<FUID, FileEntry | DirEntry>, | ||||
|         fullpath: {} as Record<FUID, string>, | ||||
|         relpath: {} as Record<FUID, string>, | ||||
|         url: {} as Record<FUID, string>, | ||||
|         ids: [] as FUID[] | ||||
|       } | ||||
|       traverseDir(this.root, '', '') | ||||
|       // What did we not select? | ||||
|       for (const id of selected) { | ||||
|         if (!ret.selected.has(id)) ret.missing.add(id) | ||||
|       } | ||||
|       // Sorted array of FUIDs for easy traversal | ||||
|       ret.ids.sort((a, b) => ret.relpath[a].localeCompare(ret.relpath[b] , undefined, {numeric: true, sensitivity: 'base'})) | ||||
|       return ret | ||||
|     } | ||||
|   } | ||||
| }) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Leo Vasanko
					Leo Vasanko