fix(web): renderPreview 中 task 变量遮蔽全局 t() 翻译函数导致预览点击无效

将 renderPreview 内 const t = tasks.find() 改名为 task,
避免局部变量 t(任务对象)遮蔽全局翻译函数 t(),
使预览面板渲染时抛 't is not a function' 导致面板无法打开。

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
wangjia
2026-06-14 14:23:56 +08:00
parent 027a9cb2d6
commit 36e8f736e6
+15 -15
View File
@@ -1191,14 +1191,14 @@ function renderTranscript(messages) {
function renderPreview() { function renderPreview() {
const root = $('#previewRoot'); const root = $('#previewRoot');
if (!S.previewId) { root.hidden = true; root.innerHTML = ''; return; } if (!S.previewId) { root.hidden = true; root.innerHTML = ''; return; }
const t = S.approvals.find((x) => x.id === S.previewId) || S.tasks.find((x) => x.id === S.previewId); const task = S.approvals.find((x) => x.id === S.previewId) || S.tasks.find((x) => x.id === S.previewId);
// 任务已离开闸(被裁决/状态变化)→ 自动关闭 // 任务已离开闸(被裁决/状态变化)→ 自动关闭
if (!t || !GATE_OF[t.status]) { S.previewId = null; S.previewReject = false; root.hidden = true; root.innerHTML = ''; return; } if (!task || !GATE_OF[task.status]) { S.previewId = null; S.previewReject = false; root.hidden = true; root.innerHTML = ''; return; }
const gate = GATE_OF[t.status]; const gate = GATE_OF[task.status];
const pp = S.projects.find((x) => x.id === S.currentProjectId); const pp = S.projects.find((x) => x.id === S.currentProjectId);
const defBranch = pp ? pp.defaultBranch : 'main'; const defBranch = pp ? pp.defaultBranch : 'main';
const onlyPassBtn = gate === 'exec' const onlyPassBtn = gate === 'exec'
? `<button class="btn btn-ghost btn-xs" data-action="gate-accept" data-merge="false" data-id="${esc(t.id)}" title="${t('gateOnlyPass')}">${t('gateOnlyPass')}</button>` ? `<button class="btn btn-ghost btn-xs" data-action="gate-accept" data-merge="false" data-id="${esc(task.id)}" title="${t('gateOnlyPass')}">${t('gateOnlyPass')}</button>`
: ''; : '';
root.hidden = false; root.hidden = false;
root.innerHTML = ` root.innerHTML = `
@@ -1206,28 +1206,28 @@ function renderPreview() {
<div class="preview-panel"> <div class="preview-panel">
<div class="preview-head"> <div class="preview-head">
<span class="gate-kind">${gateLabel(gate)}</span> <span class="gate-kind">${gateLabel(gate)}</span>
<span class="preview-title">${esc(t.title)}</span> <span class="preview-title">${esc(task.title)}</span>
${cplxBadge(t.complexity)} ${cplxBadge(task.complexity)}
${statusChip(t.status)} ${statusChip(task.status)}
<span class="spacer"></span> <span class="spacer"></span>
<button class="btn btn-ghost" data-action="preview-close" title="${t('closeTip')}">${icon('close')}</button> <button class="btn btn-ghost" data-action="preview-close" title="${t('closeTip')}">${icon('close')}</button>
</div> </div>
<div class="preview-body">${gateDocs(t)}</div> <div class="preview-body">${gateDocs(task)}</div>
<div class="preview-foot"> <div class="preview-foot">
<button class="btn btn-accept" data-action="gate-accept" data-id="${esc(t.id)}">${gate === 'exec' ? t('gateAcceptMerge') : t('gateAccept')}</button>${onlyPassBtn} <button class="btn btn-accept" data-action="gate-accept" data-id="${esc(task.id)}">${gate === 'exec' ? t('gateAcceptMerge') : t('gateAccept')}</button>${onlyPassBtn}
<button class="btn btn-reject" data-action="preview-reject-toggle" data-id="${esc(t.id)}">${t('gateReject')}</button> <button class="btn btn-reject" data-action="preview-reject-toggle" data-id="${esc(task.id)}">${t('gateReject')}</button>
${gate === 'exec' ? `<span class="proj-meta">${t('gateMergeNote', { branch: esc(defBranch) })}</span>` : ''} ${gate === 'exec' ? `<span class="proj-meta">${t('gateMergeNote', { branch: esc(defBranch) })}</span>` : ''}
<span class="proj-meta">id ${esc(t.id)} · ${fmtTime(t.updatedAt)}</span> <span class="proj-meta">id ${esc(task.id)} · ${fmtTime(task.updatedAt)}</span>
${S.previewReject ? ` ${S.previewReject ? `
<div class="reject-form preview-reject"> <div class="reject-form preview-reject">
<textarea id="prev-rej-${esc(t.id)}" placeholder="${t('rejectPlaceholder')}"></textarea> <textarea id="prev-rej-${esc(task.id)}" placeholder="${t('rejectPlaceholder')}"></textarea>
<button class="btn btn-reject" data-action="gate-reject-confirm" data-id="${esc(t.id)}" data-ta="prev-rej-${esc(t.id)}">${t('confirmReject')}</button> <button class="btn btn-reject" data-action="gate-reject-confirm" data-id="${esc(task.id)}" data-ta="prev-rej-${esc(task.id)}">${t('confirmReject')}</button>
<button class="btn" data-action="preview-reject-toggle" data-id="${esc(t.id)}">${t('collapse')}</button> <button class="btn" data-action="preview-reject-toggle" data-id="${esc(task.id)}">${t('collapse')}</button>
</div>` : ''} </div>` : ''}
</div> </div>
</div>`; </div>`;
if (S.previewReject) { if (S.previewReject) {
const ta = document.getElementById(`prev-rej-${t.id}`); const ta = document.getElementById(`prev-rej-${task.id}`);
if (ta) ta.focus(); if (ta) ta.focus();
} }
} }