处理信息
提交账号${t.submitter?`${U.esc(t.submitter)} (${U.esc(t.user_game_name||'')})`:'匿名'}
-
负责人${t.assignee_name?`${U.esc(t.assignee_name)}`:'待认领'}
+
负责?/span>${t.assignee_name?`${U.esc(t.assignee_name)}`:'待认?/span>'}
${t.claimed_at?`
认领时间${U.date(t.claimed_at)}
`:''}
${isStaff?`
管理操作
- ${canClaim?``:''}
- ${isMyTicket?``:''}
- ${canTransfer?``:''}
- ${isOwner||isMyTicket?``:''}
+ ${canClaim?``:''}
+ ${isMyTicket?``:''}
+ ${canTransfer?``:''}
+ ${isOwner||isMyTicket?`
`:''}
${!isStaff && t.user_id === Auth.user().id && ['resolved','rejected'].includes(t.status) && t.type !== 'result_appeal' ? `
结果申诉
-
对处理结果有异议?可以提交一次申诉,由服主复核。
-
+
对处理结果有异议?可以提交一次申诉,由服主复核?/p>
+
`:''}
${t.transfers?.length?`
@@ -86,7 +86,7 @@ const TicketDetail = {
},
async claimTicket(id) {
- U.modal('接单认领', `
`);
+ U.modal('接单认领', `
`);
document.getElementById('claim-form').onsubmit = async e => { e.preventDefault();
try { await API.post(`/tickets/${id}/claim`, {claim_note: document.getElementById('claim-note').value, initial_reply: document.getElementById('claim-reply').value}); App.closeModal(); this.mount(); } catch(ex){alert(ex.message);}
};
@@ -94,7 +94,7 @@ const TicketDetail = {
async editNote(id) {
const t = await API.get(`/tickets/${id}`);
- U.modal('更新处理备注', `
`);
+ U.modal('更新处理备注', `
`);
document.getElementById('note-form').onsubmit = async e => { e.preventDefault();
try { await API.put(`/tickets/${id}`, {claim_note: document.getElementById('upd-note').value}); App.closeModal(); this.mount(); } catch(ex){alert(ex.message);}
};
@@ -103,14 +103,14 @@ const TicketDetail = {
async transferTicket(id) {
const users = await API.get('/users');
const staff = users.filter(u => (u.role==='owner'||u.role==='admin') && u.id !== Auth.user().id);
- U.modal('转单', `
`);
+ U.modal('转单', `
`);
document.getElementById('tf-form').onsubmit = async e => { e.preventDefault();
try { await API.post(`/tickets/${id}/transfer`, {to_user_id: parseInt(document.getElementById('tf-to').value), reason: document.getElementById('tf-reason').value}); App.closeModal(); this.mount(); } catch(ex){alert(ex.message);}
};
},
async changeStatus(id) {
- U.modal('变更状态', `
`);
+ U.modal('变更状?, `
`);
document.getElementById('cs-form').onsubmit = async e => { e.preventDefault();
try { await API.put(`/tickets/${id}`, {status:document.getElementById('cs-status').value}); App.closeModal(); this.mount(); } catch(ex){alert(ex.message);}
};
@@ -118,10 +118,10 @@ const TicketDetail = {
appealResult(parentId) {
U.modal('结果申诉', `
`);
document.getElementById('ar-form').onsubmit = async e => { e.preventDefault();
try {
@@ -133,7 +133,7 @@ const TicketDetail = {
parent_ticket_id: parentId,
});
App.closeModal();
- alert('申诉已提交,请等待服主处理');
+ alert('申诉已提交,请等待服主处?);
this.mount();
} catch(ex) { alert(ex.message); }
};
diff --git a/public/js/pages/tickets.js b/public/js/pages/tickets.js
index 7c99693..4092c13 100644
--- a/public/js/pages/tickets.js
+++ b/public/js/pages/tickets.js
@@ -20,14 +20,14 @@ const TicketsPage = {
ct.innerHTML = `
-
-
+
-
-
+
+
@@ -74,7 +74,7 @@ const TicketsPage = {
ct.innerHTML = tickets.length === 0
? `
`
: `
- | # | 类型 | 标题 | 提交者 | 对象 | 状态 | 优先级 | 负责人 | 时间 | 操作 |
+ # | 类型 | 标题 | 提交?/th> | 对象 | 状?/th> | 优先?/th> | 负责?/th> | 时间 | 操作 |
${tickets.map(t => `
| ${t.id} |
@@ -84,7 +84,7 @@ const TicketsPage = {
${t.target_game_name?`${U.esc(t.target_game_name)}${t.target_game_uid?` UID:${U.esc(t.target_game_uid)}`:''}`:'-'} |
${U.badge(t.status,'status')} |
${U.badge(t.priority,'priority')} |
- ${t.assignee_name?`${U.esc(t.assignee_name)}`:`待认领`} |
+ ${t.assignee_name?`${U.esc(t.assignee_name)}`:`待认?/span>`} |
${U.date(t.updated_at)} |
|
`).join('')}
`;
diff --git a/public/js/pages/tracking.js b/public/js/pages/tracking.js
index 42d2e10..5b1888a 100644
--- a/public/js/pages/tracking.js
+++ b/public/js/pages/tracking.js
@@ -19,20 +19,20 @@ const TrackingPage = {
async search() {
const token = document.getElementById('track-token').value.trim();
- if (!token) return alert('请输入追踪标识');
+ if (!token) return alert('请输入追踪标?);
const ct = document.getElementById('track-result');
U.loading(ct);
try {
const tickets = await API.get(`/tickets/tracking?token=${token}`);
ct.innerHTML = tickets.length ? `
-
| # | 类型 | 标题 | 状态 | 时间 |
${tickets.map(t => `
+ | # | 类型 | 标题 | 状?/th> | 时间 |
${tickets.map(t => `
| ${t.id} | ${U.badge(t.type,'type')} |
${U.esc(t.title)} |
${U.badge(t.status,'status')} | ${U.date(t.created_at)} |
`).join('')}
如需获取更详细的跟踪和回复通知,请注册账号
- ` : '';
+ ` : '';
} catch (e) { ct.innerHTML = `${e.message}
`; }
}
};
diff --git a/public/js/pages/unclaimed.js b/public/js/pages/unclaimed.js
index ef43d54..5af95c3 100644
--- a/public/js/pages/unclaimed.js
+++ b/public/js/pages/unclaimed.js
@@ -4,7 +4,7 @@ const UnclaimedPage = {
async render() { return '
'; },
async mount() {
- document.getElementById('page-title').textContent = '待处理工单';
+ document.getElementById('page-title').textContent = '待处理工?;
document.getElementById('page-actions').innerHTML = '';
const ct = document.getElementById('page-content');
@@ -35,7 +35,7 @@ const UnclaimedPage = {
ct.innerHTML = tickets.length === 0
? ``
: `${tickets.length} 个待处理工单按状态优先级排序
- | # | 类型 | 标题 | 提交者 | 对象/详情 | 状态 | 优先级 | 时间 | 操作 |
+ # | 类型 | 标题 | 提交?/th> | 对象/详情 | 状?/th> | 优先?/th> | 时间 | 操作 |
${tickets.map(t => `
| ${t.id} | ${U.badge(t.type,'type')} |
@@ -55,7 +55,7 @@ const UnclaimedPage = {
},
async quickClaim(id) {
- U.modal('接单认领', ``);
+ U.modal('接单认领', ``);
document.getElementById('qc-form').onsubmit = async e => { e.preventDefault();
try { await API.post(`/tickets/${id}/claim`, {claim_note: document.getElementById('qc-note').value, initial_reply: document.getElementById('qc-reply').value}); App.closeModal(); this.load(); } catch(ex){alert(ex.message);}
};
diff --git a/public/js/pages/users.js b/public/js/pages/users.js
index a7f8da0..2c50eb1 100644
--- a/public/js/pages/users.js
+++ b/public/js/pages/users.js
@@ -13,7 +13,7 @@ const UsersPage = {
const users = await API.get('/users');
ct.innerHTML = `
- | # | 用户名 | 邮箱 | 游戏名 | 游戏UID | 角色 | 状态 | 时间 | 操作 |
+ # | 用户?/th> | 邮箱 | 游戏?/th> | 游戏UID | 角色 | 状?/th> | 时间 | 操作 |
${users.map(u => `
| ${u.id} | ${U.esc(u.username)} | ${U.esc(u.email)} |
@@ -30,10 +30,10 @@ const UsersPage = {
createUser() {
U.modal('添加用户', `
`);
document.getElementById('cu-form').onsubmit = async e => {
@@ -56,11 +56,11 @@ const UsersPage = {
editUser(id, username, email, gameName, gameUid, role, active) {
U.modal('编辑用户', `
`);
document.getElementById('eu-form').onsubmit = async e => {
diff --git a/public/js/utils.js b/public/js/utils.js
index 0aa95c6..d6a3aa3 100644
--- a/public/js/utils.js
+++ b/public/js/utils.js
@@ -60,5 +60,11 @@ const U = {
document.querySelector('.btn-confirm-cancel').onclick = () => { App.closeModal(); resolve(false); };
document.querySelector('.btn-confirm-ok').onclick = () => { App.closeModal(); resolve(true); };
});
+ },
+
+ bindClicks(container, handlers) {
+ for (const [selector, fn] of Object.entries(handlers)) {
+ container.querySelectorAll(selector).forEach(el => el.addEventListener('click', fn));
+ }
}
};