From 22ebabda99735682312b93c437f3af8cacfb9d50 Mon Sep 17 00:00:00 2001 From: Emmy D'Anello Date: Fri, 28 Jun 2024 13:42:37 +0200 Subject: [PATCH] =?UTF-8?q?Visualisation=20r=C3=A9sultats=20l=C3=A9gislati?= =?UTF-8?q?ves=202024?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nupes-elections-front/src/App.js | 19 +-- .../src/ElectionsLegislatives2024.js | 148 ++++++++++++++++++ 2 files changed, 158 insertions(+), 9 deletions(-) create mode 100644 nupes-elections-front/src/ElectionsLegislatives2024.js diff --git a/nupes-elections-front/src/App.js b/nupes-elections-front/src/App.js index f5c3c61..3de72b6 100644 --- a/nupes-elections-front/src/App.js +++ b/nupes-elections-front/src/App.js @@ -1,8 +1,9 @@ import {createBrowserRouter, RouterProvider} from "react-router-dom" import './App.css' -import ElectionsLegislatives2022 from "./ElectionsLegislatives2022" +import ElectionsLegislatives2022 from './ElectionsLegislatives2022' import ElectionsEuropeennes2024 from './ElectionsEuropeennes2024' +import ElectionsLegislatives2024 from './ElectionsLegislatives2024' function App() { const router = createBrowserRouter([ @@ -26,14 +27,14 @@ function App() { path: "/elections/europeennes/2024/:typeResultats/:zoneId/", element: }, - // { - // path: "/elections/legislatives/2024/:typeResultats/", - // element: , - // }, - // { - // path: "/elections/legislatives/2024/:typeResultats/:zoneId/", - // element: - // }, + { + path: "/elections/legislatives/2024/:typeResultats/", + element: , + }, + { + path: "/elections/legislatives/2024/:typeResultats/:zoneId/", + element: + }, ]) return <> diff --git a/nupes-elections-front/src/ElectionsLegislatives2024.js b/nupes-elections-front/src/ElectionsLegislatives2024.js new file mode 100644 index 0000000..d5a335e --- /dev/null +++ b/nupes-elections-front/src/ElectionsLegislatives2024.js @@ -0,0 +1,148 @@ +import {useParams} from "react-router-dom" +import {AppBar, Container, Toolbar} from "@mui/material" +import * as Highcharts from 'highcharts' +import highchartsItem from 'highcharts/modules/item-series' +import {useEffect, useMemo, useState} from "react" +import { + SelectionAffichage, + TableauParticipation, + CarteResultats, + HistogrammeVoix, GroupementParBloc, SelectionTour +} from "./includes/composants_elections" +import {getNomZone, regrouperVoix} from "./utils" +import 'leaflet/dist/leaflet.css' +import { + TableauResultatsCandidatsLegislatives, + TableauResultatsNuancesLegislatives +} from "./includes/composants_elections_legislatives" + + +highchartsItem(Highcharts) + +export default function ElectionsLegislatives2024() { + const {typeResultats, zoneId} = useParams() + + const [grouperParBloc, setGrouperParBloc] = useState(false) + const [tour, setTour] = useState(1) + const [blocs, setBlocs] = useState([]) + const [candidats, setCandidats] = useState([]) + const [nuances, setNuances] = useState([]) + const [resultats, setResultats] = useState([]) + const [typeSousZone, setTypeSousZone] = useState("region") + + useEffect(() => { + fetch("/data/resultats/legislatives/2024/blocs.json").then(response => response.json()) + .then(data => setBlocs(data)) + fetch("/data/resultats/legislatives/2024/nuances.json").then(response => response.json()) + .then(data => setNuances(data)) + + if (typeResultats === "france") { + fetch("/data/resultats/legislatives/2024/france.json").then(response => response.json()) + .then(data => setResultats(data)) + } + else { + fetch(`/data/resultats/legislatives/2024/${typeResultats}/${zoneId}.json`) + .then(response => response.json()) + .then(data => setResultats(data)) + } + }, [typeResultats, zoneId]) + + const zoneInfo = useMemo(() => resultats?.zone ?? {}, [resultats]) + const nomZone = useMemo(() => getNomZone(typeResultats, zoneInfo), [typeResultats, zoneInfo]) + + useEffect(() => { + let circonscription = "" + + if (typeResultats === "circonscription") + circonscription = zoneId + else if (typeResultats === "bureau_vote") + circonscription = zoneInfo?.circonscription ?? "" + else { + setCandidats(nuances) + } + + if (!circonscription) + return + + fetch(`/data/resultats/legislatives/2024/candidats/${circonscription}.json`) + .then(response => response.json()) + .then(data => setCandidats(data)) + }, [typeResultats, zoneId, zoneInfo, nuances]) + + const donnees = useMemo(() => { + if (tour === 1) + return resultats?.tour1 ?? {} + else if (tour === 2) + return resultats?.tour2 ?? {} + else + return {} + }, [resultats, tour]) + + const dejaGroupeParNuance = typeResultats !== "circonscription" && typeResultats !== "bureau_vote" + const [voixParBloc, voixParNuance] = regrouperVoix(donnees.voix, candidats, blocs, nuances, + dejaGroupeParNuance) + + const candidatKey = typeSousZone === "circonscription" || typeSousZone === "bureau_vote" ? "numero" : "code" + + const [categoriesHistogramme, valeursHistogramme, couleursHistogramme] = useMemo(() => { + if (grouperParBloc) { + const categories = {} + const couleurs = {} + for (let bloc of blocs) { + categories[bloc.nom] = bloc.nom + couleurs[bloc.nom] = bloc.couleur + } + return [categories, voixParBloc, couleurs] + } + else { + if (typeResultats === "circonscription" || typeResultats === "bureau_vote") { + // On affiche les noms des candidat⋅es + const categories = {} + const couleurs = {} + for (let candidat of candidats) { + categories[candidat.numero] = `${candidat.prenom} ${candidat.nom} (${candidat.nuance})` + couleurs[candidat.numero] = nuances.filter(nuance => nuance.code === candidat.nuance)[0]?.couleur + } + return [categories, donnees.voix, couleurs] + } + else { + // On affiche les nuances + const categories = {} + const couleurs = {} + for (let nuance of nuances) { + categories[nuance.code] = nuance.nom + couleurs[nuance.code] = nuance.couleur + } + return [categories, voixParNuance, couleurs] + + } + } + }, [typeResultats, candidats, nuances, blocs, donnees, voixParNuance, voixParBloc, grouperParBloc]) + + const tableauResultats = useMemo(() => { + if (typeResultats === "circonscription" || typeResultats === "bureau_vote") + return + else + return + }, [typeResultats, candidats, blocs, nuances, donnees]) + + return <> + + + + + + + + + + {tableauResultats} + + + + +}