1
0
mirror of synced 2025-10-28 18:19:17 +00:00

admin dashboard, database updated (members, groups), group setup and permissions

This commit is contained in:
Valentin PUCCETTI
2023-09-10 20:52:09 +02:00
parent 14dad1f5f1
commit a3b8a865fd
21 changed files with 723 additions and 34 deletions

View File

@@ -0,0 +1,94 @@
<%- include('../navbar', {active: "admin-groups"}); %>
<div class="container-fluid">
<h3 class="text-dark mb-4"><%= group.name %></h3>
<div class="card shadow mb-5">
<div class="card-header py-3">
<p class="text-primary m-0 fw-bold">Group editing</p>
</div>
<form method="POST" action="/keys/add/">
<div class="card-body">
<div class="row">
<div class="col-md-6">
<div class="row">
<div class="col-md-6 text-nowrap">
<div id="dataTable_length" class="dataTables_length" aria-controls="dataTable"><label class="form-label">Show&nbsp;<select class="d-inline-block form-select form-select-sm">
<option value="all" selected="">all</option>
</select>&nbsp;</label></div>
</div>
<div class="col-md-6">
<div class="text-md-end dataTables_filter" id="dataTable_filter"><label class="form-label">
<input type="search" class="form-control form-control-sm" id="tableInput" onkeyup="tableSearch()" aria-controls="dataTable" placeholder="Search"></label>
</div>
</div>
</div>
<div class="table-responsive table mt-2" id="dataTable" role="grid" aria-describedby="dataTable_info">
<table class="table my-0" id="tableEnabled">
<thead>
<tr>
<th>Display name</th>
<th>github id</th>
<th></th>
</tr>
</thead>
<tbody>
<% outGroup.forEach(function (member) { %>
<tr>
<td><img class="rounded-circle me-2" width="30" height="30" src="<%= member.avatar %>"><%= member.displayName %></td>
<td><%= member.id %></td>
<td style="text-align: right;"><a class="btn btn-sm btn-success" href="/admin/members/<%= group.name %>/add/<%= member.id %>"><i class="text-white fa fa-plus"></i></button></td>
</tr>
<% }) %>
</tbody>
<tfoot>
<tr></tr>
</tfoot>
</table>
</div>
<div class="mb-3"><button class="btn btn-primary btn-sm" type="submit">Update group</button></div>
</div>
<div class="col-md-6">
<div class="row">
<div class="col-md-6 text-nowrap">
<div id="dataTable_length" class="dataTables_length" aria-controls="dataTable"><label class="form-label">Show&nbsp;<select class="d-inline-block form-select form-select-sm">
<option value="all" selected="">all</option>
</select>&nbsp;</label></div>
</div>
<div class="col-md-6">
<div class="text-md-end dataTables_filter" id="dataTable_filter"><label class="form-label">
<input type="search" class="form-control form-control-sm" id="tableInput" onkeyup="tableSearch()" aria-controls="dataTable" placeholder="Search"></label>
</div>
</div>
</div>
<div class="table-responsive table mt-2" id="dataTable" role="grid" aria-describedby="dataTable_info">
<table class="table my-0" id="tableEnabled">
<thead>
<tr>
<th>Display name</th>
<th>github id</th>
<th></th>
</tr>
</thead>
<tbody>
<% inGroup.forEach(function (member) { %>
<tr>
<td><img class="rounded-circle me-2" width="30" height="30" src="<%= member.avatar %>"><%= member.displayName %></td>
<td><%= member.id %></td>
<td style="text-align: right;"><a class="btn btn-sm btn-danger" href="/admin/members/<%= group.name %>/delete/<%= member.id %>"><i class="far fa-trash-alt"></i></a></td>
</tr>
<% }) %>
</tbody>
<tfoot>
<tr></tr>
</tfoot>
</table>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
<%- include('../footer'); %>

22
views/admin/group_new.ejs Normal file
View File

@@ -0,0 +1,22 @@
<%- include('../navbar', {active: "admin-groups"}); %>
<div class="container-fluid">
<h3 class="text-dark mb-4">New group: </h3>
<div class="card shadow mb-5">
<div class="card-header py-3">
<p class="text-primary m-0 fw-bold">Group editing</p>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<form method="POST" action="/admin/groups/add/">
<div class="mb-3"><label class="form-label"><strong>Name</strong></label><input class="form-control" type="text" name="group_name"></div>
<div class="mb-3"><button class="btn btn-primary btn-sm" type="submit">Create group</button></div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
<%- include('../footer'); %>

51
views/admin/groups.ejs Normal file
View File

