249 lines
8.0 KiB
HTML
249 lines
8.0 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>MBC rc boatjes - commander</title>
|
|
<style>
|
|
* {
|
|
--background: #000000;
|
|
--background-second: #222222;
|
|
--foreground: #CCCCCC;
|
|
}
|
|
body {
|
|
background-color: var(--background);
|
|
color: var(--foreground);
|
|
}
|
|
.login {
|
|
position: fixed;
|
|
top: 50px;
|
|
right: 50px;
|
|
bottom: 50px;
|
|
left: 50px;
|
|
background-color: var(--background-second);
|
|
text-align: center;
|
|
padding: calc(50vh - 150px) 50px;
|
|
height: 200px;
|
|
}
|
|
.btn {
|
|
padding: 10px 20px;
|
|
background-color: #808080;
|
|
cursor: pointer;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="login">
|
|
<input id="pass" type="password" value="1234" />
|
|
<button id="login">login</button>
|
|
</div>
|
|
<main>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>id</th>
|
|
<th>naam</th>
|
|
<th>status</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody id="boatjes"></tbody>
|
|
</table>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>id</th>
|
|
<th>boat</th>
|
|
<th>status</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody id="clients"></tbody>
|
|
</table>
|
|
</main>
|
|
<script>
|
|
const passEl = document.getElementById('pass');
|
|
const loginEl = document.getElementById('login');
|
|
const boatjesEl = document.getElementById('boatjes');
|
|
const clientsEl = document.getElementById('clients');
|
|
|
|
const kickIcon = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-slash-circle\" viewBox=\"0 0 16 16\"><path d=\"M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16\"/><path d=\"M11.354 4.646a.5.5 0 0 0-.708 0l-6 6a.5.5 0 0 0 .708.708l6-6a.5.5 0 0 0 0-.708\"/></svg>";
|
|
const openIcon = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-key\" viewBox=\"0 0 16 16\"><path d=\"M0 8a4 4 0 0 1 7.465-2H14a.5.5 0 0 1 .354.146l1.5 1.5a.5.5 0 0 1 0 .708l-1.5 1.5a.5.5 0 0 1-.708 0L13 9.207l-.646.647a.5.5 0 0 1-.708 0L11 9.207l-.646.647a.5.5 0 0 1-.708 0L9 9.207l-.646.647A.5.5 0 0 1 8 10h-.535A4 4 0 0 1 0 8m4-3a3 3 0 1 0 2.712 4.285A.5.5 0 0 1 7.163 9h.63l.853-.854a.5.5 0 0 1 .708 0l.646.647.646-.647a.5.5 0 0 1 .708 0l.646.647.646-.647a.5.5 0 0 1 .708 0l.646.647.793-.793-1-1h-6.63a.5.5 0 0 1-.451-.285A3 3 0 0 0 4 5\"/><path d=\"M4 8a1 1 0 1 1-2 0 1 1 0 0 1 2 0\"/></svg>";
|
|
const lockIcon = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-lock\" viewBox=\"0 0 16 16\"><path d=\"M8 1a2 2 0 0 1 2 2v4H6V3a2 2 0 0 1 2-2m3 6V3a3 3 0 0 0-6 0v4a2 2 0 0 0-2 2v5a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2M5 8h6a1 1 0 0 1 1 1v5a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V9a1 1 0 0 1 1-1\"/></svg>";
|
|
|
|
const serverURL = 'ws://10.254.0.1:8080/';
|
|
|
|
var conn = false;
|
|
|
|
loginEl.addEventListener('click', login);
|
|
|
|
function login(e)
|
|
{
|
|
if (conn) conn.close();
|
|
conn = new WebSocket(serverURL, ['mbcRcRf']);
|
|
conn.addEventListener('open', onOpen);
|
|
conn.addEventListener('message', onMessage);
|
|
}
|
|
|
|
function onOpen(e)
|
|
{
|
|
conn.send(passEl.value + ";4675;" + Math.floor(new Date().getTime()/1000.0));
|
|
reqBoats();
|
|
reqClients();
|
|
}
|
|
|
|
function onMessage(e)
|
|
{
|
|
console.log("recive: ", e.data);
|
|
let msg = e.data.split(':')
|
|
let data = msg[0];
|
|
msg.splice(0, 1);
|
|
msg = msg.join(':');
|
|
switch (data)
|
|
{
|
|
case 'boats':
|
|
addBoats(msg);
|
|
passEl.parentElement.style.display = 'none';
|
|
break;
|
|
case 'clients':
|
|
addClients(msg);
|
|
break;
|
|
default:
|
|
console.warn('onMessage(): invlid data type (' + data + ')');
|
|
break;
|
|
}
|
|
}
|
|
|
|
function reqBoats()
|
|
{
|
|
conn.send(passEl.value + ";boats");
|
|
}
|
|
|
|
function reqClients()
|
|
{
|
|
conn.send(passEl.value + ";clients");
|
|
}
|
|
|
|
function addBoats(boats)
|
|
{
|
|
boatjesEl.innerHTML = "";
|
|
boats = boats.split(':');
|
|
for (let boat in boats)
|
|
{
|
|
if (boats[boat] != "")
|
|
{
|
|
addBoat(boats[boat]);
|
|
}
|
|
}
|
|
}
|
|
|
|
function addBoat(boat)
|
|
{
|
|
boat = boat.split(';')
|
|
if (boat.length == 3)
|
|
{
|
|
let boatRow = document.createElement("tr");
|
|
boatRow.className = "boat";
|
|
boatRow.dataset['id'] = boat[0];
|
|
boatRow.dataset['name'] = boat[1];
|
|
boatRow.dataset['state'] = boat[2];
|
|
let boatCells = [
|
|
document.createElement("td"),
|
|
document.createElement("td"),
|
|
document.createElement("td"),
|
|
document.createElement("td")
|
|
]
|
|
boatCells[0].innerText = boat[0];
|
|
boatCells[1].innerText = boat[1];
|
|
boatCells[2].innerText = boat[2];
|
|
let lockBtn = document.createElement("div");
|
|
lockBtn.className = "btn";
|
|
if (boatRow.dataset['state'] == "locked")
|
|
{
|
|
lockBtn.innerHTML = openIcon;
|
|
lockBtn.addEventListener('click', unlockBoat);
|
|
}
|
|
else
|
|
{
|
|
lockBtn.innerHTML = lockIcon;
|
|
lockBtn.addEventListener('click', lockBoat);
|
|
}
|
|
boatCells[3].append(lockBtn);
|
|
for (cell in boatCells)
|
|
{
|
|
boatRow.append(cell);
|
|
}
|
|
boatjesEl.append(boatRow);
|
|
}
|
|
else
|
|
{
|
|
console.warn("addBoat(): incorect number of args (" + boat.length.toString() + "; " + boat.toString() + ")");
|
|
}
|
|
}
|
|
|
|
function addClients(clients)
|
|
{
|
|
clientsEl.innerHTML = "";
|
|
clients = clients.split(':');
|
|
for (let client in clients)
|
|
{
|
|
if (clients[client] != "")
|
|
{
|
|
addClient(clients[client]);
|
|
}
|
|
}
|
|
}
|
|
|
|
function kickClient(e)
|
|
{
|
|
console.log("kickClient", e);
|
|
// conn.send(passEl.value + ";kick;" + client);
|
|
}
|
|
|
|
function unlockBoat(e)
|
|
{
|
|
console.log("unlockBoat", e);
|
|
// conn.send(passEl.value + ";kick;" + client);
|
|
}
|
|
|
|
function lockBoat(e)
|
|
{
|
|
console.log("lockBoat", e);
|
|
// conn.send(passEl.value + ";kick;" + client);
|
|
}
|
|
|
|
function addClient(client)
|
|
{
|
|
client = client.split(';')
|
|
if (client.length == 3)
|
|
{
|
|
let clientRow = document.createElement("tr");
|
|
clientRow.className = "client";
|
|
clientRow.dataset['id'] = client[0];
|
|
clientRow.dataset['boat'] = client[1];
|
|
clientRow.dataset['state'] = client[2];
|
|
let clientCells = [
|
|
document.createElement("td"),
|
|
document.createElement("td"),
|
|
document.createElement("td"),
|
|
document.createElement("td")
|
|
]
|
|
clientCells[0].innerText = client[0];
|
|
clientCells[1].innerText = client[1];
|
|
clientCells[2].innerText = client[2];
|
|
let kickBtn = document.createElement("div");
|
|
kickBtn.className = "btn";
|
|
kickBtn.innerHTML = kickIcon;
|
|
kickBtn.addEventListener('click', kickClient);
|
|
clientCells[3].append(kickBtn);
|
|
for (cell in clientCells)
|
|
{
|
|
clientRow.append(cell);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
console.warn("addClient(): incorect number of args (" + client.length.toString() + "; " + client.toString() + ")");
|
|
}
|
|
}
|
|
</script>
|
|
</body>
|
|
</html> |