new-zoz/script.js

185 lines
6.8 KiB
JavaScript
Raw Normal View History

2025-02-12 13:05:01 +00:00
let uczniowie = {};
let kryteria = [];
let dane = {};
document.addEventListener("DOMContentLoaded", () => {
const classSelect = document.getElementById("class-select");
const studentsList = document.getElementById("students-list");
const saveButton = document.getElementById("save-button");
2025-02-12 13:27:22 +00:00
const statsTab = document.getElementById("stats-tab");
const statsContent = document.getElementById("stats-content");
2025-02-12 13:05:01 +00:00
// Ładowanie danych z serwera
Promise.all([
fetch("http://localhost:4000/uczniowie").then(response => response.json()),
fetch("http://localhost:4000/kryteria").then(response => response.json()),
fetch("http://localhost:4000/dane").then(response => response.json())
])
.then(([uczniowieData, kryteriaData, daneData]) => {
uczniowie = uczniowieData.klasy;
kryteria = kryteriaData;
dane = daneData;
populateClassSelect();
2025-02-12 13:27:22 +00:00
renderStats(); // Renderuj statystyki przy ładowaniu
2025-02-12 13:05:01 +00:00
})
.catch(error => console.error("Błąd ładowania danych:", error));
// Wypełnij listę klas
function populateClassSelect() {
Object.keys(uczniowie).forEach(klasa => {
const option = document.createElement("option");
option.value = klasa;
option.textContent = klasa;
classSelect.appendChild(option);
});
// Wyświetl pierwszą klasę domyślnie
if (classSelect.options.length > 0) {
classSelect.value = classSelect.options[0].value;
renderStudents(classSelect.value);
}
}
// Aktualizuj listę uczniów po wyborze klasy
classSelect.addEventListener("change", () => {
const selectedClass = classSelect.value;
renderStudents(selectedClass);
2025-02-12 13:27:22 +00:00
renderStats(); // Aktualizuj statystyki po zmianie klasy
2025-02-12 13:05:01 +00:00
});
// Renderuj uczniów
function renderStudents(className) {
studentsList.innerHTML = "";
const students = uczniowie[className];
students.forEach(student => {
const studentKey = `${className}-${student.imie}-${student.nazwisko}`;
const details = document.createElement("details");
const summary = document.createElement("summary");
summary.textContent = `${student.imie} ${student.nazwisko}`;
details.appendChild(summary);
const criteriaList = document.createElement("div");
criteriaList.className = "criteria-list";
kryteria.forEach(criteria => {
const criteriaItem = document.createElement("div");
criteriaItem.className = "criteria-item";
const label = document.createElement("span");
2025-02-12 13:27:22 +00:00
label.textContent = criteria.nazwa;
const pointsInfo = document.createElement("span");
pointsInfo.className = "points-info";
pointsInfo.textContent = `(${criteria.punkty} pkt)`;
2025-02-12 13:05:01 +00:00
const input = document.createElement("input");
input.type = "number";
input.min = "0";
// Wyszukaj dane ucznia w pliku `dane.json`
const savedStudent = dane[className]?.find(s => s.uczen.imie === student.imie && s.uczen.nazwisko === student.nazwisko);
2025-02-12 13:27:22 +00:00
input.value = savedStudent?.uczen[criteria.nazwa] || 0;
2025-02-12 13:05:01 +00:00
input.addEventListener("input", () => {
if (!savedStudent) {
dane[className] = dane[className] || [];
dane[className].push({
uczen: {
imie: student.imie,
nazwisko: student.nazwisko
}
});
}
const currentStudent = dane[className].find(s => s.uczen.imie === student.imie && s.uczen.nazwisko === student.nazwisko);
2025-02-12 13:27:22 +00:00
currentStudent.uczen[criteria.nazwa] = parseInt(input.value) || 0;
renderStats(); // Aktualizuj statystyki po edycji danych
2025-02-12 13:05:01 +00:00
});
criteriaItem.appendChild(label);
2025-02-12 13:27:22 +00:00
criteriaItem.appendChild(pointsInfo);
2025-02-12 13:05:01 +00:00
criteriaItem.appendChild(input);
criteriaList.appendChild(criteriaItem);
});
details.appendChild(criteriaList);
studentsList.appendChild(details);
});
}
// Zapisz dane na zewnętrznym serwerze
saveButton.addEventListener("click", () => {
fetch("http://localhost:4000/dane", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(dane)
})
.then(response => {
if (response.ok) {
alert("Dane zostały zapisane!");
} else {
alert("Wystąpił błąd podczas zapisywania danych.");
}
})
.catch(error => console.error("Błąd zapisywania danych:", error));
});
2025-02-12 13:27:22 +00:00
// Renderuj statystyki
function renderStats() {
statsContent.innerHTML = "";
const selectedClass = classSelect.value;
const students = uczniowie[selectedClass];
if (!students) return;
students.forEach(student => {
const savedStudent = dane[selectedClass]?.find(s => s.uczen.imie === student.imie && s.uczen.nazwisko === student.nazwisko);
let totalPoints = 0;
if (savedStudent) {
kryteria.forEach(criteria => {
const count = savedStudent.uczen[criteria.nazwa] || 0;
totalPoints += count * criteria.punkty;
});
}
const studentDiv = document.createElement("div");
studentDiv.className = "stat-item";
const name = document.createElement("strong");
name.textContent = `${student.imie} ${student.nazwisko}`;
const points = document.createElement("span");
points.className = "points";
points.textContent = `${totalPoints} pkt`;
if (totalPoints > 0) {
points.classList.add("positive");
} else if (totalPoints < 0) {
points.classList.add("negative");
}
studentDiv.appendChild(name);
studentDiv.appendChild(points);
statsContent.appendChild(studentDiv);
});
}
// Przełączanie między zakładkami
statsTab.addEventListener("click", () => {
studentsList.style.display = "none";
statsContent.style.display = "block";
});
const studentsTab = document.getElementById("students-tab");
studentsTab.addEventListener("click", () => {
studentsList.style.display = "block";
statsContent.style.display = "none";
});
2025-02-12 13:05:01 +00:00
});