refator_comm1

This commit is contained in:
Mateusz Gruszczyński
2025-10-18 23:25:51 +02:00
parent 2e32309f3c
commit 807596c931

View File

@@ -170,53 +170,45 @@ export async function startAdminWatches() {
safe(r.name), safe(r.name),
safe(r.node), safe(r.node),
badge(safe(r.status), /running|online|started/i.test(r.status) ? 'ok' : 'dark'), badge(safe(r.status), /running|online|started/i.test(r.status) ? 'ok' : 'dark'),
`<div class="btn-group"> `<div class=\"btn-group\">
<button class="btn btn-sm btn-success act-start">Start</button> <button class=\"btn btn-sm btn-outline-light act-start\">Start</button>
<button class="btn btn-sm btn-outline-secondary act-shutdown">Shutdown</button> <button class=\"btn btn-sm btn-outline-light act-shutdown\">Shutdown</button>
<button class="btn btn-sm btn-outline-danger act-stop">Stop</button> <button class=\"btn btn-sm btn-outline-light act-stop\">Stop</button>
<button class="btn btn-sm btn-warning act-unlock">Unlock</button> <button class=\"btn btn-sm btn-outline-light act-unlock\">Unlock</button>
</div>`, </div>`,
`<select class="form-select form-select-sm target-node"></select>`, `<select class=\"form-select form-select-sm target-node position-relative\"></select>`,
`<button class="btn btn-sm btn-primary w-100 act-migrate" disabled>MIGRATE</button>` `<button class=\"btn btn-sm btn-outline-light w-100 act-migrate\" disabled>MIGRATE</button>`
])); ]));
setRows(tbody, htmlRows); setRows(tbody, htmlRows);
// wire per-row // wire per-row
Array.from(tbody.querySelectorAll('tr[data-sid]')).forEach(function(tr){ // (replaced by delegated handler below)
const nodeCell = tr.children[3];
const targetSel = qSel(tr, '.target-node');
const currentNode = text(nodeCell).trim();
rebuildTargetSelect(targetSel, currentNode, availableNodes);
updateMigrateButton(tr, /running|online|started/i.test(tr.children[4].innerText));
// delegated events for reliability
tbody.addEventListener('click', async function(ev){
const t = ev.target;
const tr = t && t.closest ? t.closest('tr[data-sid]') : null;
if (!tr) return;
const sid = tr.getAttribute('data-sid'); const sid = tr.getAttribute('data-sid');
const nameCell = tr.children[2]; const nameCell = tr.children[2];
const targetSel = tr.querySelector('.target-node');
async function doAction(kind, needsTarget) { async function doAction(kind, needsTarget) {
try { try {
const targetNode = needsTarget ? val(targetSel) : undefined; const targetNode = needsTarget ? (targetSel ? targetSel.value : undefined) : undefined;
activeSids.add(sid); activeSids.add(sid);
setBadgeCell(tr.children[4], 'working'); setBadgeCell(tr.children[4], 'working');
updateMigrateButton(tr, false); updateMigrateButton(tr, false);
const res = await api.vmAction(sid, kind, targetNode); const res = await api.vmAction(sid, kind, targetNode);
if (res && res.ok) { if (res && res.ok) { showToast(`Task ${kind} started for ${safe(nameCell.textContent)}`); }
showToast(`Task ${kind} started for ${safe(text(nameCell))}`); else { showToast(`Task ${kind} failed for ${safe(nameCell.textContent)}`, 'danger'); }
} else { } catch(e) { showToast(`Error: ${e && e.message ? e.message : e}`, 'danger'); }
showToast(`Task ${kind} failed for ${safe(text(nameCell))}`, 'danger');
}
} catch (e) {
showToast(`Error: ${e && e.message ? e.message : e}`, 'danger');
}
} }
if (t.matches && t.matches('.act-start')) return doAction('start');
const bStart = qSel(tr, '.act-start'); if (bStart) bStart.addEventListener('click', function(){ doAction('start'); }); if (t.matches && t.matches('.act-stop')) return doAction('stop');
const bStop = qSel(tr, '.act-stop'); if (bStop) bStop.addEventListener('click', function(){ doAction('stop'); }); if (t.matches && t.matches('.act-shutdown')) return doAction('shutdown');
const bShut = qSel(tr, '.act-shutdown'); if (bShut) bShut.addEventListener('click', function(){ doAction('shutdown'); }); if (t.matches && t.matches('.act-unlock')) return doAction('unlock');
const bUnl = qSel(tr, '.act-unlock'); if (bUnl) bUnl.addEventListener('click', function(){ doAction('unlock'); }); if (t.matches && t.matches('.act-migrate')) return doAction('migrate', true);
const bMig = qSel(tr, '.act-migrate'); if (bMig) bMig.addEventListener('click', function(){ doAction('migrate', true); });
ensureWatchOn();
}); });
window.__nodesCache = availableNodes.slice(); window.__nodesCache = availableNodes.slice();