From 59398d14babf378fbfccae46d1028209ce1f0f4d Mon Sep 17 00:00:00 2001 From: Tykayn Date: Thu, 26 Jun 2025 19:18:29 +0200 Subject: [PATCH] =?UTF-8?q?up=20score=20compl=C3=A9tion=20normalis=C3=A9?= =?UTF-8?q?=20dans=20le=20podium?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/app.js | 40 +++++++++++--- assets/styles/app.css | 5 ++ assets/utils.js | 8 ++- src/Controller/AdminController.php | 53 ++++++++++++------- .../admin/podium_contributeurs_osm.html.twig | 20 ++++++- templates/admin/stats.html.twig | 13 ++++- templates/public/home.html.twig | 11 ++-- templates/public/nav.html.twig | 2 +- 8 files changed, 116 insertions(+), 36 deletions(-) diff --git a/assets/app.js b/assets/app.js index 446c5c0..5e941e3 100644 --- a/assets/app.js +++ b/assets/app.js @@ -37,7 +37,8 @@ import { updateMapHeightForLargeScreens } from './utils.js'; // import Tablesort from 'tablesort'; -// import TableSort from 'table-sort-js/table-sort.js'; +import TableSort from 'table-sort-js/table-sort.js'; +console.log('TableSort', TableSort) // Charger table-sortable (version non minifiée locale) // import '../assets/js/table-sortable.js'; @@ -61,7 +62,7 @@ document.addEventListener('DOMContentLoaded', () => { if(updateMapHeightForLargeScreens){ - updateMapHeightForLargeScreens(); + window.addEventListener('resize', updateMapHeightForLargeScreens); } @@ -195,13 +196,19 @@ document.addEventListener('DOMContentLoaded', () => { }); } - enableLabourageForm(); + if(enableLabourageForm){ + + enableLabourageForm(); + } adjustListGroupFontSize('.list-group-item'); // Activer le tri naturel sur tous les tableaux avec la classe table-sort - // document.querySelectorAll('table.table-sort').forEach(table => { - // new TableSort(table); - // }); + if(TableSort){ + + document.querySelectorAll('table.table-sort')?.forEach(table => { + new TableSort(table); + }); + } // Initialisation du tri et filtrage sur les tableaux du dashboard et de la page stats // if (document.querySelector('#dashboard-table')) { @@ -244,4 +251,25 @@ document.addEventListener('DOMContentLoaded', () => { } }); } + + // Ajouter un écouteur pour l'événement 'load' de MapLibre afin d'ajuster la hauteur de la carte + if (window.maplibregl && document.getElementById('map')) { + // On suppose que la carte est initialisée ailleurs et accessible via window.mapInstance + // Sinon, on peut essayer de détecter l'instance automatiquement + let mapInstance = window.mapInstance; + if (!mapInstance && window.maplibreMap) { + mapInstance = window.maplibreMap; + } + // Si l'instance n'est pas trouvée, essayer de la récupérer via une variable globale courante + if (!mapInstance && window.map) { + mapInstance = window.map; + } + if (mapInstance && typeof mapInstance.on === 'function') { + mapInstance.on('load', function() { + updateMapHeightForLargeScreens(); + }); + } + } + //updateMapHeightForLargeScreens(); + }); diff --git a/assets/styles/app.css b/assets/styles/app.css index fc7f949..d4ac0bc 100644 --- a/assets/styles/app.css +++ b/assets/styles/app.css @@ -140,6 +140,11 @@ img { max-height: 400px; } + +#completionHistoryChart{ + min-height: 500px; +} + @media (max-width: 768px) { .form-label { margin-bottom: 0.5rem; diff --git a/assets/utils.js b/assets/utils.js index 616e643..5abf5ad 100644 --- a/assets/utils.js +++ b/assets/utils.js @@ -99,8 +99,10 @@ async function searchInseeCode(query) { export function updateMapHeightForLargeScreens() { const mapFound = document.querySelector('#map'); + const canvasFound = document.querySelector('#map canvas'); + const newHeight = window.innerHeight * 0.5 + 'px' if (mapFound && window.innerHeight > 800 && window.innerWidth > 800) { - mapFound.style.height = window.innerWidth * 0.8 + 'px'; + mapFound.style.height = newHeight; } else { console.log('window.innerHeight', window.innerHeight); } @@ -188,8 +190,12 @@ export function enableLabourageForm() { // Soumettre le formulaire form.submit(); } + }else{ + console.warn('pas de form pour labourage trouvé') } }); + }else{ + console.warn('pas de labourage citySearchInput citySuggestionsList trouvé', citySearchInput,citySuggestionsList ) } } diff --git a/src/Controller/AdminController.php b/src/Controller/AdminController.php index 3b8fbdd..4015981 100644 --- a/src/Controller/AdminController.php +++ b/src/Controller/AdminController.php @@ -1119,37 +1119,52 @@ public function podiumContributeursOsm(): Response // On suppose que le champ "osmUser" existe sur l'entité Place $placeRepo = $this->entityManager->getRepository(\App\Entity\Place::class); - // Récupérer les 10 contributeurs OSM les plus actifs (par nombre de lieux) + // Nouvelle requête groupée pour tout calculer d'un coup $qb = $placeRepo->createQueryBuilder('p') - ->select('p.osm_user, COUNT(p.id) as nb') + ->select( + 'p.osm_user', + 'COUNT(p.id) as nb', + 'AVG((CASE WHEN p.has_opening_hours = true THEN 1 ELSE 0 END) +' + . ' (CASE WHEN p.has_address = true THEN 1 ELSE 0 END) +' + . ' (CASE WHEN p.has_website = true THEN 1 ELSE 0 END) +' + . ' (CASE WHEN p.has_wheelchair = true THEN 1 ELSE 0 END) +' + . ' (CASE WHEN p.has_note = true THEN 1 ELSE 0 END)) / 5 * 100 as completion_moyen' + ) ->where('p.osm_user IS NOT NULL') ->andWhere("p.osm_user != ''") ->groupBy('p.osm_user') ->orderBy('nb', 'DESC') - ->setMaxResults(300); + ->setMaxResults(100); $podium = $qb->getQuery()->getResult(); - // Pour chaque utilisateur, calculer le score de complétion moyen + // Calcul du score pondéré et normalisation + $maxPondere = 0; foreach ($podium as &$row) { - $osmUser = $row['osm_user']; - // Récupérer toutes les places de cet utilisateur - $places = $placeRepo->createQueryBuilder('p') - ->where('p.osm_user = :osm_user') - ->setParameter('osm_user', $osmUser) - ->getQuery()->getResult(); - $total = 0; - $sum = 0; - foreach ($places as $place) { - $score = $place->getCompletionPercentage(); - if ($score !== null) { - $sum += $score; - $total++; - } + $row['completion_moyen'] = $row['completion_moyen'] !== null ? round($row['completion_moyen'], 1) : null; + $row['completion_pondere'] = ($row['completion_moyen'] !== null && $row['nb'] > 0) + ? round($row['completion_moyen'] * $row['nb'], 1) + : null; + if ($row['completion_pondere'] !== null && $row['completion_pondere'] > $maxPondere) { + $maxPondere = $row['completion_pondere']; } - $row['completion_moyen'] = $total > 0 ? round($sum / $total, 1) : null; } unset($row); + // Normalisation des scores pondérés entre 0 et 100 + if ($maxPondere > 0) { + foreach ($podium as &$row) { + if ($row['completion_pondere'] !== null) { + $row['completion_pondere_normalisee'] = round($row['completion_pondere'] / $maxPondere * 100, 1); + } else { + $row['completion_pondere_normalisee'] = null; + } + } + unset($row); + } + // Tri décroissant sur le score normalisé + usort($podium, function($a, $b) { + return ($b['completion_pondere_normalisee'] ?? 0) <=> ($a['completion_pondere_normalisee'] ?? 0); + }); return $this->render('admin/podium_contributeurs_osm.html.twig', [ 'podium' => $podium diff --git a/templates/admin/podium_contributeurs_osm.html.twig b/templates/admin/podium_contributeurs_osm.html.twig index f84d8fb..b0174bd 100644 --- a/templates/admin/podium_contributeurs_osm.html.twig +++ b/templates/admin/podium_contributeurs_osm.html.twig @@ -5,7 +5,7 @@ {% block body %}