@@ -0,0 +1,51 @@
<%- include('../navbar', {active: "admin-groups"}); %>
<div class="container-fluid">
<h3 class="text-dark mb-4">Admin: Groups</h3>
<div class="card shadow">
<div class="card-header py-3">
<p class="text-primary m-0 fw-bold">User list</p>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6 text-nowrap">
<div id="dataTable_length" class="dataTables_length" aria-controls="dataTable"><a class="btn btn-primary" href="/admin/groups/new" data-toggle="modal" >New group</a></div>
</div>
<div class="col-md-6">
<div class="text-md-end dataTables_filter" id="dataTable_filter"><label class="form-label"><input type="search" class="form-control form-control-sm" aria-controls="dataTable" placeholder="Search"></label></div>
</div>
</div>
<div class="table-responsive table mt-2" id="dataTable" role="grid" aria-describedby="dataTable_info">
<table class="table my-0" id="dataTable">
<thead>
<tr>
<th>Name</th>
<th>Member count</th>
<th>Server count</th>
<th style="text-align: right;">Actions</th>
</tr>
</thead>
<tbody>
<% groups.forEach(function (group) { %>
<tr>
<td><%= group.name %></td>
<td>undefined</td>
<td>undefined</td>
<td style="text-align: right;"><a class="btn btn-sm btn-primary" href="/admin/groups/<%= group.name %>"><i class="far fa-edit"></i></a> <a class="btn btn-sm btn-danger" href="/admin/groups/delete/<%= group.name %>"><i class="far fa-trash-alt"></i></a></td>
</tr>
<% }) %>
</tbody>
<tfoot>
<tr></tr>
</tfoot>
</table>
</div>
</div>
</div>
</div>
</div>
<%- include('../footer'); %>

54
views/admin/users.ejs Normal file
View File

@@ -0,0 +1,54 @@
<%- include('../navbar', {active: "admin-users"}); %>
<div class="container-fluid">
<h3 class="text-dark mb-4">Admin: Users</h3>
<div class="card shadow">
<div class="card-header py-3">
<p class="text-primary m-0 fw-bold">User list</p>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6 text-nowrap">
<div id="dataTable_length" class="dataTables_length" aria-controls="dataTable"><label class="form-label">Show&nbsp;<select class="d-inline-block form-select form-select-sm">
<option value="all" selected="">all</option>
</select>&nbsp;</label></div>
</div>
<div class="col-md-6">
<div class="text-md-end dataTables_filter" id="dataTable_filter"><label class="form-label">
<input type="search" class="form-control form-control-sm" id="tableInput" onkeyup="tableSearch()" aria-controls="dataTable" placeholder="Search"></label>
</div>
</div>
</div>
<div class="table-responsive table mt-2" id="dataTable" role="grid" aria-describedby="dataTable_info">
<table class="table my-0" id="tableEnabled">
<thead>
<tr>
<th>Display name</th>
<th>github id</th>
<th>Admin</th>
<th>Groups</th>
<th>Last login</th>
</tr>
</thead>
<tbody>
<% users.forEach(function (user) { %>
<tr>
<td><img class="rounded-circle me-2" width="30" height="30" src="<%= user.avatar %>"><%= user.displayName %></td>
<td><%= user.id %></td>
<td><%= user.admin %></td>
<td>
<span class="badge bg-primary">admin</span>
</td>
<td><%= user.updatedAt %></td>
</tr>
<% }) %>
</tbody>
<tfoot>
<tr></tr>
</tfoot>
</table>
</div>
</div>
</div>
</div>
</div>
<%- include('../footer'); %>

View File

@@ -5,7 +5,28 @@
</footer>
</div><a class="border rounded d-inline scroll-to-top" href="#page-top"><i class="fas fa-angle-up"></i></a>
</div>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
<script src="/static/assets/js/script.min.js"></script>
<script>
function tableSearch() {
var input, filter, table, tr, td, i, txtValue;
input = document.getElementById("tableInput");
filter = input.value.toUpperCase();
table = document.getElementById("tableEnabled");
tr = table.getElementsByTagName("tr");
for (i = 0; i < tr.length; i++) {
td = tr[i].getElementsByTagName("td")[0];
if (td) {
txtValue = td.textContent || td.innerText;
if (txtValue.toUpperCase().indexOf(filter) > -1) {
tr[i].style.display = "";
} else {
tr[i].style.display = "none";
}
}
}
}
</script>
</body>
</html>

View File

