diff --git a/components/cms/CmsMannschaften.vue b/components/cms/CmsMannschaften.vue index e1ebdbf..c956334 100755 --- a/components/cms/CmsMannschaften.vue +++ b/components/cms/CmsMannschaften.vue @@ -204,20 +204,27 @@
- +
+ +

+ Noch keine importierten Spielplan-Teams verfügbar. +

+

- Nach dem myTischtennis-Import alle passenden Einträge auswählen (z. B. Liga und Pokal). Mit Strg bzw. Cmd lassen sich mehrere Einträge markieren. + Alle passenden Einträge auswählen (z. B. Liga und Pokal). Die Auswahl wird beim Speichern beibehalten.

@@ -447,8 +454,11 @@ function parseSpielerString(s) { if (!s) return []; return String(s).split(';'). function serializeSpielerList(list) { return (list || []).map(s => (s?.name || '').trim()).filter(Boolean).join('; ') } function serializeSpielerNames(names) { return (names || []).map(s => String(s || '').trim()).filter(Boolean).join('; ') } const selectedSpielplanTeamIds = computed(() => String(formData.value.spielplan_mannschaft_id || '').split(',').map(id => id.trim()).filter(Boolean)) -const updateSpielplanTeamIds = (event) => { - formData.value.spielplan_mannschaft_id = Array.from(event.target.selectedOptions, option => option.value).join(',') +const toggleSpielplanTeamId = (id, checked) => { + const ids = new Set(selectedSpielplanTeamIds.value) + if (checked) ids.add(id) + else ids.delete(id) + formData.value.spielplan_mannschaft_id = [...ids].join(',') } async function fetchCsvText(url) { diff --git a/server/utils/mannschaften-spielplan-ids.js b/server/utils/mannschaften-spielplan-ids.js index b5134dd..72ead0d 100644 --- a/server/utils/mannschaften-spielplan-ids.js +++ b/server/utils/mannschaften-spielplan-ids.js @@ -54,8 +54,9 @@ function romanToNumber(value) { return result || null } -function getCmsTeamCriteria(name) { - const youth = String(name || '').trim().match(/^jugend\s+j(\d{1,2})(?:\s+([ivx]+|\d+))?\b/i) +function getCmsTeamCriteria(name, league) { + const teamName = String(name || '').trim() + const youth = teamName.match(/^jugend\s+j(\d{1,2})(?:\s+([ivx]+|\d+))?\b/i) if (youth) { const rawNumber = youth[2] return { @@ -64,7 +65,18 @@ function getCmsTeamCriteria(name) { } } - const adult = String(name || '').trim().match(/^erwachsene\s+(\d+)\b/i) + // In bestehenden CMS-Daten steht die Altersklasse häufig nur in der Liga, + // z. B. Mannschaft "Jugend I" mit Liga "Jugend 13 (J13)". + const ageMatch = `${teamName} ${String(league || '')}`.match(/\b(?:jugend\s*|j\s*\(?)(\d{1,2})\b/i) + if (ageMatch) { + const ordinal = teamName.match(/^jugend\s+([ivx]+|\d+)\b/i)?.[1] + return { + ageClass: `Jugend ${ageMatch[1]}`, + teamNumber: ordinal ? (Number(ordinal) || romanToNumber(ordinal)) : null + } + } + + const adult = teamName.match(/^erwachsene\s+(\d+)\b/i) if (adult) return { ageClass: 'Erwachsene', teamNumber: Number(adult[1]) } return null } @@ -114,7 +126,7 @@ export async function synchronizeMannschaftenSpielplanIds(seasonSlug) { let updatedTeams = 0 for (const row of parsed.slice(1)) { - const criteria = getCmsTeamCriteria(row[0]) + const criteria = getCmsTeamCriteria(row[0], row[1]) if (!criteria) continue const ids = importedTeams .filter(team => team.ageClass === criteria.ageClass && (!criteria.teamNumber || team.teamNumber === criteria.teamNumber))