Untitled
unknown
plain_text
a year ago
5.5 kB
6
Indexable
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Smart Office Control</title>
<style>
body { font-family: Arial, sans-serif; background-color: #2e2e2e; color: #e0e0e0; margin: 0; padding: 0; }
header { background-color: #3c3c3c; color: white; text-align: center; padding: 1rem; }
main { max-width: 800px; margin: auto; padding: 1rem; }
.card { background: #393939; padding: 1rem; border-radius: 8px; margin-bottom: 1rem; }
.device-grid { display: grid; gap: 1rem; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); }
button { padding: 0.5rem; border: none; border-radius: 5px; cursor: pointer; background-color: #5e5e5e; color: white; }
button:hover { background-color: #707070; }
.status { padding: 0.2rem 0.5rem; border-radius: 5px; display: inline-block; color: white; }
.status.online { background-color: #4caf50; }
.status.offline { background-color: #f44336; }
</style>
</head>
<body>
<header>
<h1>Smart Office Control</h1>
</header>
<main>
<div class="card">
<h2>Add Device</h2>
<form id="add-form">
<select name="device" id="device">
<option disabled>Loading devices...</option>
</select>
<input type="text" name="name" placeholder="Custom Name" required>
<button type="submit">Add Device</button>
</form>
</div>
<div class="card">
<h2>Saved Devices</h2>
<div id="device-list" class="device-grid"></div>
</div>
</main>
<script>
function updateDevices() {
fetch("/api/pcs")
.then(response => response.json())
.then(data => {
const deviceList = document.getElementById("device-list");
const deviceDropdown = document.getElementById("device");
deviceList.innerHTML = "";
deviceDropdown.innerHTML = ""; // Clear previous entries
// Update available devices
if (data.available.length === 0) {
const option = document.createElement("option");
option.textContent = "No devices found";
option.disabled = true;
deviceDropdown.appendChild(option);
} else {
data.available.forEach(device => {
const option = document.createElement("option");
option.value = `${device.ip}|${device.mac}`;
option.textContent = `${device.name} (${device.ip} - ${device.mac})`;
deviceDropdown.appendChild(option);
});
}
// Update saved devices
data.saved.forEach(pc => {
const div = document.createElement("div");
div.className = "card";
div.innerHTML = `
<h4>${pc.name}</h4>
<p>IP: ${pc.ip}</p>
<p>MAC: ${pc.mac}</p>
<p>Status: <span class="status ${pc.status === 'Online' ? 'online' : 'offline'}">${pc.status}</span></p>
<p>Uptime: ${pc.uptime_start ? formatUptime(pc.uptime_start) : "n/a"}</p>
<button onclick="wake('${pc.mac}')">Wake</button>
<button onclick="confirmDelete('${pc.name}')">Delete</button>
`;
deviceList.appendChild(div);
});
})
.catch(error => {
console.error("Error fetching devices:", error);
});
}
function formatUptime(startTime) {
const now = Math.floor(Date.now() / 1000);
const diff = now - startTime;
const hours = Math.floor(diff / 3600);
const minutes = Math.floor((diff % 3600) / 60);
const seconds = diff % 60;
return `${hours}h ${minutes}m ${seconds}s`;
}
function wake(mac) {
fetch("/wake", { method: "POST", body: new URLSearchParams({ mac }) })
.then(response => response.json())
.then(data => {
alert(data.message || "Error waking device");
updateDevices();
});
}
function confirmDelete(name) {
if (confirm(`Are you sure you want to delete the device "${name}"?`)) {
deletePC(name);
}
}
function deletePC(name) {
fetch("/delete", { method: "POST", body: new URLSearchParams({ name }) })
.then(() => updateDevices());
}
document.getElementById("add-form").addEventListener("submit", function (e) {
e.preventDefault();
const formData = new FormData(e.target);
fetch("/add", { method: "POST", body: new URLSearchParams(formData) })
.then(() => updateDevices());
});
updateDevices();
setInterval(updateDevices, 10000); // Update every 10 seconds
</script>
</body>
</html>Editor is loading...
Leave a Comment