openvpn-endpoint-server/server/app/templates/dashboard/index.html

140 lines
5.6 KiB
HTML

{% extends "base.html" %}
{% block title %}Dashboard - mGuard VPN Manager{% endblock %}
{% block content %}
<div class="d-flex justify-content-between align-items-center mb-4">
<h1><i class="bi bi-speedometer2"></i> Dashboard</h1>
<button class="btn btn-outline-primary" hx-get="/htmx/dashboard/stats" hx-target="#stats-row" hx-swap="innerHTML">
<i class="bi bi-arrow-clockwise"></i> Aktualisieren
</button>
</div>
<!-- Stats Cards -->
<div class="row mb-4" id="stats-row">
<div class="col-md-3 mb-3">
<div class="card stat-card bg-primary text-white">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h6 class="card-subtitle mb-2 text-white-50">Gateways Online</h6>
<div class="stat-value">{{ stats.gateways_online }} / {{ stats.gateways_total }}</div>
</div>
<i class="bi bi-router stat-icon"></i>
</div>
</div>
</div>
</div>
<div class="col-md-3 mb-3">
<div class="card stat-card bg-success text-white">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h6 class="card-subtitle mb-2 text-white-50">Aktive Verbindungen</h6>
<div class="stat-value">{{ stats.active_connections }}</div>
</div>
<i class="bi bi-plug stat-icon"></i>
</div>
</div>
</div>
</div>
<div class="col-md-3 mb-3">
<div class="card stat-card bg-info text-white">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h6 class="card-subtitle mb-2 text-white-50">Endpunkte</h6>
<div class="stat-value">{{ stats.endpoints_total }}</div>
</div>
<i class="bi bi-hdd-network stat-icon"></i>
</div>
</div>
</div>
</div>
<div class="col-md-3 mb-3">
<div class="card stat-card bg-warning text-dark">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h6 class="card-subtitle mb-2">Benutzer</h6>
<div class="stat-value">{{ stats.users_total }}</div>
</div>
<i class="bi bi-people stat-icon"></i>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<!-- Gateway Status -->
<div class="col-lg-8 mb-4">
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0"><i class="bi bi-router"></i> Gateway Status</h5>
<a href="/gateways" class="btn btn-sm btn-outline-primary">Alle anzeigen</a>
</div>
<div class="card-body" hx-get="/htmx/gateways/status-list" hx-trigger="load, every 30s" hx-swap="innerHTML">
<div class="text-center py-4">
<div class="spinner-border text-primary" role="status">
<span class="visually-hidden">Laden...</span>
</div>
</div>
</div>
</div>
</div>
<!-- Recent Connections -->
<div class="col-lg-4 mb-4">
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0"><i class="bi bi-clock-history"></i> Letzte Verbindungen</h5>
<a href="/connections" class="btn btn-sm btn-outline-primary">Alle</a>
</div>
<div class="card-body" hx-get="/htmx/connections/recent" hx-trigger="load, every 60s" hx-swap="innerHTML">
<div class="text-center py-4">
<div class="spinner-border text-primary" role="status">
<span class="visually-hidden">Laden...</span>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Quick Actions -->
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header">
<h5 class="mb-0"><i class="bi bi-lightning"></i> Schnellaktionen</h5>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-3 mb-2">
<a href="/gateways/new" class="btn btn-outline-primary w-100">
<i class="bi bi-plus-circle"></i> Neues Gateway
</a>
</div>
<div class="col-md-3 mb-2">
<a href="/users/new" class="btn btn-outline-success w-100">
<i class="bi bi-person-plus"></i> Neuer Benutzer
</a>
</div>
<div class="col-md-3 mb-2">
<a href="/connections" class="btn btn-outline-info w-100">
<i class="bi bi-list-check"></i> Verbindungs-Log
</a>
</div>
<div class="col-md-3 mb-2">
<a href="/api/docs" target="_blank" class="btn btn-outline-secondary w-100">
<i class="bi bi-code-slash"></i> API Docs
</a>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}