()
| 473 | } |
| 474 | |
| 475 | function bindEvents() { |
| 476 | const runBtn = document.getElementById('selfcheck-run-btn'); |
| 477 | const refreshBtn = document.getElementById('selfcheck-refresh-btn'); |
| 478 | const saveScheduleBtn = document.getElementById('selfcheck-save-schedule-btn'); |
| 479 | const runNowBtn = document.getElementById('selfcheck-run-now-btn'); |
| 480 | const runsBody = document.getElementById('selfcheck-runs-body'); |
| 481 | const checkList = document.getElementById('selfcheck-check-list'); |
| 482 | const repairPreviewBtn = document.getElementById('repair-center-preview-btn'); |
| 483 | const repairExecuteBtn = document.getElementById('repair-center-execute-btn'); |
| 484 | const repairRollbackRefreshBtn = document.getElementById('repair-center-refresh-rollbacks-btn'); |
| 485 | const rollbackBox = document.getElementById('repair-center-rollbacks'); |
| 486 | |
| 487 | runBtn?.addEventListener('click', startRun); |
| 488 | refreshBtn?.addEventListener('click', async () => { |
| 489 | try { |
| 490 | await loadRuns(); |
| 491 | await loadScheduleAndRuntime(); |
| 492 | toast.success('刷新完成'); |
| 493 | } catch (error) { |
| 494 | toast.error(`刷新失败: ${parseErrorMessage(error)}`); |
| 495 | } |
| 496 | }); |
| 497 | saveScheduleBtn?.addEventListener('click', saveSchedule); |
| 498 | runNowBtn?.addEventListener('click', runNow); |
| 499 | repairPreviewBtn?.addEventListener('click', previewRepairCenter); |
| 500 | repairExecuteBtn?.addEventListener('click', executeRepairCenter); |
| 501 | repairRollbackRefreshBtn?.addEventListener('click', loadRepairRollbacks); |
| 502 | |
| 503 | runsBody?.addEventListener('click', (event) => { |
| 504 | const target = event.target.closest('tr[data-run-id]'); |
| 505 | if (!target) return; |
| 506 | const runId = Number(target.dataset.runId || 0); |
| 507 | if (!runId) return; |
| 508 | loadRunDetail(runId).catch((error) => { |
| 509 | toast.error(`加载运行详情失败: ${parseErrorMessage(error)}`); |
| 510 | }); |
| 511 | }); |
| 512 | |
| 513 | checkList?.addEventListener('click', (event) => { |
| 514 | const button = event.target.closest('.selfcheck-repair-btn'); |
| 515 | if (!button) return; |
| 516 | const runId = Number(button.dataset.runId || 0); |
| 517 | const repairKey = String(button.dataset.repairKey || ''); |
| 518 | executeRepair(runId, repairKey, button); |
| 519 | }); |
| 520 | |
| 521 | rollbackBox?.addEventListener('click', (event) => { |
| 522 | const button = event.target.closest('.repair-center-rollback-btn'); |
| 523 | if (!button) return; |
| 524 | const rollbackId = String(button.dataset.rollbackId || ''); |
| 525 | rollbackRepairPoint(rollbackId, button); |
| 526 | }); |
| 527 | } |
| 528 | |
| 529 | function startPolling() { |
| 530 | if (selfcheckState.pollTimer) { |
no test coverage detected