-
Alexis POYEN authoredAlexis POYEN authored
desk-round.js 9.67 KiB
// 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 CapturerModel from "/services/model/capturer-model.js";
export async function mount(where, parent) {
const deskRoundComponent = new DeskRoundSelector(parent);
await deskRoundComponent.mount(where);
return deskRoundComponent;
}
class DeskRoundSelector {
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.CapturerModel = CapturerModel.getCapturerModel();
}
async mount(where) {
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.CapturerModel.current_user = await Auth.GetUser();
const mountpoint = where;
document.getElementById(mountpoint).innerHTML = /* HTML */ `
<header class="card-header">
<p class="card-header-title">
Choix du bureau de vote
</p>
</header>
<div class="card-content">
<div class="columns">
<div class="column">
<div id="select-filters">
<div class="field">
<label>Élection</label><br />
<div class="control select">
<select name="election-select" id="election-select">
<option>Veuillez sélectionner une élection</option>
</select>
</div>
</div>
<div class="field">
<label>Tour</label><br />
<div class="control select">
<select name="round-select" id="round-select">
<option>Veuillez sélectionner un tour</option>
</select>
</div>
</div>
<div class="field">
<label>Circonscription</label><br />
<div class="control select">
<select name="area-select" id="area-select">
<option>Veuillez sélectionner une circonscription</option>
</select>
</div>
</div>
<div class="field">
<label>Section</label><br />
<div class="control select">
<select name="section-select" id="section-select">
<option>Veuillez sélectionner une section</option>
</select>
</div>
</div>
</div>
</div>
<div class="column">
<div id="select-desks"></div>
</div>
</div>
</div>
`;
await this.loadElection();
}
deskRoundTemplate(deskRound) {
return /* HTML */ `<div class="card card-list">
<div
id="deskrounds-deskround-${deskRound.ID}"
class="card-content clickable"
>
<div class="content">
<nav class="level">
<div
id="deskrounds-deskround-desc-${deskRound.ID}"
class="level-left"
></div>
</nav>
</div>
</div>
</div>`;
}
async loadElection() {
let selectElection = document.getElementById("election-select");
let elections = await this.ElectionModel.getElections();
for (let i = selectElection.options.length - 1; i >= 0; i--) {
selectElection.remove(i);
}
elections.forEach((election) => {
let el = document.createElement("option");
el.textContent = election.Name;
el.value = election.ID;
selectElection.appendChild(el);
});
this.ElectionID = elections[0].ID;
this.loadRounds();
}
async loadRounds() {
let deskRoundHandler = this;
let selectRound = document.getElementById("round-select");
let rounds = await this.RoundModel.getRounds();
rounds = rounds.filter((round) => {
return round.ElectionID == deskRoundHandler.ElectionID;
});
rounds.forEach(async (round) => {
let election = await this.ElectionModel.getElection(round.ElectionID);
let el = document.createElement("option");
el.textContent =
election.Name +
" (tour : " +
round.Round +
", date : " +
new Date(round.Date).toLocaleDateString() +
")";
el.value = round.ID;
selectRound.appendChild(el);
});
}
async loadAreas() {
let deskRoundHandler = this;
let selectArea = document.getElementById("area-select");
let areas = await this.AreaModel.getAreas();
areas = areas.filter((area) => {
return area.ElectionID == deskRoundHandler.ElectionID;
});
areas.forEach(async (area) => {
let el = document.createElement("option");
el.textContent = area.Name;
el.value = area.ID;
selectArea.appendChild(el);
});
}
async loadSections() {
let deskRoundHandler = this;
let selectSection = document.getElementById("section-select");
let sections = await this.SectionModel.getSections();
sections = sections.filter((section) => {
return section.AreaID == deskRoundHandler.AreaID;
});
sections.forEach((section) => {
let el = document.createElement("option");
el.textContent = section.Name;
el.value = section.ID;
selectSection.appendChild(el);
});
}
async loadDesks() {
let deskRoundHandler = this;
let deskRounds = await this.DeskRoundModel.getDeskRounds();
deskRounds = deskRounds.filter((deskRound) => {
return deskRound.RoundID == deskRoundHandler.RoundID;
});
// Filter the desks to display only the one affected to capturer
if (this.DeskRoundModel.current_user.role === "CAPTURER") {
let capturer = await this.CapturerModel.getCapturerByUserID(
this.DeskRoundModel.current_user.id
);
let deskRoundsToKeep = [];
for (let i in deskRounds) {
for (let j in capturer.DeskRounds) {
if (capturer.DeskRounds[j].ID == deskRounds[i].ID)
deskRoundsToKeep.push(deskRounds[i]);
}
}
deskRounds = deskRoundsToKeep;
}
let selectRound = document.getElementById("round-select");
if (selectRound.value == 0) {
deskRounds = [];
} else {
let deskRoundsFiltered = [];
let selectArea = document.getElementById("area-select");
if (selectArea.value != 0) {
let area = await this.AreaModel.getArea(selectArea.value);
for (let i in area.Sections) {
for (let deskRound of deskRounds) {
let desk = await deskRoundHandler.DeskModel.getDesk(
deskRound.DeskID
);
if (desk.SectionID == area.Sections[i].ID)
deskRoundsFiltered.push(deskRound);
}
}
deskRounds = deskRoundsFiltered;
}
deskRoundsFiltered = [];
let selectSection = document.getElementById("section-select");
if (selectSection.value != 0) {
for (let deskRound of deskRounds) {
let desk = await deskRoundHandler.DeskModel.getDesk(deskRound.DeskID);
if (desk.SectionID == deskRoundHandler.SectionID)
deskRoundsFiltered.push(deskRound);
}
deskRounds = deskRoundsFiltered;
}
const markup = deskRounds
.map((deskRound) => this.deskRoundTemplate(deskRound))
.join("");
document.getElementById("select-desks").innerHTML = markup;
deskRounds.map(async (deskRound) => {
let desk = await deskRoundHandler.DeskModel.getDesk(deskRound.DeskID);
document.getElementById(
`deskrounds-deskround-desc-${deskRound.ID}`
).innerHTML = desk.Name;
document
.getElementById(`deskrounds-deskround-${deskRound.ID}`)
.addEventListener("click", async function () {
deskRoundHandler.openVotes(deskRound);
});
});
}
}
async openVotes(deskRound) {
this.parent.voteHandler.displayVotes(
this.RoundID,
this.AreaID,
deskRound.ID
);
}
clearRounds() {
let selectRound = document.getElementById("round-select");
for (let i = selectRound.options.length - 1; i >= 0; i--) {
selectRound.remove(i);
}
let el = document.createElement("option");
el.textContent = "Veuillez sélectionner un tour";
el.value = 0;
selectRound.appendChild(el);
}
clearAreas() {
let selectArea = document.getElementById("area-select");
for (let i = selectArea.options.length - 1; i >= 0; i--) {
selectArea.remove(i);
}
let el = document.createElement("option");
el.textContent = "Veuillez sélectionner une circonscription";
el.value = 0;
selectArea.appendChild(el);
}
clearSections() {
let selectSection = document.getElementById("section-select");
for (let i = selectSection.options.length - 1; i >= 0; i--) {
selectSection.remove(i);
}
let el = document.createElement("option");
el.textContent = "Veuillez sélectionner une section";
el.value = 0;
selectSection.appendChild(el);
}
}