Skip to content
Snippets Groups Projects
election.js 14.7 KiB
Newer Older
  • Learn to ignore specific revisions
  • // Imports
    import * as Auth from "/services/auth/auth.js";
    
    import * as Common from "/services/common/common.js";
    
    Alexis POYEN's avatar
    Alexis POYEN committed
    import * as Getters from "/services/common/getters.js";
    
    import * as Messages from "/services/messages/messages.js";
    import { Delete } from "/services/common/delete.js";
    
    
    // DOM elements
    
    // local variables
    let current_user;
    
    
    export async function mount(where, parent) {
      const electionComponent = new Election(parent);
      await electionComponent.mount(where);
      return electionComponent;
    
    }
    
    class Election {
    
      constructor(parent) {
        this.method = null;
        this.parent = parent;
      }
    
    
      async mount(where) {
        const mountpoint = where;
        document.getElementById(mountpoint).innerHTML = /* HTML */ `
    
          <header class="card-header">
            <p class="card-header-title">
              Elections
            </p>
            <button id="election-new" class="button is-success">
              <span class="icon is-small">
                <i class="fas fa-plus"></i>
              </span>
            </button>
          </header>
          <div class="card-content">
            <div id="election-list" class="content">Liste des élections</div>
          </div>
    
        `;
        current_user = await Auth.GetUser();
    
        this.mountModal("election-modal");
    
        this.mountCloneModal("election-clone-modal");
    
        this.handleDom();
        this.displayElections();
      }
    
      handleDom() {
        let electionHandler = this;
        document
          .getElementById(`election-new`)
          .addEventListener("click", function () {
            electionHandler.newElection();
          });
    
        document
          .getElementById(`election-modal-close`)
          .addEventListener("click", function () {
            Common.toggleModal("election-modal", "election-modal-card");
          });
        document
          .getElementById(`election-modal-cancel`)
          .addEventListener("click", function () {
            Common.toggleModal("election-modal", "election-modal-card");
          });
        document
          .getElementById(`election-modal-save`)
          .addEventListener("click", async function () {
            await electionHandler.saveElection();
          });
    
        document
          .getElementById(`election-clone-modal-close`)
          .addEventListener("click", function () {
            Common.toggleModal("election-clone-modal", "election-clone-modal-card");
          });
        document
          .getElementById(`election-clone-modal-cancel`)
          .addEventListener("click", function () {
            Common.toggleModal("election-clone-modal", "election-clone-modal-card");
          });
        document
          .getElementById(`election-clone-modal-save`)
          .addEventListener("click", async function () {
            electionHandler.saveCloneElection();
          });
    
        document
          .getElementById(`election-modal-save-area`)
          .addEventListener("click", async function () {
            let election = await electionHandler.saveElection();
            electionHandler.parent.areaHandler.newArea(election);
          });
      }
    
      mountModal(where) {
        const mountpoint = where;
        document.getElementById(mountpoint).innerHTML = /* HTML */ `
          <div class="modal-background"></div>
          <div class="modal-card" id="election-modal-card">
            <header class="modal-card-head">
              <p class="modal-card-title">Ajout/modification d'une élection</p>
              <button
                class="delete"
                aria-label="close"
                id="election-modal-close"
              ></button>
            </header>
            <section class="modal-card-body">
              <div class="field">
                <label>Id</label>
                <div class="control">
                  <input
                    class="input"
                    type="number"
                    id="election-modal-id"
                    disabled
                  />
                </div>
              </div>
              <div class="field">
                <label>Nom</label>
                <div class="control">
                  <input class="input" type="text" id="election-modal-name" />
                </div>
              </div>
              <div class="field">
                <label>Système de vote</label><br />
                <div class="control select">
                  <select name="ballot-type" id="election-modal-ballot-type">
                    <option value="local-counsil-direct"
                      >Conseil communautaire au suffrage direct</option
                    >
                    <option value="local-counsil-indirect"
                      >Conseil communautaire au suffrage indirect</option
                    >
                  </select>
                </div>
              </div>
            </section>
            <footer class="modal-card-foot">
              <button id="election-modal-save" class="button is-success">
                Sauvegarder
              </button>
              <button id="election-modal-save-area" class="button is-success">
                Sauvegarder (ajouter circonscription)
              </button>
              <button id="election-modal-cancel" class="button">Annuler</button>
            </footer>
          </div>
        `;
      }
    
    
      mountCloneModal(where) {
        const mountpoint = where;
        document.getElementById(mountpoint).innerHTML = /* HTML */ `
          <div class="modal-background"></div>
          <div class="modal-card" id="election-clone-modal-card">
            <header class="modal-card-head">
              <p class="modal-card-title">Cloner une élection</p>
              <button
                class="delete"
                aria-label="close"
                id="election-clone-modal-close"
              ></button>
            </header>
            <section class="modal-card-body">
              <div class="field">
                <label>Id</label>
                <div class="control">
                  <input
                    class="input"
                    type="number"
                    id="election-modal-id-clone"
                    disabled
                  />
                </div>
              </div>
              <div class="field">
                <label>Nom</label>
                <div class="control">
                  <input class="input" type="text" id="election-modal-name-clone" />
                </div>
              </div>
              <div class="field">
                <label>Système de vote</label><br />
                <div class="control select">
                  <select name="ballot-type" id="election-modal-ballot-type-clone">
                    <option value="local-counsil-direct"
                      >Conseil communautaire au suffrage direct</option
                    >
                    <option value="local-counsil-indirect"
                      >Conseil communautaire au suffrage indirect</option
                    >
                  </select>
                </div>
              </div>
            </section>
            <footer class="modal-card-foot">
              <button id="election-clone-modal-save" class="button is-success">
                Dupliquer
              </button>
              <button id="election-clone-modal-cancel" class="button">
                Annuler
              </button>
            </footer>
          </div>
        `;
      }
    
    
      async displayElections() {
    
    Alexis POYEN's avatar
    Alexis POYEN committed
        let elections = await Getters.getElections(current_user);
    
        const markup = elections
          .map((election) => this.electionTemplate(election))
          .join("");
        document.getElementById("election-list").innerHTML = markup;
    
        let electionHandler = this;
        elections.map((election) => {
          document
            .getElementById(`elections-election-edit-${election.ID}`)
            .addEventListener("click", function () {
              electionHandler.editElection(election);
            });
    
          document
            .getElementById(`elections-election-clone-${election.ID}`)
            .addEventListener("click", function () {
              electionHandler.cloneElection(election);
            });
    
          document
            .getElementById(`elections-election-delete-${election.ID}`)
            .addEventListener("click", function () {
              new Delete(() => {
                electionHandler.deleteElection(election);
              });
            });
          document
            .getElementById(`elections-election-${election.ID}`)
            .addEventListener("click", function () {
              electionHandler.activateElection(election);
              electionHandler.parent.areaHandler.election = election;
              electionHandler.parent.areaHandler.displayAreas();
              document.getElementById("desk-new").setAttribute("disabled", "true");
              document
                .getElementById("section-new")
                .setAttribute("disabled", "true");
              document.getElementById("area-new").setAttribute("disabled", "true");
            });
        });
      }
    
      electionTemplate(election) {
        return /* HTML */ `<div class="card card-list">
          <div id="elections-election-${election.ID}" class="card-content">
            <div class="content">
              <nav class="level">
                <div class="level-left">
                  ${election.Name} (${election.BallotType})
                </div>
                <div class="level-right">
                  <a
                    id="elections-election-edit-${election.ID}"
                    class="button is-link is-small"
                    title="Modifier"
                  >
                    <span class="icon is-small">
                      <i class="fas fa-pen"></i>
                    </span>
                  </a>
    
                  <a
                    id="elections-election-clone-${election.ID}"
                    class="button is-link is-small"
                    title="Dupliquer"
                  >
                    <span class="icon is-small">
                      <i class="fas fa-clone"></i>
                    </span>
                  </a>
    
                  <a
                    id="elections-election-delete-${election.ID}"
                    class="button is-danger is-small"
                    title="Supprimer"
                  >
                    <span class="icon is-small">
                      <i class="fas fa-times"></i>
                    </span>
                  </a>
                </div>
              </nav>
            </div>
          </div>
        </div>`;
      }
    
    
      async activateElection(electionToActivate) {
    
        this.parent.areaHandler.emptyAreas();
        this.parent.sectionHandler.emptySections();
        this.parent.deskHandler.emptyDesks();
    
    Alexis POYEN's avatar
    Alexis POYEN committed
        let elections = await Getters.getElections(current_user);
    
        elections.forEach((election) => {
          document
            .getElementById(`elections-election-${election.ID}`)
            .classList.remove("active-card");
        });
        document
    
          .getElementById(`elections-election-${electionToActivate.ID}`)
    
          .classList.add("active-card");
      }
    
      newElection() {
        this.method = "POST";
        document.getElementById("election-modal-id").value = null;
        document.getElementById("election-modal-name").value = null;
        document.getElementById("election-modal-ballot-type").value = null;
        Common.toggleModal("election-modal", "election-modal-card");
      }
    
      editElection(election) {
        this.method = "PUT";
        document.getElementById("election-modal-id").value = election.ID;
        document.getElementById("election-modal-name").value = election.Name;
        document.getElementById("election-modal-ballot-type").value =
          election.BallotType;
        Common.toggleModal("election-modal", "election-modal-card");
      }
    
      async saveElection() {
        let election;
        if (this.method == "POST")
          document.getElementById("election-modal-id").value = null;
    
        try {
          const response = await fetch(
            "/api/Election/" + document.getElementById("election-modal-id").value,
            {
              method: this.method,
              headers: new Headers({
                "XSRF-Token": current_user.xsrftoken,
              }),
              body: JSON.stringify({
                ID: parseInt(document.getElementById("election-modal-id").value),
                Name: document.getElementById("election-modal-name").value,
                BallotType: document.getElementById("election-modal-ballot-type")
                  .value,
              }),
            }
          );
    
          if (response.status == 409) {
            throw new Error(
              `The name of the election already exist (status ${response.status})`
            );
          }
    
          if (response.status !== 200) {
            throw new Error(
              `Election could not be updated or created (status ${response.status})`
            );
          }
          election = await response.json();
          this.displayElections();
        } catch (e) {
          Messages.Show("is-warning", e.message);
          console.error(e);
    
        }
        Common.toggleModal("election-modal", "election-modal-card");
        this.activateElection(election);
        this.parent.areaHandler.election = election;
        this.parent.areaHandler.displayAreas();
        return election;
      }
    
      async deleteElection(election) {
        try {
          const response = await fetch("/api/Election/" + election.ID, {
            method: "delete",
            headers: new Headers({
              "XSRF-Token": current_user.xsrftoken,
            }),
          });
          if (response.status !== 200) {
            throw new Error(
              `Election could not be deleted (status ${response.status})`
            );
          }
        } catch (e) {
          Messages.Show("is-warning", e.message);
          console.error(e);
        }
        this.displayElections();
        this.parent.areaHandler.emptyAreas();
        this.parent.sectionHandler.emptySections();
        this.parent.deskHandler.emptyDesks();
        document.getElementById("desk-new").setAttribute("disabled", "true");
        document.getElementById("section-new").setAttribute("disabled", "true");
        document.getElementById("area-new").setAttribute("disabled", "true");
    
    
      cloneElection(election) {
        Common.toggleModal("election-clone-modal", "election-clone-modal-card");
        document.getElementById("election-modal-id-clone").value = election.ID;
        document.getElementById("election-modal-name-clone").value =
          election.Name + " (New)";
        document.getElementById("election-modal-ballot-type-clone").value =
          election.BallotType;
      }
    
      async saveCloneElection() {
        let electionCloned;
    
    Alexis POYEN's avatar
    Alexis POYEN committed
        let electionToClone = await getters.getElection(
          current_user,
    
          document.getElementById("election-modal-id-clone").value
        );
    
        try {
          const response = await fetch("/api/Election/", {
            method: "POST",
            headers: new Headers({
              "XSRF-Token": current_user.xsrftoken,
            }),
            body: JSON.stringify({
              ID: null,
              Name: document.getElementById("election-modal-name-clone").value,
              BallotType: document.getElementById(
                "election-modal-ballot-type-clone"
              ).value,
            }),
          });
          if (response.status == 409) {
            throw new Error(
              `The name of the election already exist (status ${response.status})`
            );
          }
          if (response.status !== 200) {
            throw new Error(
              `Election could not be cloned (status ${response.status})`
            );
          }
          electionCloned = await response.json();
        } catch (e) {
          Messages.Show("is-warning", e.message);
          console.error(e);
          return;
        }
        await this.parent.areaHandler.cloneAreas(electionCloned, electionToClone);
        Common.toggleModal("election-clone-modal", "election-clone-modal-card");
        await this.displayElections();
        await this.activateElection(electionCloned);
        this.parent.areaHandler.election = electionCloned;
        await this.parent.areaHandler.displayAreas();
      }