Sélection du type d'affichage
This commit is contained in:
		@@ -10,28 +10,12 @@ function App() {
 | 
				
			|||||||
      element: <Elections2024 typeResultats="france" />,
 | 
					      element: <Elections2024 typeResultats="france" />,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      path: "/elections/europeennes/2024/france/",
 | 
					      path: "/elections/europeennes/2024/:typeResultats/",
 | 
				
			||||||
      element: <Elections2024 typeResultats="france" />,
 | 
					      element: <Elections2024 />,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      path: "/elections/europeennes/2024/region/:zoneId/",
 | 
					      path: "/elections/europeennes/2024/:typeResultats/:zoneId/",
 | 
				
			||||||
      element: <Elections2024 typeResultats="regions" />,
 | 
					      element: <Elections2024 />
 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      path: "/elections/europeennes/2024/circonscription/:zoneId/",
 | 
					 | 
				
			||||||
      element: <Elections2024 typeResultats="circonscriptions" />,
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      path: "/elections/europeennes/2024/departement/:zoneId/",
 | 
					 | 
				
			||||||
      element: <Elections2024 typeResultats="departements" />,
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      path: "/elections/europeennes/2024/commune/:zoneId/",
 | 
					 | 
				
			||||||
      element: <Elections2024 typeResultats="communes" />,
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
      path: "/elections/europeennes/2024/bureau_vote/:zoneId/",
 | 
					 | 
				
			||||||
      element: <Elections2024 typeResultats="bureaux_vote" />,
 | 
					 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
  ])
 | 
					  ])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,6 +16,7 @@ import {useEffect, useMemo, useState} from "react"
 | 
				
			|||||||
import {GeoJSON, MapContainer, Popup, TileLayer, useMap} from "react-leaflet"
 | 
					import {GeoJSON, MapContainer, Popup, TileLayer, useMap} from "react-leaflet"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import 'leaflet/dist/leaflet.css'
 | 
					import 'leaflet/dist/leaflet.css'
 | 
				
			||||||
 | 
					import {MenuItem, Select} from "@mui/material";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
