feat: update navigation link for club payments in dashboard and enhance error handling in Home view
All checks were successful
Deploy tt-tagebuch / deploy (push) Successful in 51s

This commit is contained in:
Torsten Schulz (local)
2026-07-22 16:17:19 +02:00
parent e38f2c2e19
commit 46079fc16e
6 changed files with 80 additions and 39 deletions

View File

@@ -610,7 +610,7 @@ export const getClubDashboard = async (req, res) => {
title: 'Finanzen',
value: paidRatio === null ? 'Keine Daten' : `${paidRatio} % erledigt`,
meta: paymentClaims.length > 0 ? `${paymentClaims.length} offene oder teilweise offene Forderungen` : 'Noch keine Beitragsforderungen erfasst',
to: '/club-tasks',
to: '/club-payments',
},
],
},

View File

@@ -17,17 +17,16 @@ sein. Danach wird der reale Kommunikationsversand abgesichert. Erst auf dieser
Basis lohnt sich der Ausbau von Nachvollziehbarkeit (Historie und Archiv) und
der letzte UX-Feinschliff.
1. Club-UI-Absicherung in den Kernviews
2. Kommunikation produktiv absichern
3. Historie und Archiv vertiefen
4. Restliche Club-UX und Dashboard verdichten
5. Erst danach das `mein-tt.de`-Produkt inhaltlich ausbauen
1. Restliche Club-UX und Dashboard verdichten
Der Player-Bereich `mein-tt.de` wird nicht mehr als Phase dieses Club-Plans
gefuehrt. Die eigenstaendige Roadmap steht in [mein-tt-product-plan.md](./mein-tt-product-plan.md).
## Arbeitsreihenfolge
### Phase 1: Absicherung der bestehenden Club-Views
Status: in Arbeit
Status: umgesetzt, abschliessender manueller Smoke-Check offen
Ziel:
- Keine haengenden Formulare bei Reload, Clubwechsel oder Auswahlwechsel.
@@ -66,6 +65,8 @@ Prioritaet innerhalb der Phase:
### Phase 2: Kommunikation produktiv absichern
Status: technisch umgesetzt, reale SMTP-Testzustellung und Betriebsdokumentation offen
Ziel:
- Nachrichtenfluss nicht nur funktional, sondern praxisnah robust machen.
@@ -87,6 +88,8 @@ Hinweis zur Abhaengigkeit:
### Phase 3: Historie und Archiv vertiefen
Status: umgesetzt
Ziel:
- Vergaengliche Vorgange muessen spaeter besser auffindbar und nachvollziehbar sein.
@@ -106,6 +109,8 @@ Hinweis zur Abhaengigkeit:
### Phase 4: Restliche Club-UX verdichten
Status: umgesetzt, manueller Bereichs-Smoketest vor Auslieferung empfohlen
Ziel:
- Das Dashboard und die Detailmodule sollen gleiche Sprache sprechen.
@@ -119,16 +124,6 @@ Fertig, wenn:
- Der Einstieg immer zur naechsten sinnvollen Aktion fuehrt.
- Die wichtigsten Statuswerte nicht doppelt oder widerspruechlich gezeigt werden.
### Phase 5: Player-Produkt erst danach
Ziel:
- `mein-tt.de` bekommt nur dann neue Inhalte, wenn die Club-Seite stabil ist.
Arbeitspakete:
- Anforderungen fuer Spieleransichten separat sammeln.
- Keine Club-spezifischen Workflows mehr in das Player-Produkt ziehen.
- Neue Spielerfeatures nur gegen eigene Prioritaeten und nicht als Restverwertung der Club-Roadmap planen.
## Nicht als naechstes anfassen
- Generelles Beitrags- und Tarifsystem mit Familienlogik, Alterslogik und Gueltigkeitszeitrainen.
@@ -137,26 +132,10 @@ Arbeitspakete:
## Konkrete naechste Tickets
### Jetzt
1. Club-UI-Smoke-Check und Kantenfallkorrekturen fuer Aufgaben und Kommunikation.
2. Club-UI-Smoke-Check und Kantenfallkorrekturen fuer Konten und Rechnungen.
3. Einheitliche Read-only-, Lade- und Fehlerzustaende in den vier Kernviews.
### Danach
4. SMTP-Test fuer Kommunikation mit realer Zieladresse und dokumentiertem Ergebnis.
5. Sichtbare Behandlung fehlender oder fehlerhafter SMTP-Konfiguration nachziehen.
6. Reply-To je Verein/Vorlage entscheiden und bei Bedarf umsetzen.
7. Dokumentanhaenge fuer Kommunikation und Vorlagen.
8. Serienvorlagen und wiederkehrende Nachrichtentypen.
### Anschliessend
9. Historie: Filter nach Modul und Vorgangstyp sowie Querverweise auf Zielobjekte.
10. Archiv: Suche, Schnellfilter und danach weitere Objektklassen.
11. Historie: Export auf Basis der stabilen Filter- und Objektstruktur.
12. Dashboard-Deep-Links, Schnellzugriffe und Statuskonsistenz abschliessen.
1. Dashboard-Deep-Links zwischen Mitgliedern, Zahlungen, Kommunikation und Archiv prüfen und vervollständigen.
2. Schnellzugriffe gegen die häufigsten Tagesaktionen abgleichen.
3. Statuswörter, Akzentfarben und Listenlabels vereinheitlichen.
4. Bereichsübergreifenden Smoke-Check für Navigation, Rechte und leere Zustände durchführen.
## Abhaengigkeiten

