Leicht-Level implementiert: Online-Training mit 3 Karten, Weiss Ich / Weiss Ich Nicht, Tracking der Lernfortschritte
This commit is contained in:
@@ -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,20 +38,39 @@
|
|||||||
<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="pdfPages" class="modus-view">
|
||||||
<div id="kartenContainer"></div>
|
<div id="kartenContainer"></div>
|
||||||
|
|
||||||
<div id="flashcards-container"></div>
|
|
||||||
<div class="button-wrapper">
|
<div class="button-wrapper">
|
||||||
<button id="druckenBtn" style="display:none;">Drucken</button>
|
<button id="druckenBtn" style="display:none;">Drucken</button>
|
||||||
</div>
|
</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>
|
||||||
|
|
||||||
<script src="eigenerCode.js"></script>
|
<script src="eigenerCode.js"></script>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -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");
|
||||||
|
});
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user