naprawa bledow i poprawki ux
This commit is contained in:
@ -1,13 +0,0 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
<h2>Dodaj nowy router</h2>
|
||||
<form method="POST">
|
||||
<label>Nazwa: <input type="text" name="name" required></label><br>
|
||||
<label>Adres IP/Host: <input type="text" name="host" required></label><br>
|
||||
<label>Port SSH: <input type="number" name="port" value="22"></label><br>
|
||||
<label>Użytkownik SSH: <input type="text" name="ssh_user" value="admin"></label><br>
|
||||
<label>Klucz prywatny (string/ścieżka): <textarea name="ssh_key"></textarea></label><br>
|
||||
<label>Hasło SSH: <input type="password" name="ssh_password"></label><br><br>
|
||||
<button type="submit">Zapisz</button>
|
||||
</form>
|
||||
{% endblock %}
|
@ -48,24 +48,6 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Dodatkowe statystyki -->
|
||||
<div class="card mb-4 shadow-sm">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Dodatkowe statystyki</h5>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<p><strong>Czas działania:</strong> {{ uptime }}</p>
|
||||
<p><strong>Aktualny czas:</strong> {{ current_time.strftime('%Y-%m-%d %H:%M:%S') }}</p>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<p><strong>Całkowity rozmiar dysku:</strong> {{ disk_total|filesize }}</p>
|
||||
<p><strong>Zajęte (/data):</strong> {{ disk_used|filesize }} ({{ disk_usage_percent|round(2) }}%)</p>
|
||||
<p><strong>Wolne:</strong> {{ disk_free|filesize }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Przyciski akcji dla wszystkich routerów -->
|
||||
<div class="row mb-4">
|
||||
<div class="col-md-6 d-flex justify-content-center">
|
||||
@ -107,7 +89,7 @@
|
||||
</div>
|
||||
|
||||
<!-- Log operacji -->
|
||||
<div class="card shadow-sm">
|
||||
<div class="card shadow-sm mb-4">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Log operacji</h5>
|
||||
<table class="table table-sm table-bordered">
|
||||
@ -129,5 +111,23 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Dodatkowe statystyki przeniesione na sam dół, pod logami -->
|
||||
<div class="card shadow-sm">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Dodatkowe statystyki</h5>
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<p><strong>Czas działania:</strong> {{ uptime }}</p>
|
||||
<p><strong>Aktualny czas:</strong> {{ current_time.strftime('%Y-%m-%d %H:%M:%S') }}</p>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<p><strong>Całkowity rozmiar dysku:</strong> {{ disk_total|filesize }}</p>
|
||||
<p><strong>Zajęte (/data):</strong> {{ disk_used|filesize }} ({{ disk_usage_percent|round(2) }}%)</p>
|
||||
<p><strong>Wolne:</strong> {{ disk_free|filesize }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
@ -2,6 +2,7 @@
|
||||
{% block content %}
|
||||
<div class="container my-4">
|
||||
<h2>Porównanie: {{ backup1.file_path|basename }} vs {{ backup2.file_path|basename }}</h2>
|
||||
<hr>
|
||||
<div id="diffContainer"></div>
|
||||
<a href="{{ url_for('router_details', router_id=backup1.router_id) }}" class="btn btn-secondary mt-3">Powrót</a>
|
||||
</div>
|
||||
|
@ -1,5 +1,12 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
<div class="text-end mb-3">
|
||||
{% if current_view == 'v1' %}
|
||||
<a href="{{ url_for('router_details', router_id=router.id, view='v2') }}" class="btn btn-outline-secondary">Przełącz na widok v2</a>
|
||||
{% else %}
|
||||
<a href="{{ url_for('router_details', router_id=router.id, view='v1') }}" class="btn btn-outline-secondary">Przełącz na widok v1</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
<h2>Router: {{ router.name }}</h2>
|
||||
<p>
|
||||
<strong>Host:</strong> {{ router.host }} |
|
||||
|
226
templates/router_details_v2.html
Normal file
226
templates/router_details_v2.html
Normal file
@ -0,0 +1,226 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
<div class="text-end mb-3">
|
||||
{% if current_view == 'v1' %}
|
||||
<a href="{{ url_for('router_details', router_id=router.id, view='v2') }}" class="btn btn-outline-secondary">Przełącz na widok v2</a>
|
||||
{% else %}
|
||||
<a href="{{ url_for('router_details', router_id=router.id, view='v1') }}" class="btn btn-outline-secondary">Przełącz na widok v1</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="container my-4">
|
||||
<!-- Informacje o routerze -->
|
||||
<div class="card shadow-sm mb-4">
|
||||
<div class="card-header">
|
||||
<h2 class="mb-0">Router: {{ router.name }}</h2>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p>
|
||||
<strong>Host:</strong> {{ router.host }} |
|
||||
<strong>Port:</strong> {{ router.port }} |
|
||||
<strong>SSH User:</strong> {{ router.ssh_user }}
|
||||
</p>
|
||||
<div class="d-flex flex-wrap gap-2">
|
||||
<!-- Mniejsze przyciski górne -->
|
||||
<form action="{{ url_for('router_export', router_id=router.id) }}" method="POST" class="d-inline">
|
||||
<button type="submit" class="btn btn-primary">Wykonaj /export</button>
|
||||
</form>
|
||||
<form action="{{ url_for('router_backup', router_id=router.id) }}" method="POST" class="d-inline">
|
||||
<button type="submit" class="btn btn-secondary">Wykonaj backup binarny</button>
|
||||
</form>
|
||||
<a href="{{ url_for('edit_router', router_id=router.id) }}" class="btn btn-warning">Edytuj ustawienia</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Zakładki z backupami -->
|
||||
<ul class="nav nav-tabs" id="routerTab" role="tablist">
|
||||
<li class="nav-item" role="presentation">
|
||||
<button class="nav-link active" id="export-tab" data-bs-toggle="tab" data-bs-target="#export" type="button" role="tab" aria-controls="export" aria-selected="true">Pliki /export</button>
|
||||
</li>
|
||||
<li class="nav-item" role="presentation">
|
||||
<button class="nav-link" id="binary-tab" data-bs-toggle="tab" data-bs-target="#binary" type="button" role="tab" aria-controls="binary" aria-selected="false">Pliki binarne</button>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab-content" id="routerTabContent">
|
||||
<!-- Zakładka /export -->
|
||||
<div class="tab-pane fade show active" id="export" role="tabpanel" aria-labelledby="export-tab">
|
||||
<div class="card mt-3 shadow-sm">
|
||||
<div class="card-body">
|
||||
{% if export_backups %}
|
||||
<!-- Formularz masowych akcji dla eksportów -->
|
||||
<form id="export_mass_actions_form" action="{{ url_for('download_zip') }}" method="POST" class="mb-3">
|
||||
<div class="d-flex justify-content-end">
|
||||
<button type="submit" name="action" value="download" class="btn btn-lg btn-success">
|
||||
<i class="bi bi-file-earmark-zip"></i> Pobierz zaznaczone (.zip)
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
<!-- Tabela z eksportami z podzielonymi kolumnami akcji -->
|
||||
<table class="table table-bordered table-striped">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th style="width: 3%;"><input type="checkbox" id="select_all_export"></th>
|
||||
<th>Nazwa pliku</th>
|
||||
<th>Rozmiar</th>
|
||||
<th>Data</th>
|
||||
<th>Diff</th>
|
||||
<th>Pobierz</th>
|
||||
<th>Podgląd</th>
|
||||
<th>Wyślij mailem</th>
|
||||
<th>Usuń</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for b in export_backups %}
|
||||
<tr>
|
||||
<td>
|
||||
<input type="checkbox" name="backup_id" value="{{ b.id }}" form="export_mass_actions_form">
|
||||
</td>
|
||||
<td>{{ b.file_path|basename }}</td>
|
||||
<td>{{ b.file_path|filesize }}</td>
|
||||
<td>{{ b.created_at.strftime("%Y-%m-%d %H:%M:%S") }}</td>
|
||||
<td>
|
||||
{% if loop.index0 > 0 %}
|
||||
<a href="{{ url_for('diff_view', backup_id1=b.id, backup_id2=export_backups[0].id) }}" class="btn btn-sm btn-info">Diff</a>
|
||||
{% else %}
|
||||
<small>Brak nowszego</small>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
<a href="{{ url_for('download_file', filename=b.file_path|basename) }}" class="btn btn-lg btn-info" title="Pobierz">
|
||||
<i class="bi bi-download"></i>
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="{{ url_for('view_export', backup_id=b.id) }}" class="btn btn-lg btn-outline-primary" title="Podgląd">
|
||||
<i class="bi bi-eye"></i>
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
<form action="{{ url_for('send_by_email', backup_id=b.id) }}" method="POST" class="d-inline">
|
||||
<input type="hidden" name="next" value="{{ url_for('router_details', router_id=router.id) }}">
|
||||
<button type="submit" class="btn btn-lg btn-primary" title="Wyślij mailem">
|
||||
<i class="bi bi-envelope"></i>
|
||||
</button>
|
||||
</form>
|
||||
</td>
|
||||
<td>
|
||||
<form action="{{ url_for('delete_backup', backup_id=b.id) }}" method="POST" class="d-inline" onsubmit="return confirm('Na pewno usunąć backup?');">
|
||||
<input type="hidden" name="next" value="{{ url_for('router_details', router_id=router.id) }}">
|
||||
<button type="submit" class="btn btn-lg btn-danger" title="Usuń">
|
||||
<i class="bi bi-trash"></i>
|
||||
</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<p class="text-muted">Brak plików /export.</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Zakładka backupów binarnych -->
|
||||
<div class="tab-pane fade" id="binary" role="tabpanel" aria-labelledby="binary-tab">
|
||||
<div class="card mt-3 shadow-sm">
|
||||
<div class="card-body">
|
||||
{% if binary_backups %}
|
||||
<!-- Formularz masowych akcji dla backupów binarnych -->
|
||||
<form id="binary_mass_actions_form" action="{{ url_for('download_zip') }}" method="POST" class="mb-3">
|
||||
<div class="d-flex justify-content-end">
|
||||
<button type="submit" name="action" value="download" class="btn btn-lg btn-success">
|
||||
<i class="bi bi-file-earmark-zip"></i> Pobierz zaznaczone (.zip)
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
<!-- Tabela z backupami binarnymi z podzielonymi kolumnami akcji -->
|
||||
<table class="table table-bordered table-striped">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th style="width: 3%;"><input type="checkbox" id="select_all_binary"></th>
|
||||
<th>Nazwa pliku</th>
|
||||
<th>Rozmiar</th>
|
||||
<th>Data</th>
|
||||
<th>Pobierz</th>
|
||||
<th>Wgraj do routera</th>
|
||||
<th>Wyślij mailem</th>
|
||||
<th>Usuń</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for b in binary_backups %}
|
||||
<tr>
|
||||
<td>
|
||||
<input type="checkbox" name="backup_id" value="{{ b.id }}" form="binary_mass_actions_form">
|
||||
</td>
|
||||
<td>{{ b.file_path|basename }}</td>
|
||||
<td>{{ b.file_path|filesize }}</td>
|
||||
<td>{{ b.created_at.strftime("%Y-%m-%d %H:%M:%S") }}</td>
|
||||
<td>
|
||||
<a href="{{ url_for('download_file', filename=b.file_path|basename) }}" class="btn btn-lg btn-info" title="Pobierz">
|
||||
<i class="bi bi-download"></i>
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
<form action="{{ url_for('upload_backup', router_id=router.id, backup_id=b.id) }}" method="POST" class="d-inline">
|
||||
<button type="submit" class="btn btn-lg btn-secondary" title="Wgraj do routera">
|
||||
<i class="bi bi-upload"></i>
|
||||
</button>
|
||||
</form>
|
||||
</td>
|
||||
<td>
|
||||
<form action="{{ url_for('send_by_email', backup_id=b.id) }}" method="POST" class="d-inline">
|
||||
<button type="submit" class="btn btn-lg btn-primary" title="Wyślij mailem">
|
||||
<i class="bi bi-envelope"></i>
|
||||
</button>
|
||||
</form>
|
||||
</td>
|
||||
<td>
|
||||
<form action="{{ url_for('delete_backup', backup_id=b.id) }}" method="POST" class="d-inline" onsubmit="return confirm('Na pewno usunąć backup?');">
|
||||
<input type="hidden" name="next" value="{{ url_for('router_details', router_id=router.id) }}">
|
||||
<button type="submit" class="btn btn-lg btn-danger" title="Usuń">
|
||||
<i class="bi bi-trash"></i>
|
||||
</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<p class="text-muted">Brak plików binarnych.</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Skrypty do obsługi zaznaczania checkboxów w każdej zakładce -->
|
||||
<script>
|
||||
document.getElementById('select_all_export').addEventListener('change', function(e) {
|
||||
var checkboxes = document.querySelectorAll('input[name="backup_id"][form="export_mass_actions_form"]');
|
||||
for (var i = 0; i < checkboxes.length; i++) {
|
||||
checkboxes[i].checked = e.target.checked;
|
||||
}
|
||||
});
|
||||
document.getElementById('select_all_binary').addEventListener('change', function(e) {
|
||||
var checkboxes = document.querySelectorAll('input[name="backup_id"][form="binary_mass_actions_form"]');
|
||||
for (var i = 0; i < checkboxes.length; i++) {
|
||||
checkboxes[i].checked = e.target.checked;
|
||||
}
|
||||
});
|
||||
|
||||
// Inicjalizacja zakładek Bootstrap (jeśli nie są już inicjowane globalnie)
|
||||
var triggerTabList = [].slice.call(document.querySelectorAll('#routerTab button'));
|
||||
triggerTabList.forEach(function (triggerEl) {
|
||||
var tabTrigger = new bootstrap.Tab(triggerEl);
|
||||
triggerEl.addEventListener('click', function (event) {
|
||||
event.preventDefault();
|
||||
tabTrigger.show();
|
||||
});
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
@ -1,24 +0,0 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
<h2>Moje Routery</h2>
|
||||
<a href="{{ url_for('add_router') }}">+ Dodaj nowy router</a>
|
||||
|
||||
<table border="1" cellpadding="5" cellspacing="0">
|
||||
<tr>
|
||||
<th>Nazwa</th>
|
||||
<th>Host</th>
|
||||
<th>Port</th>
|
||||
<th>Akcje</th>
|
||||
</tr>
|
||||
{% for r in routers %}
|
||||
<tr>
|
||||
<td>{{ r.name }}</td>
|
||||
<td>{{ r.host }}</td>
|
||||
<td>{{ r.port }}</td>
|
||||
<td>
|
||||
<a href="{{ url_for('router_details', router_id=r.id) }}">Szczegóły</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
{% endblock %}
|
@ -1,43 +0,0 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
<h2>Router: {{ router.name }}</h2>
|
||||
<p>Host: {{ router.host }} | Port: {{ router.port }} | SSH User: {{ router.ssh_user }}</p>
|
||||
|
||||
<!-- Akcje: Wykonaj export, Wykonaj backup binarny -->
|
||||
<form action="{{ url_for('router_export', router_id=router.id) }}" method="POST" style="display:inline;">
|
||||
<button type="submit">Wykonaj export (/export)</button>
|
||||
</form>
|
||||
|
||||
<form action="{{ url_for('router_backup', router_id=router.id) }}" method="POST" style="display:inline;">
|
||||
<button type="submit">Wykonaj backup binarny</button>
|
||||
</form>
|
||||
<a href="{{ url_for('edit_router', router_id=router.id) }}" class="btn btn-warning mb-3">
|
||||
Edytuj ustawienia
|
||||
</a>
|
||||
<h3>Lista Backupów</h3>
|
||||
<table border="1" cellpadding="5" cellspacing="0">
|
||||
<tr>
|
||||
<th>Data</th>
|
||||
<th>Plik</th>
|
||||
<th>Typ</th>
|
||||
<th>Diff</th>
|
||||
</tr>
|
||||
{% for b in backups %}
|
||||
<tr>
|
||||
<td>{{ b.created_at }}</td>
|
||||
<td>{{ b.file_path | basename }}</td>
|
||||
<td>{{ b.backup_type }}</td>
|
||||
<td>
|
||||
{# Przy diff potrzebujemy wybrać, do którego backupu porównać #}
|
||||
{# Można przygotować prosty select lub link do innej podstrony #}
|
||||
{# Dla uproszczenia link do b1=b.id, b2=ostatni? #}
|
||||
{# Lub w widoku trzeba by rozwinąć logikę #}
|
||||
<!-- Tu tylko pokazujemy, że jest taka opcja: -->
|
||||
<small>Diff z innym exportem: np.
|
||||
<a href="{{ url_for('diff_view', backup_id1=b.id, backup_id2=backups[0].id if backups|length > 0 else b.id) }}">porównaj z najnowszym</a>
|
||||
</small>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
{% endblock %}
|
@ -2,7 +2,7 @@
|
||||
{% block content %}
|
||||
<div class="container my-5">
|
||||
<div class="card shadow-sm">
|
||||
<div class="card-header bg-primary text-white">
|
||||
<div class="card-header">
|
||||
<h2 class="mb-0">Ustawienia globalne</h2>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
@ -27,6 +27,10 @@
|
||||
<!-- Sekcja SMTP -->
|
||||
<div class="mb-4">
|
||||
<h4 class="mb-3">Powiadomienia - SMTP (e-mail)</h4>
|
||||
<div class="mb-3 form-check">
|
||||
<input type="checkbox" class="form-check-input" id="smtp_notifications_enabled" name="smtp_notifications_enabled" {% if settings.smtp_notifications_enabled %}checked{% endif %}>
|
||||
<label class="form-check-label" for="smtp_notifications_enabled">Włącz powiadomienia SMTP</label>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="smtp_host" class="form-label">SMTP Host</label>
|
||||
<input type="text" class="form-control" id="smtp_host" name="smtp_host" value="{{ settings.smtp_host }}">
|
||||
|
@ -2,6 +2,7 @@
|
||||
{% block content %}
|
||||
<div class="container my-4">
|
||||
<h2>Podgląd eksportu: {{ backup.file_path|basename }}</h2>
|
||||
<hr>
|
||||
<textarea id="exportEditor" readonly>{{ content|e }}</textarea>
|
||||
<a href="{{ next_url }}" class="btn btn-secondary">Powrót</a>
|
||||
</div>
|
||||
|
Reference in New Issue
Block a user