diff --git a/index.js b/index.js index d837872..f016ec9 100644 --- a/index.js +++ b/index.js @@ -1,7 +1,10 @@ (() => { let candidates; - let headerContainer = document.querySelector('.wrapper-power-bar'); - headerContainer.insertAdjacentHTML('afterend', `
NameVotes
`); + let parties; + let states; + let headerContainer = document.querySelector('div.article-block:nth-child(7)'); + headerContainer.innerHTML = ''; + headerContainer.insertAdjacentHTML('afterend', `
NamePartyVotes
`); const { fetch: originalFetch } = window; @@ -14,13 +17,15 @@ const f = response.url.split('/').pop(); if (f === "metadata.json") { const metadata = await response.json(); - candidates = new Map(metadata.candidates.map((c) => [c.uid, c.fullName])); + states = new Map(metadata.geo.map((c) => [c.uid, c.name])) + parties = new Map(metadata.parties.map((c) => [c.code, c.name])); + candidates = new Map(metadata.candidates.map((c) => [c.uid, [c.fullName, parties.get(c.candidateRaces[0].majorParty)]])); } else if (f === "president.json") { const president = await response.json(); let data = president[0]["state_electionTypes"].map((t) => t.state.officeRaces[0].candidateVotes.map((o) => { return { - "name": (candidates) ? candidates.get(o.candidate) : o.candidate, + "name": (candidates) ? candidates.get(o.candidate) : [o.candidate, "?"], "votes": o.totalVote }; })).reduce((acc, current) => { @@ -35,17 +40,67 @@ return acc; }, []); + let stateVotes = president[0]["state_electionTypes"].map((t) => { + return { + "state": (states) ? states.get(t.state.uid) : t.uid, + "current": t.state.officeRaces[0].officeVotes[0].totalVote, + "expected": t.state.officeRaces[0].officeVotes[0].totalExpectedVote, + "candidates": t.state.officeRaces[0].candidateVotes.map((o) => { + return { + "name": (candidates) ? candidates.get(o.candidate) : [o.candidate, "?"], + "votes": o.totalVote + }; + }) + }; + }); + if (data.length > 0) { let tableBody = document.getElementById('table-body'); tableBody.innerHTML = ''; data.forEach((row, index) => { let rowElement = tableBody.insertRow(); + rowElement.setAttribute('class', `with-state-links row-${index} svelte-woitu6 first-poll-close-row`); let nameCell = rowElement.insertCell(); + nameCell.setAttribute('class', `state en svelte-woitu6`); + let partyCell = rowElement.insertCell(); + partyCell.setAttribute('class', `state en svelte-woitu6`); let votesCell = rowElement.insertCell(); - nameCell.textContent = row.name; + votesCell.setAttribute('class', `state en svelte-woitu6`); + nameCell.textContent = row.name[0]; + partyCell.textContent = row.name[1]; votesCell.textContent = row.votes; }); } + + if (stateVotes.length > 0) { + let stateContainer = document.getElementById('state-container'); + stateContainer.innerHTML = ''; + stateVotes.forEach((row) => { + const card = document.createElement('div'); + + const stateInfo = document.createElement('div'); + stateInfo.innerHTML = ` +

${row.state} (Votes Left: ${row.expected - row.current})

+ `; + card.appendChild(stateInfo); + + const candidateInfo = document.createElement('div'); + candidateInfo.innerHTML = '

Candidates:

'; + const candidatesList = document.createElement('ul'); + + row.candidates.forEach(candidate => { + const listItem = document.createElement('li'); + listItem.innerHTML = ` + ${candidate.name[0]} (${candidate.name[1]}) - ${candidate.votes} votes + `; + candidatesList.appendChild(listItem); + }); + + candidateInfo.appendChild(candidatesList); + card.appendChild(candidateInfo); + stateContainer.appendChild(card); + }); + } } return response; };