Semi functional client webUI
- can update client info for sure - Working on notifications now
This commit is contained in:
@@ -1,11 +1,167 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title><%= title %></title>
|
||||
<link rel='stylesheet' href='/stylesheets/style.css' />
|
||||
</head>
|
||||
<body>
|
||||
<h1><%= title %></h1>
|
||||
<p>Welcome to <%= title %></p>
|
||||
</body>
|
||||
</html>
|
||||
<html lang="en" data-bs-theme="auto">
|
||||
|
||||
<head>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Bootstrap demo</title>
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet"
|
||||
integrity="sha384-9ndCyUaIbzAi2FUVXJi0CjmCapSmO7SnpJef0486qhLnuZ2cdeRhO02iuK6FUUVM" crossorigin="anonymous">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.3.0/font/bootstrap-icons.css">
|
||||
<link rel="stylesheet" href="/res/css/main.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<%- include('partials/navbar.ejs') %>
|
||||
<div aria-live="polite" aria-atomic="true" class="position-relative">
|
||||
<!-- Position it: -->
|
||||
<!-- - `.toast-container` for spacing between toasts -->
|
||||
<!-- - `top-0` & `end-0` to position the toasts in the upper right corner -->
|
||||
<!-- - `.p-3` to prevent the toasts from sticking to the edge of the container -->
|
||||
<div class="toast-container top-0 end-0 p-3 max" id="toastZone">
|
||||
</div>
|
||||
</div>
|
||||
<div class="container">
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<p>
|
||||
<span class="fs-2 fw-semibold">
|
||||
Node Details
|
||||
</span>
|
||||
</p>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="col-md-12 pt-2">
|
||||
<label class="small mb-1" for="nodeStatus">Online Status:</label>
|
||||
<span class="badge badge-soft-success mb-0 align-middle fs-6" id="nodeStatus">Online</span>
|
||||
|
||||
<br>
|
||||
<div class="py-2"></div>
|
||||
<!-- Join Server button-->
|
||||
<a type="button" class="btn btn-info text-white" data-bs-toggle="modal" data-bs-target="#joinModal"
|
||||
href="#">Join Server</a>
|
||||
<!-- Leave Server button -->
|
||||
<a type="button" class="btn btn-danger" href="#" onclick="leaveServer()">Leave Server</a>
|
||||
<!-- Checkin with client button -->
|
||||
<a type="button" class="btn btn-secondary" href="#" onclick="sendNodeHeartbeat('<%=node.id%>')">Check-in
|
||||
with Node</a>
|
||||
<!-- Update Client button -->
|
||||
<a type="button" class="btn btn-warning disabled" href="#"
|
||||
onclick="requestNodeUpdate('<%=node.id%>')">Update Node</a>
|
||||
</div>
|
||||
<hr>
|
||||
<form>
|
||||
<div class="row gx-3 mb-3">
|
||||
<div class="col-md-6">
|
||||
<label class="small mb-1" for="nodeId">Node ID (this is the assigned Node ID and cannot be
|
||||
changed)</label>
|
||||
<input class="form-control" id="nodeId" type="text" value="<%=node.id%>" disabled></input>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row gx-3 mb-3">
|
||||
<div class="col-md-12">
|
||||
<label class="small mb-1" for="inputNodeName">Node Name:</label>
|
||||
<input class="form-control" id="inputNodeName" type="text" value="<%=node.name%>"></input>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row gx-3 mb-3">
|
||||
<div class="col-md-4">
|
||||
<label class="small mb-1" for="inputNodeIp">Node IP Address (that the server can
|
||||
contact):</label>
|
||||
<input class="form-control" id="inputNodeIp" type="text" value="<%=node.ip%>"></input>
|
||||
</div>
|
||||
<div class="col-md-2">
|
||||
<label class="small mb-1" for="inputOrgName">Node Port (with the API):</label>
|
||||
<input class="form-control" id="inputOrgName" type="number" value="<%=node.port%>"></input>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label class="small mb-1" for="inputNodeLocation">Node Location (physical location):</label>
|
||||
<input class="form-control" id="inputNodeLocation" type="location" value="<%=node.location%>"></input>
|
||||
</div>
|
||||
<h4>
|
||||
Nearby Systems
|
||||
</h4>
|
||||
<hr>
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
<div class="main-box no-header clearfix">
|
||||
<div class="main-box-body clearfix">
|
||||
<div class="table-responsive">
|
||||
<table class="table user-list <% if(!node.online) { %>disabled<% } %>">
|
||||
<thead>
|
||||
<tr>
|
||||
<th><span>System Name</span></th>
|
||||
<th><span>Frequencies</span></th>
|
||||
<th><span>Protocol</span></th>
|
||||
<th> </th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% for(const system in node.nearbySystems){ %>
|
||||
<tr>
|
||||
<td>
|
||||
<%= system %>
|
||||
</td>
|
||||
<td>
|
||||
<% if(node.nearbySystems[system].frequencies.length> 1) { %>
|
||||
<ul>
|
||||
<% for(const frequency of node.nearbySystems[system].frequencies) { %>
|
||||
<li>
|
||||
<%=frequency%> MHz
|
||||
</li>
|
||||
<% } %>
|
||||
</ul>
|
||||
<% } else { const frequency=node.nearbySystems[system].frequencies[0] %>
|
||||
<%=frequency%> MHz
|
||||
<% } %>
|
||||
</td>
|
||||
<td>
|
||||
<span class="label label-default text-uppercase">
|
||||
<%= node.nearbySystems[system].mode %>
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
<a href="#" class="table-link text-info label" data-bs-toggle="modal"
|
||||
data-bs-target="#updateSystemModal_<%=system.replaceAll(" ", " _")%>">
|
||||
<i class="bi bi-pencil"></i>
|
||||
</a>
|
||||
<a class="table-link text-danger label" onclick="removeSystem('<%=system%>')">
|
||||
<i class="bi bi-trash"></i>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<% // Update system modal %>
|
||||
<%- include("partials/modifySystemModal.ejs", {'system': system, 'frequencies' :
|
||||
node.nearbySystems[system].frequencies, 'mode' : node.nearbySystems[system].mode}) %>
|
||||
<% } %>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Save changes button-->
|
||||
<button class="btn btn-primary" type="button" onclick="saveNodeDetails()">Save changes</button>
|
||||
<!-- Button trigger modal -->
|
||||
<button type="button" class="btn btn-primary float-right" data-bs-toggle="modal"
|
||||
data-bs-target="#updateSystemModal_New_System">Add New System</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<% // new System Modal %>
|
||||
<%- include("partials/modifySystemModal.ejs", {'system': "New System" , 'frequencies' : [], 'mode' : '' }) %>
|
||||
</body>
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"
|
||||
integrity="sha384-geWF76RCwLtnZ8qwWowPQNguL3RmwHVBC9FhGdlKrxdiJJigb/j/68SIy3Te4Bkz" crossorigin="anonymous"></script>
|
||||
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.0/jquery.min.js"
|
||||
integrity="sha512-3gJwYpMe3QewGELv8k/BX9vcqhryRdzRMxVfq6ngyWXwo03GFEzjsUm8Q7RZcHPHksttq7/GFoxjCVUjkjvPdw=="
|
||||
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
||||
|
||||
<script src="/res/js/node.js"></script>
|
||||
|
||||
</html>
|
||||
44
Client/views/partials/joinModal.ejs
Normal file
44
Client/views/partials/joinModal.ejs
Normal file
@@ -0,0 +1,44 @@
|
||||
<div class="modal fade" id="joinModal" tabindex="-1" aria-labelledby="joinModal" aria-hidden="true">
|
||||
<div class="modal-dialog modal-dialog-centered">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h1 class="modal-title fs-5" id="joinModal">Join Node <%=node.id%> to a Discord Server</h1>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="container">
|
||||
<div class="card mb-4">
|
||||
<div class="card-body">
|
||||
<form>
|
||||
<div class="row gx-3 mb-3">
|
||||
<div class="col-md-12">
|
||||
<label class="small mb-1" for="inputDiscordClientId">Discord Client ID:</label>
|
||||
<input class="form-control" id="inputDiscordClientId" type="text" value="" required></input>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row gx-3 mb-3">
|
||||
<div class="col-md-6">
|
||||
<label class="small mb-1" for="inputDiscordChannelId">Discord Channel ID:</label>
|
||||
<input class="form-control" id="inputDiscordChannelId" type="text" value="" required></input>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<label class="small mb-1" for="selectRadioPreset">Selected Preset:</label>
|
||||
<select class="custom-select" id="selectRadioPreset">
|
||||
<% for(const system in nearbySystems) { %>
|
||||
<option value="<%=system%>"><%=system%></option>
|
||||
<% } %>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
|
||||
<button type="button" class="btn btn-primary" onclick="joinServer()">Join</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
61
Client/views/partials/modifySystemModal.ejs
Normal file
61
Client/views/partials/modifySystemModal.ejs
Normal file
@@ -0,0 +1,61 @@
|
||||
<div class="modal fade" id="updateSystemModal_<%=system.replaceAll(" ", "_")%>" tabindex="-1" aria-labelledby="updateSystemModal_<%=system.replaceAll(" ", "_")%>"
|
||||
aria-hidden="true" data-bs-backdrop="static" data-bs-keyboard="false">
|
||||
<div class="modal-dialog modal-dialog-centered">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h1 class="modal-title fs-5" id="updateSystemModal_<%=system.replaceAll(" ", "_")%>"><%if (!system == "New System") {%>Update<%} else {%>Add a<%}%> <%=system%></h1>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<div class="card mb-4">
|
||||
<div class="card-body">
|
||||
<form>
|
||||
<div class="row gx-3 mb-3">
|
||||
<label class="small mb-1 fs-6" for="systemName">System Name</label>
|
||||
<input class="form-control" id="<%=system%>_systemName" type="text" value="<%if (system != "New System") {%><%= system %><%} else {%>Local Radio System<%}%>"></input>
|
||||
</div>
|
||||
<div class="row gx-3 mb-3" id="frequencyRow_<%=system.replaceAll(" ", "_")%>">
|
||||
<label class="small mb-1 fs-6" for="systemFreq">Frequencies</label>
|
||||
<% for(const frequency of frequencies) { %>
|
||||
<div class="col-md-6 mb-1" id="<%=system%>_systemFreqRow_<%=frequency%>">
|
||||
<div class="row px-1">
|
||||
<div class="col-10">
|
||||
<input class="form-control" id="<%=system%>_systemFreq_<%=frequency%>" type="text" value="<%= frequency %>"></input>
|
||||
</div>
|
||||
<div class="col-2">
|
||||
<a class="align-middle float-left" href="#" onclick="removeFrequencyInput('<%=system%>_systemFreqRow_<%=frequency%>')"><i class="bi bi-x-circle text-black"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<% } %>
|
||||
</div>
|
||||
<button type="button" class="btn btn-info text-white" onclick="addFrequencyInput('<%=system%>')">Add Frequency</button>
|
||||
<hr>
|
||||
<div class="row gx-3 mb-3">
|
||||
<div class="col-md-6">
|
||||
<label class="small mb-1 fs-6" for="<%=system%>_systemMode">Mode</label>
|
||||
<br>
|
||||
<select class="custom-select" id="<%=system%>_systemMode">
|
||||
<option value="<%= mode ?? 'select' %>" selected><span class="text-uppercase"><%= mode ?? 'Select' %></span></option>
|
||||
<% if(mode == "p25") { %>
|
||||
<option value="nbfm">NBFM</option>
|
||||
<% } else if (mode == "nbfm") { %>
|
||||
<option value="p25">P25</option>
|
||||
<% } else { %>
|
||||
<option value="nbfm">NBFM</option>
|
||||
<option value="p25">P25</option>
|
||||
<%}%>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal" onclick="location.reload()">Close</button>
|
||||
<button type="button" class="btn btn-primary" <%if(!system == "New System") {%>onclick="updateSystem('<%=system%>')"<%} else {%>onclick="addNewSystem('<%=system%>')"<%}%>>Save changes</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
42
Client/views/partials/navbar.ejs
Normal file
42
Client/views/partials/navbar.ejs
Normal file
@@ -0,0 +1,42 @@
|
||||
<nav class="navbar fixed-top navbar-expand-lg bg-body-tertiary" data-bs-theme="dark">
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" href="#">Node Master</a>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent"
|
||||
aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse" id="navbarSupportedContent">
|
||||
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
|
||||
<% /*
|
||||
<li class="nav-item">
|
||||
<a class="nav-link active" aria-current="page" href="#">Home</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="#">Link</a>
|
||||
</li>
|
||||
<li class="nav-item dropdown">
|
||||
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown"
|
||||
aria-expanded="false">
|
||||
Dropdown
|
||||
</a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item" href="#">Action</a></li>
|
||||
<li><a class="dropdown-item" href="#">Another action</a></li>
|
||||
<li>
|
||||
<hr class="dropdown-divider">
|
||||
</li>
|
||||
<li><a class="dropdown-item" href="#">Something else here</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
*/%>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" id="navbar-notification-bell" onclick="showStoredToasts()"><i class="bi bi-bell-fill"></i></a>
|
||||
</li>
|
||||
</ul>
|
||||
<form class="d-flex" role="search">
|
||||
<input class="form-control me-2" type="search" placeholder="Search" aria-label="Search">
|
||||
<button class="btn btn-outline-success" type="submit">Search</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
Reference in New Issue
Block a user