Browse Source

Merge pull request #46 from MieuxVoter/feature/static-pages

Add static pages
master
guhur 2 years ago
committed by GitHub
parent
commit
8fc2ff444d
  1. BIN
      public/app-mieux-voter.png
  2. BIN
      public/background-mv.jpg
  3. 106
      public/index.html
  4. 20
      public/locale/i18n/de/resource.json
  5. 18
      public/locale/i18n/en/resource.json
  6. 18
      public/locale/i18n/es/resource.json
  7. 61
      public/locale/i18n/fr/resource.json
  8. 18
      public/locale/i18n/ru/resource.json
  9. BIN
      public/video/Le_Jugement_Majoritaire_en_1_minute.3gpp
  10. BIN
      public/video/Le_Jugement_Majoritaire_en_1_minute.mp4
  11. BIN
      public/video/Le_Jugement_Majoritaire_en_1_minute.webm
  12. 7
      src/Routes.jsx
  13. 17
      src/components/CopyField.jsx
  14. 29
      src/components/banner/Facebook.jsx
  15. 22
      src/components/banner/Gform.jsx
  16. 131
      src/components/layouts/Footer.jsx
  17. 25
      src/components/layouts/footer.css
  18. 20
      src/components/layouts/useBbox.jsx
  19. 208
      src/components/views/CreateElection.jsx
  20. 111
      src/components/views/CreateSuccess.jsx
  21. 280
      src/components/views/Faq.jsx
  22. 69
      src/components/views/LegalNotices.jsx
  23. 113
      src/components/views/PrivacyPolicy.jsx
  24. 30
      src/components/views/Result.jsx
  25. 4
      src/components/views/Vote.jsx
  26. 13
      src/components/views/VoteSuccess.jsx
  27. 20
      src/scss/_app.scss

BIN
public/app-mieux-voter.png

After

Width: 1080  |  Height: 1080  |  Size: 19 KiB

BIN
public/background-mv.jpg

Before

Width: 4000  |  Height: 2667  |  Size: 145 KiB

106
public/index.html

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8" />
<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico" />
<link rel="manifest" href="/manifest.json">
<link rel="manifest" href="/manifest.json" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!--
Notice the use of %PUBLIC_URL% in the tags above.
@ -14,23 +14,93 @@
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<link rel="apple-touch-icon" sizes="57x57" href="%PUBLIC_URL%/favicon/apple-icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="%PUBLIC_URL%/favicon/apple-icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="%PUBLIC_URL%/favicon/apple-icon-72x72.png">
<link rel="apple-touch-icon" sizes="76x76" href="%PUBLIC_URL%/favicon/apple-icon-76x76.png">
<link rel="apple-touch-icon" sizes="114x114" href="%PUBLIC_URL%/favicon/apple-icon-114x114.png">
<link rel="apple-touch-icon" sizes="120x120" href="%PUBLIC_URL%/favicon/apple-icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="%PUBLIC_URL%/favicon/apple-icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="%PUBLIC_URL%/favicon/apple-icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="%PUBLIC_URL%/favicon/apple-icon-180x180.png">
<link rel="icon" type="image/png" sizes="192x192" href="%PUBLIC_URL%/favicon/android-icon-192x192.png">
<link rel="icon" type="image/png" sizes="32x32" href="%PUBLIC_URL%/favicon/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="96x96" href="%PUBLIC_URL%/favicon/favicon-96x96.png">
<link rel="icon" type="image/png" sizes="16x16" href="%PUBLIC_URL%/favicon/favicon-16x16.png">
<meta name="msapplication-TileColor" content="#ffffff">
<meta name="msapplication-TileImage" content="%PUBLIC_URL%/favicon/ms-icon-144x144.png">
<meta name="theme-color" content="#ffffff">
<title>Plateforme de vote : Jugement Majoritaire</title>
<link
rel="apple-touch-icon"
sizes="57x57"
href="%PUBLIC_URL%/favicon/apple-icon-57x57.png"
/>
<link
rel="apple-touch-icon"
sizes="60x60"
href="%PUBLIC_URL%/favicon/apple-icon-60x60.png"
/>
<link
rel="apple-touch-icon"
sizes="72x72"
href="%PUBLIC_URL%/favicon/apple-icon-72x72.png"
/>
<link
rel="apple-touch-icon"
sizes="76x76"
href="%PUBLIC_URL%/favicon/apple-icon-76x76.png"
/>
<link
rel="apple-touch-icon"
sizes="114x114"
href="%PUBLIC_URL%/favicon/apple-icon-114x114.png"
/>
<link
rel="apple-touch-icon"
sizes="120x120"
href="%PUBLIC_URL%/favicon/apple-icon-120x120.png"
/>
<link
rel="apple-touch-icon"
sizes="144x144"
href="%PUBLIC_URL%/favicon/apple-icon-144x144.png"
/>
<link
rel="apple-touch-icon"
sizes="152x152"
href="%PUBLIC_URL%/favicon/apple-icon-152x152.png"
/>
<link
rel="apple-touch-icon"
sizes="180x180"
href="%PUBLIC_URL%/favicon/apple-icon-180x180.png"
/>
<link
rel="icon"
type="image/png"
sizes="192x192"
href="%PUBLIC_URL%/favicon/android-icon-192x192.png"
/>
<link
rel="icon"
type="image/png"
sizes="32x32"
href="%PUBLIC_URL%/favicon/favicon-32x32.png"
/>
<link
rel="icon"
type="image/png"
sizes="96x96"
href="%PUBLIC_URL%/favicon/favicon-96x96.png"
/>
<link
rel="icon"
type="image/png"
sizes="16x16"
href="%PUBLIC_URL%/favicon/favicon-16x16.png"
/>
<meta name="msapplication-TileColor" content="#ffffff" />
<meta
name="msapplication-TileImage"
content="%PUBLIC_URL%/favicon/ms-icon-144x144.png"
/>
<meta name="theme-color" content="#ffffff" />
<title>Application Jugement Majoritaire</title>
<meta property="og:url" content="https://app.mieuxvoter.fr" />
<meta property="og:type" content="website" />
<meta property="og:title" content="Application Jugement Majoritaire" />
<meta
property="og:description"
content="Simple et gratuit : organisez un vote avec le Jugement Majoritaire."
/>
<meta
property="og:image"
content="https://app.mieuxvoter.fr/app-mieux-voter.png"
/>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>

20
public/locale/i18n/de/resource.json

