// history.js — история тестов (вид «История») // // Загружает последние 50 записей из GET /api/history. // Каждая запись — строка таблицы: время, операция, инстанс, статус, длительность. // При клике на строку — раскрываются этапы выполнения (stages). // // Цветовая маркировка: // RUNNING → жёлтый фон (#fef3c7) // FAIL → красный фон (#fef2f2) let historyOpen=false; /** * Переключить панель истории (открыть/закрыть). * При открытии — автозагрузка через loadHistory(). */ async function toggleHistory(){ const body=document.getElementById('history-body'); historyOpen=!historyOpen; body.style.display=historyOpen?'block':'none'; if(historyOpen) await loadHistory(); } /** * Загрузить и отрисовать историю. * * Формат ответа API: массив объектов: * [{created_at, op_name, display_name, instance_uid, status, duration_sec, stages}, ...] */ async function loadHistory(){ const body=document.getElementById('history-body'); if(!body||body.style.display==='none') return; try{ const r=await fetch('/api/history'); const rows=await r.json(); if(!rows||!rows.length){ body.innerHTML='Нет записей'; return; } // Таблица с фиксированной шириной колонок let html=''; html+=''; rows.forEach((r, i)=>{ const time=r.created_at?r.created_at.replace('T',' ').substring(0,19):'?'; const cls=r.status==='OK'?'badge-success':r.status==='FAIL'?'badge':''; // Цвет фона строки: RUNNING → жёлтый, FAIL → красный const stCls=r.status==='RUNNING'?'background:#fef3c7;':r.status==='FAIL'?'background:#fef2f2;':''; // Строка таблицы — кликабельна (раскрывает этапы) html+=``; // Скрытая строка с этапами (раскрывается по клику) html+=``; }); html+='
ВремяОперацияИнстансСтатусДлит.
${time} ${_esc(r.op_name||'?')} ${_esc(r.display_name||r.instance_uid||'?')} ${_esc(r.status||'?')} ${r.duration_sec!=null?r.duration_sec.toFixed(1)+'s':'-'}
'; body.innerHTML=html; }catch(e){ body.innerHTML='Ошибка загрузки'; } } /** * Раскрыть/скрыть строку с этапами для записи истории. * * @param {number} i — индекс записи в массиве rows */ function toggleHistoryRow(i) { const el = document.getElementById('hist-stages-' + i); if (!el) return; el.style.display = el.style.display === 'none' ? 'table-row' : 'none'; } /** * Отрисовать этапы выполнения для записи истории. * * Каждый этап: иконка (✅/❌/⏳) + название + время + длительность. * * @param {Array} stages — [{stage, dtStart, dtFinish, isSuccessful, duration}, ...] * @returns {string} HTML */ function renderStages(stages) { if (!stages || !stages.length) return 'Нет данных об этапах'; let html = '
Этапы выполнения
'; stages.forEach(s => { const done = !!s.dtFinish; // этап завершён? const icon = done ? (s.isSuccessful ? '✅' : '❌') : '⏳'; const start = s.dtStart ? s.dtStart.replace('T',' ').substring(0,19) : '?'; const finish = s.dtFinish ? s.dtFinish.replace('T',' ').substring(0,19) : '...'; const dur = s.duration != null ? s.duration.toFixed(1) + ' сек' : '—'; html += `
`; html += `${icon} ${_esc(s.stage||'?')}`; html += `${start} → ${finish} (${dur})`; html += `
`; }); return html; }