diff --git a/web/components/visualization/results-section.js b/web/components/visualization/results-section.js index 78f51e6bcfd05cc3bff86e4c0e79e0e4edf4f491..cbe67306df5580fb0b4b93ac6203dc032177fd69 100644 --- a/web/components/visualization/results-section.js +++ b/web/components/visualization/results-section.js @@ -2,23 +2,24 @@ import * as Auth from "/services/auth/auth.js"; import * as results from "/services/election/calculate-election-generic.js"; import * as PartyModel from "/services/model/party-model.js"; +import * as CandidateListModel from "/services/model/candidateList-model.js"; import * as Scroller from "/services/common/scroller.js"; export async function mount(where, round) { const resultComponent = new ResultComponent(round); await resultComponent.mount(where); - await resultComponent.calculateResults(); - resultComponent.displayResults(); } class ResultComponent { constructor(round) { this.round = round; this.PartyModel = PartyModel.getPartyModel(); + this.CandidateListModel = CandidateListModel.getCandidateListModel(); } async mount(where) { this.PartyModel.current_user = await Auth.GetUser(); + this.CandidateListModel.current_user = await Auth.GetUser(); const mountpoint = where; document.getElementById(mountpoint).innerHTML = /* HTML */ ` <div class="tabs is-boxed is-toggle is-fullwidth"> @@ -128,7 +129,7 @@ class ResultComponent { </div>`; } - progressBarTemplate(candidateList, color) { + progressBarTemplate(candidateList, color, electedsNumber) { return /* HTML */ `<div class="progressBar"> <div class="progressBarValue" @@ -140,7 +141,8 @@ class ResultComponent { ? candidateList.VoiceNumber + " votes soit : " : "") + candidateList.Percentage + - "%)"} + "%" + + (electedsNumber != null ? ", " + electedsNumber + " élus" : "")}) </div> </div>`; } @@ -159,20 +161,24 @@ class ResultComponent { handleDom() { let resultHandler = this; - document.getElementById("areas").addEventListener("click", function () { - resultHandler.zone = "areas"; - resultHandler.calculateResults(); - resultHandler.displayResults(); - document.getElementById("sections").setAttribute("class", ""); - document.getElementById("areas").setAttribute("class", "is-active"); - }); - document.getElementById("sections").addEventListener("click", function () { - resultHandler.zone = "sections"; - resultHandler.calculateResults(); - resultHandler.displayResults(); - document.getElementById("areas").setAttribute("class", ""); - document.getElementById("sections").setAttribute("class", "is-active"); - }); + document + .getElementById("areas") + .addEventListener("click", async function () { + resultHandler.zone = "areas"; + await resultHandler.calculateResults(); + resultHandler.displayResults(); + document.getElementById("sections").setAttribute("class", ""); + document.getElementById("areas").setAttribute("class", "is-active"); + }); + document + .getElementById("sections") + .addEventListener("click", async function () { + resultHandler.zone = "sections"; + await resultHandler.calculateResults(); + resultHandler.displayResults(); + document.getElementById("areas").setAttribute("class", ""); + document.getElementById("sections").setAttribute("class", "is-active"); + }); document.getElementById("zoom-map").addEventListener("click", function () { resultHandler.zoomMap(); @@ -414,7 +420,6 @@ class ResultComponent { async displayZoneResults(zone) { if (zone.status !== this.filter) { - console.log(zone); if (zone.status == "no_results") { document.getElementById( "zone-results" @@ -439,6 +444,14 @@ class ResultComponent { document.getElementById("zone-results").innerHTML = '<br/><h5 class="title is-5">Résultats</h5>'; for (let i in zone.candidateLists) { + let electedsNumber = null; + if ( + this.zone === "areas" && + zone.candidateLists[i].SeatsAttributed > 0 && + zone.stats.PercentageConsiderated == 100 + ) { + electedsNumber = zone.candidateLists[i].SeatsAttributed; + } let party = await this.PartyModel.getParty( zone.candidateLists[i].PartyID ); @@ -446,14 +459,15 @@ class ResultComponent { "zone-results" ).innerHTML += this.progressBarTemplate( zone.candidateLists[i], - party.Color + party.Color, + electedsNumber ); } this.displayZoneDetailedResults(zone); } } - displayZoneDetailedResults(zone) { + async displayZoneDetailedResults(zone) { document.getElementById("zone-detaileds-results").innerHTML = '<br/><h5 class="title is-5">Statistiques</h5>'; @@ -466,7 +480,8 @@ class ResultComponent { Percentage: zone.stats.PercentageConsiderated, VoiceNumber: null, }, - "grey" + "grey", + null ); document.getElementById( "zone-detaileds-results" @@ -476,7 +491,8 @@ class ResultComponent { Percentage: zone.stats.Abstention, VoiceNumber: null, }, - "grey" + "grey", + null ); document.getElementById( "zone-detaileds-results" @@ -486,7 +502,8 @@ class ResultComponent { Percentage: zone.stats.BlankPercentage, VoiceNumber: zone.stats.BlankVoiceNumber, }, - "grey" + "grey", + null ); document.getElementById( "zone-detaileds-results" @@ -496,8 +513,20 @@ class ResultComponent { Percentage: zone.stats.NullVotePercentage, VoiceNumber: zone.stats.NullVoteVoiceNumber, }, - "grey" + "grey", + null ); + if (this.zone === "areas" && zone.stats.PercentageConsiderated == 100) { + document.getElementById("zone-detaileds-results").innerHTML += + '<br/><h5 class="title is-5">Élus</h5>'; + for (let i in zone.Electeds) { + let candidateList = await this.CandidateListModel.getCandidateList( + zone.Electeds[i].CandidateListID + ); + document.getElementById("zone-detaileds-results").innerHTML += + zone.Electeds[i].FullName + " (" + candidateList.Name + ")<br/>"; + } + } } refreshSections(area) { diff --git a/web/services/election/calculate-election-generic.js b/web/services/election/calculate-election-generic.js index a6aa96c60bd9872c2de964983016d6c99ebcc327..eed1675625e11f967b3d2e4d12defc0d8f5c9357 100644 --- a/web/services/election/calculate-election-generic.js +++ b/web/services/election/calculate-election-generic.js @@ -16,7 +16,7 @@ export async function mountCalculator(round) { } class DirectMetropolitanCalculator { - constructor(round, filter) { + constructor(round) { this.round = round; this.ElectionModel = ElectionModel.getElectionModel(); this.RoundModel = RoundModel.getRoundModel(); @@ -150,8 +150,7 @@ class DirectMetropolitanCalculator { for (let i in areas) { areasCalculated.push(await this.calculateAreaResults(areas[i])); } - areas = areasCalculated; - return areas; + return areasCalculated; } async calculateAreaResults(area) { @@ -337,7 +336,6 @@ class DirectMetropolitanCalculator { subscribed += desk.Subscribed; if (deskRounds[i].Completed) { completed += desk.Subscribed; - console.log("test") } deskRounds[i].Votes.forEach((vote) => { totalVotes += vote.VoiceNumber; @@ -364,6 +362,7 @@ class DirectMetropolitanCalculator { // order candidates by rank and remove refused or removed candidates area.candidateLists.forEach((candidateList) => { + candidateList.seatNumber = 0; candidateList.Candidates.sort(function (a, b) { return a.Rank - b.Rank; }); @@ -448,6 +447,11 @@ class DirectMetropolitanCalculator { leftSeats -= 1; } + area.candidateLists.sort((a, b) => { + return b.VoiceNumber - a.VoiceNumber; + }); + area.candidateLists[0].SeatsAttributed += seatForFirst; + return electeds; } }