No description
| css | ||
| js | ||
| index.html | ||
| README.md | ||
Planificateur de Vacances — Alpha
Application 100% client-side (HTML/CSS/JS vanilla) pour préparer un voyage : collecte de notes (hébergements/activités), consultation sur une carte Leaflet interactive, et construction d'un itinéraire multi-étapes.
Fonctionnalités (alpha)
- Notes de voyage : titre, lieu, dates, type (hébergement/activité), description, prix.
- Géocodage : recherche d'adresse via l'API publique Nominatim (OpenStreetMap), avec throttling (1 req/sec) et cache en session pour respecter la politique d'usage.
- Carte interactive (Leaflet) : chaque note géolocalisée apparaît comme un marqueur coloré (bleu = hébergement, orange = activité) avec popup au clic.
- Sélection de point sur la carte : possibilité de cliquer directement sur la carte pour placer une note sans passer par la recherche d'adresse.
- Itinéraire : ajout d'étapes par clic sur la carte ou depuis une note existante, réordonnancement par glisser-déposer, tracé automatique via Leaflet Routing Machine.
- Stockage local : toutes les données sont conservées dans IndexedDB, directement dans le navigateur — aucune donnée n'est envoyée à un serveur (hors appels Nominatim pour la recherche d'adresse).
- Export / Import JSON : sauvegarde ou transfert du voyage sous forme de fichier JSON téléchargeable.
Installation
Aucune dépendance à installer, aucun build. Il suffit de servir les fichiers
statiques (ne pas ouvrir index.html directement en file:// à cause des
modules ES et des requêtes CORS).
Exemple avec Python :
cd vacances-planner
python3 -m http.server 8080
Puis ouvrir http://localhost:8080 dans le navigateur.
Alternative avec Node (npx serve) ou toute extension "Live Server" de votre éditeur.
Structure du projet
vacances-planner/
├── index.html # Structure de la page, 3 onglets (Notes / Carte / Itinéraire)
├── css/
│ └── style.css # Styles de l'ensemble de l'application
└── js/
├── db.js # Wrapper IndexedDB (CRUD notes + étapes, export/import)
├── geocode.js # Client Nominatim (geocode direct + inverse, throttling, cache)
├── map.js # Carte Leaflet principale + affichage des marqueurs de notes
├── itinerary.js # Carte + logique de l'itinéraire (étapes, drag&drop, routing)
├── notes.js # Formulaire de saisie + rendu de la liste de notes
└── app.js # Orchestration générale, navigation par onglets
Modèle de données (IndexedDB)
Store notes
| Champ | Type | Description |
|---|---|---|
| id | string (UUID) | Identifiant unique |
| titre | string | Titre de la note |
| lieu | string | Nom du lieu (texte libre, résolu via Nominatim) |
| lat / lng | number | Coordonnées géographiques |
| dateDebut / dateFin | string (YYYY-MM-DD) | Dates concernées |
| type | "hebergement" | "activite" | Catégorie de la note |
| description | string | Texte descriptif libre |
| prix | number | null | Prix en euros |
Store etapes (itinéraire)
| Champ | Type | Description |
|---|---|---|
| id | string (UUID) | Identifiant unique |
| noteId | string | null | Référence optionnelle vers une note |
| label | string | Nom affiché de l'étape |
| lat / lng | number | Coordonnées |
| ordre | number | Position dans le trajet |
Limitations connues (alpha)
- Le géocodage dépend de l'API publique Nominatim : usage raisonnable requis (throttling intégré côté client), pas de garantie de disponibilité en production.
- Le calcul d'itinéraire (Leaflet Routing Machine) utilise le service OSRM public par défaut et nécessite une connexion internet ponctuelle pour tracer les routes.
- Pas de synchronisation multi-appareils : les données restent locales au navigateur utilisé (export/import JSON manuel pour sauvegarder ou transférer un voyage).
- Pas de recherche de contenu touristique automatisée : l'utilisateur saisit lui-même toutes ses notes de préparation, conformément au périmètre de l'alpha.
Prochaines pistes (post-alpha)
- Mode hors-ligne complet avec Service Worker (PWA).
- Suggestions de contenu (POI, avis) via API tierces, une fois le socle validé.
- Partage d'un voyage via lien ou fichier compressé.
- Vue calendrier des notes en plus de la vue liste/carte.