feat: Papierkorb + Bestaetigungsdialoge bei allen Loeschaktionen
Papierkorb: - Dateien/Ordner werden beim Loeschen in den Papierkorb verschoben (Soft-Delete) statt sofort geloescht - Papierkorb-Seite in der Sidebar mit Tabelle aller geloeschten Elemente - Pro Element: Wiederherstellen (am Originalort) oder endgueltig loeschen - "Papierkorb leeren" Button loescht alles unwiderruflich - Backend: is_trashed, trashed_at, original_parent_id Felder im File-Model - Getrashte Dateien erscheinen nicht in der normalen Dateiliste Bestaetigungsdialoge (vorher fehlend): - Kontakte: "Moechtest du XY wirklich loeschen?" - Kalender Events: Bestaetigung vor dem Loeschen - Kalender: Bestaetigung vor dem Loeschen (mit Hinweis auf Events) - E-Mail Nachrichten: Bestaetigung mit Betreff-Vorschau - Share-Link Dateien: Bestaetigung beim Loeschen aus geteiltem Ordner - Admin SFTP-Backup-Ziele: Bestaetigung - Admin Email-Konten: Bestaetigung Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -73,7 +73,7 @@
|
||||
<Button v-if="!f.is_folder" icon="pi pi-download" text size="small"
|
||||
@click.stop="downloadFolderFile(f)" />
|
||||
<Button v-if="fileInfo.permission === 'write'" icon="pi pi-trash" text size="small"
|
||||
severity="danger" @click.stop="deleteFolderFile(f)" />
|
||||
severity="danger" @click.stop="confirmDeleteShareFile(f)" />
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="!folderFiles.length" class="empty-folder">
|
||||
@@ -111,6 +111,15 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Delete confirm for shared folder files -->
|
||||
<Dialog v-model:visible="showShareDeleteConfirm" header="Datei loeschen" modal :style="{ width: '400px' }">
|
||||
<p>Moechtest du <strong>{{ shareDeleteTarget?.name }}</strong> wirklich loeschen?</p>
|
||||
<template #footer>
|
||||
<Button label="Abbrechen" text @click="showShareDeleteConfirm = false" />
|
||||
<Button label="Loeschen" severity="danger" @click="doDeleteShareFile" />
|
||||
</template>
|
||||
</Dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -122,6 +131,7 @@ import Button from 'primevue/button'
|
||||
import Password from 'primevue/password'
|
||||
import Message from 'primevue/message'
|
||||
import ProgressBar from 'primevue/progressbar'
|
||||
import Dialog from 'primevue/dialog'
|
||||
|
||||
const route = useRoute()
|
||||
const token = route.params.token
|
||||
@@ -139,6 +149,8 @@ const folderBreadcrumb = ref([])
|
||||
const currentParentId = ref(null)
|
||||
const loadingFiles = ref(false)
|
||||
|
||||
const showShareDeleteConfirm = ref(false)
|
||||
const shareDeleteTarget = ref(null)
|
||||
const isDragging = ref(false)
|
||||
const uploading = ref(false)
|
||||
const uploadPercent = ref(0)
|
||||
@@ -243,10 +255,17 @@ function downloadFolderFile(file) {
|
||||
window.location.href = url
|
||||
}
|
||||
|
||||
async function deleteFolderFile(file) {
|
||||
function confirmDeleteShareFile(file) {
|
||||
shareDeleteTarget.value = file
|
||||
showShareDeleteConfirm.value = true
|
||||
}
|
||||
|
||||
async function doDeleteShareFile() {
|
||||
if (!shareDeleteTarget.value) return
|
||||
try {
|
||||
await axios.delete(`/api/share/${token}/files/${file.id}`, { headers: getAuthHeaders() })
|
||||
folderFiles.value = folderFiles.value.filter(f => f.id !== file.id)
|
||||
await axios.delete(`/api/share/${token}/files/${shareDeleteTarget.value.id}`, { headers: getAuthHeaders() })
|
||||
folderFiles.value = folderFiles.value.filter(f => f.id !== shareDeleteTarget.value.id)
|
||||
showShareDeleteConfirm.value = false
|
||||
} catch (err) {
|
||||
alert(err.response?.data?.error || 'Fehler beim Loeschen')
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user