// --- 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}
`;
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 += `
`;
});
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');
}
});
});