Leicht-Level implementiert: Online-Training mit 3 Karten, Weiss Ich / Weiss Ich Nicht, Tracking der Lernfortschritte

This commit is contained in:
2026-02-04 13:37:24 +01:00
parent f7857e6408
commit cc1058a3d1
3 changed files with 299 additions and 38 deletions

View File

@@ -12,7 +12,7 @@
</header> </header>
<div class="main-wrapper"> <div class="main-wrapper">
<div class="section-title" id="title"> <div class="section-title" id="title">
<div class="content" "> <div class="content">
<label for="inputText" class="inputText">Sende deine Wortliste an ChatGPT mit folgender Anweisung:</label> <label for="inputText" class="inputText">Sende deine Wortliste an ChatGPT mit folgender Anweisung:</label>
</div> </div>
<div id="aufgabe_fuer_gpt"> <div id="aufgabe_fuer_gpt">
@@ -30,7 +30,7 @@
</div> </div>
<div id="inputHinweis"> <div id="inputHinweis">
<div class="content"> <div class="content">
<label for="inputText" class="section-title">Füge deinen Text hier ein</label> <label for="inputText" class="section-title">Füge deinen Text hier ein:</label>
<textarea id="inputText" placeholder="Hier Text einfügen..."></textarea> <textarea id="inputText" placeholder="Hier Text einfügen..."></textarea>
</div> </div>
</div> </div>
@@ -38,21 +38,40 @@
<div class="button-wrapper"> <div class="button-wrapper">
<button id="kartenErstellen">Karten erstellen</button> <button id="kartenErstellen">Karten erstellen</button>
</div> </div>
<div id="modusAuswahlSeite" style="display:none; text-align:center; margin-top:20px;"> <div id="modusAuswahlSeite" style="display:none">
<h2>Wählt einen Modus:</h2> <h2>Wählt einen Modus:</h2>
<button class="modus-btn" data-modus="druck">📄 PDF erstellen</button> <button class="modus-btn" data-modus="druck">📄 PDF erstellen</button>
<button class="modus-btn" data-modus="training_einfach">🃏 Online-Training</button> <button class="modus-btn" data-modus="training_einfach">🃏 Online-Training</button>
<button class="modus-btn" data-modus="statistik">📊 Statistik</button> <button class="modus-btn" data-modus="statistik">📊 Statistik</button>
</div> </div>
<div id="kartenContainer"></div> <div id="pdfPages" class="modus-view">
<div id="kartenContainer"></div>
<div class="button-wrapper">
<button id="druckenBtn" style="display:none;">Drucken</button>
</div>
</div>
<div id="onlineTraining" class="modus-view">
<div id="trainingLevels">
<h3>Wählt einen Schwierigkeitsgrad:</h3>
<button class="level-btn" data-level="leicht">🟢 Leicht</button>
<button class="level-btn" data-level="mittel">🟡 Mittel</button>
<button class="level-btn" data-level="schwer">🔴 Schwer</button>
</div>
<div id="trainingLeicht" class="training-view modus-view"></div>
<div id="trainingMittel" class="training-view"></div>
<div id="trainingSchwer" class="training-view"></div>
</div>
<div id="trainingContainer" style="display:none; text-align:center; margin-top:30px;"></div>
<div id="flashcards-container"></div> <div id="flashcards-container"></div>
<div class="button-wrapper">
<button id="druckenBtn" style="display:none;">Drucken</button> <script src="eigenerCode.js"></script>
</div> </div>
<script src="eigenerCode.js"></script>
</div>
</body> </body>
</html> </html>

View File

