wczytywanie klas oraz uczniow z bazy danych

This commit is contained in:
konradm 2024-10-22 08:19:26 -04:00
parent df4b58fb50
commit 949e9d7fb5
3 changed files with 168 additions and 232 deletions

View File

@ -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 => {
if(currentRoleCriterias.includes(column.id)) {
const th = document.createElement('th');
th.textContent = column.name;
thead.appendChild(th);
}
});
// Generuj wiersze dla uczniów
@ -47,6 +57,7 @@ function generateTable(category) {
// 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';
@ -59,11 +70,13 @@ function generateTable(category) {
td.appendChild(checkbox);
row.appendChild(td);
}
});
tbody.appendChild(row);
});
}
// Funkcja do wczytywania pliku JSON
async function fetchJSONFile(filePath) {
try {
@ -78,70 +91,67 @@ 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
console.log("test")
//Fetch klas
fetch("/c2024/php/get_class.php")
console.log("Pobieranie klas z bazy danych...");
fetch("php/get_classes.php")
.then(response => response.json())
.then(data => {
console.log("Zaladowano klasy || ", data)
console.log("Załadowano 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")
option.value = element.id_klasy; // Ustaw ID klasy jako wartość opcji
selectClass.appendChild(option);
console.log("Dodano klasę ", element.nazwa_klasy, " do SELECT");
});
// Ustaw domyślnie pierwszą klasę i załaduj jej uczniów
if (data.length > 0) {
selectClass.selectedIndex = 0;
const defaultClassId = data[0].id_klasy;
loadStudents(defaultClassId);
}
})
// Dodaj nasłuchiwacz zdarzeń na zmianę wyboru klasy
selectClass.addEventListener('change', function() {
const selectedClassFile = this.value;
console.log(`Wybrano klasę: ${selectedClassFile}`);
loadStudents(selectedClassFile);
.catch(error => {
console.error("Błąd podczas pobierania klas:", error);
});
// Opcjonalnie, ustaw domyślnie pierwszą klasę i załaduj jej uczniów
if (classes.length > 0) {
selectClass.selectedIndex = 0;
const defaultClassFile = classes[0].file_path;
loadStudents(defaultClassFile);
}
// 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);
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 = {};
}
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'
};
});
currentClass = classFilePath; // Ustaw aktualną klasę
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.");
@ -149,36 +159,26 @@ async function loadStudents(classFilePath) {
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
})
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 += `<button data-category="${category.id}" onclick="showInnerTab('${category.id}')">${category.name}</button>`;
@ -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();
@ -405,118 +443,3 @@ function getGrade(points) {
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
}
}

View File

@ -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)) {

View File

@ -6,7 +6,13 @@ $dbname = "ocena_zachowania";
$con = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
$ans = mysqli_query($con, "SELECT * sFROM klasy;");
if (!$con) {
die("Błąd połączenia z bazą danych: " . mysqli_connect_error());
}
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)) {
@ -14,4 +20,7 @@ while($row = mysqli_fetch_assoc($ans)) {
}
echo json_encode($json);
} else {
echo json_encode(array("error" => "Brak podanego ID klasy."));
}
?>