harmoniser les décomptes de completion sur la page stats

This commit is contained in:
Tykayn 2025-08-18 12:41:31 +02:00 committed by tykayn
parent b9f57e48b5
commit 060b23f87e
3 changed files with 399 additions and 345 deletions

View file

@ -150,6 +150,60 @@
{{ stats.name }} - {{ stats.completionPercent }}% complété</h1>
</div>
</div>
<div id="carte" class="section-anchor">
<h2>Carte</h2>
<div id="maploader">
<div class="spinner-border" role="status">
<i class="bi bi-load bi-spin"></i>
<span class="visually-hidden">Chargement de la carte...</span>
</div>
</div>
<div class="d-flex justify-content-end mb-2">
<div class="btn-group" role="group">
<button type="button" class="btn btn-outline-primary" id="circleMarkersBtn">
<i class="bi bi-circle"></i> Cercles
</button>
<button type="button" class="btn btn-outline-primary active" id="dropMarkersBtn">
<i class="bi bi-geo-alt"></i> Gouttes
</button>
</div>
<button id="btn-geolocate" class="btn btn-outline-primary btn-sm">
<i class="bi bi-geo-alt"></i> Me localiser
</button>
</div>
<div id="map" style="height: 400px; width: 100%; margin-bottom: 1rem;"></div>
<div id="graphiques" class="section-anchor">
<h2>Graphiques</h2>
<div class="row">
<div class="col-md-6 col-12">
<canvas id="repartition_tags" width="600" height="400"
style="max-width:100%; margin: 20px 0;"></canvas>
</div>
<div class="col-md-6 col-12">
<div class="card">
<div class="card-header">
<i class="bi bi-calendar-event"></i> Fréquence des mises à jour par
trimestre pour {{ stats.name }}
</div>
<div class="card-body">
<canvas id="modificationsByQuarterChart"
style="min-height: 250px; width: 100%;"></canvas>
</div>
</div>
</div>
</div>
</div>
<div id="attribution">
<a href="https://www.openstreetmap.org/copyright">Données OpenStreetMap</a>
</div>
</div>
{% if stats.population %}
<div class="row mb-3">
<div class="col-md-4 col-12">
@ -466,57 +520,6 @@
</div>
<div id="carte" class="section-anchor">
<h2>Carte</h2>
<div id="maploader">
<div class="spinner-border" role="status">
<i class="bi bi-load bi-spin"></i>
<span class="visually-hidden">Chargement de la carte...</span>
</div>
</div>
<div class="d-flex justify-content-end mb-2">
<div class="btn-group" role="group">
<button type="button" class="btn btn-outline-primary" id="circleMarkersBtn">
<i class="bi bi-circle"></i> Cercles
</button>
<button type="button" class="btn btn-outline-primary active" id="dropMarkersBtn">
<i class="bi bi-geo-alt"></i> Gouttes
</button>
</div>
<button id="btn-geolocate" class="btn btn-outline-primary btn-sm">
<i class="bi bi-geo-alt"></i> Me localiser
</button>
</div>
<div id="map" style="height: 400px; width: 100%; margin-bottom: 1rem;"></div>
<div id="graphiques" class="section-anchor">
<h2>Graphiques</h2>
<div class="row">
<div class="col-md-6 col-12">
<canvas id="repartition_tags" width="600" height="400"
style="max-width:100%; margin: 20px 0;"></canvas>
</div>
<div class="col-md-6 col-12">
<div class="card">
<div class="card-header">
<i class="bi bi-calendar-event"></i> Fréquence des mises à jour par
trimestre pour {{ stats.name }}
</div>
<div class="card-body">
<canvas id="modificationsByQuarterChart"
style="min-height: 250px; width: 100%;"></canvas>
</div>
</div>
</div>
</div>
</div>
<div id="attribution">
<a href="https://www.openstreetmap.org/copyright">Données OpenStreetMap</a>
</div>
</div>
<div class="card mt-4">
{% include 'admin/stats_history.html.twig' with {stat: stats} %}
<canvas id="distribution_completion" class="mt-4 mb-4" height="400"></canvas>
@ -718,23 +721,10 @@
document.addEventListener('DOMContentLoaded', function () {
const geojsonData = {{ geojson|raw }};
const map_token = "{{ maptiler_token }}";
// Liste des tags attendus pour la complétion des lieux
const completionTags = {{ completion_tags['places']|json_encode|raw }};
// Calcul de la complétion et des tags manquants pour chaque lieu
// Les valeurs de complétion et tags manquants sont maintenant calculées côté serveur
// et incluses directement dans les données GeoJSON
geojsonData.features.forEach(f => {
let filled = 0;
let missing = [];
if (completionTags && completionTags.length > 0) {
completionTags.forEach(tag => {
if (f.properties && typeof f.properties[tag] !== 'undefined' && f.properties[tag] !== null && f.properties[tag] !== '') {
filled++;
} else {
missing.push(tag);
}
});
}
f.properties.completion = completionTags && completionTags.length > 0 ? Math.round(100 * filled / completionTags.length) : null;
// Correction : toujours un tableau
// Assurons-nous que missing_tags est toujours un tableau
f.properties.missing_tags = Array.isArray(f.properties.missing_tags) ? f.properties.missing_tags : (f.properties.missing_tags ? [f.properties.missing_tags] : []);
});