const FeaturesPage = { async render() { return '
'; }, async mount() { document.getElementById('page-title').textContent = '更新内容'; document.getElementById('page-actions').innerHTML = Auth.isOwner() ? '' : ''; await this.load(); }, async load() { const ct = document.getElementById('page-content'); try { const items = await API.get('/features'); ct.innerHTML = items.length === 0 ? '

暂无更新项目

' : items.map(i => this.renderItem(i)).join(''); for (const i of items) if (Auth.logged() || Auth.logged()) this.bindVote(i); } catch (e) { ct.innerHTML = `
${e.message}
`; } }, renderItem(i) { const statusColor = i.status === 'done' ? 'var(--s)' : i.status === 'planned' ? 'var(--p)' : 'var(--g5)'; const statusLabel = i.status === 'done' ? '已完成' : i.status === 'planned' ? '计划中' : '待定'; return `
${U.esc(i.title)}
● ${statusLabel} ${Auth.isOwner() ? `` : ''}
${i.description ? `

${U.esc(i.description)}

` : ''}
${i.my_vote ? '已投票 (点击取消)' : '点击投票'}
`; }, bindVote(i) { const card = document.getElementById('feat-'+i.id); if (!card) return; card.querySelector('.feat-vote').addEventListener('click', async () => { try { await API.post(`/features/${i.id}/vote`); this.load(); } catch (ex) { alert(ex.message); } }); }, showCreate() { U.modal('添加项目', `
`); document.getElementById('feat-form').onsubmit = async e => { e.preventDefault(); try { await API.post('/features', { title: document.getElementById('ft-title').value, description: document.getElementById('ft-desc').value }); App.closeModal(); this.load(); } catch(ex){alert(ex.message);} }; }, async showEdit(id, title, desc, status) { U.modal('编辑', `
`); document.getElementById('fe-edit').onsubmit = async e => { e.preventDefault(); try { await API.put('/features/'+id, { title: document.getElementById('fe-title').value, description: document.getElementById('fe-desc').value, status: document.getElementById('fe-status').value }); App.closeModal(); this.load(); } catch(ex){alert(ex.message);} }; }, async del(id) { if (!await U.confirm('确认删除?')) return; try { await API.req('DELETE', '/features/'+id); App.closeModal(); this.load(); } catch(ex){alert(ex.message);} } };