diff --git a/public/app-mieux-voter.png b/public/app-mieux-voter.png new file mode 100755 index 0000000..115bc9c Binary files /dev/null and b/public/app-mieux-voter.png differ diff --git a/public/background-mv.jpg b/public/background-mv.jpg deleted file mode 100644 index 60d12ff..0000000 Binary files a/public/background-mv.jpg and /dev/null differ diff --git a/public/index.html b/public/index.html index 03c6431..8226035 100644 --- a/public/index.html +++ b/public/index.html @@ -3,7 +3,7 @@ - + - - - - - - - - - - - - - - - - - Plateforme de vote : Jugement Majoritaire + + + + + + + + + + + + + + + + + Application Jugement Majoritaire + + + + + diff --git a/public/locale/i18n/de/resource.json b/public/locale/i18n/de/resource.json index 78c208f..b9f0ce1 100644 --- a/public/locale/i18n/de/resource.json +++ b/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" } diff --git a/public/locale/i18n/en/resource.json b/public/locale/i18n/en/resource.json index 8be6f24..0d375c8 100644 --- a/public/locale/i18n/en/resource.json +++ b/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" } diff --git a/public/locale/i18n/es/resource.json b/public/locale/i18n/es/resource.json index 1176d17..aa9d071 100644 --- a/public/locale/i18n/es/resource.json +++ b/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" } diff --git a/public/locale/i18n/fr/resource.json b/public/locale/i18n/fr/resource.json index f2c0857..0936da5 100644 --- a/public/locale/i18n/fr/resource.json +++ b/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 : 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" + } diff --git a/public/locale/i18n/ru/resource.json b/public/locale/i18n/ru/resource.json index 7a0ccca..9fba13e 100644 --- a/public/locale/i18n/ru/resource.json +++ b/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" } diff --git a/public/video/Le_Jugement_Majoritaire_en_1_minute.3gpp b/public/video/Le_Jugement_Majoritaire_en_1_minute.3gpp new file mode 100755 index 0000000..e05cc34 Binary files /dev/null and b/public/video/Le_Jugement_Majoritaire_en_1_minute.3gpp differ diff --git a/public/video/Le_Jugement_Majoritaire_en_1_minute.mp4 b/public/video/Le_Jugement_Majoritaire_en_1_minute.mp4 new file mode 100755 index 0000000..ef8d7dd Binary files /dev/null and b/public/video/Le_Jugement_Majoritaire_en_1_minute.mp4 differ diff --git a/public/video/Le_Jugement_Majoritaire_en_1_minute.webm b/public/video/Le_Jugement_Majoritaire_en_1_minute.webm new file mode 100755 index 0000000..464a7a2 Binary files /dev/null and b/public/video/Le_Jugement_Majoritaire_en_1_minute.webm differ diff --git a/src/Routes.jsx b/src/Routes.jsx index 5ba8853..61b453b 100644 --- a/src/Routes.jsx +++ b/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() { /> + + + diff --git a/src/components/CopyField.jsx b/src/components/CopyField.jsx index 7f45127..8009343 100644 --- a/src/components/CopyField.jsx +++ b/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 (
@@ -31,14 +31,25 @@ const CopyField = props => {
+ {/**/}
); }; diff --git a/src/components/banner/Facebook.jsx b/src/components/banner/Facebook.jsx new file mode 100644 index 0000000..e710a23 --- /dev/null +++ b/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 ( + + ); +}; + +export default Facebook; + +//i diff --git a/src/components/banner/Gform.jsx b/src/components/banner/Gform.jsx new file mode 100644 index 0000000..5cfe10e --- /dev/null +++ b/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 ( + + + Votre avis nous intéresse ! + + ); +}; + +export default Gform; + +//https://docs.google.com/forms/d/1Y5ocQscSkHFZdniR7Lvc9mbkJYe9ZIC4w0tOvC4rDZo/viewform?edit_requested=true diff --git a/src/components/layouts/Footer.jsx b/src/components/layouts/Footer.jsx index eaf3cb4..0b93439 100644 --- a/src/components/layouts/Footer.jsx +++ b/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 ( - - ); - } -} + 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 ( + + ); +}; export default withTranslation()(Footer); diff --git a/src/components/layouts/footer.css b/src/components/layouts/footer.css new file mode 100644 index 0000000..45a16dd --- /dev/null +++ b/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; +} diff --git a/src/components/layouts/useBbox.jsx b/src/components/layouts/useBbox.jsx new file mode 100644 index 0000000..42e11f8 --- /dev/null +++ b/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]; +}; \ No newline at end of file diff --git a/src/components/views/CreateElection.jsx b/src/components/views/CreateElection.jsx index 81b5c6d..6e8e032 100644 --- a/src/components/views/CreateElection.jsx +++ b/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 {
- {t("Starting date")} - - - { - this.setState({ - start: new Date( - timeMinusDate(start) + - new Date(e.target.valueAsNumber).getTime() - ) - }); - }} - /> - - - - - -
- - - {t("Ending date")} + - - { - this.setState({ - finish: new Date( - timeMinusDate(finish) + - new Date( - e.target.valueAsNumber - ).getTime() - ) - }); - }} - /> + + - - + + +
+ + + - {t("Starting date")} + + + { + this.setState({ + start: new Date( + timeMinusDate(start) + + new Date(e.target.valueAsNumber).getTime() + ) + }); + }} + /> + + + + + + + + + - {t("Ending date")} + + + { + this.setState({ + finish: new Date( + timeMinusDate(finish) + + new Date(e.target.valueAsNumber).getTime() + ) + }); + }} + /> + + + + + +

