diff --git a/apps/files/src/actions/deleteAction.ts b/apps/files/src/actions/deleteAction.ts index 8148dd595157c..a9c2aadc8ec45 100644 --- a/apps/files/src/actions/deleteAction.ts +++ b/apps/files/src/actions/deleteAction.ts @@ -140,14 +140,15 @@ export const action = new FileAction({ .every(permission => (permission & Permission.DELETE) !== 0) }, - async exec(node: Node) { + async exec(node: Node, view: View, dir: string) { try { await axios.delete(node.encodedSource) // Let's delete even if it's moved to the trashbin // since it has been removed from the current view - // and changing the view will trigger a reload anyway. + // and changing the view will trigger a reload anyway. emit('files:node:deleted', node) + return true } catch (error) { logger.error('Error while deleting a file', { error, source: node.source, node }) diff --git a/apps/files/src/store/paths.ts b/apps/files/src/store/paths.ts index 49b0ec9495b63..15d16b1760b52 100644 --- a/apps/files/src/store/paths.ts +++ b/apps/files/src/store/paths.ts @@ -29,7 +29,7 @@ import logger from '../logger' import { useFilesStore } from './files' export const usePathsStore = function(...args) { - const files = useFilesStore() + const files = useFilesStore(...args) const store = defineStore('paths', { state: () => ({ diff --git a/apps/files/src/views/FilesList.vue b/apps/files/src/views/FilesList.vue index bd42e80c3a70e..9c73947679324 100644 --- a/apps/files/src/views/FilesList.vue +++ b/apps/files/src/views/FilesList.vue @@ -240,6 +240,14 @@ export default defineComponent({ return (this.$route?.query?.dir?.toString() || '/').replace(/^(.+)\/$/, '$1') }, + /** + * The current file id + */ + fileId(): number | null { + const number = Number.parseInt(this.$route?.params.fileid ?? '') + return Number.isNaN(number) ? null : number + }, + /** * The current folder. */ @@ -453,6 +461,8 @@ export default defineComponent({ mounted() { this.fetchContent() + + subscribe('files:node:deleted', this.onNodeDeleted) subscribe('files:node:updated', this.onUpdatedNode) subscribe('nextcloud:unified-search.search', this.onSearch) subscribe('nextcloud:unified-search.reset', this.onSearch) @@ -462,6 +472,7 @@ export default defineComponent({ }, unmounted() { + unsubscribe('files:node:deleted', this.onNodeDeleted) unsubscribe('files:node:updated', this.onUpdatedNode) unsubscribe('nextcloud:unified-search.search', this.onSearch) unsubscribe('nextcloud:unified-search.reset', this.onSearch) @@ -535,6 +546,31 @@ export default defineComponent({ return this.filesStore.getNode(fileId) }, + /** + * Handle the node deleted event to reset open file + * @param node The deleted node + */ + onNodeDeleted(node: Node) { + if (node.fileid && node.fileid === this.fileId) { + if (node.fileid === this.currentFolder?.fileid) { + // Handle the edge case that the current directory is deleted + // in this case we neeed to keept the current view but move to the parent directory + window.OCP.Files.Router.goToRoute( + null, + { view: this.$route.params.view }, + { dir: this.currentFolder?.dirname ?? '/' }, + ) + } else { + // If the currently active file is deleted we need to remove the fileid and possible the `openfile` query + window.OCP.Files.Router.goToRoute( + null, + { ...this.$route.params, fileid: undefined }, + { ...this.$route.query, openfile: undefined }, + ) + } + } + }, + /** * The upload manager have finished handling the queue * @param {Upload} upload the uploaded data diff --git a/apps/files/src/views/Sidebar.vue b/apps/files/src/views/Sidebar.vue index e174dee7756fd..16c7fed24f504 100644 --- a/apps/files/src/views/Sidebar.vue +++ b/apps/files/src/views/Sidebar.vue @@ -23,6 +23,7 @@