等待后端更新接口

This commit is contained in:
2026-08-03 16:49:26 +08:00
parent ac5823547a
commit 5b79893650
131 changed files with 5324 additions and 1392 deletions
+75 -29
View File
@@ -181,6 +181,10 @@
else root.location.href = 'login.html';
}
function isForbidden(error) {
return Number(error && (error.status || error.code)) === 403;
}
function getFormValues(form) {
var values = {};
@@ -190,10 +194,35 @@
return values;
}
function setStatus(message) {
function setApiState(target, type, message) {
if (!target) return;
if (root.ProfileUI && root.ProfileUI.setApiState && type) {
root.ProfileUI.setApiState(target, type, message);
return;
}
target.textContent = message || '';
}
function setStatus(type, message) {
var status = root.document && root.document.querySelector('[data-feedback-status]');
if (status) status.textContent = message || '';
setApiState(status, type, message);
}
function setFeedbackList(list, items, detailPage) {
if (!list) return;
if (!items.length) {
setApiState(list, 'empty', '当前没有反馈记录。');
return;
}
list.innerHTML = renderFeedbackList(items, { detailPage: detailPage || 'ticket-detail.html' });
}
function setPendingButton(button, pending, label) {
if (!button) return;
if (!button.dataset.defaultLabel) button.dataset.defaultLabel = button.textContent;
button.disabled = pending;
button.textContent = pending ? label : button.dataset.defaultLabel;
}
async function readMyFeedback(api) {
@@ -225,24 +254,32 @@
var items;
if (!list) return [];
setStatus('正在读取反馈记录…');
setApiState(list, 'loading', '正在读取反馈记录…');
setStatus('loading', '正在读取反馈记录…');
try {
items = await readMyFeedback(api);
list.innerHTML = renderFeedbackList(items, { detailPage: 'ticket-detail.html' });
setStatus('');
setFeedbackList(list, items, 'ticket-detail.html');
setStatus('', '');
return items;
} catch (error) {
if (shouldRedirectToLogin(api, error)) {
redirectToLogin(api);
return [];
}
list.innerHTML = '<div class="api-empty">读取反馈记录失败</div>';
setStatus(error.message || '读取反馈记录失败,请稍后重试');
setApiState(list, isForbidden(error) ? 'forbidden' : 'error', isForbidden(error) ? '暂无权限查看反馈记录。' : '读取反馈记录失败,请稍后重试。');
setStatus(isForbidden(error) ? 'forbidden' : 'error', isForbidden(error) ? '暂无权限查看反馈记录。' : (error.message || '读取反馈记录失败,请稍后重试'));
return [];
}
}
if (refresh) refresh.addEventListener('click', loadList);
if (refresh) refresh.addEventListener('click', async function () {
setPendingButton(refresh, true, '正在刷新…');
try {
await loadList();
} finally {
setPendingButton(refresh, false, '正在刷新…');
}
});
form.addEventListener('submit', async function (event) {
var body;
var validation;
@@ -255,12 +292,12 @@
body = buildFeedbackBody(getFormValues(form));
validation = validateFeedbackBody(body);
if (validation) {
setStatus(validation);
setStatus('error', validation);
return;
}
writePending = true;
if (button) button.disabled = true;
setStatus('正在提交反馈…');
setPendingButton(button, true, '正在提交…');
setStatus('loading', '正在提交反馈…');
try {
created = normalizeFeedback(await api.submitFeedback(body));
if (!created) throw new Error('提交响应缺少有效反馈信息');
@@ -272,18 +309,18 @@
if (root.location) root.location.href = buildFeedbackDetailUrl(created.feedbackId);
return;
}
if (list) list.innerHTML = renderFeedbackList(refreshed, { detailPage: 'ticket-detail.html' });
setFeedbackList(list, refreshed, 'ticket-detail.html');
form.reset();
setStatus('反馈已提交');
setStatus('', '反馈已提交');
} catch (error) {
if (shouldRedirectToLogin(api, error)) {
redirectToLogin(api);
return;
}
setStatus(error.message || '提交反馈失败,请稍后重试');
setStatus(isForbidden(error) ? 'forbidden' : 'error', isForbidden(error) ? '暂无权限提交反馈。' : (error.message || '提交反馈失败,请稍后重试'));
} finally {
writePending = false;
if (button) button.disabled = false;
setPendingButton(button, false, '正在提交…');
}
});
await loadList();
@@ -303,22 +340,28 @@
async function loadList() {
try {
setStatus('正在读取反馈记录…');
list.innerHTML = renderFeedbackList(await readMyFeedback(api), {
detailPage: 'ticket-detail.html'
});
setStatus('');
setApiState(list, 'loading', '正在读取反馈记录…');
setStatus('loading', '正在读取反馈记录…');
setFeedbackList(list, await readMyFeedback(api), 'ticket-detail.html');
setStatus('', '');
} catch (error) {
if (shouldRedirectToLogin(api, error)) {
redirectToLogin(api);
return;
}
list.innerHTML = '<div class="api-empty">读取反馈记录失败</div>';
setStatus(error.message || '读取反馈记录失败,请稍后重试');
setApiState(list, isForbidden(error) ? 'forbidden' : 'error', isForbidden(error) ? '暂无权限查看反馈记录。' : '读取反馈记录失败,请稍后重试。');
setStatus(isForbidden(error) ? 'forbidden' : 'error', isForbidden(error) ? '暂无权限查看反馈记录。' : (error.message || '读取反馈记录失败,请稍后重试'));
}
}
if (refresh) refresh.addEventListener('click', loadList);
if (refresh) refresh.addEventListener('click', async function () {
setPendingButton(refresh, true, '正在刷新…');
try {
await loadList();
} finally {
setPendingButton(refresh, false, '正在刷新…');
}
});
await loadList();
}
@@ -331,7 +374,7 @@
if (!page || !detail) return;
if (!feedbackId) {
detail.innerHTML = '<div class="api-empty">反馈记录不存在或无权查看</div>';
setApiState(detail, 'empty', '反馈记录不存在或无权查看。');
return;
}
if (shouldRedirectToLogin(api)) {
@@ -339,17 +382,19 @@
return;
}
try {
setStatus('正在读取反馈详情…');
setApiState(detail, 'loading', '正在读取反馈详情…');
setStatus('loading', '正在读取反馈详情…');
item = findFeedbackById(await api.myFeedback(), feedbackId);
detail.innerHTML = renderFeedbackDetail(item);
setStatus(item ? '' : '反馈记录不存在或无权查看');
if (item) detail.innerHTML = renderFeedbackDetail(item);
else setApiState(detail, 'empty', '反馈记录不存在或无权查看');
setStatus('', item ? '' : '反馈记录不存在或无权查看。');
} catch (error) {
if (shouldRedirectToLogin(api, error)) {
redirectToLogin(api);
return;
}
detail.innerHTML = '<div class="api-empty">反馈详情读取失败</div>';
setStatus(error.message || '反馈详情读取失败,请稍后重试');
setApiState(detail, isForbidden(error) ? 'forbidden' : 'error', isForbidden(error) ? '暂无权限查看该反馈详情。' : '反馈详情读取失败,请稍后重试。');
setStatus(isForbidden(error) ? 'forbidden' : 'error', isForbidden(error) ? '暂无权限查看该反馈详情。' : (error.message || '反馈详情读取失败,请稍后重试'));
}
}
@@ -377,6 +422,7 @@
buildFeedbackDetailUrl: buildFeedbackDetailUrl,
renderFeedbackList: renderFeedbackList,
renderFeedbackDetail: renderFeedbackDetail,
isForbidden: isForbidden,
initFeedbackFormPage: initFeedbackFormPage,
initFeedbackListPage: initFeedbackListPage,
initFeedbackDetailPage: initFeedbackDetailPage,