highchartsItem(Highcharts)
 | 
					highchartsItem(Highcharts)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -125,8 +126,22 @@ function ParticipationTable({resultats}) {
 | 
				
			|||||||
  </>
 | 
					  </>
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function RegionGeoJSON({resultats_region, listes, blocs, nuances, grouperParBloc = false}) {
 | 
					function ZoneGeoJSON({resultatsZone, typeZone, listes, blocs, nuances, grouperParBloc = false}) {
 | 
				
			||||||
  const voix_listes = resultats_region?.voix_listes ?? {}
 | 
					  const [idZone, nomZone] = useMemo(() => {
 | 
				
			||||||
 | 
					    if (!resultatsZone[typeZone])
 | 
				
			||||||
 | 
					      return ["", ""]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (typeZone === "region" || typeZone === "departement" || typeZone === "commune")
 | 
				
			||||||
 | 
					      return [resultatsZone[typeZone].code_insee, resultatsZone[typeZone].nom]
 | 
				
			||||||
 | 
					    else if (typeZone === "circonscription")
 | 
				
			||||||
 | 
					      return [resultatsZone.circonscription.id, `Circonscription ${resultatsZone.circonscription.id}`]
 | 
				
			||||||
 | 
					    else if (typeZone === "bureau_vote")
 | 
				
			||||||
 | 
					      return [resultatsZone.bureau_vote.id, resultatsZone.bureau_vote.libelle]
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      return ["", ""]
 | 
				
			||||||
 | 
					  }, [typeZone, resultatsZone])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const voix_listes = resultatsZone?.voix_listes ?? {}
 | 
				
			||||||
  const listes_triees = listes.toSorted((l1, l2) => {
 | 
					  const listes_triees = listes.toSorted((l1, l2) => {
 | 
				
			||||||
    return (voix_listes[l2.numero] || 0) - (voix_listes[l1.numero] || 0)
 | 
					    return (voix_listes[l2.numero] || 0) - (voix_listes[l1.numero] || 0)
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
@@ -141,8 +156,8 @@ function RegionGeoJSON({resultats_region, listes, blocs, nuances, grouperParBloc
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (let liste of listes) {
 | 
					  for (let liste of listes) {
 | 
				
			||||||
    voixParBloc[liste.bloc] += resultats_region.voix_listes[liste.numero] || 0
 | 
					    voixParBloc[liste.bloc] += resultatsZone.voix_listes[liste.numero] || 0
 | 
				
			||||||
    voixParNuance[liste.nuance] += resultats_region.voix_listes[liste.numero] || 0
 | 
					    voixParNuance[liste.nuance] += resultatsZone.voix_listes[liste.numero] || 0
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  let couleur = 'grey'
 | 
					  let couleur = 'grey'
 | 
				
			||||||
@@ -166,89 +181,43 @@ function RegionGeoJSON({resultats_region, listes, blocs, nuances, grouperParBloc
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return <GeoJSON
 | 
					  return <GeoJSON
 | 
				
			||||||
    key={resultats_region.region.code_insee}
 | 
					    data={{'type': "Feature", 'geometry': resultatsZone.geometry}}
 | 
				
			||||||
    data={{'type': "Feature", 'geometry': resultats_region.geometry}}
 | 
					    style={{fillColor: couleur, fillOpacity: 0.5, color: 'white', weight: 1}}>
 | 
				
			||||||
    style={{fillColor: couleur, fillOpacity: 0.5, color: 'white'}}>
 | 
					 | 
				
			||||||
    <Popup>
 | 
					    <Popup>
 | 
				
			||||||
      <strong><a href={`/elections/europeennes/2024/region/${resultats_region.region.code_insee}/`}>{resultats_region.region.nom}</a></strong>
 | 
					      <strong><a href={`/elections/europeennes/2024/${typeZone}/${idZone}/`}>{nomZone}</a></strong>
 | 
				
			||||||
      <ul>
 | 
					      <ul>
 | 
				
			||||||
        {listes_triees.slice(0, 5).map(liste =>
 | 
					        {listes_triees.slice(0, 5).map(liste =>
 | 
				
			||||||
          <li key={liste.numero}>{liste.nom} : {voix_listes[liste.numero]} ({(100 * voix_listes[liste.numero] / resultats_region.exprimes).toFixed(2)} %)</li>)}
 | 
					          <li key={liste.numero}>{liste.nom} : {voix_listes[liste.numero]} ({(100 * voix_listes[liste.numero] / resultatsZone.exprimes).toFixed(2)} %)</li>)}
 | 
				
			||||||
      </ul>
 | 
					      </ul>
 | 
				
			||||||
    </Popup>
 | 
					    </Popup>
 | 
				
			||||||
  </GeoJSON>
 | 
					  </GeoJSON>
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function ContenuCarte({typeResultats, resultats, typeZone, listes, blocs, nuances, grouperParBloc = false}) {
 | 
				
			||||||
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 <GeoJSON
 | 
					 | 
				
			||||||
    key={resultats_departement.departement.code_insee}
 | 
					 | 
				
			||||||
    data={{'type': "Feature", 'geometry': resultats_departement.geometry}}
 | 
					 | 
				
			||||||
    style={{fillColor: couleur, fillOpacity: 0.5, color: 'white'}}>
 | 
					 | 
				
			||||||
    <Popup>
 | 
					 | 
				
			||||||
      <strong><a href={`/elections/europeennes/2024/departement/${resultats_departement.departement.code_insee}/`}>{resultats_departement.departement.nom}</a></strong>
 | 
					 | 
				
			||||||
      <ul>
 | 
					 | 
				
			||||||
        {listes_triees.slice(0, 5).map(liste =>
 | 
					 | 
				
			||||||
          <li key={liste.numero}>{liste.nom} : {voix_listes[liste.numero]} ({(100 * voix_listes[liste.numero] / resultats_departement.exprimes).toFixed(2)} %)</li>)}
 | 
					 | 
				
			||||||
      </ul>
 | 
					 | 
				
			||||||
    </Popup>
 | 
					 | 
				
			||||||
  </GeoJSON>
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function ContenuCarte({typeResultats, resultats, listes, blocs, nuances, grouperParBloc = false}) {
 | 
					 | 
				
			||||||
  const map = useMap()
 | 
					  const map = useMap()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  console.log(typeZone)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const [resultatsZones, setResultatsZones] = useState([])
 | 
					  const [resultatsZones, setResultatsZones] = useState([])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const [typeZone, zones] = useMemo(() => {
 | 
					  const zones = useMemo(() => {
 | 
				
			||||||
    if (typeResultats === "france") {
 | 
					    const data = resultats[typeResultats]
 | 
				
			||||||
      return ["regions", resultats?.france?.regions ?? []]
 | 
					    if (!data)
 | 
				
			||||||
    }
 | 
					      return []
 | 
				
			||||||
    else if (typeResultats === "regions") {
 | 
					
 | 
				
			||||||
      return ["departements", resultats?.region?.departements ?? []]
 | 
					    if (typeZone === "region")
 | 
				
			||||||
    }
 | 
					      return data?.regions ?? []
 | 
				
			||||||
  }, [typeResultats, resultats])
 | 
					    else if (typeZone === "departement")
 | 
				
			||||||
 | 
					      return data?.departements ?? []
 | 
				
			||||||
 | 
					    else if (typeZone === "circonscription")
 | 
				
			||||||
 | 
					      return data?.circonscriptions ?? []
 | 
				
			||||||
 | 
					    else if (typeZone === "commune")
 | 
				
			||||||
 | 
					      return data?.communes ?? []
 | 
				
			||||||
 | 
					    else if (typeZone === "bureau_vote")
 | 
				
			||||||
 | 
					      return data?.bureaux_vote ?? []
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      return []
 | 
				
			||||||
 | 
					  }, [typeResultats, resultats, typeZone])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  useEffect(() => {
 | 
					  useEffect(() => {
 | 
				
			||||||
    if (!zones)
 | 
					    if (!zones)
 | 
				
			||||||
@@ -262,25 +231,24 @@ function ContenuCarte({typeResultats, resultats, listes, blocs, nuances, grouper
 | 
				
			|||||||
    })
 | 
					    })
 | 
				
			||||||
  }, [typeZone, zones, resultats])
 | 
					  }, [typeZone, zones, resultats])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (typeZone === "regions") {
 | 
					  function getZoneIdentifier(typeZone, zone) {
 | 
				
			||||||
    return <>
 | 
					    if (typeZone === "region" || typeZone === "departement" || typeZone === "commune")
 | 
				
			||||||
      {resultatsZones.filter(resultatsZone => resultatsZone.geometry['type']).map(resultatsZone =>
 | 
					      return zone.code_insee
 | 
				
			||||||
        <RegionGeoJSON key={resultatsZone.region.code_insee}
 | 
					    else if (typeZone === "circonscription" || typeZone === "bureau_vote")
 | 
				
			||||||
                       resultats_region={resultatsZone} listes={listes} blocs={blocs} nuances={nuances}
 | 
					      return zone.id
 | 
				
			||||||
                       grouperParBloc={grouperParBloc}/>)}
 | 
					    else
 | 
				
			||||||
    </>
 | 
					      return ""
 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  else if (typeZone === "departements") {
 | 
					 | 
				
			||||||
    return <>
 | 
					 | 
				
			||||||
      {resultatsZones.filter(resultatsZone => resultatsZone.geometry['type']).map(resultatsZone =>
 | 
					 | 
				
			||||||
        <DepartementGeoJSON key={resultatsZone.departement.code_insee}
 | 
					 | 
				
			||||||
                       resultats_departement={resultatsZone} listes={listes} blocs={blocs} nuances={nuances}
 | 
					 | 
				
			||||||
                       grouperParBloc={grouperParBloc}/>)}
 | 
					 | 
				
			||||||
    </>
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return <>
 | 
				
			||||||
 | 
					    {resultatsZones.filter(resultatsZone => resultatsZone.geometry['type']).map(resultatsZone =>
 | 
				
			||||||
 | 
					      <ZoneGeoJSON key={getZoneIdentifier(resultatsZone[typeZone])}
 | 
				
			||||||
 | 
					                   resultatsZone={resultatsZone} typeZone={typeZone} listes={listes} blocs={blocs} nuances={nuances}
 | 
				
			||||||
 | 
					                   grouperParBloc={grouperParBloc}/>)}
 | 
				
			||||||
 | 
					  </>
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function Carte({typeResultats, resultats, listes, blocs, nuances, grouperParBloc = false}) {
 | 
					function Carte({typeResultats, resultats, typeZone, listes, blocs, nuances, grouperParBloc = false}) {
 | 
				
			||||||
  const center = [46.603354, 1.888334]
 | 
					  const center = [46.603354, 1.888334]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return <>
 | 
					  return <>
 | 
				
			||||||
@@ -289,13 +257,50 @@ function Carte({typeResultats, resultats, listes, blocs, nuances, grouperParBloc
 | 
				
			|||||||
        attribution='© Les contributeur⋅rices <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>'
 | 
					        attribution='© Les contributeur⋅rices <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>'
 | 
				
			||||||
        url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
 | 
					        url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
 | 
				
			||||||
      />
 | 
					      />
 | 
				
			||||||
      <ContenuCarte typeResultats={typeResultats} resultats={resultats} listes={listes} blocs={blocs} nuances={nuances} grouperParBloc={grouperParBloc} />
 | 
					      <ContenuCarte typeResultats={typeResultats} resultats={resultats} typeZone={typeZone} listes={listes} blocs={blocs} nuances={nuances} grouperParBloc={grouperParBloc} />
 | 
				
			||||||
  </MapContainer>
 | 
					  </MapContainer>
 | 
				
			||||||
  </>
 | 
					  </>
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default function Election2024({typeResultats = "france"}) {
 | 
					function SelectionAffichage({typeResultats, typeZone, setTypeZone}) {
 | 
				
			||||||
  const {zoneId} = useParams()
 | 
					  const items = useMemo(() => {
 | 
				
			||||||
 | 
					    const items = []
 | 
				
			||||||
 | 
					    if (typeResultats === "france") {
 | 
				
			||||||
 | 
					      setTypeZone("region")
 | 
				
			||||||
 | 
					      items.push(<MenuItem value="region">Région</MenuItem>)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (typeResultats === "france" || typeResultats === "region") {
 | 
				
			||||||
 | 
					      if (typeResultats !== "france")
 | 
				
			||||||
 | 
					        setTypeZone("departement")
 | 
				
			||||||
 | 
					      items.push(<MenuItem value="departement">Département</MenuItem>)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (typeResultats === "france" || typeResultats === "region" || typeResultats === "departement") {
 | 
				
			||||||
 | 
					      if (typeResultats !== "france" && typeResultats !== "region")
 | 
				
			||||||
 | 
					        setTypeZone("circonscription")
 | 
				
			||||||
 | 
					      items.push(<MenuItem value="circonscription">Circonscription</MenuItem>)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (typeResultats === "departement") {
 | 
				
			||||||
 | 
					      items.push(<MenuItem value="commune">Communes</MenuItem>)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (typeResultats === "circonscription" || typeResultats === "commune") {
 | 
				
			||||||
 | 
					      setTypeZone("bureau_vote")
 | 
				
			||||||
 | 
					      items.push(<MenuItem value="bureau_vote">Bureau de vote</MenuItem>)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return items
 | 
				
			||||||
 | 
					  }, [typeResultats, setTypeZone])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return <Select value={typeZone} onChange={event => setTypeZone(event.target.value)}>
 | 
				
			||||||
 | 
					    {items}
 | 
				
			||||||
 | 
					  </Select>
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default function Election2024() {
 | 
				
			||||||
 | 
					  const {typeResultats, zoneId} = useParams()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const [zoneName, setZoneName] = useState("France")
 | 
					  const [zoneName, setZoneName] = useState("France")
 | 
				
			||||||
  const [grouperParBloc, setGrouperParBloc] = useState(false)
 | 
					  const [grouperParBloc, setGrouperParBloc] = useState(false)
 | 
				
			||||||
@@ -312,6 +317,7 @@ export default function Election2024({typeResultats = "france"}) {
 | 
				
			|||||||
  const [categoriesVoix, setCategoriesVoix] = useState([])
 | 
					  const [categoriesVoix, setCategoriesVoix] = useState([])
 | 
				
			||||||
  const [dataVoix, setDataVoix] = useState([])
 | 
					  const [dataVoix, setDataVoix] = useState([])
 | 
				
			||||||
  const [dataSieges, setDataSieges] = useState([])
 | 
					  const [dataSieges, setDataSieges] = useState([])
 | 
				
			||||||
 | 
					  const [typeZone, setTypeZone] = useState("region")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  useEffect(() => {
 | 
					  useEffect(() => {
 | 
				
			||||||
    fetch("/data/resultats/europeennes2024/blocs.json").then(response => response.json())
 | 
					    fetch("/data/resultats/europeennes2024/blocs.json").then(response => response.json())
 | 
				
			||||||
@@ -336,19 +342,22 @@ export default function Election2024({typeResultats = "france"}) {
 | 
				
			|||||||
      setZoneName("")
 | 
					      setZoneName("")
 | 
				
			||||||
    else if (typeResultats === "france")
 | 
					    else if (typeResultats === "france")
 | 
				
			||||||
      setZoneName("France")
 | 
					      setZoneName("France")
 | 
				
			||||||
    else if (typeResultats === "regions")
 | 
					    else if (typeResultats === "region")
 | 
				
			||||||
      setZoneName(`Région ${resultats.region.nom}`)
 | 
					      setZoneName(`Région ${resultats.region.nom}`)
 | 
				
			||||||
    else if (typeResultats === "departements")
 | 
					    else if (typeResultats === "departement")
 | 
				
			||||||
      setZoneName(`Département ${resultats.departement.nom}`)
 | 
					      setZoneName(`Département ${resultats.departement.nom}`)
 | 
				
			||||||
    else if (typeResultats === "circonscriptions")
 | 
					    else if (typeResultats === "circonscription")
 | 
				
			||||||
      setZoneName(`Circonscription ${resultats.circonscription.nom}`)
 | 
					      setZoneName(`Circonscription ${resultats.circonscription.id}`)
 | 
				
			||||||
    else if (typeResultats === "communes")
 | 
					    else if (typeResultats === "commune")
 | 
				
			||||||
      setZoneName(`Commune ${resultats.commune.nom}`)
 | 
					      setZoneName(`Commune ${resultats.commune.nom}`)
 | 
				
			||||||
    else if (typeResultats === "bureaux_vote")
 | 
					    else if (typeResultats === "bureau_vote")
 | 
				
			||||||
      setZoneName(resultats.bureau_vote.libelle)
 | 
					      setZoneName(resultats.bureau_vote.libelle)
 | 
				
			||||||
  }, [typeResultats, resultats])
 | 
					  }, [typeResultats, resultats])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  useEffect(() => {
 | 
					  useEffect(() => {
 | 
				
			||||||
 | 
					    if (!resultats['voix_listes'])
 | 
				
			||||||
 | 
					      return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const parBloc = {}
 | 
					    const parBloc = {}
 | 
				
			||||||
    const parNuance = {}
 | 
					    const parNuance = {}
 | 
				
			||||||
    for (let bloc of blocs) {
 | 
					    for (let bloc of blocs) {
 | 
				
			||||||
@@ -387,6 +396,9 @@ export default function Election2024({typeResultats = "france"}) {
 | 
				
			|||||||
  }, [voixParBloc, voixParNuance, grouperParBloc])
 | 
					  }, [voixParBloc, voixParNuance, grouperParBloc])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  useEffect(() => {
 | 
					  useEffect(() => {
 | 
				
			||||||
 | 
					    if (!resultats['voix_listes'])
 | 
				
			||||||
 | 
					      return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const MAX_SIEGES = 81
 | 
					    const MAX_SIEGES = 81
 | 
				
			||||||
    const sieges = {}
 | 
					    const sieges = {}
 | 
				
			||||||
    const listesElues = []
 | 
					    const listesElues = []
 | 
				
			||||||
@@ -537,6 +549,10 @@ export default function Election2024({typeResultats = "france"}) {
 | 
				
			|||||||
    />
 | 
					    />
 | 
				
			||||||
    <ResultatsTable blocs={blocs} nuances={nuances} listes={listes} resultats={resultats} siegesParListe={siegesParListe} />
 | 
					    <ResultatsTable blocs={blocs} nuances={nuances} listes={listes} resultats={resultats} siegesParListe={siegesParListe} />
 | 
				
			||||||
    <ParticipationTable resultats={resultats} />
 | 
					    <ParticipationTable resultats={resultats} />
 | 
				
			||||||
    <Carte typeResultats={typeResultats} resultats={resultats} listes={listes} blocs={blocs} nuances={nuances} voixParBloc={voixParBloc} voixParNuance={voixParNuance} grouperParBloc={grouperParBloc} />
 | 
					    <FormGroup>
 | 
				
			||||||
 | 
					      <FormControlLabel control={<SelectionAffichage typeResultats={typeResultats} typeZone={typeZone} setTypeZone={setTypeZone} />}
 | 
				
			||||||
 | 
					                        label="Type d'affichage pour la carte" />
 | 
				
			||||||
 | 
					    </FormGroup>
 | 
				
			||||||
 | 
					    <Carte typeResultats={typeResultats} resultats={resultats} typeZone={typeZone} listes={listes} blocs={blocs} nuances={nuances} voixParBloc={voixParBloc} voixParNuance={voixParNuance} grouperParBloc={grouperParBloc} />
 | 
				
			||||||
  </>
 | 
					  </>
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,6 +27,7 @@ class Departement(Base):
 | 
				
			|||||||
    geometry: Mapped[dict] = mapped_column(JSON())
 | 
					    geometry: Mapped[dict] = mapped_column(JSON())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    region: Mapped[Region] = relationship(Region, back_populates="departements")
 | 
					    region: Mapped[Region] = relationship(Region, back_populates="departements")
 | 
				
			||||||
 | 
					    circonscriptions: Mapped[List["Circonscription"]] = relationship("Circonscription", back_populates="departement")
 | 
				
			||||||
    communes: Mapped[List["Commune"]] = relationship("Commune", back_populates="departement")
 | 
					    communes: Mapped[List["Commune"]] = relationship("Commune", back_populates="departement")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    resultats2024 = relationship("ResultatsDepartement", back_populates="departement")
 | 
					    resultats2024 = relationship("ResultatsDepartement", back_populates="departement")
 | 
				
			||||||
@@ -54,7 +55,7 @@ class Circonscription(Base):
 | 
				
			|||||||
    numero: Mapped[int] = mapped_column(Integer())
 | 
					    numero: Mapped[int] = mapped_column(Integer())
 | 
				
			||||||
    geometry: Mapped[dict] = mapped_column(JSON())
 | 
					    geometry: Mapped[dict] = mapped_column(JSON())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    departement: Mapped[Departement] = relationship(Departement)
 | 
					    departement: Mapped[Departement] = relationship(Departement, back_populates="circonscriptions")
 | 
				
			||||||
    bureaux_vote: Mapped[List["BureauVote"]] = relationship("BureauVote", back_populates="circonscription")
 | 
					    bureaux_vote: Mapped[List["BureauVote"]] = relationship("BureauVote", back_populates="circonscription")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    resultats2024 = relationship("ResultatsCirconscription", back_populates="circonscription")
 | 
					    resultats2024 = relationship("ResultatsCirconscription", back_populates="circonscription")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -140,7 +140,7 @@ def exporter_resultats_regions(engine: Engine, verbose: bool = False) -> None:
 | 
				
			|||||||
            for voix_liste in resultats_region.voix_listes:
 | 
					            for voix_liste in resultats_region.voix_listes:
 | 
				
			||||||
                resultats_listes[voix_liste.liste.numero] = voix_liste.voix
 | 
					                resultats_listes[voix_liste.liste.numero] = voix_liste.voix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            file = DATA_DIR / "resultats" / "europeennes2024" / "regions" / f"{region.code_insee}.json"
 | 
					            file = DATA_DIR / "resultats" / "europeennes2024" / "region" / f"{region.code_insee}.json"
 | 
				
			||||||
            if not file.parent.is_dir():
 | 
					            if not file.parent.is_dir():
 | 
				
			||||||
                file.parent.mkdir(parents=True)
 | 
					                file.parent.mkdir(parents=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -149,7 +149,7 @@ def exporter_resultats_regions(engine: Engine, verbose: bool = False) -> None:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        session.commit()
 | 
					        session.commit()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    regions_file = DATA_DIR / "resultats" / "europeennes2024" / "regions" / "regions.json"
 | 
					    regions_file = DATA_DIR / "resultats" / "europeennes2024" / "region" / "regions.json"
 | 
				
			||||||
    if not regions_file.parent.is_dir():
 | 
					    if not regions_file.parent.is_dir():
 | 
				
			||||||
        regions_file.parent.mkdir(parents=True)
 | 
					        regions_file.parent.mkdir(parents=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -166,6 +166,7 @@ def exporter_resultats_departements(engine: Engine, verbose: bool = False) -> No
 | 
				
			|||||||
        for departement in iterator:
 | 
					        for departement in iterator:
 | 
				
			||||||
            departement_json = {'code_insee': departement.code_insee, 'nom': departement.libelle,
 | 
					            departement_json = {'code_insee': departement.code_insee, 'nom': departement.libelle,
 | 
				
			||||||
                                'region': departement.region_code,
 | 
					                                'region': departement.region_code,
 | 
				
			||||||
 | 
					                                'circonscriptions': [circo.id for circo in departement.circonscriptions],
 | 
				
			||||||
                                'communes': [commune.code_insee for commune in departement.communes]}
 | 
					                                'communes': [commune.code_insee for commune in departement.communes]}
 | 
				
			||||||
            departements_json.append(departement_json)
 | 
					            departements_json.append(departement_json)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -194,7 +195,7 @@ def exporter_resultats_departements(engine: Engine, verbose: bool = False) -> No
 | 
				
			|||||||
            for voix_liste in resultats_departement.voix_listes:
 | 
					            for voix_liste in resultats_departement.voix_listes:
 | 
				
			||||||
                resultats_listes[voix_liste.liste.numero] = voix_liste.voix
 | 
					                resultats_listes[voix_liste.liste.numero] = voix_liste.voix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            file = DATA_DIR / "resultats" / "europeennes2024" / "departements" / f"{departement.code_insee}.json"
 | 
					            file = DATA_DIR / "resultats" / "europeennes2024" / "departement" / f"{departement.code_insee}.json"
 | 
				
			||||||
            if not file.parent.is_dir():
 | 
					            if not file.parent.is_dir():
 | 
				
			||||||
                file.parent.mkdir(parents=True)
 | 
					                file.parent.mkdir(parents=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -203,7 +204,7 @@ def exporter_resultats_departements(engine: Engine, verbose: bool = False) -> No
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        session.commit()
 | 
					        session.commit()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    departements_file = DATA_DIR / "resultats" / "europeennes2024" / "departements" / "departements.json"
 | 
					    departements_file = DATA_DIR / "resultats" / "europeennes2024" / "departement" / "departements.json"
 | 
				
			||||||
    if not departements_file.parent.is_dir():
 | 
					    if not departements_file.parent.is_dir():
 | 
				
			||||||
        departements_file.parent.mkdir(parents=True)
 | 
					        departements_file.parent.mkdir(parents=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -248,7 +249,7 @@ def exporter_resultats_circonscriptions(engine: Engine, verbose: bool = False) -
 | 
				
			|||||||
            for voix_liste in resultats_circonscription.voix_listes:
 | 
					            for voix_liste in resultats_circonscription.voix_listes:
 | 
				
			||||||
                resultats_listes[voix_liste.liste.numero] = voix_liste.voix
 | 
					                resultats_listes[voix_liste.liste.numero] = voix_liste.voix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            file = DATA_DIR / "resultats" / "europeennes2024" / "circonscriptions" / f"{circonscription.id}.json"
 | 
					            file = DATA_DIR / "resultats" / "europeennes2024" / "circonscription" / f"{circonscription.id}.json"
 | 
				
			||||||
            if not file.parent.is_dir():
 | 
					            if not file.parent.is_dir():
 | 
				
			||||||
                file.parent.mkdir(parents=True)
 | 
					                file.parent.mkdir(parents=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -257,7 +258,7 @@ def exporter_resultats_circonscriptions(engine: Engine, verbose: bool = False) -
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        session.commit()
 | 
					        session.commit()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    circonscriptions_file = DATA_DIR / "resultats" / "europeennes2024" / "circonscriptions" / "circonscriptions.json"
 | 
					    circonscriptions_file = DATA_DIR / "resultats" / "europeennes2024" / "circonscription" / "circonscriptions.json"
 | 
				
			||||||
    if not circonscriptions_file.parent.is_dir():
 | 
					    if not circonscriptions_file.parent.is_dir():
 | 
				
			||||||
        circonscriptions_file.parent.mkdir(parents=True)
 | 
					        circonscriptions_file.parent.mkdir(parents=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -302,7 +303,7 @@ def exporter_resultats_communes(engine: Engine, verbose: bool = False) -> None:
 | 
				
			|||||||
            for voix_liste in resultats_commune.voix_listes:
 | 
					            for voix_liste in resultats_commune.voix_listes:
 | 
				
			||||||
                resultats_listes[voix_liste.liste.numero] = voix_liste.voix
 | 
					                resultats_listes[voix_liste.liste.numero] = voix_liste.voix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            file = DATA_DIR / "resultats" / "europeennes2024" / "communes" / f"{commune.code_insee}.json"
 | 
					            file = DATA_DIR / "resultats" / "europeennes2024" / "commune" / f"{commune.code_insee}.json"
 | 
				
			||||||
            if not file.parent.is_dir():
 | 
					            if not file.parent.is_dir():
 | 
				
			||||||
                file.parent.mkdir(parents=True)
 | 
					                file.parent.mkdir(parents=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -311,7 +312,7 @@ def exporter_resultats_communes(engine: Engine, verbose: bool = False) -> None:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        session.commit()
 | 
					        session.commit()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    communes_file = DATA_DIR / "resultats" / "europeennes2024" / "communes" / "communes.json"
 | 
					    communes_file = DATA_DIR / "resultats" / "europeennes2024" / "commune" / "communes.json"
 | 
				
			||||||
    if not communes_file.parent.is_dir():
 | 
					    if not communes_file.parent.is_dir():
 | 
				
			||||||
        communes_file.parent.mkdir(parents=True)
 | 
					        communes_file.parent.mkdir(parents=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -357,7 +358,7 @@ def exporter_resultats_bureaux_vote(engine: Engine, verbose: bool = False) -> No
 | 
				
			|||||||
            for voix_liste in resultats_bureau_vote.voix_listes:
 | 
					            for voix_liste in resultats_bureau_vote.voix_listes:
 | 
				
			||||||
                resultats_listes[voix_liste.liste.numero] = voix_liste.voix
 | 
					                resultats_listes[voix_liste.liste.numero] = voix_liste.voix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            file = DATA_DIR / "resultats" / "europeennes2024" / "bureaux_vote" / f"{bureau_vote.id}.json"
 | 
					            file = DATA_DIR / "resultats" / "europeennes2024" / "bureau_vote" / f"{bureau_vote.id}.json"
 | 
				
			||||||
            if not file.parent.is_dir():
 | 
					            if not file.parent.is_dir():
 | 
				
			||||||
                file.parent.mkdir(parents=True)
 | 
					                file.parent.mkdir(parents=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -366,7 +367,7 @@ def exporter_resultats_bureaux_vote(engine: Engine, verbose: bool = False) -> No
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        session.commit()
 | 
					        session.commit()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bureaux_vote_file = DATA_DIR / "resultats" / "europeennes2024" / "bureaux_vote" / "bureaux_vote.json"
 | 
					    bureaux_vote_file = DATA_DIR / "resultats" / "europeennes2024" / "bureau_vote" / "bureaux_vote.json"
 | 
				
			||||||
    if not bureaux_vote_file.parent.is_dir():
 | 
					    if not bureaux_vote_file.parent.is_dir():
 | 
				
			||||||
        bureaux_vote_file.parent.mkdir(parents=True)
 | 
					        bureaux_vote_file.parent.mkdir(parents=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user