// --- Documentación de Proyecto --- let currentDocProjectId = null; let currentDocProjectName = ''; let currentDocFolderId = null; let currentDocPath = []; async function openProjectDocs(projectId, projectName) { currentDocProjectId = projectId; currentDocProjectName = projectName; currentDocFolderId = null; currentDocPath = []; document.getElementById('board').style.display = 'none'; document.getElementById('btn-add-task').style.display = 'none'; document.getElementById('admin-board').style.display = 'none'; document.getElementById('docs-board').style.display = 'block'; document.getElementById('current-view-title').innerText = `Documentación: ${projectName}`; await loadFavorites(); await loadDocs(); } async function loadDocs() { let data; if (currentDocFolderId === null) { data = await fetchAPI(`projects/${currentDocProjectId}/docs`); } else { const folder = await fetchAPI(`docs/folders/${currentDocFolderId}`); data = { folders: folder.subfolders || [], files: folder.files || [] }; } renderDocs(data); renderDocBreadcrumb(); } function renderDocBreadcrumb() { const breadcrumb = document.getElementById('docs-breadcrumb'); let html = `🏠 Raíz`; currentDocPath.forEach((step, index) => { html += ` > ${step.name}`; }); breadcrumb.innerHTML = html; } function openDocFolder(folderId, folderName) { if (folderId === null) { currentDocFolderId = null; currentDocPath = []; } else { currentDocFolderId = folderId; currentDocPath.push({ id: folderId, name: folderName }); } loadDocs(); } function goDocBackTo(index) { currentDocPath = currentDocPath.slice(0, index + 1); const lastStep = currentDocPath[currentDocPath.length - 1]; currentDocFolderId = lastStep ? lastStep.id : null; loadDocs(); } function renderDocs(data) { const list = document.getElementById('docs-list'); list.innerHTML = ''; if (currentDocFolderId !== null) { const backDiv = document.createElement('div'); backDiv.className = 'card'; backDiv.style.padding = '10px'; backDiv.style.cursor = 'pointer'; backDiv.style.display = 'flex'; backDiv.style.background = 'rgba(255,255,255,0.02)'; backDiv.innerHTML = `⬆️ .. (Subir un nivel)`; backDiv.onclick = () => { currentDocPath.pop(); const lastStep = currentDocPath[currentDocPath.length - 1]; currentDocFolderId = lastStep ? lastStep.id : null; loadDocs(); }; list.appendChild(backDiv); } data.folders.forEach(f => { const div = document.createElement('div'); div.className = 'card'; div.style.padding = '10px'; div.style.display = 'flex'; div.style.justifyContent = 'space-between'; div.style.alignItems = 'center'; div.innerHTML = `
📁 ${f.name}
`; list.appendChild(div); }); data.files.forEach(f => { const div = document.createElement('div'); div.className = 'card'; div.style.padding = '10px'; div.style.display = 'flex'; div.style.justifyContent = 'space-between'; div.style.alignItems = 'center'; const starColor = f.is_favorite ? '#ffc107' : 'rgba(255,255,255,0.3)'; div.innerHTML = `
${f.is_favorite ? '⭐' : '☆'} 📄 ${f.filename}
Descargar
`; list.appendChild(div); }); if (data.folders.length === 0 && data.files.length === 0) { list.innerHTML += `
La carpeta está vacía.
`; } } async function createDocFolder(e) { e.preventDefault(); const name = document.getElementById('docFolderName').value; if (!name) return; await fetchAPI('docs/folders', 'POST', { project_id: currentDocProjectId, parent_id: currentDocFolderId, name: name }); closeModal('docFolderModal'); document.getElementById('docFolderName').value = ''; loadDocs(); } async function deleteDocFolder(id) { if (!confirm('¿Seguro que quieres borrar esta carpeta y todo su contenido?')) return; await fetchAPI(`docs/folders/${id}`, 'DELETE'); loadDocs(); } async function uploadDocFile(e) { e.preventDefault(); const fileInput = document.getElementById('newDocFile'); const folderInput = document.getElementById('newDocFolder'); let inputToUse = null; if (currentDocUploadMode === 'file') inputToUse = fileInput; else if (currentDocUploadMode === 'folder') inputToUse = folderInput; if (!inputToUse || !inputToUse.files || inputToUse.files.length === 0) return; const formData = new FormData(); for (let i = 0; i < inputToUse.files.length; i++) { formData.append('files', inputToUse.files[i]); } let url = `/api/docs/files?project_id=${currentDocProjectId}`; if (currentDocFolderId) { url += `&folder_id=${currentDocFolderId}`; } try { const res = await fetch(url, { method: 'POST', body: formData }); if (res.ok) { closeModal('docFileModal'); fileInput.value = ''; folderInput.value = ''; updateDocFileCount(null); loadDocs(); } } catch (e) { alert('Error al subir archivos'); } } let currentDocUploadMode = null; function updateDocFileCount(mode) { currentDocUploadMode = mode; const fileInput = document.getElementById('newDocFile'); const folderInput = document.getElementById('newDocFolder'); const textDiv = document.getElementById('docFileSelectionText'); if (mode === 'file' && fileInput.files.length > 0) { folderInput.value = ''; textDiv.innerText = `${fileInput.files.length} archivo(s) seleccionado(s)`; } else if (mode === 'folder' && folderInput.files.length > 0) { fileInput.value = ''; textDiv.innerText = `Carpeta seleccionada con ${folderInput.files.length} archivo(s)`; } else { textDiv.innerText = 'Ningún archivo seleccionado'; } } async function deleteDocFile(id) { if (!confirm('¿Seguro que quieres borrar este archivo?')) return; await fetchAPI(`docs/files/${id}`, 'DELETE'); loadDocs(); loadFavorites(); } async function toggleFavoriteDoc(id, isFav) { await fetchAPI(`docs/files/${id}/favorite?favorite=${isFav}`, 'PUT'); loadDocs(); loadFavorites(); } async function loadFavorites() { if (!currentDocProjectId) return; const favs = await fetchAPI(`projects/${currentDocProjectId}/favorites`); const dropdown = document.getElementById('fav-dropdown'); if (favs.length === 0) { dropdown.innerHTML = `
No tienes favoritos en este proyecto.
`; return; } let html = ''; favs.forEach(f => { html += `
${f.filename}
`; }); dropdown.innerHTML = html; } function openDocLocal(filePath) { window.open(filePath, '_blank'); } // Drag and drop logic document.addEventListener('DOMContentLoaded', () => { const docsBoard = document.getElementById('docs-board'); const dragOverlay = document.getElementById('docs-drag-overlay'); let dragCounter = 0; docsBoard.addEventListener('dragenter', (e) => { e.preventDefault(); dragCounter++; dragOverlay.style.display = 'flex'; }); docsBoard.addEventListener('dragleave', (e) => { e.preventDefault(); dragCounter--; if (dragCounter === 0) { dragOverlay.style.display = 'none'; } }); docsBoard.addEventListener('dragover', (e) => { e.preventDefault(); }); docsBoard.addEventListener('drop', async (e) => { e.preventDefault(); dragCounter = 0; dragOverlay.style.display = 'none'; if (currentDocProjectId === null) return; const files = e.dataTransfer.files; if (!files || files.length === 0) return; const formData = new FormData(); for (let i = 0; i < files.length; i++) { formData.append('files', files[i]); } let url = `/api/docs/files?project_id=${currentDocProjectId}`; if (currentDocFolderId) { url += `&folder_id=${currentDocFolderId}`; } try { const res = await fetch(url, { method: 'POST', body: formData }); if (res.ok) { loadDocs(); } else { alert('Error al subir archivos'); } } catch (error) { alert('Error al subir archivos'); } }); });