The Code
The five functions that make Encore Events worthy of an encore
function buildDropDown() {
let eventDropDown = document.getElementById("eventDropDown");
let template = document.getElementById("cityDropDown-template");
// Retrieve event data and create array of distinct cities
const eventData = JSON.parse(localStorage.getItem("eventData")) || events;
const eventCities = [...new Set(eventData.map((item) => item.city))];
// Create dropdown option for All
let ddItemNode = document.importNode(template.content, true);
ddItem = ddItemNode.querySelector("a");
ddItem.setAttribute("data-string", "All");
ddItem.textContent = "All";
eventDropDown.appendChild(ddItem);
// Create dropdown option for each city
for (let i = 0; i < eventCities.length; i++) {
let ddItemNode = document.importNode(template.content, true);
ddItem = ddItemNode.querySelector("a");
ddItem.setAttribute("data-string", eventCities[i]);
ddItem.textContent = eventCities[i];
eventDropDown.appendChild(ddItem);
}
// By default display data for all cities
displayStats(eventData);
// Display all data in bottom table
displayData();
}
buildDropDown
The app entry point. Build a list of unique cities from event data. Build a dropdown for the unique cities. Display the stats and data for the current event data.
function getEvents(element) {
// Retrieve event data
const allEvents = JSON.parse(localStorage.getItem("eventData")) || events;
let filteredEvents = "";
let city = element.getAttribute("data-string");
// Filter data and display table header based on selected city
if (city != "All") {
filteredEvents = allEvents.filter((item) => item.city == city);
} else {
filteredEvents = allEvents;
}
// Adjust stats header to match selected city
document.getElementById("statsHeader").innerText = `Stats For ${city} Events`;
// Call method to display the events using the filtered data
displayStats(filteredEvents);
}
getEvents(element)
parameter {any} element - dropdown list item
Displays the data for the selected city
function displayStats(events) {
// Initialize stats variables
let totalAttendance = 0;
let averageAttendance = 0;
let mostAttended = events[0].attendance;
let leastAttended = events[0].attendance;
// Add logic to set values of stats variables by looping over events
for (let i = 0; i < events.length; i++) {
totalAttendance += events[i].attendance;
mostAttended = Math.max(events[i].attendance, mostAttended);
leastAttended = Math.min(events[i].attendance, leastAttended);
}
averageAttendance = Math.floor(totalAttendance / events.length);
// Add values to the table
document.getElementById("total").innerHTML = totalAttendance.toLocaleString();
document.getElementById("most").innerHTML = mostAttended.toLocaleString();
document.getElementById("least").innerHTML = leastAttended.toLocaleString();
document.getElementById("average").innerHTML =
averageAttendance.toLocaleString(undefined, {
minimumFractionDigits: 0,
maximumFractionDigits: 0,
});
}
displayStats(filteredEvents)
parameter {array} filteredEvents - array of events
Displays stats for the events being passed in
function displayData() {
let eventBody = document.getElementById("eventBody");
let template = document.getElementById("eventData-template");
eventBody.innerHTML = "";
// Retrieve event data
let curEvents = JSON.parse(localStorage.getItem("eventData")) || [];
if (curEvents.length == 0) {
curEvents = events;
localStorage.setItem("eventData", JSON.stringify(curEvents));
}
// Populate a row of data for each event
for (let i = 0; i < curEvents.length; i++) {
let eventItemsNode = document.importNode(template.content, true);
let eventCols = eventItemsNode.querySelectorAll("td");
eventCols[0].textContent = curEvents[i].event;
eventCols[1].textContent = curEvents[i].city;
eventCols[2].textContent = curEvents[i].state;
eventCols[3].textContent = curEvents[i].attendance;
eventCols[4].textContent = new Date(curEvents[i].date).toLocaleDateString();
// Add that data to the event table
eventBody.appendChild(eventItemsNode);
}
}
displayData
Displays the event in a grid using a template
function saveEventData() {
// Retrieve event data
let curEvents = JSON.parse(localStorage.getItem("eventData")) || [];
// Create a new event and add values based on user's form input
let newEvent = {};
newEvent["event"] = document.getElementById("newEventName").value;
newEvent["city"] = document.getElementById("newEventCity").value;
let state = document.getElementById("newEventState");
newEvent["state"] = state.options[state.selectedIndex].text;
newEvent["attendance"] = parseInt(
document.getElementById("newEventAttendance").value,
10
);
let eventDate = document.getElementById("newEventDate").value;
let eventDate2 = `${eventDate} 00:00`;
newEvent["date"] = new Date(eventDate2).toLocaleDateString();
// Add new event to current event data
curEvents.push(newEvent);
// Save data to local storage
localStorage.setItem("eventData", JSON.stringify(curEvents));
// Build the drop down and display the data again with the new data included
buildDropDown();
displayData();
}
saveEventData
Save the event data from a modal form into local storage