From 44d460c3d669457601fd77d4dca599d20f401f88 Mon Sep 17 00:00:00 2001 From: Alexis POYEN <apoyen@grandlyon.com> Date: Tue, 4 Aug 2020 11:24:07 +0200 Subject: [PATCH] Resolve "User Doc" --- data/test.db | Bin 73728 -> 73728 bytes web/components/help/help.js | 112 +++++++++++ web/components/help/management-help.js | 188 +++++++++++++++++++ web/components/help/results-help.js | 65 +++++++ web/components/help/user-help.js | 63 +++++++ web/components/help/vote-help.js | 46 +++++ web/components/home/home.js | 20 -- web/components/management/candidate-lists.js | 2 +- web/components/navbar/navbar.js | 6 +- web/components/visualization/results-zone.js | 2 +- web/main.js | 14 +- web/style.css | 5 + 12 files changed, 491 insertions(+), 32 deletions(-) create mode 100644 web/components/help/help.js create mode 100644 web/components/help/management-help.js create mode 100644 web/components/help/results-help.js create mode 100644 web/components/help/user-help.js create mode 100644 web/components/help/vote-help.js delete mode 100644 web/components/home/home.js diff --git a/data/test.db b/data/test.db index 2f2f142d93f55b5661c089395d795c6bd40d1d10..c72faf72e932c1aa982825c4d8c93b11503077dc 100644 GIT binary patch literal 73728 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 Y7!V8y1_T3w0l|P^KrkQ}_{}l!zY6rQ5dZ)H delta 1105 zcmYjPU1%It6rMXjJAXTKle*1@Zo;OtP*crz{&zO0i3FvDG~038h_+TjGQs$>TXr_W z3dyDlh4dwE4`w0BCR8c-Vj*3z4<bYZf<+0wh~z>1p)Vq&ArHkD@y;Yl8HSnjecw6f zyXV~bO?G~h{qWckYL%j>BZn^{-=6x@hDOlL&^Jm<quLNq_@uh0t}FNBJMshRZ;2N6 zh0|;ocY>ecGYIHUP)EIfgJxp&dbKshG+Bw1`6ro7q7N>@Rc60M3(c5x?Io5^rqk&C z04~$_TWjhY$2&cQ_wXP1XWYVH<0bqtUcer%;&)o@Jt@rMDXO#nd;+|I&NiNulrWQQ zf45Ze14D!AKo??QY2frQCvr>@Px`@IflXADES5_%#mPWqm?Ro6`{Mx}r<t_qzwJ*{ zrc1>@K};G?j9;zHl>Ks`D<lWu1qv^awlyryAf74|DBFhD^1U#T?}neQB;Z~?5f7C# zK1<=-_$<*rgXK%K7;426NP*8@?}Z<><zCIr=&s{hj%DjlX-2=MjZ{m;o*}<jDf{dz z=pZ9aG9F!tGBTQ((X?#VGz>laSjK3nJjsPUIdu@>PjOy-q^_xht@gHzDqrSA$}3Rl z6s5pou^_+9Ms-n&#QVijd5k&e6UJWYoIG~uG>q?*&c&&*(1=Hg-2~8!k&!c@5#2CN z(={IRq5I_n7j}5^VRctsQf-A*SmNYioJKb{>U{|8ISXE#>xS!dsvwMqc03P$o9%<Y zX1gRd8iC{Uo3J})-K=#>OoUiI{|gM)EVx7<I)V(Jy9l=l^aX(;g!GTecjr-CN_jv@ z@&!u1fN$UgnZ=VzRZ-)&;*R_s@#4zy07=n4#DXBgUNZrem7|dVR%|?nQB26`Imfiz zT;rOGQt;)<5X>%O_;W>t>#N6jZd#N=&)X|0Xf8hyam{6gaOcB+-Z328(M_nW9_N{9 z{(tS6W-Zb#H={ZNS=dl`C*ViYdvvXnkg{TEnF@E{O(?)_vk%U1@v7Tzh7-4S)6H5s zY-}BEcl$Lflhwk@V`vuH0xYlP;HxdM@vDe9(KWJ;Z5xIiiX#Zv^%o+3QAQkZ>bhpT zCJb&R8zBJi9kPQe;snQW9bL=jz}xO<ga|xbPe_cqL*aG&thz&n_`TZNxpT^kky9kZ kk&k%PEAhYo_YgjavBIm!-l&_1MsIG^r_j9-5q;kAFTd6;4gdfE diff --git a/web/components/help/help.js b/web/components/help/help.js new file mode 100644 index 0000000..96c1112 --- /dev/null +++ b/web/components/help/help.js @@ -0,0 +1,112 @@ +// Imports +import * as Results from "/components/help/results-help.js"; +import * as Vote from "/components/help/vote-help.js"; +import * as Management from "/components/help/management-help.js"; +import * as User from "/components/help/user-help.js"; + +// DOM elements + +export async function mount(where) { + const helperPage = new Helper(); + await helperPage.mount(where); +} + +class Helper { + constructor() {} + + async mount(where) { + const mountpoint = where; + document.getElementById(mountpoint).innerHTML = /* HTML */ ` + <div class="tabs is-boxed is-toggle is-fullwidth"> + <ul> + <li id="results-helper" class="is-active"> + <a> + <span class="icon is-small" + ><i class="fas fa-poll" aria-hidden="true"></i + ></span> + <span>Résultats</span> + </a> + </li> + <li id="votes-helper"> + <a> + <span class="icon is-small" + ><i class="fas fa-vote-yea" aria-hidden="true"></i + ></span> + <span>Votes</span> + </a> + </li> + <li id="management-helper"> + <a> + <span class="icon is-small" + ><i class="fas fas fa-edit" aria-hidden="true"></i + ></span> + <span>Gestion</span> + </a> + </li> + <li id="user-helper"> + <a> + <span class="icon is-small" + ><i class="fas fas fa-users" aria-hidden="true"></i + ></span> + <span>Utilisateurs</span> + </a> + </li> + </ul> + </div> + <section id="help-section" class="container" style="margin-bottom: 230px;"></section> + `; + + this.handleDOM(); + await Results.mount("help-section"); + + } + handleDOM() { + document + .getElementById("results-helper") + .addEventListener("click", async function () { + await Results.mount("help-section"); + document.getElementById("votes-helper").setAttribute("class", ""); + document.getElementById("management-helper").setAttribute("class", ""); + document.getElementById("user-helper").setAttribute("class", ""); + document + .getElementById("results-helper") + .setAttribute("class", "is-active"); + }); + + document + .getElementById("votes-helper") + .addEventListener("click", async function () { + await Vote.mount("help-section"); + document.getElementById("results-helper").setAttribute("class", ""); + document.getElementById("management-helper").setAttribute("class", ""); + document.getElementById("user-helper").setAttribute("class", ""); + document + .getElementById("votes-helper") + .setAttribute("class", "is-active"); + }); + + document + .getElementById("management-helper") + .addEventListener("click", async function () { + await Management.mount("help-section"); + document.getElementById("results-helper").setAttribute("class", ""); + document.getElementById("votes-helper").setAttribute("class", ""); + document.getElementById("user-helper").setAttribute("class", ""); + document + .getElementById("management-helper") + .setAttribute("class", "is-active"); + }); + + document + .getElementById("user-helper") + .addEventListener("click", async function () { + await User.mount("help-section"); + document.getElementById("results-helper").setAttribute("class", ""); + document.getElementById("votes-helper").setAttribute("class", ""); + document.getElementById("management-helper").setAttribute("class", ""); + document + .getElementById("user-helper") + .setAttribute("class", "is-active"); + }); + } +} diff --git a/web/components/help/management-help.js b/web/components/help/management-help.js new file mode 100644 index 0000000..22cdcd7 --- /dev/null +++ b/web/components/help/management-help.js @@ -0,0 +1,188 @@ +export async function mount(where) { + const managementHelperComponent = new ManagementHelper(); + await managementHelperComponent.mount(where); +} + +class ManagementHelper { + constructor() {} + + async mount(where) { + const mountpoint = where; + document.getElementById(mountpoint).innerHTML = /* HTML */ ` + <div class="card-no-hover helper"> + <h2 class="title is-2">Aide pour la gestion d'une élection</h2> + + <h5 class="title is-5">Onglet Partis politiques</h5> + + L'onglet "Partis Politiques" permet de créer des tendances poltiques qui + se retrouvent sur plusieurs circonscriptions.<br /> + Pour ajuter un parti il suffit de cliquer sur + <span class="icon is-small"> + <i class="fas fa-plus"></i> + </span> + Un fenêtre s'ouvre et permet de saisir le nom du parti (ou de la + tendance politique) et de choisir la couleur qui sera associé à ce parti + dans l'affichage des résultats. Pour modifier un parti, il suffit de + cliquer sur + <span class="icon is-small"> + <i class="fas fa-pen"></i> + </span> + et pour en supprimer un sur + <span class="icon is-small"> <i class="fas fa-times"></i> </span>. La + suppression affichera l'ensemble des listes qui sont rattachées à ce + parti sur toutes les élections et demandera de confirmer l'action de + suppression car toutes ces listes seront alors supprimées.<br /><br /> + + <h5 class="title is-5">Onglet Élection</h5> + L'onglet élection permet de créer le découpage territorial d'une + élection. Il est possible de naviguer dans l'abrorescence de l'élection + en cliquant sur les différentes zones la composant<br /><br /> + + <article class="message is-warning"> + <div class="message-header"> + <p>Attention</p> + </div> + <div class="message-body"> + Il est necessaire pour que l'application fonctionne corrctement que + chaque élection ai au moins une circonscription composée elle même + d'au moins une ville avec au minimum un bureau. + </div> + </article> + + <strong>Élection</strong> + Pour créer une nouvelle élection cliquer sur + <span class="icon is-small"> <i class="fas fa-plus"></i> </span>, une + fenêtre s'ouvre alors, il faut saisir le nom de cette élection, choisir + le système de vote qui sera appliqué (pour calculer les résultats), + selectionner la carte pour les cirocnscriptions et celle pour les + villes. En cliquant sur "Sauvegarder" l'élection sera ajoutée et en + cliquant sur "Sauvegarder (ajouter circonscription)" elle sera + sauvegardée et la fenêtre pour y attacher une circonscription sera + ouverte.<br /><br /> + + <strong>Circonscription</strong> + Une circonscription peut être ajoutée à l'élection selectionnée en + cliquant sur + <span class="icon is-small"><i class="fas fa-plus"></i></span> . Il faut + alors saisir son nom, le nombre de siège à pourvoir et l'identifiant qui + lui correspond sur la carte des circonscriptions. <br />En cliquant sur + "Sauvegarder" la circonscription sera ajoutée et en cliquant sur + "Sauvegarder (ajouter circonscription)" elle sera ajoutée et la fenêtre + pour ajouter une nouvelle circonscription à l'élection sera ouverte. En + cliquant sur "Sauvegarder (ajouter ville)" elle sera ajoutée et la + fenêtre pour ajouter une ville à la circonscription sera ouverte.<br /><br /> + + <strong>Ville</strong> + Une ville peut être ajoutée à une circonscription selectionnée en + cliquant sur + <span class="icon is-small"><i class="fas fa-plus"></i></span> . Il faut + alors saisir son nom et l'identifiant qui lui correspond sur la carte + des villes. <br />En cliquant sur "Sauvegarder" la ville sera ajoutée et + en cliquant sur "Sauvegarder (ajouter ville)" elle sera ajoutée et la + fenêtre pour ajouter une nouvelle ville à la circonscription sera + ouverte. En cliquant sur "Sauvegarder (ajouter bureau)" elle sera + ajoutée et la fenêtre pour ajouter un bureau à la ville sera ouverte.<br /><br /> + + <strong>Bureau</strong> + Un bureau peut être ajoutée à une ville selectionnée en cliquant sur + <span class="icon is-small"><i class="fas fa-plus"></i></span> . Il faut + alors saisir son nom et le nombre d'inscrit dans ce bureau. + <article class="message is-warning"> + <div class="message-header"> + <p>Attention</p> + <button class="delete" aria-label="delete"></button> + </div> + <div class="message-body"> + Le nombre d'inscrit est obligatoire car il permet de calculer le + taux d'abstention et le pourcentage de saisie en cours qui est + pondéré par le nombre d'inscrits par bureau. + </div> + </article> + En cliquant sur "Sauvegarder" le bureau sera ajouté et en cliquant sur + "Sauvegarder (ajouter bureau)" il sera ajouté et la fenêtre pour ajouter + un nouveau bureau à la ville sera ouverte.<br /><br /> + + <strong>Cloner une élection</strong> + Il est possible de cloner une élection et son arborescence en cliquant + sur + <span class="icon is-small"> + <i class="fas fa-clone"></i> + </span> + dans la liste des élections.<br /><br /> + + <h5 class="title is-5">Onglet Tour</h5> + Une élection est composée de un ou plusieurs tours, il faut donc + configuré ces tours pour utiliser l'application.<br /><br /> + + Dans l'onglet "Tour" il est possible de créer un tour pour une élection + en cliquant sur + <span class="icon is-small"><i class="fas fa-plus"></i></span>. Il faut + alors sélectionner l'élection à laquelle on crée un tour, la date du + tour et le numéro du tour. Il est possible de modifier les informations + en cliquant sur + <span class="icon is-small"><i class="fas fa-pen"></i></span> et de le + supprimer en cliquant sur + <span class="icon is-small"><i class="fas fa-times"></i></span + ><br /><br /> + + En cliquant sur un tour, on rentre dans la configuration du tour. La + bouton sur la gauche permet de revenir à l'écran précédent. Il y a deux + sections qui peuvent être ouvertes l'une après l'autre, il faut cliquer + sur la barre de titre de l'une des deux sections pour en changer.<br /><br /> + + <strong>Section "Bureaux de Votes"</strong><br /> + La liste de tous les bureaux de votes de l'éelection s'affiche ici. En + cliquant sur un bureau les détails de ce bureau s'affiche. Il est + possible de consulter les votes et de les modifier comme dans l'onglet + "Votes". Il est possible de "Valider" un bureau, les votes de ce bureau + ne pourront alors plus être modifié.<br /><br /> + + Pour ajouter un utilisateur à la liste des saisseurs, cliquer sur + l'icône + <span class="icon is-small"> + <i class="fas fa-user"></i> + </span> + pour ouvrir la liste des saisisseurs de ce burea, il suffit ensuite de + cliquer sur l'utilisateur dans la colonne de droite "Saisisseurs + disponibles", il va alors basculer dans la colonne de gauche + "Saisisseurs actifs". Pour le supprimer il suffit de faire de même dans + la colonne de gauche "Saisisseurs actifs", il va alors basculer dans la + colonne de droite "Saisisseurs disponibles".<br /><br /> + + <strong>Section "Liste des candidats par circonscription"</strong> + La liste des circonscription du tour est affichée, en cliquant sur une + circonscription, la liste des listes de candidats de la circonscription + s'affiche. Il est possible d'en créer une en cliquant sur + <span class="icon is-small"> <i class="fas fa-plus"></i>. </span>Une + fenêtre s'ouvre alors pour saisir le nom de la liste et le parti auquel + elle est attachée. En cliquant sur + <span class="icon is-small"> + <i class="fas fa-download"></i> + </span> + Une fenêtre s'ouvre et permet d'importer une liste directement depuis un + tour précédent pour éviter de resaisir toutes les informations de la + listes.<br /><br /> + + En cliquant sur une liste, les canddiats s'affichent, il est possible + d'ajouter et de modifier des candidats en éditant les champs dans le + tableau et en cliquant sur + <span class="icon is-small"> + <i class="fas fa-check"></i> + </span> + pour chaque ligne éditée afin qu'elles soient prises en compte.<br /> + Le rang ordonne les candidats lors du calcul des élus, la date de + naissance permet de départager des listes et des candidats lors du + calcul des élus en cas d'égalité, la case incompatibilité potentielle + permet d'identifier les élus qui pourraient poser problème s'ils sont + élus (autre mandat en cours, fonctionnaire...). La case refusé permet + d'éliminer du calcul des élus des candidats qui se sont porter sur une + liste mais qui finalement ne souhaient pas siéger. La case supprimer + permet d'éliminer du calcul des élus les candidats qui seraient décédé + entre la date de cloture de dépôt des listes et l'élection. (La case + "Conseiller communautaire" n'est pas fonctionelle mais permettrai + d'identifier les élus qui vont siéger au conseil communautaire lors + d'élection municipale) + </div> + `; + } +} diff --git a/web/components/help/results-help.js b/web/components/help/results-help.js new file mode 100644 index 0000000..17a1ac3 --- /dev/null +++ b/web/components/help/results-help.js @@ -0,0 +1,65 @@ +export async function mount(where) { + const resultsHelperComponent = new ResultsHelper(); + await resultsHelperComponent.mount(where); +} + +class ResultsHelper { + constructor() {} + + async mount(where) { + const mountpoint = where; + document.getElementById(mountpoint).innerHTML = /* HTML */ ` + <div class="card-no-hover helper"> + <h2 class="title is-2">Aide pour les résultats</h2> + + Le menu "Résultats" permet de voir les résultats d'un tour d'une + élection. Il faut donc sélectionner le tour de l'élection que l'on + souhaite consulter.<br /> + + Il est possible de filtrer les résultats pour ne prendre en compte que + les zones qui sont complétées, que celles qui ont étaient validée avec + les résultats de la préfecture ou alors en prenant en compte les zones + avec des résultats partiels.<br /><br /> + + <h5 class="title is-5">Onglet Général</h5> + + L'onglet général permet de voir les résultats pour l'ensemble du + tour.<br /> + À venir : la partie statistiques permet de comparer les résultats avec + d'autres élections afin de suivre la tendande dans le temps.<br /><br /> + + <h5 class="title is-5">Onglet circonscriptions ou villes</h5> + Les onglets "Circonscription" et "Villes" fonctionnent de la même façon + mais avec le zonage appropié.<br /> + + L'écran est découpé en trois composants : la carte (à gauche), le flux + d'actualité (en haut à droite) et les résultats détaillés (en bas à + droite).<br />Chaque zone peut être aggrandie en appuyant sur + <span class="icon is-small"> + <i class="fa fa-expand-arrows-alt"></i> </span + >. Pour diminuer la taille de la zone et revenir à l'état initial il + suffit de cliquer sur + <span class="icon is-small"> + <i class="fa fa-compress-arrows-alt"></i> </span + ><br /><br /> + Le flux d'actualité défile de manière automatique, il est possible de + désactiver ce défilement en décochant la case "Défilement automatique". + Lorsque la souris se trouve au dessus de la zone du flux, le défilement + s'arrête. Il est possible d'ouvrir les résultats détaillés d'une zone en + cliquant dessus dans le flux, les détails s'affichent alors dans la + partie "Résultats détaillés" <br /><br /> + La partie résultat détaillés permet de voir les résultats d'une zone en + particulier en selectionnant la circonscription (et la ville dans l'onglet "Villes"). En cliquant sur + <span class="icon is-small"> + <i class="fa fa-expand-arrows-alt"></i> + </span> + il est possible de voir des statistiques sur la zone comme + l'abstention, le nombre de votes blanc et nuls. Avec le filtre "partiel" + le pourcentage de saisie de la zone s'affiche également afin de savoir + si les résultats donnés sont proche d'être complets ou non.<br /> + Dans l'onglet "Circonscription" lorsque les résultats d'une + circonscription sont tous saisis la liste des élus s'affiche. + </div> + `; + } +} diff --git a/web/components/help/user-help.js b/web/components/help/user-help.js new file mode 100644 index 0000000..7ee8b46 --- /dev/null +++ b/web/components/help/user-help.js @@ -0,0 +1,63 @@ +export async function mount(where) { + const userHelperComponent = new UserHelper(); + await userHelperComponent.mount(where); +} + +class UserHelper { + constructor() {} + + async mount(where) { + const mountpoint = where; + document.getElementById(mountpoint).innerHTML = /* HTML */ ` + <div class="card-no-hover helper"> + <h2 class="title is-2">Aide pour la gestion des utilisateurs</h2> + + Les utilisateurs peuvent soient provenir de la base locale de + l'application soit être provisionnés par un fournisseur d'identité. La + différence se fait sur la présence du champ IdOAuth qui n'est renseigné + que pour les utilisateurs provisonnés depuis le fournisseur d'identité + raccordé à l'application.<br /><br /> + + <h5 class="title is-5">Ajout d'un utilisateur</h5> + + Pour ajouter un utilisateur il faut cliquer sur le bouton + <span class="icon is-small"> + <i class="fas fa-plus"></i> + </span> + en dessous du tabeau avec la liste des utilisateurs. Il faut au minimum + renseigner un identifiant et un rôle pour l'utilisateur. Le mot de + passe, qui est également obligatoire, est généré de manière aléatoire et + peut être modifié. <br /><br /> + + <h5 class="title is-5">Modification d'un utilisateur</h5> + + Pour modifier un utilisateur il faut cliquer sur le bouton "modifier" + dans la colonne action des utilisateurs. La même modale que pour la + création s'ouvre. Enlever le rôle de saisisseur à un utilisateur + enlèvera toutes ses affectations sur les bureaux qui seront + définitivement perdus.<br /> + + Lors de la modification d'un utilisateur le champ mot de passe est vide, + s'il est laissé vide le mot de passe ne sera pas modifié, autrement il + sera modifié par la valeur du champ.<br /><br /> + + <h5 class="title is-5">Affectation des saisisseurs sur les bureaux</h5> + + Pour affecter des utilisateurs à un bureau il faut se rendre dans le + menu "Gestion" puis dans l'onglet "Tour", sélectionner un tour, puis + dans la liste des bureaux de votes cliquer sur l'icône + <span class="icon is-small"> + <i class="fas fa-user"></i> + </span> + pour ouvrir la liste des saisisseurs de ce bureau.<br /> + + Pour ajouter un utilisateur à la liste des saisseurs il suffit de + cliquer sur l'utilisateur dans la colonne de droite "Saisisseurs + disponibles", il va alors basculer dans la colonne de gauche + "Saisisseurs actifs". Pour le supprimer il suffit de faire de même dans + la colonne de gauche "Saisisseurs actifs", il va alors basculer dans la + colonne de droite "Saisisseurs disponibles". + </div> + `; + } +} diff --git a/web/components/help/vote-help.js b/web/components/help/vote-help.js new file mode 100644 index 0000000..756f6f9 --- /dev/null +++ b/web/components/help/vote-help.js @@ -0,0 +1,46 @@ +export async function mount(where) { + const voteHelperComponent = new VoteHelper(); + await voteHelperComponent.mount(where); +} + +class VoteHelper { + constructor() {} + + async mount(where) { + const mountpoint = where; + document.getElementById(mountpoint).innerHTML = /* HTML */ ` + <div class="card-no-hover helper"> + <h2 class="title is-2">Aide pour la saisie des votes</h2> + <h5 class="title is-5">Sélection d'un bureau</h5> + Lors de l'ouverture du menu "Votes", il est necessaire de choisir le + bureau de vote qui sera saisi. Il faut commencer par choisir une + élection puis un tour par exemple "Métropolitaine 2020") et tour 1 pour + saisir les résultats du premier tour des élections métropolitaines + 2020.<br /> + À partir de ce moment tous les bureaux du premier tour des élections + métropolitaines 2020 apparaissent dans la partie droite de l'écran. Il + est possible de filtrer plus en profondeur les bureaux en sélectionnant + une Circonscription puis une Ville.<br /> + Il faut ensuite cliquer sur un des bureaux de la liste pour saisir les + résultats de ce bureau. <br /><br /> + <h5 class="title is-5">Saisie des votes</h5> + Il est possible de vérifier que l'on saisi les résultats pour le bon + bureau en vérifiant en haut de la page le fil d'ariane qui indique le + bureau selectionné dans son arborescence.<br /> + Chaque ligne du tableau correspond à une liste de la circonscription, + les deux dernières lignes correspondent aux votes blanc et nuls. Il faut + alors sasir le nombre de voix dans chaque ligne du tableau.<br /> + En bas du tableau, la somme des suffrages et la somme des suffrages + exprimées (sans les votes blanc et nuls) permet de vérifier la saisie en + accord avec le PV de vote après sauvegarde des résultats. <br /> + Pour sauvegarder les résultats il faut cliquer sur le bouton "Sauvegarder".<br /> + Le bouton "Supprimer" permet de supprimer les résultats saisis pour ce + bureau.<br /> + Le bouton "Annuler" permet d'annuler les modifications apportées mais + qui n'ont pas était sauvegardées et revient donc à l'état initial.<br /> + Le bouton "Retour" permet de revenir à la page de sélection des + bureaux.<br /> + </div> + `; + } +} diff --git a/web/components/home/home.js b/web/components/home/home.js deleted file mode 100644 index 7c04186..0000000 --- a/web/components/home/home.js +++ /dev/null @@ -1,20 +0,0 @@ -// Imports - -// DOM elements -let mountpoint; - -// local variables - -export async function mount(where) { - mountpoint = where; - document.getElementById(mountpoint).innerHTML = /* HTML */ ` - <section class="section"> - <div class="container"> - <h1 class="title">Accueil</h1> - <h2 class="subtitle"> - Cette application permet de gérer, saisir et voir les résultats d'une élection. - </h2> - </div> - </section> - `; -} diff --git a/web/components/management/candidate-lists.js b/web/components/management/candidate-lists.js index 1f77a2d..2cc80e6 100644 --- a/web/components/management/candidate-lists.js +++ b/web/components/management/candidate-lists.js @@ -176,7 +176,7 @@ class CandidateList { <div class="control select"> <select name="party" - id="candclone-cardidateList-modal-party" + id="candidateList-modal-party" ></select> </div> </div> diff --git a/web/components/navbar/navbar.js b/web/components/navbar/navbar.js index f0e19ae..991b6cb 100644 --- a/web/components/navbar/navbar.js +++ b/web/components/navbar/navbar.js @@ -59,9 +59,6 @@ export async function CreateMenu() { user === undefined ? `` : /* HTML */ ` - <a class="navbar-item" href="#home" - ><i class="navbar-menu-icon fas fa-home"></i>Accueil</a - > <a class="navbar-item" href="#visualization" ><i class="navbar-menu-icon fas fa-poll"></i>Résultats</a > @@ -85,6 +82,9 @@ export async function CreateMenu() { > ` : ""} + <a class="navbar-item" href="#help" + ><i class="navbar-menu-icon fas fa-question-circle"></i>Aide</a + > ` } </div> diff --git a/web/components/visualization/results-zone.js b/web/components/visualization/results-zone.js index d52f471..1279afa 100644 --- a/web/components/visualization/results-zone.js +++ b/web/components/visualization/results-zone.js @@ -68,7 +68,7 @@ class ResultZoneComponent { <div id="results-section" class="card-no-hover" "> <header class="card-header"> <p class="card-header-title"> - Résultats + Résultats détaillés </p> <button id="zoom-results" class="button is-success"> <span class="icon is-small"> diff --git a/web/main.js b/web/main.js index 6cb579d..1ad9ed9 100644 --- a/web/main.js +++ b/web/main.js @@ -1,10 +1,10 @@ -import * as Home from "/components/home/home.js"; import * as Users from "/components/users/users.js"; import * as Management from "/components/management/management.js"; import * as Votes from "/components/vote/vote-page.js"; import * as Visualization from "/components/visualization/visualization-page.js"; import * as Login from "/components/login/login.js"; import * as Navbar from "/components/navbar/navbar.js"; +import * as Helper from "/components/help/help.js"; import { AnimateCSS } from "/services/common/common.js"; const mountPoint = document.getElementById("main"); @@ -19,11 +19,6 @@ document.addEventListener("DOMContentLoaded", function () { async function navigate() { window.clearInterval(window.intervalRefreshResults); switch (location.hash) { - case "#home": - load(mountPoint, async function () { - await Home.mount("main"); - }); - break; case "#votes": load(mountPoint, async function () { await Votes.mount("main"); @@ -49,8 +44,13 @@ async function navigate() { await Login.mount("main"); }); break; + case "#help": + load(mountPoint, async function () { + await Helper.mount("main"); + }); + break; default: - location.hash = "#home"; + location.hash = "#visualization"; break; } } diff --git a/web/style.css b/web/style.css index 59436c8..56fdee4 100644 --- a/web/style.css +++ b/web/style.css @@ -227,3 +227,8 @@ select { #map-component { height: 100%; } + +.helper { + text-align: justify; + padding: 2em; +} -- GitLab