@ -2,6 +2,10 @@
"Homepage": "Homepage",
"Source code": "Quellcode",
"Who are we?": "Wer wir sind?",
"Privacy policy": "Datenschutzerklärung",
"Legal notices": "Rechtliche Hinweise",
"FAQ": "FAQ",
"Need help?": "Brauchen Sie Hilfe?",
"BetterVote": " BetterVote",
"Voting platform": "Wahlplattform",
"Majority Judgment": " Mehrheitswahl ",
@ -18,10 +22,13 @@
"For example:": "Zum Beispiel",
"For the role of my representative, I judge this candidate...": "Meine Einschätzung des Kandidaten als meinen Repräsentanten ist …",
"Candidates/Proposals": "Kandidaten/Abstimmungsvorschlag ",
"Add a proposal": "Einen Abstimmungsvorschlag hinzufügen",
"Add a proposal": "Weiteren hinzufügen",
"Advanced options": "Weitere Optionen",
"Starting date": "Anfangsdatum",
"Ending date": "Enddatum",
"Defined period" : "Definierte Periode",
"Unlimited" : "Unbegrenzt",
"Voting time" : "Abstimmungszeit",
"Grades": "Note",
"You can select here the number of grades for your election": " Sie können hier die Anzahl der Noten für Ihre Wahl auswählen ",
"5 = Excellent, Very good, Good, Fair, Passable": "5 = hervorragend, sehr gut, gut, befriedigend, ausreichend",
@ -29,6 +36,7 @@
"Add here participants' emails": "Fügen Sie hier die Email Adressen der Teilnehmer hinzu.",
"List voters' emails in case the election is not opened": "Falls die Wahl noch nicht sofort geöffnet werden soll, fügen Sie die Email Adressen der Teilnehmer hier zu.",
"Validate": "Ok",
"Submit my vote": "Ok",
"Confirm your vote": "Bestätigen Sie Ihre Wahl",
"The form contains no address.": "Keine Email Adresse wurde hinzugefügt.",
"The election will be opened to anyone with the link": "Die Wahl ist offen afür jeden, der diesen Link hat.",
@ -77,7 +85,15 @@
"Access to results" : "Zugang zu den Ergebnissen",
"Immediately": "Sofort",
"At the end of the election": "Am Ende der Wahl",
"Results available at the close of the vote": "Ergebnisse am Ende der Abstimmung verfügbar",
"The results page will not be accessible until all participants have voted.":"Die Ergebnisseite wird nicht zugänglich sein, bis alle Teilnehmer abgestimmt haben.",
"The results page will not be accessible until the end date is reached.": "Die Ergebnisseite wird nicht zugänglich sein, bis das Enddatum erreicht ist.",
"No one will be able to see the result until the end date is reached or until all participants have voted.": "Niemand wird das Ergebnis sehen können, bis das Enddatum erreicht ist oder bis alle Teilnehmer abgestimmt haben."
"No one will be able to see the result until the end date is reached or until all participants have voted.": "Niemand wird das Ergebnis sehen können, bis das Enddatum erreicht ist oder bis alle Teilnehmer abgestimmt haben.",
"Send me this link" : "Senden Sie mir diesen Link",
"Send me these links" : "Schicken Sie mir diesen Link",
"Open" : "Öffnen Sie",
"Voting address" : "Abstimmungs-URL",
"Results address" : "Ergebnis-URL",
"Share election on Facebook" : "Wahl auf Facebook teilen",
"Share results on Facebook" : "Ergebnisse auf Facebook teilen"
}

18
public/locale/i18n/en/resource.json

@ -2,6 +2,10 @@
"Homepage": "Homepage",
"Source code": "Source code",
"Who are we?": "Who are we?",
"Privacy policy": "Privacy policy",
"Legal notices": "Legal notices",
"FAQ": "FAQ",
"Need help?": "Need help?",
"BetterVote": "BetterVote",
"Voting platform": "Voting platform",
"Majority Judgment": "Majority Judgment",
@ -22,6 +26,9 @@
"Advanced options": "Advanced options",
"Starting date": "Starting date",
"Ending date": "Ending date",
"Defined period" : "Defined period",
"Unlimited" : "Unlimited",
"Voting time" : "Voting time",
"Grades": "Grades",
"You can select here the number of grades for your election": "You can select here the number of grades for your election",
"5 = Excellent, Very good, Good, Fair, Passable": "5 = Excellent, Very good, Good, Fair, Passable",
@ -29,6 +36,7 @@
"Add here participants' emails": "Add here participants' emails",
"List voters' emails in case the election is not opened": "List voters' emails in case the election is not opened",
"Validate": "Validate",
"Submit my vote": "Submit my vote",
"Confirm your vote": "Confirm your vote",
"The form contains no address.": "The form contains no address.",
"The election will be opened to anyone with the link": "The election will be opened to anyone with the link",
@ -84,7 +92,15 @@
"Access to results" : "Access to results",
"Immediately": "Immediately",
"At the end of the election": "At the end of the election",
"Results available at the close of the vote": "Results available at the close of the vote",
"The results page will not be accessible until all participants have voted.":"The results page will not be accessible until all participants have voted.",
"The results page will not be accessible until the end date is reached.": "The results page will not be accessible until the end date is reached.",
"No one will be able to see the result until the end date is reached or until all participants have voted.": "No one will be able to see the result until the end date is reached or until all participants have voted."
"No one will be able to see the result until the end date is reached or until all participants have voted.": "No one will be able to see the result until the end date is reached or until all participants have voted.",
"Send me this link" : "Send me this link",
"Send me these links" : "Send me these links",
"Open" : "Open",
"Voting address" : "Voting address",
"Results address" : "Results address",
"Share election on Facebook" : "Share election on Facebook",
"Share results on Facebook" : "Share results on Facebook"
}

18
public/locale/i18n/es/resource.json

