const NotificationsPage = { async render() { return '
'; }, async mount() { document.getElementById('page-title').textContent = '通知配置'; document.getElementById('page-actions').innerHTML = ''; await this.load(); }, async load() { const ct = document.getElementById('page-content'); try { const cfgs = await API.get('/notifications'); const typeLabel = { webhook:'Discord', email:'邮件通知', generic:'通用Webhook' }; ct.innerHTML = cfgs.length ? cfgs.map(c => `
${U.esc(c.name)}${c.active?`启用`:`禁用`}
类型${typeLabel[c.type]||c.type}
${c.type!=='email' && c.webhook_url?`
地址${U.esc(c.webhook_url)}
`:''}
事件${EventsLabel(c.events)}
${c.type!=='email'?``:''}
`).join('') : '

暂无通知配置

'; } catch (e) { ct.innerHTML = `
${e.message}
`; } }, showCreate() { U.modal('添加通知', `
${EventOptions('all')}
`); bindEventToggles(); document.getElementById('nc-form').onsubmit = async e => { e.preventDefault(); const type = document.getElementById('nc-type').value; try { await API.post('/notifications',{name:document.getElementById('nc-name').value, type, webhook_url:document.getElementById('nc-url').value, events:document.getElementById('nc-events').value}); App.closeModal(); this.load(); } catch(ex){alert(ex.message);} }; }, toggleFields() { const type = document.getElementById('nc-type')?.value || document.getElementById('ne-type')?.value; const urlGroup = document.querySelector('#nc-url-group') || document.querySelector('#ne-url-group'); if (urlGroup) urlGroup.style.display = type === 'email' ? 'none' : ''; }, showEdit(id, name, type, url, events, active) { U.modal('编辑通知', `
${EventOptions(events)}
`); bindEventToggles(); document.getElementById('ne-form').onsubmit = async e => { e.preventDefault(); const newType = document.getElementById('ne-type').value; try { await API.put(`/notifications/${id}`,{name:document.getElementById('ne-name').value, webhook_url:document.getElementById('ne-url')?.value, events:document.getElementById('ne-events').value, active:document.getElementById('ne-active').value==='1', type:newType}); App.closeModal(); this.load(); } catch(ex){alert(ex.message);} }; }, async test(id) { try { alert((await API.post(`/notifications/${id}/test`)).message); } catch(ex){alert(ex.message);} }, async del(id) { if(await U.confirm('确认删除?')){ try { await API.req('DELETE',`/notifications/${id}`); this.load(); } catch(ex){alert(ex.message);} } } }; function EventOptions(current) { return ['all','ticket_created','ticket_claimed','ticket_transferred','ticket_updated'].map(e=>``).join(''); } function EventsLabel(v) { return v==='all'?'全部事件':v.split(',').map(s=>s.trim()).map(EventsLabelSingle).join(', '); } function EventsLabelSingle(e) { return {all:'全部',ticket_created:'工单创建',ticket_claimed:'工单认领',ticket_transferred:'工单转交',ticket_updated:'工单更新'}[e]||e; } function bindEventToggles() { document.querySelectorAll('.ev-check').forEach(cb=>{ cb.onchange=()=>{ const all=document.querySelectorAll('.ev-check'); const v=Array.from(all).filter(c=>c.checked).map(c=>c.value).join(','); const hid=cb.closest('form').querySelector('input[type="hidden"]'); if(hid)hid.value=v; }; }); }