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
All checks were successful
Deploy tt-tagebuch / deploy (push) Successful in 51s
This commit is contained in:
@@ -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',
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
19
docs/mein-tt-product-plan.md
Normal file
19
docs/mein-tt-product-plan.md
Normal 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.
|
||||
22
docs/tt-club.de-le-ssl.conf
Normal file
22
docs/tt-club.de-le-ssl.conf
Normal 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
9
docs/tt-club.de.conf
Normal 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>
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user