@@ -8,29 +8,6 @@ document.getElementById('copyButton').addEventListener('click', () => {
}).catch(err => { }).catch(err => {
console.error('Konnte nicht kopieren: ', err); console.error('Konnte nicht kopieren: ', err);
}); });
for (let i = 0; i < parsedArray.length; i += 8) {
const pageFront = document.createElement("div");
pageFront.className = "page_front";
const pageBack = document.createElement("div");
pageBack.className = "page_back";
const currentSlice = parsedArray.slice(i, i + 8);
currentSlice.forEach(karte => {
const frontCard = document.createElement("div");
frontCard.className = "card";
frontCard.innerHTML = `<h2>${karte.englisch}</h2><div>${karte.ipa}</div><p>${karte.beispielEN}</p>`;
pageFront.appendChild(frontCard);
const backCard = document.createElement("div");
backCard.className = "card";
backCard.innerHTML = `<h2>${karte.deutsch}</h2><p>${karte.beispielDE}</p>`;
pageBack.appendChild(backCard);
});
container.appendChild(pageFront);
container.appendChild(pageBack);
}
}); });
function parseWordText(inputText) { function parseWordText(inputText) {
@@ -85,13 +62,12 @@ button.addEventListener("click", () => {
alert("Karten erfolgreich erstellt!"); alert("Karten erfolgreich erstellt!");
showView("modusAuswahlSeite");
document.getElementById("title").style.display = "none"; document.getElementById("title").style.display = "none";
button.style.display = "none"; button.style.display = "none";
document.getElementById("modusAuswahlSeite").style.display = "block"; document.getElementById("modusAuswahlSeite").style.display = "block";
}); });
document.querySelectorAll(".modus-btn").forEach(button => { document.querySelectorAll(".modus-btn").forEach(button => {
@@ -141,11 +117,193 @@ function createPDFPages(wordArray) {
kartenContainer.appendChild(backPage); kartenContainer.appendChild(backPage);
document.getElementById("druckenBtn").style.display = "block"; document.getElementById("druckenBtn").style.display = "block";
} }
alert("PDF-Seiten wurden erstellt! Du kannst sie jetzt druken."); alert("PDF-Seiten wurden erstellt! Du kannst sie jetzt drucken.");
} }
document.getElementById("druckenBtn").addEventListener("click", () => { document.getElementById("druckenBtn").addEventListener("click", () => {
window.print(); window.print();
}); });
const modusBtns = document.querySelectorAll('.modus-btn');
const trainingLevels = document.getElementById('trainingLevels');
modusBtns.forEach(btn => {
btn.addEventListener('click', () => {
const modus = btn.dataset.modus;
if (modus === 'druck') {
showView('pdfPages');
}
else if (modus === 'training_einfach') {
showView('trainingLevels');
}
else if (modus === 'statistik') {
console.log("Statistik anzeigen...");
}
});
});
let trainingsZustand = {
modus: "leicht",
quelleKarten: [],
aktiveKarten: [],
gelernt: [],
nichtGelernt: [],
};
function startLeichtTraining() {
console.log("🔥 startLeichtTraining вызвана");
if (!parsedArray || parsedArray.length === 0) {
alert("Нет карточек для тренировки");
return;
}
trainingsZustand.quelleKarten = [...parsedArray];
trainingsZustand.aktiveKarten = [];
trainingsZustand.gelernt = [];
trainingsZustand.nichtGelernt = [];
for (let i = 0; i < 3; i++) {
if (trainingsZustand.quelleKarten.length > 0) {
const karte = trainingsZustand.quelleKarten.shift();
karte.versuche = 0;
trainingsZustand.aktiveKarten.push(karte);
}
}
zeigeNaechsteKarte();
}
function zeigeNaechsteKarte() {
if (
trainingsZustand.aktiveKarten.length === 0 &&
trainingsZustand.quelleKarten.length === 0
) {
alert(`Training beendet!
Gelernt: ${trainingsZustand.gelernt.length}
Nicht gelernt: ${trainingsZustand.nichtGelernt.length}`);
return;
}
const index = Math.floor(
Math.random() * trainingsZustand.aktiveKarten.length
);
trainingsZustand.aktuelleKarte =
trainingsZustand.aktiveKarten[index];
renderLeichtKarte(trainingsZustand.aktuelleKarte);
}
function renderLeichtKarte(karte) {
const container = document.getElementById("trainingLeicht");
container.innerHTML = "";
const cardEl = document.createElement("div");
cardEl.className = "training-card";
cardEl.innerHTML = `
<div class="training-card-inner">
<div class="training-front">
<h2>${karte.englisch}</h2>
<div class="ipa">${karte.ipa}</div>
<div class="example">${karte.beispielEN}</div>
</div>
<div class="training-back">
<h2>${karte.deutsch}</h2>
<div class="example">${karte.beispielDE}</div>
</div>
</div>
`;
cardEl.onclick = () => cardEl.classList.toggle("flip");
const actions = document.createElement("div");
actions.className = "training-actions";
actions.innerHTML = `
<button id="knowBtn">✔️ Weiß ich</button>
<button id="dontKnowBtn">❌ Weiß ich nicht</button>
`;
actions.querySelector("#knowBtn").onclick = () => antworteAufKarte(true);
actions.querySelector("#dontKnowBtn").onclick = () => antworteAufKarte(false);
container.appendChild(cardEl);
container.appendChild(actions);
}
function antworteAufKarte(weißIch) {
const karte = trainingsZustand.aktuelleKarte;
if (weißIch) {
trainingsZustand.gelernt.push(karte);
trainingsZustand.aktiveKarten = trainingsZustand.aktiveKarten.filter(k => k !== karte);
} else {
karte.versuche++;
if (karte.versuche >= 5) {
trainingsZustand.nichtGelernt.push(karte);
trainingsZustand.aktiveKarten = trainingsZustand.aktiveKarten.filter(k => k !== karte);
} else {
trainingsZustand.aktiveKarten.push(trainingsZustand.aktiveKarten.splice(trainingsZustand.aktiveKarten.indexOf(karte), 1)[0]);
}
}
if (trainingsZustand.aktiveKarten.length < 3 && trainingsZustand.quelleKarten.length > 0) {
let neueKarte = trainingsZustand.quelleKarten.shift();
neueKarte.versuche = 0;
trainingsZustand.aktiveKarten.push(neueKarte);
}
zeigeNaechsteKarte();
}
function showView(id) {
document.querySelectorAll(".modus-view").forEach(view => {
view.style.display = "none";
});
const active = document.getElementById(id);
if (active) {
active.style.display = "block";
}
}
function showTrainingLevel(id) {
document.querySelectorAll(".training-view").forEach(view => {
view.style.display = "none";
});
const active = document.getElementById(id);
if (active) {
active.style.display = "block";
}
}
document.querySelectorAll(".level-btn").forEach(btn => {
btn.addEventListener("click", () => {
const level = btn.dataset.level;
if (level === "leicht") {
showTrainingLevel("trainingLeicht");
startLeichtTraining();
}
if (level === "mittel") {
showTrainingLevel("trainingMittel");
startMittelTraining();
}
if (level === "schwer") {
showTrainingLevel("trainingSchwer");
startSchwerTraining();
}
});
});
document
.querySelector(".modus-btn[data-modus='training_einfach']")
.addEventListener("click", () => {
showView("onlineTraining");
});

View File

@@ -280,3 +280,87 @@ h1 {
padding: 0; padding: 0;
} }
} }
.training-card {
width: 300px;
height: 180px;
margin: 10px auto;
perspective: 1000px;
cursor: pointer;
}
.training-card-inner {
width: 100%;
height: 100%;
position: relative;
transition: transform 0.6s;
transform-style: preserve-3d;
}
.training-card.flip .training-card-inner {
transform: rotateY(180deg);
}
.training-front,
.training-back {
position: absolute;
width: 100%;
height: 100%;
backface-visibility: hidden;
border: 2px solid #333;
border-radius: 10px;
padding: 15px;
box-sizing: border-box;
display: flex;
flex-direction: column;
justify-content: center;
gap: 10px;
}
.training-back {
transform: rotateY(180deg);
background: #f3f3f3;
}
.training-actions {
text-align: center;
margin-top: 15px;
}
.training-actions button {
margin: 0 10px;
padding: 8px 16px;
font-size: 16px;
cursor: pointer;
}
.training-front h2 {
margin-bottom: 4px;
margin-top: -25px;
}
.training-front .ipa {
font-size: 16px;
color: #555;
margin-bottom: 34px;
margin-top: -12px;
}
.training-front .example {
font-size: 15px;
line-height: 1.4;
}
.training-back h2 {
margin-bottom: 54px;
margin-top: -28px;
}
.modus-view {
display: none;
}
.training-view {
display: none;
margin-top: 25px;
}