about and errorpages

This commit is contained in:
Mateusz Gruszczyński
2026-05-06 11:06:08 +02:00
parent 1baf4a8495
commit 6587e74892
4 changed files with 249 additions and 1 deletions

View File

@@ -0,0 +1,25 @@
<!doctype html>
<html lang="en" data-bs-theme="dark">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>pyTorrent {{ code }}</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/all.min.css" rel="stylesheet">
<link href="{{ static_url('styles.css') }}" rel="stylesheet">
</head>
<body class="error-page">
<!-- Notatka: dedykowany widok błędu utrzymuje wygląd aplikacji zamiast domyślnej strony Flask/Werkzeug. -->
<main class="error-card" role="alert">
<div class="error-brand"><i class="fa-solid fa-robot"></i> pyTorrent</div>
<div class="error-icon" aria-hidden="true"><i class="fa-solid {{ icon }}"></i></div>
<p class="error-code">{{ code }}</p>
<h1>{{ title }}</h1>
<p>{{ message }}</p>
<div class="error-actions">
<a class="btn btn-primary" href="{{ url_for('main.index') }}"><i class="fa-solid fa-house"></i> Back to dashboard</a>
<a class="btn btn-outline-secondary" href="{{ url_for('main.docs') }}"><i class="fa-solid fa-book"></i> API docs</a>
</div>
</main>
</body>
</html>

View File

@@ -42,6 +42,8 @@
<span id="connBadge" class="badge text-bg-secondary">offline</span>
<button class="btn btn-xs btn-outline-info nav-btn" id="mobileToggle" title="Mobile/simple mode"><i class="fa-solid fa-mobile-screen"></i></button>
<button id="themeToggle" class="btn btn-xs btn-outline-secondary nav-btn" title="Change theme"><i class="fa-solid fa-moon"></i></button>
<!-- Notatka: subtelny przycisk otwiera okno About bez zmiany istniejącej nawigacji. -->
<button class="btn btn-xs btn-outline-secondary nav-btn about-nav-btn" data-bs-toggle="modal" data-bs-target="#aboutModal" title="About pyTorrent"><i class="fa-solid fa-circle-info"></i></button>
{% if auth_enabled %}<a class="btn btn-xs btn-outline-danger nav-btn" href="/logout" title="Log out"><i class="fa-solid fa-right-from-bracket"></i><span> {{ current_user.username if current_user else 'logout' }}</span></a>{% endif %}
</div>
</header>
@@ -151,6 +153,35 @@
<div class="modal fade" id="trafficModal" tabindex="-1"><div class="modal-dialog modal-xl"><div class="modal-content"><div class="modal-header"><h5 class="modal-title"><i class="fa-solid fa-chart-column"></i> Transfer history</h5><button class="btn-close" data-bs-dismiss="modal"></button></div><div class="modal-body"><div class="d-flex gap-2 mb-3 flex-wrap"><button class="btn btn-sm btn-outline-secondary traffic-range" data-range="15m"><i class="fa-solid fa-clock"></i> 15m</button><button class="btn btn-sm btn-outline-secondary traffic-range" data-range="1h"><i class="fa-solid fa-clock"></i> 1h</button><button class="btn btn-sm btn-outline-secondary traffic-range" data-range="3h"><i class="fa-solid fa-clock"></i> 3h</button><button class="btn btn-sm btn-outline-secondary traffic-range" data-range="6h"><i class="fa-solid fa-clock"></i> 6h</button><button class="btn btn-sm btn-outline-secondary traffic-range" data-range="24h"><i class="fa-solid fa-calendar-day"></i> 24h</button><button class="btn btn-sm btn-primary traffic-range" data-range="7d"><i class="fa-solid fa-calendar-week"></i> 7d</button><button class="btn btn-sm btn-outline-secondary traffic-range" data-range="30d"><i class="fa-solid fa-calendar"></i> 30d</button><button class="btn btn-sm btn-outline-secondary traffic-range" data-range="90d"><i class="fa-solid fa-calendar"></i> 90d</button></div><div class="history-grid"><div class="history-card"><div class="history-title">Transferred data</div><canvas id="trafficHistoryChart"></canvas></div><div class="history-card"><div class="history-title">Speed trend</div><canvas id="trafficSpeedChart"></canvas></div></div><div id="trafficHistoryInfo" class="small text-muted mt-2"></div></div></div></div></div>
<div class="modal fade" id="aboutModal" tabindex="-1" aria-labelledby="aboutModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content about-modal-content">
<div class="modal-header">
<h5 id="aboutModalLabel" class="modal-title"><i class="fa-solid fa-robot"></i> About pyTorrent</h5>
<button class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<!-- Notatka: krótkie informacje o licencji, autorze i stacku bez technicznych szczegółów wdrożenia. -->
<div class="about-hero">
<div class="about-logo"><i class="fa-solid fa-robot"></i></div>
<div>
<h6>pyTorrent</h6>
<p>Lightweight web panel for rTorrent management.</p>
</div>
</div>
<dl class="about-list">
<div><dt>License</dt><dd>Open source</dd></div>
<div><dt>Author</dt><dd>linuxiarz.pl</dd></div>
<div><dt>Backend</dt><dd>Python, Flask, Flask-SocketIO</dd></div>
<div><dt>Frontend</dt><dd>Bootstrap, vanilla JavaScript, Font Awesome</dd></div>
<div><dt>Runtime</dt><dd>Gunicorn compatible, rTorrent over SCGI</dd></div>
</dl>
</div>
</div>
</div>
</div>
<div id="toastHost" class="toast-host"></div>
<script src="https://cdn.socket.io/4.7.5/socket.io.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>