Баг 1: удалённые сценарием инстансы показывались как 'creating'
— run_scenario() не вызывал tracker_remove после delete
— фикс: tracker_remove после успешного delete-шага
Баг 2: чёрный экран на вкладке Логи
— views.js копировал пустую log-panel
— фикс: прямая загрузка fetch('/api/log')
68 lines
3.2 KiB
JavaScript
68 lines
3.2 KiB
JavaScript
// views.js — переключение видов (Консоль / Обзор / История / Сценарии / Логи)
|
||
//
|
||
// Каждый вид — div.view с id="view-{name}".
|
||
// Активный вид — без класса .hidden.
|
||
// Все остальные — с классом .hidden (display: none).
|
||
//
|
||
// Переключение:
|
||
// switchView('overview') — Обзор (инфраструктура)
|
||
// switchView('console') — Консоль (ручной режим)
|
||
// switchView('history-view') — История (автозагрузка при открытии)
|
||
// switchView('scenarios-view') — Сценарии (автозагрузка)
|
||
// switchView('logs-view') — Логи (специальная обработка)
|
||
|
||
/**
|
||
* Переключиться на вид по его ID.
|
||
*
|
||
* @param {string} viewId — суффикс после "view-" (напр. "console" → #view-console)
|
||
*/
|
||
function switchView(viewId) {
|
||
// Скрыть ВСЕ виды
|
||
document.querySelectorAll('.view').forEach(v => v.classList.add('hidden'));
|
||
|
||
// Показать целевой вид
|
||
const target = document.getElementById('view-' + viewId);
|
||
if (target) target.classList.remove('hidden');
|
||
|
||
// Подсветка активного пункта в sidebar
|
||
document.querySelectorAll('.sidebar-item').forEach(el => el.classList.remove('active'));
|
||
const btn = document.querySelector('.sidebar-item[data-view="' + viewId + '"]');
|
||
if (btn) btn.classList.add('active');
|
||
|
||
// ── Автозагрузка при открытии вида ──
|
||
|
||
// История: автозагрузка только если ещё не загружена
|
||
if (viewId === 'history-view' && typeof toggleHistory === 'function') {
|
||
if (!historyOpen) toggleHistory();
|
||
}
|
||
|
||
// Сценарии: автозагрузка
|
||
if (viewId === 'scenarios-view' && typeof toggleScenario === 'function') {
|
||
if (!scenarioOpen) toggleScenario();
|
||
}
|
||
|
||
// Логи: прямая загрузка с API, не полагаемся на нижнюю панель
|
||
if (viewId === 'logs-view') {
|
||
const lvc = document.getElementById('log-view-content');
|
||
if (lvc) {
|
||
lvc.innerHTML = '<span style="color:#888;">Логи загружаются...</span>';
|
||
fetch('/api/log').then(r => r.json()).then(lines => {
|
||
if (lines.length) {
|
||
lvc.innerHTML = lines.map(l => `<div>${_esc(l)}</div>`).join('');
|
||
} else {
|
||
lvc.innerHTML = '<span style="color:#888;">Логов пока нет</span>';
|
||
}
|
||
}).catch(() => {
|
||
lvc.innerHTML = '<span style="color:#f88;">Ошибка загрузки логов</span>';
|
||
});
|
||
}
|
||
// Скрываем нижнюю лог-панель если была открыта
|
||
const lp = document.getElementById('log-panel');
|
||
if (lp) lp.style.display = 'none';
|
||
} else {
|
||
// На всех видах кроме логов — скрываем нижнюю лог-панель
|
||
const lp = document.getElementById('log-panel');
|
||
if (lp) lp.style.display = 'none';
|
||
}
|
||
}
|