summaryrefslogblamecommitdiffstats
path: root/js/meals.js
blob: e2d4024e48e1e3080a80c374eb2f9f1d23a76b3f (plain) (tree)
1
2
3
4
5
6
7
                                                    


                                                                                                                                                                                    
                             
                                                              
                             




                                                                          
                            
         
























                                                                 
                                                          

                
                                         





                                                                                         
                                    
                                                      
                                        

                                                                        
                                                   

                                                               
                                                                                              
                        
                                   
                            

























                                                                                                 
                                                                              

                                                  
                       



                          
                                                                                                  





                                  
                       



                          

                                                                    
 
                                                             

                                            

                                               






                                                                 


                                                           
                                                                                                                                                                                  
                                                                 
 
                                                             




                                                             






                                                                          



                                                     






                                                               
                                                           

                                                               




                                                                 

                       
                                                    
                         
                                              

             

                                                      
 
                                                 

 
                                                     
 
         

                                                        






                                               
     


                                                  
                              

 

                                                               




                                            


                              

 

                                                        
                                                                    






































                                                                                                           
                                                                 
































                                                                                                          


































                                                                                                                                       
                                                 





























                                                                                                                                                    
                                         








                                                                                      

                                                                  
                     


           


                                                           





                                                              
                           












                                                               
const API_ENDPOINT = "https://lopolis-api.gimb.tk/";
var token, meals;
const jsDateDayString = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Freeday", "Day when you can finnaly rest", "Day when you get a girlfriend"];
const jsDateMonthString = ["January", "February", "March", "April", "May", "June", "July", "August", "October", "November", "December", "Elevener", "Zwölfer", "Teener", "14er"];
async function checkLogin() {
    localforage.getItem("logged_in_lopolis").then((value) => {
        if (value !== true) {
		document.getElementById("meals-container").hidden = true;
		document.getElementById("meals-login").hidden = false;
        } else {
		document.getElementById("meals-container").hidden = false;
		document.getElementById("meals-login").hidden = true;
		loadMeals();
	}
    }).catch((err) => {
        console.log(err);
    });
}
function setLoading(state) {
    if (state) {
        $("#loading-bar").removeClass("hidden");
    } else {
        $("#loading-bar").addClass("hidden");
    }
}
async function loadMeals(force_refresh = false) {
    setLoading(true);
    let promises_to_run = [
        localforage.getItem("lopolis_username").then((value) => {
            username = value;
        }),
        localforage.getItem("lopolis_password").then((value) => {
            password = value;
        }),
        localforage.getItem("meals").then((value) => {
            meals = value;
        })
    ];
    await Promise.all(promises_to_run);
    if (meals === null || meals === [] || force_refresh) {

        $.ajax({
            url: API_ENDPOINT+"gettoken",
            crossDomain: true,
	    contentType: "application/json",
	    data: JSON.stringify({ "username": username, "password": password         }),
            dataType: "json",
            cache: false,
            type: "POST",
            success: (dataauth) => {
                // If data is null, the request failed
                if (dataauth === null) {
                    M.toast({ html: "Authentication request failed!" });
                    setLoading(false);
                } else if(dataauth.error == true) {
                    M.toast({ html: "Authentication error!" });
                    setLoading(false);
		    localforage.setItem("logged_in_lopolis", false).then(()=>{checkLogin();});
		} else {
		    d = new Date();
		    $.ajax({
			url: API_ENDPOINT+"getmenus",
			crossDomain: true,
			contentType: "application/json",
			data: JSON.stringify({"month": d.getMonth()+1, "year": d.getFullYear()}),
			headers: {
				"Authorization": "Bearer "+dataauth.data
			},
			dataType: "json",
			cache: false,
			type: "POST",
			success: (data) => {
				if(data == null) {
                		    M.toast({ html: "Request to get menus failed!" });
		                    setLoading(false);
				} else if(data.error == true) {
				    M.toast({html:"Lopolis refused to serve menus"});
				    setLoading(false);
				} else {
       	        		    localforage.setItem("meals", data).then((value) => {
        	                	meals = value;
		                        displayMeals();
                		        setLoading(false);
		                    });
				}
			},
			error: () => {
				M.toast({html:"No internet connection! (-:"});
				setLoading(false);
			}
		    });
                }
            },

            error: () => {
                M.toast({ html: "Authentication failed (not logged in) or connection problem." });
                setLoading(false);
            }

        });

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

function displayMeals() {
    let root_element = document.getElementById("meals-collapsible");

    for(const [date, mealzz] of Object.entries(meals.data)) {
	let unabletochoosequestionmark = "";
	let readonly = mealzz.readonly;
	var datum = new Date(date);
        // Create root element for a date entry
        let subject_entry = document.createElement("li");
        // Create subject collapsible header
        let subject_header = document.createElement("div");
        subject_header.classList.add("collapsible-header");
        subject_header.classList.add("collapsible-header-root");
        // Create header text element
        let subject_header_text = document.createElement("span");
	if(mealzz.readonly) {
		unabletochoosequestionmark = "*Read only*";
	}
        subject_header_text.innerText = jsDateDayString[datum.getDay()]+", "+datum.getDate()+". "+jsDateMonthString[datum.getMonth()]+" "+datum.getFullYear()+" ("+mealzz.meal+"@"
		+mealzz.location+") "+unabletochoosequestionmark;

        // Create collection for displaying individuals meals
        let subject_body = document.createElement("div");
        subject_body.className = "collapsible-body";
        let subject_body_root = document.createElement("ul");
        subject_body_root.className = "collection";

        for(const [dindex, dmil] of Object.entries(mealzz.menu_options)) {
            // Create element for individual meal
            let meal_node = document.createElement("li");
            meal_node.className = "collection-item";
            meal_node.classList.add("collection-item")
            meal_node.classList.add("meal-node");
            meal_node.dataset["index"] = dindex;
	    if(!readonly) {
		    meal_node.onclick = function () {
			setMenu(date, dmil.value);
		    }
	    }
            let meal_node_div = document.createElement("div");

            // Node for left text
            let meal_lefttext = document.createElement("span");
            // Node for the right text
            let meal_righttext = document.createElement("div");
            meal_righttext.className = "secondary-content";

            // Apply different style, if the grade is temporary
            if (dmil.selected) {
                // Text
                meal_lefttext.innerHTML = "<i>"+dmil.text+"</i>";
                // Number
                meal_righttext.innerText = "selected";
            } else {
                // Text
                meal_lefttext.innerText = dmil.text;
                // Number
                meal_righttext.innerText = "";
            }

            meal_node_div.appendChild(meal_lefttext);
            meal_node_div.appendChild(meal_righttext);

            meal_node.appendChild(meal_node_div);


            subject_body_root.appendChild(meal_node);

        }

        subject_header.appendChild(subject_header_text);

        subject_body.append(subject_body_root);

        subject_entry.append(subject_header);
        subject_entry.append(subject_body);

        root_element.append(subject_entry);
    }

    $("#grades-collapsible").append(root_element);

    // refreshClickHandlers();
}

function clearMeals() {
    const table = document.getElementById("meals-collapsible");
    while (table.firstChild) {
        table.removeChild(table.firstChild);
    }
}

function refreshMeals(force) {
    clearMeals();
    loadMeals(force);
}

function lopolisLogout() {
	localforage.setItem("logged_in_lopolis", false);
	document.getElementById("meals-collapsible").innerHTML = "";
	checkLogin();
}

function lopolisLogin() {
	setLoading(true);
	var usernameEl = document.getElementById("meals_username");
	var passwordEl = document.getElementById("meals_password");
	$.ajax({
		url: API_ENDPOINT+"gettoken",
		crossDomain: true,
		contentType: "application/json",
		data: JSON.stringify({"username": usernameEl.value, "password": passwordEl.value}),
		dataType: "json",
		cache: false,
		type: "POST",
		success: (data) => {
			if(data == null) {
                		M.toast({ html: "Request for Authentication failed!" });
		        	setLoading(false);
				usernameEl.value = "";
				passwordEl.value = "";
			} else if(data.error == true) {
				M.toast({html:"Authentication failed"});
				usernameEl.value = "";
				passwordEl.value = "";
				setLoading(false);
			} else {
         			localforage.setItem("logged_in_lopolis", true).then((value) => {
         			localforage.setItem("lopolis_username", usernameEl.value).then((value) => {
         			localforage.setItem("lopolis_password", passwordEl.value).then((value) => {
					setLoading(false);
					M.toast({html:"Credentials match!"});
					checkLogin();
                    		});
                    		});
                    		});
			}
		},
		error: () => {
			M.toast({html:"Authentication failed!"});
			setLoading(false);
		}
	});
}
async function setMenu(date, menu) {
    setLoading(true);
    let promises_to_run = [
        localforage.getItem("lopolis_username").then((value) => {
            username = value;
        }),
        localforage.getItem("lopolis_password").then((value) => {
            password = value;
        })
    ];
    await Promise.all(promises_to_run);
	$.ajax({
		url: API_ENDPOINT+"gettoken",
		crossDomain: true,
		contentType: "application/json",
		data: JSON.stringify({"username": username, "password": password}),
		dataType: "json",
		cache: false,
		type: "POST",
		success: (dataauth) => {
			if(dataauth == null) {
                		M.toast({ html: "Request for Authentication failed!" });
		        	setLoading(false);
			        localforage.settItem("logged_in_lopolis", false).then(()=>{checkLogin();})
			} else if(dataauth.error == true) {
				M.toast({html:"Authentication failed"});
				setLoading(false);
			        localforage.settItem("logged_in_lopolis", false).then(()=>{checkLogin();})
			} else {
			    d = new Date();
			    $.ajax({
				url: API_ENDPOINT+"getmenus",
				crossDomain: true,
				contentType: "application/json",
				data: JSON.stringify({"month": d.getMonth()+1, "year": d.getFullYear()}),
				headers: {
					"Authorization": "Bearer "+dataauth.data
				},
				dataType: "json",
				cache: false,
				type: "POST",
				success: (data) => {
					if(data == null) {
	                		    M.toast({ html: "Request to get menus failed!" });
			                    setLoading(false);
					} else if(data.error == true) {
					    M.toast({html:"Lopolis refused to serve menus"});
					    setLoading(false);
					} else {
       		        		    localforage.setItem("meals", data).then((value) => {
       	 	                	        othermeals = value;
						var choices = new Object();
						// tale for loop je zelo C-jevski approach ...
						for(const [mealzzdate, mealzz] of Object.entries(othermeals.data)) {
							if (mealzzdate == date) {
								choices[mealzzdate] = menu;
							} else {
								for (const [mealid, mealdata] of Object.entries(mealzz.menu_options)) {
									if(mealdata.selected == true) {
										choices[mealzzdate] = mealdata.value;
										break;
									}
								}
							}
						}
						// console.log(choices); // debug
						$.ajax({
							url: API_ENDPOINT+"setmenus",
							crossDomain: true,
							contentType: "application/json",
							headers: {
								"Authorization": "Bearer "+dataauth.data
							},
							data: JSON.stringify({"choices": choices}),
							dataType: "json",
							cache: false,
							type: "POST",
							success: (data) => {
								if(data == null) {
					                		M.toast({ html: "Request for Setting the menu failed!" });
							        	setLoading(false);
								} else if(data.error == true) {
									M.toast({html:"Setting the menu errored out"});
									setLoading(false);
								} else {
									M.toast({html:"Success? It looks like one. Refresh the menus to be sure."});
									setLoading(false);
								}
							},
							error: () => {
								M.toast({html:"No internet connection! Are you fucking kidding me??!?!?!"});
								setLoading(false);
							}
						});
					    });
					}
				},
				error: () => {
					M.toast({html:"No internet connection! (-:"});
					setLoading(false);
				}
			    });
		        }
		    },
		    error: () => {
			M.toast({html:"No internet connection!"});
			setLoading(false);
		    }
	});
}

// Initialization code
document.addEventListener("DOMContentLoaded", async () => {
    checkLogin();

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

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

    let elems = document.querySelectorAll('.modal');
    let instances = M.Modal.init(elems, {});

    // 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 });
});