new-zoz/script.js

259 lines
11 KiB
JavaScript
Raw Permalink Normal View History

2025-02-12 13:05:01 +00:00
document.addEventListener("DOMContentLoaded", () => {
const studentsList = document.getElementById("students-list");
2025-02-14 10:23:48 +00:00
const criteriaContent = document.getElementById("criteria-content");
2025-02-12 13:05:01 +00:00
const saveButton = document.getElementById("save-button");
2025-02-14 10:23:48 +00:00
const studentsTab = document.getElementById("students-tab");
const criteriaTab = document.getElementById("criteria-tab");
const addCriteriaForm = document.getElementById("add-criteria-form");
const editCriteriaForm = document.getElementById("edit-criteria-form");
const deleteCriteriaForm = document.getElementById("delete-criteria-form");
const criteriaListDiv = document.getElementById("criteria-list");
const editCriteriaNameSelect = document.getElementById("edit-criteria-name");
const deleteCriteriaNameSelect = document.getElementById("delete-criteria-name");
let uczniowie = [];
let kryteria = [];
let dane = {};
2025-02-14 13:31:21 +00:00
let progiOcen = [];
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()),
2025-02-14 11:17:22 +00:00
fetch("http://localhost:4000/dane").then(response => response.json()),
2025-02-14 13:31:21 +00:00
fetch("http://localhost:4000/oceny").then(response => response.json())
2025-02-12 13:05:01 +00:00
])
2025-02-14 11:17:22 +00:00
.then(([uczniowieData, kryteriaData, daneData, ocenyData]) => {
2025-02-14 10:23:48 +00:00
uczniowie = uczniowieData.uczniowie;
kryteria = kryteriaData;
dane = daneData;
2025-02-14 13:31:21 +00:00
progiOcen = ocenyData.progi;
2025-02-14 11:49:24 +00:00
console.log("Uczniowie:", uczniowie);
console.log("Kryteria:", kryteria);
console.log("Dane:", dane);
console.log("Progi ocen:", progiOcen);
2025-02-14 10:23:48 +00:00
renderStudents();
renderCriteria();
})
.catch(error => console.error("Błąd ładowania danych:", error));
2025-02-12 13:05:01 +00:00
// Renderuj uczniów
2025-02-14 10:23:48 +00:00
function renderStudents() {
2025-02-12 13:05:01 +00:00
studentsList.innerHTML = "";
2025-02-14 10:23:48 +00:00
uczniowie.forEach(student => {
const studentKey = `${student.imie}-${student.nazwisko}`;
2025-02-12 13:05:01 +00:00
const details = document.createElement("details");
2025-02-19 11:18:08 +00:00
details.style.position = "relative"; // Pozycjonowanie względne dla stats-section
2025-02-12 13:05:01 +00:00
const summary = document.createElement("summary");
2025-02-14 10:23:48 +00:00
summary.textContent = `${student.imie} ${student.nazwisko} (${student.klasa})`;
2025-02-12 13:05:01 +00:00
details.appendChild(summary);
2025-02-14 13:31:21 +00:00
2025-02-12 13:05:01 +00:00
const criteriaList = document.createElement("div");
criteriaList.className = "criteria-list";
2025-02-14 13:31:21 +00:00
let totalPoints = 0;
2025-02-12 13:05:01 +00:00
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-19 11:18:08 +00:00
const inputWrapper = document.createElement("div");
inputWrapper.className = "input-wrapper"; // Nowy wrapper dla inputu
2025-02-12 13:05:01 +00:00
const input = document.createElement("input");
input.type = "number";
input.min = "0";
2025-02-19 11:18:08 +00:00
input.value = dane[studentKey]?.[criteria.nazwa] || 0;
2025-02-14 13:31:21 +00:00
2025-02-19 11:18:08 +00:00
// Zapisz zmiany lokalnie w pamięci (bez natychmiastowego zapisu)
2025-02-12 13:05:01 +00:00
input.addEventListener("input", () => {
2025-02-14 13:31:21 +00:00
if (!dane[studentKey]) {
2025-02-14 10:23:48 +00:00
dane[studentKey] = {};
2025-02-12 13:05:01 +00:00
}
2025-02-14 10:23:48 +00:00
dane[studentKey][criteria.nazwa] = parseInt(input.value) || 0;
2025-02-12 13:05:01 +00:00
});
2025-02-14 13:31:21 +00:00
2025-02-19 11:18:08 +00:00
inputWrapper.appendChild(input); // Dodaj input do wrappera
2025-02-12 13:05:01 +00:00
criteriaItem.appendChild(label);
2025-02-12 13:27:22 +00:00
criteriaItem.appendChild(pointsInfo);
2025-02-19 11:18:08 +00:00
criteriaItem.appendChild(inputWrapper); // Dodaj wrapper z inputem
2025-02-14 13:31:21 +00:00
criteriaList.appendChild(criteriaItem);
// Oblicz sumę punktów
2025-02-19 11:18:08 +00:00
const count = dane[studentKey]?.[criteria.nazwa] || 0;
2025-02-14 13:31:21 +00:00
totalPoints += count * criteria.punkty;
});
2025-02-14 11:17:22 +00:00
// Wybierz ocenę na podstawie punktów
const ocena = progiOcen.find(prog => totalPoints >= prog.min)?.ocena || 1;
2025-02-14 13:31:21 +00:00
// Dodaj sekcję z punktami i oceną w prawym górnym rogu
const statsSection = document.createElement("div");
statsSection.className = "stats-section";
2025-02-19 11:18:08 +00:00
const statsBox = document.createElement("div");
statsBox.className = "stats-box";
const totalPointsElement = document.createElement("div");
totalPointsElement.className = "total-points";
totalPointsElement.textContent = `Punkty: ${totalPoints}`;
statsBox.appendChild(totalPointsElement);
const gradeElement = document.createElement("div");
gradeElement.className = "grade";
gradeElement.textContent = `Ocena: ${ocena}`;
statsBox.appendChild(gradeElement);
statsSection.appendChild(statsBox);
details.appendChild(statsSection); // Dodaj stats-section do details
2025-02-14 11:49:24 +00:00
2025-02-14 13:31:21 +00:00
details.appendChild(criteriaList);
studentsList.appendChild(details);
2025-02-14 11:49:24 +00:00
});
2025-02-12 13:27:22 +00:00
}
2025-02-14 10:23:48 +00:00
// Renderuj listę kryteriów
function renderCriteria() {
criteriaListDiv.innerHTML = "";
editCriteriaNameSelect.innerHTML = "";
deleteCriteriaNameSelect.innerHTML = "";
if (!Array.isArray(kryteria) || kryteria.length === 0) {
console.warn("Brak kryteriów do wyświetlenia.");
const noCriteriaMessage = document.createElement("p");
noCriteriaMessage.textContent = "Brak dostępnych kryteriów.";
criteriaListDiv.appendChild(noCriteriaMessage);
return;
}
kryteria.forEach(criteria => {
2025-02-14 11:49:24 +00:00
// Wyświetl kryterium na liście
2025-02-14 10:23:48 +00:00
const criteriaDiv = document.createElement("div");
criteriaDiv.textContent = `${criteria.nazwa}: ${criteria.punkty} pkt`;
criteriaListDiv.appendChild(criteriaDiv);
2025-02-19 11:18:08 +00:00
2025-02-14 11:49:24 +00:00
// Dodaj opcję do edycji
2025-02-14 10:23:48 +00:00
const editOption = document.createElement("option");
editOption.value = criteria.nazwa;
editOption.textContent = criteria.nazwa;
editCriteriaNameSelect.appendChild(editOption);
2025-02-19 11:18:08 +00:00
2025-02-14 11:49:24 +00:00
// Dodaj opcję do usunięcia
2025-02-14 10:23:48 +00:00
const deleteOption = document.createElement("option");
deleteOption.value = criteria.nazwa;
deleteOption.textContent = criteria.nazwa;
deleteCriteriaNameSelect.appendChild(deleteOption);
});
}
2025-02-12 13:27:22 +00:00
// Przełączanie między zakładkami
2025-02-14 10:23:48 +00:00
studentsTab.addEventListener("click", () => {
studentsList.style.display = "block";
criteriaContent.style.display = "none";
2025-02-12 13:27:22 +00:00
});
2025-02-14 10:23:48 +00:00
criteriaTab.addEventListener("click", () => {
studentsList.style.display = "none";
2025-02-14 13:31:21 +00:00
criteriaContent.style.display = "block";
renderCriteria();
2025-02-14 10:23:48 +00:00
});
// Dodawanie nowego kryterium
addCriteriaForm.addEventListener("submit", event => {
event.preventDefault();
const nazwa = document.getElementById("new-criteria-name").value.trim();
const punkty = parseInt(document.getElementById("new-criteria-points").value);
if (!nazwa || isNaN(punkty)) {
alert("Wprowadź poprawne dane.");
return;
}
fetch("http://localhost:4000/kryteria", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ nazwa, punkty })
})
.then(response => {
if (!response.ok) throw new Error("Błąd dodawania kryterium.");
return response.text();
})
.then(() => {
alert("Kryterium dodane pomyślnie.");
return fetch("http://localhost:4000/kryteria").then(response => response.json());
})
.then(kryteriaData => {
kryteria = kryteriaData;
renderCriteria();
})
.catch(error => console.error(error));
});
// Edycja istniejącego kryterium
editCriteriaForm.addEventListener("submit", event => {
event.preventDefault();
const nazwa = editCriteriaNameSelect.value;
const nowaNazwa = document.getElementById("edit-criteria-new-name").value.trim();
const punkty = parseInt(document.getElementById("edit-criteria-points").value);
if (!nowaNazwa || isNaN(punkty)) {
alert("Wprowadź poprawne dane.");
return;
}
fetch(`http://localhost:4000/kryteria/${encodeURIComponent(nazwa)}`, {
method: "PUT",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ nowaNazwa, punkty })
})
.then(response => {
if (!response.ok) throw new Error("Błąd edycji kryterium.");
return response.text();
})
.then(() => {
alert("Kryterium zaktualizowane pomyślnie.");
return fetch("http://localhost:4000/kryteria").then(response => response.json());
})
.then(kryteriaData => {
kryteria = kryteriaData;
renderCriteria();
})
.catch(error => console.error(error));
});
// Usuwanie kryterium
deleteCriteriaForm.addEventListener("submit", event => {
event.preventDefault();
const nazwa = deleteCriteriaNameSelect.value;
fetch(`http://localhost:4000/kryteria/${encodeURIComponent(nazwa)}`, {
method: "DELETE"
})
.then(response => {
if (!response.ok) throw new Error("Błąd usuwania kryterium.");
return response.text();
})
.then(() => {
alert("Kryterium usunięte pomyślnie.");
return fetch("http://localhost:4000/kryteria").then(response => response.json());
})
.then(kryteriaData => {
kryteria = kryteriaData;
renderCriteria();
})
.catch(error => console.error(error));
});
// 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!");
2025-02-19 11:18:08 +00:00
renderStudents(); // Odśwież listę uczniów
2025-02-14 10:23:48 +00:00
} 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
});
2025-02-12 13:05:01 +00:00
});