From fc66b376cb3a2c73843cc882d500cfd743c0790e Mon Sep 17 00:00:00 2001 From: sijanec Date: Sun, 17 May 2020 00:13:40 +0200 Subject: dist should work, TODO: minify and bundle --- dist/js/absences.js | 245 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 245 insertions(+) create mode 100644 dist/js/absences.js (limited to 'dist/js/absences.js') diff --git a/dist/js/absences.js b/dist/js/absences.js new file mode 100644 index 0000000..a11d042 --- /dev/null +++ b/dist/js/absences.js @@ -0,0 +1,245 @@ +// 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 || 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 }); +}); -- cgit v1.2.3 From 89f33d6754e6e619e81d2839d68e5b34e85fdff8 Mon Sep 17 00:00:00 2001 From: rstular Date: Sun, 17 May 2020 15:12:58 +0200 Subject: Modified language selection UI --- dist/js/absences.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'dist/js/absences.js') diff --git a/dist/js/absences.js b/dist/js/absences.js index a11d042..2ed5fe8 100644 --- a/dist/js/absences.js +++ b/dist/js/absences.js @@ -49,7 +49,7 @@ async function loadAbsences(forceRefresh = false) { ]; await Promise.all(promisesToRun); // If we don't have a list of absences, query it - if (absences === null || forceRefresh) { + if (absences === null || absences === {} || forceRefresh) { try { let gsecInstance = new gsec(); await gsecInstance.login(username, password); -- cgit v1.2.3 From 7b0e9737328c2dc5a0ff1bd063cd7818706256c3 Mon Sep 17 00:00:00 2001 From: rstular Date: Sun, 17 May 2020 22:22:22 +0200 Subject: Bug fix attempt --- dist/js/absences.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'dist/js/absences.js') diff --git a/dist/js/absences.js b/dist/js/absences.js index 2ed5fe8..5fbc622 100644 --- a/dist/js/absences.js +++ b/dist/js/absences.js @@ -49,7 +49,7 @@ async function loadAbsences(forceRefresh = false) { ]; await Promise.all(promisesToRun); // If we don't have a list of absences, query it - if (absences === null || absences === {} || forceRefresh) { + if (absences == null || absences == {} || forceRefresh) { try { let gsecInstance = new gsec(); await gsecInstance.login(username, password); -- cgit v1.2.3 From cfedc91453b67e79202730e7cf4197df24631379 Mon Sep 17 00:00:00 2001 From: sijanec Date: Wed, 20 May 2020 13:33:51 +0200 Subject: fixed install script --- dist/js/absences.js | 245 ---------------------------------------------------- 1 file changed, 245 deletions(-) delete mode 100644 dist/js/absences.js (limited to 'dist/js/absences.js') diff --git a/dist/js/absences.js b/dist/js/absences.js deleted file mode 100644 index 5fbc622..0000000 --- a/dist/js/absences.js +++ /dev/null @@ -1,245 +0,0 @@ -// 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 }); -}); -- cgit v1.2.3 From 7820ea23532aa6ffa3611d8379681aa44a3f3864 Mon Sep 17 00:00:00 2001 From: sijanec Date: Wed, 20 May 2020 14:12:06 +0200 Subject: # --- dist/js/absences.js | 245 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 245 insertions(+) create mode 100644 dist/js/absences.js (limited to 'dist/js/absences.js') diff --git a/dist/js/absences.js b/dist/js/absences.js new file mode 100644 index 0000000..5fbc622 --- /dev/null +++ b/dist/js/absences.js @@ -0,0 +1,245 @@ +// 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 }); +}); -- cgit v1.2.3 From 8cc2b856a47f7b1881171914147e6ddca7a8a02b Mon Sep 17 00:00:00 2001 From: sijanec Date: Wed, 20 May 2020 21:17:06 +0200 Subject: testing minification with jsmin --- dist/js/absences.js | 256 +++------------------------------------------------- 1 file changed, 12 insertions(+), 244 deletions(-) (limited to 'dist/js/absences.js') diff --git a/dist/js/absences.js b/dist/js/absences.js index 5fbc622..f6f4f7d 100644 --- a/dist/js/absences.js +++ b/dist/js/absences.js @@ -1,245 +1,13 @@ -// 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 }); -}); +async function checkLogin(){localforage.getItem("logged_in").then(function(value){if(value!==true){window.location.replace("/index.html");}}).catch(function(err){console.log(err);});} +function setLoading(state){if(state){$("#loading-bar").removeClass("hidden");}else{$("#loading-bar").addClass("hidden");}} +async function loadAbsences(forceRefresh=false){setLoading(true);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(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)=>{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;}});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);}} +function displayData(){absences.forEach(absence=>{let li=document.createElement("li");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);});} +function clearAbsences(){const table=document.getElementById("absences-col");while(table.firstChild){table.removeChild(table.firstChild);}} +function refreshAbsences(){clearAbsences();loadAbsences(true);} +function setupPickers(){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);$("#refresh-icon").click(function(){refreshAbsences();});setupPickers();let collectionElem=document.querySelectorAll('.collapsible');M.Collapsible.init(collectionElem,{});const menus=document.querySelectorAll('.side-menu');M.Sidenav.init(menus,{edge:'right',draggable:true});}); \ No newline at end of file -- cgit v1.2.3