@ -2,6 +2,10 @@
"Homepage": "Página de inicio",
"Source code": "Código fuente",
"Who are we": "Quiénes somos",
"Privacy policy": "Política de privacidad",
"Legal notices": "Avisos legales",
"FAQ": "FAQ",
"Need help?": "¿Necesitas ayuda?",
"BetterVote": "VotarMejor",
"Voting platform": "Plataforma de votación",
"Majority Judgment": "Juicio Mayoritario",
@ -22,6 +26,9 @@
"Advanced options": "Opciones avanzadas",
"Starting date": "Fecha de inicio",
"Ending date": "Fecha de finalización",
"Defined period" : "Período definido",
"Unlimited" : "Ilimitado",
"Voting time" : "Hora de la votación",
"Grades": "Escala",
"You can select here the number of grades for your election": "Puede seleccionar aquí el número de niveles de la escala para su elección",
"5 = Excellent, Very good, Good, Fair, Passable": "5 == Excelente, Muy bien, Bien, Regular, Pasable",
@ -29,6 +36,7 @@
"Add here participants' emails": "Añadir aquí los correos electrónicos de los(as) participantes",
"List voters' emails in case the election is not opened": "Enumere los correos electrónicos de los(as) votantes en caso de que la elección no se abra",
"Validate": "Validar",
"Submit my vote": "Validar",
"Confirm your vote": "Confirme su voto",
"The form contains no address.": "El formulario no contiene ningún correo electrónico",
"The election will be opened to anyone with the link": "La elección se abrirá a cualquiera que tenga el enlace",
@ -85,7 +93,15 @@
"Access to results" : "Acceso a los resultados",
"Immediately": "Inmediatamente",
"At the end of the election": "Al final de la elección",
"Results available at the close of the vote": "Resultados disponibles al cierre de la votación",
"The results page will not be accessible until all participants have voted.":"La página de resultados no será accesible hasta que todos los participantes hayan votado.",
"The results page will not be accessible until the end date is reached.": "No se podrá acceder a la página de resultados hasta que se alcance la fecha de finalización.",
"No one will be able to see the result until the end date is reached or until all participants have voted.": "Nadie podrá ver el resultado hasta que se alcance la fecha final o hasta que todos los participantes hayan votado."
"No one will be able to see the result until the end date is reached or until all participants have voted.": "Nadie podrá ver el resultado hasta que se alcance la fecha final o hasta que todos los participantes hayan votado.",
"Send me this link" : "Envíame este enlace",
"Send me these links" : "Envíame estos enlaces",
"Open" : "Abrir",
"Voting address" : "URL de la votación",
"Results address" : "URL de los resultados",
"Share election on Facebook" : "Compartir la elección en Facebook",
"Share results on Facebook" : "Comparte los resultados en Facebook"
}

61
public/locale/i18n/fr/resource.json

@ -2,19 +2,23 @@
"Homepage": "Accueil",
"Source code": "Code source",
"Who are we?": "Qui sommes-nous ?",
"Privacy policy": "Politique de confidentialité",
"Legal notices": "Mentions légales",
"FAQ": "FAQ",
"Need help?": "Besoin d'aide ?",
"BetterVote": "MieuxVoter",
"Voting platform": "Plateforme de vote",
"Majority Judgment": "Jugement Majoritaire",
"Start an election": "Lancer une élection",
"Start an election": "Lancer un vote",
"Candidate/proposal name...": "Nom du candidat/proposition",
"Delete?": "Supprimer ?",
"Are you sure to delete": "Êtes-vous sûr(e) de supprimer",
"the row": "la ligne",
"Write here your question or introduce simple your election (250 characters max.)": "Décrire ici votre question ou introduire simplement votre élection (250 caractères max.)",
"Write here your question or introduce simple your election (250 characters max.)": "Décrire ici votre question ou introduire simplement votre vote (250 caractères max.)",
"Enter the name of your candidate or proposal here (250 characters max.)": "Saisissez ici le nom de votre candidat ou de votre proposition (250 caractères max.)",
"Please add at least 2 candidates.": "Merci d'ajouter au moins 2 candidats.",
"Question of the election": "Question de votre élection",
"Write here the question of your election": "Ecrire ici la question de votre élection",
"Question of the election": "Question de votre vote",
"Write here the question of your election": "Ecrire ici la question de votre vote",
"For example:": "Par exemple",
"For the role of my representative, I judge this candidate...": "Pour être mon représentant, je juge ce candidat...",
"Candidates/Proposals": "Candidats/Propositions",
@ -22,31 +26,35 @@
"Advanced options": "Options avancées",
"Starting date": "Date de début",
"Ending date": "Date de fin ",
"Defined period" : "Période définie",
"Unlimited" : "Illimitée",
"Voting time" : "Durée du vote",
"Grades": "Mentions",
"You can select here the number of grades for your election": "You pouvez choisir ici le nombre de mentions de votre élection",
"You can select here the number of grades for your election": "You pouvez choisir ici le nombre de mentions de votre vote",
"5 = Excellent, Very good, Good, Fair, Passable": "5 = Excellent, Très bien, Bien, Assez bien, Passable",
"Participants": "Participants",
"Add here participants' emails": "Ajouter ici les emails des participants",
"List voters' emails in case the election is not opened": "Lister ici les emails des électeurs dans le cas où l'élection n'est pas ouverte.",
"List voters' emails in case the election is not opened": "Lister ici les emails des électeurs dans le cas où le vote n'est pas ouverte.",
"Validate": "Valider",
"Submit my vote": "Enregistrer mon vote",
"Confirm your vote": "Confirmer votre vote",
"The form contains no address.": "Aucune adresse email n'a été ajoutée.",
"The election will be opened to anyone with the link": "L'élection sera accessible à tous ceux qui disposent du lien",
"Start the election": "Démarrer l'élection",
"The election will be opened to anyone with the link": "Le vote sera accessible à tous ceux qui disposent du lien",
"Start the election": "Démarrer le vote",
"Cancel": "Annuler",
"Confirm": "Valider",
"Successful election creation!": "L'élection a été créée avec succès !",
"Successful election creation!": "Le vote a été créé avec succès !",
"You can now share the election link to participants:": "Vous pouvez maintenant partager ce lien à tous les participants",
"Copy": "Copier",
"Here is the link for the results in real time:": "Voici le lien pour afficher les résultats en temps réel :",
"Keep these links carefully": "Gardez ces liens précieusement",
"Participate now!": "Participez maintenant !",
"t": "<0>Attention</0> : vous n'aurez pas d'autres moyens pour récupérer ces liens par la suite, et nous ne serons pas capables de les partager avec vous. Vous pouvez, par exemple, ajouter ces liens à vos favoris dans votre navigateur.",
"Simple and free: organize an election with Majority Judgment.": "Simple et gratuit : organiser une élection avec le Jugement Majoritaire",
"Simple and free: organize an election with Majority Judgment.": "Simple et gratuit : organisez un vote avec le Jugement Majoritaire",
"Start": "Démarrer",
"No advertising or ad cookies": "Pas de publicités, ni de cookies publicitaires",
"Oops! This election does not exist or it is not available anymore.": "Oups ! L'élection n'existe pas ou n'est plus disponible.",
"You can start another election.": "Vous pouvez démarrer une autre élection.",
"Oops! This election does not exist or it is not available anymore.": "Oups ! Le vote n'existe pas ou n'est plus disponible.",
"You can start another election.": "Vous pouvez démarrer une autre vote.",
"Go back to homepage": "Revenir à la page d'accueil",
"You have to judge every candidate/proposal!": "Vous devez évaluer tous les candidats/propositions !",
"Your participation was recorded with success!": "Votre participation a été enregistrée avec succès !",
@ -65,25 +73,34 @@
"Voters' list": "Listes des électeurs",
"Graph": "Graphique",
"Preference profile": "Profil de mérites",
"Results of the election:": "Résultats de l'élection",
"Results of the election:": "Résultats du vote",
"Unknown error. Try again please.": "Erreur inconnue. Merci de ré-essayer plus tard.",
"If you list voters' emails, only them will be able to access the election": "Si vous ajoutez des emails, seulement ceux-là seront capables d'accéder à l'élection",
"If you list voters' emails, only them will be able to access the election": "Si vous ajoutez des emails, seulement ceux-là seront capables d'accéder à le vote",
"Voters received a link to vote by email. Each link can be used only once!": "Les électeurs ont reçu un lien par courriel pour voter. Chaque lien ne peut être utilisé qu'une seule fois.",
"Oops... The election is unknown.": "Oups... Le serveur ne retrouve pas l'élection.",
"The election is still going on. You can't access now to the results.": "L'élection est encore en cours. Vous ne pouvez pas encore accéder aux résultats.",
"Oops... The election is unknown.": "Oups... Le serveur ne retrouve pas le vote.",
"The election is still going on. You can't access now to the results.": "le vote est encore en cours. Vous ne pouvez pas encore accéder aux résultats.",
"No votes have been recorded yet. Come back later.": "Aucun vote n'a été enregistré. Merci de revenir plus tard.",
"The election has not started yet.": "L'élection n'a pas encore commencé.",
"The election is over. You can't vote anymore": "L'élection est terminée. Vous ne pouvez plus voter.",
"You need a token to vote in this election": "Vous avez besoin d'un jeton pour voter dans cette élection",
"The election has not started yet.": "le vote n'a pas encore commencé.",
"The election is over. You can't vote anymore": "le vote est terminée. Vous ne pouvez plus voter.",
"You need a token to vote in this election": "Vous avez besoin d'un jeton pour participer à ce vote",
"You seem to have already voted.": "Il semble que vous ayez déjà voté.",
"The parameters of the election are incorrect.": "Les paramètres de l'élection sont incorrects.",
"The parameters of the election are incorrect.": "Les paramètres de le vote sont incorrects.",
"Support us !": "Soutenez-nous !",
"PayPal - The safer, easier way to pay online!": "PayPal - Le moyen le plus sûr et le plus simple de payer en ligne !",
"Number of votes:": "Nombre de votes :",
"Access to results" : "Accès aux résultats",
"Immediately": "Immédiatement",
"At the end of the election": "A la fin de l'élection",
"At the end of the election": "A la clôture du vote",
"Results available at the close of the vote": "Résultats disponibles à la clôture du vote",
"The results page will not be accessible until all participants have voted.":"La page de résultats ne sera pas accessible tant que tous les participants n'auront pas voté.",
"The results page will not be accessible until the end date is reached.": "La page de résultats ne sera pas accessible tant que la date de fin ne sera pas atteinte.",
"No one will be able to see the result until the end date is reached or until all participants have voted.": "Personne ne pourra voir le résultat tant que la date de fin n'est pas atteinte ou que tous les participants n'ont pas voté."
"No one will be able to see the result until the end date is reached or until all participants have voted.": "Personne ne pourra voir le résultat tant que la date de fin n'est pas atteinte ou que tous les participants n'ont pas voté.",
"Send me this link" : "Envoyez-moi ce lien",
"Send me these links" : "Envoyez-moi ces liens",
"Open" : "Ouvrir",
"Voting address" : "Adresse du vote",
"Results address" : "Adresse des résultats",
"Share election on Facebook" : "Partager le vote sur Facebook",
"Share results on Facebook" : "Partager ces résultats sur Facebook"
}

