feat: add player cancellation tracking and related database migrations
All checks were successful
Deploy tt-tagebuch / deploy (push) Successful in 57s
All checks were successful
Deploy tt-tagebuch / deploy (push) Successful in 57s
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
-- Speichert Absagen für Spieler eines Punktspiels.
|
||||
ALTER TABLE `match`
|
||||
ADD COLUMN `players_cancelled` JSON NULL AFTER `players_played`;
|
||||
@@ -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`
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user