// app.js — загрузчик и точка входа фронтенда // // Файлы подгружаются в index.html в СТРОГОМ порядке зависимостей: // utils.js → instances.js → operations.js → history.js → scenario-list.js // scenario-form.js → params-render.js → scenario-create/edit/delete.js // icons.js, snackbar.js, views.js — без зависимостей // // Глобальные переменные из Jinja2 (window.APP): // { version, stand, hasUserToken, firstServiceId } /* * Архитектура фронтенда — ванильный JS (без фреймворков). * Модули по файлам, функции в глобальной области видимости: * * utils.js — _esc(), validateJson(), busy, relativeTime(), лог-панель * instances.js — selectService(), toggleInstance(), refreshInstances() * operations.js — startCreate(), runOp(), showParams(), executeOp(), poll * history.js — toggleHistory(), loadHistory() * scenario-list.js — toggleScenario(), loadScenarios(), runScenario() * scenario-form.js — showScenarioEditor(), renderEditor(), saveScenario() * params-render.js — renderParamRow(), renderMapFixedRow(), collectParams() * icons.js — ICONS = {play, edit, trash, ...} (inline-SVG) * snackbar.js — showSnackbar(msg, type) * views.js — switchView(viewId) */ // ── Инициализация при загрузке страницы ── // Запускаем поллинг логов (каждые 2 секунды, только если панель видна) startLogPoll(); // Выбираем первый сервис из переданного Jinja2 значения // currentSvcId берётся из window.APP.firstServiceId (задаётся в index.html) selectService(currentSvcId);