diff --git a/js/script.js b/js/script.js index cb638d6..19b2e45 100644 --- a/js/script.js +++ b/js/script.js @@ -6,7 +6,10 @@ let currentDay = 0; let currentRole = "teacher" let currentRoleCriterias = [] const baseDate = new Date(); +let categories = {}; +let criteriaData = {}; +// Funkcja do generowania tabeli (bez zmian) function generateTable(category) { const table = document.getElementById('student-table'); const thead = table.querySelector('thead tr'); @@ -24,11 +27,18 @@ function generateTable(category) { // Pobierz kolumny dla wybranej kategorii const categoryColumns = categories[category]; - // Dodaj nagłówki dla kryteriów w kategorii + if (!categoryColumns) { + console.error(`Brak kolumn dla kategorii: ${category}`); + return; + } + + // Dodaj nagłówki dla kryteriów categoryColumns.forEach(column => { - const th = document.createElement('th'); - th.textContent = column.name; - thead.appendChild(th); + if(currentRoleCriterias.includes(column.id)) { + const th = document.createElement('th'); + th.textContent = column.name; + thead.appendChild(th); + } }); // Generuj wiersze dla uczniów @@ -47,23 +57,26 @@ function generateTable(category) { // Komórki z checkboxami dla kryteriów categoryColumns.forEach(column => { - const td = document.createElement('td'); - const checkbox = document.createElement('input'); - checkbox.type = 'checkbox'; - const studentId = `${student.first_name}-${student.last_name}`.replace(/ /g, '-'); - checkbox.id = `${column.id}-${studentId}`; - checkbox.onchange = calculateStats; + if(currentRoleCriterias.includes(column.id)) { + const td = document.createElement('td'); + const checkbox = document.createElement('input'); + checkbox.type = 'checkbox'; + const studentId = `${student.first_name}-${student.last_name}`.replace(/ /g, '-'); + checkbox.id = `${column.id}-${studentId}`; + checkbox.onchange = calculateStats; - // Ustawienie stanu checkboxa na podstawie zapisanych danych - checkbox.checked = student.behavior[`day${currentDay}`]?.[column.id] || false; + // Ustawienie stanu checkboxa na podstawie zapisanych danych + checkbox.checked = student.behavior[`day${currentDay}`]?.[column.id] || false; - td.appendChild(checkbox); - row.appendChild(td); + td.appendChild(checkbox); + row.appendChild(td); + } }); tbody.appendChild(row); }); } + // Funkcja do wczytywania pliku JSON async function fetchJSONFile(filePath) { try { @@ -78,107 +91,94 @@ async function fetchJSONFile(filePath) { } } -// Obiekt do przechowywania danych klas i uczniów -const classData = {}; - -// Funkcja do wczytania pliku class.json i danych uczniów +// Funkcja do wczytania klas z bazy danych async function loadClasses() { + const selectClass = document.getElementById("select-class-select"); + selectClass.innerHTML = ""; // Wyczyść istniejące opcje - const selectClass = document.getElementById("select-class-select"); - selectClass.innerHTML = ""; // Wyczyść istniejące opcje + console.log("Pobieranie klas z bazy danych..."); + fetch("php/get_classes.php") + .then(response => response.json()) + .then(data => { + console.log("Załadowano klasy:", data); - - console.log("test") - //Fetch klas - fetch("/c2024/php/get_class.php") - .then(response => response.json()) - .then(data => { - console.log("Zaladowano klasy || ", data) - - data.forEach(element => { - - const option = document.createElement('option'); - option.textContent = `Klasa: ${element.nazwa_klasy}`; - selectClass.appendChild(option) - console.log("Dodano klasę ", element.nazwa_klasy, " do SELECT") - }); - - }) - - // Dodaj nasłuchiwacz zdarzeń na zmianę wyboru klasy - selectClass.addEventListener('change', function() { - const selectedClassFile = this.value; - console.log(`Wybrano klasę: ${selectedClassFile}`); - loadStudents(selectedClassFile); + data.forEach(element => { + const option = document.createElement('option'); + option.textContent = `Klasa: ${element.nazwa_klasy}`; + option.value = element.id_klasy; // Ustaw ID klasy jako wartość opcji + selectClass.appendChild(option); + console.log("Dodano klasę ", element.nazwa_klasy, " do SELECT"); }); - // Opcjonalnie, ustaw domyślnie pierwszą klasę i załaduj jej uczniów - if (classes.length > 0) { + // Ustaw domyślnie pierwszą klasę i załaduj jej uczniów + if (data.length > 0) { selectClass.selectedIndex = 0; - const defaultClassFile = classes[0].file_path; - loadStudents(defaultClassFile); + const defaultClassId = data[0].id_klasy; + loadStudents(defaultClassId); } + + }) + .catch(error => { + console.error("Błąd podczas pobierania klas:", error); + }); + + // Nasłuchiwacz zmiany wyboru klasy + selectClass.addEventListener('change', function() { + const selectedClassId = this.value; + console.log(`Wybrano klasę o ID: ${selectedClassId}`); + loadStudents(selectedClassId); + }); } // Funkcja do wczytania danych uczniów dla wybranej klasy -async function loadStudents(classFilePath) { - if (!classFilePath) { +async function loadStudents(classId) { + if (!classId) { console.warn("Nie wybrano żadnej klasy."); return; } - const studentsFilePath = `/data/${classFilePath}`; - const data = await fetchJSONFile(studentsFilePath); + fetch(`php/get_students.php?id_klasy=${classId}`) + .then(response => response.json()) + .then(data => { + if (data && Array.isArray(data)) { + console.log(`Uczniowie załadowani dla klasy ${classId}:`, data); + // Przekształć dane na format oczekiwany przez 'studentsData' + studentsData = data.map(student => { + return { + first_name: student.imie, + last_name: student.nazwisko, + behavior: {} // Inicjalizacja obiektu 'behavior' + }; + }); - if (data && Array.isArray(data.students)) { - console.log(`Uczniowie załadowani z pliku ${classFilePath}:`, data); - studentsData = data.students; // Aktualizuj globalną tablicę uczniów - - // Inicjalizacja 'behavior' dla każdego ucznia, jeśli jest niezdefiniowany - studentsData.forEach(student => { - if (!student.behavior) { - student.behavior = {}; - } - }); - - currentClass = classFilePath; // Ustaw aktualną klasę - generateTable(currentCategory); // Regeneruj tabelę z aktualną kategorią - } else { - console.error("Błąd: Nie udało się załadować danych uczniów lub dane są niepoprawne."); - studentsData = []; // Jeśli nie udało się załadować danych, wyczyść tablicę uczniów - currentClass = ''; - generateTable(currentCategory); // Regeneruj pustą tabelę - } -} - -async function getCategoriesWithCriteria() { - const criteriaFilePath = '/data/criteria.json'; - const criteria = await fetchJSONFile(criteriaFilePath); - let categoriesWithCriteria = {} - - criteria.categories.forEach(category => { - let criteriaForCategory = [] - criteria.criteria.forEach(criteria => { - if(category.criteria_ids.includes(criteria.id)) { - //console.log(`!!! ${category.name} posiada ${criteria.name}`) - criteriaForCategory.push({name: criteria.name, id: criteria.id}) - } - }) - categoriesWithCriteria[category.id] = criteriaForCategory + currentClass = classId; // Ustaw aktualną klasę + generateTable(currentCategory); // Regeneruj tabelę z aktualną kategorią + } else { + console.error("Błąd: Nie udało się załadować danych uczniów lub dane są niepoprawne."); + studentsData = []; // Jeśli nie udało się załadować danych, wyczyść tablicę uczniów + currentClass = ''; + generateTable(currentCategory); // Regeneruj pustą tabelę + } }) - - return categoriesWithCriteria - - + .catch(error => { + console.error("Błąd podczas pobierania uczniów:", error); + }); } -// Funkcja do wczytania pliku criteria.json +// Funkcja do wczytania kryteriów z pliku criteria.json async function loadCriteria() { - const criteriaFilePath = '/data/criteria.json'; + const criteriaFilePath = 'data/criteria.json'; // Poprawiona ścieżka const criteria = await fetchJSONFile(criteriaFilePath); + if (!criteria) { + console.error("Nie udało się załadować pliku criteria.json."); + return; + } + console.log("Załadowane kryteria:", criteria); + criteriaData = criteria; // Zapisz kryteria globalnie + // // LADOWANIE ROL // @@ -212,28 +212,36 @@ async function loadCriteria() { }); categoryButtonsBox.innerHTML = categoryButtonHTML; + + // Zbuduj obiekt 'categories' + categories = {}; + criteria.categories.forEach(category => { + let criteriaForCategory = [] + criteria.criteria.forEach(crit => { + if(category.criteria_ids.includes(crit.id)) { + criteriaForCategory.push({name: crit.name, id: crit.id}) + } + }) + categories[category.id] = criteriaForCategory + }); } -async function changeRole(role) { +async function changeRole() { const select = document.getElementById('select-role'); const selectedValue = select.value; - const criteriaFilePath = '/data/criteria.json'; - const criteria = await fetchJSONFile(criteriaFilePath); - - currentRole = selectedValue - currentRoleCriterias = criteria.roles[currentRole].criteria_ids - console.log("currentRole:", currentRole) - console.log("currentRoleCriterias:", currentRoleCriterias) + currentRole = selectedValue; + currentRoleCriterias = criteriaData.roles[currentRole].criteria_ids; + console.log("currentRole:", currentRole); + console.log("currentRoleCriterias:", currentRoleCriterias); // category-buttons-box - const categoriesCriteria = criteria.categories; + const categoriesCriteria = criteriaData.categories; const categoryButtonsBox = document.getElementById("category-buttons-box"); - let categoryButtonHTML = "" + let categoryButtonHTML = ""; categoriesCriteria.forEach(category => { const hasCriteria = category.criteria_ids.some(criteriaId => currentRoleCriterias.includes(criteriaId)); - // Jeśli kategoria ma kryteria, dodajemy przycisk if (hasCriteria) { categoryButtonHTML += ``; @@ -242,7 +250,7 @@ async function changeRole(role) { categoryButtonsBox.innerHTML = categoryButtonHTML; - generateTable(currentCategory) + generateTable(currentCategory); } // Funkcja do przełączania głównych zakładek @@ -259,9 +267,42 @@ function showTab(tabName) { if (tabName === 'criteria') { loadDayData(); - } else if (tabName === 'points') { + } else if (tabName === 'stats') { calculateStats(); } + + // Zmieniaj tytuł nagłówka w zależności od wybranej zakładki + const headerTitle = document.getElementById('header-title'); + const upButtonContainer = document.getElementById('up-button-container'); + const selectRoleContainer = document.getElementById('select-role-container'); + const selectClassContainer = document.getElementById('select-class-container'); + + switch (tabName) { + case 'criteria': + headerTitle.textContent = 'Ocena Zachowania'; + generateTable(currentCategory); // Generuj tabelę dla aktualnej kategorii + upButtonContainer.style.display = 'block'; // Pokaż przyciski + selectRoleContainer.style.display = 'block'; // Pokaż wybór roli + selectClassContainer.style.display = 'block'; // Pokaż wybór klasy + break; + case 'stats': + headerTitle.textContent = 'Statystyka'; + upButtonContainer.style.display = 'none'; // Ukryj przyciski + selectRoleContainer.style.display = 'none'; // Ukryj wybór roli + selectClassContainer.style.display = 'none'; // Ukryj wybór klasy + break; + case 'points': + headerTitle.textContent = 'Ustal punkty'; + upButtonContainer.style.display = 'none'; // Ukryj przyciski + selectRoleContainer.style.display = 'none'; // Ukryj wybór roli + selectClassContainer.style.display = 'none'; // Ukryj wybór klasy + break; + default: + headerTitle.textContent = 'Ocena Zachowania'; + upButtonContainer.style.display = 'none'; // Ukryj przyciski + selectRoleContainer.style.display = 'none'; // Ukryj wybór roli + selectClassContainer.style.display = 'none'; // Ukryj wybór klasy + } } // Funkcja do przełączania kategorii w tabeli uczniów @@ -281,9 +322,6 @@ function showInnerTab(category) { // Funkcja, aby ustawić domyślną kategorię i zakładkę document.addEventListener("DOMContentLoaded", function() { - // Domyślnie pokazujemy kategorię 'frekwencja' - - // Ustawienie daty na dziś document.getElementById('current-date').innerText = baseDate.toLocaleDateString(); @@ -404,119 +442,4 @@ function getGrade(points) { if (points >= 50) return "Poprawne"; if (points >= 0) return "Nieodpowiednie"; return "Naganne"; -} - -// Funkcja do generowania tabeli uczniów na podstawie wybranej kategorii -async function generateTable(category) { - const table = document.getElementById('student-table'); - const thead = table.querySelector('thead tr'); - const tbody = table.querySelector('tbody'); - - // Wyczyść istniejące nagłówki i wiersze - thead.innerHTML = ''; - tbody.innerHTML = ''; - - // Dodaj nagłówek 'Imię i Nazwisko' - const thName = document.createElement('th'); - thName.textContent = "Imię i Nazwisko"; - thead.appendChild(thName); - - // get role - console.log("currentRole", currentRole) - - // Pobierz kolumny dla wybranej kategorii - const categories = await getCategoriesWithCriteria() - console.log("łot:", categories) - const categoryColumns = categories[category]; - - // Dodaj nagłówki dla kryteriów w kategorii - categoryColumns.forEach(column => { - const th = document.createElement('th'); - if(currentRoleCriterias.includes(column.id)) { - th.textContent = column.name; - thead.appendChild(th); - } - - - }); - - // Generuj wiersze dla uczniów - studentsData.forEach(student => { - const row = document.createElement('tr'); - - // Komórka z imieniem i nazwiskiem - const tdName = document.createElement('td'); - tdName.textContent = `${student.first_name} ${student.last_name}`; - row.appendChild(tdName); - - // Upewnij się, że 'behavior' jest zdefiniowany - if (!student.behavior) { - student.behavior = {}; - } - - // Komórki z checkboxami dla kryteriów - categoryColumns.forEach(column => { - if(currentRoleCriterias.includes(column.id)) { - const td = document.createElement('td'); - const checkbox = document.createElement('input'); - checkbox.type = 'checkbox'; - const studentId = `${student.first_name}-${student.last_name}`.replace(/ /g, '-'); - checkbox.id = `${column.id}-${studentId}`; - checkbox.onchange = calculateStats; - - // Ustawienie stanu checkboxa na podstawie zapisanych danych - checkbox.checked = student.behavior[`day${currentDay}`]?.[column.id] || false; - - td.appendChild(checkbox); - row.appendChild(td); - } - }); - - tbody.appendChild(row); - }); -} -function showTab(tabName) { - // Ukryj wszystkie zakładki - const tabs = document.querySelectorAll('.tab'); - tabs.forEach(tab => tab.classList.remove('active')); - - // Pokaż wybraną zakładkę - const selectedTab = document.getElementById(tabName); - if (selectedTab) { - selectedTab.classList.add('active'); - } - - // Zmieniaj tytuł nagłówka w zależności od wybranej zakładki - const headerTitle = document.getElementById('header-title'); - const upButtonContainer = document.getElementById('up-button-container'); - const selectRoleContainer = document.getElementById('select-role-container'); - const selectClassContainer = document.getElementById('select-class-container'); - - switch (tabName) { - case 'criteria': - headerTitle.textContent = 'Ocena Zachowania'; - generateTable(currentCategory); // Generuj tabelę dla aktualnej kategorii - upButtonContainer.style.display = 'block'; // Pokaż przyciski - selectRoleContainer.style.display = 'block'; // Pokaż wybór roli - selectClassContainer.style.display = 'block'; // Pokaż wybór klasy - break; - case 'stats': - headerTitle.textContent = 'Statystyka'; - upButtonContainer.style.display = 'none'; // Ukryj przyciski - selectRoleContainer.style.display = 'none'; // Ukryj wybór roli - selectClassContainer.style.display = 'none'; // Ukryj wybór klasy - break; - case 'points': - headerTitle.textContent = 'Ustal punkty'; - upButtonContainer.style.display = 'none'; // Ukryj przyciski - selectRoleContainer.style.display = 'none'; // Ukryj wybór roli - selectClassContainer.style.display = 'none'; // Ukryj wybór klasy - break; - default: - headerTitle.textContent = 'Ocena Zachowania'; - upButtonContainer.style.display = 'none'; // Ukryj przyciski - selectRoleContainer.style.display = 'none'; // Ukryj wybór roli - selectClassContainer.style.display = 'none'; // Ukryj wybór klasy - } -} - +} \ No newline at end of file diff --git a/php/get_class.php b/php/get_classes.php similarity index 65% rename from php/get_class.php rename to php/get_classes.php index addd882..0447b42 100644 --- a/php/get_class.php +++ b/php/get_classes.php @@ -6,7 +6,11 @@ $dbname = "ocena_zachowania"; $con = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname); -$ans = mysqli_query($con, "SELECT nazwa_klasy FROM klasy;"); +if (!$con) { + die("Błąd połączenia z bazą danych: " . mysqli_connect_error()); +} + +$ans = mysqli_query($con, "SELECT * FROM klasy;"); $json = array(); while($row = mysqli_fetch_assoc($ans)) { diff --git a/php/get_students.php b/php/get_students.php index 2e5b8cc..1f0e3fc 100644 --- a/php/get_students.php +++ b/php/get_students.php @@ -6,12 +6,21 @@ $dbname = "ocena_zachowania"; $con = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname); -$ans = mysqli_query($con, "SELECT * sFROM klasy;"); -$json = array(); - -while($row = mysqli_fetch_assoc($ans)) { - $json[] = $row; +if (!$con) { + die("Błąd połączenia z bazą danych: " . mysqli_connect_error()); } -echo json_encode($json); -?> \ No newline at end of file +if(isset($_GET['id_klasy'])) { + $id_klasy = intval($_GET['id_klasy']); + $ans = mysqli_query($con, "SELECT * FROM uczniowie WHERE id_klasy = $id_klasy;"); + $json = array(); + + while($row = mysqli_fetch_assoc($ans)) { + $json[] = $row; + } + + echo json_encode($json); +} else { + echo json_encode(array("error" => "Brak podanego ID klasy.")); +} +?>