add local mapbox script, update objects

This commit is contained in:
Tykayn 2025-06-04 00:16:56 +02:00 committed by tykayn
parent c6e05463b1
commit b1f6433b7d
13 changed files with 309 additions and 182 deletions

View file

@ -33,10 +33,18 @@ table.js-sort-table th:active {
background-color: #e0e0e0; background-color: #e0e0e0;
} }
#mapLoader {
position: relative;
top: 200px;
left: 50%;
z-index: 100;
}
.maplibregl-popup-content { .maplibregl-popup-content {
overflow-y: auto; overflow: auto;
min-width: 300px; min-width: 300px;
max-height: 400px; max-height: 400px;
} }
.maplibregl-popup-content h1, .maplibregl-popup-content h1,

View file

@ -0,0 +1,41 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20250603172628 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql(<<<'SQL'
ALTER TABLE place ADD lat INT DEFAULT NULL
SQL);
$this->addSql(<<<'SQL'
ALTER TABLE place ADD lon INT DEFAULT NULL
SQL);
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql(<<<'SQL'
ALTER TABLE place DROP lat
SQL);
$this->addSql(<<<'SQL'
ALTER TABLE place DROP lon
SQL);
}
}

File diff suppressed because one or more lines are too long

View file

@ -92,6 +92,10 @@ final class AdminController extends AbstractController
} }
/**
* rediriger vers l'url unique quand on est admin
*/
#[Route('/admin/commerce/{id}', name: 'app_admin_commerce')] #[Route('/admin/commerce/{id}', name: 'app_admin_commerce')]
public function commerce(int $id): Response public function commerce(int $id): Response
{ {
@ -115,6 +119,10 @@ final class AdminController extends AbstractController
]); ]);
} }
/**
* récupérer les commerces de la zone, créer les nouveaux lieux, et mettre à jour les existants
*/
#[Route('/admin/labourer/{zip_code}', name: 'app_admin_labourer')] #[Route('/admin/labourer/{zip_code}', name: 'app_admin_labourer')]
public function labourer_zone(string $zip_code): Response public function labourer_zone(string $zip_code): Response
{ {
@ -122,16 +130,21 @@ final class AdminController extends AbstractController
$results = $this->motocultrice->labourer($zip_code); $results = $this->motocultrice->labourer($zip_code);
// Récupérer les commerces existants dans la base de données pour cette zone
$commerces = $this->entityManager->getRepository(Place::class)->findBy(['zip_code' => $zip_code]);
// Récupérer ou créer les stats pour cette zone // Récupérer ou créer les stats pour cette zone
$stats = $this->entityManager->getRepository(Stats::class)->findOneBy(['zone' => $zip_code]); $stats = $this->entityManager->getRepository(Stats::class)->findOneBy(['zone' => $zip_code]);
if (!$stats) { if (!$stats) {
$stats = new Stats(); $stats = new Stats();
$stats->setZone($zip_code); $stats->setZone($zip_code);
// Récupérer les commerces existants dans la base de données pour cette zone
}
$commerces = $stats->getPlaces();
// for commerce, set stats // for commerce, set stats
foreach ($commerces as $commerce) { foreach ($commerces as $commerce) {
$commerce->setStats($stats); $commerce->setStats($stats);
@ -143,8 +156,6 @@ final class AdminController extends AbstractController
$stats->computeCompletionPercent(); $stats->computeCompletionPercent();
$this->entityManager->persist($stats); $this->entityManager->persist($stats);
$this->entityManager->flush(); $this->entityManager->flush();
}
// Si le nom de la zone n'est pas défini, le récupérer via OSM // Si le nom de la zone n'est pas défini, le récupérer via OSM
if (!$stats->getName()) { if (!$stats->getName()) {
$city_name = $this->motocultrice->get_city_osm_from_zip_code($zip_code); $city_name = $this->motocultrice->get_city_osm_from_zip_code($zip_code);
@ -155,9 +166,6 @@ final class AdminController extends AbstractController
} }
} }
$commerces = $this->entityManager->getRepository(Place::class)->findBy(['zip_code' => $zip_code]);
// Initialiser les compteurs // Initialiser les compteurs
$counters = [ $counters = [
'avec_horaires' => 0, 'avec_horaires' => 0,
@ -203,59 +211,80 @@ final class AdminController extends AbstractController
if ($commerces) { if ($commerces) {
// Extraire les osm_object_ids des commerces existants // Extraire les osm_object_ids des commerces existants
$osm_object_ids = array_map(function($commerce) { foreach ($commerces as $commerce) {
return $commerce->getOsmId(); $osm_object_ids[] = $commerce->getOsmKind() . '_' . $commerce->getOsmId();
}, $commerces); }
} }
// pour chaque résultat, vérifier que l'on a pas déjà un commerce avec le même osm_object_id // pour chaque résultat, vérifier que l'on a pas déjà un commerce avec le même osm_object_id
$new_places_list = array_filter($results, function($commerce) use ($osm_object_ids) { $new_places_list = array_filter($results, function($commerce) use ($osm_object_ids) {
return !in_array($commerce['id'], $osm_object_ids); return !in_array($commerce['type'] . '_' . $commerce['id'], $osm_object_ids);
}); });
$existing_places_list = array_filter($results, function($commerce) use ($osm_object_ids) { $existing_places_list = array_filter($results, function($commerce) use ($osm_object_ids) {
return in_array($commerce['id'], $osm_object_ids); return in_array($commerce['type'] . '_' . $commerce['id'], $osm_object_ids);
}); });
$new_places_counter = 0;
// var_dump($osm_object_ids);
// var_dump($new_places_list);
// var_dump($existing_places_list);
// die();
// on crée un commerce pour chaque résultat qui reste // on crée un commerce pour chaque résultat qui reste
foreach ($new_places_list as $np) { foreach ($new_places_list as $np) {
if( !in_array($np['id'] . '_' . $np['type'] , $osm_object_ids )) {
$new_place = new Place(); $new_place = new Place();
$main_tag = $this->motocultrice->find_main_tag($np['tags']); $main_tag = $this->motocultrice->find_main_tag($np['tags']);
$fullMainTag = $main_tag && isset($np['tags'][$main_tag]) ? $main_tag.'='.$np['tags'][$main_tag] : "";
var_dump($fullMainTag);
$new_place $new_place
->setUuidForUrl($this->motocultrice->uuid_create()) ->setUuidForUrl($this->motocultrice->uuid_create())
->setModifiedDate(new \DateTime()) ->setModifiedDate(new \DateTime())
->setStats($stats) ->setStats($stats)
->setDead(false) ->setDead(false)
->setOptedOut(false) ->setOptedOut(false)
->setZipCode($zip_code)
->setOsmId($np['id']) ->setOsmId($np['id'])
->setMainTag($main_tag && isset($np['tags'][$main_tag]) ? $np['tags'][$main_tag] : "") ->setMainTag($fullMainTag)
->setOsmKind($np['type']) ->setOsmKind($np['type'])
->setAskedHumainsSupport(false) ->setAskedHumainsSupport(false)
->setLastContactAttemptDate(null) ->setLastContactAttemptDate(null)
->update_place_from_overpass_data($np); ->update_place_from_overpass_data($np);
$this->entityManager->persist($new_place); $this->entityManager->persist($new_place);
$new_place->setStats($stats);
$stats->addPlace($new_place);
$new_places_counter++;
} }
}
// Mise à jour des commerces existants avec les données Overpass // Mise à jour des commerces existants avec les données Overpass
foreach ($commerces as $existing_places_list) { foreach ($commerces as $existing_place) {
foreach ($results as $result) { foreach ($results as $result) {
if ($existing_places_list->getOsmId() == $result['id'] && $existing_places_list->getOsmKind() == $result['type']) { if ($existing_place->getOsmId() == $result['id'] && $existing_place->getOsmKind() == $result['type']) {
$existing_places_list->update_place_from_overpass_data($result); $existing_place->update_place_from_overpass_data($result);
$this->entityManager->persist($existing_places_list); $existing_place->setStats($stats);
$this->entityManager->persist($existing_place);
break; break;
} }
} }
} }
$this->entityManager->persist($stats);
$this->entityManager->flush(); $this->entityManager->flush();
$stats = $this->entityManager->getRepository(Stats::class)->findOneBy(['zone' => $zip_code]); $stats = $this->entityManager->getRepository(Stats::class)->findOneBy(['zone' => $zip_code]);
return $this->render('admin/labourage_results.html.twig', [ return $this->render('admin/labourage_results.html.twig', [
'results' => $results, 'results' => $results,
'commerces' => $commerces, 'commerces' => $stats->getPlaces(),
'zone' => $zip_code, 'zone' => $zip_code,
'stats' => $stats, 'stats' => $stats,
'new_places_counter' => $new_places_counter,
]); ]);
} }

View file

@ -85,6 +85,12 @@ class Place
#[ORM\Column(nullable: true)] #[ORM\Column(nullable: true)]
private ?\DateTime $displayed_date = null; private ?\DateTime $displayed_date = null;
#[ORM\Column(nullable: true)]
private ?int $lat = null;
#[ORM\Column(nullable: true)]
private ?int $lon = null;
public function getMainTag(): ?string public function getMainTag(): ?string
{ {
return $this->main_tag; return $this->main_tag;
@ -120,6 +126,26 @@ class Place
} }
return round($filled_fields / $total_fields * 100); return round($filled_fields / $total_fields * 100);
} }
public function guess_main_tag(array $tags_converted) {
$main_tag = null;
if (isset($tags_converted['amenity']) && $tags_converted['amenity'] != '') {
$main_tag = 'amenity='.$tags_converted['amenity'];
}
if (isset($tags_converted['shop']) && $tags_converted['shop'] != '') {
$main_tag = 'shop='.$tags_converted['shop'];
}
if (isset($tags_converted['tourism']) && $tags_converted['tourism'] != '') {
$main_tag = 'tourism='.$tags_converted['tourism'];
}
if (isset($tags_converted['office']) && $tags_converted['office'] != '') {
$main_tag = 'office='.$tags_converted['office'];
}
if (isset($tags_converted['healthcare']) && $tags_converted['healthcare'] != '') {
$main_tag = 'healthcare='.$tags_converted['healthcare'];
}
return $main_tag;
}
/** /**
* mettre à jour le lieu selon les tags osm * mettre à jour le lieu selon les tags osm
*/ */
@ -128,7 +154,8 @@ class Place
if ( ! isset($overpass_data['tags']) || $overpass_data['tags'] == null) { if ( ! isset($overpass_data['tags']) || $overpass_data['tags'] == null) {
return; return;
} }
// var_dump($overpass_data); $orignal_overpass_data = $overpass_data;
$overpass_data = array_merge([ $overpass_data = array_merge([
'id' => '', 'id' => '',
'type' => '', 'type' => '',
@ -142,61 +169,35 @@ class Place
'wheelchair' => '', 'wheelchair' => '',
'note' => '' 'note' => ''
], $overpass_data['tags'] ); ], $overpass_data['tags'] );
// var_dump($overpass_data);
if (isset($tags_converted['amenity']) && $tags_converted['amenity'] != '') {
$this->setMainTag('amenity='.$tags_converted['amenity']);
}
if (isset($tags_converted['shop']) && $tags_converted['shop'] != '') {
$this->setMainTag('shop='.$tags_converted['shop']);
}
if (isset($tags_converted['tourism']) && $tags_converted['tourism'] != '') {
$this->setMainTag('tourism='.$tags_converted['tourism']);
}
if (isset($tags_converted['office']) && $tags_converted['office'] != '') {
$this->setMainTag('office='.$tags_converted['office']);
}
if (isset($tags_converted['healthcare']) && $tags_converted['healthcare'] != '') {
$this->setMainTag('healthcare='.$tags_converted['healthcare']);
}
$main_tag = $this->guess_main_tag($orignal_overpass_data['tags']);
if($main_tag){
$this->setMainTag($main_tag);
}
$this $this
// ->setOsmId($overpass_data['id']) ->setOsmId( $orignal_overpass_data['id'])
// ->setOsmKind($overpass_data['type'] ) ->setOsmKind($orignal_overpass_data['type'] )
->setLat($orignal_overpass_data['lat'])
->setLon($orignal_overpass_data['lon'])
->setName(isset($overpass_data['name']) && $overpass_data['name'] != '' ? $overpass_data['name'] : null); ->setName(isset($overpass_data['name']) && $overpass_data['name'] != '' ? $overpass_data['name'] : null);
if (isset($overpass_data['postcode']) && $overpass_data['postcode'] != ''){ $mapping = [
$this->setZipCode($overpass_data['postcode']); ['key' => 'postcode', 'setter' => 'setZipCode', 'source' => $overpass_data],
} ['key' => 'email', 'setter' => 'setEmail', 'source' => $overpass_data],
if (isset($overpass_data['email']) && $overpass_data['email'] != ''){ ['key' => 'opening_hours', 'setter' => 'setHasOpeningHours', 'source' => $overpass_data['tags'] ?? []],
$this->setEmail($overpass_data['email']); ['key' => 'note', 'setter' => 'setNote', 'source' => $overpass_data['tags'] ?? []],
} ['key' => 'addr:housenumber', 'setter' => 'setHasAddress', 'source' => $overpass_data['tags'] ?? []],
if (isset($overpass_data['tags']['opening_hours']) && $overpass_data['opening_hours'] != ''){ ['key' => 'website', 'setter' => 'setHasWebsite', 'source' => $overpass_data['tags'] ?? []],
$this->setHasOpeningHours($overpass_data['opening_hours']); ['key' => 'wheelchair', 'setter' => 'setHasWheelchair', 'source' => $overpass_data['tags'] ?? []],
} ['key' => 'note', 'setter' => 'setHasNote', 'source' => $overpass_data['tags'] ?? []],
if (isset($overpass_data['tags']) && isset($overpass_data['tags']['note']) && $overpass_data['tags']['note'] != ''){ ];
$this->setNote($overpass_data['tags']['note']);
}
if (isset($overpass_data['tags']) && isset($overpass_data['tags']['addr:housenumber']) && $overpass_data['tags']['addr:housenumber'] != ''){
$this->setHasAddress($overpass_data['tags']['addr:housenumber']);
}
if (isset($overpass_data['tags']) && isset($overpass_data['tags']['website']) && $overpass_data['tags']['website'] != ''){
$this->setHasWebsite($overpass_data['tags']['website']);
}
if (isset($overpass_data['tags']) && isset($overpass_data['tags']['wheelchair']) && $overpass_data['tags']['wheelchair'] != ''){
$this->setHasWheelchair($overpass_data['tags']['wheelchair']);
}
if (isset($overpass_data['tags']) && isset($overpass_data['tags']['note']) && $overpass_data['tags']['note'] != ''){
$this->setHasNote($overpass_data['tags']['note']);
}
if (isset($overpass_data['tags']) && isset($overpass_data['tags']['note']) && $overpass_data['tags']['note'] != ''){
$this->setHasNote($overpass_data['tags']['note']);
$this->setNoteContent($overpass_data['tags']['note']);
}
// Remplir les clés attendues avec des valeurs par défaut si non définies
foreach ($mapping as $map) {
if (isset($map['source'][$map['key']]) && $map['source'][$map['key']] !== '') {
$this->{$map['setter']}($map['source'][$map['key']]);
}
}
$this $this
// ->setOsmId($overpass_data['id']) // ->setOsmId($overpass_data['id'])
@ -506,4 +507,28 @@ class Place
return $this; return $this;
} }
public function getLat(): ?int
{
return $this->lat;
}
public function setLat(?int $lat): static
{
$this->lat = $lat;
return $this;
}
public function getLon(): ?int
{
return $this->lon;
}
public function setLon(?int $lon): static
{
$this->lon = $lon;
return $this;
}
} }

