diff --git a/frontend/src/views/FilesView.vue b/frontend/src/views/FilesView.vue
index ef22f1e..d31bb1f 100644
--- a/frontend/src/views/FilesView.vue
+++ b/frontend/src/views/FilesView.vue
@@ -187,13 +187,26 @@
-
-
- {{ perm.username }}
-
-
-
-
+
+
+
+ {{ perm.username }}
+
+
+
+
+
+
+
+ {{ perm.username }}
+
+
+
+
+
+
@@ -295,6 +308,9 @@ const shareUserQuery = ref('')
const selectedShareUser = ref(null)
const shareUserPermission = ref('read')
const shareUserReshare = ref(false)
+const editingPermId = ref(null)
+const editPermValue = ref('read')
+const editPermReshare = ref(false)
const userSearchResults = ref([])
const userPermOptions = [{ label: 'Lesen', value: 'read' }, { label: 'Schreiben', value: 'write' }, { label: 'Admin', value: 'admin' }]
const linkPermOptions = [
@@ -684,6 +700,34 @@ async function removeUserShare(permId) {
}
}
+function startEditPerm(perm) {
+ editingPermId.value = perm.id
+ editPermValue.value = perm.permission
+ editPermReshare.value = !!perm.can_reshare
+}
+
+function cancelEditPerm() {
+ editingPermId.value = null
+}
+
+async function saveEditPerm(perm) {
+ if (!shareFile.value) return
+ try {
+ await apiClient.post(`/files/${shareFile.value.id}/permissions`, {
+ user_id: perm.user_id,
+ permission: editPermValue.value,
+ can_reshare: editPermReshare.value,
+ })
+ const res = await apiClient.get(`/files/${shareFile.value.id}/permissions`)
+ filePermissions.value = res.data
+ editingPermId.value = null
+ toast.add({ severity: 'success', summary: 'Berechtigung aktualisiert', life: 2500 })
+ await filesStore.loadFiles(currentParentId())
+ } catch (err) {
+ toast.add({ severity: 'error', summary: 'Fehler', detail: err.response?.data?.error || err.message, life: 5000 })
+ }
+}
+
async function createShare() {
console.log('createShare called, shareFile:', shareFile.value?.id, 'permission:', shareLinkPermission.value)
if (!shareFile.value) {
@@ -886,7 +930,8 @@ onUnmounted(() => {
.user-result { padding: 0.5rem 0.75rem; cursor: pointer; display: flex; align-items: center; gap: 0.5rem; font-size: 0.875rem; }
.user-result:hover, .user-result.selected { background: var(--p-primary-50); }
.existing-shares { margin-top: 0.5rem; }
-.share-perm-item { display: flex; align-items: center; gap: 0.5rem; padding: 0.375rem 0; font-size: 0.875rem; }
+.share-perm-item { display: flex; align-items: center; gap: 0.5rem; padding: 0.375rem 0; font-size: 0.875rem; flex-wrap: wrap; }
+.share-perm-item.editing { background: var(--p-surface-50); padding: 0.5rem; border-radius: 4px; }
.share-link-item {
display: flex; justify-content: space-between; align-items: center;
padding: 0.5rem 0; border-bottom: 1px solid var(--p-surface-100);