- Python/Flask Backend - SQLAlchemy Models (notes, tasks, templates, users) - Gunicorn + Nginx Deploy-Konfiguration - Static Assets (CSS/JS) - Jinja2 Templates
83 lines
4.1 KiB
HTML
Executable File
83 lines
4.1 KiB
HTML
Executable File
{% extends 'base.html' %}
|
|
{% block title %}Dashboard - NotesManager{% endblock %}
|
|
{% block content %}
|
|
<div class="d-flex justify-content-between align-items-center mb-4 flex-wrap gap-2">
|
|
<div>
|
|
<h1 class="h2 mb-1">Dashboard</h1>
|
|
<div class="text-muted">Stand: {{ today.strftime('%d.%m.%Y') }}</div>
|
|
</div>
|
|
<div class="d-flex gap-2">
|
|
<a href="{{ url_for('main.entry_new') }}" class="btn btn-primary">Neuer Eintrag</a>
|
|
<a href="{{ url_for('main.export_markdown') }}" class="btn btn-outline-secondary">Markdown-Export</a>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row g-3 mb-4">
|
|
<div class="col-md-3"><div class="card stat-card"><div class="card-body"><div class="stat-number">{{ stats.entries_total }}</div><div class="text-muted">Einträge gesamt</div></div></div></div>
|
|
<div class="col-md-3"><div class="card stat-card"><div class="card-body"><div class="stat-number">{{ stats.entries_today }}</div><div class="text-muted">Einträge heute</div></div></div></div>
|
|
<div class="col-md-3"><div class="card stat-card"><div class="card-body"><div class="stat-number">{{ stats.templates_total }}</div><div class="text-muted">Vorlagen</div></div></div></div>
|
|
<div class="col-md-3"><div class="card stat-card"><div class="card-body"><div class="stat-number">{{ stats.open_tasks }}</div><div class="text-muted">Offene Aufgaben</div></div></div></div>
|
|
</div>
|
|
|
|
<div class="row g-4">
|
|
<div class="col-lg-7">
|
|
<div class="card shadow-sm">
|
|
<div class="card-body">
|
|
<h2 class="h5 mb-3">Neueste Dokumentation</h2>
|
|
{% if latest_entries %}
|
|
<div class="list-group list-group-flush">
|
|
{% for item in latest_entries %}
|
|
<a href="{{ url_for('main.entry_view', entry_id=item.id) }}" class="list-group-item list-group-item-action">
|
|
<div class="d-flex justify-content-between flex-wrap gap-2">
|
|
<strong>{{ item.title }}</strong>
|
|
<span class="badge text-bg-secondary">{{ item.work_date.strftime('%d.%m.%Y') }}</span>
|
|
</div>
|
|
<div class="small text-muted">{{ item.category }} · {{ item.system_name or 'kein System' }} · {{ item.status }}</div>
|
|
</a>
|
|
{% endfor %}
|
|
</div>
|
|
{% else %}
|
|
<p class="text-muted">Noch keine Einträge vorhanden.</p>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-lg-5">
|
|
<div class="card shadow-sm mb-4">
|
|
<div class="card-body">
|
|
<h2 class="h5 mb-3">Heutige Einträge</h2>
|
|
{% if entries_today %}
|
|
<ul class="list-group list-group-flush">
|
|
{% for item in entries_today %}
|
|
<li class="list-group-item px-0">
|
|
<strong>{{ item.title }}</strong><br>
|
|
<span class="small text-muted">{{ item.category }} · {{ item.priority }} · {{ item.created_by }}</span>
|
|
</li>
|
|
{% endfor %}
|
|
</ul>
|
|
{% else %}
|
|
<p class="text-muted mb-0">Heute gibt es noch keine Einträge.</p>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
<div class="card shadow-sm">
|
|
<div class="card-body">
|
|
<h2 class="h5 mb-3">Offene Aufgaben</h2>
|
|
{% if open_tasks %}
|
|
<ul class="list-group list-group-flush">
|
|
{% for task in open_tasks[:6] %}
|
|
<li class="list-group-item px-0">
|
|
<strong>{{ task.title }}</strong><br>
|
|
<span class="small text-muted">{{ task.priority }}{% if task.due_date %} · Fällig {{ task.due_date.strftime('%d.%m.%Y') }}{% endif %}</span>
|
|
</li>
|
|
{% endfor %}
|
|
</ul>
|
|
{% else %}
|
|
<p class="text-muted mb-0">Keine offenen Aufgaben.</p>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|