-
-
正在生成 PR 描述...
-
+
-
-
-
@@ -210,85 +175,66 @@
const btn = document.getElementById('btn-generate');
const output = document.getElementById('output');
- const streaming = document.getElementById('streaming');
- const outputContent = document.getElementById('output-content');
+ const indicator = document.getElementById('generating-indicator');
btn.disabled = true;
btn.textContent = '生成中...';
btn.classList.add('opacity-70', 'cursor-not-allowed');
output.classList.remove('hidden');
- streaming.classList.remove('hidden');
- document.getElementById('streaming-text').textContent = '';
- document.getElementById('streaming-status').textContent = '';
+ indicator.classList.remove('hidden');
// Clear previous results
- document.getElementById('pr-title').textContent = '';
- document.getElementById('pr-type').textContent = '';
- document.getElementById('pr-summary').textContent = '';
- document.getElementById('pr-details').innerHTML = '';
- document.getElementById('pr-impact').textContent = '';
+ document.getElementById('pr-rendered').innerHTML = '';
document.getElementById('pr-markdown').textContent = '';
markdownContent = '';
- // Accumulate streaming content
+ // Helper: update both columns from current fields
const fields = { title: '', type: '', summary: '', details: '', impact: '' };
- let rawStreamText = '';
+ function updateColumns() {
+ markdownContent = buildMarkdown(fields);
+ document.getElementById('pr-rendered').innerHTML = renderMarkdown(markdownContent);
+ document.getElementById('pr-markdown').textContent = markdownContent;
+ }
SSE.post(`/api/repos/${repoId}/generate`, {
base: baseRef,
head: headRef,
}, {
- // Raw streaming content from LLM — show in real-time
- content(data) {
- const chunk = data.content || '';
- rawStreamText += chunk;
- document.getElementById('streaming-text').textContent = rawStreamText;
- // Auto-scroll to bottom
- const container = document.getElementById('streaming-content');
- container.scrollTop = container.scrollHeight;
- },
title(data) {
fields.title += data.content || '';
- document.getElementById('pr-title').textContent = fields.title;
+ updateColumns();
document.getElementById('streaming-status').textContent = '解析标题...';
},
type(data) {
fields.type += data.content || '';
- document.getElementById('pr-type').textContent = fields.type;
+ updateColumns();
document.getElementById('streaming-status').textContent = '解析类型...';
},
summary(data) {
fields.summary += data.content || '';
- document.getElementById('pr-summary').textContent = fields.summary;
+ updateColumns();
document.getElementById('streaming-status').textContent = '解析摘要...';
},
detail(data) {
fields.details += data.content || '';
- document.getElementById('pr-details').innerHTML = renderMarkdown(fields.details);
+ updateColumns();
document.getElementById('streaming-status').textContent = '解析详细说明...';
},
impact(data) {
fields.impact += data.content || '';
- document.getElementById('pr-impact').textContent = fields.impact;
+ updateColumns();
document.getElementById('streaming-status').textContent = '解析影响范围...';
},
- markdown(data) {
- markdownContent += data.content || '';
- document.getElementById('pr-markdown').textContent = markdownContent;
- },
done() {
- // Assemble full markdown from structured fields
- markdownContent = buildMarkdown(fields);
- document.getElementById('pr-markdown').textContent = markdownContent;
- // Hide streaming indicator; columns already visible
- streaming.classList.add('hidden');
+ updateColumns();
+ indicator.classList.add('hidden');
btn.disabled = false;
btn.textContent = '生成 PR 描述';
btn.classList.remove('opacity-70', 'cursor-not-allowed');
},
error(data) {
showToast('生成失败: ' + (data.message || '未知错误'), 'error');
- streaming.classList.add('hidden');
+ indicator.classList.add('hidden');
btn.disabled = false;
btn.textContent = '生成 PR 描述';
btn.classList.remove('opacity-70', 'cursor-not-allowed');