summaryrefslogblamecommitdiffstats
path: root/js/teachers.js
blob: 39232b574d71dbd9692c432d34757f5b18b43fa7 (plain) (tree)


















































































































































































                                                                                                    
const API_ENDPOINT = "https://gimb.tk/test.php";
// const API_ENDPOINT = "http://localhost:5000/test.php";

var teachers = null;


/**
* Converts a day number to a string.
*
* @param {Number} dayIndex
* @return {String} Returns day as string
*/
function dayOfWeekAsString(dayIndex) {
    return ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"][dayIndex];
}

// Set loading bar visibility
function setLoading(state) {
    if (state) {
        $("#loading-bar").removeClass("hidden");
    } else {
        $("#loading-bar").addClass("hidden");
    }
}

// Function, responsible for fetching and displaying data
async function loadTeachers(force_refresh = false) {
    setLoading(true);

    // Load required data
    let promises_to_run = [
        localforage.getItem("username").then((value) => {
            username = value;
        }),
        localforage.getItem("password").then((value) => {
            password = value;
        }),
        localforage.getItem("teachers").then((value) => {
            teachers = value;
        })
    ];

    Promise.all(promises_to_run).then(() => {

        // If we don't have a list of teachers, query it
        if (teachers === null || force_refresh) {
            $.ajax({
                url: API_ENDPOINT,
                crossDomain: true,

                data: {
                    "u": username,
                    "p": password,
                    "m": "fetchprofesorji"
                },
                dataType: "json",

                cache: false,
                type: "GET",

                success: (data) => {
                    // If data is null, the request failed
                    if (data === null) {
                        M.toast({ html: "Request failed!" });
                        setLoading(false);
                    } else {
                        // Save teachers & populate table
                        localforage.setItem("teachers", data).then((value) => {
                            teachers = value;
                            displayData();
                            setLoading(false);
                        });
                    }
                },

                error: () => {
                    M.toast({ html: "No internet connection!" });
                    setLoading(false);
                }

            })
        } else {
            displayData();
            setLoading(false);
        }
    });
}

// Function for displaying data
function displayData() {

    teachers.forEach(element => {
        // Create row
        let row = document.createElement("tr");
        // Create cell 1
        let cell_name = document.createElement("td");
        let cell_name_text = document.createTextNode(element["ime"]);
        // Create cell 2
        let cell_subject = document.createElement("td");
        // Array ([0]) is useless, since every teacher is duplicated (for each subject)
        let cell_subject_text = document.createTextNode(element["predmeti"][0]["ime"]);

        cell_name.appendChild(cell_name_text);
        row.appendChild(cell_name);

        cell_subject.appendChild(cell_subject_text);
        row.appendChild(cell_subject);

        $("#teachers-body").append(row);
    });
    // Refresh handlers
    refreshTableClickHandlers();
}

async function checkLogin() {
    localforage.getItem("logged_in").then((value) => {
        // This code runs once the value has been loaded
        // from the offline store.
        if (value !== true) {
            window.location.replace("/index.html");
        }
    }).catch((err) => {
        // This code runs if there were any errors
        console.log(err);
    });
}

function clearTable() {
    const table = document.getElementById("teachers-body");
    while (table.firstChild) {
        table.removeChild(table.firstChild);
    }
}

function refreshTableClickHandlers() {
    // Arrow function doesn't work apparently?
    $('#teachers-body').find("tr").click(function () {
        teacherInfo($(this).index());
    });
}

function teacherInfo(teacher_id) {
    let teacher_object = teachers[teacher_id];

    let name = teacher_object["ime"];
    let subject = teacher_object["predmeti"][0]["ime"];
    let office_day = dayOfWeekAsString(teacher_object["govorilneure"]["dan"]);
    let office_lesson = teacher_object["govorilneure"]["solskaura"];

    document.getElementById("teacher-name").innerText = name;
    document.getElementById("teacher-subject").innerText = "Subject: " + subject;

    document.getElementById("teacher-office").innerText = office_day + ", lesson " + office_lesson;

    const modal = document.querySelectorAll('.side-modal')[0];
    M.Sidenav.getInstance(modal).open();
}

document.addEventListener("DOMContentLoaded", () => {
    checkLogin();
    loadTeachers();

    // Setup refresh handler
    $("#refresh-icon").click(() => {
        clearTable();
        loadTeachers(true);
    });

    // Set row onClick functions
    refreshTableClickHandlers();

    // Setup side menu
    const menus = document.querySelectorAll('.side-menu');
    M.Sidenav.init(menus, { edge: 'right', draggable: true });

    // Setup side modal
    const modals = document.querySelectorAll('.side-modal');
    M.Sidenav.init(modals, { edge: 'left', draggable: false });
});