fix: data-action delegation + convert onclick to event listeners, sidebar+logout+modals
This commit is contained in:
@@ -32,16 +32,16 @@ const PollsPage = {
|
||||
const opts = p.options || [];
|
||||
const timed = p.start_time || p.end_time;
|
||||
return `<div class="card" id="poll-${p.id}">
|
||||
<div class="card-h"><span>${U.esc(p.server_name)} — ${U.esc(p.title)}</span>
|
||||
<div class="card-h"><span>${U.esc(p.server_name)} �${U.esc(p.title)}</span>
|
||||
<span style="display:flex;gap:8px;align-items:center">
|
||||
${timed ? `<span class="ts tm">${p.start_time?'起: '+U.date(p.start_time):''} ${p.end_time?'至: '+U.date(p.end_time):''}</span>`:''}
|
||||
<span class="ts tm">${p.total||0} 票</span>
|
||||
${timed ? `<span class="ts tm">${p.start_time?'� '+U.date(p.start_time):''} ${p.end_time?'� '+U.date(p.end_time):''}</span>`:''}
|
||||
<span class="ts tm">${p.total||0} �/span>
|
||||
${Auth.isOwner() ? `<button class="btn btn-o btn-sm" onclick="PollsPage.showEdit(${p.id})"><i class="fas fa-edit"></i></button>` : ''}
|
||||
</span>
|
||||
</div>
|
||||
<div class="card-b">
|
||||
${p.description?`<p class="tm mb-4">${U.esc(p.description)}</p>`:''}
|
||||
${p.voted ? `<div class="alert alert-s"><i class="fas fa-check-circle"></i> 已投票</div>` : ''}
|
||||
${p.voted ? `<div class="alert alert-s"><i class="fas fa-check-circle"></i> 已投�/div>` : ''}
|
||||
<div style="display:flex;flex-direction:column;gap:8px">
|
||||
${opts.map((o,i) => {
|
||||
const v = p.voted ? 0 : (p.votes?.[i] || 0);
|
||||
@@ -51,7 +51,7 @@ const PollsPage = {
|
||||
${!p.voted ? `<div style="position:absolute;top:0;left:0;bottom:0;width:${pct}%;background:${my?'var(--pl)':'var(--g2)'};transition:width .3s;z-index:0"></div>` : ''}
|
||||
<div style="position:relative;z-index:1;display:flex;justify-content:space-between;align-items:center;padding:10px 14px;font-size:13px">
|
||||
<span>${my?'<i class="fas fa-check" style="color:var(--p)"></i> ':''}${U.esc(o)}</span>
|
||||
${!p.voted ? `<span class="fb">${v}票 ${pct}%</span>` : ''}
|
||||
${!p.voted ? `<span class="fb">${v}�${pct}%</span>` : ''}
|
||||
</div>
|
||||
</div>`;
|
||||
}).join('')}
|
||||
@@ -79,17 +79,17 @@ const PollsPage = {
|
||||
<div class="grid-2"><div class="form-group"><label>分组/å<C3A5>æœ<C3A6> *</label><select id="pl-gs"><option value="">请选择</option>${opts}</select></div>
|
||||
<div class="form-group"><label>æ ‡é¢˜ *</label><input id="pl-title" required></div></div>
|
||||
<div class="form-group"><label>æ<><C3A6>è¿°</label><textarea id="pl-desc" rows="2"></textarea></div>
|
||||
<div class="grid-2"><div class="form-group"><label>开始时间(可选)</label><input type="datetime-local" id="pl-start"></div>
|
||||
<div class="form-group"><label>结束时间(可选)</label><input type="datetime-local" id="pl-end"></div></div>
|
||||
<div class="form-group"><label>选项 (每行一个,至少2个) *</label><textarea id="pl-opts" rows="4" placeholder="选项A 选项B 选项C" required></textarea></div>
|
||||
<div class="modal-f"><button type="button" class="btn btn-o" onclick="App.closeModal()">取消</button><button type="submit" class="btn btn-p">创建</button></div>
|
||||
<div class="grid-2"><div class="form-group"><label>开始时é—?å<>¯é€?</label><input type="datetime-local" id="pl-start"></div>
|
||||
<div class="form-group"><label>结æ<EFBFBD>Ÿæ—¶é—´(å<>¯é€?</label><input type="datetime-local" id="pl-end"></div></div>
|
||||
<div class="form-group"><label>选项 (æ¯<C3A6>行一个,至少2ä¸? *</label><textarea id="pl-opts" rows="4" placeholder="选项A 选项B 选项C" required></textarea></div>
|
||||
<div class="modal-f"><button type="button" class="btn btn-o" data-action="App:closeModal">å<>–消</button><button type="submit" class="btn btn-p">创建</button></div>
|
||||
</form>
|
||||
`);
|
||||
document.getElementById('poll-form').onsubmit = async e => {
|
||||
e.preventDefault();
|
||||
const [group_name, server_name] = document.getElementById('pl-gs').value.split('::');
|
||||
const opts = document.getElementById('pl-opts').value.split('\n').map(s=>s.trim()).filter(s=>s);
|
||||
if (opts.length < 2) return alert('至少需要2个选项');
|
||||
if (opts.length < 2) return alert('至少需�个选项');
|
||||
try {
|
||||
await API.post('/polls', { title: document.getElementById('pl-title').value, description: document.getElementById('pl-desc').value, options: opts, group_name, server_name, start_time: document.getElementById('pl-start').value||null, end_time: document.getElementById('pl-end').value||null });
|
||||
App.closeModal(); this.load();
|
||||
@@ -107,7 +107,7 @@ const PollsPage = {
|
||||
<button class="btn btn-d btn-sm" onclick="PollsPage.delGroup(${g.id})"><i class="fas fa-trash"></i></button>
|
||||
</div>`).join('');
|
||||
U.modal('管ç<C2A1>†åˆ†ç»„', `
|
||||
<form id="gm-form"><div class="grid-2"><div class="form-group"><label>分组名</label><input id="gm-group" required></div><div class="form-group"><label>子服名</label><input id="gm-server" required></div></div>
|
||||
<form id="gm-form"><div class="grid-2"><div class="form-group"><label>分组å<EFBFBD>?/label><input id="gm-group" required></div><div class="form-group"><label>å<EFBFBD>æœ<EFBFBD>å<EFBFBD>?/label><input id="gm-server" required></div></div>
|
||||
<button type="submit" class="btn btn-p btn-sm mb-4"><i class="fas fa-plus"></i> æ·»åŠ </button></form>
|
||||
<div>${list||'<p class="tm">æš‚æ— </p>'}</div>
|
||||
`);
|
||||
@@ -124,10 +124,10 @@ const PollsPage = {
|
||||
document.getElementById('modal-title').textContent = '编辑投票';
|
||||
document.getElementById('modal-body').innerHTML = `
|
||||
<form id="pe-form">
|
||||
<div class="form-group"><label>状态</label><select id="pe-active"><option value="1" ${p.active?'selected':''}>启用</option><option value="0" ${!p.active?'selected':''}>关闭</option></select></div>
|
||||
<div class="form-group"><label>状æ€?/label><select id="pe-active"><option value="1" ${p.active?'selected':''}>å<EFBFBD>¯ç”¨</option><option value="0" ${!p.active?'selected':''}>å…³é—</option></select></div>
|
||||
<div class="form-group"><label>æ ‡é¢˜</label><input id="pe-title" value="${U.esc(p.title)}"></div>
|
||||
<div class="form-group"><label>选项 (每行一个)</label><textarea id="pe-opts" rows="4">${U.esc((JSON.parse(p.options||'[]')).join('\n'))}</textarea></div>
|
||||
<div class="modal-f"><button type="button" class="btn btn-o" onclick="App.closeModal()">取消</button><button type="button" class="btn btn-d" onclick="PollsPage.deletePoll(${id})"><i class="fas fa-trash"></i></button><button type="submit" class="btn btn-p">保存</button></div>
|
||||
<div class="form-group"><label>选项 (æ¯<C3A6>行一ä¸?</label><textarea id="pe-opts" rows="4">${U.esc((JSON.parse(p.options||'[]')).join('\n'))}</textarea></div>
|
||||
<div class="modal-f"><button type="button" class="btn btn-o" data-action="App:closeModal">å<>–消</button><button type="button" class="btn btn-d" onclick="PollsPage.deletePoll(${id})"><i class="fas fa-trash"></i></button><button type="submit" class="btn btn-p">ä¿<EFBFBD>å˜</button></div>
|
||||
</form>
|
||||
`;
|
||||
document.getElementById('modal-overlay').classList.remove('hidden');
|
||||
@@ -138,5 +138,5 @@ const PollsPage = {
|
||||
};
|
||||
},
|
||||
|
||||
async deletePoll(id) { if (!await U.confirm('确认删除?')) return; try { await API.req('DELETE', '/polls/'+id); App.closeModal(); this.load(); } catch(ex){alert(ex.message);} }
|
||||
async deletePoll(id) { if (!await U.confirm('ç¡®è®¤åˆ é™¤ï¼?)) return; try { await API.req('DELETE', '/polls/'+id); App.closeModal(); this.load(); } catch(ex){alert(ex.message);} }
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user