diff --git a/assets/app.js b/assets/app.js index 02ae233..ea61870 100644 --- a/assets/app.js +++ b/assets/app.js @@ -495,12 +495,14 @@ document.addEventListener('DOMContentLoaded', () => { const historyDiv = document.getElementById('userChangesHistory'); if (historyDiv) { historyDiv.innerHTML = ` +

Changesets créés :

- +
+
Dernières 24h :
${stats.last24h}
+
7 derniers jours :
${stats.last7days}
+
30 derniers jours :
${stats.last30days}
+
+
`; } } @@ -513,5 +515,35 @@ document.addEventListener('DOMContentLoaded', () => { } + + function updateCompletionProgress() { + const inputs = document.querySelectorAll('input[type="text"]'); + let filledInputs = 0; + let totalInputs = inputs.length; + + inputs.forEach(input => { + if (input.value.trim() !== '') { + filledInputs++; + } + }); + + const completionPercentage = (filledInputs / totalInputs) * 100; + const progressBar = document.querySelector('#completion_progress .progress-bar'); + progressBar.style.width = completionPercentage + '%'; + progressBar.setAttribute('aria-valuenow', completionPercentage); + + document.querySelector('#completion_display').innerHTML = `Votre commerce est complété à ${Math.round(completionPercentage)}%`; + } + + document.querySelectorAll('input[type="text"]').forEach(input => { + input.addEventListener('blur', updateCompletionProgress); + }); + + document.querySelector('form').addEventListener('submit', check_validity); + document.addEventListener('DOMContentLoaded', updateCompletionProgress); + + + + }); diff --git a/src/Controller/PublicController.php b/src/Controller/PublicController.php index e707427..7c61ebf 100644 --- a/src/Controller/PublicController.php +++ b/src/Controller/PublicController.php @@ -173,6 +173,13 @@ class PublicController extends AbstractController #[Route('/modify/{osm_object_id}/{version}/{changesetID}', name: 'app_public_submit')] public function submit($osm_object_id, $version, $changesetID): Response { + + $place = $this->entityManager->getRepository(Place::class)->findOneBy(['osmId' => $osm_object_id]); + if (!$place) { + $this->addFlash('warning', 'Ce commerce n\'existe pas.'); + return $this->redirectToRoute('app_public_index'); + } + // Récupérer les données POST $request = Request::createFromGlobals(); @@ -227,7 +234,7 @@ class PublicController extends AbstractController $tag = $changeset->addChild('tag'); $tag->addAttribute('k', 'comment'); - $tag->addAttribute('v', 'Modification des tags via l\'interface web #MonCommerceOSM'); + $tag->addAttribute('v', 'Modification dans #MonCommerceOSM'); $changesetResponse = $client->put('https://api.openstreetmap.org/api/0.6/changeset/create', [ 'body' => $changesetXml->asXML(), @@ -305,7 +312,28 @@ class PublicController extends AbstractController // après envoi on récupère les données $commerce = $this->motocultrice->get_osm_object_data($osm_kind, $osm_object_id); + + $place->update_place_from_overpass_data($commerce); + $this->entityManager->persist($place); + $this->entityManager->flush(); + + + $stats = $place->getStats(); + if(!$stats) { + $stats = $this->entityManager->getRepository(Stats::class)->findOneBy(['zip_code' => $place->getZipCode()]); + } + if(!$stats) { + $stats = new Stats(); + $stats->setZipCode($place->getZipCode()); + } + $stats->addPlace($place); + $place->setStats($stats); + + $stats->computeCompletionPercent(); + $this->entityManager->persist($stats); + $this->entityManager->persist($place); + $this->entityManager->flush(); return $this->render('public/view.html.twig', [ 'controller_name' => 'PublicController', diff --git a/src/Entity/Place.php b/src/Entity/Place.php index d37c468..aa65cdb 100644 --- a/src/Entity/Place.php +++ b/src/Entity/Place.php @@ -7,7 +7,7 @@ use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; - +// use App\Service\Motocultrice; #[ORM\Entity(repositoryClass: PlaceRepository::class)] class Place { @@ -76,6 +76,40 @@ class Place #[ORM\Column(nullable: true)] private ?bool $has_note = null; + public function update_place_from_overpass_data(array $overpass_data) { + $overpass_data = $overpass_data['tags_converted'] ; + + // Remplir les clés attendues avec des valeurs par défaut si non définies + $overpass_data = array_merge([ + 'id' => '', + 'type' => '', + 'name' => '', + 'postcode' => '', + 'email' => '', + 'opening_hours' => '', + 'addr:housenumber' => '', + 'addr:street' => '', + 'website' => '', + 'wheelchair' => '', + 'note' => '' + ], $overpass_data); + + $this + // ->setOsmId($overpass_data['id']) + // ->setOsmKind($overpass_data['type']) + ->setName($overpass_data['name']) + ->setZipCode(\intval($overpass_data['postcode'])) + ->setEmail($overpass_data['email']) + // ->setUuidForUrl( Motocultrice::uuid_create_static()) + // ->setOptedOut(false) + // ->setDead(false) + ->setHasOpeningHours($overpass_data['opening_hours'] ? true : false) + ->setHasAddress($overpass_data['addr:housenumber'] && $overpass_data['addr:street'] ? true : false) + ->setHasWebsite($overpass_data['website'] ? true : false) + ->setHasWheelchair($overpass_data['wheelchair'] and $overpass_data['wheelchair'] != '' ? true : false) + ->setHasNote($overpass_data['note'] and $overpass_data['note'] != '' ? true : false); + } + public function __construct() { $this->histories = new ArrayCollection(); diff --git a/src/Service/Motocultrice.php b/src/Service/Motocultrice.php index 2913af3..b6cf97d 100644 --- a/src/Service/Motocultrice.php +++ b/src/Service/Motocultrice.php @@ -15,6 +15,8 @@ class Motocultrice 'name', 'wheelchair', 'harassment_prevention', + 'image', + 'panoramax', ]; // les tags OSM que l'on estime nécessaires pour un commerce public $base_tags = [ @@ -279,6 +281,10 @@ QUERY; + public static function uuid_create_static() { + return $this->uuid_create(); + } + public function uuid_create() { return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x', // 32 bits for "time_low" diff --git a/templates/admin/stats.html.twig b/templates/admin/stats.html.twig index 517ccaa..3ccc08a 100644 --- a/templates/admin/stats.html.twig +++ b/templates/admin/stats.html.twig @@ -4,27 +4,24 @@ {% block body %}
-
-

