Newer
Older
// 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";
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>
<div id="votes-table"></div>
<div class="level-left" id="votes-stats" style="margin: auto;
width: 100%;"></div>
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>
await this.refreshBreadCrumb();
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();
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
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;
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;
}
let candidateLists = await this.updateCandidateLists();
let votes = await this.updatesVotes();
let method;
if (votes.length == 0) method = "POST";
else method = "PUT";
for (let candidateList of candidateLists) {
method,
voteHandler.DeskRoundID,
candidateList.ID,
parseInt(
document.getElementById(candidateList.ID + "-vote-voice").value
),
false,
false
);
method,
this.DeskRoundID,
null,
parseInt(document.getElementById("blank-vote-voice").value),
true,
false
);
method,
this.DeskRoundID,
null,
parseInt(document.getElementById("null-vote-voice").value),
false,
true
);
this.refreshParent();
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) {
this.refreshParent();
}
async refreshParent() {
await this.VoteModel.refreshVotes();
await this.loadVotes();
await this.DeskRoundModel.refreshDeskRounds();
await this.parent.refreshVotes();