mirror of
https://github.com/wkulhanek/bonob.git
synced 2025-12-22 01:43:29 +01:00
Add BNB_TOKEN_CLEANUP_INTERVAL variable and re-design login page
This commit is contained in:
@@ -1,6 +1,12 @@
|
||||
<% layout('./layout', { title: it.lang("failure") }) %>
|
||||
|
||||
<div id="content">
|
||||
<h1 class="failure"><%= it.message %></h1>
|
||||
<h1 class="cause"><%= it.cause || "" %></h1>
|
||||
<div class="message-container">
|
||||
<div class="logo">✗</div>
|
||||
<h1><%= it.message %></h1>
|
||||
<% if (it.cause) { %>
|
||||
<p style="color: #dc3545; margin-top: 15px;"><%= it.cause %></p>
|
||||
<% } %>
|
||||
<p style="color: #dc3545; font-weight: 600; margin-top: 10px;"><%= it.lang("failure") %></p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,45 +1,61 @@
|
||||
<% layout('./layout') %>
|
||||
|
||||
<div id="content">
|
||||
<div width="100%" style="text-align:right;color:grey"><%= it.version %></div>
|
||||
<h1><%= it.bonobService.name %> (<%= it.bonobService.sid %>)</h1>
|
||||
<h3><%= it.lang("expectedConfig") %></h3>
|
||||
<div><%= JSON.stringify(it.bonobService) %></div>
|
||||
<br/>
|
||||
<div id="content" class="index-content">
|
||||
<div style="text-align:right;color:#999;font-size:0.85rem;margin-bottom:20px"><%= it.version %></div>
|
||||
<div class="logo">🎵</div>
|
||||
<h1><%= it.bonobService.name %></h1>
|
||||
<p style="color:#999;margin-bottom:30px">Service ID: <%= it.bonobService.sid %></p>
|
||||
|
||||
<% if(it.devices.length > 0) { %>
|
||||
<form action="<%= it.createRegistrationRoute %>" method="POST">
|
||||
<input type="submit" value="<%= it.lang("register") %>">
|
||||
<form action="<%= it.createRegistrationRoute %>" method="POST" style="margin-bottom:30px">
|
||||
<input type="submit" value="<%= it.lang("register") %>" id="submit">
|
||||
</form>
|
||||
<br/>
|
||||
<% } else { %>
|
||||
<h3><%= it.lang("noSonosDevices") %></h3>
|
||||
<br/>
|
||||
<p style="color:#dc3545;font-weight:600;margin:30px 0"><%= it.lang("noSonosDevices") %></p>
|
||||
<% } %>
|
||||
|
||||
<% if(it.registeredBonobService) { %>
|
||||
<h3><%= it.lang("existingServiceConfig") %></h3>
|
||||
<div><%= JSON.stringify(it.registeredBonobService) %></div>
|
||||
<div style="margin:20px 0;padding:15px;background:#f8f9fa;border-radius:8px">
|
||||
<h3 style="font-size:1.1rem;margin-bottom:10px;color:#667eea"><%= it.lang("existingServiceConfig") %></h3>
|
||||
<pre style="font-size:0.85rem;text-align:left;overflow-x:auto"><%= JSON.stringify(it.registeredBonobService, null, 2) %></pre>
|
||||
</div>
|
||||
<% } else { %>
|
||||
<h3><%= it.lang("noExistingServiceRegistration") %></h3>
|
||||
<p style="color:#999;margin:20px 0"><%= it.lang("noExistingServiceRegistration") %></p>
|
||||
<% } %>
|
||||
|
||||
<% if(it.registeredBonobService) { %>
|
||||
<br/>
|
||||
<form action="<%= it.removeRegistrationRoute %>" method="POST">
|
||||
<input type="submit" value="<%= it.lang("removeRegistration") %>">
|
||||
<form action="<%= it.removeRegistrationRoute %>" method="POST" style="margin:20px 0">
|
||||
<input type="submit" value="<%= it.lang("removeRegistration") %>" id="submit" style="background:#dc3545">
|
||||
</form>
|
||||
<% } %>
|
||||
|
||||
<br/>
|
||||
<h2><%= it.lang("devices") %> (<%= it.devices.length %>)</h2>
|
||||
<ul>
|
||||
<% it.devices.forEach(function(d){ %>
|
||||
<li><%= d.name %> (<%= d.ip %>:<%= d.port %>)</li>
|
||||
<% }) %>
|
||||
</ul>
|
||||
<h2><%= it.lang("services") %> (<%= it.services.length %>)</h2>
|
||||
<ul>
|
||||
<% it.services.forEach(function(s){ %>
|
||||
<li><%= s.name %> (<%= s.sid %>)</li>
|
||||
<% }) %>
|
||||
</ul>
|
||||
<div style="margin-top:40px;padding-top:30px;border-top:2px solid #e0e0e0">
|
||||
<h2 style="font-size:1.5rem;margin-bottom:15px"><%= it.lang("devices") %> (<%= it.devices.length %>)</h2>
|
||||
<% if(it.devices.length > 0) { %>
|
||||
<ul style="list-style:none;text-align:left;padding:0">
|
||||
<% it.devices.forEach(function(d){ %>
|
||||
<li style="padding:10px;margin:5px 0;background:#f8f9fa;border-radius:6px">
|
||||
<strong><%= d.name %></strong> <span style="color:#999">(<%= d.ip %>:<%= d.port %>)</span>
|
||||
</li>
|
||||
<% }) %>
|
||||
</ul>
|
||||
<% } else { %>
|
||||
<p style="color:#999">No devices found</p>
|
||||
<% } %>
|
||||
</div>
|
||||
|
||||
<div style="margin-top:30px">
|
||||
<h2 style="font-size:1.5rem;margin-bottom:15px"><%= it.lang("services") %> (<%= it.services.length %>)</h2>
|
||||
<% if(it.services.length > 0) { %>
|
||||
<ul style="list-style:none;text-align:left;padding:0">
|
||||
<% it.services.forEach(function(s){ %>
|
||||
<li style="padding:10px;margin:5px 0;background:#f8f9fa;border-radius:6px">
|
||||
<strong><%= s.name %></strong> <span style="color:#999">(SID: <%= s.sid %>)</span>
|
||||
</li>
|
||||
<% }) %>
|
||||
</ul>
|
||||
<% } else { %>
|
||||
<p style="color:#999">No services registered</p>
|
||||
<% } %>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,46 +1,189 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title><%= it.title || "bonob" %></title>
|
||||
<style>
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: -apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif;
|
||||
}
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
|
||||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
div#content {
|
||||
margin: auto;
|
||||
width: 60%;
|
||||
background: white;
|
||||
border-radius: 20px;
|
||||
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
|
||||
padding: 50px 40px;
|
||||
max-width: 450px;
|
||||
width: 100%;
|
||||
animation: slideIn 0.5s ease-out;
|
||||
}
|
||||
|
||||
@keyframes slideIn {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(-30px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 700%;
|
||||
font-size: 2.5rem;
|
||||
font-weight: 700;
|
||||
color: #333;
|
||||
text-align: center;
|
||||
margin-bottom: 40px;
|
||||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
background-clip: text;
|
||||
}
|
||||
|
||||
form {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 25px;
|
||||
}
|
||||
|
||||
.form-group {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
label {
|
||||
font-size: 300%;
|
||||
font-size: 0.95rem;
|
||||
font-weight: 600;
|
||||
color: #555;
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
input {
|
||||
font-size: 300%;
|
||||
width: 80%;
|
||||
input[type="text"],
|
||||
input[type="password"] {
|
||||
width: 100%;
|
||||
padding: 15px 20px;
|
||||
font-size: 1rem;
|
||||
border: 2px solid #e0e0e0;
|
||||
border-radius: 12px;
|
||||
transition: all 0.3s ease;
|
||||
background: #f8f9fa;
|
||||
}
|
||||
|
||||
input[type="text"]:focus,
|
||||
input[type="password"]:focus {
|
||||
outline: none;
|
||||
border-color: #667eea;
|
||||
background: white;
|
||||
box-shadow: 0 0 0 4px rgba(102, 126, 234, 0.1);
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
|
||||
input#submit {
|
||||
margin-top: 100px
|
||||
width: 100%;
|
||||
padding: 16px;
|
||||
font-size: 1.1rem;
|
||||
font-weight: 600;
|
||||
color: white;
|
||||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
border: none;
|
||||
border-radius: 12px;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
margin-top: 10px;
|
||||
box-shadow: 0 4px 15px rgba(102, 126, 234, 0.4);
|
||||
}
|
||||
|
||||
.one-word-per-line {
|
||||
word-spacing: 100000px;
|
||||
input#submit:hover {
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 6px 20px rgba(102, 126, 234, 0.5);
|
||||
}
|
||||
|
||||
.login{
|
||||
width: min-intrinsic;
|
||||
width: -webkit-min-content;
|
||||
width: -moz-min-content;
|
||||
width: min-content;
|
||||
display: table-caption;
|
||||
display: -ms-grid;
|
||||
-ms-grid-columns: min-content;
|
||||
input#submit:active {
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
.logo {
|
||||
text-align: center;
|
||||
margin-bottom: 20px;
|
||||
font-size: 3rem;
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
/* Success and failure page styles */
|
||||
.message-container {
|
||||
text-align: center;
|
||||
padding: 20px 0;
|
||||
}
|
||||
|
||||
.message-container h1 {
|
||||
font-size: 2rem;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.message-container p {
|
||||
font-size: 1.1rem;
|
||||
color: #666;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
/* Index page styles */
|
||||
.index-content {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.index-content h1 {
|
||||
font-size: 2.5rem;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.index-content p {
|
||||
font-size: 1.1rem;
|
||||
color: #666;
|
||||
line-height: 1.8;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.index-content a {
|
||||
color: #667eea;
|
||||
text-decoration: none;
|
||||
font-weight: 600;
|
||||
transition: color 0.3s ease;
|
||||
}
|
||||
|
||||
.index-content a:hover {
|
||||
color: #764ba2;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* Responsive design */
|
||||
@media (max-width: 500px) {
|
||||
div#content {
|
||||
padding: 40px 30px;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 2rem;
|
||||
}
|
||||
|
||||
input[type="text"],
|
||||
input[type="password"] {
|
||||
padding: 12px 16px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
@@ -1,12 +1,17 @@
|
||||
<% layout('./layout', { title: it.lang("login") }) %>
|
||||
|
||||
<div id="content">
|
||||
<h1 class="login one-word-per-line"><%= it.lang("logInToBonob") %></h1>
|
||||
<div class="logo">🎵</div>
|
||||
<h1><%= it.lang("logInToBonob") %></h1>
|
||||
<form action="<%= it.loginRoute %>" method="POST">
|
||||
<label for="username"><%= it.lang("username") %>:</label><br>
|
||||
<input type="text" id="username" name="username"><br><br>
|
||||
<label for="password"><%= it.lang("password") %>:</label><br>
|
||||
<input type="password" id="password" name="password"><br>
|
||||
<div class="form-group">
|
||||
<label for="username"><%= it.lang("username") %></label>
|
||||
<input type="text" id="username" name="username" required autofocus>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="password"><%= it.lang("password") %></label>
|
||||
<input type="password" id="password" name="password" required>
|
||||
</div>
|
||||
<input type="hidden" name="linkCode" value="<%= it.linkCode %>">
|
||||
<input type="submit" value="<%= it.lang("login") %>" id="submit">
|
||||
</form>
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
<% layout('./layout', { title: it.lang("success") }) %>
|
||||
|
||||
<div id="content">
|
||||
<h1 class="success"><%= it.message %></h1>
|
||||
<div class="message-container">
|
||||
<div class="logo">✓</div>
|
||||
<h1><%= it.message %></h1>
|
||||
<p style="color: #28a745; font-weight: 600; margin-top: 10px;"><%= it.lang("success") %></p>
|
||||
</div>
|
||||
</div>
|
||||
Reference in New Issue
Block a user