// Research Management JavaScript let currentProjects = []; let currentFilter = 'all'; let currentProjectDetail = null; // 检查登录状态 async function checkLogin() { try { const response = await window.DAELAPI.auth.checkAuth(); if (!response.authenticated) { window.location.href = 'login.html'; return false; } return true; } catch (error) { window.location.href = 'login.html'; return false; } } // 加载项目列表 async function loadProjects() { try { const response = await window.DAELAPI.research.getProjects(); currentProjects = response.projects; displayProjects(currentProjects); } catch (error) { console.error('Failed to load projects:', error); document.getElementById('projects-list').innerHTML = '

加载失败

'; } } // 显示项目列表 function displayProjects(projects) { const container = document.getElementById('projects-list'); // 根据筛选器过滤 let filteredProjects = projects; if (currentFilter !== 'all') { filteredProjects = projects.filter(p => p.status === currentFilter); } if (filteredProjects.length === 0) { container.innerHTML = '

暂无项目

'; return; } container.innerHTML = filteredProjects.map(project => { const startDate = project.start_date ? new Date(project.start_date).toLocaleDateString('zh-CN') : '未设置'; const endDate = project.end_date ? new Date(project.end_date).toLocaleDateString('zh-CN') : '未设置'; const isOwner = project.owner_id === (window.currentUser?.id); return `

${project.title}

${getStatusText(project.status)}

${project.description || ''}

📅 ${startDate} - ${endDate} 👤 ${project.owner_name || ''} 📊 进度: ${project.progress}%
${project.tags && project.tags.length > 0 ? `
${project.tags.map(tag => `${tag}`).join('')}
` : ''}
${isOwner ? ` ` : ''}
`; }).join(''); } // 状态颜色 function getStatusColor(status) { const colors = { 'active': 'bg-green-100 text-green-800', 'completed': 'bg-gray-100 text-gray-800', 'paused': 'bg-yellow-100 text-yellow-800', 'cancelled': 'bg-red-100 text-red-800' }; return colors[status] || 'bg-gray-100 text-gray-800'; } // 状态文本 function getStatusText(status) { const texts = { 'active': '进行中', 'completed': '已完成', 'paused': '已暂停', 'cancelled': '已取消' }; return texts[status] || status; } // 显示项目表单 function showProjectForm(projectId = null) { const modal = document.getElementById('project-modal'); const form = document.getElementById('project-form'); const title = document.getElementById('project-modal-title'); if (projectId) { const project = currentProjects.find(p => p.id === projectId); if (project) { title.textContent = '编辑项目'; document.getElementById('project-id').value = project.id; document.getElementById('project-title').value = project.title; document.getElementById('project-description').value = project.description || ''; document.getElementById('project-start-date').value = project.start_date || ''; document.getElementById('project-end-date').value = project.end_date || ''; document.getElementById('project-status').value = project.status; document.getElementById('project-progress').value = project.progress; document.getElementById('project-tags').value = project.tags ? project.tags.join(', ') : ''; } } else { title.textContent = '新建项目'; form.reset(); document.getElementById('project-id').value = ''; document.getElementById('project-progress').value = 0; } modal.classList.remove('hidden'); } // 关闭项目表单 function closeProjectForm() { document.getElementById('project-modal').classList.add('hidden'); } // 保存项目 async function saveProject(event) { event.preventDefault(); const projectId = document.getElementById('project-id').value; const tagsInput = document.getElementById('project-tags').value; const tags = tagsInput ? tagsInput.split(',').map(t => t.trim()).filter(t => t) : []; const projectData = { title: document.getElementById('project-title').value, description: document.getElementById('project-description').value, start_date: document.getElementById('project-start-date').value || null, end_date: document.getElementById('project-end-date').value || null, status: document.getElementById('project-status').value, progress: parseInt(document.getElementById('project-progress').value) || 0, tags: tags }; try { if (projectId) { await window.DAELAPI.research.updateProject(projectId, projectData); } else { await window.DAELAPI.research.createProject(projectData); } closeProjectForm(); loadProjects(); } catch (error) { alert('保存失败: ' + error.message); } } // 查看项目详情 async function viewProject(projectId) { try { const response = await window.DAELAPI.research.getProject(projectId); currentProjectDetail = response.project; displayProjectDetail(currentProjectDetail); } catch (error) { alert('加载失败: ' + error.message); } } // 显示项目详情 function displayProjectDetail(project) { const modal = document.getElementById('project-detail-modal'); const container = document.getElementById('project-detail-content'); const isOwner = project.owner_id === (window.currentUser?.id); container.innerHTML = `

${project.title}