18
public/locale/i18n/ru/resource.json

@ -2,6 +2,10 @@
"Homepage": "Главная страница",
"Source code": "Исходный код",
"Who are we?": "Кто мы?",
"Privacy policy": "Политика конфиденциальности",
"Legal notices": "Официальные уведомления",
"FAQ": "Часто задаваемые вопросы",
"Need help?": "Нужна помощь?",
"BetterVote": "BetterVote",
"Voting platform": "Платформа голосования",
"Majority Judgment": "Решение Большинства",
@ -22,6 +26,9 @@
"Advanced options": "Расширенные настройки",
"Starting date": "Дата начала",
"Ending date": "Дата окончания",
"Defined period" : "Определенный период",
"Unlimited" : "Безлимитный",
"Voting time" : "Время голосования",
"Grades": "Оценки",
"You can select here the number of grades for your election": "Здесь вы можете выбрать количество оценок для вашего голосования",
"5 = Excellent, Very good, Good, Fair, Passable": "5 = Отлично, Очень хорошо, Хорошо, Удовлетворительно, Допустимо",
@ -29,6 +36,7 @@
"Add here participants' emails": "Добавьте электронную почту участников",
"List voters' emails in case the election is not opened": "Укажите электронные адреса голосующих на случай, если голосование не откроется",
"Validate": "Подтвердить",
"Submit my vote": "Подтвердить",
"Confirm your vote": "Подтвердите свой голос",
"The form contains no address.": "Адрес не указан.",
"The election will be opened to anyone with the link": "Голосование будет доступно любому, у кого есть ссылка",
@ -84,7 +92,15 @@
"Access to results" : "Доступ к результатам",
"Immediately": "Немедленно",
"At the end of the election": "По окончании выборов",
"Results available at the close of the vote": "Результаты, доступные по окончании голосования",
"The results page will not be accessible until all participants have voted.":"Страница результатов не будет доступна до тех пор, пока все участники не проголосуют.",
"The results page will not be accessible until the end date is reached.": "Страница результатов не будет доступна до тех пор, пока не будет достигнута конечная дата.",
"No one will be able to see the result until the end date is reached or until all participants have voted.": "Никто не сможет увидеть результат до тех пор, пока не будет достигнут конечный срок или пока все участники не проголосуют."
"No one will be able to see the result until the end date is reached or until all participants have voted.": "Никто не сможет увидеть результат до тех пор, пока не будет достигнут конечный срок или пока все участники не проголосуют.",
"Send me this link" : "Пришлите мне эту ссылку",
"Send me these links" : "Пришлите мне эти ссылки",
"Open" : "Открыть",
"Voting address" : "URL-адрес для голосования",
"Results address" : "URL-адрес результатов",
"Share election on Facebook" : "Поделиться выборами на Facebook",
"Share results on Facebook" : "Поделиться результатами на Facebook"
}

BIN
public/video/Le_Jugement_Majoritaire_en_1_minute.3gpp

BIN
public/video/Le_Jugement_Majoritaire_en_1_minute.mp4

BIN
public/video/Le_Jugement_Majoritaire_en_1_minute.webm

7
src/Routes.jsx

