THE CODE FOR: SuperDog Events!

// Global var = Usually a bad idea.
const events = [{
        event: "ComicCon",
        city: "New York",
        state: "New York",
        attendance: 240000,
        date: "06/01/2020",
    },
    {
        event: "ComicCon",
        city: "New York",
        state: "New York",
        attendance: 250000,
        date: "06/01/2021",
    },
    {
        event: "ComicCon",
        city: "New York",
        state: "New York",
        attendance: 257000,
        date: "06/01/2022",
    },
    {
        event: "ComicCon",
        city: "San Diego",
        state: "California",
        attendance: 130000,
        date: "06/01/2020",
    },
    {
        event: "ComicCon",
        city: "San Diego",
        state: "California",
        attendance: 140000,
        date: "06/01/2021",
    },
    {
        event: "ComicCon",
        city: "San Diego",
        state: "California",
        attendance: 150000,
        date: "06/01/2022",
    },
    {
        event: "HeroesCon",
        city: "Charlotte",
        state: "North Carolina",
        attendance: 40000,
        date: "06/01/2020",
    },
    {
        event: "HeroesCon",
        city: "Charlotte",
        state: "North Carolina",
        attendance: 45000,
        date: "06/01/2021",
    },
    {
        event: "HeroesCon",
        city: "Charlotte",
        state: "North Carolina",
        attendance: 50000,
        date: "06/01/2022",
    },
];

// Building the dropdown menu.
function buildDropDown() {

    // First step: Get a handle on the drop down.
    let eventDD = document.getElementById("eventDropDownList");

    // Reset the list.
    eventDD.innerHTML = "";

    //
    // Get the template.
    let ddTemplate = document.getElementById("dropDown-template");

    // Get the template node.
    let ddItem = document.importNode(ddTemplate.content, true);

    let ddLink = ddItem.querySelector("a");
    ddLink.setAttribute("data-city", "All");
    ddLink.textContent = "All";
    eventDD.appendChild(ddItem);

    // Add links for the unique cities.
    let currentEvents = getEvents();
    // Get our data.

    // Get a unique or "distinct" array of city names.
    let distinctCities = [...new Set(currentEvents.map((event) => event.city))];

    // Filter the data to a unique set of cities.
    for (let index = 0; index < distinctCities.length; index++) {

        let ddItem = document.importNode(ddTemplate.content, true);

        let ddLink = ddItem.querySelector("a");
        ddLink.setAttribute("data-city", distinctCities[index]);
        ddLink.textContent = distinctCities[index];
        eventDD.appendChild(ddItem);
    }

    let statsHeader = document.getElementById("statsHeader");
    statsHeader.innerHTML = `Stats For All Events:`;

    displayStats(currentEvents);

    // Show data for all events
    displayEventData(currentEvents);

}

// Called every time a city name is clicked in the dropdown menu.
function getEventData(element) {
    let city = element.getAttribute("data-city");

    // Create the statistics for the "clicked" city.
    let currentEvents = getEvents();

    let filteredEvents = currentEvents;

    if (city != "All") {
        // Return an array with ONLY the events for the selected city.
        filteredEvents = currentEvents.filter(function (event) {

            if (event.city == city) {
                return event;
            }

        });
    }

    // Set the header
    let statsHeader = document.getElementById("statsHeader");
    statsHeader.innerHTML = `Statistics for ${city}:`;

    // Call a function to display the stats.
    displayStats(filteredEvents);

}

// Pulling events from local storage or the default array events.
function getEvents() {
    let currentEvents = JSON.parse(localStorage.getItem("eventData"));

    if (currentEvents === null) {
        currentEvents = events;
        localStorage.setItem("eventData", JSON.stringify(currentEvents));
    }

    return currentEvents;
}

// This function displays stats for the selected city.
function displayStats(filteredEvents) {

    let total = 0;
    let average = 0;
    let most = 0;
    let least = -1;
    let currentAttendance = 0;

    for (let index = 0; index < filteredEvents.length; index++) {

        currentAttendance = filteredEvents[index].attendance;
        total += currentAttendance;

        if (most < currentAttendance) {
            most = currentAttendance;
        }

        if (least > currentAttendance || least < 0) {
            least = currentAttendance;
        }

    }

    average = total / filteredEvents.length;

    // Write values to the page.
    document.getElementById("total").innerHTML = total.toLocaleString();
    document.getElementById("most").innerHTML = most.toLocaleString();
    document.getElementById("least").innerHTML = least.toLocaleString();
    document.getElementById("average").innerHTML = average.toLocaleString(
        undefined, {
            minimumFractionDigits: 0,
            maximumFractionDigits: 0
        }
    );

}

// This function displays all of the event data -
// In a grid on the bottom of the page.
function displayEventData(currentEvents) {
    let template = document.getElementById("eventData-template");
    let eventBody = document.getElementById("eventBody");

    // Clears the table of any previous data.
    eventBody.innerHTML = "";

    // Loop over all of the eventData and write a row for each event -
    // To the eventBody element.
    for (let index = 0; index < currentEvents.length; index++) {
        let eventRow = document.importNode(template.content, true)

        // Grab ONLY the columns from the template.
        // Creates an array of the columns in the template.
        let eventCols = eventRow.querySelectorAll("td");

        eventCols[0].textContent = currentEvents[index].event;
        eventCols[1].textContent = currentEvents[index].city;
        eventCols[2].textContent = currentEvents[index].state;
        eventCols[3].textContent = currentEvents[index].attendance;
        eventCols[4].textContent = new Date(currentEvents[index].date).toLocaleDateString();
        eventBody.appendChild(eventRow);

    }

}

function saveEventData() {
    // Get all of the course data from local storage
    let currentEvents = getEvents();

    let eventObj = {
        event: "name",
        city: "city",
        state: "state",
        attendance: 0,
        date: "01/01/2001",
    }

    // Get the values from the "add" form.
    eventObj.event = document.getElementById("newEventName").value;
    eventObj.city = document.getElementById("newEventCity").value;

    // Get values from the dropdown.
    let stateSel = document.getElementById("newEventState");
    eventObj.state = stateSel.options[stateSel.selectedIndex].text;

    // Turn the input into a number.
    let attendanceNmbr = parseInt(document.getElementById("newEventAttendance").value, 10);
    eventObj.attendance = attendanceNmbr;

    // Format the date.
    let eventDate = document.getElementById("newEventDate").value;
    let eventDateFormatted = `${eventDate} 00:00`;
    eventObj.date = new Date(eventDateFormatted).toLocaleDateString();

    // Save
    currentEvents.push(eventObj);
    localStorage.setItem("eventData", JSON.stringify(currentEvents));

    buildDropDown();

}

This program has multiples functions:

  • Get the event data from the event array.
  • Builds a dropdown menu with event info.
  • Sets up and pulls from local storage.
  • Loads event statistics into a table.
  • Displays the statistics from each event.
  • Saves custom event data in local storage, unique to each user.