feat: add player cancellation tracking and related database migrations
All checks were successful
Deploy tt-tagebuch / deploy (push) Successful in 57s

This commit is contained in:
Torsten Schulz (local)
2026-09-22 15:14:26 +02:00
parent a1f509e23e
commit 1fb7afc951
3 changed files with 38 additions and 5 deletions

View File

@@ -0,0 +1,3 @@
-- Speichert Absagen für Spieler eines Punktspiels.
ALTER TABLE `match`
ADD COLUMN `players_cancelled` JSON NULL AFTER `players_played`;

View File

@@ -22,6 +22,34 @@ Ergaenzend:
- Manuelle Migrationsschritte gehoeren in diese Datei, nicht nur in Chat-Verlaeufe oder Commit-Messages.
- Wenn eine Aenderung rueckwaertskompatibel ist, soll das hier explizit vermerkt werden.
## 2026-09-22
### `match.players_cancelled`
Speichert die Spielabsagen als Liste von Mitglieder-IDs. Die Anwendung schließt
eine Absage gegenläufig zu „Will spielen“, Einsatzplanung und „Gespielt“ aus.
```sql
ALTER TABLE `match`
ADD COLUMN `players_cancelled` JSON NULL AFTER `players_played`;
```
Die Änderung ist additiv und rückwärtskompatibel: Bestehende Spiele haben
zunächst keine gespeicherten Absagen.
### `member.deactivated_at` und `diary_dates.non_deactivated_member_count`
```sql
ALTER TABLE `member`
ADD COLUMN `deactivated_at` DATETIME NULL;
ALTER TABLE `diary_dates`
ADD COLUMN `non_deactivated_member_count` INT NULL;
```
Die neuen Felder werden nur für neue Deaktivierungen bzw. neu angelegte
Trainingstage befüllt. Historische Werte werden bewusst nicht geschätzt.
## 2026-07-22
### `member.user_id`

View File

@@ -364,7 +364,7 @@
v-model="playerSelectionDialog.isOpen"
:title="`${$t('schedule.playerSelection')} - ${playerSelectionDialog.match?.homeTeam?.name || ''} ${$t('schedule.vs')} ${playerSelectionDialog.match?.guestTeam?.name || ''}`"
@close="closePlayerSelectionDialog"
:max-width="800"
:max-width="850"
>
<div v-if="playerSelectionDialog.loading" class="loading-state">
{{ $t('schedule.loadingMembers') }}
@@ -417,7 +417,7 @@
<input
type="checkbox"
:checked="member.isPlanned"
:disabled="playerSelectionDialog.readonly || member.isCancelled"
:disabled="playerSelectionDialog.readonly || member.isCancelled || !member.isReady"
@change="togglePlayerPlanned(member)"
/>
</td>
@@ -425,7 +425,7 @@
<input
type="checkbox"
:checked="member.hasPlayed"
:disabled="playerSelectionDialog.readonly || member.isCancelled"
:disabled="playerSelectionDialog.readonly || member.isCancelled || !member.isReady || !member.isPlanned"
@change="togglePlayerPlayed(member)"
/>
</td>
@@ -1558,8 +1558,7 @@ export default {
setPlayerResponse(member, value) {
member.isReady = value === 'ready';
member.isCancelled = value === 'cancelled';
if (member.isCancelled) {
member.isReady = false;
if (!member.isReady) {
member.isPlanned = false;
member.hasPlayed = false;
}
@@ -1567,6 +1566,9 @@ export default {
togglePlayerPlanned(member) {
member.isPlanned = !member.isPlanned;
if (!member.isPlanned) {
member.hasPlayed = false;
}
},
togglePlayerPlayed(member) {