const API_BASE = window.location.origin; let selectedVM = null; // Initialize dashboard document.addEventListener('DOMContentLoaded', () => { loadVMs(); loadISOsForSelect(); // Initialize sidebar state for mobile const sidebar = document.querySelector('.sidebar'); if (window.innerWidth <= 768) { sidebar.classList.add('hidden-mobile'); } // Create VM Form document.getElementById('createVMForm').addEventListener('submit', createVM); }); // Get badge class based on VM state function getStateClass(state) { switch (state) { case 'running': return 'badge-running'; case 'shut off': return 'badge-off'; case 'paused': return 'badge-paused'; case 'crashed': return 'badge-error'; default: return 'bg-light text-dark'; } } // Get icon for state function getStateIcon(state) { switch (state) { case 'running': return ''; case 'shut off': return ''; case 'paused': return ''; default: return ''; } } // Load VMs from API async function loadVMs() { try { const response = await fetch(`${API_BASE}/vms`); const data = await response.json(); const vmList = document.getElementById('vmList'); if (!data.vms || data.vms.length === 0) { vmList.innerHTML = '
No hay máquinas virtuales
'; return; } vmList.innerHTML = data.vms.map(vm => `Haz clic en una VM del panel lateral para ver sus detalles
Error: ${data.error}
`; return; } const snapshots = data.snapshots; if (!snapshots || snapshots.length === 0) { document.getElementById('snapshotsList').innerHTML = 'No hay snapshots disponibles
'; return; } let html = `| Nombre | Creado | Descripción | Estado | Acciones |
|---|---|---|---|---|
| ${snap.name} | ${created} | ${snap.description || '-'} | ${snap.state} |
Error: ${error.message}
`; } } // Delete snapshot with confirmation function deleteSnapshotConfirm(vmName, snapshotName) { if (confirm(`¿Estás seguro de que deseas eliminar el snapshot "${snapshotName}"?`)) { deleteSnapshot(vmName, snapshotName); } } // Delete snapshot async function deleteSnapshot(vmName, snapshotName) { try { const encodedSnapshotName = encodeURIComponent(snapshotName); const response = await fetch(`${API_BASE}/vms/${vmName}/snapshots/${encodedSnapshotName}`, { method: 'DELETE' }); const data = await response.json(); if (data.error) { alert(`Error: ${data.error}`); return; } alert(`✓ Snapshot "${snapshotName}" eliminado exitosamente`); // Recargar lista de snapshots loadSnapshotsList(vmName); } catch (error) { console.error('Error:', error); alert(`Error al eliminar snapshot: ${error.message}`); } }