feat(tournament): add sourceUrl field and implement repair logic for tournaments
All checks were successful
Deploy tt-tagebuch / deploy (push) Successful in 16m19s

This commit is contained in:
Torsten Schulz (local)
2026-09-04 13:12:01 +02:00
parent c16883f381
commit fe152d537d
4 changed files with 91 additions and 2 deletions

View File

@@ -544,6 +544,22 @@
</div>
</div>
</div>
<div v-else-if="parsed && parsed.parsedData" class="workspace-detail calendar-entry-detail">
<div class="selected-tournament-strip">
<div class="selected-tournament-main">
<span class="selected-tournament-label">Aktives Turnier</span>
<strong>{{ parsed.parsedData.title || '' }}</strong>
</div>
<div class="selected-tournament-meta">
<span>{{ parsed.parsedData.termin || '' }}</span>
<span v-if="calendarEntryLocationLabel">{{ calendarEntryLocationLabel }}</span>
</div>
</div>
<div class="calendar-entry-empty">
<h3>Kalendereintrag geöffnet</h3>
<p>Für dieses Turnier sind noch keine Konkurrenzen hinterlegt. Importiere eine Ausschreibung als PDF, sobald du Teilnehmer oder Ergebnisse verwalten möchtest.</p>
</div>
</div>
<div v-else class="workspace-detail empty-workspace">
<div class="empty-workspace-card">
<h3>Kein aktives Turnier ausgewählt</h3>
@@ -995,6 +1011,9 @@ export default {
const placeLine = places.find((entry) => /^PLZ\s*\/\s*Ort:/i.test(entry || ''));
return placeLine ? placeLine.replace(/^PLZ\s*\/\s*Ort:/i, '').trim() : '';
},
calendarEntryLocationLabel() {
return (this.parsed?.parsedData?.austragungsorte || []).filter(Boolean).join(' · ');
},
registrationDeadlineAt() {
const deadlines = [
...(this.parsed?.parsedData?.meldeschluesse || []),
@@ -1648,6 +1667,7 @@ export default {
const response = await apiClient.post(`/official-tournaments/${this.currentClub}/suggestions/${suggestion.id}/save`);
await Promise.all([this.loadSuggestions(), this.loadList()]);
this.uploadedId = String(response.data.id);
await this.reload();
this.workspaceTab = 'saved';
} catch (error) { this.suggestionError = getSafeErrorMessage(error, 'Der Vorschlag konnte nicht gespeichert werden.'); }
},
@@ -2229,6 +2249,10 @@ export default {
.empty-workspace-card { max-width: 540px; text-align: center; color: #516074; }
.empty-workspace-card h3 { margin: 0 0 .45rem; color: #17366d; }
.empty-workspace-card p { margin: 0; }
.calendar-entry-detail { min-height: 220px; }
.calendar-entry-empty { padding: 2.5rem 1rem; text-align: center; color: #516074; }
.calendar-entry-empty h3 { margin: 0 0 .45rem; color: #17366d; }
.calendar-entry-empty p { max-width: 640px; margin: 0 auto; }
.overview-header { display: flex; justify-content: space-between; gap: 1rem; align-items: flex-start; flex-wrap: wrap; }
.overview-main { display: flex; flex-direction: column; gap: .9rem; flex: 1; min-width: min(100%, 520px); }
.workflow-badges { display: flex; flex-wrap: wrap; gap: .45rem; }