Visualisation résultats législatives 2024
This commit is contained in:
		@@ -1,8 +1,9 @@
 | 
				
			|||||||
import {createBrowserRouter, RouterProvider} from "react-router-dom"
 | 
					import {createBrowserRouter, RouterProvider} from "react-router-dom"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import './App.css'
 | 
					import './App.css'
 | 
				
			||||||
import ElectionsLegislatives2022 from "./ElectionsLegislatives2022"
 | 
					import ElectionsLegislatives2022 from './ElectionsLegislatives2022'
 | 
				
			||||||
import ElectionsEuropeennes2024 from './ElectionsEuropeennes2024'
 | 
					import ElectionsEuropeennes2024 from './ElectionsEuropeennes2024'
 | 
				
			||||||
 | 
					import ElectionsLegislatives2024 from './ElectionsLegislatives2024'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function App() {
 | 
					function App() {
 | 
				
			||||||
  const router = createBrowserRouter([
 | 
					  const router = createBrowserRouter([
 | 
				
			||||||
@@ -26,14 +27,14 @@ function App() {
 | 
				
			|||||||
      path: "/elections/europeennes/2024/:typeResultats/:zoneId/",
 | 
					      path: "/elections/europeennes/2024/:typeResultats/:zoneId/",
 | 
				
			||||||
      element: <ElectionsEuropeennes2024 />
 | 
					      element: <ElectionsEuropeennes2024 />
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    // {
 | 
					    {
 | 
				
			||||||
    //   path: "/elections/legislatives/2024/:typeResultats/",
 | 
					      path: "/elections/legislatives/2024/:typeResultats/",
 | 
				
			||||||
    //   element: <ElectionsLegislatives2024 />,
 | 
					      element: <ElectionsLegislatives2024 />,
 | 
				
			||||||
    // },
 | 
					    },
 | 
				
			||||||
    // {
 | 
					    {
 | 
				
			||||||
    //   path: "/elections/legislatives/2024/:typeResultats/:zoneId/",
 | 
					      path: "/elections/legislatives/2024/:typeResultats/:zoneId/",
 | 
				
			||||||
    //   element: <ElectionsLegislatives2024 />
 | 
					      element: <ElectionsLegislatives2024 />
 | 
				
			||||||
    // },
 | 
					    },
 | 
				
			||||||
  ])
 | 
					  ])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return <>
 | 
					  return <>
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										148
									
								
								nupes-elections-front/src/ElectionsLegislatives2024.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								nupes-elections-front/src/ElectionsLegislatives2024.js
									
									
									
									
									
										Normal file
									
								
							@@ -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 <TableauResultatsCandidatsLegislatives candidats={candidats} blocs={blocs} nuances={nuances} donnees_t1={resultats.tour1} donnees_t2={resultats.tour2} />
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      return <TableauResultatsNuancesLegislatives blocs={blocs} nuances={nuances} donnees={donnees} />
 | 
				
			||||||
 | 
					  }, [typeResultats, candidats, blocs, nuances, donnees])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return <>
 | 
				
			||||||
 | 
					    <AppBar position="sticky">
 | 
				
			||||||
 | 
					      <Toolbar>
 | 
				
			||||||
 | 
					        <GroupementParBloc grouperParBloc={grouperParBloc} setGrouperParBloc={setGrouperParBloc} />
 | 
				
			||||||
 | 
					        <SelectionAffichage typeResultats={typeResultats} typeSousZone={typeSousZone} setTypeSousZone={setTypeSousZone} />
 | 
				
			||||||
 | 
					        <SelectionTour tour={tour} setTour={setTour} />
 | 
				
			||||||
 | 
					      </Toolbar>
 | 
				
			||||||
 | 
					    </AppBar>
 | 
				
			||||||
 | 
					    <Container>
 | 
				
			||||||
 | 
					      <HistogrammeVoix titre={`Résultats des élections législatives 2024 : ${nomZone}`}
 | 
				
			||||||
 | 
					                       nomCategories={categoriesHistogramme} valeurParCategorie={valeursHistogramme}
 | 
				
			||||||
 | 
					                       totalExprimes={donnees.exprimes} couleurParCategorie={couleursHistogramme} />
 | 
				
			||||||
 | 
					      {tableauResultats}
 | 
				
			||||||
 | 
					      <TableauParticipation donnees_t1={resultats.tour1 ?? {}} donnees_t2={resultats.tour2 ?? {}} />
 | 
				
			||||||
 | 
					      <CarteResultats typeElection={"legislatives"} anneeElection={"2024"} typeResultats={typeResultats} zoneInfo={zoneInfo}
 | 
				
			||||||
 | 
					                      typeSousZone={typeSousZone} candidats={candidats} blocs={blocs} nuances={nuances} tour={tour}
 | 
				
			||||||
 | 
					                      grouperParBloc={grouperParBloc} candidatKey={candidatKey} />
 | 
				
			||||||
 | 
					    </Container>
 | 
				
			||||||
 | 
					  </>
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user