// Imports import * as Auth from "/services/auth/auth.js"; import * as ElectionModel from "/services/model/election-model.js"; import * as RoundModel from "/services/model/round-model.js"; import * as AreaModel from "/services/model/area-model.js"; import * as SectionModel from "/services/model/section-model.js"; import * as DeskModel from "/services/model/desk-model.js"; import * as DeskRoundModel from "/services/model/deskRound-model.js"; import * as VoteModel from "/services/model/vote-model.js"; import * as CandidateListModel from "/services/model/candidateList-model.js"; import * as Common from "/services/common/common.js"; import * as Messages from "/services/messages/messages.js"; export async function mount(parent) { const voteComponent = new Vote(parent); return voteComponent; } class Vote { constructor(parent) { this.method = null; this.parent = parent; this.ElectionModel = ElectionModel.getElectionModel(); this.RoundModel = RoundModel.getRoundModel(); this.AreaModel = AreaModel.getAreaModel(); this.SectionModel = SectionModel.getSectionModel(); this.DeskModel = DeskModel.getDeskModel(); this.DeskRoundModel = DeskRoundModel.getDeskRoundModel(); this.VoteModel = VoteModel.getVoteModel(); this.CandidateListModel = CandidateListModel.getCandidateListModel(); } async displayVotes(RoundID, AreaID, DeskRoundID) { this.ElectionModel.current_user = await Auth.GetUser(); this.RoundModel.current_user = await Auth.GetUser(); this.AreaModel.current_user = await Auth.GetUser(); this.SectionModel.current_user = await Auth.GetUser(); this.DeskModel.current_user = await Auth.GetUser(); this.DeskRoundModel.current_user = await Auth.GetUser(); this.VoteModel.current_user = await Auth.GetUser(); this.CandidateListModel.current_user = await Auth.GetUser(); this.RoundID = RoundID; this.AreaID = AreaID; this.DeskRoundID = DeskRoundID; document.getElementById("vote-section").innerHTML = /* HTML */ ` <header id="votes-breadcrumb" class="card-header"> <p > <nav class="breadcrumb card-header-title" aria-label="breadcrumbs"> <ul id="vote-breadcrumb"></ul> </nav> </p> </header> <div id="votes-table"></div> <nav class="level"> <div class="level-left" id="votes-stats" style="margin: auto; width: 100%;"></div> <div class="level-right"> <button id="votes-return" class="button level-item"> Retour </button> <button id="votes-cancel" class="button level-item"> Annuler </button> <button id="votes-delete" class="button is-danger level-item"> Supprimer </button> <button id="votes-save" class="button is-success level-item"> Sauvegarder </button> </div> </nav> `; this.handleDom(); await this.refreshBreadCrumb(); await this.loadVotes(); this.deskRound = await this.DeskRoundModel.getDeskRound(this.DeskRoundID); if (this.deskRound.Validated) { document.getElementById("votes-table").innerHTML = Common.warningMessage( "Votes validés", "Les votes ont étaient validés et ne peuvent plus être modifiés" ); document.getElementById("votes-stats").innerHTML = ""; document.getElementById(`votes-cancel`).setAttribute("disabled", "true"); document.getElementById(`votes-save`).setAttribute("disabled", "true"); document.getElementById(`votes-delete`).setAttribute("disabled", "true"); } } voteTemplate(candidateList) { return /* HTML */ ` <tr id="votes-vote-${candidateList.ID}"> <td> ${candidateList.Name} </td> <td> <input class="input" type="number" id="${candidateList.ID}-vote-voice" /> </td> </tr> `; } handleDom() { let voteHandler = this; document .getElementById(`votes-return`) .addEventListener("click", function () { voteHandler.parent.deskRoundHandler.mount("vote-section"); }); document .getElementById(`votes-cancel`) .addEventListener("click", function () { voteHandler.loadVotes(); }); document .getElementById(`votes-save`) .addEventListener("click", function () { voteHandler.saveVotes(); }); document .getElementById(`votes-delete`) .addEventListener("click", function () { voteHandler.deleteVotes(); }); } async refreshBreadCrumb() { let round = await this.RoundModel.getRound(this.RoundID); let election = await this.ElectionModel.getElection(round.ElectionID); let deskRound = await this.DeskRoundModel.getDeskRound(this.DeskRoundID); this.desk = await this.DeskModel.getDesk(deskRound.DeskID); let section = await this.SectionModel.getSection(this.desk.SectionID); let area = await this.AreaModel.getArea(section.AreaID); this.AreaID = area.ID; let breadcrumb = document.getElementById("vote-breadcrumb"); let el = document.createElement("li"); el.innerHTML = "<a>" + election.Name + "</a>"; breadcrumb.appendChild(el); el = document.createElement("li"); el.innerHTML = "<a>tour : " + round.Round + ", date : " + new Date(round.Date).toLocaleDateString() + "</a>"; breadcrumb.appendChild(el); el = document.createElement("li"); el.innerHTML = "<a>" + area.Name + "</a>"; breadcrumb.appendChild(el); el = document.createElement("li"); el.innerHTML = "<a>" + section.Name + "</a>"; breadcrumb.appendChild(el); el = document.createElement("li"); el.innerHTML = "<a>" + this.desk.Name + "</a>"; breadcrumb.appendChild(el); } async loadVotes() { document.getElementById("votes-table").innerHTML = /* HTML */ `<div class="table-container" > <table class="table is-bordered is-narrow is-hoverable is-fullwidth"> <thead> <tr class="is-selected"> <th>Liste</th> <th>Nombre de voix</th> </tr> </thead> <tbody id="votes-list"></tbody> </table> </div> `; let votes = await this.updatesVotes(); let candidateLists = await this.updateCandidateLists(); const markup = candidateLists .map((vote) => this.voteTemplate(vote)) .join(""); document.getElementById("votes-list").innerHTML = markup; document.getElementById("votes-list").innerHTML += /* HTML */ ` <tr"> <td>Votes blanc</td> <td> <input class="input" type="number" id="blank-vote-voice" /> </td> </tr> `; document.getElementById("votes-list").innerHTML += /* HTML */ ` <tr> <td>Votes nul</td> <td> <input class="input" type="number" id="null-vote-voice" /> </td> </tr> `; let totalVotes = 0; let votesExpressed = 0; votes.forEach((vote) => { totalVotes += vote.VoiceNumber; if (vote.Blank) { document.getElementById("blank-vote-voice").value = vote.VoiceNumber; } else if (vote.NullVote) { document.getElementById("null-vote-voice").value = vote.VoiceNumber; } else { votesExpressed += vote.VoiceNumber; document.getElementById(vote.CandidateListID + "-vote-voice").value = vote.VoiceNumber; } }); if (this.desk.Subscribed < totalVotes) { document.getElementById("votes-stats").innerHTML = Common.warningMessage( "Erreur de saisie", "Il y a plus de votes saisis que d'inscrits sur le bureau de vote." ); } else { document.getElementById("votes-stats").innerHTML = "Suffrages total : " + totalVotes + ", Suffrages exprimés : " + votesExpressed; } } async saveVotes() { let voteHandler = this; let candidateLists = await this.updateCandidateLists(); let method = "POST"; let flag = true; for (let candidateList of candidateLists) { if ( parseInt( document.getElementById(candidateList.ID + "-vote-voice").value ) < 0 ) flag = false; } if (!flag) { Messages.Show("is-warning", "Erreur sur les valeurs saisies"); return; } for (let candidateList of candidateLists) { await voteHandler.VoteModel.saveVote( method, voteHandler.DeskRoundID, candidateList.ID, parseInt( document.getElementById(candidateList.ID + "-vote-voice").value ), false, false ); } if ( parseInt( document.getElementById("blank-vote-voice").value ) < 0 ) { Messages.Show("is-warning", "Erreur sur les valeurs saisies"); return; } else { await this.VoteModel.saveVote( method, this.DeskRoundID, null, parseInt(document.getElementById("blank-vote-voice").value), true, false ); } if ( parseInt( document.getElementById("null-vote-voice").value ) < 0 ) { Messages.Show("is-warning", "Erreur sur les valeurs saisies"); return; } else { await this.VoteModel.saveVote( method, this.DeskRoundID, null, parseInt(document.getElementById("null-vote-voice").value), false, true ); } this.refreshParent(); } async updatesVotes() { let voteHandler = this; let votes = await this.VoteModel.getVotes(); return votes.filter((vote) => { return vote.DeskRoundID == voteHandler.DeskRoundID; }); } async updateCandidateLists() { let voteHandler = this; let candidateLists = await this.CandidateListModel.getCandidateLists(); return candidateLists.filter((candidateList) => { return ( candidateList.AreaID == voteHandler.AreaID && candidateList.RoundID == voteHandler.RoundID ); }); } async deleteVotes() { let voteHandler = this; let votes = await this.updatesVotes(); for (let vote of votes) { await voteHandler.VoteModel.deleteVote(vote.ID); } this.refreshParent(); } async refreshParent() { await this.VoteModel.refreshVotes(); await this.loadVotes(); await this.DeskRoundModel.refreshDeskRounds(); await this.parent.refreshVotes(); } }