${getStatusText(project.status)} 进度: ${project.progress}%
${project.description ? `

项目描述

${project.description}

` : ''}
开始日期: ${project.start_date ? new Date(project.start_date).toLocaleDateString('zh-CN') : '未设置'}
结束日期: ${project.end_date ? new Date(project.end_date).toLocaleDateString('zh-CN') : '未设置'}
负责人: ${project.owner_name || ''}
${project.tags && project.tags.length > 0 ? `
标签:
${project.tags.map(tag => `${tag}`).join('')}
` : ''}
${isOwner ? ` ` : ''}
${project.notes && project.notes.length > 0 ? project.notes.map(note => `
${note.title}
${isOwner && note.author_id === window.currentUser?.id ? `
` : ''}

${note.content.substring(0, 200)}${note.content.length > 200 ? '...' : ''}

${note.author_name} · ${new Date(note.created_at).toLocaleDateString('zh-CN')}
`).join('') : '

暂无笔记

' }
${isOwner ? `
` : ''} `; // 初始化标签页切换 initDetailTabs(); modal.classList.remove('hidden'); } // 初始化详情页标签 function initDetailTabs() { document.querySelectorAll('#project-detail-modal .tab-btn').forEach(btn => { btn.addEventListener('click', () => { const tabName = btn.dataset.tab; // 更新按钮样式 document.querySelectorAll('#project-detail-modal .tab-btn').forEach(b => { b.classList.remove('active', 'border-black', 'text-black'); b.classList.add('text-gray-500'); }); btn.classList.add('active', 'border-black', 'text-black'); btn.classList.remove('text-gray-500'); // 更新内容 document.querySelectorAll('#project-detail-modal .tab-content').forEach(content => { content.classList.add('hidden'); }); document.getElementById(`tab-content-${tabName}`).classList.remove('hidden'); }); }); } // 关闭项目详情 function closeProjectDetail() { document.getElementById('project-detail-modal').classList.add('hidden'); currentProjectDetail = null; } // 编辑项目 function editProject(projectId) { closeProjectDetail(); showProjectForm(projectId); } // 删除项目 async function deleteProject(projectId) { if (!confirm('确定要删除这个项目吗?所有相关的笔记、任务和文件也将被删除。')) return; try { await window.DAELAPI.research.deleteProject(projectId); closeProjectDetail(); loadProjects(); } catch (error) { alert('删除失败: ' + error.message); } } // 笔记管理 function showNoteForm(noteId = null) { // 简化版:使用prompt创建笔记 const title = prompt('笔记标题:'); if (!title) return; const content = prompt('笔记内容:'); if (!content) return; createNote(title, content); } async function createNote(title, content) { try { await window.DAELAPI.research.createNote(currentProjectDetail.id, { title: title, content: content, note_type: 'note' }); viewProject(currentProjectDetail.id); // 刷新详情 } catch (error) { alert('创建失败: ' + error.message); } } async function deleteNote(noteId) { if (!confirm('确定要删除这条笔记吗?')) return; try { await window.DAELAPI.research.deleteNote(noteId); viewProject(currentProjectDetail.id); // 刷新详情 } catch (error) { alert('删除失败: ' + error.message); } } // 任务管理 function showTaskForm() { const title = prompt('任务标题:'); if (!title) return; const description = prompt('任务描述:'); const dueDate = prompt('截止日期 (YYYY-MM-DD):'); createTask(title, description, dueDate); } async function createTask(title, description, dueDate) { try { await window.DAELAPI.research.createTask(currentProjectDetail.id, { title: title, description: description || '', due_date: dueDate || null, status: 'todo', priority: 'medium' }); viewProject(currentProjectDetail.id); // 刷新详情 } catch (error) { alert('创建失败: ' + error.message); } } async function toggleTask(taskId, completed) { try { await window.DAELAPI.research.updateTask(taskId, { status: completed ? 'completed' : 'todo' }); viewProject(currentProjectDetail.id); // 刷新详情 } catch (error) { alert('更新失败: ' + error.message); } } async function deleteTask(taskId) { if (!confirm('确定要删除这个任务吗?')) return; try { await window.DAELAPI.research.deleteTask(taskId); viewProject(currentProjectDetail.id); // 刷新详情 } catch (error) { alert('删除失败: ' + error.message); } } // 文件管理 function showFileUpload() { const input = document.createElement('input'); input.type = 'file'; input.multiple = false; input.onchange = async (e) => { const file = e.target.files[0]; if (!file) return; try { await window.DAELAPI.research.uploadResearchFile(currentProjectDetail.id, file, file.name); viewProject(currentProjectDetail.id); // 刷新详情 } catch (error) { alert('上传失败: ' + error.message); } }; input.click(); } async function deleteFile(projectId, fileId) { if (!confirm('确定要删除这个文件吗?')) return; try { await window.DAELAPI.research.deleteResearchFile(projectId, fileId); viewProject(projectId); // 刷新详情 } catch (error) { alert('删除失败: ' + error.message); } } // 优先级颜色 function getPriorityColor(priority) { const colors = { 'high': 'bg-red-100 text-red-800', 'medium': 'bg-yellow-100 text-yellow-800', 'low': 'bg-blue-100 text-blue-800' }; return colors[priority] || 'bg-gray-100 text-gray-800'; } // 优先级文本 function getPriorityText(priority) { const texts = { 'high': '高', 'medium': '中', 'low': '低' }; return texts[priority] || priority; } // 筛选器切换 document.querySelectorAll('.filter-tab').forEach(tab => { tab.addEventListener('click', () => { document.querySelectorAll('.filter-tab').forEach(t => { t.classList.remove('active', 'border-black', 'text-black'); t.classList.add('text-gray-500'); }); tab.classList.add('active', 'border-black', 'text-black'); tab.classList.remove('text-gray-500'); currentFilter = tab.dataset.filter; displayProjects(currentProjects); }); }); // 初始化 document.addEventListener('DOMContentLoaded', async () => { if (await checkLogin()) { // 获取当前用户信息 try { const authResponse = await window.DAELAPI.auth.checkAuth(); window.currentUser = authResponse.user; } catch (error) { console.error('Failed to get user info:', error); } loadProjects(); // 退出按钮 document.getElementById('logout-btn').addEventListener('click', async () => { await logout(); }); } });