fix(admin): merge ticket controls into information panel

Edit status, department and assignee directly in ticket information, remove the redundant handling card and its layout rules, and cover editable and closed-ticket rendering.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
kate522andClaude Opus 5 committed 2026-10-31 11:46:15 +08:00
1 parent 7f1a0dbeb4
commit 09f3a94cea
4 files changed
+76 -33

No files matched your search

+28
View File
@@ -46,6 +46,34 @@ test('detail is independently loaded even for a closed ticket outside current fi
assert.match(open.data.panel, /<dt>工单号<\/dt><dd>TK-00021<\/dd>/);
});
test('ticket information owns the only status editor and closed tickets stay read-only', () => {
const { open, closed } = rendered();
const sidebarCards = panel => {
const sidebar = panel.match(/<aside\b[^>]*>([\s\S]*?)<\/aside>/)?.[1] || '';
return [...sidebar.matchAll(/<section class="aksrt-ticket-detail__card(?: [^"]+)?">([\s\S]*?)<\/section>/g)].map(match => match[1]);
};
const cards = sidebarCards(open.data.panel);
assert.equal(cards.length, 2, 'only ticket information and internal notes remain');
const info = cards[0];
assert.match(info, /<h3>工单信息<\/h3>/);
assert.match(info, /data-aksrt-ticket-form="status"/);
assert.match(info, /data-aksrt-ticket-assign/);
assert.match(info, /保存工单信息/);
assert.doesNotMatch(open.data.panel, /<h3[^>]*>处理工单<\/h3>/);
assert.doesNotMatch(info, /aksrt-ticket-badge/);
for (const [name, label] of [['status', '状态'], ['ticket_type_id', '部门'], ['admin_id', '跟进人']]) {
const id = `aksrt-ticket-${name}-21`;
assert.ok(info.includes(`<label for="${id}">${label}</label>`));
assert.ok(info.includes(`<select id="${id}" name="${name}"`));
assert.equal((open.data.panel.match(new RegExp(`name="${name}"`, 'g')) || []).length, 1);
}
assert.match(cards[1], /内部备注/);
const closedInfo = sidebarCards(closed.data.panel)[0];
assert.match(closedInfo, /<h3>工单信息<\/h3>/);
assert.match(closedInfo, /aksrt-ticket-badge/);
assert.doesNotMatch(closedInfo, /<form|<select|data-aksrt-ticket-assign|保存工单信息/);
});
test('read handler enforces capability, nonce and record existence', () => {
const { missing, denied, nonce } = rendered();
assert.equal(missing.status, 404);