@ -9,6 +9,10 @@ import UnknownView from "./components/views/UnknownView";
import UnknownElection from "./components/views/UnknownElection";
import CreateSuccess from "./components/views/CreateSuccess";
import VoteSuccess from "./components/views/VoteSuccess";
import LegalNotices from "./components/views/LegalNotices";
import PrivacyPolicy from "./components/views/PrivacyPolicy";
import Faq from "./components/views/Faq";
function Routes() {
return (
@ -32,6 +36,9 @@ function Routes() {
/>
<Route path="/vote-success/:slug" component={VoteSuccess} />
<Route path="/unknown-election/:slug" component={UnknownElection} />
<Route path="/legal-notices" component={LegalNotices} />
<Route path="/privacy-policy" component={PrivacyPolicy} />
<Route path="/faq" component={Faq} />
<Route component={UnknownView} />
</Switch>
</main>

17
src/components/CopyField.jsx

@ -16,7 +16,7 @@ const CopyField = props => {
document.execCommand("copy");
};
const { t, value, icon } = props;
const { t, value, iconCopy } = props;
return (
<div className="input-group ">
@ -31,14 +31,25 @@ const CopyField = props => {
<div className="input-group-append">
<Button
className="btn btn-outline-light"
className="btn btn-secondary"
onClick={handleClickOnButton}
type="button"
>
<FontAwesomeIcon icon={icon} className="mr-2" />
<FontAwesomeIcon icon={iconCopy} className="mr-2" />
{t("Copy")}
</Button>
</div>
{/*<div className="input-group-append">
<a
className="btn btn-secondary"
href={value}
target="_blank"
rel="noopener noreferrer"
>
<FontAwesomeIcon icon={iconOpen} className="mr-2" />
{t("Open")}
</a>
</div>*/}
</div>
);
};

29
src/components/banner/Facebook.jsx

@ -0,0 +1,29 @@
/* eslint react/prop-types: 0 */
import React from "react";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faFacebookSquare } from "@fortawesome/free-brands-svg-icons";
const Facebook = props => {
const handleClick = () => {
const url =
"https://www.facebook.com/sharer.php?u=" +
props.url +
"&t=" +
props.title;
window.open(
url,
"",
"menubar=no,toolbar=no,resizable=yes,scrollbars=yes,height=500,width=700"
);
};
return (
<button className={props.className} onClick={handleClick} type="button">
<FontAwesomeIcon icon={faFacebookSquare} className="mr-2" />
{props.text}
</button>
);
};
export default Facebook;
//i

22
src/components/banner/Gform.jsx

@ -0,0 +1,22 @@
/* eslint react/prop-types: 0 */
import React from "react";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faGoogleDrive } from "@fortawesome/free-brands-svg-icons";
const Gform = props => {
return (
<a
className={props.className}
href="https://docs.google.com/forms/d/1Y5ocQscSkHFZdniR7Lvc9mbkJYe9ZIC4w0tOvC4rDZo/viewform?edit_requested=true"
target="_blank"
rel="noopener noreferrer"
>
<FontAwesomeIcon icon={faGoogleDrive} className="mr-2" />
Votre avis nous intéresse !
</a>
);
};
export default Gform;
//https://docs.google.com/forms/d/1Y5ocQscSkHFZdniR7Lvc9mbkJYe9ZIC4w0tOvC4rDZo/viewform?edit_requested=true

131
src/components/layouts/Footer.jsx

@ -1,48 +1,97 @@
/* eslint react/prop-types: 0 */
import React, { Component } from "react";
import React from "react";
import { withTranslation } from "react-i18next";
import { Link } from "react-router-dom";
import Paypal from "../banner/Paypal";
import { useBbox } from "./useBbox";
import "./footer.css";
class Footer extends Component {
constructor(props) {
super(props);
this.state = {};
}
const Footer = props => {
const linkStyle = { whiteSpace: "nowrap" };
const { t } = props;
render() {
const linkStyle = { whiteSpace: "nowrap" };
const { t } = this.props;
return (
<footer className="text-center">
<div>
<Link to="/" style={linkStyle}>
{t("Homepage")}
</Link>
<span className="m-2">-</span>
<a
href="https://github.com/MieuxVoter"
target="_blank"
rel="noopener noreferrer"
style={linkStyle}
>
{t("Source code")}
</a>
<span className="m-2">-</span>
<a
href="https://mieuxvoter.fr/"
target="_blank"
rel="noopener noreferrer"
style={linkStyle}
>
{t("Who are we?")}
</a>
</div>
<div className="mt-3">
<Paypal btnColor="btn-primary" />
</div>
</footer>
);
}
}
const [bboxLink1, link1] = useBbox();
const [bboxLink2, link2] = useBbox();
const [bboxLink3, link3] = useBbox();
const [bboxLink4, link4] = useBbox();
const [bboxLink5, link5] = useBbox();
const [bboxLink6, link6] = useBbox();
const [bboxLink7, link7] = useBbox();
return (
<footer className="text-center">
<div>
<ul className="tacky">
<li
ref={link1}
className={bboxLink1.top === bboxLink2.top ? "" : "no-tack"}
>
<Link to="/" style={linkStyle}>
{t("Homepage")}
</Link>
</li>
<li
ref={link2}
className={bboxLink2.top === bboxLink3.top ? "" : "no-tack"}
>
<Link to="/faq" style={linkStyle}>
{t("FAQ")}
</Link>
</li>
<li
ref={link3}
className={bboxLink3.top === bboxLink4.top ? "" : "no-tack"}
>
<a href="mailto:app@mieuxvoter.fr?subject=[HELP]" style={linkStyle}>
{t("Need help?")}
</a>
</li>
<li
ref={link4}
className={bboxLink4.top === bboxLink5.top ? "" : "no-tack"}
>
<a
href="https://mieuxvoter.fr/"
target="_blank"
rel="noopener noreferrer"
style={linkStyle}
>
{t("Who are we?")}
</a>
</li>
<li
ref={link5}
className={bboxLink5.top === bboxLink6.top ? "" : "no-tack"}
>
<Link to="/privacy-policy" style={linkStyle}>
{t("Privacy policy")}
</Link>
</li>
<li
ref={link6}
className={bboxLink6.top === bboxLink7.top ? "" : "no-tack"}
>
<Link to="/legal-notices" style={linkStyle}>
{t("Legal notices")}
</Link>
</li>
<li ref={link7}>
{" "}
<a
href="https://github.com/MieuxVoter"
target="_blank"
rel="noopener noreferrer"
style={linkStyle}
>
{t("Source code")}
</a>
</li>
</ul>
</div>
<div className="mt-3">
<Paypal btnColor="btn-primary" />
</div>
</footer>
);
};
export default withTranslation()(Footer);

25
src/components/layouts/footer.css

@ -0,0 +1,25 @@
.tacky {
margin: 0;
padding: 0;
list-style-type: none;
}
.tacky li {
display: inline-block;
}
.tacky li:after {
content: "-";
margin: 0 5px;
}
.tacky li:last-of-type:after {
content: "";
margin: 0;
}
.tacky li.no-tack:after {
content: "";
margin: 0;
display: none;
}

20
src/components/layouts/useBbox.jsx

@ -0,0 +1,20 @@
/* eslint react/prop-types: 0 */
import { useState } from 'react';
import { useRef } from 'react';
import { useEffect } from 'react';
export const useBbox = () => {
const ref = useRef();
const [bbox, setBbox] = useState({});
const set = () =>
setBbox(ref && ref.current ? ref.current.getBoundingClientRect() : {});
useEffect(() => {
set();
window.addEventListener('resize', set);
return () => window.removeEventListener('resize', set);
}, []);
return [bbox, ref];
};

208
src/components/views/CreateElection.jsx

@ -185,6 +185,7 @@ class CreateElection extends Component {
redirectTo: null,
isAdvancedOptionsOpen: false,
restrictResult: false,
isTimeLimited: false,
start,
// by default, the election ends in a week
finish: new Date(start.getTime() + 7 * 24 * 3600 * 1000),
@ -194,12 +195,17 @@ class CreateElection extends Component {
this.focusInput = React.createRef();
this.handleSubmit = this.handleSubmit.bind(this);
this.handleRestrictResultCheck = this.handleRestrictResultCheck.bind(this);
this.handleIsTimeLimited = this.handleIsTimeLimited.bind(this);
}
handleChangeTitle = event => {
this.setState({ title: event.target.value });
};
handleIsTimeLimited = event => {
this.setState({ isTimeLimited: event.target.value === "1" });
};
handleRestrictResultCheck = event => {
this.setState({ restrictResult: event.target.value === "1" });
};
@ -288,9 +294,12 @@ class CreateElection extends Component {
candidates,
title,
numGrades,
electorEmails
} = this.state;
let {
start,
finish,
electorEmails
} = this.state;
const endpoint = resolve(
@ -298,6 +307,14 @@ class CreateElection extends Component {
this.context.routesServer.setElection
);
if(!this.state.isTimeLimited){
let now = new Date();
start = new Date(
now.getTime() - minutes(now) - seconds(now) - ms(now)
);
finish=new Date(start.getTime() + 10 * 365 * 24 * 3600 * 1000);
}
const { t } = this.props;
const locale =
i18n.language.substring(0, 2).toLowerCase() === "fr" ? "fr" : "en";
@ -517,80 +534,121 @@ class CreateElection extends Component {
<hr className="mt-2 mb-2" />
<Row>
<Col xs="12" md="3" lg="3">
<span className="label">{t("Starting date")}</span>
</Col>
<Col xs="6" md="4" lg="3">
<input
className="form-control"
type="date"
value={dateToISO(start)}
onChange={e => {
this.setState({
start: new Date(
timeMinusDate(start) +
new Date(e.target.valueAsNumber).getTime()
)
});
}}
/>
</Col>
<Col xs="6" md="5" lg="3">
<select
className="form-control"
value={getOnlyValidDate(start).getHours()}
onChange={e =>
this.setState({
start: new Date(
dateMinusTime(start).getTime() +
e.target.value * 3600000
)
})
}
>
{displayClockOptions()}
</select>
</Col>
</Row>
<hr className="mt-2 mb-2" />
<Row>
<Col xs="12" md="3" lg="3">
<span className="label">{t("Ending date")}</span>
<Label for="title">{t("Voting time")}</Label>
</Col>
<Col xs="6" md="4" lg="3">
<input
className="form-control"
type="date"
value={dateToISO(finish)}
min={dateToISO(start)}
onChange={e => {
this.setState({
finish: new Date(
timeMinusDate(finish) +
new Date(
e.target.valueAsNumber
).getTime()
)
});
}}
/>
<Col xs="12" md="4" lg="3">
<Label className="radio " htmlFor="is_time_limited_false">
<span className="small text-dark">{t("Unlimited")}</span>
<input
className="radio"
type="radio"
name="time_limited"
id="is_time_limited_false"
onClick={this.handleIsTimeLimited}
defaultChecked={!this.state.isTimeLimited}
value="0"
/>
<span className="checkround checkround-gray" />
</Label>
</Col>
<Col xs="6" md="5" lg="3">
<select
className="form-control"
value={getOnlyValidDate(finish).getHours()}
onChange={e =>
this.setState({
finish: new Date(
dateMinusTime(finish).getTime() +
e.target.value * 3600000
)
})
}
>
{displayClockOptions()}
</select>
<Col xs="12" md="4" lg="3">
<Label className="radio" htmlFor="is_time_limited_true">
<span className="small">
<span className="text-dark">
{t("Defined period")}
</span>
</span>
<input
className="radio"
type="radio"
name="time_limited"
id="is_time_limited_true"
onClick={this.handleIsTimeLimited}
defaultChecked={this.state.isTimeLimited}
value="1"
/>
<span className="checkround checkround-gray" />
</Label>
</Col>
</Row>
<div
className={(this.state.isTimeLimited ? "d-block " : "d-none")+" bg-light p-3"}
>
<Row >
<Col xs="12" md="3" lg="3">
<span className="label">- {t("Starting date")}</span>
</Col>
<Col xs="6" md="4" lg="3">
<input
className="form-control"
type="date"
value={dateToISO(start)}
onChange={e => {
this.setState({
start: new Date(
timeMinusDate(start) +
new Date(e.target.valueAsNumber).getTime()
)
});
}}
/>
</Col>
<Col xs="6" md="5" lg="3">
<select
className="form-control"
value={getOnlyValidDate(start).getHours()}
onChange={e =>
this.setState({
start: new Date(
dateMinusTime(start).getTime() +
e.target.value * 3600000
)
})
}
>
{displayClockOptions()}
</select>
</Col>
</Row>
<Row className="mt-2">
<Col xs="12" md="3" lg="3">
<span className="label">- {t("Ending date")}</span>
</Col>
<Col xs="6" md="4" lg="3">
<input
className="form-control"
type="date"
value={dateToISO(finish)}
min={dateToISO(start)}
onChange={e => {
this.setState({
finish: new Date(
timeMinusDate(finish) +
new Date(e.target.valueAsNumber).getTime()
)
});
}}
/>
</Col>
<Col xs="6" md="5" lg="3">
<select
className="form-control"
value={getOnlyValidDate(finish).getHours()}
onChange={e =>
this.setState({
finish: new Date(
dateMinusTime(finish).getTime() +
e.target.value * 3600000
)
})
}
>
{displayClockOptions()}
</select>
</Col>
</Row>
</div>
<hr className="mt-2 mb-2" />
<Row>
<Col xs="12" md="3" lg="3">
@ -724,6 +782,7 @@ class CreateElection extends Component {
})}
</ul>
</div>
<div className={(this.state.isTimeLimited ? "d-block " : "d-none")} >
<div className="text-white bg-primary p-2 pl-3 pr-3 rounded">
{t("Dates")}
</div>
@ -739,6 +798,7 @@ class CreateElection extends Component {
{finish.toLocaleTimeString()}
</b>
</div>
</div>
<div className="text-white bg-primary p-2 pl-3 pr-3 rounded">
{t("Grades")}
</div>
@ -780,13 +840,13 @@ class CreateElection extends Component {
</div>
{this.state.restrictResult ? (
<div>
<div className="small bg-light text-primary p-3 mt-2 rounded">
<div className="small bg-primary text-white p-3 mt-2 rounded">
<h6 className="m-0 p-0">
<FontAwesomeIcon
icon={faExclamationTriangle}
className="mr-2"
/>
<u>{t("Accès aux résultats")}</u>
<u>{t("Results available at the close of the vote")}</u>
</h6>
<p className="m-2 p-0">
{electorEmails.length > 0 ? (
@ -801,7 +861,7 @@ class CreateElection extends Component {
"The results page will not be accessible until the end date is reached."
)}{" "}
({finish.toLocaleDateString()} {t("at")}{" "}
{finish.toLocaleTimeString()})
{finish.toLocaleTimeString()})
</span>
)}
</p>

111
src/components/views/CreateSuccess.jsx

@ -2,16 +2,17 @@
import React, { Component } from "react";
import { Col, Container, Row } from "reactstrap";
import { Link } from "react-router-dom";
import { withTranslation, Trans } from "react-i18next";
import { withTranslation } from "react-i18next";
import {
faCopy,
faUsers,
faExclamationTriangle
faExclamationTriangle,
faExternalLinkAlt
} from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import logoLine from "../../logos/logo-line-white.svg";
import { AppContext } from "../../AppContext";
import CopyField from "../CopyField";
import Facebook from "../banner/Facebook";
class CreateSuccess extends Component {
static contextType = AppContext;
@ -37,7 +38,7 @@ class CreateSuccess extends Component {
const { t } = this.props;
const electionLink = this.props.invitationOnly ? (
<>
<p className="mt-4 mb-1">
<p className="mb-1">
{t(
"Voters received a link to vote by email. Each link can be used only once!"
)}
@ -45,58 +46,86 @@ class CreateSuccess extends Component {
</>
) : (
<>
<p className="mt-4 mb-1">
{t("You can now share the election link to participants:")}
</p>
<CopyField value={this.state.urlOfVote} icon={faCopy} t={t} />
<p className="mb-1">{t("Voting address")}</p>
<CopyField
value={this.state.urlOfVote}
iconCopy={faCopy}
iconOpen={faExternalLinkAlt}
t={t}
/>
</>
);
return (
<Container>
<Row>
<Link to="/" className="d-block ml-auto mr-auto mb-4">
<img src={logoLine} alt="logo" height="128" />
</Link>
</Row>
<Row className="mt-4">
<Row className="mt-5">
<Col className="text-center offset-lg-3" lg="6">
<h2>{t("Successful election creation!")}</h2>
{electionLink}
<p className="mt-4 mb-1">
{t("Here is the link for the results in real time:")}
</p>
<CopyField value={this.state.urlOfResult} icon={faCopy} t={t} />
{this.props.invitationOnly ? null : (
<Facebook
className="btn btn-outline-light m-2"
text={t("Share election on Facebook")}
url={this.state.urlOfVote}
title={"app.mieuxvoter.fr"}
/>
)}
</Col>
</Row>
<Row className="mt-4 mb-4">
<Col className="text-center offset-lg-3" lg="6">
<div className=" bg-danger text-white p-2 ">
<h4 className="m-0 p-0 text-center">
<FontAwesomeIcon
icon={faExclamationTriangle}
className="mr-2"
/>
{t("Keep these links carefully")}
</h4>
<p className="small m-2 p-0">
<Trans i18nKey="t">
<b>Warning</b>: you will have no other choices to recover the
links, and we will not be able to share them with you. For
example, you can bookmark them in your browser.
</Trans>
</p>
<Row className="mt-5 mb-4">
<Col className="offset-lg-3" lg="6">
<h5 className="mb-3 text-center">
<FontAwesomeIcon icon={faExclamationTriangle} className="mr-2" />
{t("Keep these links carefully")}
</h5>
<div className="border rounded p-4 pb-5">
{electionLink}
<p className="mt-4 mb-1">{t("Results address")}</p>
<CopyField
value={this.state.urlOfResult}
iconCopy={faCopy}
iconOpen={faExternalLinkAlt}
t={t}
/>
</div>
{/*<div className="input-group ">
<input
type="text"
className="form-control"
value=""
placeholder="email@domaine.com"
/>
<div className="input-group-append">
<a
className="btn btn-success"
href=""
target="_blank"
rel="noopener noreferrer"
>
<FontAwesomeIcon icon={faPaperPlane} className="mr-2" />
{this.props.invitationOnly
? t("Send me this link")
: t("Send me these links")}
</a>
</div>
</div>*/}
{/*<div className="text-center">
<button
type="button"
className="btn btn-success m-2"
>
<FontAwesomeIcon icon={faPaperPlane} className="mr-2" />
{(this.props.invitationOnly?t("Send me this link by email"):t("Send me these links by email"))}
</button>
</div>*/}
</Col>
</Row>
<Row className="mt-4 mb-4">
<Col className="text-center">
<Link
to={"/vote/" + this.props.match.params.slug}
className="btn btn-success"
className="btn btn-secondary"
>
<FontAwesomeIcon icon={faUsers} className="mr-2" />
{t("Participate now!")}

280
src/components/views/Faq.jsx

@ -0,0 +1,280 @@
/* eslint react/prop-types: 0 */
import React, { Component } from "react";
import { Col, Container, Row } from "reactstrap";
import logoLine from "../../logos/logo-line-white.svg";
import { Link } from "react-router-dom";
import { AppContext } from "../../AppContext";
import { withTranslation } from "react-i18next";
import Paypal from "../banner/Paypal";
class Faq extends Component {
static contextType = AppContext;
constructor(props) {
super(props);
this.state = {};
}
render() {
const { t } = this.props;
return (
<Container>
<Row>
<Link to="/" className="d-block ml-auto mr-auto mb-4">
<img src={logoLine} alt="logo" height="128" />
</Link>
</Row>
<Row className="mt-4">
<Col className="text-center">
<h1>{t("FAQ")}</h1>
</Col>
</Row>
<Row className="mt-4">
<Col>
<h4 className="bold mt-5">
Quest-ce que le Jugement Majoritaire ?
</h4>
<p>
Un principe simple et intuitif, qui change tout : lélecteur vote
en donnant son avis sur toutes les candidatures présentées, leur
attribuant la mention de son choix (par exemple. Très bien, Bien,
Assez bien, Passable, Insuffisant, À Rejeter). La candidature
retenue est celle jugée la plus méritante par la majorité de
lélectorat (celui qui obtient la meilleure mention « majoritaire
»).
</p>
<div style={{ maxWidth: "445px" }}>
<video width="100%" height="250" controls="controls">
<source
src="/video/Le_Jugement_Majoritaire_en_1_minute.mp4"
type="video/mp4"
/>
<source
src="/video/Le_Jugement_Majoritaire_en_1_minute.webm"
type="video/webm"
/>
<source
src="/video/Le_Jugement_Majoritaire_en_1_minute.3gpp"
type="video/3gpp"
/>
</video>
</div>
<h4 className="bold mt-5">D vient le Jugement Majoritaire ?</h4>
<p>
Le jugement majoritaire est un mode de scrutin inventé par deux
chercheurs Français du Centre National de la Recherche
Scientifique (CNRS) en 2011, <u>Michel Balinski</u> et{" "}
<u>Rida Laraki</u>.
</p>
<h4 className="bold mt-5">
Quels sont les avantages du Jugement Majoritaire ?
</h4>
<p>
Une mesure précise de lopinion des participants au vote, à même
déclairer la décision collective. En demandant aux électeurs leur
opinion sur chaque option soumise au vote, on bénéficie de
beaucoup plus dinformations que dans le cadre du scrutin
uninominal qui, résumant lopinion des électeurs à un choix,
ignore lessentiel de linformation quant à ce quils pensent. En
agrégeant un grand nombre dinformations, le Jugement Majoritaire
ne produit pas « juste » un gagnant qui obtiendrait la majorité
des voix. Il mesure précisément le crédit porté à chacune des
options et permet daffiner autant que de pacifier la prise de
décision.
</p>
<h4 className="bold mt-5">
Quand et comment utiliser le Jugement Majoritaire ?
</h4>
<p>
Le Jugement majoritaire sapplique à tout type de votation
collective, quil sagisse délire un candidat, de retenir une ou
plusieurs idées lors dun atelier collaboratif, de choisir entre
plusieurs projets, de classer les vins, etc. Il peut être utilisé
à toutes les échelles (locale, nationale, internationale) et dans
tous les milieux (écoles, entreprises, associations, coopératives,
collectivités publiques).
</p>
<h4 className="bold mt-5">Qui peut utiliser cette application ?</h4>
<p>
Cette application de Jugement Majoritaire est ouverte à toute
personne désireuse de prendre une décision collective, entre amis,
entre collègues, entre membres dun groupe. Elle est libre daccès
et gratuite. Notre ambition est de vous proposer la meilleure
expérience de prise de décision collective et démocratique.
</p>
<h4 className="bold mt-5">
Comment organiser une élection avec plusieurs milliers de votants
?
</h4>
<p>
Cette application ne convient pas pour les votes à plus de 1000
votants. Si cest votre cas, nous vous invitons à nous contacter
par email à ladresse{" "}
<a href="mailto:contact@mieuxvoter.fr" className="text-light">
contact@mieuxvoter.fr
</a>
. Dans le cas dun vote sur invitation nous vous suggérons de ne
pas dépasser 200 participants (le temps de création du vote peut
prendre quelques minutes).
</p>
<h4 className="bold mt-5">
Je rencontre un problème, comment obtenir de laide ?
</h4>
<p>
Si vous rencontrez un problème en utilisant notre application,
prenez contact avec nous par email à ladresse «
<a
href="mailto:app@mieuxvoter.fr?subject=[HELP]"
className="text-light"
>
app@mieuxvoter.fr
</a>
», et prenez soin de bien décrire le problème rencontré dans votre
message. Ajoutez éventuellement dans votre description le lien de
votre vote.
</p>
<h4 className="bold mt-5">
Y-a til une limite de votants appliquée pour les votes sur
invitation ?
</h4>
<p>
Le nombre maximum de votants pour un vote sur invitation est de
1000 personnes. Si toutefois votre besoin est supérieur à cette
limite, nous vous invitons à nous envoyer un email à ladresse «
<a href="mailto:contact@mieuxvoter.fr" className="text-light">
contact@mieuxvoter.fr
</a>
».
</p>
<h4 className="bold mt-5">
Combien de temps le lien vers la page de résultat reste-t-il actif
?
</h4>
<p>
Les liens fournis lors de la création de votre vote nont pas de
date dexpiration. Conservez-les précieusement afin de pouvoir
consulter les résultat dans le futur.
</p>
<h4 className="bold mt-5">
Comment puis-je massurer quune même personne ne vote pas deux
fois?
</h4>
<p>
Dans le cas dun vote sur invitation, seules les personnes dont le
courriel a été ajouté à la création du vote reçoivent une
invitation et peuvent donc voter. Chacune des invitations dispose
dun lien unique auquel est associé un jeton à usage unique. Ce
jeton est détruit aussitôt que la participation au vote de
linvité est enregistrée. Il garantit donc à lorganisateur que
chaque participant na pu voter quune seule fois.
</p>
<p>
Dans le cas dun vote public, toute personne peut participer à
lélection sil dispose du lien de lélection. Il ny a dans ce
cas aucune limite de soumission dun vote. Une même personne peut
donc voter plusieurs fois.
</p>
<h4 className="bold mt-5">
Lorsque jorganise une élection, puis-je connaître le nombre et
lidentité des votants?
</h4>
<p>
Le nombre de votants est indiqué sur la page de résultats de votre
élection. Lidentité des votants est quant à elle effacée, afin de
respecter les conditions dun vote démocratique lanonymat
garantit la sincérité des électeurs.
</p>
<h4 className="bold mt-5">Puis-je modifier mon vote ?</h4>
<p>
Une fois votre vote enregistré, vous ne pouvez plus le modifier.
En effet, votre vote étant anonymisé, ce qui nous empêche de faire
le lien entre vous et votre vote.
</p>
<h4 className="bold mt-5">
Comment puis-je récupérer un lien si je lai perdu ?
</h4>
<p>
Vous ne pouvez pas récupérer un lien pour voter après quil vous
soit communiquer. Gardez le précieusement. Cependant si vous avez
le lien pour voter, nous pouvons vous transmettre le lien des
résultats.
</p>
<h4 className="bold mt-5">
Comment interpréter les résultats dun vote au Jugement
Majoritaire ?
</h4>
<p>
Les candidats ou propositions sont triées de la mention
majoritaire la plus favorable à la plus défavorable. En cas
dégalité, on calcule alors pour chaque candidat à départager: le
pourcentage délecteurs attribuant strictement plus que la mention
majoritaire commune et le pourcentage délecteurs attribuant
strictement moins que la mention majoritaire commune. La plus
grande des 4 valeurs détermine le résultat.
</p>
<h4 className="bold mt-5">Quelle sécurité pour mes données ?</h4>
<p>
Afin de garantir la sécurité de vos données, leur transmission est