182 lines
6.7 KiB
Markdown
182 lines
6.7 KiB
Markdown
# Plan de développement — WebCarto
|
|
|
|
Plan incrémental suivant l'ordre défini dans la consigne :
|
|
**carte → import GeoJSON → édition point → import KML → persistance → export**
|
|
|
|
---
|
|
|
|
## Phase 0 — Scaffolding & Infrastructure
|
|
|
|
**Objectif** : structure du repo, Docker, CI minimal, tout tourne à vide.
|
|
|
|
- [ ] Créer l'arborescence projet (`frontend/`, `backend/`, `samples/`)
|
|
- [ ] Initialiser le frontend : Vite + React + TypeScript, TailwindCSS, Zustand
|
|
- [ ] Configurer le thème gruvbox dark vintage (tokens CSS / Tailwind)
|
|
- [ ] Initialiser le backend : FastAPI, SQLModel, Alembic, structure `app/`
|
|
- [ ] Créer les Dockerfiles (frontend Nginx, backend uvicorn)
|
|
- [ ] Créer `docker-compose.yml` + `.env.example`
|
|
- [ ] Configurer linting : ruff + black (backend), ESLint + Prettier (frontend)
|
|
- [ ] Vérifier que `docker-compose up --build` lance les 2 services
|
|
|
|
**Livrable** : page blanche frontend servie par Nginx, backend répond sur `/api/health`.
|
|
|
|
---
|
|
|
|
## Phase 1 — Carte & fonds de plan
|
|
|
|
**Objectif** : carte plein écran avec 3 fonds commutables.
|
|
|
|
- [ ] Installer MapLibre GL JS
|
|
- [ ] Composant `<MapView>` : carte plein écran
|
|
- [ ] Configurer 3 fonds : Satellite (raster), Hybride (satellite + labels), Vecteur (OSM)
|
|
- [ ] Abstraction `BaseLayerProvider` : URL template + attribution + type, configurable via `.env`
|
|
- [ ] Sélecteur de fond (contrôle UI sur la carte)
|
|
- [ ] Affichage correct des attributions
|
|
|
|
**Livrable** : carte navigable avec switch entre les 3 fonds.
|
|
|
|
---
|
|
|
|
## Phase 2 — Layout UI & thème
|
|
|
|
**Objectif** : structure de l'interface complète (vide mais fonctionnelle).
|
|
|
|
- [ ] Header : nom projet + boutons Import / Export / Save / Settings (désactivés pour l'instant)
|
|
- [ ] Volet gauche : panneau couches (vide) avec recherche + filtres (placeholder)
|
|
- [ ] Volet droit : panneau propriétés (vide)
|
|
- [ ] Système de toasts + barre de statut
|
|
- [ ] Panneaux repliables / redimensionnables
|
|
- [ ] Appliquer thème gruvbox sur tous les composants
|
|
|
|
**Livrable** : layout 3 colonnes avec carte centrale, panneaux latéraux, header.
|
|
|
|
---
|
|
|
|
## Phase 3 — Import GeoJSON
|
|
|
|
**Objectif** : importer un fichier GeoJSON, l'afficher sur la carte, le persister.
|
|
|
|
### Frontend
|
|
- [ ] Bouton Import + zone drag & drop (accepte `.geojson`, `.json`)
|
|
- [ ] Parser et valider le GeoJSON côté client
|
|
- [ ] Envoyer le GeoJSON normalisé au backend via `POST /api/datasets/import`
|
|
- [ ] Afficher les features sur la carte (source + layer MapLibre)
|
|
- [ ] Remplir le volet gauche : liste des couches importées
|
|
|
|
### Backend
|
|
- [ ] Modèle `Dataset` (SQLModel) : id, name, created_at, feature_count, bbox
|
|
- [ ] Modèle `Feature` : id, dataset_id, geometry (JSON), properties (JSON)
|
|
- [ ] Migration Alembic initiale
|
|
- [ ] Route `POST /api/datasets/import` : validation Pydantic, stockage raw + features
|
|
- [ ] Route `GET /api/datasets` : liste des datasets
|
|
- [ ] Route `GET /api/datasets/{id}` : dataset + features
|
|
- [ ] Stockage du fichier raw original sur le volume `/data`
|
|
|
|
### Tests
|
|
- [ ] Backend : test import GeoJSON valide, test rejet fichier invalide, test listing
|
|
- [ ] Frontend : test parsing GeoJSON (unitaire)
|
|
|
|
### Données exemple
|
|
- [ ] Créer `samples/example.geojson` (quelques points/lignes/polygones)
|
|
|
|
**Livrable** : import drag & drop d'un GeoJSON → affiché sur la carte → persisté en base.
|
|
|
|
---
|
|
|
|
## Phase 4 — Sélection & édition des points
|
|
|
|
**Objectif** : cliquer sur un point, voir ses propriétés, le déplacer, modifier ses attributs.
|
|
|
|
### Sélection
|
|
- [ ] Clic sur feature → sélection visuelle (highlight)
|
|
- [ ] Affichage des propriétés dans le volet droit
|
|
- [ ] Liste des features dans le volet gauche (clic → centrer sur la carte)
|
|
- [ ] Affichage rich content (HTML safe sanitisé) dans le viewer propriétés
|
|
- [ ] Affichage des images si URL http(s) détectée dans les propriétés
|
|
|
|
### Édition
|
|
- [ ] Installer MapLibre Draw (ou équivalent)
|
|
- [ ] Drag & drop des points sur la carte
|
|
- [ ] Édition des propriétés : name, description, champs libres
|
|
- [ ] Undo (au moins 1 niveau) pour le déplacement
|
|
- [ ] Bouton Save → `PUT /api/features/{id}`
|
|
|
|
### Backend
|
|
- [ ] Route `PUT /api/features/{id}` : update geometry + properties
|
|
- [ ] Table `feature_versions` : timestamp, feature_id, before (JSON), after (JSON)
|
|
- [ ] Enregistrer chaque modification dans l'historique
|
|
|
|
### Tests
|
|
- [ ] Backend : test update feature, test versioning
|
|
- [ ] Frontend : test sélection, test undo
|
|
|
|
**Livrable** : sélection d'un point → voir/modifier propriétés → déplacer → sauvegarder avec historique.
|
|
|
|
---
|
|
|
|
## Phase 5 — Import KML
|
|
|
|
**Objectif** : importer des fichiers KML, les convertir et les traiter comme des GeoJSON.
|
|
|
|
- [ ] Installer `@tmcw/togeojson`
|
|
- [ ] Bouton Import accepte aussi `.kml`
|
|
- [ ] Parsing KML → GeoJSON côté frontend (togeojson)
|
|
- [ ] Extraction des images depuis CDATA / descriptions KML
|
|
- [ ] Envoyer le GeoJSON résultant au backend (même route d'import)
|
|
- [ ] Stockage du KML raw original sur le volume
|
|
|
|
### Tests
|
|
- [ ] Frontend : test conversion KML → GeoJSON
|
|
- [ ] Backend : test import d'un dataset originellement KML
|
|
|
|
### Données exemple
|
|
- [ ] Créer `samples/example.kml` (points avec descriptions, images)
|
|
|
|
**Livrable** : import KML → conversion → affichage + édition identique au GeoJSON.
|
|
|
|
---
|
|
|
|
## Phase 6 — Export
|
|
|
|
**Objectif** : exporter un dataset édité en GeoJSON.
|
|
|
|
- [ ] Route backend `POST /api/datasets/{id}/export?format=geojson`
|
|
- [ ] Générer le GeoJSON depuis les features en base (version courante)
|
|
- [ ] Bouton Export dans le header → téléchargement du fichier
|
|
- [ ] Option de re-téléchargement du fichier raw original
|
|
|
|
### Tests
|
|
- [ ] Backend : test export GeoJSON, vérifier cohérence avec les éditions
|
|
|
|
**Livrable** : export fonctionnel du dataset modifié en GeoJSON.
|
|
|
|
---
|
|
|
|
## Phase 7 — Polish & finalisation MVP
|
|
|
|
**Objectif** : stabiliser, documenter, préparer le déploiement.
|
|
|
|
- [ ] Gestion d'erreurs cohérente (toasts pour les erreurs réseau, parsing, etc.)
|
|
- [ ] Clustering des points si dataset volumineux (>1000 points)
|
|
- [ ] Performance : vérifier avec un dataset de ~5k points
|
|
- [ ] README.md : installation, variables `.env`, limites connues, roadmap
|
|
- [ ] Vérifier que `docker-compose up` fonctionne from scratch
|
|
- [ ] Passe finale sur le thème gruvbox (cohérence, contrastes, accessibilité)
|
|
|
|
**Livrable** : MVP complet, documenté, déployable en un `docker-compose up`.
|
|
|
|
---
|
|
|
|
## Post-MVP (roadmap)
|
|
|
|
Ces éléments ne sont pas dans le scope MVP mais sont prévus :
|
|
|
|
1. Support KMZ (unzip + parsing KML interne)
|
|
2. Styles KML (icônes, couleurs) appliqués sur la carte
|
|
3. Édition lignes / polygones
|
|
4. Export KML
|
|
5. Auth (OIDC / reverse proxy)
|
|
6. Multi-utilisateurs, permissions
|
|
7. Import grands datasets (streaming, Web Worker)
|
|
8. Serveur tuiles interne / mode offline
|