diff --git a/frontend/components/DocumentUploadModal.vue b/frontend/components/DocumentUploadModal.vue index 482db80..a299db6 100644 --- a/frontend/components/DocumentUploadModal.vue +++ b/frontend/components/DocumentUploadModal.vue @@ -151,6 +151,8 @@ const fileNames = computed(() => { :disabled="uploadInProgress || selectedFiles.length === 0" >Hochladen + + {{props.fileData}} diff --git a/frontend/pages/files/index.vue b/frontend/pages/files/index.vue index 963e097..c193cd6 100644 --- a/frontend/pages/files/index.vue +++ b/frontend/pages/files/index.vue @@ -28,7 +28,9 @@ const displayModes = [ ] const createFolderModalOpen = ref(false) -const createFolderData = ref({name: '', standardFiletype: null, standardFiletypeIsOptional: true}) +const initialCreateFolderData = { name: '', standardFiletype: null, standardFiletypeIsOptional: true } +const createFolderData = ref({ ...initialCreateFolderData }) + const renameModalOpen = ref(false) const renameData = ref({id: null, name: '', type: ''}) @@ -77,16 +79,14 @@ let dragCounter = 0 const handleGlobalDragEnter = (e) => { dragCounter++ - - // 1. Abbrechen, wenn wir gerade intern Ordner/Dateien verschieben if (draggedItem.value) return - - // 2. Prüfen ob Files von außen kommen if (e.dataTransfer && e.dataTransfer.types && e.dataTransfer.types.includes('Files')) { - // Modal öffnen, falls noch nicht offen (optionaler Check, useModal handhabt das meist selbst) - // Wir übergeben den aktuellen Ordner modal.open(DocumentUploadModal, { - fileData: {folder: currentFolder.value?.id, typeEnabled: true}, + fileData: { + folder: currentFolder.value?.id, + type: currentFolder?.value?.standardFiletype, + typeEnabled: currentFolder?.value?.standardFiletype ? currentFolder?.value?.standardFiletypeIsOptional : true + }, onUploadFinished: () => { setupPage() dragCounter = 0 @@ -101,7 +101,6 @@ const handleGlobalDragLeave = (e) => { const handleGlobalDrop = (e) => { dragCounter = 0 - // Verhindert, dass der Browser die Datei öffnet, falls man neben das Modal droppt e.preventDefault() } @@ -111,8 +110,6 @@ const handleGlobalDragOver = (e) => { onMounted(() => { setupPage() - - // Globale Listener registrieren window.addEventListener('dragenter', handleGlobalDragEnter) window.addEventListener('dragleave', handleGlobalDragLeave) window.addEventListener('dragover', handleGlobalDragOver) @@ -120,7 +117,6 @@ onMounted(() => { }) onUnmounted(() => { - // Aufräumen window.removeEventListener('dragenter', handleGlobalDragEnter) window.removeEventListener('dragleave', handleGlobalDragLeave) window.removeEventListener('dragover', handleGlobalDragOver) @@ -146,7 +142,6 @@ const handleDragStart = (entry) => { } const handleDrop = async (targetFolderId) => { - // targetFolderId kann null sein (Root) if (!draggedItem.value) return if (draggedItem.value.id === targetFolderId) return @@ -189,13 +184,11 @@ const breadcrumbLinks = computed(() => { // --- Data Mapping --- const renderedFileList = computed(() => { - // 1. Aktuelle Ordner filtern const folderList = folders.value .filter(i => currentFolder.value ? i.parent === currentFolder.value.id : !i.parent) .map(i => ({...i, label: i.name, type: "folder"})) .sort((a, b) => a.label.localeCompare(b.label)) - // 2. Aktuelle Dateien filtern const fileList = documents.value .filter(i => currentFolder.value ? i.folder === currentFolder.value.id : !i.folder) .map(i => ({...i, label: i.path.split("/").pop(), type: "file"})) @@ -206,7 +199,6 @@ const renderedFileList = computed(() => { combined = useSearch(debouncedSearch.value, combined) } - // 3. "Nach oben" (..) einfügen, wenn wir nicht im Root sind und nicht suchen if (currentFolder.value && !debouncedSearch.value) { combined.unshift({ id: 'go-up', @@ -215,18 +207,46 @@ const renderedFileList = computed(() => { parentId: currentFolder.value.parent || null }) } - return combined }) +// --- Logic: Mandatory File Types --- +// Prüft, ob der aktuelle Ordner strikte Vorgaben macht +const isParentTypeMandatory = computed(() => { + return currentFolder.value + && currentFolder.value.standardFiletype + && !currentFolder.value.standardFiletypeIsOptional +}) + +// Überwacht das Öffnen des "Ordner erstellen" Modals, um Vorgaben zu setzen +watch(createFolderModalOpen, (isOpen) => { + if (isOpen) { + if (isParentTypeMandatory.value) { + // Wenn Elternordner strikt ist: Werte übernehmen und erzwingen + createFolderData.value = { + name: '', + standardFiletype: currentFolder.value.standardFiletype, + standardFiletypeIsOptional: false // Muss auch false sein, damit Kette weitergeht + } + } else { + // Reset auf Standardwerte + createFolderData.value = { ...initialCreateFolderData } + } + } +}) + + // --- Actions --- const createFolder = async () => { await useEntities("folders").create({ parent: currentFolder.value?.id, - name: createFolderData.value.name + name: createFolderData.value.name, + standardFiletype: createFolderData.value.standardFiletype, + standardFiletypeIsOptional: createFolderData.value.standardFiletypeIsOptional }) createFolderModalOpen.value = false - createFolderData.value = {name: ''} + // Reset passiert beim nächsten Öffnen durch den Watcher, aber sicherheitshalber hier clean + createFolderData.value = { ...initialCreateFolderData } setupPage() } @@ -288,15 +308,12 @@ const syncdokubox = async () => { isSyncing.value = true try { await $api('/api/functions/services/syncdokubox', {method: 'POST'}) - toast.add({ title: 'Erfolg', description: 'Dokubox wurde synchronisiert.', icon: 'i-heroicons-check-circle', color: 'green' }) - - // Liste neu laden await setupPage() } catch (error) { console.error(error) @@ -310,7 +327,6 @@ const syncdokubox = async () => { isSyncing.value = false } } - @@ -335,8 +350,7 @@ const syncdokubox = async () => {