// 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+=`
| ${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':'-'} |
`;
// Скрытая строка с этапами (раскрывается по клику)
html+=`| ${renderStages(r.stages)} |
`;
});
html+='
';
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;
}