This commit is contained in:
team3
2026-07-13 01:45:45 +02:00
parent 8cedcc87ec
commit 698bba6ccf
8 changed files with 82 additions and 31 deletions

View File

@@ -8,7 +8,7 @@ const emit = defineEmits(['schliessen'])
const wurzel = ref(null)
const pos = ref(0)
const fertig = ref(new Set()) // baustein-ids mit bestandener Abrufprüfung
const fertig = ref(new Set()) // baustein-ids mit abgeschlossenem Abruf
// Flache Screen-Liste aus den Guide-Daten (alle Kapitel/Level in ord):
// je Kapitel ein Intro, je Baustein Fundament + Abruf, am Ende ein Abschluss.
@@ -58,6 +58,11 @@ function taste(e) {
if (e.key === 'ArrowRight') vor()
else if (e.key === 'ArrowLeft') zurueck()
}
async function markFertig(bausteinId) {
if (fertig.value.has(bausteinId)) return
fertig.value = new Set([...fertig.value, bausteinId])
await api.bausteinFertig(props.topic, bausteinId).catch(() => {})
}
// ── Abrufprüfung (Karteikarten, Loop wie Ueben.vue) ─────────────────────────────
const stapel = ref([])
@@ -67,7 +72,6 @@ const sende = ref(false)
async function abrufLaden(bausteinId) {
stapel.value = await api.bausteinKarten(props.topic, bausteinId)
zeigeAntwort.value = false
if (!stapel.value.length) markFertig(bausteinId) // keine Karten → sofort bestanden
}
async function antworten(richtig) {
if (sende.value || !stapel.value.length) return
@@ -80,15 +84,10 @@ async function antworten(richtig) {
if (!stapel.value.length) markFertig(screen.value.baustein)
} finally { sende.value = false }
}
async function markFertig(bausteinId) {
if (fertig.value.has(bausteinId)) return
fertig.value = new Set([...fertig.value, bausteinId])
await api.bausteinFertig(props.topic, bausteinId).catch(() => {})
}
// Beim Betreten eines Abruf-Screens die Karten des Bausteins laden.
watch(screen, (s) => {
if (s.typ === 'abruf' && !fertig.value.has(s.baustein)) abrufLaden(s.baustein)
if (s.typ === 'abruf') abrufLaden(s.baustein)
})
// ── Fullscreen + Resume ─────────────────────────────────────────────────────────
@@ -101,7 +100,7 @@ onMounted(async () => {
try { await wurzel.value?.requestFullscreen() } catch { /* CSS-Overlay reicht als Fallback */ }
const stand = await api.lernstand(props.topic).catch(() => [])
fertig.value = new Set(stand.filter(s => s.status === 'fertig').map(s => s.baustein_id))
// Resume: zum Fundament des ersten noch nicht bestandenen Bausteins springen.
// Resume: zum Fundament des ersten noch nicht erledigten Bausteins springen.
const idx = screens.value.findIndex(s => s.typ === 'fundament' && !fertig.value.has(s.baustein))
pos.value = idx >= 0 ? idx : screens.value.length - 1
})
@@ -149,12 +148,12 @@ onUnmounted(() => {
</div>
<div class="lm-rest">noch {{ stapel.length }} · Box {{ stapel[0].box }}</div>
</div>
<div v-else class="lm-bestanden"> Abruf bestanden weiter mit </div>
<div v-else class="lm-bestanden"> Abruf durch weiter mit </div>
</section>
<section v-else class="lm-screen lm-ende">
<h1>Fundament abgeschlossen 🎉</h1>
<p class="lm-introtext">Schritt 2 (Fehlersuche) und Schritt 3 (Aufgaben) folgen.</p>
<p class="lm-introtext">Schritt 2 (Anwendung) und Schritt 3 (eigene Aufgaben) folgen.</p>
</section>
</main>