diff options
Diffstat (limited to 'apps/files')
-rw-r--r-- | apps/files/src/components/FilesListVirtual.vue | 20 | ||||
-rw-r--r-- | apps/files/src/services/RouterService.ts | 37 | ||||
-rw-r--r-- | apps/files/src/views/FilesList.vue | 4 |
3 files changed, 54 insertions, 7 deletions
diff --git a/apps/files/src/components/FilesListVirtual.vue b/apps/files/src/components/FilesListVirtual.vue index 9a35e9ff855..782e2bd3587 100644 --- a/apps/files/src/components/FilesListVirtual.vue +++ b/apps/files/src/components/FilesListVirtual.vue @@ -4,7 +4,7 @@ --> <template> <VirtualList ref="table" - :data-component="userConfig.grid_view ? FileEntryGrid : FileEntry" + :data-component="fileEntryComponent" :data-key="'source'" :data-sources="nodes" :grid-mode="userConfig.grid_view" @@ -132,8 +132,6 @@ export default defineComponent({ data() { return { - FileEntry, - FileEntryGrid, headers: getFileListHeaders(), scrollToIndex: 0, openFileId: null as number|null, @@ -141,6 +139,13 @@ export default defineComponent({ }, computed: { + /** + * The Vue component to use for file list entries + */ + fileEntryComponent() { + return this.userConfig.grid_view ? FileEntryGrid : FileEntry + }, + userConfig(): UserConfig { return this.userConfigStore.userConfig }, @@ -218,6 +223,11 @@ export default defineComponent({ }, methods: { + reset() { + this.scrollToIndex = 0 + this.openFileId = null + }, + // Open the file sidebar if we have the room for it // but don't open the sidebar for the current folder openSidebarForFile(fileId) { @@ -236,6 +246,10 @@ export default defineComponent({ if (fileId) { const index = this.nodes.findIndex(node => node.fileid === fileId) if (warn && index === -1 && fileId !== this.currentFolder.fileid) { + logger.error('File to scroll to not found', { + folder: this.currentFolder, + fileId, + }) showError(this.t('files', 'File not found')) } this.scrollToIndex = Math.max(0, index) diff --git a/apps/files/src/services/RouterService.ts b/apps/files/src/services/RouterService.ts index 84516465495..65113eb32d7 100644 --- a/apps/files/src/services/RouterService.ts +++ b/apps/files/src/services/RouterService.ts @@ -4,14 +4,47 @@ */ import type { Route } from 'vue-router' import type VueRouter from 'vue-router' -import type { Dictionary, Location } from 'vue-router/types/router' +import type { Dictionary, Location } from 'vue-router/types/router.d.ts' +import { TypedEventTarget } from 'typescript-event-target' -export default class RouterService { +interface NavigationEventData { + name: Route['name'] + params: Route['params'] + query: Route['query'] +} + +class NavigationEvent extends CustomEvent<NavigationEventData> { + + constructor({ name, params, query }: Route) { + super('navigation', { + detail: { + name, + // Do not let API users mess with internal state of our VueRouter (e.g. if they use Vue it could conflict) + params: structuredClone(params), + query: structuredClone(query), + }, + }) + } + +} + +interface RouterEventMap { + navigation: NavigationEvent +} + +export default class RouterService extends TypedEventTarget<RouterEventMap> { private _router: VueRouter constructor(router: VueRouter) { + super() this._router = router + this._router.beforeEach((to, from, next) => { + // emit event + this.dispatchTypedEvent('navigation', new NavigationEvent(to)) + // continue + next() + }) } get name(): string | null | undefined { diff --git a/apps/files/src/views/FilesList.vue b/apps/files/src/views/FilesList.vue index a127fd4c35c..bca95d0d25a 100644 --- a/apps/files/src/views/FilesList.vue +++ b/apps/files/src/views/FilesList.vue @@ -397,7 +397,7 @@ export default defineComponent({ showCustomEmptyView() { return !this.loading && this.isEmptyDir && this.currentView?.emptyView !== undefined - } + }, }, watch: { @@ -657,7 +657,7 @@ export default defineComponent({ filterDirContent() { let nodes = this.dirContents for (const filter of this.filtersStore.sortedFilters) { - nodes = filter.filter(nodes) + nodes = filter.filter(nodes) as Node[] } this.dirContentsFiltered = nodes }, |