View File

@@ -0,0 +1,19 @@
# mein-tt.de: Produkt-Roadmap
Stand: 2026-07-22
## Abgrenzung
Diese Roadmap ist bewusst vom Club-Produkt getrennt. Spielerfunktionen dürfen
keine Vereinsworkflows, Vereinsrollen oder Verwaltungsdaten voraussetzen.
## Startpunkt
- Anforderungen aus Spielersicht sammeln und priorisieren.
- Bestehende Player-Ansichten, Datenquellen und Rechte prüfen.
- Ein erstes, eigenständiges Zielbild mit Nutzen, Zielgruppe und Erfolgskriterien festlegen.
## Noch zu füllen
Konkrete Features werden erst nach der Anforderungsaufnahme in Prioritäten,
Abhängigkeiten und umsetzbare Tickets überführt.

View File

@@ -0,0 +1,22 @@
<VirtualHost *:443>
ServerName tt-club.de
ServerAlias www.tt-club.de
# tt-club.de nutzt dieselbe ausgerollte Anwendung wie tt-tagebuch.de.
DocumentRoot /var/www/tt-tagebuch.de
<Directory /var/www/tt-tagebuch.de>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/tt-club.de_error.log
CustomLog ${APACHE_LOG_DIR}/tt-club.de_access.log combined
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/tt-club.de/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/tt-club.de/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
ProxyRequests Off
ProxyPass /api http://localhost:3050/api
ProxyPassReverse /api http://localhost:3050/api
ProxyPass / http://localhost:3050/
ProxyPassReverse / http://localhost:3050/
</VirtualHost>

9
docs/tt-club.de.conf Normal file
View File

@@ -0,0 +1,9 @@
# HTTP: www.tt-club.de und tt-club.de -> HTTPS
<VirtualHost *:80>
ServerName www.tt-club.de
Redirect permanent / https://tt-club.de/
</VirtualHost>
<VirtualHost *:80>
ServerName tt-club.de
Redirect permanent / https://tt-club.de/
</VirtualHost>

View File

@@ -105,7 +105,12 @@
</article>
</div>
</section>
<section v-if="!dashboardLoading && clubDashboardSections.length === 0" class="card club-dashboard-empty">
<section v-if="dashboardError" class="card club-dashboard-empty state-banner state-banner-error">
<h3>Dashboard konnte nicht geladen werden</h3>
<p>{{ dashboardError }}</p>
<button type="button" class="btn-secondary" @click="loadClubDashboard">Erneut versuchen</button>
</section>
<section v-else-if="!dashboardLoading && clubDashboardSections.length === 0" class="card club-dashboard-empty">
<h3>Noch keine Dashboard-Daten</h3>
<p v-if="!currentClub">
Wähle zuerst einen Verein aus, damit Aufgaben, Mitglieder, Trainings und Termine geladen werden.
@@ -743,6 +748,7 @@ export default {
return {
dashboardSectionsOverride: null,
dashboardLoading: false,
dashboardError: '',
};
},
computed: {
@@ -793,22 +799,28 @@ export default {
await this.loadClubDashboard();
},
},
appProduct() {
this.loadClubDashboard();
},
},
methods: {
...mapActions(['logout']),
async loadClubDashboard() {
if (!this.isTtVereinProduct || !this.isAuthenticated || !this.currentClub) {
this.dashboardSectionsOverride = null;
this.dashboardError = '';
return;
}
this.dashboardLoading = true;
this.dashboardError = '';
try {
const response = await apiClient.get(`/club-dashboard/${this.currentClub}`);
const sections = Array.isArray(response.data?.sections) ? response.data.sections : null;
this.dashboardSectionsOverride = sections && sections.length > 0 ? sections : null;
} catch (_error) {
} catch (error) {
this.dashboardSectionsOverride = null;
this.dashboardError = error?.response?.data?.error || 'Bitte prüfe deine Verbindung und versuche es erneut.';
} finally {
this.dashboardLoading = false;
}