/** * AKSRT Ticket Center — 用户中心「工单中心」面板。 * * - 列表 / 统计 / 详情全部走 REST,模板只输出容器与首屏骨架(profile-tickets.php) * - 统计卡兼作状态快捷筛选,与状态下拉双向同步;搜索输入防抖,旧请求结果按序号丢弃 * - 弹窗经 AksrtModalRuntime.open 打开(运行时自带标题栏 / 焦点陷阱 / 移动端底部抽屉), * 先出运行时骨架,数据到达后填充,避免点击后无反馈 * - 详情为对话时间线:问题描述作为首条消息,用户靠右、客服靠左;回复后原地刷新而不是关窗 * - 提交工单与回复前先过人机验证(ticket_create / ticket_reply,场景未启用自动放行) * - 图片走 /aksrt/v1/ticket/upload-attachment,上传中显示占位格,未传完禁止提交 * * @package AKSRT */ (function () { 'use strict'; var core = window.AksrtTicketCore; if (!core) return; var settings = core.settings; var attachmentEnabled = core.attachmentEnabled; var attachmentMax = core.attachmentMax; var escapeHtml = core.escapeHtml; var notyf = core.notyf; var request = core.request; var expectSuccess = core.expectSuccess; var runCaptcha = core.runCaptcha; var failMessage = core.failMessage; var timeTag = core.timeTag; var icon = core.icon; var statusBadge = core.statusBadge; var emptyHtml = core.emptyHtml; var setBusy = core.setBusy; var markInvalid = core.markInvalid; var openModal = core.openModal; var alive = core.alive; var setModalContent = core.setModalContent; var modalError = core.modalError; var collectAttachments = core.collectAttachments; var isUploading = core.isUploading; var bindShell = core.bindShell; var uploaderHtml = core.uploaderHtml; var SEARCH_DEBOUNCE = 400; var CLOSE_CONFIRM_MS = 4000; var state = { page: 1, perPage: 10, totalPages: 1, status: '', type: '', keywords: '', meta: null, listSeq: 0, }; /* ------------------------------------------------------------------ * * 列表 / 统计 / 筛选 * ------------------------------------------------------------------ */ function panel() { return document.querySelector('[data-aksrt-ticket-center]'); } function listNode() { var root = panel(); return root ? root.querySelector('[data-aksrt-ticket-list]') : null; } function hasFilters() { return !!(state.status || state.type || state.keywords); } function skeletonHtml() { var card = '
' + icon('fa-lock') + '工单已关闭,如需继续沟通请提交新工单。
' : composerHtml(ticket); return html + '' + (quote.author_name ? '' + escapeHtml(quote.author_name) + '' : '') + '' + escapeHtml(text) + ''; } function excerpt(text) { var flat = String(text || '').replace(/\s+/g, ' ').trim(); return flat.length > 60 ? flat.slice(0, 60) + '…' : flat; } function messageHtml(msg, canQuote) { var admin = msg.author_type === 'admin'; var name = msg.author_name || (admin ? '客服' : '我'); var avatar = admin ? icon('fa-headset') : escapeHtml(Array.from(name)[0] || '我'); var tags = (admin ? '客服' : '') + (msg.isOrigin ? '问题描述' : ''); return '
我们会尽快处理,处理进度可随时在工单中心查看。
' + (notice.open && notice.text ? '