- Corrige le type de retour de UserController::export() (StreamedResponse)
- Ajoute les classes dark mode manquantes sur le bloc info de la page import
- Génère la documentation complète du projet dans docs/documentation.md
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Vues admin/utilisateurs : route() utilisait $user sans clé nommée ;
Laravel ne résout pas automatiquement un modèle vers un paramètre
{utilisateur} (nom non-anglais) — remplacé par ['utilisateur' => $user]
dans edit.blade.php, index.blade.php et UserController::store()
- Carte : ajout de position:relative + z-index:0 sur #carte-map pour
créer un contexte d'empilement qui confine les z-indexes internes de
Leaflet (≤800) et laisse le menu (z-index:40) s'afficher par-dessus
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-07 03:56:41 +02:00
6 changed files with 703 additions and 9 deletions
L'application inclut un assistant graphique accessible à l'URL `/setup` lors du premier lancement (avant la création du fichier `storage/installed`). Il guide l'administrateur à travers :
1. **Connexion à la base de données** — saisie des paramètres et test de connexion
2. **Paramètres de l'application** — nom du site, URL, fuseau horaire
3. **Compte administrateur** — création du premier utilisateur
L'assistant exécute ensuite les migrations et crée le fichier `storage/installed`.
### Environnement de développement
```bash
php artisan serve # http://localhost:8000
npm run dev # Vite en watch (CSS/JS)
php artisan migrate:fresh --seed # Reset + données de test
Lors du passage en `a_valider`, une notification (e-mail + notification interne) est envoyée aux administrateurs et aux responsables de la section concernée.
- Hiérarchie libre de lieux (commune → département → pays, ou toute autre arborescence)
- Types de lieux configurables (admin)
- Calcul automatique du `nom_long` à partir de la hiérarchie parente
- Coordonnées GPS (latitude/longitude) pour la vue cartographique
- Import et export CSV
- Recherche AJAX par nom (endpoint `/lieux/search`)
### Gestion des sources
- Une source = un registre ou document à dépouiller
- Associée à un type de source, un dépôt d'archives, une section, un lieu et une période
- Membres assignés pour la saisie (table pivot `source_user`)
- Workflow de statut avec notifications automatiques
### Saisie des relevés
Le formulaire de saisie est **dynamique** : il est piloté par les champs définis dans `source_type_fields`. Chaque champ peut être de type :
| Type | Description |
|------|-------------|
| `text` | Champ texte simple |
| `textarea` | Zone de texte multiligne |
| `number` | Nombre entier ou décimal |
| `boolean` | Case à cocher |
| `select` | Liste déroulante (options définies dans `source_type_fields.options`) |
| `date` | Date avec choix du calendrier (grégorien, julien, républicain) |
| `place` | Sélecteur de lieu (recherche AJAX) |
Les champs de type `date` stockent : `{ "valeur": "YYYY-MM-DD", "calendrier": "gregorien|julien|republicain" }`.
### Recherche
La recherche plein texte porte sur les colonnes générées `nom`, `prenom`, `date_evenement` et sur le JSON complet. Elle supporte :
- recherche textuelle (LIKE ou FTS selon le SGBD)
- filtre par type de source
- filtre par lieu (avec descente récursive dans la hiérarchie via CTE)
- filtre par période (`annee_debut`/`annee_fin`)
Le nombre maximum de résultats est configurable par l'administrateur (défaut : 200). Un bandeau d'avertissement s'affiche lorsque la limite est atteinte.
### Carte
Vue cartographique (Leaflet.js + OpenStreetMap) des lieux géolocalisés ayant des relevés. Chaque marqueur affiche un popup avec les sources associées au lieu, leur statut et un lien vers la recherche.
### Export GEDCOM
Le service `GedcomExportService` génère un fichier `.ged` (GEDCOM 5.5.1) à partir d'une source ou d'une sélection de relevés. Les dates sont converties en grégorien ; le calendrier julien est annoté `@#DJULIAN@` et le calendrier républicain est converti via `DateConversionService`.
### Import de relevés CSV
Un import CSV est disponible pour les relevés (endpoint `/sources/{source}/import`). Le séparateur (`;` ou `,`) et le BOM UTF-8 sont détectés automatiquement.
Gère la vérification et l'application des mises à jour depuis le serveur de releases (Gitea). Utilisé par les commandes Artisan `app:check-update` et `app:update`.
### `DbCompat`
Classe utilitaire pour la compatibilité MySQL/PostgreSQL. Fournit des fragments SQL adaptés au SGBD actif.
| Méthode | Description |
|---------|-------------|
| `isPgsql()` | Détecte si le SGBD est PostgreSQL |
| `like()` | `ILIKE` (pgsql) ou `LIKE` (mysql) |
| `ftsRaw()` | Expression de recherche plein texte native |
| `generatedJsonCol(key)` | Expression SQL pour colonne générée JSON |
| `jsonRegexRaw(col)` | Expression regex sur JSON |
---
## 10. Énumérations
### `UserRole`
| Cas | Valeur | Label |
|-----|--------|-------|
| `Admin` | `admin` | Administrateur |
| `SectionManager` | `section_manager` | Responsable de section |
| `Member` | `member` | Membre |
### `SourceStatus`
| Cas | Valeur | Label | Transitions possibles |
|-----|--------|-------|-----------------------|
| `AFaire` | `a_faire` | À faire | → `en_cours` |
| `EnCours` | `en_cours` | En cours | → `a_valider` |
Redirige vers `/setup` si le fichier `storage/installed` est absent. Redirige vers `/` si l'installation est déjà effectuée et qu'on accède à `/setup`.
### `RoleMiddleware`
Usage : `role:admin` ou `role:section_manager`. Les administrateurs ont accès à toutes les routes quel que soit le rôle requis. Retourne HTTP 403 si le rôle est insuffisant.
### `EnsureUserIsActive`
Déconnecte automatiquement un utilisateur dont `is_active = false` et affiche un message d'erreur.
---
## 12. Administration
L'interface d'administration (`/admin`) est réservée aux utilisateurs de rôle `admin`.
### Gestion des utilisateurs
- Liste avec filtres (rôle, statut, recherche textuelle)
- Création manuelle (nom, e-mail, mot de passe, rôle)
- Modification (nom, e-mail, mot de passe optionnel, rôle)
- Suppression (protégée : impossible de supprimer le dernier admin ou son propre compte)
- Activation / désactivation (protégée : impossible de désactiver le dernier admin actif)
- Export CSV (avec les filtres actifs)
- Import CSV : colonnes `name`, `email`, `role`, `is_active` (optionnel) ; mots de passe temporaires générés et affichés une seule fois
### Paramètres du site
| Paramètre | Description |
|-----------|-------------|
| Nom du site | Affiché dans le titre et le header |
| Logo | Upload PNG/JPG/SVG (stocké dans `storage/app/public/site/`) |
| Inscriptions | Autoriser ou non les auto-inscriptions |
| Limite de résultats | Nombre maximum de résultats de recherche (10–5000, défaut 200) |
- **Eager loading** systématique (`with()`) pour éviter les requêtes N+1
- **Pagination obligatoire** (25 par page par défaut, jamais de SELECT sans LIMIT)
- **Chargement différé des listes** : les pages Lieux et Sources n'affichent aucun résultat sans filtre actif (prévient les requêtes portant sur des dizaines de milliers d'enregistrements)
- **Cache Redis** (TTL 1h) sur les listes fréquemment consultées
- **Recherche par lieu** : CTE récursive pour descendre dans la hiérarchie des lieux sans jointures multiples
### Stockage des dates
Chaque champ de type `date` dans le JSONB stocke un objet :
```json
{
"valeur": "1792-09-22",
"calendrier": "gregorien"
}
```
La colonne générée `date_evenement` extrait `date_evenement.valeur` pour permettre les tris et filtres sans parsing JSON à chaque requête.
z-index:0;/* crée un contexte d'empilement qui scelle les z-indexes internes de Leaflet */
}
/* Popup dark mode */
.dark.leaflet-popup-content-wrapper,
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.