Super-Dog Events

I'm A. Jac|

Background

SuperDog Events is an event company the produces comic cons. The marketing team has requested a site the displays stats from their events. You are given an array of event data to build a site.

Description

Given an array of objects of event data display the following:

  • Total attendance by City
  • Average Attendance by City
  • Least attended event by City
  • Most attended event by City
  • Also Show these stats for All Events
  • Extra Credit: Add the ability to add additional events. Store the events in local storage.

Below is the array of data you are given:

                        
[{event: "ComicCon",city: "New York",state: "New York",attendance: 240000,date: "06/01/2017"},
{event: "ComicCon",city: "New York",state: "New York",attendance: 250000,date: "06/01/2018"},
{event: "ComicCon",city: "New York",state: "New York",attendance: 257000,date: "06/01/2019"},
{event: "ComicCon",city: "San Diego",state: "California",attendance: 130000,date: "06/01/2017"},
{event: "ComicCon",city: "San Diego",state: "California",attendance: 140000,date: "06/01/2018"},
{event: "ComicCon",city: "San Diego",state: "California",attendance: 150000,date: "06/01/2019"},
{event: "HeroesCon",city: "Charlotte",state: "North Carolina",attendance: 40000,date: "06/01/2017"},
{event: "HeroesCon",city: "Charlotte",state: "North Carolina",attendance: 45000,date: "06/01/2018"},
{event: "HeroesCon",city: "Charlotte",state: "North Carolina",attendance: 50000,date: "06/01/2019"}]
                        
                    

Solve

Stats For All Events
Total Attendance 1,302,000
Average Attendance 144,667
Most Attended 257,000
Least Attended 40,000

Event Name City State Attendance Event Date
ComicCon New York New York 240000 6/1/2017
ComicCon New York New York 250000 6/1/2018
ComicCon New York New York 257000 6/1/2019
ComicCon San Diego California 130000 6/1/2017
ComicCon San Diego California 140000 6/1/2018
ComicCon San Diego California 150000 6/1/2019
HeroesCon Charlotte North Carolina 40000 6/1/2017
HeroesCon Charlotte North Carolina 45000 6/1/2018
HeroesCon Charlotte North Carolina 50000 6/1/2019

Code

The following the JavaScript code used for this exercise.


//Hard Coded Date for table 
var events = [{
    event: "ComicCon",
    city: "New York",
    state: "New York",
    attendance: 240000,
    date: "06/01/2017",
},
{
    event: "ComicCon",
    city: "New York",
    state: "New York",
    attendance: 250000,
    date: "06/01/2018",
},
{
    event: "ComicCon",
    city: "New York",
    state: "New York",
    attendance: 257000,
    date: "06/01/2019",
},
{
    event: "ComicCon",
    city: "San Diego",
    state: "California",
    attendance: 130000,
    date: "06/01/2017",
},
{
    event: "ComicCon",
    city: "San Diego",
    state: "California",
    attendance: 140000,
    date: "06/01/2018",
},
{
    event: "ComicCon",
    city: "San Diego",
    state: "California",
    attendance: 150000,
    date: "06/01/2019",
},
{
    event: "HeroesCon",
    city: "Charlotte",
    state: "North Carolina",
    attendance: 40000,
    date: "06/01/2017",
},
{
    event: "HeroesCon",
    city: "Charlotte",
    state: "North Carolina",
    attendance: 45000,
    date: "06/01/2018",
},
{
    event: "HeroesCon",
    city: "Charlotte",
    state: "North Carolina",
    attendance: 50000,
    date: "06/01/2019",
},
];

//the default display is all events
var filteredEvents = events;

//building a dropdown of specific cities
function buildDropDown() {
    var eventDD = document.getElementById("eventDropDown");
    //Spread operator(Create elements and bring them back into array)
    //Set Op(Return Unique values passed into array)
    //passes Events uses MAP(), tell it what you want inside of that
    //looking at cities/bring back unique values andturn into an array
    let distinctEvents = [...new Set(events.map((event) => event.city))];
    //
    let linkHTMLEnd =
        '<div class="dropdown-divider"></div><a class="dropdown-item" onclick="getEvents(this)" data-string="All" >All</a>';
    let resultHTML = "";

    for (var i = 0; i < distinctEvents.length; i++) {
        resultHTML += `<a class="dropdown-item" onclick="getEvents(this)"
data-string="${distinctEvents[i]}">${distinctEvents[i]}</a>`;
    }
    resultHTML += linkHTMLEnd;
    eventDD.innerHTML = resultHTML;
    displayStats();
    displayData();
}

