diff --git a/frontend/src/components/tournament/TournamentPlacementsTab.vue b/frontend/src/components/tournament/TournamentPlacementsTab.vue new file mode 100644 index 0000000..6f8f071 --- /dev/null +++ b/frontend/src/components/tournament/TournamentPlacementsTab.vue @@ -0,0 +1,458 @@ + + + + + + diff --git a/frontend/src/i18n/locales/de.json b/frontend/src/i18n/locales/de.json index 18ce619..605f35d 100644 --- a/frontend/src/i18n/locales/de.json +++ b/frontend/src/i18n/locales/de.json @@ -589,6 +589,10 @@ "tabGroups": "Gruppen", "tabParticipants": "Teilnehmer", "tabResults": "Ergebnisse", + "tabPlacements": "Platzierungen", + "finalPlacements": "Endplatzierungen", + "groupPlacements": "Gruppenplatzierungen", + "noPlacementsYet": "Noch keine Platzierungen vorhanden.", "participants": "Teilnehmer", "seeded": "Gesetzt", "club": "Verein", diff --git a/frontend/src/views/TournamentTab.vue b/frontend/src/views/TournamentTab.vue index 2db7fa5..03112d9 100644 --- a/frontend/src/views/TournamentTab.vue +++ b/frontend/src/views/TournamentTab.vue @@ -61,6 +61,11 @@ :class="['tab-button', { 'active': activeTab === 'results' }]"> {{ $t('tournaments.tabResults') }} + @@ -203,6 +208,21 @@ @start-knockout="startKnockout" @reset-knockout="resetKnockout" /> + + + @@ -239,6 +259,7 @@ import TournamentConfigTab from '../components/tournament/TournamentConfigTab.vu import TournamentGroupsTab from '../components/tournament/TournamentGroupsTab.vue'; import TournamentParticipantsTab from '../components/tournament/TournamentParticipantsTab.vue'; import TournamentResultsTab from '../components/tournament/TournamentResultsTab.vue'; +import TournamentPlacementsTab from '../components/tournament/TournamentPlacementsTab.vue'; export default { name: 'TournamentTab', components: { @@ -247,7 +268,8 @@ export default { TournamentConfigTab, TournamentGroupsTab, TournamentParticipantsTab, - TournamentResultsTab + TournamentResultsTab, + TournamentPlacementsTab }, props: { allowsExternal: { @@ -1670,28 +1692,34 @@ export default { }, async removeParticipant(p) { - if (this.allowsExternal && p.isExternal) { - // Externer Teilnehmer - await apiClient.delete('/tournament/external-participant', { - data: { - clubId: this.currentClub, - tournamentId: this.selectedDate, - participantId: p.id - } - }); - this.externalParticipants = this.externalParticipants.filter(x => x.id !== p.id); - } else { - // Interner Teilnehmer - await apiClient.delete('/tournament/participant', { - data: { - clubId: this.currentClub, - tournamentId: this.selectedDate, - participantId: p.id - } - }); - this.participants = this.participants.filter(x => x.id !== p.id); + try { + if (this.allowsExternal && p.isExternal) { + // Externer Teilnehmer + await apiClient.delete('/tournament/external-participant', { + data: { + clubId: this.currentClub, + tournamentId: this.selectedDate, + participantId: p.id + } + }); + this.externalParticipants = this.externalParticipants.filter(x => x.id !== p.id); + } else { + // Interner Teilnehmer + await apiClient.delete('/tournament/participant', { + data: { + clubId: this.currentClub, + tournamentId: this.selectedDate, + participantId: p.id + } + }); + this.participants = this.participants.filter(x => x.id !== p.id); + } + await this.loadTournamentData(); + } catch (error) { + console.error('Fehler beim Entfernen des Teilnehmers:', error); + const message = safeErrorMessage(error, 'Fehler beim Entfernen des Teilnehmers.'); + await this.showInfo('Fehler', message, '', 'error'); } - await this.loadTournamentData(); }, async onGroupCountChange() {