Podium des contributeurs OSM

-

Voici les 10 contributeurs OpenStreetMap ayant ajouté ou modifié le plus de lieux dans la base :

+

Voici les 10 contributeurs OpenStreetMap ayant ajouté ou modifié le plus de lieux dans la base, pondérés de la complétion moyenne des lieux :

Le score de complétion moyen correspond à la moyenne du taux de complétion des lieux ajoutés ou modifiés par chaque contributeur.

@@ -14,6 +14,8 @@ + + @@ -33,9 +35,23 @@ N/A {% endif %} + + {% else %} - + {% endfor %}
Utilisateur OSM Nombre de lieux Score de complétion moyenScore de complétion pondéréScore pondéré normalisé (0-100)
+ {% if row.completion_pondere is not null %} + {{ row.completion_pondere }} + {% else %} + N/A + {% endif %} + + {% if row.completion_pondere_normalisee is not null %} + {{ row.completion_pondere_normalisee }} + {% else %} + N/A + {% endif %} +
Aucun contributeur trouvé.
Aucun contributeur trouvé.
diff --git a/templates/admin/stats.html.twig b/templates/admin/stats.html.twig index 655223a..c67866f 100644 --- a/templates/admin/stats.html.twig +++ b/templates/admin/stats.html.twig @@ -232,7 +232,15 @@
+ +
+ +
+ +
+ +
Fréquence des mises à jour par trimestre pour {{stats.name}} @@ -241,6 +249,9 @@
+
+
+
Données OpenStreetMap @@ -263,7 +274,7 @@
- + {# #} {% include 'admin/stats/table-head.html.twig' %} diff --git a/templates/public/home.html.twig b/templates/public/home.html.twig index bdca319..fba4706 100644 --- a/templates/public/home.html.twig +++ b/templates/public/home.html.twig @@ -130,10 +130,10 @@ {{ parent() }} {# #}