Skip to content
Snippets Groups Projects
votes.js 7.73 KiB
Newer Older
  • Learn to ignore specific revisions
  • // 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";
    
    
    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 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" class="card-content"></div>
    
          <nav class="level">
            <div class="level-left"></div>
            <div class="level-right">
              <button id="votes-return" class="button is-danger level-item">
                Retour
              </button>
              <button id="votes-cancel" class="button level-item">
                Annuler
              </button>
              <button id="votes-save" class="button is-success level-item">
                Sauvegarder
              </button>
            </div>
          </nav>
    
        `;
        this.handleDom();
    
    
        await this.refreshBreadCrumb();
    
        await this.loadVotes();
      }
    
      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();
          });
    
      async refreshBreadCrumb() {
        let round = await this.RoundModel.getRound(this.RoundID);
        let election = await this.ElectionModel.getElection(round.ElectionID);
        let area = await this.AreaModel.getArea(this.AreaID);
        let deskRound = await this.DeskRoundModel.getDeskRound(this.DeskRoundID);
        let desk = await this.DeskModel.getDesk(deskRound.DeskID);
        let section = await this.SectionModel.getSection(desk.SectionID);
    
        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>" + 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 voteHandler = this;
        let votes = await this.VoteModel.getVotes();
        votes = votes.filter((vote) => {
          return vote.DeskRoundID == voteHandler.DeskRoundID;
        });
        let candidateLists = await this.CandidateListModel.getCandidateLists();
        candidateLists = candidateLists.filter((candidateList) => {
    
    Alexis POYEN's avatar
    Alexis POYEN committed
          return (
            candidateList.AreaID == voteHandler.AreaID &&
            candidateList.RoundID == voteHandler.RoundID
          );
    
        });
    
        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>
        `;
    
        votes.forEach((vote) => {
          if (vote.Blank) {
            document.getElementById("blank-vote-voice").value = vote.VoiceNumber;
          } else if (vote.NullVote) {
            document.getElementById("null-vote-voice").value = vote.VoiceNumber;
          } else {
            document.getElementById(vote.CandidateListID + "-vote-voice").value =
              vote.VoiceNumber;
          }
        });
      }
    
    Alexis POYEN's avatar
    Alexis POYEN committed
    
      async saveVotes() {
        let voteHandler = this;
        let candidateLists = await this.CandidateListModel.getCandidateLists();
        candidateLists = candidateLists.filter((candidateList) => {
          return (
            candidateList.AreaID == voteHandler.AreaID &&
            candidateList.RoundID == voteHandler.RoundID
          );
        });
    
        let votes = await this.VoteModel.getVotes();
        votes = votes.filter((vote) => {
          return vote.DeskRoundID == voteHandler.DeskRoundID;
        });
    
        let method;
        if (votes.length == 0) method = "POST";
        else method = "PUT";
    
        candidateLists.forEach((candidateList) => {
          voteHandler.VoteModel.saveVote(
            method,
            voteHandler.DeskRoundID,
            candidateList.ID,
            parseInt(
              document.getElementById(candidateList.ID + "-vote-voice").value
            ),
            false,
            false
          );
        });
    
        this.VoteModel.saveVote(
          method,
          this.DeskRoundID,
          null,
          parseInt(document.getElementById("blank-vote-voice").value),
          true,
          false
        );
        this.VoteModel.saveVote(
          method,
          this.DeskRoundID,
          null,
          parseInt(document.getElementById("null-vote-voice").value),
          false,
          true
        );
      }