refator_comm1
This commit is contained in:
@@ -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();
|
||||||
|
Reference in New Issue
Block a user