fasthost / templates /dashboard.html
chipling's picture
Upload 26 files
65d3b67 verified
raw
history blame
2.93 kB
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>FastHost Dashboard</title>
<style>
body {
font-family: Arial, sans-serif;
background: #f8f9fa;
padding: 20px;
}
h1 {
color: #343a40;
}
.card {
background: white;
padding: 15px;
margin: 10px 0;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.buttons button {
margin-right: 5px;
}
pre {
background: #e9ecef;
padding: 10px;
max-height: 200px;
overflow-y: auto;
}
</style>
</head>
<body>
<h1>πŸš€ FastHost Dashboard</h1>
<div id="projects"></div>
<script>
async function fetchProjects() {
const res = await fetch('/projects');
const data = await res.json();
const container = document.getElementById('projects');
container.innerHTML = '';
data.forEach(proj => {
const card = document.createElement('div');
card.className = 'card';
card.innerHTML = `
<h3>${proj.name}</h3>
<p>Status: <b>${proj.status}</b></p>
<p>Public URL: <a href="${proj.public_url}" target="_blank">${proj.public_url}</a></p>
<p>Local URL: <a href="${proj.local_url}" target="_blank">${proj.local_url}</a></p>
<div class="buttons">
<button onclick="stopProject('${proj.container_name}')">πŸ›‘ Stop</button>
<button onclick="startProject('${proj.container_name}')">▢️ Start</button>
<button onclick="pauseProject('${proj.container_name}')">⏸️ Pause</button>
<button onclick="toggleLogs('${proj.container_name}')">πŸ“œ View Logs</button>
</div>
<pre id="log-${proj.container_name}" style="display:none"></pre>
`;
container.appendChild(card);
});
}
async function stopProject(containerName) {
await fetch(`/controls/stop/${containerName}`);
fetchProjects();
}
async function startProject(containerName) {
await fetch(`/controls/start/${containerName}`);
fetchProjects();
}
async function pauseProject(containerName) {
await fetch(`/controls/pause/${containerName}`);
fetchProjects();
}
function toggleLogs(containerName) {
const pre = document.getElementById(`log-${containerName}`);
if (pre.style.display === 'none') {
pre.style.display = 'block';
fetchLogs(containerName, pre);
} else {
pre.style.display = 'none';
}
}
async function fetchLogs(containerName, target) {
const res = await fetch(`/logs/fetch/${containerName}`);
const logs = await res.text();
target.innerHTML = logs;
}
fetchProjects();
setInterval(fetchProjects, 5000); // Refresh every 5 seconds
</script>
</body>
</html>