// Imports import * as Auth from "/services/auth/auth.js"; import * as Common from "/services/common/common.js"; import * as ElectionModel from "/services/model/election-model.js"; import { Delete } from "/services/common/delete.js"; 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; this.ElectionModel = ElectionModel.getElectionModel(); } async mount(where) { this.ElectionModel.current_user = await Auth.GetUser(); 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> `; 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() { let elections = await this.ElectionModel.getElections(); 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(); let elections = await this.ElectionModel.getElections(); 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; election = await this.ElectionModel.saveElection( this.method, parseInt(document.getElementById("election-modal-id").value), document.getElementById("election-modal-name").value, document.getElementById("election-modal-ballot-type").value ); await this.displayElections(); Common.toggleModal("election-modal", "election-modal-card"); this.activateElection(election); this.parent.areaHandler.election = election; this.parent.areaHandler.displayAreas(); return election; } async deleteElection(election) { await this.ElectionModel.deleteElection(election.ID); 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; let electionToClone = await this.ElectionModel.getElection( document.getElementById("election-modal-id-clone").value ); electionCloned = await this.ElectionModel.saveElection( "POST", null, document.getElementById("election-modal-name-clone").value, document.getElementById("election-modal-ballot-type-clone").value ); 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(); } }