// instances.js — список инстансов, выбор сервиса, toggle операций
//
// Отвечает за:
// - Загрузку инстансов выбранного сервиса (GET /api/operations/{svcId})
// - Отображение списка инстансов с фильтром autotest-
// - Показ доступных операций для выбранного инстанса
// - Кнопки операций (modify, delete, suspend, resume, redeploy)
//
// Глобальные переменные (используются в operations.js и других модулях):
// svcInstances[] — текущий список инстансов
// selectedInst — UUID выбранного инстанса (или null)
// selectedOp — {opId, opName, svcId} текущая выбранная операция
// currentSvcId — ID текущего сервиса
// currentSvcName — имя текущего сервиса
// currentSvcShort — короткое имя (для генерации displayName)
// busy — флаг блокировки UI (пока идёт операция)
// AUTOTEST_PREFIX — "autotest-" (фильтр "наших" инстансов)
let svcInstances=[], selectedInst=null, selectedOp=null;
let currentSvcId=(window.APP&&window.APP.firstServiceId)||1;
let currentSvcName='';
let currentSvcShort='';
let busy=false;
const AUTOTEST_PREFIX='autotest-';
/**
* Выбрать сервис — загрузить его инстансы и показать в списке.
* Вызывается при клике на сервис в левой панели.
*
* @param {number} svcId — ID сервиса
*/
async function selectService(svcId){
if(busy) return; // блокировка — идёт операция
// Сброс предыдущего состояния
currentSvcId=svcId;
selectedInst=null;
selectedOp=null;
stopPoll(); // остановить поллинг предыдущей операции
// Скрыть панель параметров и этапы
document.getElementById('params-area').style.display='none';
document.querySelectorAll('.stages-box').forEach(e=>e.remove());
// Подсветка активного сервиса в списке
document.querySelectorAll('.svc-item').forEach(e=>e.classList.remove('active'));
const svcEl=document.querySelector(`.svc-item[onclick*="${svcId}"]`);
if(svcEl) svcEl.classList.add('active');
try{
// GET /api/operations/{svcId} — возвращает операции + autotest-инстансы
const r=await fetch('/api/operations/'+svcId);
const d=await r.json();
svcInstances=d.instances||[];
currentSvcName=d.svc||'';
currentSvcShort=d.svcShort||'';
// Обновить текст кнопки «Создать»
const btnSpan=document.querySelector('#create-btn-area span');
if(btnSpan) btnSpan.textContent='+ Создать новый инстанс '+(currentSvcName||'сервиса');
renderInstances(); // отрисовать список
}catch(e){
document.getElementById('inst-list').innerHTML=
'Ошибка загрузки';
}
}
/**
* Отрисовать список инстансов в #inst-list.
* Каждый инстанс — строка: имя + сервис + статус + created + modified.
*/
function renderInstances(){
let html='';
svcInstances.forEach(i=>{
// Статус: из нашего поля status (cloud-first) или explainedStatus
const status=i.status||i.explainedStatus||'?';
const sc=status==='running'?'badge-success':'';
// Строка инстанса — кликабельна
html+=`