fix(files): Update current fileid in route if that node was deleted

We do not change the view to the trash bin but stay in the current view,
so we need to update the current fileid on the route if that was deleted.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
This commit is contained in:
Ferdinand Thiessen 2024-04-17 17:03:44 +02:00
parent 3c74559e4c
commit 3808a5b056
No known key found for this signature in database
GPG key ID: 45FAE7268762B400
3 changed files with 40 additions and 3 deletions

View file

@ -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 })

View file

@ -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: () => ({

View file

@ -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