feat: add persistent badges and admin badge page

This commit is contained in:
2026-04-13 10:19:38 +02:00
parent 3c99c3683e
commit c36abe82a8
27 changed files with 576 additions and 100 deletions

View File

@@ -1,8 +1,17 @@
{% extends "base.html" %}
{% from "partials/macros.html" import avatar, nav_icon %}
{% from "partials/macros.html" import avatar, badge_chip, nav_icon %}
{% block title %}Optionen · Putzliga{% endblock %}
{% block page_title %}Optionen{% endblock %}
{% block content %}
<section class="settings-tabs">
{% for endpoint, label, icon in settings_tabs %}
<a href="{{ url_for(endpoint) }}" class="settings-tab {% if active_settings_tab == endpoint %}is-active{% endif %}">
{{ nav_icon(icon) }}
<span>{{ label }}</span>
</a>
{% endfor %}
</section>
<section class="two-column">
<article class="panel">
<p class="eyebrow">Profil & Benachrichtigungen</p>
@@ -70,35 +79,19 @@
</section>
<section class="panel">
<p class="eyebrow">Gamification</p>
<h2>Badge-Regeln pflegen</h2>
{% if current_user.is_admin %}
<div class="badge-settings">
{% for badge in badges %}
<form method="post" action="{{ url_for('settings.update_badge', badge_id=badge.id) }}" class="badge-setting-card">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
<div>
<strong>{{ badge.name }}</strong>
<p class="muted">{{ badge.description }}</p>
</div>
<div class="field field--compact">
<label>Schwelle</label>
<input type="number" name="threshold" min="1" value="{{ badge.threshold }}">
</div>
<div class="field field--compact">
<label>Bonus</label>
<input type="number" name="bonus_points" min="0" value="{{ badge.bonus_points }}">
</div>
<label class="checkbox checkbox--compact">
<input type="checkbox" name="active" {% if badge.active %}checked{% endif %}>
<span>Aktiv</span>
</label>
<button type="submit" class="button button--secondary">Badge speichern</button>
</form>
<p class="eyebrow">Deine Trophäenwand</p>
<h2>Freigeschaltete Badges</h2>
{% if earned_badges %}
<div class="earned-badges-grid">
{% for badge in earned_badges %}
{{ badge_chip(badge) }}
{% endfor %}
</div>
{% else %}
<p class="muted">Badge-Regeln können nur von einem Admin geändert werden.</p>
<p class="muted">Noch keine Badges freigeschaltet. Die ersten kommen schnell, sobald Aufgaben erledigt werden.</p>
{% endif %}
{% if current_user.is_admin %}
<p class="inline-note">Badge-Regeln verwaltest du auf der separaten <a href="{{ url_for('settings.badges') }}">Badge-Seite</a>.</p>
{% endif %}
</section>