@@ -724,6 +782,7 @@ class CreateElection extends Component { })} +
{t("Dates")}
@@ -739,6 +798,7 @@ class CreateElection extends Component { {finish.toLocaleTimeString()}
+
{t("Grades")}
@@ -780,13 +840,13 @@ class CreateElection extends Component { {this.state.restrictResult ? (
-
+
- {t("Accès aux résultats")} + {t("Results available at the close of the vote")}

{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()}) )}

diff --git a/src/components/views/CreateSuccess.jsx b/src/components/views/CreateSuccess.jsx index 8e1666a..24bf256 100644 --- a/src/components/views/CreateSuccess.jsx +++ b/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 ? ( <> -

+

{t( "Voters received a link to vote by email. Each link can be used only once!" )} @@ -45,58 +46,86 @@ class CreateSuccess extends Component { ) : ( <> -

- {t("You can now share the election link to participants:")} -

- +

{t("Voting address")}

+ ); - return ( - - - logo - - - +

{t("Successful election creation!")}

- - {electionLink} - -

- {t("Here is the link for the results in real time:")} -

- + {this.props.invitationOnly ? null : ( + + )}
- - -
-

- - {t("Keep these links carefully")} -

-

- - Warning: 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. - -

+ + +
+ + {t("Keep these links carefully")} +
+
+ {electionLink} + +

{t("Results address")}

+
+ + {/**/} + {/*
+ + +
*/}
- {t("Participate now!")} diff --git a/src/components/views/Faq.jsx b/src/components/views/Faq.jsx new file mode 100644 index 0000000..26ae1cb --- /dev/null +++ b/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 ( + + + + logo + + + + +

{t("FAQ")}

+ +
+ + +

+ Qu’est-ce que le Jugement Majoritaire ? +

+

+ 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 + »). +

+
+ +
+ +

D’où vient le Jugement Majoritaire ?

+

+ Le jugement majoritaire est un mode de scrutin inventé par deux + chercheurs Français du Centre National de la Recherche + Scientifique (CNRS) en 2011, Michel Balinski et{" "} + Rida Laraki. +

+ +

+ Quels sont les avantages du Jugement Majoritaire ? +

+

+ Une mesure précise de l’opinion 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 d’informations que dans le cadre du scrutin + uninominal qui, résumant l’opinion des électeurs à un choix, + ignore l’essentiel de l’information quant à ce qu’ils pensent. En + agrégeant un grand nombre d’informations, 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 d’affiner autant que de pacifier la prise de + décision. +

+ +

+ Quand et comment utiliser le Jugement Majoritaire ? +

+

+ Le Jugement majoritaire s’applique à tout type de votation + collective, qu’il s’agisse d’élire un candidat, de retenir une ou + plusieurs idées lors d’un 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…). +

+ +

Qui peut utiliser cette application ?

+

+ Cette application de Jugement Majoritaire est ouverte à toute + personne désireuse de prendre une décision collective, entre amis, + entre collègues, entre membres d’un groupe. Elle est libre d’accès + et gratuite. Notre ambition est de vous proposer la meilleure + expérience de prise de décision collective et démocratique. +

+ +

+ Comment organiser une élection avec plusieurs milliers de votants + ? +

+

+ Cette application ne convient pas pour les votes à plus de 1000 + votants. Si c’est votre cas, nous vous invitons à nous contacter + par email à l’adresse{" "} + + contact@mieuxvoter.fr + + . Dans le cas d’un 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). +

+ +

+ Je rencontre un problème, comment obtenir de l’aide ? +

+

+ Si vous rencontrez un problème en utilisant notre application, + prenez contact avec nous par email à l’adresse « + + app@mieuxvoter.fr + + », et prenez soin de bien décrire le problème rencontré dans votre + message. Ajoutez éventuellement dans votre description le lien de + votre vote. +

+ +

+ Y-a t’il une limite de votants appliquée pour les votes sur + invitation ? +

+

+ 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 à l’adresse « + + contact@mieuxvoter.fr + + ». +

+ +

+ Combien de temps le lien vers la page de résultat reste-t-il actif + ? +

+

+ Les liens fournis lors de la création de votre vote n’ont pas de + date d’expiration. Conservez-les précieusement afin de pouvoir + consulter les résultat dans le futur. +

+ +

+ Comment puis-je m’assurer qu’une même personne ne vote pas deux + fois? +

+

+ Dans le cas d’un 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 + d’un lien unique auquel est associé un jeton à usage unique. Ce + jeton est détruit aussitôt que la participation au vote de + l’invité est enregistrée. Il garantit donc à l’organisateur que + chaque participant n’a pu voter qu’une seule fois. +

+ +

+ Dans le cas d’un vote public, toute personne peut participer à + l’élection s’il dispose du lien de l’élection. Il n’y a dans ce + cas aucune limite de soumission d’un vote. Une même personne peut + donc voter plusieurs fois. +

+ +

+ Lorsque j’organise une élection, puis-je connaître le nombre et + l’identité des votants? +

+

+ Le nombre de votants est indiqué sur la page de résultats de votre + élection. L’identité des votants est quant à elle effacée, afin de + respecter les conditions d’un vote démocratique où l’anonymat + garantit la sincérité des électeurs. +

+ +

Puis-je modifier mon vote ?

+

+ 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. +

+ +

+ Comment puis-je récupérer un lien si je l’ai perdu ? +

+

+ Vous ne pouvez pas récupérer un lien pour voter après qu’il vous + soit communiquer. Gardez le précieusement. Cependant si vous avez + le lien pour voter, nous pouvons vous transmettre le lien des + résultats. +

+ +

+ Comment interpréter les résultats d’un vote au Jugement + Majoritaire ? +

+

+ 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. +

+ +

Quelle sécurité pour mes données ?

+

+ Afin de garantir la sécurité de vos données, leur transmission est + chiffrée et vos votes sont anonymisés. +

+ +

+ Que faites-vous des données collectées ? +

+

+ L’application app.mieuxvoter.fr a pour seul et unique but de faire + découvrir le vote au Jugement Majoritaire. Elle n’a pas de but + politique, ni commercial. Mieux Voter attache la plus grande + importance au stricte respect de la vie privée, et utilise ces + données uniquement de manière responsable et confidentielle, dans + une finalité précise. +

+ +

Qui est Mieux Voter ?

+

+ « Mieux Voter » est une association loi 1901 qui promeut + l’utilisation du Jugement Majoritaire, nouvelle théorie du choix + social, comme un outil pour améliorer les décisions collectives et + les exercices de démocratie participative à l’usage de tous. +

+ +

+ Comment nous aider à faire connaître le Jugement Majoritaire ? +

+

+ Vous avez apprécié votre expérience de vote démocratique au + Jugement Majoritaire ?
+ Nous en sommes ravis ! Vous pouvez nous aider en faisant un don à + l’association ici : +

+ + +
+ {/* + + + {t("Go back to homepage")} + + + */} +
+ ); + } +} + +export default withTranslation()(Faq); diff --git a/src/components/views/LegalNotices.jsx b/src/components/views/LegalNotices.jsx new file mode 100644 index 0000000..5475aad --- /dev/null +++ b/src/components/views/LegalNotices.jsx @@ -0,0 +1,69 @@ +/* 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"; + +class LegalNotices extends Component { + static contextType = AppContext; + constructor(props) { + super(props); + this.state = {}; + } + + render() { + const { t } = this.props; + return ( + + + + logo + + + + +

{t("Legal notices")}

+ +
+ + +

Editeur

+

Cette Application est éditée par l’association loi 1901 + {" "} + “Mieux Voter” + , dont le siège social est situé au 59 rue saint andré des arts, à Paris (75006).

+ +

Adresse email : contact@mieuxvoter.fr

+ +

+ Directeur de la publication +
Chloé Ridel +

+

Hébergement

+

Serveurs localisés à Paris +

+

Oeuvres graphiques

+

+ Les illustrations et graphismes sur cette application sont l’oeuvre de l’association MieuxVoter +

+ +
+ + + + {t("Go back to homepage")} + + + +
+ ); + } +} +export default withTranslation()(LegalNotices); \ No newline at end of file diff --git a/src/components/views/PrivacyPolicy.jsx b/src/components/views/PrivacyPolicy.jsx new file mode 100644 index 0000000..0a30217 --- /dev/null +++ b/src/components/views/PrivacyPolicy.jsx @@ -0,0 +1,113 @@ +/* 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"; + +class PrivacyPolicy extends Component { + static contextType = AppContext; + + constructor(props) { + super(props); + this.state = {}; + } + + render() { + const { t } = this.props; + return ( + + + + logo + + + + +

{t("Privacy policy")}

+ +
+ + +

+ Dernière mise à jour de notre politique de confidentialité + effectuée le 27 avril 2020. +

+

Introduction

+

+ Dans le cadre de la mise à disposition de son application web de + vote au jugement majoritaire, accessible sur Internet à l’adresse + app.mieuxvoter.fr, ci-après l’Application, l’association loi 1901 + « Mieux Voter » , dont le siège social est situé au 59 rue saint + andré des arts, à Paris (75006), ci-après l’Association, est + amenée à collecter et à traiter des informations dont certaines + sont qualifiées de « Données personnelles » . Mieux Voter attache + la plus grande importance au respect de la vie privée, et utilise + ces données uniquement de manière responsable et confidentielle et + dans une finalité précise. +

+

Notre politique de confidentialité

+

+ La présente politique de confidentialité détaille les conditions + d’utilisation et de traitement par l’Association des Données + personnelles (ci-après définies) collectées via l’Application. + L’Association s’engage à respecter les dispositions de la loi + n°78-17 du 6 janvier 1978 relative à l’informatique, aux fichiers + et aux libertés modifiée et au Règlement (UE) 2016/679 du + Parlement européen et du Conseil du 27 avril 2016 dit « RGPD » et + prendre toute précaution nécessaire pour préserver la sécurité des + Données personnelles confiées. +

+

Responsable de traitement

+

+ En qualité de responsable de traitement, l’Association peut + traiter les Données personnelles. +

+

+ Données personnelles traitées et finalités de traitement +

+

+ L’Association recueille sur l’Application les Données personnelles + dans une finalité précise. Ces données sont nécessaires à la + fourniture de notre service. Dans le cadre de la fourniture de ce + service, l’Association traite uniquement les données personnelles + suivantes (définies comme les « Données personnelles ») + strictement nécessaires à la fourniture du service : +

+
    +
  • Les emails des personnes invitées à un vote
  • +
+ +

+ {" "} + La finalité de traitement de ces données personnelles est de + permettre à l’Association de fournir le service. Ces données sont + traitées au moment de la création du vote pour envoyer les + invitations et détruites aussitôt les invitations envoyées. Elles + ne sont jamais stockées sur nos serveurs. +

+

Sécurité des Données personnelles

+

+ L’Association s’engage, au titre de son obligation de moyens, à + prendre toutes les précautions utiles et met en œuvre des mesures + techniques et organisationnelles appropriées en la matière pour + garantir un niveau de sécurité adapté et pour protéger les Données + personnelles contre les altérations, destructions et accès non + autorisés. +

+ +
+ {/* + + + {t("Go back to homepage")} + + + */} +
+ ); + } +} + +export default withTranslation()(PrivacyPolicy); diff --git a/src/components/views/Result.jsx b/src/components/views/Result.jsx index 5d8f36e..a4bd76b 100644 --- a/src/components/views/Result.jsx +++ b/src/components/views/Result.jsx @@ -15,6 +15,7 @@ import { import { i18nGrades } from "../../Util"; import { AppContext } from "../../AppContext"; import { errorMessage, Error } from "../../Errors"; +import Facebook from "../banner/Facebook"; class Result extends Component { static contextType = AppContext; @@ -185,21 +186,12 @@ class Result extends Component { -

{this.state.title}

+

{this.state.title}

- -

{t("Results of the election:")}

-
- - {t("Number of votes:")} - {" " + numVotes} - -
-
-
    +
      {candidates.map((candidate, i) => { const gradeValue = candidate.grade + offsetGrade; return ( @@ -223,6 +215,12 @@ class Result extends Component { ); })}
    +
    + + {t("Number of votes:")} + {" " + numVotes} + +
    @@ -403,6 +401,16 @@ class Result extends Component { + + + + + ); } diff --git a/src/components/views/Vote.jsx b/src/components/views/Vote.jsx index 0e65133..d065f1a 100644 --- a/src/components/views/Vote.jsx +++ b/src/components/views/Vote.jsx @@ -337,12 +337,12 @@ class Vote extends Component { className="btn btn-dark " > - {t("Validate")} + {t("Submit my vote")} ) : ( )} diff --git a/src/components/views/VoteSuccess.jsx b/src/components/views/VoteSuccess.jsx index 55c7d00..d364d57 100644 --- a/src/components/views/VoteSuccess.jsx +++ b/src/components/views/VoteSuccess.jsx @@ -6,6 +6,7 @@ import logoLine from "../../logos/logo-line-white.svg"; import { Link } from "react-router-dom"; import { AppContext } from "../../AppContext"; import Paypal from "../banner/Paypal"; +import Gform from "../banner/Gform"; class VoteSuccess extends Component { static contextType = AppContext; @@ -22,19 +23,15 @@ class VoteSuccess extends Component {

    {t("Your participation was recorded with success!")}

    {t("Thanks for your participation.")}

    -
    +
    + +
    +
    - - - - {t("Go back to homepage")} - - - ); } diff --git a/src/scss/_app.scss b/src/scss/_app.scss index 7bb8e0b..865b3c1 100644 --- a/src/scss/_app.scss +++ b/src/scss/_app.scss @@ -305,7 +305,7 @@ li.sortable { .median { border-width: 0 3px 0 0; border-style: dashed; - border-color: $mv-blue-color; + border-color: #000; min-height: 30px; width: 1px; position: absolute; @@ -337,3 +337,21 @@ li.sortable { .flag-select__options .flag-select__option__icon { top: 0; } + +/** result **/ +ol.result > li{ + font-size:1rem; + font-weight:normal; +} +ol.result > li:nth-child(1){ + font-size:1.75rem; + font-weight:bold; +} + +ol.result > li:nth-child(2){ + font-size:1.5rem; +} + +ol.result > li:nth-child(3){ + font-size:1.25rem; +} \ No newline at end of file