//show stats for a specific location
function getEvents(element) {
    //allows to get "data-string element" from a tag
    let city = element.getAttribute("data-string");
    curEvents = JSON.parse(localStorage.getItem("eventsArray")) || events;
    filteredEvents = curEvents;
    document.getElementById("statsHeader").innerHTML = `Stats For ${city} Events`;
    //if not all, use all the stats
    if (city != "All") {
        filteredEvents = curEvents.filter(function (item) {
            if (item.city == city) {
                return item;
            }
        });
    }
    displayStats();
}

function displayStats() {
    let total = 0;
    let average = 0;
    let most = 0;
    let least = -1;
    let currentAttendance = 0;

    //display total attendance per event from current/most/least
    for (var i = 0; i < filteredEvents.length; i++) {
        currentAttendance = filteredEvents[i].attendance;
        total += currentAttendance;
        //checking most attendance, adjusts attendance totals in for loop 
        if (most < currentAttendance) {
            most = currentAttendance;
        }
        //checking least attendence, adjusts attendance totals in for loop
        if (least > currentAttendance || least < 0) {
            least = currentAttendance;
        }
    }
    average = total / filteredEvents.length;
    //giving the values found and posting them to appropriate spots 
    document.getElementById("total").innerHTML = total.toLocaleString();
    document.getElementById("most").innerHTML = most.toLocaleString();
    document.getElementById("least").innerHTML = least.toLocaleString();
    //making sure that the value is rounded to 2 digits
    document.getElementById("average").innerHTML = average.toLocaleString(
        undefined, {
        minimumFractionDigits: 0,
        maximumFractionDigits: 0,
    }
    );
}

function displayData() {
    const template = document.getElementById("eventData-template");
    const eventBody = document.getElementById("eventBody");
    //resets every time it is called 
    eventBody.innerHTML = "";
    //grab the events from local storage
    //allows to store complex data sets in storage, goes here instead of docs
    //null item will make it falsey
    let curEvents = JSON.parse(localStorage.getItem("eventsArray")) || [];

    if (curEvents.length == 0) {
        curEvents = events;
        //where its going -> what i want to send 
        localStorage.setItem("eventsArray", JSON.stringify(curEvents));
    }
    for (var i = 0; i < curEvents.length; i++) {
        const eventRow = document.importNode(template.content, true);

        eventRow.getElementById("event").textContent = curEvents[i].event;
        eventRow.getElementById("city").textContent = curEvents[i].city;
        eventRow.getElementById("state").textContent = curEvents[i].state;
        eventRow.getElementById("attendance").textContent = curEvents[i].attendance;
        eventRow.getElementById("eventDate").textContent = new Date(
            curEvents[i].date
        ).toLocaleDateString();
        //creating row for each new data creation
        eventBody.appendChild(eventRow);
    }
}

function saveEventData() {
    //grab the events out of local storage
    let curEvents = JSON.parse(localStorage.getItem("eventsArray")) || events;

    document.getElementById("newEventName");
    let obj = {};
    obj["event"] = document.getElementById("newEventName").value;
    obj["city"] = document.getElementById("newEventCity").value;
    obj["state"] = document.getElementById("newEventState").value;
    obj["attendance"] = parseInt(
        document.getElementById("newEventAttendance").value,
        10
    );
    obj["date"] = new Date(
        document.getElementById("newEventDate").value
    ).toLocaleDateString();

    curEvents.push(obj);

    localStorage.setItem("eventsArray", JSON.stringify(curEvents));

    //Access the values from the form by ID and add an object to the array.
    displayData();
}


Technologies

Technologies Used: HTML, CSS, JavaScript, jQuery and Bootstrap. Made in VS Studio 2019 with code on GitHub.