// Cafe menu items. We will fetch these from the server at startup var items; // Order array - initially empty var order = []; // Search the items list for the item with the given id function findItem(id) { var n, length; length = items.length; for(n = 0;n < length;n++) if(items[n].iditem == id) return items[n]; return items[0]; } // Event handler for order button function orderItem(itemid) { // Each of the order buttons has the id of the associated // object hidden in its data-id attribute. Find that item // and push it onto the order list. var item = findItem(itemid); order.push(item); // The View Order button is initially hidden. As soon // as the user orders an item we will want to make it // visible. let viewOrderButton = document.getElementById('viewOrder'); viewOrderButton.style.visibility = 'visible'; // Blur the button to remove the undesirable focussed appearance viewOrderButton.blur(); } // Reloads the menu table function displayItems(items) { // Remove any existing entries from the table let tableBody = document.getElementById('menu'); tableBody.innerHTML = ''; // Add new rows for the items in the list let length = items.length; for(let n = 0;n < length;n++) { let newRow = document.createElement('tr'); newRow.innerHTML = ''+items[n].name+'$'+items[n].cost/100+''; let orderButton = document.createElement('button'); orderButton.innerText = 'Order'; orderButton.addEventListener('click',()=>orderItem(items[n].iditem)); orderButton.setAttribute('class','btn btn-secondary align-middle'); let buttonTD = document.createElement('td'); buttonTD.appendChild(orderButton); newRow.appendChild(buttonTD); tableBody.appendChild(newRow); } } // Event handler for remove button function removeItem(n) { order.splice(n,1); displayOrders(); } // Fills the order table with items from the order array function displayOrders() { // Remove any existing entries from the table let tableBody = document.getElementById('items'); tableBody.innerHTML = ''; // Add new rows for the items in the order list let length = order.length; for(let n = 0;n < length;n++) { let newRow = document.createElement('tr'); newRow.innerHTML = ''+order[n].name+'$'+order[n].cost/100+''; let removeButton = document.createElement('button'); removeButton.innerText = 'Remove'; removeButton.setAttribute('class','btn btn-secondary align-middle'); removeButton.addEventListener('click',()=>removeItem(n)); let buttonTD = document.createElement('td'); buttonTD.appendChild(removeButton); newRow.appendChild(buttonTD); tableBody.appendChild(newRow); } } // An example of a filter function designed to filter a list of objects function filterList(list,meal) { var result, n, length; result = []; // Make a new, empty list length = list.length; for(n = 0;n < length;n++) { // Search the original list for items that have the desired meal property if(list[n].meal == meal) result.push(list[n]); // Add items that match to the new list } return result; } // Helper function to handle displaying a different meal function displayMeal(meal) { var newList; newList = filterList(items,meal); displayItems(newList); } // Event handler for the view order button function showOrder() { let menuDiv = document.getElementById('view'); menuDiv.style.display = 'none'; let orderDiv = document.getElementById('order'); orderDiv.style.display = 'block'; displayOrders(); } // Success callback for the place order POST function showConfirm(data) { let numberSpan = document.getElementById('number'); numberSpan.innerText = data; let orderDiv = document.getElementById('order'); orderDiv.style.display = 'none'; let confirmDiv = document.getElementById('confirm'); confirmDiv.style.display = 'block'; } // Event handler for the place order button function placeOrder() { // Construct a list of id numbers for the ordered items var n, length, ids; ids = []; length = order.length; for(n = 0;n < length;n++) ids.push(order[n].iditem); // Construct the order object let nameField = document.getElementById('name'); let phoneField = document.getElementById('phone'); var toPost = {customer:nameField.value,phone:phoneField.value,items:ids}; // POST it to the server fetch('https://cmsc106.net/cafe/purchase', { method: 'POST', body: JSON.stringify(toPost), headers: { 'Content-type': 'application/json; charset=UTF-8' } }).then(response => response.json()).then(response => showConfirm(response)); } // Event handler for the back to menu button function showMenu() { let orderDiv = document.getElementById('order'); orderDiv.style.display = 'none'; let menuDiv = document.getElementById('view'); menuDiv.style.display = 'block'; } // Callback function for the fetch items query function receiveItems(data) { items = data; let startingDiv = document.getElementById('starting'); startingDiv.style.display = 'none'; let menuDiv = document.getElementById('view'); menuDiv.style.display = 'block'; displayMeal('lunch'); } function setUp() { // Set up event handlers for the meal buttons let breakfastButton = document.getElementById('breakfast'); breakfastButton.addEventListener('click',()=>displayMeal('breakfast')); let lunchButton = document.getElementById('lunch'); lunchButton.addEventListener('click',()=>displayMeal('lunch')); let dinnerButton = document.getElementById('dinner'); dinnerButton.addEventListener('click',()=>displayMeal('dinner')); // Set up event handlers for the other buttons let viewOrderButton = document.getElementById('viewOrder'); viewOrderButton.addEventListener('click',()=>showOrder()); viewOrderButton.style.visibility = 'hidden'; let placeOrderButton = document.getElementById('place'); placeOrderButton.addEventListener('click',()=>placeOrder()); let showMenuButton = document.getElementById('back'); showMenuButton.addEventListener('click',()=>showMenu()); // Hide the menu, order, and confirm divs let menuDiv = document.getElementById('view'); menuDiv.style.display = 'none'; let orderDiv = document.getElementById('order'); orderDiv.style.display = 'none'; let confirmDiv = document.getElementById('confirm'); confirmDiv.style.display = 'none'; // Start the process of loading the menu items fetch('https://cmsc106.net/cafe/item').then(response => response.json()).then(response => { receiveItems(response); }); } window.addEventListener('load',setUp,false);