summaryrefslogblamecommitdiffstats
path: root/dist/js/absences.js
blob: 5fbc6227cfacfc3f22bae78d24734a1b749e96d5 (plain) (tree)




















































































































































































































































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

/**
 * Redirects user to login page if it's not logged int
 */
async function checkLogin() {
    localforage.getItem("logged_in").then(function (value) {
        // This code runs once the value has been loaded
        // from the offline store.
        if (value !== true) {
            window.location.replace("/index.html");
        }
    }).catch(function (err) {
        // This code runs if there were any errors
        console.log(err);
    });
}

/**
 * Sets visibility of the loading bar
 * @param {boolean} state Desired visibility
 */
function setLoading(state) {
    if (state) {
        $("#loading-bar").removeClass("hidden");
    } else {
        $("#loading-bar").addClass("hidden");
    }
}

/**
 * Loads absences from API and displays them
 * @param {boolean} forceRefresh If true, cached absences are ignored
 */
async function loadAbsences(forceRefresh = false) {
    setLoading(true);
    // Load required data
    let promisesToRun = [
        localforage.getItem("username").then(function (value) {
            username = value;
        }),
        localforage.getItem("password").then(function (value) {
            password = value;
        }),
        localforage.getItem("absences").then(function (value) {
            absences = value;
        })
    ];
    await Promise.all(promisesToRun);
    // If we don't have a list of absences, query it
    if (absences == null || absences == {} || forceRefresh) {
        try {
            let gsecInstance = new gsec();
            await gsecInstance.login(username, password);
            let date = {};
            date.from = $("#datepicker-from").val().split(".");
            date.till = $("#datepicker-to").val().split(".");
            Object.keys(date).map((key) => {
                date[key] = new Date(Date.parse(date[key].reverse().join("-")));
            });
            gsecInstance.fetchAbsences().then( (fetchedAbsences) => {
                fetchedAbsences.sort((a, b) => {
                    // Turn your strings into dates, and then subtract them
                    // to get a value that is either negative, positive, or zero.
                    return new Date(b.date) - new Date(a.date);
                });

                var fromKey = fetchedAbsences.findIndex((procEl) => {
                    if (procEl.date.getTime() >= date.from.getTime()) {
                        return true;
                    }
                });

                var tillKey = fetchedAbsences.findIndex((procEl) => {
                    if (procEl.date.getTime() > date.till.getTime()) {
                        return true;
                    }
                });

                // Both were -1, but we increased fromKey and decreased tillKey
                // Means no absences in the provided timeframe
                if (fromKey === 0 && tillKey === -2) {
                    fetchedAbsences = [];
                } else {
                    fetchedAbsences = fetchedAbsences.slice(fromKey, tillKey);
                }

                absences = fetchedAbsences;
                localforage.setItem("absences", fetchedAbsences).then(() => {
                    displayData();
                    setLoading(false);
                });
                setLoading(false);
            }).catch( (err) => {
                gsecErrorHandlerUI(err);
                setLoading(false);
            });
        } catch (err) {
            gsecErrorHandlerUI(err);
            setLoading(false);
        }
    } else {
        displayData();
        setLoading(false);
    }
}

/**
 * Display absences data - called by loadAbsences
 */
function displayData() {
    absences.forEach(absence => {
        let li = document.createElement("li");

        // dateString comes from bundle.js
        let dateStringValue = dateString.longFormatted(absence["date"]);

        let header = document.createElement("div");
        header.className = "collapsible-header";
        header.innerText = dateStringValue;

        let body = document.createElement("div");
        body.className = "collapsible-body";

        let body_table = document.createElement("table");
        body_table.className = "highlight";

        let body_table_tbody = document.createElement("tbody");

        Object.keys(absence.subjects).forEach(lesson => {

            let absenceLessonObject = absence["subjects"][lesson];

            let subjectRow = document.createElement("tr");
            let subjectLessonIcon = document.createElement("td");
            let subjectLessonText = document.createElement("td");
            subjectLessonText.innerText = `${S("lesson")} ${lesson}`;

            let subjectLessonIconInner = document.createElement("i");
            subjectLessonIconInner.className = "material-icons";

            switch (absenceLessonObject["status"]) {
                case 0:
                    subjectLessonIconInner.innerText = "schedule";
                    break;
                case 1:
                    subjectLessonIconInner.innerText = "check_circle_outline";
                    break;
                case 2:
                    subjectLessonIconInner.innerText = "error_outline";
                    break;
                case 3:
                    subjectLessonIconInner.innerText = "not_interested";
                    break;
            }

            subjectLessonIcon.appendChild(subjectLessonIconInner);

            let subjectName = document.createElement("td");
            subjectName.innerText = `${S(gseAbsenceTypes[absenceLessonObject["status"]])} : ${absenceLessonObject["subject"]}`;
            subjectRow.appendChild(subjectLessonIcon);
            subjectRow.appendChild(subjectLessonText);
            subjectRow.appendChild(subjectName);
            body_table_tbody.appendChild(subjectRow);
        });

        body_table.appendChild(body_table_tbody);
        body.appendChild(body_table);

        li.appendChild(header);
        li.appendChild(body);
        $("#absences-col").append(li);
    });
}

/**
 * Clear all displayed absences
 */
function clearAbsences() {
    const table = document.getElementById("absences-col");
    while (table.firstChild) {
        table.removeChild(table.firstChild);
    }
}

/**
 * Force reloading of absences
 */
function refreshAbsences() {
    clearAbsences();
    loadAbsences(true);
}

/**
 * Setup date pickers (from date and to date)
 */
function setupPickers() {
    // Setup pickers
    var dateObject = new Date();

    let elems = document.querySelectorAll('#datepicker-to');
    let options = {
        autoClose: true,
        format: "dd.mm.yyyy",
        defaultDate: dateObject,
        setDefaultDate: true,
        firstDay: 1,
        onSelect: refreshAbsences
    }

    M.Datepicker.init(elems, options);

    dateObject.setDate(dateObject.getDate() - 14);

    elems = document.querySelectorAll('#datepicker-from');
    options = {
        autoClose: true,
        format: "dd.mm.yyyy",
        defaultDate: dateObject,
        setDefaultDate: true,
        firstDay: 1,
        onSelect: refreshAbsences
    }
    M.Datepicker.init(elems, options);
}

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

    // Setup refresh handler
    $("#refresh-icon").click(function () {
        refreshAbsences();
    });

    setupPickers();

    let collectionElem = document.querySelectorAll('.collapsible');
    M.Collapsible.init(collectionElem, {});

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