diff --git a/README.md b/README.md
index b5b5568..8b767f6 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,13 @@
-L'idée serait de faire une application Symfony pour gérer simplement des tâches de cartographie.
+# Gestionnaire de tâches simple
+
+Voici un outil pour faciliter le travail collaboratif autour d’un projet. Le
+projet regroupe des tâches que les contributeurs OSM peuvent s’approprier et
+traiter dans JOSM.
+
+# Idée de départ
+
+L'idée serait de faire une application Symfony pour gérer simplement des tâches
+de cartographie.
* authentification OAuth2 sur OSM pour ne pas avoir à créer de compte
* télécommande JOSM
@@ -6,19 +15,60 @@ L'idée serait de faire une application Symfony pour gérer simplement des tâch
* carte maplibre ou leaflet synchronisée avec la liste des tâches
* possibilité de modifier les tâches en masse (actions groupées)
* stockage des données dans sqlite
-* presets dans le projet pour envoyer à JOSM (genre hashtags du message de commit, etc)
+* presets dans le projet pour envoyer à JOSM (genre hashtags du message de
+ commit, etc)
On créé un projet (titre, description), on peut manipuler les tâches d'un
-projet (ajouter par import geojson, supprimer, diviser en n×n ou en surface (on en déduit n)) et pour chacune
+projet (ajouter par import geojson, supprimer, diviser en n×n ou en surface (on
+en déduit n)) et pour chacune
d'elle on trouve un statut historicisé (à faire, en cours, fait) pour chaque
action (mapper, vérifier). On peut imagine que certains status lockent la tâche
qui se délocke au bout d'un certain temps.
-Peut-être préférer un workflow : à mapper → mappage en cours → mappage terminé à vérifier → vérification en cours → vérifié
-Où les étapes *en cours* sont lockantes et reviennent au statut précédent au bout d'une journée
+Peut-être préférer un workflow : à mapper → mappage en cours → mappage terminé
+à vérifier → vérification en cours → vérifié
+Où les étapes *en cours* sont lockantes et reviennent au statut précédent au
+bout d'une journée
+
+Un système de commentaires arborescent sur les tâches serait pas du luxe (lien
+avec le statut via la date).
+
+On peut faire des statistiques par projet sur les statuts des tâches. Et
+rappeller les commentaires par ordre antéchronologique globalement sur le
+projet.
+
+En tous cas l'idéal serait de pouvoir faire tout ça via une api et de fournir
+un client web en js moderne. Un client en ligne de commande serait pas du luxe
+non plus.
+
+## Mise en place technique
+
+Il s’agit d’un petit projet Symfony (7.1.3) donc essentiellement en PHP
+(développé avec la version 8.2.23) avec un peu de Javascript (utilisation du
+framework Stimulus suggéré par Symfony) et de CSS (utilisation du framework
+Bootstrap). Les données sont stockées dans une base SQLite localement.
+
+Les dépendances PHP sont gérées assez classiquement par Composer. On peut donc
+les récuperer avec un simple `composer install` dans la racine de
+l’application.
+
+On peut le faire tourner en local pour tester/développer grâce à l’outil en
+ligne de commande [`symfony`](https://symfony.com/download) et notamment en
+démarrant un serveur local : `symfony serve -d`.
+
+L’application peut être servie par un serveur web (nginx, Apache, etc) comme
+une application Symfony classique (la racine du serveur web étant dans
+`/public`) pour peu qu’il interprète le PHP. Il n’y a pas de référence à des
+noms de domaines donc pas de soucis pour les adresses web absolues.
+
+La configuration de l’application se fait dans un fichier `.env.local`
+(s’inspirer du `.env` fourni) dans lequel il faut essentiellement renseigner
+les variables :
-Un système de commentaires arborescent sur les tâches serait pas du luxe (lien avec le statut via la date).
+* `APP_TIMEZONE` a priori `Europe/Paris`
+* `OSM_CLIENT_ID` et `OSM_CLIENT_SECRET` à générer dans les options de son
+ compte OSM (onglet « application OAuth2 » avec comme URI de redirections
+ l’adresse web de son instance suffixée du chemin `/osm/callback` et comme
+ autorisation, uniquement « Lire les préférences de l’utilisateur »)
-On peut faire des statistiques par projet sur les statuts des tâches. Et rappeller les commentaires par ordre antéchronologique globalement sur le projet.
-En tous cas l'idéal serait de pouvoir faire tout ça via une api et de fournir un client web en js moderne. Un client en ligne de commande serait pas du luxe non plus.
diff --git a/assets/app.js b/assets/app.js
index 9576c2e..b070da6 100644
--- a/assets/app.js
+++ b/assets/app.js
@@ -1,13 +1,15 @@
-import './bootstrap.js';
+import './bootstrap.js'; // Stimulus
-import './vendor/bootstrap/dist/css/bootstrap.min.css';
-import './vendor/leaflet/dist/leaflet.min.css';
-import './styles/app.css';
+import './vendor/bootstrap/dist/css/bootstrap.min.css'; // Bootstrap
+import './vendor/leaflet/dist/leaflet.min.css'; // Leaflet
+import './styles/app.css'; // Nos personnalisations
import { Tooltip } from './vendor/bootstrap/bootstrap.index.js';
const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]')
const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new Tooltip(tooltipTriggerEl))
+// Implémente une sécurité basique pour confirmer le clic sur tous les boutons
+// qui emènent sur une adresse web susceptible de supprimer quelque-chose…
document.addEventListener('click', function (event) {
if (event.target.matches('a[href*="remove"]')) {
if (!confirm(event.target.innerText + ' ?')) {
diff --git a/assets/controllers/clipboard_controller.js b/assets/controllers/clipboard_controller.js
index 18bc059..73d89d8 100644
--- a/assets/controllers/clipboard_controller.js
+++ b/assets/controllers/clipboard_controller.js
@@ -1,3 +1,10 @@
+/**
+Simple contrôleur pour copier du texte dans le presse papier en cliquant
+simplement sur un bouton
+
+Cf la macro twig `clipboard`
+**/
+
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
diff --git a/assets/controllers/josm_controller.js b/assets/controllers/josm_controller.js
index c3c8d03..6ffc1e1 100644
--- a/assets/controllers/josm_controller.js
+++ b/assets/controllers/josm_controller.js
@@ -1,3 +1,40 @@
+/**
+Implémente la télécommande JOSM
+
+Le HTML géré pourrait ressembler à :
+
+```html
+
+```
+
+Où la valeur `commands` prend la forme d’un objet JSON dont chacune des entrées
+représente une commande à enchaîner successivement et où la clef est le chemin
+de la commande et la valeur un objet dont chacune des entrées représente les
+paramètres de la commande.
+
+Par exemple :
+
+```json
+{
+ "version": {},
+ "imagery": {
+ "id": "osmfr",
+ }
+}
+```
+
+Avec cette valeur de `commands`, les appels successifs aux endpoints `/version`
+puis `imagery?id=osmfr` seront effectués.
+
+Cf
+
+TODO Gérer le cas où il n’y a pas de JOSM en face pourrait être plus user-friendly.
+**/
import { Controller } from '@hotwired/stimulus';
export default class extends Controller {
@@ -6,7 +43,6 @@ export default class extends Controller {
}
remoteControl() {
- // cf
const baseurl = 'http://localhost:8111';
const _this = this, commands = JSON.parse(this.commandsValue);
for (var command in commands) {
diff --git a/assets/controllers/map_controller.js b/assets/controllers/map_controller.js
index e50c9eb..868e818 100644
--- a/assets/controllers/map_controller.js
+++ b/assets/controllers/map_controller.js
@@ -1,3 +1,12 @@
+/**
+
+Contrôleur qui gère la carte (charge son contenu et contrôle l’interactivité)
+
+Voir la macro Twig `map` qui produit le HTML géré par ce contrôleur.
+
+Cf
+
+**/
import { Controller } from '@hotwired/stimulus';
import 'leaflet';
@@ -10,13 +19,7 @@ export default class extends Controller {
}
connect() {
- const simpleIcon = L.icon({
- iconUrl: this.iconValue,
- iconSize: [16, 16],
- iconAnchor: [8, 16],
- popupAnchor: [0, 0],
- });
-
+ // Constitue une collection d’icones aux couleurs Bootstrap
const iconHtml = `