Files
EonaCat.LogStack/EonaCat.LogStack.Status/Pages/Shared/_Layout.cshtml
2026-04-06 08:15:54 +02:00

163 lines
7.8 KiB
Plaintext

<!--
This file is part of the EonaCat project(s) which is released under the Apache License.
See the LICENSE file or go to https://EonaCat.com/License for full license details.
-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - Status</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Space+Mono:wght@400;700&family=DM+Sans:wght@300;400;500;600&display=swap" rel="stylesheet">
<link rel="stylesheet" href="~/css/site.css" />
@RenderSection("Styles", required: false)
</head>
<body>
<div class="app-shell">
<nav class="sidebar" id="sidebar">
<div class="sidebar-header">
<div class="logo">
<span class="logo-icon">◈</span>
<span class="logo-text">EonaCat LogStack<br /><strong>Status</strong></span>
</div>
<button class="sidebar-toggle" onclick="toggleSidebar()" title="Toggle sidebar">⟨</button>
</div>
<div class="nav-section">
<span class="nav-label">MONITORING</span>
<a href="/" data-label="Dashboard" class="nav-item @(ViewData["Page"]?.ToString() == "dashboard" ? "active" : "")">
<span class="nav-icon">⬡</span>
<span class="nav-text">Dashboard</span>
<span class="status-dot" id="overall-dot"></span>
</a>
<a href="/monitors" data-label="Monitors" class="nav-item @(ViewData["Page"]?.ToString() == "monitors" ? "active" : "")">
<span class="nav-icon">◎</span>
<span class="nav-text">Monitors</span>
</a>
<a href="/certificates" data-label="Certificates" class="nav-item @(ViewData["Page"]?.ToString() == "certs" ? "active" : "")">
<span class="nav-icon">◧</span>
<span class="nav-text">Certificates</span>
</a>
<a href="/incidents" data-label="Incidents" class="nav-item @(ViewData["Page"]?.ToString() == "incidents" ? "active" : "")">
<span class="nav-icon">⚠</span>
<span class="nav-text">Incidents</span>
</a>
</div>
@if (Context.Session.GetString("IsAdmin") == "true")
{
<div class="nav-section">
<span class="nav-label">ANALYTICS</span>
<a href="/logs" data-label="Log Stream" class="nav-item @(ViewData["Page"]?.ToString() == "logs" ? "active" : "")">
<span class="nav-icon">▦</span>
<span class="nav-text">Log Stream</span>
</a>
<a href="/analytics" data-label="Analytics" class="nav-item @(ViewData["Page"]?.ToString() == "analytics" ? "active" : "")">
<span class="nav-icon">⬡</span>
<span class="nav-text">Analytics</span>
</a>
</div>
<div class="nav-section">
<span class="nav-label">ADMIN</span>
<a href="/admin/monitors" data-label="Monitors" class="nav-item @(ViewData["Page"]?.ToString() == "admin-monitors" ? "active" : "")">
<span class="nav-icon">⊞</span>
<span class="nav-text">Manage Monitors</span>
</a>
<a href="/admin/certificates" data-label="Certificates" class="nav-item @(ViewData["Page"]?.ToString() == "admin-certs" ? "active" : "")">
<span class="nav-icon">⊟</span>
<span class="nav-text">Manage Certificates</span>
</a>
<a href="/admin/incidents" data-label="Incidents" class="nav-item @(ViewData["Page"]?.ToString() == "admin-incidents" ? "active" : "")">
<span class="nav-icon">⚑</span>
<span class="nav-text">Manage Incidents</span>
</a>
<a href="/admin/alertrules" data-label="Alert Rules" class="nav-item @(ViewData["Page"]?.ToString() == "admin-alerts" ? "active" : "")">
<span class="nav-icon">◉</span>
<span class="nav-text">Alert Rules</span>
</a>
<a href="/admin/settings" data-label="Settings" class="nav-item @(ViewData["Page"]?.ToString() == "admin-settings" ? "active" : "")">
<span class="nav-icon">⚙</span>
<span class="nav-text">Settings</span>
</a>
<a href="/admin/ingest" data-label="Log Ingest" class="nav-item @(ViewData["Page"]?.ToString() == "admin-ingest" ? "active" : "")">
<span class="nav-icon">⊕</span>
<span class="nav-text">Log Ingest</span>
</a>
</div>
<div class="nav-section">
<a href="/admin/logout" data-label="Logout" class="nav-item nav-item--danger">
<span class="nav-icon">⊘</span>
<span class="nav-text">Logout</span>
</a>
</div>
}
else
{
<div class="nav-section" style="margin-top:auto">
<a href="/admin/login" data-label="Admin Login" class="nav-item">
<span class="nav-icon">⊛</span>
<span class="nav-text">Admin Login</span>
</a>
</div>
}
<div class="sidebar-footer">
<span class="clock" id="clock">--:--:--</span>
</div>
</nav>
<main class="main-content" id="main-content">
<div class="topbar">
<div class="breadcrumb">@ViewData["Title"]</div>
<div class="topbar-right">
<!-- Refresh countdown ring -->
<div class="refresh-ring" id="refresh-ring" title="Auto refresh" style="display:none">
<svg width="18" height="18" viewBox="0 0 18 18">
<circle class="refresh-ring-track" cx="9" cy="9" r="8" />
<circle class="refresh-ring-fill" id="refresh-ring-fill" cx="9" cy="9" r="8" />
</svg>
<span class="refresh-ring-label" id="refresh-ring-label"></span>
</div>
<div class="live-indicator" title="Online">
<span class="pulse-dot"></span>
</div>
@if (SyslogUdpService.IsRunning)
{
<div class="live-indicator" title="Syslog">
<span class="pulse-dot"></span>
</div>
}
@if (Context.Session.GetString("IsAdmin") == "true")
{
<span class="admin-badge">ADMIN</span>
}
</div>
</div>
<div class="page-content">
@RenderBody()
</div>
<div class="page-footer">
&copy; @DateTime.Now.Year
<strong>
<a href="https://EonaCat.com" target="_blank">EonaCat (Jeroen Saey)</a>
</strong>
All rights reserved.
</div>
</main>
</div>
<!-- Global toast container -->
<div class="toast-container" id="toast-container"></div>
<script src="~/js/site.js"></script>
@RenderSection("Scripts", required: false)
</body>
</html>