feat(admin): open ticket creation in a dialog on the list page

Move "代客提交工单" back into a native <dialog> on the ticket list while
the ticket workspace stays a full page. Closing asks before discarding
input, ignores backdrop clicks, resets the form and returns focus; an
uncertain create result keeps the form locked behind "重新加载".

Remove the ?view=new create page route and its styles.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
kate522andClaude Fable 5 committed 2026-10-31 14:57:35 +08:00
1 parent d86a85e6a6
commit 54cc5301c3
9 files changed
+169 -65

No files matched your search

+41 -2
View File
@@ -1,4 +1,4 @@
/** 工单后台:列表 / 处理工作区 / 代客提交均为页内视图;写操作只使用工单 REST 接口,成功后整页跳转刷新。 */
/** 工单后台:列表与处理工作区为页内视图,代客提交为列表页上的原生 dialog;写操作只使用工单 REST 接口,成功后整页跳转刷新。 */
(function () {
'use strict';
@@ -7,6 +7,8 @@
if (!root || !config) return;
var strings = config.strings;
var dialog = document.getElementById('aksrt-ticket-create-dialog');
var opener = null;
var feedbackBox = root.querySelector('[data-aksrt-ticket-feedback]');
var detail = root.querySelector('[data-aksrt-ticket-detail]');
var ticketId = detail ? parseInt(detail.dataset.aksrtTicketDetail, 10) : 0;
@@ -133,7 +135,6 @@
/** 成功后跳回工作区并带结果码;未提交的其它表单草稿暂存到 sessionStorage,加载后恢复。 */
function go(id, kind, remaining) {
var url = new URL(window.location.href);
url.searchParams.delete('view');
url.searchParams.set('id', String(id));
url.searchParams.set('aksrt_ticket_msg', kind);
url.hash = '';
@@ -176,12 +177,50 @@
}
}
/** 关闭代客提交弹窗:保存中不可关;有未保存输入时先确认。不响应遮罩点击,避免误关丢失输入。 */
function closeDialog() {
if (saving || !dialog.open) return;
if (!stale && Object.keys(drafts()).length && !window.confirm(strings.discard)) return;
dialog.close();
}
if (dialog) {
dialog.addEventListener('cancel', function (event) {
event.preventDefault();
closeDialog();
});
dialog.addEventListener('close', function () {
var form = dialog.querySelector('[data-aksrt-ticket-form]');
if (form && !stale) {
form.reset();
baselines.set(form, values(form));
form.querySelectorAll('[name]').forEach(validateText);
form.querySelectorAll('[data-aksrt-ticket-editor]').forEach(counter);
feedback('', false, false);
}
if (opener && opener.isConnected) opener.focus();
});
}
root.addEventListener('click', function (event) {
if (event.target.closest('[data-aksrt-ticket-reload]')) {
leaving = true;
window.location.reload();
return;
}
if (dialog && event.target.closest('[data-aksrt-dialog-close]')) {
closeDialog();
return;
}
var open = dialog && event.target.closest('[data-aksrt-dialog-open="' + dialog.id + '"]');
if (open) {
if (saving) return;
opener = open;
// 结果未确认时保留「重新加载」提示,重新打开也不能再提交。
if (!stale) feedback('', false, false);
dialog.showModal();
return;
}
if (saving || stale) return;
var assign = event.target.closest('[data-aksrt-ticket-assign]');
if (assign) {