Skip to content
Snippets Groups Projects
votes.js 10.3 KiB
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";
Alexis POYEN's avatar
Alexis POYEN committed
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">
Alexis POYEN's avatar
Alexis POYEN committed
        <div class="level-left" id="votes-stats" style="margin: auto;
        width: 100%;"></div>
        <div class="level-right">
Alexis POYEN's avatar
Alexis POYEN committed
          <button id="votes-return" class="button level-item">
            Retour
          </button>
          <button id="votes-cancel" class="button level-item">
            Annuler
          </button>
Alexis POYEN's avatar
Alexis POYEN committed
          <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();
Alexis POYEN's avatar
Alexis POYEN committed
    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();
      });
Alexis POYEN's avatar
Alexis POYEN committed
    document
      .getElementById(`votes-save`)
      .addEventListener("click", function () {
        voteHandler.saveVotes();
      });
Alexis POYEN's avatar
Alexis POYEN committed
    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);
Alexis POYEN's avatar
Alexis POYEN committed
    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");
Alexis POYEN's avatar
Alexis POYEN committed
    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> `;

Alexis POYEN's avatar
Alexis POYEN committed
    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;
      }
    });
Alexis POYEN's avatar
Alexis POYEN committed
    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;
    }
Alexis POYEN's avatar
Alexis POYEN committed

  async saveVotes() {
    let voteHandler = this;
Alexis POYEN's avatar
Alexis POYEN committed
    let candidateLists = await this.updateCandidateLists();
Alexis POYEN's avatar
Alexis POYEN committed

Alexis POYEN's avatar
Alexis POYEN committed

    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) {
Alexis POYEN's avatar
Alexis POYEN committed
      await voteHandler.VoteModel.saveVote(
Alexis POYEN's avatar
Alexis POYEN committed
        method,
        voteHandler.DeskRoundID,
        candidateList.ID,
        parseInt(
          document.getElementById(candidateList.ID + "-vote-voice").value
        ),
        false,
        false
      );
Alexis POYEN's avatar
Alexis POYEN committed

    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),
Alexis POYEN's avatar
Alexis POYEN committed
  }
Alexis POYEN's avatar
Alexis POYEN committed

  async updatesVotes() {
Alexis POYEN's avatar
Alexis POYEN committed
    let voteHandler = this;
Alexis POYEN's avatar
Alexis POYEN committed
    let votes = await this.VoteModel.getVotes();
    return votes.filter((vote) => {
      return vote.DeskRoundID == voteHandler.DeskRoundID;
    });
  }

  async updateCandidateLists() {
Alexis POYEN's avatar
Alexis POYEN committed
    let voteHandler = this;
    let candidateLists = await this.CandidateListModel.getCandidateLists();
Alexis POYEN's avatar
Alexis POYEN committed
    return candidateLists.filter((candidateList) => {
      return (
        candidateList.AreaID == voteHandler.AreaID &&
        candidateList.RoundID == voteHandler.RoundID
      );
    });
  }
Alexis POYEN's avatar
Alexis POYEN committed

  async deleteVotes() {
    let voteHandler = this;
    let votes = await this.updatesVotes();
    for (let vote of votes) {
Alexis POYEN's avatar
Alexis POYEN committed
      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();
Alexis POYEN's avatar
Alexis POYEN committed
  }