summaryrefslogtreecommitdiffstats
path: root/js/absences.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/absences.js')
-rw-r--r--js/absences.js211
1 files changed, 211 insertions, 0 deletions
diff --git a/js/absences.js b/js/absences.js
new file mode 100644
index 0000000..e0610dd
--- /dev/null
+++ b/js/absences.js
@@ -0,0 +1,211 @@
+const API_ENDPOINT = "https://gimb.tk/test.php";
+// const API_ENDPOINT = "http://localhost:5000/test.php";
+
+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);
+ });
+}
+
+// Set loading bar visibility
+function setLoading(state) {
+ if (state) {
+ $("#loading-bar").removeClass("hidden");
+ } else {
+ $("#loading-bar").addClass("hidden");
+ }
+}
+
+async function loadAbsences(force_refresh = false) {
+ setLoading(true);
+
+ // Load required data
+ let promises_to_run = [
+ 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(promises_to_run);
+
+ // If we don't have a list of absences, query it
+ if (absences === null || force_refresh) {
+ $.ajax({
+ url: API_ENDPOINT,
+ crossDomain: true,
+
+ data: {
+ "u": username,
+ "p": password,
+ "m": "fetchizostanki",
+ "a": $("#datepicker-from").val(),
+ "b": $("#datepicker-to").val()
+ },
+ dataType: "json",
+
+ cache: false,
+ type: "GET",
+
+ success: function (data) {
+ // If data is null, the credentials were incorrect
+ if (data === null) {
+ M.toast({ html: "Request failed!" });
+ setLoading(false);
+ } else {
+ // Save absences & populate UI
+ localforage.setItem("absences", data).then(function (value) {
+ absences = value;
+ displayData();
+ setLoading(false);
+ });
+ }
+ },
+
+ error: function () {
+ M.toast({ html: "No internet connection!" });
+ setLoading(false);
+ }
+
+ })
+ } else {
+ displayData();
+ setLoading(false);
+ }
+
+}
+
+function displayData() {
+ absences.forEach(element => {
+ let li = document.createElement("li");
+
+ let date_string = element["datum"]["dan"] + ". " + element["datum"]["mesec"] + ". " + element["datum"]["leto"];
+
+ let header = document.createElement("div");
+ header.className = "collapsible-header";
+ header.innerText = date_string;
+
+ 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");
+
+ element["predmeti"].forEach(lesson => {
+ let subject_row = document.createElement("tr");
+
+ let subject_lesson_icon = document.createElement("td");
+
+ let subject_lesson_text = document.createElement("td");
+ subject_lesson_text.innerText = "Lesson " + lesson["ura"];
+
+ let subject_lesson_icon_i = document.createElement("i");
+ subject_lesson_icon_i.className = "material-icons";
+ switch (lesson["opraviceno"]["status"]) {
+ case 0:
+ subject_lesson_icon_i.innerText = "schedule";
+ break;
+ case 1:
+ subject_lesson_icon_i.innerText = "check_circle_outline";
+ break;
+ case 2:
+ subject_lesson_icon_i.innerText = "error_outline";
+ break;
+ case 3:
+ subject_lesson_icon_i.innerText = "not_interested";
+ break;
+ }
+ subject_lesson_icon.appendChild(subject_lesson_icon_i);
+
+ let subject_name = document.createElement("td");
+ subject_name.innerText = lesson["ime"];
+
+ subject_row.appendChild(subject_lesson_icon);
+ subject_row.appendChild(subject_lesson_text);
+ subject_row.appendChild(subject_name);
+ body_table_tbody.appendChild(subject_row);
+ });
+ body_table.appendChild(body_table_tbody);
+ body.appendChild(body_table);
+
+ li.appendChild(header);
+ li.appendChild(body);
+
+ $("#absences-col").append(li);
+ });
+}
+
+function clearAbsences() {
+ const table = document.getElementById("absences-col");
+ while (table.firstChild) {
+ table.removeChild(table.firstChild);
+ }
+}
+
+function refreshAbsences() {
+ clearAbsences();
+ loadAbsences(true);
+}
+
+function setupPickers() {
+ // Setup pickers
+ var date_object = new Date();
+
+ let elems = document.querySelectorAll('#datepicker-to');
+ let options = {
+ autoClose: true,
+ format: "dd.mm.yyyy",
+ defaultDate: date_object,
+ setDefaultDate: true,
+ firstDay: 1,
+ onSelect: refreshAbsences
+ }
+ let instances = M.Datepicker.init(elems, options);
+
+
+ date_object.setDate(date_object.getDate() - 14);
+
+ elems = document.querySelectorAll('#datepicker-from');
+ options = {
+ autoClose: true,
+ format: "dd.mm.yyyy",
+ defaultDate: date_object,
+ setDefaultDate: true,
+ firstDay: 1,
+ onSelect: refreshAbsences
+ }
+ instances = M.Datepicker.init(elems, options);
+}
+
+document.addEventListener("DOMContentLoaded", () => {
+ checkLogin();
+ loadAbsences(true);
+
+ // Setup refresh handler
+ $("#refresh-icon").click(function () {
+ refreshAbsences();
+ });
+
+ setupPickers();
+
+ let coll_elem = document.querySelectorAll('.collapsible');
+ let coll_instance = M.Collapsible.init(coll_elem, {});
+
+ // Setup side menu
+ const menus = document.querySelectorAll('.side-menu');
+ M.Sidenav.init(menus, { edge: 'right', draggable: true });
+
+}); \ No newline at end of file