feat: füge Importfunktion für Spielpläne von myTischtennis hinzu und verbessere den Ladevorgang
All checks were successful
Code Analysis and Production Deploy / analyze (push) Successful in 6m55s
Code Analysis and Production Deploy / deploy-production (push) Has been skipped
Code Analysis and Production Deploy / deploy-test (push) Successful in 2m43s

This commit is contained in:
Torsten Schulz (local)
2026-07-17 11:03:46 +02:00
parent f0e1ad39b0
commit 751c302036

View File

@@ -6,6 +6,13 @@
Spielpläne bearbeiten
</h2>
<div class="space-x-3">
<button
:disabled="isImporting"
class="inline-flex items-center px-3 py-1.5 sm:px-4 sm:py-2 rounded-lg bg-blue-600 text-white hover:bg-blue-700 text-sm sm:text-base disabled:bg-blue-300"
@click="importFromMyTischtennis"
>
{{ isImporting ? 'Importiert...' : 'Von myTischtennis importieren' }}
</button>
<button
class="inline-flex items-center px-3 py-1.5 sm:px-4 sm:py-2 rounded-lg bg-green-600 text-white hover:bg-green-700 text-sm sm:text-base"
@click="showUploadModal = true"
@@ -343,6 +350,7 @@ const fileInput = ref(null)
const modalFileInput = ref(null)
const showUploadModal = ref(false)
const isProcessing = ref(false)
const isImporting = ref(false)
const processingMessage = ref('')
const isDragOver = ref(false)
const currentFile = ref(null)
@@ -410,18 +418,37 @@ const save = async () => {
} catch (error) { console.error('Fehler:', error); alert('Fehler beim Speichern!') }
}
const loadCurrentSpielplan = async () => {
try {
const response = await fetch('/api/spielplan')
if (!response.ok) return
const result = await response.json()
if (!result.success || !Array.isArray(result.headers) || !Array.isArray(result.data)) return
csvHeaders.value = result.headers
csvData.value = result.data.map(row => csvHeaders.value.map(header => row[header] || ''))
selectedColumns.value = new Array(csvHeaders.value.length).fill(true)
currentFile.value = { name: result.season ? `spielplan-${result.season}.json` : 'spielplan.csv', entries: csvData.value.length, lastModified: null }
} catch { /* ignore */ }
}
const importFromMyTischtennis = async () => {
if (!confirm('Spielplan jetzt direkt von myTischtennis aktualisieren?')) return
isImporting.value = true
try {
const response = await fetch('/api/cms/import-spielplan', { method: 'POST' })
const result = await response.json()
if (!response.ok || !result.success) throw new Error(result.statusMessage || result.message || 'Import fehlgeschlagen')
await loadCurrentSpielplan()
alert(result.message || 'Spielplan erfolgreich aktualisiert.')
} catch (error) {
console.error('Spielplan-Import fehlgeschlagen:', error)
alert(`Fehler beim Import: ${error.message || 'Unbekannter Fehler'}`)
} finally {
isImporting.value = false
}
}
const closeUploadModal = () => { showUploadModal.value = false; selectedFile.value = null; if (modalFileInput.value) modalFileInput.value.value = '' }
onMounted(() => {
(async () => {
try {
const response = await fetch('/api/spielplan'); if (!response.ok) return
const result = await response.json(); if (!result.success || !Array.isArray(result.headers) || !Array.isArray(result.data)) return
csvHeaders.value = result.headers
csvData.value = result.data.map(row => csvHeaders.value.map(header => row[header] || ''))
selectedColumns.value = new Array(csvHeaders.value.length).fill(true)
currentFile.value = { name: result.season ? `spielplan-${result.season}.json` : 'spielplan.csv', entries: csvData.value.length, lastModified: null }
} catch { /* ignore */ }
})()
})
onMounted(loadCurrentSpielplan)
</script>