@@ -48,25 +48,28 @@
<tr>
<th>Name</th>
<th>Key</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>MacBook Pro</td>
<td>Lorem ipsum</td>
</tr>
<tr>
<td>PC</td>
<td>Lorem ipsum</td>
</tr>
<% keys.forEach(function (key) { %>
<tr>
<td><%= key.name %></td>
<td><%= key.content %></td>
<td style="text-align: right;"><a class="btn btn-sm btn-danger" href="/keys/delete/<%= key.idKey %>"><i class="far fa-trash-alt"></i></button></td>
</tr>
<% }) %>
</tbody>
</table>
</div>
</div>
<div class="col-md-6">
<form>
<div class="mb-3"><label class="form-label" for="signature"><strong>Name</strong></label><input class="form-control" type="text"></div>
<div class="mb-3"><label class="form-label" for="signature"><strong>Key</strong></label><textarea class="form-control" id="signature-1" rows="4" name="signature"></textarea></div>
<form method="POST" action="/keys/add/">
<div class="mb-3"><label class="form-label"><strong>Name</strong></label><input class="form-control" type="text" name="key_name"></div>
<div class="mb-3"><label class="form-label"><strong>Key</strong></label><textarea class="form-control" name="key_content" rows="2"></textarea></div>
<div class="mb-3"></div>
<div class="mb-3"><button class="btn btn-primary btn-sm" type="submit">Add key</button></div>
</form>

View File

@@ -4,17 +4,19 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<title>Dashboard - AccessGate</title>
<title>AccessGate</title>
<link rel="stylesheet" href="/static/assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i&amp;display=swap">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.12.0/css/all.css">
<link rel="stylesheet" href="/static/assets/css/styles.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.rawgit.com/harvesthq/chosen/gh-pages/chosen.jquery.min.js"></script>
<link href="https://cdn.rawgit.com/harvesthq/chosen/gh-pages/chosen.min.css" rel="stylesheet"/>
</head>
<body id="page-top">
<div id="wrapper">
<nav class="navbar align-items-start sidebar sidebar-dark accordion bg-gradient-primary p-0 navbar-dark">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center sidebar-brand m-0" href="#">
<div class="container-fluid d-flex flex-column p-0"><a class="navbar-brand d-flex justify-content-center align-items-center sidebar-brand m-0" href="/">
<div class="sidebar-brand-icon rotate-n-15"><i class="fas fa-lock"></i></div>
<div class="sidebar-brand-text mx-3"><span>AccessGate</span></div>
</a>
@@ -22,9 +24,13 @@
<ul class="navbar-nav text-light" id="accordionSidebar">
<li class="nav-item"><a class="nav-link <%if(active=="index"){%>active<%}%>" href="/"><i class="fas fa-tachometer-alt"></i><span>Dashboard</span></a></li>
<li class="nav-item"><a class="nav-link <%if(active=="keys"){%>active<%}%>" href="/keys"><i class="fas fa-key"></i><span>Keys</span></a></li>
<% if (session_user.admin) { %>
<li class="nav-item"><a class="nav-link <%if(active=="admin-users"){%>active<%}%>" href="/admin/users"><i class="far fa-user"></i><span>Users</span></a></li>
<li class="nav-item"><a class="nav-link <%if(active=="admin-groups"){%>active<%}%>" href="/admin/groups"><i class="fas fa-stream"></i><span>Groups</span></a></li>
<li class="nav-item"><a class="nav-link <%if(active=="admin-servers"){%>active<%}%>" href="/admin/servers"><i class="far fa-hdd"></i><span>Servers</span></a></li>
<% } %>
<li class="nav-item"><a class="nav-link" href="/auth/logout"><i class="far fa-user-circle"></i><span>Disconnect</span></a></li>
</ul>
</div>
@@ -38,10 +44,7 @@
</form>
<ul class="navbar-nav flex-nowrap ms-auto">
<li class="nav-item dropdown no-arrow">
<div class="nav-item dropdown no-arrow"><a class="dropdown-toggle nav-link" aria-expanded="false" data-bs-toggle="dropdown" href="#"><span class="d-none d-lg-inline me-2 text-gray-600 small">Valentin - itsmrval</span><img class="border rounded-circle img-profile" src="assets/img/avatars/43043885.jpeg"></a>
<div class="dropdown-menu shadow dropdown-menu-end animated--grow-in"><a class="dropdown-item" href="#"><i class="fas fa-user fa-sm fa-fw me-2 text-gray-400"></i>&nbsp;Profile</a><a class="dropdown-item" href="#"><i class="fas fa-cogs fa-sm fa-fw me-2 text-gray-400"></i>&nbsp;Settings</a><a class="dropdown-item" href="#"><i class="fas fa-list fa-sm fa-fw me-2 text-gray-400"></i>&nbsp;Activity log</a>
<div class="dropdown-divider"></div><a class="dropdown-item" href="#"><i class="fas fa-sign-out-alt fa-sm fa-fw me-2 text-gray-400"></i>&nbsp;Logout</a>
</div>
<div class="nav-item dropdown no-arrow"><a class="dropdown-toggle nav-link"><span class="d-none d-lg-inline me-2 text-gray-600 small"><%= session_user.login %></span><img class="border rounded-circle img-profile" src="<%= session_user.avatar %>"></a>
</div>
</li>
</ul>