diff --git a/nupes-elections-front/src/Elections2024.js b/nupes-elections-front/src/Elections2024.js index f2adc5b..35d9913 100644 --- a/nupes-elections-front/src/Elections2024.js +++ b/nupes-elections-front/src/Elections2024.js @@ -12,7 +12,7 @@ import Switch from '@mui/material/Switch' import * as Highcharts from 'highcharts' import highchartsItem from 'highcharts/modules/item-series' import HighchartsReact from 'highcharts-react-official' -import {useEffect, useState} from "react" +import {useEffect, useMemo, useState} from "react" import {GeoJSON, MapContainer, Popup, TileLayer, useMap} from "react-leaflet" import 'leaflet/dist/leaflet.css' @@ -167,7 +167,7 @@ function RegionGeoJSON({resultats_region, listes, blocs, nuances, grouperParBloc return {resultats_region.region.nom} @@ -179,26 +179,105 @@ function RegionGeoJSON({resultats_region, listes, blocs, nuances, grouperParBloc } + +function DepartementGeoJSON({resultats_departement, listes, blocs, nuances, grouperParBloc = false}) { + const voix_listes = resultats_departement?.voix_listes ?? {} + const listes_triees = listes.toSorted((l1, l2) => { + return (voix_listes[l2.numero] || 0) - (voix_listes[l1.numero] || 0) + }) + + const voixParBloc = {} + const voixParNuance = {} + for (let bloc of blocs) { + voixParBloc[bloc.nom] = 0 + } + for (let nuance of nuances) { + voixParNuance[nuance.code] = 0 + } + + for (let liste of listes) { + voixParBloc[liste.bloc] += resultats_departement.voix_listes[liste.numero] || 0 + voixParNuance[liste.nuance] += resultats_departement.voix_listes[liste.numero] || 0 + } + + let couleur = 'grey' + if (grouperParBloc) { + let maxVoix = 0 + for (let bloc of blocs) { + if (voixParBloc[bloc.nom] > maxVoix) { + maxVoix = voixParBloc[bloc.nom] + couleur = bloc.couleur + } + } + } + else { + let maxVoix = 0 + for (let nuance of nuances) { + if (voixParNuance[nuance.code] > maxVoix) { + maxVoix = voixParNuance[nuance.code] + couleur = nuance.couleur + } + } + } + + console.log(resultats_departement.departement.code_insee, resultats_departement.geometry) + + return + + {resultats_departement.departement.nom} + + + +} + function ContenuCarte({typeResultats, resultats, listes, blocs, nuances, grouperParBloc = false}) { - const [regions, setRegions] = useState([]) - - useEffect(() => { - if (!resultats || !resultats.france || !resultats.france.regions) - return - - setRegions(regions => []) - - resultats.france.regions.forEach(region_code => { - fetch(`/data/resultats/europeennes2024/regions/${region_code}.json`).then(response => response.json()) - .then(region => setRegions(regions => [...regions, region])) - }) - }, [typeResultats, resultats]) - const map = useMap() - return <> - {regions.map(region => )} - + const [resultatsZones, setResultatsZones] = useState([]) + + const [typeZone, zones] = useMemo(() => { + if (typeResultats === "france") { + return ["regions", resultats?.france?.regions ?? []] + } + else if (typeResultats === "regions") { + return ["departements", resultats?.region?.departements ?? []] + } + }, [typeResultats, resultats]) + + useEffect(() => { + if (!zones) + return + + setResultatsZones(resultatsZones => []) + + zones.forEach(zone_id => { + fetch(`/data/resultats/europeennes2024/${typeZone}/${zone_id}.json`).then(response => response.json()) + .then(resultatsZone => setResultatsZones(resultatsZones => [...resultatsZones, resultatsZone])) + }) + }, [typeZone, zones, resultats]) + + if (typeZone === "regions") { + return <> + {resultatsZones.filter(resultatsZone => resultatsZone.geometry['type']).map(resultatsZone => + )} + + } + else if (typeZone === "departements") { + return <> + {resultatsZones.filter(resultatsZone => resultatsZone.geometry['type']).map(resultatsZone => + )} + + } } function Carte({typeResultats, resultats, listes, blocs, nuances, grouperParBloc = false}) { @@ -280,8 +359,8 @@ export default function Election2024({typeResultats = "france"}) { } for (let liste of listes) { - parBloc[liste.bloc] += resultats.voix_listes[liste.numero] || 0 - parNuance[liste.nuance] += resultats.voix_listes[liste.numero] || 0 + parBloc[liste.bloc] += resultats?.voix_listes[liste.numero] ?? 0 + parNuance[liste.nuance] += resultats?.voix_listes[liste.numero] ?? 0 } setVoixParBloc(parBloc) @@ -314,7 +393,7 @@ export default function Election2024({typeResultats = "france"}) { let siegesAffectes = 0 let totalVoix = resultats.exprimes for (let liste of listes) { - const voix = resultats.voix_listes[liste.numero] || 0 + const voix = resultats?.voix_listes[liste.numero] ?? 0 if (voix / resultats.exprimes < 0.05 && !retirerSeuil) { // Barre des 5 % non franchie totalVoix -= voix @@ -329,7 +408,7 @@ export default function Election2024({typeResultats = "france"}) { return for (let liste of listesElues) { - const voix = resultats.voix_listes[liste.numero] || 0 + const voix = resultats?.voix_listes[liste.numero] ?? 0 sieges[liste.numero] = Math.floor(MAX_SIEGES * voix / totalVoix) siegesAffectes += sieges[liste.numero] } @@ -340,7 +419,7 @@ export default function Election2024({typeResultats = "france"}) { let listeElue = null for (let liste of listesElues) { if (sieges[liste.numero] < MAX_SIEGES) { - const voix = resultats.voix_listes[liste.numero] || 0 + const voix = resultats?.voix_listes[liste.numero] ?? 0 const moyenne = voix / (sieges[liste.numero] + 1) if (moyenne > maxMoyenne) { maxMoyenne = moyenne