Files
Claude-Code-Workflow/ccw/src/templates/dashboard-js/components/_exp_helpers.js
catlog22 650d877430 feat: Dashboard 增强 - MCP管理器、Review Session 和 UI 改进
- 添加 MCP Manager 组件,支持服务器状态管理
- 增强 Review Session 视图,添加 conflict/review tabs
- 新增 _conflict_tab.js 和 _review_tab.js 组件
- 改进 carousel、tabs-other 等组件
- 大量 CSS 样式更新和优化
- home.js 添加新功能支持

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-07 20:07:29 +08:00

55 lines
2.5 KiB
JavaScript

// Exploration helpers loaded
// Helper: Render exploration field with smart type detection
function renderExpField(label, value) {
if (value === null || value === undefined) return '';
let rendered;
if (typeof value === 'string') {
rendered = `<p>${escapeHtml(value)}</p>`;
} else if (Array.isArray(value)) {
rendered = renderExpArray(value);
} else if (typeof value === 'object') {
rendered = renderExpObject(value);
} else {
rendered = `<p>${escapeHtml(String(value))}</p>`;
}
return `<div class="exp-field"><label>${escapeHtml(label)}</label>${rendered}</div>`;
}
// Helper: Render array values
function renderExpArray(arr) {
if (!arr.length) return '<p>-</p>';
if (typeof arr[0] === 'object' && arr[0] !== null) {
return `<div class="exp-array-objects">${arr.map(item => {
if (item.question) {
return `<div class="clarification-item">
<div class="clarification-question">${escapeHtml(item.question)}</div>
${item.impact ? `<div class="clarification-impact">Impact: ${escapeHtml(item.impact)}</div>` : ''}
${item.priority ? `<span class="priority-badge priority-${item.priority}">${item.priority}</span>` : ''}
</div>`;
}
return `<div class="exp-object-item">${renderExpObject(item)}</div>`;
}).join('')}</div>`;
}
return `<ul class="exp-list">${arr.map(item => `<li>${escapeHtml(String(item))}</li>`).join('')}</ul>`;
}
// Helper: Render object values recursively
function renderExpObject(obj) {
if (!obj || typeof obj !== 'object') return '';
const entries = Object.entries(obj).filter(([k]) => !k.startsWith('_'));
if (!entries.length) return '<p>-</p>';
return `<div class="exp-object">${entries.map(([key, val]) => {
const label = key.replace(/_/g, ' ').replace(/\b\w/g, c => c.toUpperCase());
if (val === null || val === undefined) return '';
if (typeof val === 'string') {
return `<div class="exp-obj-field"><span class="exp-obj-key">${escapeHtml(label)}:</span> <span class="exp-obj-val">${escapeHtml(val)}</span></div>`;
} else if (Array.isArray(val)) {
return `<div class="exp-obj-field"><span class="exp-obj-key">${escapeHtml(label)}:</span>${renderExpArray(val)}</div>`;
} else if (typeof val === 'object') {
return `<div class="exp-obj-nested"><span class="exp-obj-key">${escapeHtml(label)}</span>${renderExpObject(val)}</div>`;
}
return `<div class="exp-obj-field"><span class="exp-obj-key">${escapeHtml(label)}:</span> <span class="exp-obj-val">${escapeHtml(String(val))}</span></div>`;
}).join('')}</div>`;
}