Möchtest du die Aufnahme neu starten? Deine aktuelle Aufnahme wird dadurch überschrieben.
Möchtest du die Aufnahme neu starten? Deine aktuelle Aufnahme wird dadurch überschrieben.
+
Ja, neu starten
Abbrechen
@@ -285,7 +305,8 @@
Aufnahme neu starten?
Super!
-
Toll! Du hast deine Aufgaben abgegeben. Wenn du magst, kannst du deine sie hier herunterladen.
+
Toll! Du hast deine Aufgaben abgegeben. Wenn du magst, kannst du deine sie hier
+ herunterladen.
📥 Ergebnisse herunterladen
@@ -329,7 +350,7 @@
Super!
themeToggle.checked = false;
}
- themeToggle.addEventListener('change', function() {
+ themeToggle.addEventListener('change', function () {
if (this.checked) {
document.documentElement.setAttribute('data-theme', 'dark');
} else {
@@ -344,40 +365,40 @@
Super!
});
// **Neue Funktion zur Browserkompatibilitätsprüfung**
- function checkBrowserCompatibility() {
- // Überprüfen, ob getUserMedia und MediaRecorder verfügbar sind
- if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {
- return false;
- }
- if (!window.MediaRecorder) {
- return false;
- }
- if (!window.JSZip) {
- return false;
- }
- return true;
-}
+ function checkBrowserCompatibility() {
+ // Überprüfen, ob getUserMedia und MediaRecorder verfügbar sind
+ if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {
+ return false;
+ }
+ if (!window.MediaRecorder) {
+ return false;
+ }
+ if (!window.JSZip) {
+ return false;
+ }
+ return true;
+ }
// Funktionen zum Laden, Speichern und Initialisieren der Aufgaben
-async function saveTasksToLocalStorage() {
- // Nur die URL des Blobs speichern, nicht den Blob selbst
- if (storedTasks.task1.audioBlob) {
- storedTasks.task1.savedAudioURL = URL.createObjectURL(storedTasks.task1.audioBlob);
- delete storedTasks.task1.audioBlob; // Entfernen Sie den Blob aus dem Objekt
- }
-
- if (storedTasks.task2.proofDataURL) {
- storedTasks.task2.savedProofURL = URL.createObjectURL(storedTasks.task2.proofDataURL); // Erstellen einer URL für das Bild
- delete storedTasks.task2.proofDataURL; // Entfernen Sie das Bild-Blob aus dem Objekt
- }
-
- try {
- localStorage.setItem("tasks", JSON.stringify(storedTasks));
- } catch (error) {
- console.error("Speichern im localStorage fehlgeschlagen:", error);
- showValidationModal("Speichern fehlgeschlagen. Bitte prüfe den verfügbaren Speicherplatz.");
- }
-}
+ async function saveTasksToLocalStorage() {
+ // Nur die URL des Blobs speichern, nicht den Blob selbst
+ if (storedTasks.task1.audioBlob) {
+ storedTasks.task1.savedAudioURL = URL.createObjectURL(storedTasks.task1.audioBlob);
+ delete storedTasks.task1.audioBlob; // Entfernen Sie den Blob aus dem Objekt
+ }
+
+ if (storedTasks.task2.proofDataURL) {
+ storedTasks.task2.savedProofURL = URL.createObjectURL(storedTasks.task2.proofDataURL); // Erstellen einer URL für das Bild
+ delete storedTasks.task2.proofDataURL; // Entfernen Sie das Bild-Blob aus dem Objekt
+ }
+
+ try {
+ localStorage.setItem("tasks", JSON.stringify(storedTasks));
+ } catch (error) {
+ console.error("Speichern im localStorage fehlgeschlagen:", error);
+ showValidationModal("Speichern fehlgeschlagen. Bitte prüfe den verfügbaren Speicherplatz.");
+ }
+ }
async function loadTasksFromLocalStorage() {
try {
@@ -405,7 +426,7 @@
Super!
}
// Laden und Anzeigen des gespeicherten Beweises
- if (savedProofURL && savedProofURL !== "") {
+ if (savedProofURL && savedProofURL !== "") {
document.getElementById("proofName").innerText = "Foto geladen";
const proofPreview = document.getElementById("proofPreview");
proofPreview.href = savedProofURL;
@@ -514,7 +535,7 @@
Super!
input.classList.add("input", "input-bordered", "w-full", "max-w-xs");
input.dataset.index = index;
input.value = task.userAnswer || "";
- input.addEventListener('input', function() {
+ input.addEventListener('input', function () {
if (submitted) return;
this.value = this.value.replace(/[^0-9\.\-]/g, ''); // Filtert nicht-numerische Eingaben
storedTasks.task3.mathTasks[this.dataset.index].userAnswer = this.value; // Speichern der Benutzerantwort
@@ -612,8 +633,8 @@
Super!
isRecording = true; // Aufnahme läuft jetzt
startRecording().then(() => {
- document.getElementById("task1Progress").classList.remove("hidden");
- startTimer(1); // Timer starten
+ document.getElementById("task1Progress").classList.remove("hidden");
+ startTimer(1); // Timer starten
}).catch((error) => {
startText.innerText = "Starten";
startIcon.textContent = "▶️";
@@ -626,42 +647,42 @@
Super!
}
});
}
-async function startRecording() {
- if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {
- throw new Error("Audioaufnahme nicht möglich. Ihr Gerät oder Browser unterstützt diese Funktion nicht.");
- }
-
- try {
- const audioStream = await navigator.mediaDevices.getUserMedia({ audio: true });
-
- const mimeType = MediaRecorder.isTypeSupported('audio/webm') ? 'audio/webm' : 'audio/mp4';
- const mediaRecorder = new MediaRecorder(audioStream, { mimeType });
-
- const audioChunks = [];
- mediaRecorder.ondataavailable = event => audioChunks.push(event.data);
-
- mediaRecorder.start();
- isRecording = true;
-
- // Rückgabewert des Recorders setzen
- recorder = {
- mediaRecorder,
- audioStream,
- stopRecording: () => new Promise(resolve => {
- mediaRecorder.onstop = () => {
- const audioBlob = new Blob(audioChunks, { type: mimeType });
- resolve(audioBlob);
+ async function startRecording() {
+ if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {
+ throw new Error("Audioaufnahme nicht möglich. Ihr Gerät oder Browser unterstützt diese Funktion nicht.");
+ }
+
+ try {
+ const audioStream = await navigator.mediaDevices.getUserMedia({ audio: true });
+
+ const mimeType = MediaRecorder.isTypeSupported('audio/webm') ? 'audio/webm' : 'audio/mp4';
+ const mediaRecorder = new MediaRecorder(audioStream, { mimeType });
+
+ const audioChunks = [];
+ mediaRecorder.ondataavailable = event => audioChunks.push(event.data);
+
+ mediaRecorder.start();
+ isRecording = true;
+
+ // Rückgabewert des Recorders setzen
+ recorder = {
+ mediaRecorder,
+ audioStream,
+ stopRecording: () => new Promise(resolve => {
+ mediaRecorder.onstop = () => {
+ const audioBlob = new Blob(audioChunks, { type: mimeType });
+ resolve(audioBlob);
+ };
+ mediaRecorder.stop();
+ })
};
- mediaRecorder.stop();
- })
- };
-
- return Promise.resolve(); // Indikator für erfolgreichen Start der Aufnahme
- } catch (error) {
- throw new Error("Audioaufnahme nicht möglich. Bitte Mikrofonzugriff erlauben.");
- }
-}
+ return Promise.resolve(); // Indikator für erfolgreichen Start der Aufnahme
+
+ } catch (error) {
+ throw new Error("Audioaufnahme nicht möglich. Bitte Mikrofonzugriff erlauben.");
+ }
+ }
@@ -669,71 +690,71 @@
Super!
document.getElementById("confirmStopRecordingModal").checked = true;
}
-async function stopRecording(taskIndex) {
- document.getElementById("confirmStopRecordingModal").checked = false;
+ async function stopRecording(taskIndex) {
+ document.getElementById("confirmStopRecordingModal").checked = false;
- if (taskIndex === 1 && recorder && isRecording) {
- try {
- const blob = await recorder.stopRecording();
+ if (taskIndex === 1 && recorder && isRecording) {
+ try {
+ const blob = await recorder.stopRecording();
- if (!blob || blob.size === 0) {
- console.error("Blob wurde nicht erstellt oder ist leer.");
- showValidationModal("Fehler bei der Erstellung der Aufnahme. Bitte versuche es erneut.");
- return;
- }
+ if (!blob || blob.size === 0) {
+ console.error("Blob wurde nicht erstellt oder ist leer.");
+ showValidationModal("Fehler bei der Erstellung der Aufnahme. Bitte versuche es erneut.");
+ return;
+ }
- recordedBlobs = [blob];
+ recordedBlobs = [blob];
- try {
- const combinedBlob = new Blob(recordedBlobs, { type: 'audio/wav' });
- savedAudioURL = URL.createObjectURL(combinedBlob);
- storedTasks.task1.savedAudioURL = savedAudioURL;
+ try {
+ const combinedBlob = new Blob(recordedBlobs, { type: 'audio/wav' });
+ savedAudioURL = URL.createObjectURL(combinedBlob);
+ storedTasks.task1.savedAudioURL = savedAudioURL;
- if (!savedAudioURL || !savedAudioURL.startsWith("blob:")) {
- throw new Error("Erstellung der Blob-URL fehlgeschlagen.");
- }
- } catch (error) {
- console.error("Fehler bei der Erstellung der Blob-URL:", error);
- showValidationModal("Fehler beim Laden der Aufnahme. Bitte versuchef es erneut.");
- return;
- }
+ if (!savedAudioURL || !savedAudioURL.startsWith("blob:")) {
+ throw new Error("Erstellung der Blob-URL fehlgeschlagen.");
+ }
+ } catch (error) {
+ console.error("Fehler bei der Erstellung der Blob-URL:", error);
+ showValidationModal("Fehler beim Laden der Aufnahme. Bitte versuchef es erneut.");
+ return;
+ }
- const audioPlayer = document.getElementById("audioPlayer");
- audioPlayer.src = savedAudioURL;
- document.getElementById("recordingName").innerText = "Aufnahme gespeichert";
- document.getElementById("savedRecording").classList.remove("hidden");
+ const audioPlayer = document.getElementById("audioPlayer");
+ audioPlayer.src = savedAudioURL;
+ document.getElementById("recordingName").innerText = "Aufnahme gespeichert";
+ document.getElementById("savedRecording").classList.remove("hidden");
- isRecording = false;
- console.log("Recording stopped.");
+ isRecording = false;
+ console.log("Recording stopped.");
- if (recorder.audioStream) {
- recorder.audioStream.getTracks().forEach(track => track.stop());
- recorder.audioStream = null;
+ if (recorder.audioStream) {
+ recorder.audioStream.getTracks().forEach(track => track.stop());
+ recorder.audioStream = null;
+ }
+
+ await saveTasksToLocalStorage();
+ checkAllTasksCompleted();
+ } catch (error) {
+ console.error("Fehler beim Stoppen der Aufnahme:", error);
+ showValidationModal("Aufnahme konnte nicht gestoppt werden. Bitte versuche es erneut.");
+ }
+ } else {
+ console.error("Aufnahme wurde nicht gestartet oder Recorder ist nicht initialisiert.");
+ showValidationModal("Aufnahme wurde nicht gestartet.");
}
- await saveTasksToLocalStorage();
- checkAllTasksCompleted();
- } catch (error) {
- console.error("Fehler beim Stoppen der Aufnahme:", error);
- showValidationModal("Aufnahme konnte nicht gestoppt werden. Bitte versuche es erneut.");
+ if (taskIntervals[taskIndex - 1]) {
+ clearInterval(taskIntervals[taskIndex - 1]);
+ taskIntervals[taskIndex - 1] = null;
+ }
+ currentTask = null;
+
+ const startButton = document.getElementById("startTask1");
+ const startIcon = document.getElementById("startIcon1");
+ const startText = document.getElementById("startText1");
+ startText.innerText = "Starten";
+ startIcon.textContent = "▶";
}
- } else {
- console.error("Aufnahme wurde nicht gestartet oder Recorder ist nicht initialisiert.");
- showValidationModal("Aufnahme wurde nicht gestartet.");
- }
-
- if (taskIntervals[taskIndex - 1]) {
- clearInterval(taskIntervals[taskIndex - 1]);
- taskIntervals[taskIndex - 1] = null;
- }
- currentTask = null;
-
- const startButton = document.getElementById("startTask1");
- const startIcon = document.getElementById("startIcon1");
- const startText = document.getElementById("startText1");
- startText.innerText = "Starten";
- startIcon.textContent = "▶";
-}
// Timer-Funktionen
@@ -779,7 +800,7 @@
Super!
timerMinutesElement.style.setProperty('--value', '0');
timerSecondsElement.style.setProperty('--value', '00');
- if(taskIndex === 1 && recorder && isRecording){
+ if (taskIndex === 1 && recorder && isRecording) {
stopRecording(taskIndex);
} else {
if (taskIntervals[taskIndex - 1]) {
@@ -809,7 +830,7 @@
Super!
function startTimer(taskIndex) {
const startButton = document.getElementById(`startTask${taskIndex}`);
- if(taskIndex != 1)
+ if (taskIndex != 1)
startButton.disabled = true;
const progressDiv = document.getElementById(`task${taskIndex}Progress`);
if (progressDiv) {
@@ -831,38 +852,38 @@
Super!
function confirmDeleteRecording() {
document.getElementById("confirmDeleteRecordingModal").checked = true;
}
-function deleteRecording() {
- if (savedAudioURL) {
- URL.revokeObjectURL(savedAudioURL); // Blob-URL freigeben
- }
- document.getElementById("savedRecording").classList.add("hidden");
- document.getElementById("audioPlayer").src = "";
- savedAudioURL = "";
- recordedBlobs = [];
- storedTasks.task1.savedAudioURL = null; // URL entfernen
- checkAllTasksCompleted();
- saveTasksToLocalStorage();
- document.getElementById("confirmDeleteRecordingModal").checked = false;
-}
+ function deleteRecording() {
+ if (savedAudioURL) {
+ URL.revokeObjectURL(savedAudioURL); // Blob-URL freigeben
+ }
+ document.getElementById("savedRecording").classList.add("hidden");
+ document.getElementById("audioPlayer").src = "";
+ savedAudioURL = "";
+ recordedBlobs = [];
+ storedTasks.task1.savedAudioURL = null; // URL entfernen
+ checkAllTasksCompleted();
+ saveTasksToLocalStorage();
+ document.getElementById("confirmDeleteRecordingModal").checked = false;
+ }
function confirmDeleteProof() {
document.getElementById("confirmDeleteProofModal").checked = true;
}
-function deleteProof() {
- if (savedProofURL) {
- URL.revokeObjectURL(savedProofURL); // Blob-URL freigeben
- }
- document.getElementById("savedProof").classList.add("hidden");
- document.getElementById("proofName").innerText = "";
- document.getElementById("proofPreview").classList.add("hidden");
- savedProofURL = "";
- storedTasks.task2.savedProofURL = null; // URL entfernen
- document.getElementById("qualityValue").innerText = "";
- checkAllTasksCompleted();
- saveTasksToLocalStorage();
- document.getElementById("confirmDeleteProofModal").checked = false;
-}
+ function deleteProof() {
+ if (savedProofURL) {
+ URL.revokeObjectURL(savedProofURL); // Blob-URL freigeben
+ }
+ document.getElementById("savedProof").classList.add("hidden");
+ document.getElementById("proofName").innerText = "";
+ document.getElementById("proofPreview").classList.add("hidden");
+ savedProofURL = "";
+ storedTasks.task2.savedProofURL = null; // URL entfernen
+ document.getElementById("qualityValue").innerText = "";
+ checkAllTasksCompleted();
+ saveTasksToLocalStorage();
+ document.getElementById("confirmDeleteProofModal").checked = false;
+ }
function confirmResetTasks() {
document.getElementById("confirmResetModal").checked = true;
@@ -922,7 +943,7 @@
Super!
localStorage.removeItem("tasks");
await initializeTasks();
updateOverallProgress();
-
+
document.getElementById("confirmResetModal").checked = false;
location.reload();
@@ -935,9 +956,9 @@
Super!
}
function checkAllTasksCompleted() {
- tasksCompleted[0] = savedAudioURL && savedAudioURL !== "";
- tasksCompleted[1] = savedProofURL && savedProofURL !== "";
- tasksCompleted[2] = storedTasks.task3.mathTasks.every(task => task.userAnswer.trim() !== "");
+ tasksCompleted[0] = savedAudioURL && savedAudioURL !== "";
+ tasksCompleted[1] = savedProofURL && savedProofURL !== "";
+ tasksCompleted[2] = storedTasks.task3.mathTasks.every(task => task.userAnswer.trim() !== "");
updateOverallProgress();
saveTasksToLocalStorage();
@@ -975,7 +996,7 @@
Super!
const file = fileInput.files[0];
if (file) {
const reader = new FileReader();
- reader.onload = function(e) {
+ reader.onload = function (e) {
document.getElementById("proofName").innerText = file.name;
const proofPreview = document.getElementById("proofPreview");
proofPreview.href = e.target.result;
@@ -994,9 +1015,9 @@
Super!
function confirmCompleteTask(taskIndex) {
document.getElementById("validationMessage").innerHTML = "Möchtest du die Aufgabe wirklich abschließen?";
const confirmButton = document.getElementById("modalConfirmButton");
- if(taskIndex === 1){
- stopRecording(taskIndex);
- }
+ if (taskIndex === 1) {
+ stopRecording(taskIndex);
+ }
// Entferne vorherige Event-Listener, um Mehrfachauslösungen zu vermeiden
confirmButton.removeEventListener('click', handleTaskCompletion);
@@ -1005,6 +1026,7 @@
Super!
confirmButton.classList.remove("hidden");
document.getElementById("validationModal").checked = true;
+ updateOverallProgress();
}
function handleTaskCompletion(taskIndex) {
@@ -1069,12 +1091,12 @@
Super!
}
function disableAllInteractions() {
-document.querySelectorAll('#task1 .btn-primary, #task1 .btn-secondary, #task1 .btn-success, #task1 .btn-error, #task1 .btn-warning, ' +
- '#task2 .btn-primary, #task2 .btn-secondary, #task2 .btn-success, #task2 .btn-error, #task2 .btn-warning, ' +
- '#task3 .btn-primary, #task3 .btn-secondary, #task3 .btn-success, #task3 .btn-error, #task3 .btn-warning')
- .forEach(btn => {
- btn.disabled = true;
- });
+ document.querySelectorAll('#task1 .btn-primary, #task1 .btn-secondary, #task1 .btn-success, #task1 .btn-error, #task1 .btn-warning, ' +
+ '#task2 .btn-primary, #task2 .btn-secondary, #task2 .btn-success, #task2 .btn-error, #task2 .btn-warning, ' +
+ '#task3 .btn-primary, #task3 .btn-secondary, #task3 .btn-success, #task3 .btn-error, #task3 .btn-warning')
+ .forEach(btn => {
+ btn.disabled = true;
+ });
document.querySelectorAll('#task2 input[type="file"]').forEach(input => {
input.disabled = true;
@@ -1125,7 +1147,7 @@
Super!
// ZIP-Datei generieren und herunterladen
zip.generateAsync({ type: "blob" })
- .then(function(content) {
+ .then(function (content) {
saveAs(content, "Ergebnisse.zip");
});
}
@@ -1159,4 +1181,5 @@
Super!
updateTimerDisplays();
+