{{ 'display.stats'|trans }}

+
+

{{ 'display.stats'|trans }}

{{ stats.zone }} -

-

- {# {{ dump(stats) }} #}

{{ stats.getCompletionPercent() }} % complété sur les critères donnés.
- {{ stats.getPlacesCount() }} commerces dans la zone. + {{ stats.getPlacesCount() }} commerces dans la zone.
- {{ stats.getAvecHoraires() }} commerces avec horaires. + {{ stats.getAvecHoraires() }} commerces avec horaires.
- {{ stats.getAvecAdresse() }} commerces avec adresse. + {{ stats.getAvecAdresse() }} commerces avec adresse.
- {{ stats.getAvecSite() }} commerces avec site web renseigné. + {{ stats.getAvecSite() }} commerces avec site web renseigné.
- {{ stats.getAvecAccessibilite() }} commerces avec accessibilité renseignée. + {{ stats.getAvecAccessibilite() }} commerces avec accessibilité renseignée.
- {{ stats.getAvecNote() }} commerces avec note renseignée. + {{ stats.getAvecNote() }} commerces avec note renseignée.
diff --git a/templates/base.html.twig b/templates/base.html.twig index 0feaf2c..b4610a6 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -47,14 +47,7 @@
-
-
-
-
-
-
-
-
+
{% block body %}{% endblock %} @@ -86,6 +79,11 @@ Sources du logiciel

+
+ partagez cette page : +
+
+
@@ -94,6 +92,17 @@ {% block javascripts %} {{ encore_entry_script_tags('app') }} + + {% endblock %} diff --git a/templates/public/edit.html.twig b/templates/public/edit.html.twig index c03261d..0d2c22e 100644 --- a/templates/public/edit.html.twig +++ b/templates/public/edit.html.twig @@ -30,29 +30,11 @@ {% if commerce_overpass is not empty %}
-
- - -
- - {% if commerce.tags_converted.image is defined %} - Image du lieu - {% endif %} - -

{{ 'display.attributes'|trans }}

+ {# nom #}
+
+ {{ dump(commerce_overpass.tags_converted) }} +
@@ -61,6 +43,18 @@
+ +{# {{ dump(commerce_overpass.tags_converted) }} #} + {% if commerce_overpass.tags_converted.image is defined %} + + + + + + + {% endif %} + + {% if hide_filled_inputs and (commerce_overpass.tags_converted['addr:street']) is defined and commerce_overpass.tags_converted['addr:street'] is empty and (commerce_overpass.tags_converted['addr:housenumber']) is defined and commerce_overpass.tags_converted['addr:housenumber'] is empty @@ -112,6 +106,9 @@
+ + {{ 'display.contact_humans'|trans }} +
+
+
+
+
+
+
+
+
+ {% block javascripts %} @@ -210,33 +216,6 @@ .addTo(map); {% endif %} - function updateCompletionProgress() { - const inputs = document.querySelectorAll('input[type="text"]'); - let filledInputs = 0; - let totalInputs = inputs.length; - - inputs.forEach(input => { - if (input.value.trim() !== '') { - filledInputs++; - } - }); - - const completionPercentage = (filledInputs / totalInputs) * 100; - const progressBar = document.querySelector('#completion_progress .progress-bar'); - progressBar.style.width = completionPercentage + '%'; - progressBar.setAttribute('aria-valuenow', completionPercentage); - - document.querySelector('#completion_display').innerHTML = `Votre commerce est complété à ${Math.round(completionPercentage)}%`; - } - - document.querySelectorAll('input[type="text"]').forEach(input => { - input.addEventListener('blur', updateCompletionProgress); - }); - - document.querySelector('form').addEventListener('submit', check_validity); - document.addEventListener('DOMContentLoaded', updateCompletionProgress); - - {% endblock %} {% endblock %} diff --git a/templates/public/edit/ask_angela.html.twig b/templates/public/edit/ask_angela.html.twig index 1d33eb9..df59c95 100644 --- a/templates/public/edit/ask_angela.html.twig +++ b/templates/public/edit/ask_angela.html.twig @@ -3,14 +3,20 @@

{{ 'display.ask_angela'|trans }}

- Image du lieu -

+ +
-
+ +
- +

-

- {{ 'display.ask_angela_more_info'|trans }} -

+
diff --git a/translations/messages.fr.yaml b/translations/messages.fr.yaml index b77d091..fad5151 100644 --- a/translations/messages.fr.yaml +++ b/translations/messages.fr.yaml @@ -40,7 +40,7 @@ display: cuisine: "Cuisine" keys: tags: "étiquettes" - name: "Nom" + name: "Nom du lieu, ne pas décrire le lieu" address: "Adresse" phone: "Téléphone" building: "Bâtiment"