View file

@ -25,7 +25,7 @@ class Stats
/** /**
* @var Collection<int, Place> * @var Collection<int, Place>
*/ */
#[ORM\OneToMany(targetEntity: Place::class, mappedBy: 'stats')] #[ORM\OneToMany(targetEntity: Place::class, mappedBy: 'stats', cascade: ['persist', 'remove'])]
private Collection $places; private Collection $places;
// nombre de commerces dans la zone // nombre de commerces dans la zone

View file

@ -9,17 +9,17 @@
</style> </style>
<div class="example-wrapper"> <div class="example-wrapper">
<h1>Labourage fait sur la zone "{{ zone }}" ✅</h1> <h1>Labourage fait sur la zone "{{ stats.zone }} {{stats.name}}" ✅</h1>
<a href="{{ path('app_admin_labourer', {'zip_code': stats.zone}) }}" class="btn btn-primary" id="labourer">Labourer les mises à jour</a> <a href="{{ path('app_admin_labourer', {'zip_code': stats.zone}) }}" class="btn btn-primary" id="labourer">Labourer les mises à jour</a>
<a href="{{ path('app_admin_stats', {'zip_code': stats.zone}) }}" class="btn btn-primary" id="labourer">Voir les résultats</a> <a href="{{ path('app_admin_stats', {'zip_code': stats.zone}) }}" class="btn btn-primary" id="labourer">Voir les résultats</a>
<p> <p>
lieux trouvés en plus: {{ results|length }} lieux trouvés en plus: {{ new_places_counter }}
</p> </p>
{# {{ dump(results) }} #}
<hr> <hr>
<p> <p>
commerces existants déjà en base: {{ commerces|length }} commerces existants déjà en base: {{ commerces|length }}
</p> </p>
@ -30,49 +30,7 @@ commerces existants déjà en base: {{ commerces|length }}
<tbody> <tbody>
{% for commerce in commerces %} {% for commerce in commerces %}
<tr> {% include 'admin/stats/row.html.twig' %}
<td>
{# {{ dump(commerce) }} #}
<a href="{{ path('app_admin_commerce',
{
'id': commerce.id
}
) }}">
{% if commerce.name is not null and commerce.name != '' %}
{{ commerce.name }},
{% else %}
(un lieu sans nom)
{% endif %}
</a>
</td>
<td>
{{ commerce.address }}
</td>
<td>
{{ commerce.email }}
</td>
<td>
{{ commerce.website }}
</td>
<td>
{# {{ commerce.opening_hours }} #}
</td>
<td>
{{ commerce.note }}
</td>
<td>
<a href="https://www.openstreetmap.org/{{ commerce.getOsmKind() }}/{{ commerce.getOsmId() }}" target="_blank">
<i class="bi bi-eye"></i>
voir sur osm</a>
<a href="{{ path('app_admin_delete', {'id': commerce.id}) }}">
<i class="bi bi-trash"></i>
</a>
</td>
</tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>

View file

@ -1,6 +1,7 @@
{% extends 'base.html.twig' %} {% extends 'base.html.twig' %}
{% block title %}{{ 'display.stats'|trans }}{% endblock %} {% block title %}{{ 'display.stats'|trans }}- {{ stats.zone }}
{{ stats.name }} {% endblock %}
{% block stylesheets %} {% block stylesheets %}
{{ parent() }} {{ parent() }}
@ -10,12 +11,15 @@
{% block body %} {% block body %}
<div class="container"> <div class="container">
<div class="mt-4 p-4"> <div class="mt-4 p-4">
<h1 class="title">{{ 'display.stats'|trans }}</h1> <div class="row">
<p> <div class="col-md-6 col-12">
{{ stats.zone }} <h1 class="title">{{ 'display.stats'|trans }} - {{ stats.zone }}
{{ stats.name }} {{ stats.name }} - {{ stats.completionPercent }}% complété</h1>
</p> </div>
<div class="col-md-6 col-12">
<a href="{{ path('app_admin_labourer', {'zip_code': stats.zone}) }}" class="btn btn-primary" id="labourer">Labourer les mises à jour</a> <a href="{{ path('app_admin_labourer', {'zip_code': stats.zone}) }}" class="btn btn-primary" id="labourer">Labourer les mises à jour</a>
</div>
</div>
<div class="row"> <div class="row">
<div class="col-md-3 col-12"> <div class="col-md-3 col-12">
{{ stats.getCompletionPercent() }} % complété sur les critères donnés. {{ stats.getCompletionPercent() }} % complété sur les critères donnés.
@ -41,16 +45,28 @@
</div> </div>
</div> </div>
<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 id="map" style="height: 400px;"></div> <div id="map" style="height: 400px;"></div>
{# <div id="query" style="height: 400px;"> #}
{# <pre>
{{query_places|raw}}
</pre> #}
</div> </div>
<div class="card mt-4"> <div class="card mt-4">
<h1 class="card-title">Tableau des {{ stats.getPlacesCount() }} lieux</h1>
<a href="{{ path('app_admin_export_csv', {'zip_code': stats.zone}) }}" class="btn btn-primary">Exporter en CSV</a> <div class="row">
<div class="col-md-6 col-12">
<h1 class="card-title p-4">Tableau des {{ stats.places |length }} lieux</h1>
</div>
<div class="col-md-6 col-12">
<a class="btn btn-primary pull-right" href="{{ path('app_admin_export_csv', {'zip_code': stats.zone}) }}" class="btn btn-primary">
<i class="bi bi-filetype-csv"></i>
Exporter en CSV
</a>
</div>
</div>
<table class="table table-bordered table-striped table-hover table-responsive"> <table class="table table-bordered table-striped table-hover table-responsive">
{% include 'admin/stats/table-head.html.twig' %} {% include 'admin/stats/table-head.html.twig' %}
<tbody> <tbody>
@ -62,7 +78,7 @@
</div> </div>
<h2>requête overpass</h2> <h2>requête overpass</h2>
<pre> <pre class="p-4 bg-light">
{{query_places|raw}} {{query_places|raw}}
</pre> </pre>
</div> </div>
@ -137,6 +153,9 @@ out skel qt;`;
} }
console.log('map chargé',data.elements); console.log('map chargé',data.elements);
document.getElementById('maploader').classList.add('d-none');
data.elements.forEach(element => { data.elements.forEach(element => {
// Cherche les coordonnées à la racine ou dans center // Cherche les coordonnées à la racine ou dans center
const lat = element.lat || (element.center && element.center.lat); const lat = element.lat || (element.center && element.center.lat);

View file

@ -41,13 +41,19 @@
{% endif %} {% endif %}
{{ commerce.mainTag }} {{ commerce.mainTag }}
</td> </td>
<td class="{{ commerce.hasAddress() ? 'filled' : '' }}">{{ commerce.address }}</td> <td class="{{ commerce.hasAddress() ? 'filled' : '' }}">{{ commerce.address }}</td>
<td class="{{ commerce.hasWebsite() ? 'filled' : '' }}">{{ commerce.website }}</td> <td class="{{ commerce.hasWebsite() ? 'filled' : '' }}">{{ commerce.website }}</td>
<td class="{{ commerce.hasWheelchair() ? 'filled' : '' }}">{{ commerce.wheelchair }}</td> <td class="{{ commerce.hasWheelchair() ? 'filled' : '' }}">{{ commerce.wheelchair }}</td>
<td class="{{ commerce.hasNote() ? 'filled' : '' }}">{{ commerce.note }}</td> <td class="{{ commerce.hasNote() ? 'filled' : '' }}">{{ commerce.note }}</td>
<td class="{{ commerce.noteContent ? 'filled' : '' }}">{{ commerce.noteContent }}</td> <td class="{{ commerce.noteContent ? 'filled' : '' }}">{{ commerce.noteContent }}</td>
<td>
<a href="https://www.openstreetmap.org/{{ commerce.osmKind }}/{{ commerce.osmId }}" target="_blank">
<i class="bi bi-globe"></i>
{{ commerce.osmId }}
</a>
</td>
<td>
{{ commerce.osmKind }}
</td>
</tr> </tr>

View file

@ -24,5 +24,11 @@
<th> <th>
<i class="bi bi-pencil-square"></i> <i class="bi bi-pencil-square"></i>
Texte de la note</th> Texte de la note</th>
<th>
Osm id</th>
<th>
Osm kind</th>
</tr> </tr>
</thead> </thead>

View file

@ -254,7 +254,7 @@ out skel qt;`;
<td> <td>
<a href="{{ path('app_admin_stats', {'zip_code': stat.zone}) }}">{{ stat.zone }} {{ stat.name }}</a> <a href="{{ path('app_admin_stats', {'zip_code': stat.zone}) }}">{{ stat.zone }} {{ stat.name }}</a>
</td> </td>
<td>{{ stat.placesCount }}</td> <td>{{ stat.places |length }}</td>
<td style="background : rgba(0 , 255, 0, {{stat.completionPercent / 100 }} )">{{ stat.completionPercent }}</td> <td style="background : rgba(0 , 255, 0, {{stat.completionPercent / 100 }} )">{{ stat.completionPercent }}</td>
<td> <td>
<a class="btn btn-sm btn-primary" href="{{ path('app_admin_stats', {'zip_code': stat.zone}) }}"><i class="bi bi-eye"></i></a> <a class="btn btn-sm btn-primary" href="{{ path('app_admin_stats', {'zip_code': stat.zone}) }}"><i class="bi bi-eye"></i></a>

View file

@ -111,14 +111,17 @@
<div class="col-12 mt-4"> <div class="col-12 mt-4">
<div class="actions-modification"> <div class="actions-modification">
<a class="btn btn-info" href="{{ path('app_public_index') }}">{{ 'display.contact_humans'|trans }}</a> <a class="btn btn-info" href="{{ path('app_public_index') }}">
<i class="bi bi-people"></i>
{{ 'display.contact_humans'|trans }}
</a>
<button id="showAllFields" class="btn btn-secondary mx-4"> <button id="showAllFields" class="btn btn-secondary mx-4">
<i class="bi bi-eye"></i> <i class="bi bi-eye"></i>
Voir aussi les champs déjà remplis Voir aussi les champs déjà remplis
</button> </button>
<button id="closedCommerce" class="btn btn-danger mx-4"> <button id="closedCommerce" class="btn btn-danger mx-4 mt-4">
<i class="bi bi-x-circle"></i> <i class="bi bi-x-circle"></i>
Je souhaite signaler que ce commerce est fermé Je souhaite signaler que ce commerce est fermé
</button> </button>
@ -128,8 +131,6 @@
</div> </div>
<div class="row justify-content-center mt-4"> <div class="row justify-content-center mt-4">
<div class="col-12 col-lg-10 col-xl-8"> <div class="col-12 col-lg-10 col-xl-8">
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<div class="d-flex flex-column flex-md-row align-items-md-center justify-content-between"> <div class="d-flex flex-column flex-md-row align-items-md-center justify-content-between">
@ -144,9 +145,6 @@
{{ 'display.view_on_osm'|trans }} {{ 'display.view_on_osm'|trans }}
</a> </a>
</div> </div>
<a href="{{ path('app_admin_stats', {'zip_code': zone ?? '-1'}) }}" class="btn btn-outline-secondary"> <a href="{{ path('app_admin_stats', {'zip_code': zone ?? '-1'}) }}" class="btn btn-outline-secondary">
<i class="bi bi-bar-chart"></i> <i class="bi bi-bar-chart"></i>
{{ 'display.view_stats'|trans }} {{ 'display.view_stats'|trans }}
@ -170,12 +168,11 @@
</div> </div>
</div> </div>
</div> </div>
</div> </div>
{% block javascripts %} {% block javascripts %}
{{ parent() }} {{ parent() }}
<script src='https://api.mapbox.com/mapbox-gl-js/v2.15.0/mapbox-gl.js'></script> <script src={{asset('js/mapbox/mapbox-gl.js')}}></script>
<script> <script>
function check_validity(e) { function check_validity(e) {
let errors = []; let errors = [];

View file

@ -4,7 +4,6 @@
{% block stylesheets %} {% block stylesheets %}
{{ parent() }} {{ parent() }}
{# <link href='https://api.mapbox.com/mapbox-gl-js/v2.15.0/mapbox-gl.css' rel='stylesheet' /> #}
{% endblock %} {% endblock %}
{% block body %} {% block body %}
@ -32,18 +31,8 @@
<br> <br>
<a href="{{ path('app_public_index') }}">Retour à la page d'accueil</a> <a href="{{ path('app_public_index') }}">Retour à la page d'accueil</a>
</div> </div>
{# <h2>Tags</h2> #}
{# {{dump(commerce)}} #}
{# {% if commerce.tags_converted."contact:email" is defined %}
<a class="btn btn-primary" href="mailto:{{ commerce.tags_converted."contact:email" }}">C'est mon commerce, le modifier</a>
{% else %}
<a class="btn btn-primary" href="{{ path('app_public_index') }}">C'est mon commerce, pour le modifier je souhaite ajouter mon email de contact</a>
{% endif %} #}
{% endblock %} {% endblock %}
{% block javascripts %} {% block javascripts %}
{{ parent() }} {{ parent() }}
{# <script src='https://api.mapbox.com/mapbox-gl-js/v2.15.0/mapbox-gl.js'></script> #}
{% endblock %} {% endblock %}