functions and interface
This commit is contained in:
@ -6,65 +6,289 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<!-- Bootstrap CSS -->
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
<style>
|
||||
body.dark-mode {
|
||||
background-color: #2b2b2b;
|
||||
color: #cccccc;
|
||||
}
|
||||
body.dark-mode .navbar {
|
||||
background-color: #201f1f !important;
|
||||
color: #ffffff;
|
||||
}
|
||||
/* Nazwa aplikacji */
|
||||
body.dark-mode .navbar .navbar-brand {
|
||||
color: #ffffff !important;
|
||||
}
|
||||
body.dark-mode .navbar .nav-link {
|
||||
color: #ffffff !important;
|
||||
}
|
||||
/* Dropdown */
|
||||
body.dark-mode .dropdown-menu {
|
||||
background-color: #262626;
|
||||
color: #cccccc;
|
||||
border: 1px solid #555;
|
||||
}
|
||||
body.dark-mode .dropdown-menu a {
|
||||
color: #cccccc !important;
|
||||
}
|
||||
body.dark-mode .dropdown-menu a:hover {
|
||||
background-color: #333333;
|
||||
}
|
||||
/* Przycisk zmiany hasła */
|
||||
body.dark-mode .btn-outline-light {
|
||||
color: #ffffff;
|
||||
border-color: #ffffff;
|
||||
}
|
||||
body.dark-mode .btn-outline-light:hover {
|
||||
color: #ffffff;
|
||||
background-color: #333333;
|
||||
border-color: #333333;
|
||||
}
|
||||
/* Stopka - poprawa czytelności tekstu */
|
||||
body.dark-mode .footer {
|
||||
background-color: #262626;
|
||||
}
|
||||
body.dark-mode .footer .text-muted {
|
||||
color: #ffffff !important;
|
||||
}
|
||||
body.light-mode .navbar {
|
||||
background-color: #f8f9fa !important;
|
||||
color: #000;
|
||||
}
|
||||
body.light-mode .navbar .nav-link {
|
||||
color: #000 !important;
|
||||
}
|
||||
body.light-mode .footer {
|
||||
background-color: #f8f9fa;
|
||||
color: #000;
|
||||
}
|
||||
/* Tabele w trybie ciemnym */
|
||||
body.dark-mode table {
|
||||
background-color: #1a1a1a;
|
||||
color: #cccccc;
|
||||
}
|
||||
body.dark-mode table thead {
|
||||
background-color: #333333;
|
||||
}
|
||||
/* Pola formularzy (globalnie oraz w tabelach) */
|
||||
body.dark-mode input,
|
||||
body.dark-mode textarea,
|
||||
body.dark-mode select,
|
||||
body.dark-mode table input,
|
||||
body.dark-mode table textarea,
|
||||
body.dark-mode table select {
|
||||
background-color: #1a1a1a;
|
||||
color: #cccccc;
|
||||
border: 1px solid #555;
|
||||
}
|
||||
body.dark-mode input:focus,
|
||||
body.dark-mode textarea:focus,
|
||||
body.dark-mode select:focus,
|
||||
body.dark-mode table input:focus,
|
||||
body.dark-mode table textarea:focus,
|
||||
body.dark-mode table select:focus {
|
||||
background-color: #1a1a1a;
|
||||
color: #cccccc;
|
||||
border-color: #777;
|
||||
}
|
||||
/* Vanilla‑DataTables (logi) w trybie ciemnym */
|
||||
body.dark-mode .dataTable-wrapper input,
|
||||
body.dark-mode .dataTable-wrapper select,
|
||||
body.dark-mode .dataTable-wrapper .dataTable-info,
|
||||
body.dark-mode .dataTable-wrapper .dataTable-pagination {
|
||||
background-color: #1a1a1a;
|
||||
color: #cccccc;
|
||||
border-color: #555;
|
||||
}
|
||||
body.dark-mode .dataTable-wrapper .dataTable-pagination a {
|
||||
color: #cccccc !important;
|
||||
background-color: #1a1a1a;
|
||||
border-color: #555;
|
||||
}
|
||||
body.dark-mode .dataTable-wrapper .dataTable-pagination a.active {
|
||||
background-color: #333333;
|
||||
border-color: #333333;
|
||||
}
|
||||
/* Stylizacja komórek tabeli */
|
||||
body.dark-mode table td {
|
||||
background-color: #1a1a1a !important;
|
||||
color: #cccccc !important;
|
||||
}
|
||||
/* Pola formularzy – upewniamy się, że tekst wpisywany ma jasny kolor */
|
||||
body.dark-mode input,
|
||||
body.dark-mode textarea,
|
||||
body.dark-mode select,
|
||||
body.dark-mode table input,
|
||||
body.dark-mode table textarea,
|
||||
body.dark-mode table select {
|
||||
background-color: #1a1a1a !important;
|
||||
color: #cccccc !important;
|
||||
border: 1px solid #555 !important;
|
||||
}
|
||||
body.dark-mode input:focus,
|
||||
body.dark-mode textarea:focus,
|
||||
body.dark-mode select:focus,
|
||||
body.dark-mode table input:focus,
|
||||
body.dark-mode table textarea:focus,
|
||||
body.dark-mode table select:focus {
|
||||
background-color: #1a1a1a !important;
|
||||
color: #cccccc !important;
|
||||
border-color: #777 !important;
|
||||
}
|
||||
/* Placeholder w trybie ciemnym */
|
||||
body.dark-mode ::placeholder {
|
||||
color: #cccccc !important;
|
||||
opacity: 1;
|
||||
}
|
||||
/* Breadcrumb active - elementy aktywne nawigacji */
|
||||
body.dark-mode .breadcrumb-item.active {
|
||||
color: #cccccc !important;
|
||||
}
|
||||
/* Klasa .text-muted w trybie ciemnym */
|
||||
body.dark-mode .text-muted {
|
||||
color: #cccccc !important;
|
||||
}
|
||||
/* Dostosowanie nagłówka kart typu bg-light (np. "Ostatnie zdarzenia") */
|
||||
body.dark-mode .card-header.bg-light {
|
||||
background-color: #333333 !important;
|
||||
color: #cccccc !important;
|
||||
}
|
||||
|
||||
body.dark-mode .list-group.list-group-flush .list-group-item {
|
||||
background-color: #141414 !important;
|
||||
color: #cccccc;
|
||||
border-bottom: 1px solid #333333;
|
||||
}
|
||||
</style>
|
||||
|
||||
{% block extra_head %}{% endblock %}
|
||||
</head>
|
||||
<body class="d-flex flex-column min-vh-100">
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
|
||||
<nav class="navbar navbar-expand-lg">
|
||||
<div class="container-fluid">
|
||||
|
||||
<a href="{{ url_for('index') }}" class="navbar-brand">RouterOS Update</a>
|
||||
<div>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarButtons" aria-controls="navbarButtons" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarContent" aria-controls="navbarContent" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="collapse navbar-collapse" id="navbarButtons">
|
||||
<div class="ms-auto">
|
||||
{% if current_user.is_authenticated %}
|
||||
<div class="btn-group me-2" role="group">
|
||||
<button type="button" class="btn btn-outline-light" onclick="window.location.href='{{ url_for('dashboard') }}'">Dashboard</button>
|
||||
<button type="button" class="btn btn-outline-light" onclick="window.location.href='{{ url_for('devices') }}'">Urządzenia</button>
|
||||
<button type="button" class="btn btn-outline-light" onclick="window.location.href='{{ url_for('logs') }}'">Logi</button>
|
||||
<button type="button" class="btn btn-outline-light" onclick="window.location.href='{{ url_for('settings') }}'">Ustawienia</button>
|
||||
<button type="button" class="btn btn-outline-light" onclick="window.location.href='{{ url_for('update_history') }}'">Historia aktualizacji</button>
|
||||
<button type="button" class="btn btn-outline-light" onclick="window.location.href='{{ url_for('anomalies') }}'">Anomalie</button>
|
||||
</div>
|
||||
<div class="btn-group" role="group">
|
||||
<button type="button" class="btn btn-outline-light" onclick="window.location.href='{{ url_for('reset_password') }}'">Reset hasła</button>
|
||||
<button type="button" class="btn btn-outline-light" onclick="window.location.href='{{ url_for('logout') }}'">Wyloguj</button>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="btn-group me-2" role="group">
|
||||
<button type="button" class="btn btn-outline-light" onclick="window.location.href='{{ url_for('login') }}'">Logowanie</button>
|
||||
<button type="button" class="btn btn-outline-light" onclick="window.location.href='{{ url_for('register') }}'">Rejestracja</button>
|
||||
<div class="collapse navbar-collapse" id="navbarContent">
|
||||
{% if current_user.is_authenticated %}
|
||||
<ul class="navbar-nav me-auto">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{{ url_for('dashboard') }}">Dashboard</a>
|
||||
</li>
|
||||
<li class="nav-item dropdown">
|
||||
<a class="nav-link dropdown-toggle" href="#" id="devicesDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
||||
Urządzenia
|
||||
</a>
|
||||
<ul class="dropdown-menu" aria-labelledby="devicesDropdown">
|
||||
<li><a class="dropdown-item" href="{{ url_for('devices') }}">Lista</a></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for('add_device') }}">Dodaj nowe</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{{ url_for('logs') }}">Logi</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{{ url_for('update_history') }}">Historia aktualizacji</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{{ url_for('anomalies') }}">Anomalie</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{{ url_for('settings') }}">Ustawienia</a>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="navbar-nav ms-auto align-items-center">
|
||||
<li class="nav-item me-2">
|
||||
<div class="form-check form-switch">
|
||||
<input class="form-check-input" type="checkbox" id="darkModeToggle">
|
||||
<label class="form-check-label" for="darkModeToggle">Tryb ciemny</label>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link btn btn-outline-light ms-2" href="{{ url_for('change_password') }}">Zmień hasło</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link btn btn-danger ms-2" href="{{ url_for('logout') }}">Wyloguj</a>
|
||||
</li>
|
||||
</ul>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main class="container my-4 flex-fill">
|
||||
{% with messages = get_flashed_messages() %}
|
||||
{% if messages %}
|
||||
<div class="alert alert-info">
|
||||
{% for message in messages %}
|
||||
<div>{{ message }}</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endwith %}
|
||||
{% block content %}{% endblock %}
|
||||
</main>
|
||||
|
||||
<footer class="footer bg-light py-3 mt-auto">
|
||||
<footer class="footer py-3 mt-auto">
|
||||
<div class="container text-center">
|
||||
<span class="text-muted">© 2025 RouterOS Update</span>
|
||||
<span class="text-muted">© 2025 Mateusz Gruszczyński, linuxiarz.pl</span>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<!-- Bootstrap JS -->
|
||||
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
|
||||
<!-- Bootstrap JS (bundle z Popper) -->
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const darkModeToggle = document.getElementById('darkModeToggle');
|
||||
function updateTheme() {
|
||||
if (localStorage.getItem("darkMode") === "enabled") {
|
||||
document.body.classList.add("dark-mode");
|
||||
document.body.classList.remove("light-mode");
|
||||
darkModeToggle.checked = true;
|
||||
} else {
|
||||
document.body.classList.add("light-mode");
|
||||
document.body.classList.remove("dark-mode");
|
||||
darkModeToggle.checked = false;
|
||||
}
|
||||
}
|
||||
darkModeToggle.addEventListener('change', function() {
|
||||
if (this.checked) {
|
||||
localStorage.setItem("darkMode", "enabled");
|
||||
} else {
|
||||
localStorage.setItem("darkMode", "disabled");
|
||||
}
|
||||
updateTheme();
|
||||
});
|
||||
updateTheme();
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const darkModeToggle = document.getElementById('darkModeToggle');
|
||||
function updateTheme() {
|
||||
if (localStorage.getItem("darkMode") === "enabled") {
|
||||
document.body.classList.add("dark-mode");
|
||||
document.body.classList.remove("light-mode");
|
||||
darkModeToggle.checked = true;
|
||||
} else {
|
||||
document.body.classList.add("light-mode");
|
||||
document.body.classList.remove("dark-mode");
|
||||
darkModeToggle.checked = false;
|
||||
}
|
||||
updatePrismTheme();
|
||||
}
|
||||
function updatePrismTheme() {
|
||||
const prismLink = document.getElementById('prism-style');
|
||||
if (prismLink) {
|
||||
if (localStorage.getItem("darkMode") === "enabled") {
|
||||
prismLink.setAttribute('href', 'https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-okaidia.min.css');
|
||||
} else {
|
||||
prismLink.setAttribute('href', 'https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-coy.min.css');
|
||||
}
|
||||
}
|
||||
}
|
||||
darkModeToggle.addEventListener('change', function() {
|
||||
if (this.checked) {
|
||||
localStorage.setItem("darkMode", "enabled");
|
||||
} else {
|
||||
localStorage.setItem("darkMode", "disabled");
|
||||
}
|
||||
updateTheme();
|
||||
});
|
||||
updateTheme();
|
||||
});
|
||||
</script>
|
||||
|
||||
{% block extra_scripts %}{% endblock %}
|
||||
</body>
|
||||
</html>
|
||||
|
@ -3,7 +3,7 @@
|
||||
{% block content %}
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-6">
|
||||
<h2 class="mb-4">Reset hasła</h2>
|
||||
<h2 class="mb-4">Zmiana hasła</h2>
|
||||
<form method="POST">
|
||||
<div class="mb-3">
|
||||
<label for="old_password" class="form-label">Stare hasło</label>
|
@ -3,7 +3,10 @@
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<h2 class="mb-4">Dashboard</h2>
|
||||
|
||||
<!-- Pierwszy wiersz z podstawowymi statystykami -->
|
||||
<div class="row">
|
||||
<!-- Karta z liczbą urządzeń -->
|
||||
<div class="col-md-3">
|
||||
<div class="card text-white bg-primary mb-3">
|
||||
<div class="card-body">
|
||||
@ -12,6 +15,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Karta z urządzeniami wymagającymi aktualizacji -->
|
||||
<div class="col-md-3">
|
||||
<div class="card text-white bg-danger mb-3">
|
||||
<div class="card-body">
|
||||
@ -20,6 +24,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Karta z liczbą logów -->
|
||||
<div class="col-md-3">
|
||||
<div class="card text-white bg-success mb-3">
|
||||
<div class="card-body">
|
||||
@ -28,15 +33,68 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Karta z wykonanymi aktualizacjami -->
|
||||
<div class="col-md-3">
|
||||
<div class="card text-white bg-secondary mb-3">
|
||||
<div class="card text-white bg-info mb-3">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Użytkownicy</h5>
|
||||
<p class="card-text display-6">{{ users_count }}</p>
|
||||
<h5 class="card-title">Wykonane aktualizacje</h5>
|
||||
<p class="card-text display-6">{{ update_history_count }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Możesz dodać dodatkowe statystyki lub wykresy poniżej -->
|
||||
|
||||
<!-- Nowy wiersz z najnowszymi wersjami systemu -->
|
||||
<div class="row mb-4">
|
||||
<div class="col-md-6">
|
||||
<div class="card text-white bg-secondary mb-3">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Najnowsza wersja RouterOS 7.x (Stable)</h5>
|
||||
{% if latest_version_7 %}
|
||||
<p class="card-text display-6">{{ latest_version_7.version | format_version }}</p>
|
||||
<p><small>{{ latest_version_7.timestamp.strftime('%Y-%b-%d') }}</small></p>
|
||||
<a href="{{ url_for('routeros_changelog', channel=latest_version_7.release_type, series='7.x', version=latest_version_7.version) }}" class="btn btn-light btn-sm">Czytaj changelog</a>
|
||||
{% else %}
|
||||
<p>Brak danych</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="card text-white bg-secondary mb-3">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Najnowsza wersja RouterOS 6.x (Stable)</h5>
|
||||
{% if latest_version_6 %}
|
||||
<p class="card-text display-6">{{ latest_version_6.version | format_version }}</p>
|
||||
<p><small>{{ latest_version_6.timestamp.strftime('%Y-%b-%d') }}</small></p>
|
||||
<a href="{{ url_for('routeros_changelog', channel=latest_version_6.release_type, series='6.x', version=latest_version_6.version) }}" class="btn btn-light btn-sm">Czytaj changelog</a>
|
||||
{% else %}
|
||||
<p>Brak danych</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Sekcja Ostatnie zdarzenia -->
|
||||
<div class="card mb-3 border-0">
|
||||
<div class="card-header bg-light py-2">
|
||||
<h6 class="mb-0">Ostatnie zdarzenia</h6>
|
||||
</div>
|
||||
|
||||
{% if recent_logs %}
|
||||
<ul class="list-group list-group-flush">
|
||||
{% for log in recent_logs %}
|
||||
<li class="list-group-item p-1 border-top-0 border-bottom">
|
||||
<small class="text-muted">{{ log.timestamp.strftime('%Y-%m-%d %H:%M:%S') }}</small>
|
||||
– {{ log.message|truncate(100) }}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% else %}
|
||||
<p class="mb-0">Brak ostatnich zdarzeń.</p>
|
||||
{% endif %}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
@ -1,5 +1,26 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Szczegóły urządzenia - RouterOS Update{% endblock %}
|
||||
{% block extra_head %}
|
||||
<style>
|
||||
/* Stylizacja kart w trybie ciemnym */
|
||||
body.dark-mode .card {
|
||||
background-color: #1e1e1e;
|
||||
color: #e0e0e0;
|
||||
border-color: #444;
|
||||
}
|
||||
/* Stylizacja bloku logów – przewijalny, z odpowiednim tłem i kolorem tekstu */
|
||||
.log-block {
|
||||
background-color: inherit;
|
||||
color: inherit;
|
||||
padding: 1rem;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 0.25rem;
|
||||
max-height: 300px;
|
||||
overflow-y: auto;
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<div class="container">
|
||||
<div class="my-4">
|
||||
@ -11,19 +32,10 @@
|
||||
</ol>
|
||||
</nav>
|
||||
</div>
|
||||
|
||||
<!-- Zakładki dla danych urządzenia i informacji o systemie -->
|
||||
<ul class="nav nav-tabs mb-3" id="deviceTab" role="tablist">
|
||||
<li class="nav-item" role="presentation">
|
||||
<button class="nav-link active" id="device-data-tab" data-bs-toggle="tab" data-bs-target="#device-data" type="button" role="tab" aria-controls="device-data" aria-selected="true">Dane urządzenia</button>
|
||||
</li>
|
||||
<li class="nav-item" role="presentation">
|
||||
<button class="nav-link" id="system-info-tab" data-bs-toggle="tab" data-bs-target="#system-info" type="button" role="tab" aria-controls="system-info" aria-selected="false">Informacje o systemie</button>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab-content" id="deviceTabContent">
|
||||
<!-- Dane urządzenia -->
|
||||
<div class="tab-pane fade show active" id="device-data" role="tabpanel" aria-labelledby="device-data-tab">
|
||||
|
||||
<!-- Dwukolumnowy układ: dane urządzenia i informacje o systemie -->
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="card mb-3">
|
||||
<div class="card-header bg-primary text-white">
|
||||
Dane urządzenia
|
||||
@ -55,10 +67,9 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Informacje o systemie -->
|
||||
<div class="tab-pane fade" id="system-info" role="tabpanel" aria-labelledby="system-info-tab">
|
||||
<div class="col-md-6">
|
||||
<div class="card mb-3">
|
||||
<div class="card-header bg-info text-white">
|
||||
<div class="card-header bg-primary text-white">
|
||||
Informacje o systemie
|
||||
</div>
|
||||
<div class="card-body">
|
||||
@ -85,19 +96,19 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Logi urządzenia w formie accordion -->
|
||||
<div class="accordion mb-3" id="logsAccordion">
|
||||
<div class="accordion-item">
|
||||
<h2 class="accordion-header" id="headingLogs">
|
||||
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseLogs" aria-expanded="false" aria-controls="collapseLogs">
|
||||
Logi urządzenia
|
||||
</button>
|
||||
</h2>
|
||||
<div id="collapseLogs" class="accordion-collapse collapse" aria-labelledby="headingLogs" data-bs-parent="#logsAccordion">
|
||||
<div class="accordion-body">
|
||||
<pre class="bg-light p-3" style="white-space: pre-wrap;">{{ device.last_log or 'Brak logów' }}</pre>
|
||||
<!-- Logi urządzenia jako pojedynczy blok tekstu -->
|
||||
<div class="card mb-3">
|
||||
<div class="card-header bg-secondary text-white">
|
||||
Logi urządzenia
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{% if device.last_log %}
|
||||
<div class="log-block">
|
||||
{{ device.last_log }}
|
||||
</div>
|
||||
</div>
|
||||
{% else %}
|
||||
<p>Brak logów</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
91
templates/routeros_changelog_tabs.html
Normal file
91
templates/routeros_changelog_tabs.html
Normal file
@ -0,0 +1,91 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Changelog RouterOS{% endblock %}
|
||||
{% block extra_head %}
|
||||
<!-- Dodajemy Prism.js – globalny arkusz stylów będzie zmieniany przez base.html -->
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-okaidia.min.css" id="prism-style">
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"></script>
|
||||
<style>
|
||||
|
||||
pre {
|
||||
background-color: #282c34;
|
||||
color: #abb2bf;
|
||||
font-size: 1.1rem;
|
||||
line-height: 1.5;
|
||||
padding: 1rem;
|
||||
border-radius: 0 0 5px 5px;
|
||||
overflow-x: auto;
|
||||
margin: 0;
|
||||
}
|
||||
</style>
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<div class="container py-4">
|
||||
<!-- Nagłówek z tytułem i przyciskami akcji (przyciski aktualizacji są tutaj, globalny dark mode toggle już w navbarze) -->
|
||||
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||
<h2>Changelog RouterOS</h2>
|
||||
<a href="{{ url_for('force_fetch_changelogs') }}"
|
||||
class="btn btn-danger"
|
||||
onclick="return confirm('Czy na pewno chcesz ręcznie pobrać wszystkie changelogi? Operacja usunie wszystkie stare wpisy.');">
|
||||
Aktualizuj changelogi
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<!-- Nawigacja po kanałach -->
|
||||
<ul class="nav nav-tabs mb-3">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link {% if channel=='stable' %}active{% endif %}" href="{{ url_for('routeros_changelog', channel='stable', series=series) }}">Stable</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link {% if channel=='rc' %}active{% endif %}" href="{{ url_for('routeros_changelog', channel='rc', series=series) }}">RC</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link {% if channel=='beta' %}active{% endif %}" href="{{ url_for('routeros_changelog', channel='beta', series=series) }}">Beta</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<!-- Nawigacja po seriach wersji -->
|
||||
<ul class="nav nav-pills mb-3">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link {% if series=='7.x' %}active{% endif %}" href="{{ url_for('routeros_changelog', channel=channel, series='7.x') }}">7.x</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link {% if series=='6.x' %}active{% endif %}" href="{{ url_for('routeros_changelog', channel=channel, series='6.x') }}">6.x</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<!-- Prezentacja wybranego wpisu changeloga -->
|
||||
{% if selected_entry %}
|
||||
<div class="mb-3">
|
||||
<h4 class="changelog-header">
|
||||
{{ selected_entry.version | format_version }}
|
||||
<small>({{ selected_entry.timestamp.strftime('%Y-%b-%d') }})</small>
|
||||
</h4>
|
||||
<pre><code class="language-plaintext">{{ selected_entry.details }}</code></pre>
|
||||
</div>
|
||||
{% else %}
|
||||
<p>Brak wpisów dla wybranych ustawień.</p>
|
||||
{% endif %}
|
||||
|
||||
<!-- Formularz wyboru innego wpisu -->
|
||||
{% if entries|length > 1 %}
|
||||
<form method="GET" action="{{ url_for('routeros_changelog') }}">
|
||||
<input type="hidden" name="channel" value="{{ channel }}">
|
||||
<input type="hidden" name="series" value="{{ series }}">
|
||||
<div class="input-group mb-3">
|
||||
<select name="version" class="form-select">
|
||||
{% for entry in entries %}
|
||||
<option value="{{ entry.version }}" {% if selected_entry and entry.version == selected_entry.version %}selected{% endif %}>
|
||||
{{ entry.version | format_version }} ({{ entry.timestamp.strftime('%Y-%b-%d') }})
|
||||
</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
<button class="btn btn-primary" type="submit">Pokaż changelog</button>
|
||||
</div>
|
||||
</form>
|
||||
{% endif %}
|
||||
|
||||
<div class="mt-4">
|
||||
<a href="{{ url_for('dashboard') }}" class="btn btn-secondary">Powrót do dashboardu</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
Reference in New Issue
Block a user