(runtime)
| 49 | } |
| 50 | |
| 51 | function renderRuntime(runtime) { |
| 52 | const statusNode = document.getElementById('runtime-status'); |
| 53 | const nextRunNode = document.getElementById('runtime-next-run'); |
| 54 | const lastRunNode = document.getElementById('runtime-last-run'); |
| 55 | const summaryNode = document.getElementById('runtime-last-summary'); |
| 56 | const logsNode = document.getElementById('selfcheck-runtime-logs'); |
| 57 | if (!statusNode || !nextRunNode || !lastRunNode || !summaryNode || !logsNode) return; |
| 58 | |
| 59 | statusNode.textContent = normalizeStatus(runtime?.last_status).text || '-'; |
| 60 | nextRunNode.textContent = runtime?.next_run_at ? format.date(runtime.next_run_at) : '-'; |
| 61 | lastRunNode.textContent = runtime?.last_finished_at ? format.date(runtime.last_finished_at) : '-'; |
| 62 | summaryNode.textContent = runtime?.last_run?.summary || runtime?.last_error || '-'; |
| 63 | |
| 64 | const logs = Array.isArray(runtime?.logs) ? runtime.logs : []; |
| 65 | if (!logs.length) { |
| 66 | logsNode.innerHTML = '<div class="selfcheck-log-item"><span>-</span><span>-</span><span>暂无调度日志</span></div>'; |
| 67 | return; |
| 68 | } |
| 69 | |
| 70 | logsNode.innerHTML = logs.map((item) => { |
| 71 | const level = String(item?.level || 'info').toLowerCase(); |
| 72 | return ` |
| 73 | <div class="selfcheck-log-item"> |
| 74 | <span>${escapeHtml(format.date(item?.time))}</span> |
| 75 | <span class="selfcheck-log-level ${level}">${escapeHtml(level)}</span> |
| 76 | <span>${escapeHtml(item?.message || '')}</span> |
| 77 | </div> |
| 78 | `; |
| 79 | }).join(''); |
| 80 | } |
| 81 | |
| 82 | function renderSchedule(data) { |
| 83 | const enabledNode = document.getElementById('selfcheck-auto-enabled'); |
no test coverage detected