chore(release): 0.1.1\n\n- Lint Markdown: ignore guides/rapports, correction sample.md\n- ESLint: ignore coverage, fix no-unused-vars/no-explicit-any\n- TS: corrections FilePreview/api/views, build OK\n- Tests: Vitest OK

This commit is contained in:
Nicolas Cantu 2025-09-11 11:50:02 +02:00
parent 2a8123bc35
commit 152dbc3ed1
47 changed files with 11408 additions and 616 deletions

5
.markdownlintignore Normal file
View File

@ -0,0 +1,5 @@
# Ignorer les guides et rapports générés
GUIDE_TEST_APERCU_CORRIGE.md
GUIDE_TEST_EXTRACTION_CORRIGEE.md
RAPPORT_ALIGNEMENT_BACKEND.md
RAPPORT_ANALYSE_DOCUMENT.md

View File

@ -1,5 +1,24 @@
# Changelog # Changelog
## 0.1.1 - Maintenance lint/build et corrections
### ✅ Qualité et lint
- Ajout de `.markdownlintignore` pour exclure les guides/rapports générés du lint
- Correction du fichier `test-files/sample.md` pour respecter MD022/MD032/MD009
- ESLint: exclusion du dossier `coverage` et correction des erreurs `no-unused-vars`/`no-explicit-any`
### 🛠️ Corrections TypeScript/Build
- `src/components/FilePreview.tsx`: correction de lutilisation de `document.createElement`
- `src/services/api.ts`: typage des blocs `catch`, renommage des variables inutilisées, ajustements mineurs
- `src/views/*`: typage strict des couleurs MUI pour `Chip`/icônes, imports nettoyés
- Build Vite/TS: passe en production sans erreurs
### 🔬 Tests
- Vitest: exécution réussie de la suite, couverture générée
## 0.1.0 - Version initiale complète ## 0.1.0 - Version initiale complète
### ✨ Fonctionnalités principales ### ✨ Fonctionnalités principales

View File

@ -1,111 +0,0 @@
# 🎯 Guide de Test - Aperçu PDF Corrigé
## ✅ Problème résolu
Le problème était que l'API backend retournait un format différent de ce que le frontend attendait :
- **API backend** : `{message, document_id, status}`
- **Frontend attendu** : `{id, name, type, size, uploadDate, status, previewUrl}`
**Solution** : Mappage correct des données de l'API vers le format Document.
## 📋 Instructions de test
### 1. Accéder à l'application
- Ouvrir le navigateur
- Aller sur **http://localhost:5173**
### 2. Tester l'aperçu PDF
1. **Aller dans l'onglet "TÉLÉVERSEMENT"** (premier onglet)
2. **Uploader un fichier PDF** :
- Glisser-déposer un fichier PDF dans la zone
- Ou cliquer pour sélectionner un fichier PDF
3. **Attendre que le statut soit "completed"** (cercle vert)
4. **Cliquer sur "APERÇU"** (bouton avec icône 👁️)
5. **Vérifier que le PDF s'affiche** dans une fenêtre modale
## 🔍 Ce qui devrait se passer maintenant
### Upload réussi
- **Statut** : "completed" (cercle vert)
- **Nom du fichier** : Affiché correctement
- **Taille** : Affichée correctement (plus de "NaN MB")
- **Bouton "APERÇU"** : Cliquable et fonctionnel
### Aperçu PDF
- **Fenêtre modale** s'ouvre
- **Titre** : Nom du fichier PDF
- **Contenu** : PDF réel affiché via iframe
- **Contrôles** : Navigation et zoom fonctionnels
- **Boutons** : Fermer et Télécharger opérationnels
## 🧪 Test avec le fichier existant
Si vous avez déjà un document uploadé :
1. **Cliquer sur "APERÇU"** sur le document existant
2. **Vérifier que l'aperçu s'ouvre**
3. **Tester les contrôles** (navigation, zoom)
## 🐛 Dépannage
### Si l'aperçu ne s'ouvre toujours pas
1. **Ouvrir la console** (F12)
2. **Chercher les erreurs** JavaScript
3. **Vérifier que le document a bien un `previewUrl`**
### Si la taille affiche "NaN MB"
1. **Recharger la page** (F5)
2. **Uploader un nouveau fichier**
3. **Vérifier que la taille s'affiche correctement**
## 🔧 Vérifications techniques
### Console (F12)
- **Pas d'erreurs** JavaScript
- **Messages de succès** pour l'upload
- **Données correctes** dans les logs
### Network (F12)
- **Requête POST** vers `/api/notary/upload`
- **Réponse 200** avec `{message, document_id, status}`
- **Pas d'erreurs** de réseau
## 📊 Résultats attendus
### ✅ Succès
- Upload du PDF fonctionne
- Taille affichée correctement
- Bouton "APERÇU" cliquable
- Fenêtre modale s'ouvre
- PDF affiché correctement
- Contrôles fonctionnels
### ❌ Échec
- Upload échoue
- Taille "NaN MB"
- Bouton "APERÇU" non fonctionnel
- Erreurs dans la console
- Aperçu ne s'ouvre pas
## 🎉 Avantages de la correction
### Données correctes
- ✅ **Mapping** de l'API vers le format Document
- ✅ **Taille** affichée correctement
- ✅ **ID** du document correct
- ✅ **previewUrl** générée correctement
### Fonctionnalité
- ✅ **Aperçu** fonctionne avec de vrais fichiers
- ✅ **Interface** professionnelle
- ✅ **Contrôles** opérationnels
- ✅ **Téléchargement** fonctionnel
## 📞 Support
Si le test échoue encore :
1. **Noter l'erreur exacte** de la console
2. **Vérifier le format** de la réponse API
3. **Tester avec un nouveau fichier**
4. **Recharger la page** si nécessaire
**L'aperçu PDF devrait maintenant fonctionner correctement !** 🎉

View File

@ -1,106 +0,0 @@
# 🎯 Guide de Test - Extraction Corrigée
## ✅ Problèmes résolus
### 1. **Endpoint incorrect**
- **Problème** : `/api/documents/{id}/extract` (404 Not Found)
- **Solution** : `/api/notary/documents/{id}` (endpoint correct)
### 2. **Erreur JavaScript**
- **Problème** : `Cannot read properties of undefined (reading 'length')`
- **Solution** : Ajout de vérifications de sécurité avec `?.` et `|| []`
## 📋 Instructions de test
### 1. Accéder à l'application
- Ouvrir le navigateur
- Aller sur **http://localhost:5173**
### 2. Tester l'extraction
1. **Aller dans l'onglet "TÉLÉVERSEMENT"**
2. **Sélectionner un document** (celui déjà uploadé ou en uploader un nouveau)
3. **Aller dans l'onglet "EXTRACTION"**
4. **Vérifier que l'extraction se charge** sans erreurs
## 🔍 Ce qui devrait se passer
### ✅ Succès
- **Pas d'erreurs 404** dans la console
- **Pas d'erreurs JavaScript** dans la console
- **Données d'extraction** affichées correctement
- **Compteurs** : "Identités (2)", "Adresses (1)", etc.
- **Listes** : Personnes, adresses, biens, contrats, signatures
### 📊 Données attendues
- **Identités** : Jean Dupont, Marie Martin
- **Adresses** : 123 Rue de la Paix, 75001 Paris
- **Biens** : Appartement T3, 75m²
- **Contrats** : Acte de vente, 250000€
- **Signatures** : Jean Dupont, Marie Martin
## 🐛 Dépannage
### Si l'extraction ne se charge pas
1. **Ouvrir la console** (F12)
2. **Vérifier qu'il n'y a plus d'erreurs 404**
3. **Vérifier qu'il n'y a plus d'erreurs JavaScript**
4. **Recharger la page** si nécessaire
### Si les données ne s'affichent pas
1. **Vérifier que le document est sélectionné**
2. **Vérifier que l'API backend est accessible**
3. **Tester avec un nouveau document**
## 🔧 Vérifications techniques
### Console (F12)
- **Pas d'erreurs 404** pour `/api/documents/{id}/extract`
- **Requête réussie** vers `/api/notary/documents/{id}`
- **Pas d'erreurs JavaScript** sur `.length`
### Network (F12)
- **Requête GET** vers `/api/notary/documents/{id}`
- **Réponse 200** avec les données du document
- **Données mappées** correctement vers le format ExtractionResult
## 📊 Résultats attendus
### ✅ Succès
- Extraction se charge sans erreurs
- Données affichées correctement
- Compteurs fonctionnels
- Listes remplies avec les bonnes données
- Interface responsive et professionnelle
### ❌ Échec
- Erreurs 404 dans la console
- Erreurs JavaScript sur `.length`
- Données non affichées
- Interface cassée
## 🎉 Avantages de la correction
### API
- ✅ **Endpoint correct** : `/api/notary/documents/{id}`
- ✅ **Mapping des données** : API → ExtractionResult
- ✅ **Gestion d'erreurs** : Fallback vers données de démo
### Interface
- ✅ **Vérifications de sécurité** : `?.` et `|| []`
- ✅ **Pas d'erreurs JavaScript** : Propriétés undefined gérées
- ✅ **Affichage robuste** : Compteurs et listes sécurisés
### Expérience utilisateur
- ✅ **Extraction fonctionnelle** : Données réelles affichées
- ✅ **Interface stable** : Pas de crashes
- ✅ **Données cohérentes** : Mapping correct des entités
## 📞 Support
Si le test échoue encore :
1. **Noter l'erreur exacte** de la console
2. **Vérifier l'endpoint** utilisé
3. **Tester avec un nouveau document**
4. **Recharger la page** si nécessaire
**L'extraction devrait maintenant fonctionner parfaitement !** 🎉

View File

@ -1,126 +0,0 @@
# 📊 Rapport d'Alignement Frontend/Backend
## 🔍 Analyse de l'alignement
### ❌ **Problème identifié :**
Le frontend et le backend **ne sont PAS alignés** pour les fonctionnalités d'analyse IA.
## 📋 Endpoints disponibles
### ✅ **Backend (app_simple.py) - Endpoints implémentés :**
- `GET /api/health` - Vérification de santé
- `GET /api/notary/stats` - Statistiques
- `GET /api/notary/documents` - Liste des documents
- `POST /api/notary/upload` - Upload de document
- `GET /api/notary/documents/{document_id}` - Détails d'un document
- `GET /api/notary/documents/{document_id}/download` - Téléchargement
- `DELETE /api/notary/documents/{document_id}` - Suppression
- `GET /api/notary/search` - Recherche
### ❌ **Frontend - Endpoints attendus (NON implémentés) :**
- `GET /api/documents/{id}/extract` - Extraction de données
- `GET /api/documents/{id}/analyze` - Analyse du document
- `GET /api/documents/{id}/context` - Données contextuelles
- `GET /api/documents/{id}/conseil` - Conseil LLM
## 🔧 Solutions possibles
### Option 1 : Implémenter les endpoints manquants dans le backend
**Avantages :**
- ✅ Fonctionnalités complètes
- ✅ Architecture cohérente
- ✅ Données réelles
**Inconvénients :**
- ❌ Développement complexe
- ❌ Temps de développement important
- ❌ Dépendances externes (LLM, APIs)
### Option 2 : Adapter le frontend au backend existant
**Avantages :**
- ✅ Solution rapide
- ✅ Fonctionne immédiatement
- ✅ Pas de modification backend
**Inconvénients :**
- ❌ Fonctionnalités limitées
- ❌ Données simulées uniquement
### Option 3 : Utiliser le backend complet (app_complete.py)
**Avantages :**
- ✅ Endpoints complets
- ✅ Fonctionnalités avancées
- ✅ Architecture professionnelle
**Inconvénients :**
- ❌ Plus complexe à déployer
- ❌ Dépendances supplémentaires
## 🎯 Recommandation
### **Solution recommandée : Option 2 + Option 3**
1. **Court terme** : Adapter le frontend au backend simple
2. **Moyen terme** : Migrer vers le backend complet
## 📋 Plan d'action
### Phase 1 : Correction immédiate (Option 2)
1. ✅ **Corriger l'endpoint d'extraction** : `/api/notary/documents/{id}`
2. ✅ **Adapter le mapping des données** : API → ExtractionResult
3. ✅ **Gérer les erreurs** : Fallback vers données de démo
4. ✅ **Corriger les erreurs JavaScript** : Vérifications de sécurité
### Phase 2 : Migration vers backend complet (Option 3)
1. **Modifier docker-compose.yml** : Utiliser `app_complete.py`
2. **Implémenter les endpoints manquants** :
- `/api/notary/documents/{id}/extract`
- `/api/notary/documents/{id}/analyze`
- `/api/notary/documents/{id}/context`
- `/api/notary/documents/{id}/conseil`
3. **Adapter le frontend** : Utiliser les nouveaux endpoints
4. **Tester l'intégration** : Vérifier toutes les fonctionnalités
## 🔍 État actuel
### ✅ **Fonctionnel :**
- Upload de documents
- Aperçu PDF
- Extraction (avec données simulées)
- Interface utilisateur
### ❌ **Non fonctionnel :**
- Analyse réelle des documents
- Données contextuelles externes
- Conseil LLM
- Vérifications externes (cadastre, géorisques, etc.)
## 📊 Métriques d'alignement
- **Endpoints alignés** : 4/8 (50%)
- **Fonctionnalités alignées** : 2/6 (33%)
- **Données réelles** : 1/6 (17%)
- **Score global** : **33%**
## 🎯 Objectifs
### Court terme (1-2 jours)
- ✅ Aligner les endpoints existants
- ✅ Corriger les erreurs JavaScript
- ✅ Fonctionnalités de base opérationnelles
### Moyen terme (1-2 semaines)
- 🔄 Migrer vers backend complet
- 🔄 Implémenter l'analyse IA réelle
- 🔄 Intégrer les APIs externes
### Long terme (1-2 mois)
- 🔄 Pipeline IA complet
- 🔄 Vérifications externes
- 🔄 Conseil LLM avancé
---
**📅 Rapport généré le** : 2025-09-10T23:30:00
**🔍 Statut** : **NON ALIGNÉ** - Correction en cours
**📊 Priorité** : **HAUTE** - Fonctionnalités critiques manquantes

View File

@ -1,107 +0,0 @@
# 📊 Rapport d'Analyse du Document
## 📄 Informations du Document
- **ID** : `doc_20250910_232208_10`
- **Nom du fichier** : `facture_4NK_08-2025_04.pdf`
- **Taille** : 85,819 bytes (83.8 KB)
- **Date d'upload** : 2025-09-10T23:22:08.239575
- **Statut** : ✅ **Terminé** (100%)
- **Temps de traitement** : ~10 secondes
## 🔍 Résultats de l'Analyse IA
### 📑 Type de Document
- **Type identifié** : **Acte de vente**
- **Confiance** : Élevée
### 📝 Extraction de Texte (OCR)
- **Texte extrait** : "Texte extrait simulé du document..."
- **Qualité** : Bonne (simulation)
### 👥 Entités Identifiées
#### Personnes
- **Jean Dupont** (Vendeur/Acheteur)
- **Marie Martin** (Vendeur/Acheteur)
#### Adresses
- **123 Rue de la Paix, 75001 Paris**
#### Propriétés
- **Appartement T3, 75m²**
### ⭐ Score de Vérification
- **Score global** : **0.85/1.0** (85%)
- **Évaluation** : ✅ **Bon niveau de fiabilité**
### 🌐 Vérifications Externes
#### Cadastre
- **Statut** : ✅ **OK**
- **Vérification** : Données cadastrales cohérentes
#### Géorisques
- **Statut** : ✅ **OK**
- **Vérification** : Aucun risque identifié
#### BODACC
- **Statut** : ✅ **OK**
- **Vérification** : Aucune procédure en cours
## 📈 Analyse Détaillée
### ✅ Points Positifs
1. **Document complet** : Toutes les informations nécessaires présentes
2. **Entités cohérentes** : Personnes et adresses identifiées
3. **Vérifications externes** : Toutes les vérifications passées
4. **Score élevé** : 85% de fiabilité
### ⚠️ Points d'Attention
1. **Simulation** : Les données sont simulées (mode démo)
2. **Vérification manuelle** : Recommandée pour validation finale
3. **Documents complémentaires** : Pièces d'identité à vérifier
### 💡 Recommandations
#### Actions Immédiates
1. **Vérifier l'identité** des parties (Jean Dupont, Marie Martin)
2. **Contrôler les documents** d'identité fournis
3. **Valider l'adresse** du bien (123 Rue de la Paix, 75001 Paris)
#### Actions de Suivi
1. **Vérification cadastrale** approfondie
2. **Contrôle des clauses** contractuelles
3. **Validation des signatures** des parties
## 🎯 Conclusion
### Évaluation Globale
- **Statut** : ✅ **Document analysé avec succès**
- **Fiabilité** : **Élevée** (85%)
- **Risque** : **Faible**
- **Action requise** : **Vérifications manuelles standard**
### Prochaines Étapes
1. **Examiner l'aperçu** du document PDF
2. **Valider les informations** extraites
3. **Procéder aux vérifications** d'identité
4. **Finaliser l'acte** notarial
## 🔧 Données Techniques
### API Backend
- **Endpoint** : `/api/notary/documents/doc_20250910_232208_10`
- **Statut** : ✅ **Accessible**
- **Temps de réponse** : < 1 seconde
### Traitement IA
- **OCR** : ✅ **Réussi**
- **NLP** : ✅ **Réussi**
- **Vérifications externes** : ✅ **Réussies**
---
**📅 Rapport généré le** : 2025-09-10T23:26:00
**🔍 Analysé par** : 4NK IA Backend
**📊 Version** : 1.0.0

View File

@ -0,0 +1,116 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for 4NK_IA_front</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../prettify.css" />
<link rel="stylesheet" href="../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../index.html">All files</a> 4NK_IA_front</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/57</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/57</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
<td class="file low" data-value="simple-server.js"><a href="simple-server.js.html">simple-server.js</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="57" class="abs low">0/57</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="57" class="abs low">0/57</td>
</tr>
</tbody>
</table>
</div>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2025-09-11T09:40:00.754Z
</div>
<script src="../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../sorter.js"></script>
<script src="../block-navigation.js"></script>
</body>
</html>

View File

@ -0,0 +1,283 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for 4NK_IA_front/simple-server.js</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../prettify.css" />
<link rel="stylesheet" href="../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../index.html">All files</a> / <a href="index.html">4NK_IA_front</a> simple-server.js</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/57</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/57</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a>
<a name='L42'></a><a href='#L42'>42</a>
<a name='L43'></a><a href='#L43'>43</a>
<a name='L44'></a><a href='#L44'>44</a>
<a name='L45'></a><a href='#L45'>45</a>
<a name='L46'></a><a href='#L46'>46</a>
<a name='L47'></a><a href='#L47'>47</a>
<a name='L48'></a><a href='#L48'>48</a>
<a name='L49'></a><a href='#L49'>49</a>
<a name='L50'></a><a href='#L50'>50</a>
<a name='L51'></a><a href='#L51'>51</a>
<a name='L52'></a><a href='#L52'>52</a>
<a name='L53'></a><a href='#L53'>53</a>
<a name='L54'></a><a href='#L54'>54</a>
<a name='L55'></a><a href='#L55'>55</a>
<a name='L56'></a><a href='#L56'>56</a>
<a name='L57'></a><a href='#L57'>57</a>
<a name='L58'></a><a href='#L58'>58</a>
<a name='L59'></a><a href='#L59'>59</a>
<a name='L60'></a><a href='#L60'>60</a>
<a name='L61'></a><a href='#L61'>61</a>
<a name='L62'></a><a href='#L62'>62</a>
<a name='L63'></a><a href='#L63'>63</a>
<a name='L64'></a><a href='#L64'>64</a>
<a name='L65'></a><a href='#L65'>65</a>
<a name='L66'></a><a href='#L66'>66</a>
<a name='L67'></a><a href='#L67'>67</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" >#!/usr/bin/env node</span></span></span>
&nbsp;
<span class="cstat-no" title="statement not covered" >import http from 'http';</span>
<span class="cstat-no" title="statement not covered" >import fs from 'fs';</span>
<span class="cstat-no" title="statement not covered" >import path from 'path';</span>
<span class="cstat-no" title="statement not covered" >import { fileURLToPath } from 'url';</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >const __filename = fileURLToPath(import.meta.url);</span>
<span class="cstat-no" title="statement not covered" >const __dirname = path.dirname(__filename);</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >const PORT = 5173;</span>
<span class="cstat-no" title="statement not covered" >const HOST = '0.0.0.0';</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >// Types MIME</span>
<span class="cstat-no" title="statement not covered" >const mimeTypes = {</span>
<span class="cstat-no" title="statement not covered" > '.html': 'text/html',</span>
<span class="cstat-no" title="statement not covered" > '.js': 'text/javascript',</span>
<span class="cstat-no" title="statement not covered" > '.css': 'text/css',</span>
<span class="cstat-no" title="statement not covered" > '.json': 'application/json',</span>
<span class="cstat-no" title="statement not covered" > '.png': 'image/png',</span>
<span class="cstat-no" title="statement not covered" > '.jpg': 'image/jpg',</span>
<span class="cstat-no" title="statement not covered" > '.gif': 'image/gif',</span>
<span class="cstat-no" title="statement not covered" > '.svg': 'image/svg+xml',</span>
<span class="cstat-no" title="statement not covered" > '.ico': 'image/x-icon'</span>
<span class="cstat-no" title="statement not covered" >};</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >const server = http.createServer((req, res) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`);</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > let filePath = '.' + req.url;</span>
<span class="cstat-no" title="statement not covered" > if (filePath === './') {</span>
<span class="cstat-no" title="statement not covered" > filePath = './index.html';</span>
<span class="cstat-no" title="statement not covered" > }</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > const extname = String(path.extname(filePath)).toLowerCase();</span>
<span class="cstat-no" title="statement not covered" > const mimeType = mimeTypes[extname] || 'application/octet-stream';</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > fs.readFile(filePath, (error, content) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > if (error) {</span>
<span class="cstat-no" title="statement not covered" > if (error.code === 'ENOENT') {</span>
<span class="cstat-no" title="statement not covered" > // Fichier non trouvé, servir index.html pour SPA</span>
<span class="cstat-no" title="statement not covered" > fs.readFile('./index.html', (error, content) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > if (error) {</span>
<span class="cstat-no" title="statement not covered" > res.writeHead(404);</span>
<span class="cstat-no" title="statement not covered" > res.end('File not found');</span>
<span class="cstat-no" title="statement not covered" > } else {</span>
<span class="cstat-no" title="statement not covered" > res.writeHead(200, { 'Content-Type': 'text/html' });</span>
<span class="cstat-no" title="statement not covered" > res.end(content, 'utf-8');</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" > });</span>
<span class="cstat-no" title="statement not covered" > } else {</span>
<span class="cstat-no" title="statement not covered" > res.writeHead(500);</span>
<span class="cstat-no" title="statement not covered" > res.end('Server error: ' + error.code);</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" > } else {</span>
<span class="cstat-no" title="statement not covered" > res.writeHead(200, { 'Content-Type': mimeType });</span>
<span class="cstat-no" title="statement not covered" > res.end(content, 'utf-8');</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" > });</span>
<span class="cstat-no" title="statement not covered" >});</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >server.listen(PORT, HOST, () =&gt; {</span>
<span class="cstat-no" title="statement not covered" > console.log(`🚀 Serveur 4NK_IA_front démarré sur http://${HOST}:${PORT}`);</span>
<span class="cstat-no" title="statement not covered" > console.log(`📁 Servant les fichiers depuis: ${process.cwd()}`);</span>
<span class="cstat-no" title="statement not covered" > console.log(`💡 Appuyez sur Ctrl+C pour arrêter`);</span>
<span class="cstat-no" title="statement not covered" >});</span>
&nbsp;</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2025-09-11T09:40:00.754Z
</div>
<script src="../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../sorter.js"></script>
<script src="../block-navigation.js"></script>
</body>
</html>

View File

@ -0,0 +1,103 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for 4NK_IA_front/src/App.tsx</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../prettify.css" />
<link rel="stylesheet" href="../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../index.html">All files</a> / <a href="index.html">4NK_IA_front/src</a> App.tsx</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/5</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/5</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import './App.css'<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
<span class="cstat-no" title="statement not covered" >import { AppRouter } from './router'</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >export default function App() {</span>
<span class="cstat-no" title="statement not covered" > return &lt;AppRouter /&gt;</span>
<span class="cstat-no" title="statement not covered" >}</span>
&nbsp;</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2025-09-11T09:40:00.754Z
</div>
<script src="../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../sorter.js"></script>
<script src="../../block-navigation.js"></script>
</body>
</html>

View File

@ -0,0 +1,772 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for 4NK_IA_front/src/components/FilePreview.tsx</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../../prettify.css" />
<link rel="stylesheet" href="../../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../../index.html">All files</a> / <a href="index.html">4NK_IA_front/src/components</a> FilePreview.tsx</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/171</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/171</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a>
<a name='L42'></a><a href='#L42'>42</a>
<a name='L43'></a><a href='#L43'>43</a>
<a name='L44'></a><a href='#L44'>44</a>
<a name='L45'></a><a href='#L45'>45</a>
<a name='L46'></a><a href='#L46'>46</a>
<a name='L47'></a><a href='#L47'>47</a>
<a name='L48'></a><a href='#L48'>48</a>
<a name='L49'></a><a href='#L49'>49</a>
<a name='L50'></a><a href='#L50'>50</a>
<a name='L51'></a><a href='#L51'>51</a>
<a name='L52'></a><a href='#L52'>52</a>
<a name='L53'></a><a href='#L53'>53</a>
<a name='L54'></a><a href='#L54'>54</a>
<a name='L55'></a><a href='#L55'>55</a>
<a name='L56'></a><a href='#L56'>56</a>
<a name='L57'></a><a href='#L57'>57</a>
<a name='L58'></a><a href='#L58'>58</a>
<a name='L59'></a><a href='#L59'>59</a>
<a name='L60'></a><a href='#L60'>60</a>
<a name='L61'></a><a href='#L61'>61</a>
<a name='L62'></a><a href='#L62'>62</a>
<a name='L63'></a><a href='#L63'>63</a>
<a name='L64'></a><a href='#L64'>64</a>
<a name='L65'></a><a href='#L65'>65</a>
<a name='L66'></a><a href='#L66'>66</a>
<a name='L67'></a><a href='#L67'>67</a>
<a name='L68'></a><a href='#L68'>68</a>
<a name='L69'></a><a href='#L69'>69</a>
<a name='L70'></a><a href='#L70'>70</a>
<a name='L71'></a><a href='#L71'>71</a>
<a name='L72'></a><a href='#L72'>72</a>
<a name='L73'></a><a href='#L73'>73</a>
<a name='L74'></a><a href='#L74'>74</a>
<a name='L75'></a><a href='#L75'>75</a>
<a name='L76'></a><a href='#L76'>76</a>
<a name='L77'></a><a href='#L77'>77</a>
<a name='L78'></a><a href='#L78'>78</a>
<a name='L79'></a><a href='#L79'>79</a>
<a name='L80'></a><a href='#L80'>80</a>
<a name='L81'></a><a href='#L81'>81</a>
<a name='L82'></a><a href='#L82'>82</a>
<a name='L83'></a><a href='#L83'>83</a>
<a name='L84'></a><a href='#L84'>84</a>
<a name='L85'></a><a href='#L85'>85</a>
<a name='L86'></a><a href='#L86'>86</a>
<a name='L87'></a><a href='#L87'>87</a>
<a name='L88'></a><a href='#L88'>88</a>
<a name='L89'></a><a href='#L89'>89</a>
<a name='L90'></a><a href='#L90'>90</a>
<a name='L91'></a><a href='#L91'>91</a>
<a name='L92'></a><a href='#L92'>92</a>
<a name='L93'></a><a href='#L93'>93</a>
<a name='L94'></a><a href='#L94'>94</a>
<a name='L95'></a><a href='#L95'>95</a>
<a name='L96'></a><a href='#L96'>96</a>
<a name='L97'></a><a href='#L97'>97</a>
<a name='L98'></a><a href='#L98'>98</a>
<a name='L99'></a><a href='#L99'>99</a>
<a name='L100'></a><a href='#L100'>100</a>
<a name='L101'></a><a href='#L101'>101</a>
<a name='L102'></a><a href='#L102'>102</a>
<a name='L103'></a><a href='#L103'>103</a>
<a name='L104'></a><a href='#L104'>104</a>
<a name='L105'></a><a href='#L105'>105</a>
<a name='L106'></a><a href='#L106'>106</a>
<a name='L107'></a><a href='#L107'>107</a>
<a name='L108'></a><a href='#L108'>108</a>
<a name='L109'></a><a href='#L109'>109</a>
<a name='L110'></a><a href='#L110'>110</a>
<a name='L111'></a><a href='#L111'>111</a>
<a name='L112'></a><a href='#L112'>112</a>
<a name='L113'></a><a href='#L113'>113</a>
<a name='L114'></a><a href='#L114'>114</a>
<a name='L115'></a><a href='#L115'>115</a>
<a name='L116'></a><a href='#L116'>116</a>
<a name='L117'></a><a href='#L117'>117</a>
<a name='L118'></a><a href='#L118'>118</a>
<a name='L119'></a><a href='#L119'>119</a>
<a name='L120'></a><a href='#L120'>120</a>
<a name='L121'></a><a href='#L121'>121</a>
<a name='L122'></a><a href='#L122'>122</a>
<a name='L123'></a><a href='#L123'>123</a>
<a name='L124'></a><a href='#L124'>124</a>
<a name='L125'></a><a href='#L125'>125</a>
<a name='L126'></a><a href='#L126'>126</a>
<a name='L127'></a><a href='#L127'>127</a>
<a name='L128'></a><a href='#L128'>128</a>
<a name='L129'></a><a href='#L129'>129</a>
<a name='L130'></a><a href='#L130'>130</a>
<a name='L131'></a><a href='#L131'>131</a>
<a name='L132'></a><a href='#L132'>132</a>
<a name='L133'></a><a href='#L133'>133</a>
<a name='L134'></a><a href='#L134'>134</a>
<a name='L135'></a><a href='#L135'>135</a>
<a name='L136'></a><a href='#L136'>136</a>
<a name='L137'></a><a href='#L137'>137</a>
<a name='L138'></a><a href='#L138'>138</a>
<a name='L139'></a><a href='#L139'>139</a>
<a name='L140'></a><a href='#L140'>140</a>
<a name='L141'></a><a href='#L141'>141</a>
<a name='L142'></a><a href='#L142'>142</a>
<a name='L143'></a><a href='#L143'>143</a>
<a name='L144'></a><a href='#L144'>144</a>
<a name='L145'></a><a href='#L145'>145</a>
<a name='L146'></a><a href='#L146'>146</a>
<a name='L147'></a><a href='#L147'>147</a>
<a name='L148'></a><a href='#L148'>148</a>
<a name='L149'></a><a href='#L149'>149</a>
<a name='L150'></a><a href='#L150'>150</a>
<a name='L151'></a><a href='#L151'>151</a>
<a name='L152'></a><a href='#L152'>152</a>
<a name='L153'></a><a href='#L153'>153</a>
<a name='L154'></a><a href='#L154'>154</a>
<a name='L155'></a><a href='#L155'>155</a>
<a name='L156'></a><a href='#L156'>156</a>
<a name='L157'></a><a href='#L157'>157</a>
<a name='L158'></a><a href='#L158'>158</a>
<a name='L159'></a><a href='#L159'>159</a>
<a name='L160'></a><a href='#L160'>160</a>
<a name='L161'></a><a href='#L161'>161</a>
<a name='L162'></a><a href='#L162'>162</a>
<a name='L163'></a><a href='#L163'>163</a>
<a name='L164'></a><a href='#L164'>164</a>
<a name='L165'></a><a href='#L165'>165</a>
<a name='L166'></a><a href='#L166'>166</a>
<a name='L167'></a><a href='#L167'>167</a>
<a name='L168'></a><a href='#L168'>168</a>
<a name='L169'></a><a href='#L169'>169</a>
<a name='L170'></a><a href='#L170'>170</a>
<a name='L171'></a><a href='#L171'>171</a>
<a name='L172'></a><a href='#L172'>172</a>
<a name='L173'></a><a href='#L173'>173</a>
<a name='L174'></a><a href='#L174'>174</a>
<a name='L175'></a><a href='#L175'>175</a>
<a name='L176'></a><a href='#L176'>176</a>
<a name='L177'></a><a href='#L177'>177</a>
<a name='L178'></a><a href='#L178'>178</a>
<a name='L179'></a><a href='#L179'>179</a>
<a name='L180'></a><a href='#L180'>180</a>
<a name='L181'></a><a href='#L181'>181</a>
<a name='L182'></a><a href='#L182'>182</a>
<a name='L183'></a><a href='#L183'>183</a>
<a name='L184'></a><a href='#L184'>184</a>
<a name='L185'></a><a href='#L185'>185</a>
<a name='L186'></a><a href='#L186'>186</a>
<a name='L187'></a><a href='#L187'>187</a>
<a name='L188'></a><a href='#L188'>188</a>
<a name='L189'></a><a href='#L189'>189</a>
<a name='L190'></a><a href='#L190'>190</a>
<a name='L191'></a><a href='#L191'>191</a>
<a name='L192'></a><a href='#L192'>192</a>
<a name='L193'></a><a href='#L193'>193</a>
<a name='L194'></a><a href='#L194'>194</a>
<a name='L195'></a><a href='#L195'>195</a>
<a name='L196'></a><a href='#L196'>196</a>
<a name='L197'></a><a href='#L197'>197</a>
<a name='L198'></a><a href='#L198'>198</a>
<a name='L199'></a><a href='#L199'>199</a>
<a name='L200'></a><a href='#L200'>200</a>
<a name='L201'></a><a href='#L201'>201</a>
<a name='L202'></a><a href='#L202'>202</a>
<a name='L203'></a><a href='#L203'>203</a>
<a name='L204'></a><a href='#L204'>204</a>
<a name='L205'></a><a href='#L205'>205</a>
<a name='L206'></a><a href='#L206'>206</a>
<a name='L207'></a><a href='#L207'>207</a>
<a name='L208'></a><a href='#L208'>208</a>
<a name='L209'></a><a href='#L209'>209</a>
<a name='L210'></a><a href='#L210'>210</a>
<a name='L211'></a><a href='#L211'>211</a>
<a name='L212'></a><a href='#L212'>212</a>
<a name='L213'></a><a href='#L213'>213</a>
<a name='L214'></a><a href='#L214'>214</a>
<a name='L215'></a><a href='#L215'>215</a>
<a name='L216'></a><a href='#L216'>216</a>
<a name='L217'></a><a href='#L217'>217</a>
<a name='L218'></a><a href='#L218'>218</a>
<a name='L219'></a><a href='#L219'>219</a>
<a name='L220'></a><a href='#L220'>220</a>
<a name='L221'></a><a href='#L221'>221</a>
<a name='L222'></a><a href='#L222'>222</a>
<a name='L223'></a><a href='#L223'>223</a>
<a name='L224'></a><a href='#L224'>224</a>
<a name='L225'></a><a href='#L225'>225</a>
<a name='L226'></a><a href='#L226'>226</a>
<a name='L227'></a><a href='#L227'>227</a>
<a name='L228'></a><a href='#L228'>228</a>
<a name='L229'></a><a href='#L229'>229</a>
<a name='L230'></a><a href='#L230'>230</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import React, { useState, useEffect } from 'react'<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
<span class="cstat-no" title="statement not covered" >import {</span>
Box,
Typography,
Paper,
IconButton,
Button,
Dialog,
DialogTitle,
DialogContent,
DialogActions,
CircularProgress,
Alert,
} from '@mui/material'
<span class="cstat-no" title="statement not covered" >import {</span>
PictureAsPdf,
Download,
Close,
ZoomIn,
ZoomOut,
NavigateBefore,
NavigateNext,
} from '@mui/icons-material'
import type { Document } from '../types'
&nbsp;
interface FilePreviewProps {
document: Document
onClose: () =&gt; void
}
&nbsp;
<span class="cstat-no" title="statement not covered" >export const FilePreview: React.FC&lt;FilePreviewProps&gt; = ({ document, onClose }) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > const [loading, setLoading] = useState(true)</span>
<span class="cstat-no" title="statement not covered" > const [error, setError] = useState&lt;string | null&gt;(null)</span>
<span class="cstat-no" title="statement not covered" > const [page, setPage] = useState(1)</span>
<span class="cstat-no" title="statement not covered" > const [scale, setScale] = useState(1.0)</span>
<span class="cstat-no" title="statement not covered" > const [numPages, setNumPages] = useState(0)</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > useEffect(() =&gt; {</span>
<span class="cstat-no" title="statement not covered" > setLoading(true)</span>
<span class="cstat-no" title="statement not covered" > setError(null)</span>
<span class="cstat-no" title="statement not covered" > setPage(1)</span>
<span class="cstat-no" title="statement not covered" > setScale(1.0)</span>
&nbsp;
// Simuler le chargement du PDF
<span class="cstat-no" title="statement not covered" > const timer = setTimeout(() =&gt; {</span>
<span class="cstat-no" title="statement not covered" > setNumPages(3) // Simuler 3 pages</span>
<span class="cstat-no" title="statement not covered" > setLoading(false)</span>
<span class="cstat-no" title="statement not covered" > }, 1000)</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > return () =&gt; clearTimeout(timer)</span>
<span class="cstat-no" title="statement not covered" > }, [document])</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > const handleDownload = () =&gt; {</span>
<span class="cstat-no" title="statement not covered" > if (document.previewUrl) {</span>
<span class="cstat-no" title="statement not covered" > const link = document.createElement('a')</span>
<span class="cstat-no" title="statement not covered" > link.href = document.previewUrl</span>
<span class="cstat-no" title="statement not covered" > link.download = document.name</span>
<span class="cstat-no" title="statement not covered" > link.click()</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" > }</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > const isPDF = document.type.includes('pdf') || document.name.toLowerCase().endsWith('.pdf')</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > if (!isPDF) {</span>
<span class="cstat-no" title="statement not covered" > return (</span>
<span class="cstat-no" title="statement not covered" > &lt;Paper sx={{ p: 3, mt: 2 }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Box display="flex" justifyContent="space-between" alignItems="center" mb={2}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6"&gt;{document.name}&lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;IconButton onClick={onClose} title="Fermer"&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Close /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/IconButton&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Alert severity="info"&gt;</span>
<span class="cstat-no" title="statement not covered" > Aperçu non disponible pour ce type de fichier ({document.type})</span>
<span class="cstat-no" title="statement not covered" > &lt;/Alert&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Paper&gt;</span>
)
<span class="cstat-no" title="statement not covered" > }</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > return (</span>
<span class="cstat-no" title="statement not covered" > &lt;Dialog open onClose={onClose} maxWidth="lg" fullWidth&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;DialogTitle&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Box display="flex" justifyContent="space-between" alignItems="center"&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Box display="flex" alignItems="center" gap={1}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;PictureAsPdf color="error" /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6"&gt;{document.name}&lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;IconButton onClick={onClose} title="Fermer"&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Close /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/IconButton&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/DialogTitle&gt;</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > &lt;DialogContent dividers&gt;</span>
<span class="cstat-no" title="statement not covered" > {loading &amp;&amp; (</span>
<span class="cstat-no" title="statement not covered" > &lt;Box display="flex" justifyContent="center" alignItems="center" minHeight="400px"&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;CircularProgress /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="body2" sx={{ ml: 2 }}&gt;</span>
Chargement du PDF...
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
)}
&nbsp;
<span class="cstat-no" title="statement not covered" > {error &amp;&amp; (</span>
<span class="cstat-no" title="statement not covered" > &lt;Alert severity="error" sx={{ mb: 2 }}&gt;</span>
<span class="cstat-no" title="statement not covered" > {error}</span>
<span class="cstat-no" title="statement not covered" > &lt;/Alert&gt;</span>
)}
&nbsp;
<span class="cstat-no" title="statement not covered" > {!loading &amp;&amp; !error &amp;&amp; (</span>
<span class="cstat-no" title="statement not covered" > &lt;Box&gt;</span>
{/* Contrôles de navigation */}
<span class="cstat-no" title="statement not covered" > &lt;Box display="flex" justifyContent="space-between" alignItems="center" mb={2}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Box display="flex" alignItems="center" gap={1}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Button</span>
<span class="cstat-no" title="statement not covered" > variant="outlined"</span>
<span class="cstat-no" title="statement not covered" > size="small"</span>
<span class="cstat-no" title="statement not covered" > startIcon={&lt;NavigateBefore /&gt;}</span>
<span class="cstat-no" title="statement not covered" > onClick={() =&gt; setPage(prev =&gt; Math.max(prev - 1, 1))}</span>
<span class="cstat-no" title="statement not covered" > disabled={page &lt;= 1}</span>
<span class="cstat-no" title="statement not covered" > &gt;</span>
Précédent
<span class="cstat-no" title="statement not covered" > &lt;/Button&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="body2"&gt;</span>
<span class="cstat-no" title="statement not covered" > Page {page} sur {numPages}</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Button</span>
<span class="cstat-no" title="statement not covered" > variant="outlined"</span>
<span class="cstat-no" title="statement not covered" > size="small"</span>
<span class="cstat-no" title="statement not covered" > endIcon={&lt;NavigateNext /&gt;}</span>
<span class="cstat-no" title="statement not covered" > onClick={() =&gt; setPage(prev =&gt; Math.min(prev + 1, numPages))}</span>
<span class="cstat-no" title="statement not covered" > disabled={page &gt;= numPages}</span>
<span class="cstat-no" title="statement not covered" > &gt;</span>
Suivant
<span class="cstat-no" title="statement not covered" > &lt;/Button&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > &lt;Box display="flex" alignItems="center" gap={1}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Button</span>
<span class="cstat-no" title="statement not covered" > variant="outlined"</span>
<span class="cstat-no" title="statement not covered" > size="small"</span>
<span class="cstat-no" title="statement not covered" > startIcon={&lt;ZoomOut /&gt;}</span>
<span class="cstat-no" title="statement not covered" > onClick={() =&gt; setScale(prev =&gt; Math.max(prev - 0.2, 0.5))}</span>
<span class="cstat-no" title="statement not covered" > &gt;</span>
Zoom -
<span class="cstat-no" title="statement not covered" > &lt;/Button&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="body2"&gt;</span>
<span class="cstat-no" title="statement not covered" > {Math.round(scale * 100)}%</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Button</span>
<span class="cstat-no" title="statement not covered" > variant="outlined"</span>
<span class="cstat-no" title="statement not covered" > size="small"</span>
<span class="cstat-no" title="statement not covered" > startIcon={&lt;ZoomIn /&gt;}</span>
<span class="cstat-no" title="statement not covered" > onClick={() =&gt; setScale(prev =&gt; Math.min(prev + 0.2, 2.0))}</span>
<span class="cstat-no" title="statement not covered" > &gt;</span>
Zoom +
<span class="cstat-no" title="statement not covered" > &lt;/Button&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
&nbsp;
{/* Aperçu PDF avec viewer intégré */}
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{</span>
<span class="cstat-no" title="statement not covered" > border: '1px solid',</span>
<span class="cstat-no" title="statement not covered" > borderColor: 'grey.300',</span>
<span class="cstat-no" title="statement not covered" > borderRadius: 1,</span>
<span class="cstat-no" title="statement not covered" > overflow: 'hidden',</span>
<span class="cstat-no" title="statement not covered" > maxHeight: '70vh',</span>
<span class="cstat-no" title="statement not covered" > display: 'flex',</span>
<span class="cstat-no" title="statement not covered" > justifyContent: 'center',</span>
<span class="cstat-no" title="statement not covered" > backgroundColor: 'grey.50'</span>
<span class="cstat-no" title="statement not covered" > }}&gt;</span>
<span class="cstat-no" title="statement not covered" > {document.previewUrl ? (</span>
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ width: '100%', height: '600px' }}&gt;</span>
{/* Utiliser un viewer PDF intégré */}
<span class="cstat-no" title="statement not covered" > &lt;iframe</span>
<span class="cstat-no" title="statement not covered" > src={`${document.previewUrl}#toolbar=1&amp;navpanes=1&amp;scrollbar=1&amp;page=1&amp;view=FitH`}</span>
<span class="cstat-no" title="statement not covered" > width="100%"</span>
<span class="cstat-no" title="statement not covered" > height="100%"</span>
<span class="cstat-no" title="statement not covered" > style={{</span>
<span class="cstat-no" title="statement not covered" > border: 'none',</span>
<span class="cstat-no" title="statement not covered" > transform: `scale(${scale})`,</span>
<span class="cstat-no" title="statement not covered" > transformOrigin: 'top left',</span>
<span class="cstat-no" title="statement not covered" > width: `${100 / scale}%`,</span>
<span class="cstat-no" title="statement not covered" > height: `${600 / scale}px`</span>
<span class="cstat-no" title="statement not covered" > }}</span>
<span class="cstat-no" title="statement not covered" > title={`Aperçu de ${document.name}`}</span>
<span class="cstat-no" title="statement not covered" > onLoad={() =&gt; setLoading(false)}</span>
<span class="cstat-no" title="statement not covered" > onError={() =&gt; {</span>
<span class="cstat-no" title="statement not covered" > setError('Erreur de chargement du PDF')</span>
<span class="cstat-no" title="statement not covered" > setLoading(false)</span>
<span class="cstat-no" title="statement not covered" > }}</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
) : (
<span class="cstat-no" title="statement not covered" > &lt;Box display="flex" justifyContent="center" alignItems="center" minHeight="400px"&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Box textAlign="center"&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;PictureAsPdf sx={{ fontSize: 64, color: 'error.main', mb: 2 }} /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6" gutterBottom&gt;</span>
Aperçu PDF
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="body2" color="text.secondary"&gt;</span>
<span class="cstat-no" title="statement not covered" > Le fichier PDF "{document.name}" a été uploadé avec succès.</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="body2" color="text.secondary"&gt;</span>
<span class="cstat-no" title="statement not covered" > Taille: {(document.size / 1024 / 1024).toFixed(2)} MB</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
)}
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
)}
<span class="cstat-no" title="statement not covered" > &lt;/DialogContent&gt;</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > &lt;DialogActions&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Button onClick={onClose}&gt;</span>
Fermer
<span class="cstat-no" title="statement not covered" > &lt;/Button&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Button</span>
<span class="cstat-no" title="statement not covered" > variant="contained"</span>
<span class="cstat-no" title="statement not covered" > startIcon={&lt;Download /&gt;}</span>
<span class="cstat-no" title="statement not covered" > onClick={handleDownload}</span>
<span class="cstat-no" title="statement not covered" > disabled={!document.previewUrl}</span>
<span class="cstat-no" title="statement not covered" > &gt;</span>
Télécharger
<span class="cstat-no" title="statement not covered" > &lt;/Button&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/DialogActions&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Dialog&gt;</span>
)
<span class="cstat-no" title="statement not covered" >}</span></pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2025-09-11T09:40:00.754Z
</div>
<script src="../../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../../sorter.js"></script>
<script src="../../../block-navigation.js"></script>
</body>
</html>

View File

@ -3,15 +3,15 @@
<html lang="en"> <html lang="en">
<head> <head>
<title>Code coverage report for App.tsx</title> <title>Code coverage report for 4NK_IA_front/src/components/Layout.tsx</title>
<meta charset="utf-8" /> <meta charset="utf-8" />
<link rel="stylesheet" href="prettify.css" /> <link rel="stylesheet" href="../../../prettify.css" />
<link rel="stylesheet" href="base.css" /> <link rel="stylesheet" href="../../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="favicon.png" /> <link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'> <style type='text/css'>
.coverage-summary .sorter { .coverage-summary .sorter {
background-image: url(sort-arrow-sprite.png); background-image: url(../../../sort-arrow-sprite.png);
} }
</style> </style>
</head> </head>
@ -19,13 +19,13 @@
<body> <body>
<div class='wrapper'> <div class='wrapper'>
<div class='pad1'> <div class='pad1'>
<h1><a href="index.html">All files</a> App.tsx</h1> <h1><a href="../../../index.html">All files</a> / <a href="index.html">4NK_IA_front/src/components</a> Layout.tsx</h1>
<div class='clearfix'> <div class='clearfix'>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">0% </span> <span class="strong">0% </span>
<span class="quiet">Statements</span> <span class="quiet">Statements</span>
<span class='fraction'>0/27</span> <span class='fraction'>0/26</span>
</div> </div>
@ -46,7 +46,7 @@
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">0% </span> <span class="strong">0% </span>
<span class="quiet">Lines</span> <span class="quiet">Lines</span>
<span class='fraction'>0/27</span> <span class='fraction'>0/26</span>
</div> </div>
@ -94,11 +94,21 @@
<a name='L29'></a><a href='#L29'>29</a> <a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a> <a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a> <a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span> <a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span>
@ -112,12 +122,7 @@
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
@ -125,37 +130,47 @@
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import { useState } from 'react'<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cstat-no" title="statement not covered" >import reactLogo from './assets/react.svg'</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cstat-no" title="statement not covered" >import viteLogo from '/vite.svg'</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cstat-no" title="statement not covered" >import './App.css'</span> <span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import React from 'react'<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
<span class="cstat-no" title="statement not covered" >import { AppBar, Toolbar, Typography, Container, Box } from '@mui/material'</span>
<span class="cstat-no" title="statement not covered" >import { useNavigate, useLocation } from 'react-router-dom'</span>
<span class="cstat-no" title="statement not covered" >import { NavigationTabs } from './NavigationTabs'</span>
&nbsp; &nbsp;
<span class="cstat-no" title="statement not covered" >function App() {</span> interface LayoutProps {
<span class="cstat-no" title="statement not covered" > const [count, setCount] = useState(0)</span> children: React.ReactNode
}
&nbsp;
<span class="cstat-no" title="statement not covered" >export const Layout: React.FC&lt;LayoutProps&gt; = ({ children }) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > const navigate = useNavigate()</span>
<span class="cstat-no" title="statement not covered" > const location = useLocation()</span>
&nbsp; &nbsp;
<span class="cstat-no" title="statement not covered" > return (</span> <span class="cstat-no" title="statement not covered" > return (</span>
<span class="cstat-no" title="statement not covered" > &lt;&gt;</span> <span class="cstat-no" title="statement not covered" > &lt;Box sx={{ flexGrow: 1 }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;div&gt;</span> <span class="cstat-no" title="statement not covered" > &lt;AppBar position="static"&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;a href="https://vite.dev" target="_blank"&gt;</span> <span class="cstat-no" title="statement not covered" > &lt;Toolbar&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;img src={viteLogo} className="logo" alt="Vite logo" /&gt;</span> <span class="cstat-no" title="statement not covered" > &lt;Typography</span>
<span class="cstat-no" title="statement not covered" > &lt;/a&gt;</span> <span class="cstat-no" title="statement not covered" > variant="h6"</span>
<span class="cstat-no" title="statement not covered" > &lt;a href="https://react.dev" target="_blank"&gt;</span> <span class="cstat-no" title="statement not covered" > component="div"</span>
<span class="cstat-no" title="statement not covered" > &lt;img src={reactLogo} className="logo react" alt="React logo" /&gt;</span> <span class="cstat-no" title="statement not covered" > sx={{ flexGrow: 1, cursor: 'pointer' }}</span>
<span class="cstat-no" title="statement not covered" > &lt;/a&gt;</span> <span class="cstat-no" title="statement not covered" > onClick={() =&gt; navigate('/')}</span>
<span class="cstat-no" title="statement not covered" > &lt;/div&gt;</span> <span class="cstat-no" title="statement not covered" > &gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;h1&gt;Vite + React&lt;/h1&gt;</span> 4NK IA - Front Notarial
<span class="cstat-no" title="statement not covered" > &lt;div className="card"&gt;</span> <span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;button onClick={() =&gt; setCount((count) =&gt; count + 1)}&gt;count is {count}&lt;/button&gt;</span> <span class="cstat-no" title="statement not covered" > &lt;/Toolbar&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;p&gt;</span> <span class="cstat-no" title="statement not covered" > &lt;/AppBar&gt;</span>
<span class="cstat-no" title="statement not covered" > Edit &lt;code&gt;src/App.tsx&lt;/code&gt; and save to test HMR</span> &nbsp;
<span class="cstat-no" title="statement not covered" > &lt;/p&gt;</span> <span class="cstat-no" title="statement not covered" > &lt;NavigationTabs currentPath={location.pathname} /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/div&gt;</span> &nbsp;
<span class="cstat-no" title="statement not covered" > &lt;p className="read-the-docs"&gt;Click on the Vite and React logos to learn more&lt;/p&gt;</span> <span class="cstat-no" title="statement not covered" > &lt;Container maxWidth="xl" sx={{ mt: 3, mb: 3 }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/&gt;</span> <span class="cstat-no" title="statement not covered" > {children}</span>
<span class="cstat-no" title="statement not covered" > &lt;/Container&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
) )
<span class="cstat-no" title="statement not covered" >}</span> <span class="cstat-no" title="statement not covered" >}</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >export default App</span>
&nbsp;</pre></td></tr></table></pre> &nbsp;</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer --> <div class='push'></div><!-- for sticky footer -->
@ -163,16 +178,16 @@
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2025-09-10T15:15:07.789Z at 2025-09-11T09:40:00.754Z
</div> </div>
<script src="prettify.js"></script> <script src="../../../prettify.js"></script>
<script> <script>
window.onload = function () { window.onload = function () {
prettyPrint(); prettyPrint();
}; };
</script> </script>
<script src="sorter.js"></script> <script src="../../../sorter.js"></script>
<script src="block-navigation.js"></script> <script src="../../../block-navigation.js"></script>
</body> </body>
</html> </html>

View File

@ -0,0 +1,208 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for 4NK_IA_front/src/components/NavigationTabs.tsx</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../../prettify.css" />
<link rel="stylesheet" href="../../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../../index.html">All files</a> / <a href="index.html">4NK_IA_front/src/components</a> NavigationTabs.tsx</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/30</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/30</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a>
<a name='L42'></a><a href='#L42'>42</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import React from 'react'<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
<span class="cstat-no" title="statement not covered" >import { Tabs, Tab, Box } from '@mui/material'</span>
<span class="cstat-no" title="statement not covered" >import { useNavigate } from 'react-router-dom'</span>
&nbsp;
interface NavigationTabsProps {
currentPath: string
}
&nbsp;
<span class="cstat-no" title="statement not covered" >export const NavigationTabs: React.FC&lt;NavigationTabsProps&gt; = ({ currentPath }) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > const navigate = useNavigate()</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > const tabs = [</span>
<span class="cstat-no" title="statement not covered" > { label: 'Téléversement', path: '/' },</span>
<span class="cstat-no" title="statement not covered" > { label: 'Extraction', path: '/extraction' },</span>
<span class="cstat-no" title="statement not covered" > { label: 'Analyse', path: '/analyse' },</span>
<span class="cstat-no" title="statement not covered" > { label: 'Contexte', path: '/contexte' },</span>
<span class="cstat-no" title="statement not covered" > { label: 'Conseil', path: '/conseil' },</span>
<span class="cstat-no" title="statement not covered" > ]</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > const currentTabIndex = tabs.findIndex(tab =&gt; tab.path === currentPath)</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > const handleTabChange = (_event: React.SyntheticEvent, newValue: number) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > navigate(tabs[newValue].path)</span>
<span class="cstat-no" title="statement not covered" > }</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > return (</span>
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ borderBottom: 1, borderColor: 'divider' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Tabs</span>
<span class="cstat-no" title="statement not covered" > value={currentTabIndex &gt;= 0 ? currentTabIndex : 0}</span>
<span class="cstat-no" title="statement not covered" > onChange={handleTabChange}</span>
<span class="cstat-no" title="statement not covered" > aria-label="navigation tabs"</span>
<span class="cstat-no" title="statement not covered" > variant="scrollable"</span>
<span class="cstat-no" title="statement not covered" > scrollButtons="auto"</span>
&gt;
<span class="cstat-no" title="statement not covered" > {tabs.map((tab, index) =&gt; (</span>
<span class="cstat-no" title="statement not covered" > &lt;Tab key={index} label={tab.label} /&gt;</span>
<span class="cstat-no" title="statement not covered" > ))}</span>
<span class="cstat-no" title="statement not covered" > &lt;/Tabs&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
)
<span class="cstat-no" title="statement not covered" >}</span>
&nbsp;</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2025-09-11T09:40:00.754Z
</div>
<script src="../../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../../sorter.js"></script>
<script src="../../../block-navigation.js"></script>
</body>
</html>

View File

@ -0,0 +1,146 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for 4NK_IA_front/src/components</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../../prettify.css" />
<link rel="stylesheet" href="../../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../../index.html">All files</a> 4NK_IA_front/src/components</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/227</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/3</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/3</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/227</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
<td class="file low" data-value="FilePreview.tsx"><a href="FilePreview.tsx.html">FilePreview.tsx</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="171" class="abs low">0/171</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="171" class="abs low">0/171</td>
</tr>
<tr>
<td class="file low" data-value="Layout.tsx"><a href="Layout.tsx.html">Layout.tsx</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="26" class="abs low">0/26</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="26" class="abs low">0/26</td>
</tr>
<tr>
<td class="file low" data-value="NavigationTabs.tsx"><a href="NavigationTabs.tsx.html">NavigationTabs.tsx</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="30" class="abs low">0/30</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="30" class="abs low">0/30</td>
</tr>
</tbody>
</table>
</div>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2025-09-11T09:40:00.754Z
</div>
<script src="../../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../../sorter.js"></script>
<script src="../../../block-navigation.js"></script>
</body>
</html>

View File

@ -0,0 +1,131 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for 4NK_IA_front/src</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../prettify.css" />
<link rel="stylesheet" href="../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../index.html">All files</a> 4NK_IA_front/src</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/24</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/2</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/2</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/24</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
<td class="file low" data-value="App.tsx"><a href="App.tsx.html">App.tsx</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="5" class="abs low">0/5</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="5" class="abs low">0/5</td>
</tr>
<tr>
<td class="file low" data-value="main.tsx"><a href="main.tsx.html">main.tsx</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="19" class="abs low">0/19</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="19" class="abs low">0/19</td>
</tr>
</tbody>
</table>
</div>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2025-09-11T09:40:00.754Z
</div>
<script src="../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../sorter.js"></script>
<script src="../../block-navigation.js"></script>
</body>
</html>

View File

@ -3,15 +3,15 @@
<html lang="en"> <html lang="en">
<head> <head>
<title>Code coverage report for main.tsx</title> <title>Code coverage report for 4NK_IA_front/src/main.tsx</title>
<meta charset="utf-8" /> <meta charset="utf-8" />
<link rel="stylesheet" href="prettify.css" /> <link rel="stylesheet" href="../../prettify.css" />
<link rel="stylesheet" href="base.css" /> <link rel="stylesheet" href="../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="favicon.png" /> <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'> <style type='text/css'>
.coverage-summary .sorter { .coverage-summary .sorter {
background-image: url(sort-arrow-sprite.png); background-image: url(../../sort-arrow-sprite.png);
} }
</style> </style>
</head> </head>
@ -19,13 +19,13 @@
<body> <body>
<div class='wrapper'> <div class='wrapper'>
<div class='pad1'> <div class='pad1'>
<h1><a href="index.html">All files</a> main.tsx</h1> <h1><a href="../../index.html">All files</a> / <a href="index.html">4NK_IA_front/src</a> main.tsx</h1>
<div class='clearfix'> <div class='clearfix'>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">0% </span> <span class="strong">0% </span>
<span class="quiet">Statements</span> <span class="quiet">Statements</span>
<span class='fraction'>0/9</span> <span class='fraction'>0/19</span>
</div> </div>
@ -46,7 +46,7 @@
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">0% </span> <span class="strong">0% </span>
<span class="quiet">Lines</span> <span class="quiet">Lines</span>
<span class='fraction'>0/9</span> <span class='fraction'>0/19</span>
</div> </div>
@ -73,7 +73,22 @@
<a name='L8'></a><a href='#L8'>8</a> <a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a> <a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a> <a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span> <a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
@ -83,14 +98,29 @@
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import { StrictMode } from 'react'<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span> <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import { StrictMode } from 'react'<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
<span class="cstat-no" title="statement not covered" >import { createRoot } from 'react-dom/client'</span> <span class="cstat-no" title="statement not covered" >import { createRoot } from 'react-dom/client'</span>
<span class="cstat-no" title="statement not covered" >import { Provider } from 'react-redux'</span>
<span class="cstat-no" title="statement not covered" >import { ThemeProvider } from '@mui/material/styles'</span>
<span class="cstat-no" title="statement not covered" >import { CssBaseline } from '@mui/material'</span>
<span class="cstat-no" title="statement not covered" >import './index.css'</span> <span class="cstat-no" title="statement not covered" >import './index.css'</span>
<span class="cstat-no" title="statement not covered" >import App from './App.tsx'</span> <span class="cstat-no" title="statement not covered" >import App from './App.tsx'</span>
<span class="cstat-no" title="statement not covered" >import { store } from './store'</span>
<span class="cstat-no" title="statement not covered" >import { theme } from './theme'</span>
&nbsp; &nbsp;
<span class="cstat-no" title="statement not covered" >createRoot(document.getElementById('root')!).render(</span> <span class="cstat-no" title="statement not covered" >createRoot(document.getElementById('root')!).render(</span>
<span class="cstat-no" title="statement not covered" > &lt;StrictMode&gt;</span> <span class="cstat-no" title="statement not covered" > &lt;StrictMode&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Provider store={store}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;ThemeProvider theme={theme}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;CssBaseline /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;App /&gt;</span> <span class="cstat-no" title="statement not covered" > &lt;App /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/ThemeProvider&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Provider&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/StrictMode&gt;,</span> <span class="cstat-no" title="statement not covered" > &lt;/StrictMode&gt;,</span>
<span class="cstat-no" title="statement not covered" >)</span> <span class="cstat-no" title="statement not covered" >)</span>
&nbsp;</pre></td></tr></table></pre> &nbsp;</pre></td></tr></table></pre>
@ -100,16 +130,16 @@
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2025-09-10T15:15:07.789Z at 2025-09-11T09:40:00.754Z
</div> </div>
<script src="prettify.js"></script> <script src="../../prettify.js"></script>
<script> <script>
window.onload = function () { window.onload = function () {
prettyPrint(); prettyPrint();
}; };
</script> </script>
<script src="sorter.js"></script> <script src="../../sorter.js"></script>
<script src="block-navigation.js"></script> <script src="../../block-navigation.js"></script>
</body> </body>
</html> </html>

View File

@ -0,0 +1,116 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for 4NK_IA_front/src/router</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../../prettify.css" />
<link rel="stylesheet" href="../../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../../index.html">All files</a> 4NK_IA_front/src/router</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/23</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/23</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
<td class="file low" data-value="index.tsx"><a href="index.tsx.html">index.tsx</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="23" class="abs low">0/23</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="23" class="abs low">0/23</td>
</tr>
</tbody>
</table>
</div>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2025-09-11T09:40:00.754Z
</div>
<script src="../../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../../sorter.js"></script>
<script src="../../../block-navigation.js"></script>
</body>
</html>

View File

@ -0,0 +1,169 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for 4NK_IA_front/src/router/index.tsx</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../../prettify.css" />
<link rel="stylesheet" href="../../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../../index.html">All files</a> / <a href="index.html">4NK_IA_front/src/router</a> index.tsx</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/23</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/23</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import { lazy, Suspense } from 'react'<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
<span class="cstat-no" title="statement not covered" >import { createBrowserRouter, RouterProvider } from 'react-router-dom'</span>
<span class="cstat-no" title="statement not covered" >import { Box, CircularProgress, Typography } from '@mui/material'</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >const UploadView = lazy(() =&gt; import('../views/UploadView'))</span>
<span class="cstat-no" title="statement not covered" >const ExtractionView = lazy(() =&gt; import('../views/ExtractionView'))</span>
<span class="cstat-no" title="statement not covered" >const AnalyseView = lazy(() =&gt; import('../views/AnalyseView'))</span>
<span class="cstat-no" title="statement not covered" >const ContexteView = lazy(() =&gt; import('../views/ContexteView'))</span>
<span class="cstat-no" title="statement not covered" >const ConseilView = lazy(() =&gt; import('../views/ConseilView'))</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >const LoadingFallback = () =&gt; (</span>
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ display: 'flex', justifyContent: 'center', alignItems: 'center', minHeight: '50vh' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;CircularProgress /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography sx={{ ml: 2 }}&gt;Chargement...&lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
)
&nbsp;
<span class="cstat-no" title="statement not covered" >const router = createBrowserRouter([</span>
<span class="cstat-no" title="statement not covered" > { path: '/', element: &lt;Suspense fallback={&lt;LoadingFallback /&gt;}&gt;&lt;UploadView /&gt;&lt;/Suspense&gt; },</span>
<span class="cstat-no" title="statement not covered" > { path: '/extraction', element: &lt;Suspense fallback={&lt;LoadingFallback /&gt;}&gt;&lt;ExtractionView /&gt;&lt;/Suspense&gt; },</span>
<span class="cstat-no" title="statement not covered" > { path: '/analyse', element: &lt;Suspense fallback={&lt;LoadingFallback /&gt;}&gt;&lt;AnalyseView /&gt;&lt;/Suspense&gt; },</span>
<span class="cstat-no" title="statement not covered" > { path: '/contexte', element: &lt;Suspense fallback={&lt;LoadingFallback /&gt;}&gt;&lt;ContexteView /&gt;&lt;/Suspense&gt; },</span>
<span class="cstat-no" title="statement not covered" > { path: '/conseil', element: &lt;Suspense fallback={&lt;LoadingFallback /&gt;}&gt;&lt;ConseilView /&gt;&lt;/Suspense&gt; },</span>
<span class="cstat-no" title="statement not covered" >])</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >export const AppRouter = () =&gt; {</span>
<span class="cstat-no" title="statement not covered" > return &lt;RouterProvider router={router} /&gt;</span>
<span class="cstat-no" title="statement not covered" >}</span>
&nbsp;</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2025-09-11T09:40:00.754Z
</div>
<script src="../../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../../sorter.js"></script>
<script src="../../../block-navigation.js"></script>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,116 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for 4NK_IA_front/src/services</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../../prettify.css" />
<link rel="stylesheet" href="../../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../../index.html">All files</a> 4NK_IA_front/src/services</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/266</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/266</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
<td class="file low" data-value="api.ts"><a href="api.ts.html">api.ts</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="266" class="abs low">0/266</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="266" class="abs low">0/266</td>
</tr>
</tbody>
</table>
</div>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2025-09-11T09:40:00.754Z
</div>
<script src="../../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../../sorter.js"></script>
<script src="../../../block-navigation.js"></script>
</body>
</html>

View File

@ -0,0 +1,136 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for 4NK_IA_front/src/store/appSlice.ts</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../../prettify.css" />
<link rel="stylesheet" href="../../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../../index.html">All files</a> / <a href="index.html">4NK_IA_front/src/store</a> appSlice.ts</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/10</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/10</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import { createSlice } from '@reduxjs/toolkit'<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
&nbsp;
export type AppState = {
initialized: boolean
}
&nbsp;
<span class="cstat-no" title="statement not covered" >const initialState: AppState = {</span>
<span class="cstat-no" title="statement not covered" > initialized: true,</span>
<span class="cstat-no" title="statement not covered" >}</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >const appSlice = createSlice({</span>
<span class="cstat-no" title="statement not covered" > name: 'app',</span>
<span class="cstat-no" title="statement not covered" > initialState,</span>
<span class="cstat-no" title="statement not covered" > reducers: {},</span>
<span class="cstat-no" title="statement not covered" >})</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >export const appReducer = appSlice.reducer</span>
&nbsp;</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2025-09-11T09:40:00.754Z
</div>
<script src="../../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../../sorter.js"></script>
<script src="../../../block-navigation.js"></script>
</body>
</html>

View File

@ -0,0 +1,409 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for 4NK_IA_front/src/store/documentSlice.ts</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../../prettify.css" />
<link rel="stylesheet" href="../../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../../index.html">All files</a> / <a href="index.html">4NK_IA_front/src/store</a> documentSlice.ts</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/87</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/87</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a>
<a name='L42'></a><a href='#L42'>42</a>
<a name='L43'></a><a href='#L43'>43</a>
<a name='L44'></a><a href='#L44'>44</a>
<a name='L45'></a><a href='#L45'>45</a>
<a name='L46'></a><a href='#L46'>46</a>
<a name='L47'></a><a href='#L47'>47</a>
<a name='L48'></a><a href='#L48'>48</a>
<a name='L49'></a><a href='#L49'>49</a>
<a name='L50'></a><a href='#L50'>50</a>
<a name='L51'></a><a href='#L51'>51</a>
<a name='L52'></a><a href='#L52'>52</a>
<a name='L53'></a><a href='#L53'>53</a>
<a name='L54'></a><a href='#L54'>54</a>
<a name='L55'></a><a href='#L55'>55</a>
<a name='L56'></a><a href='#L56'>56</a>
<a name='L57'></a><a href='#L57'>57</a>
<a name='L58'></a><a href='#L58'>58</a>
<a name='L59'></a><a href='#L59'>59</a>
<a name='L60'></a><a href='#L60'>60</a>
<a name='L61'></a><a href='#L61'>61</a>
<a name='L62'></a><a href='#L62'>62</a>
<a name='L63'></a><a href='#L63'>63</a>
<a name='L64'></a><a href='#L64'>64</a>
<a name='L65'></a><a href='#L65'>65</a>
<a name='L66'></a><a href='#L66'>66</a>
<a name='L67'></a><a href='#L67'>67</a>
<a name='L68'></a><a href='#L68'>68</a>
<a name='L69'></a><a href='#L69'>69</a>
<a name='L70'></a><a href='#L70'>70</a>
<a name='L71'></a><a href='#L71'>71</a>
<a name='L72'></a><a href='#L72'>72</a>
<a name='L73'></a><a href='#L73'>73</a>
<a name='L74'></a><a href='#L74'>74</a>
<a name='L75'></a><a href='#L75'>75</a>
<a name='L76'></a><a href='#L76'>76</a>
<a name='L77'></a><a href='#L77'>77</a>
<a name='L78'></a><a href='#L78'>78</a>
<a name='L79'></a><a href='#L79'>79</a>
<a name='L80'></a><a href='#L80'>80</a>
<a name='L81'></a><a href='#L81'>81</a>
<a name='L82'></a><a href='#L82'>82</a>
<a name='L83'></a><a href='#L83'>83</a>
<a name='L84'></a><a href='#L84'>84</a>
<a name='L85'></a><a href='#L85'>85</a>
<a name='L86'></a><a href='#L86'>86</a>
<a name='L87'></a><a href='#L87'>87</a>
<a name='L88'></a><a href='#L88'>88</a>
<a name='L89'></a><a href='#L89'>89</a>
<a name='L90'></a><a href='#L90'>90</a>
<a name='L91'></a><a href='#L91'>91</a>
<a name='L92'></a><a href='#L92'>92</a>
<a name='L93'></a><a href='#L93'>93</a>
<a name='L94'></a><a href='#L94'>94</a>
<a name='L95'></a><a href='#L95'>95</a>
<a name='L96'></a><a href='#L96'>96</a>
<a name='L97'></a><a href='#L97'>97</a>
<a name='L98'></a><a href='#L98'>98</a>
<a name='L99'></a><a href='#L99'>99</a>
<a name='L100'></a><a href='#L100'>100</a>
<a name='L101'></a><a href='#L101'>101</a>
<a name='L102'></a><a href='#L102'>102</a>
<a name='L103'></a><a href='#L103'>103</a>
<a name='L104'></a><a href='#L104'>104</a>
<a name='L105'></a><a href='#L105'>105</a>
<a name='L106'></a><a href='#L106'>106</a>
<a name='L107'></a><a href='#L107'>107</a>
<a name='L108'></a><a href='#L108'>108</a>
<a name='L109'></a><a href='#L109'>109</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
import type { PayloadAction } from '@reduxjs/toolkit'
import type { Document, ExtractionResult, AnalysisResult, ContextResult, ConseilResult } from '../types'
<span class="cstat-no" title="statement not covered" >import { documentApi } from '../services/api'</span>
&nbsp;
interface DocumentState {
documents: Document[]
currentDocument: Document | null
extractionResult: ExtractionResult | null
analysisResult: AnalysisResult | null
contextResult: ContextResult | null
conseilResult: ConseilResult | null
loading: boolean
error: string | null
}
&nbsp;
<span class="cstat-no" title="statement not covered" >const initialState: DocumentState = {</span>
<span class="cstat-no" title="statement not covered" > documents: [],</span>
<span class="cstat-no" title="statement not covered" > currentDocument: null,</span>
<span class="cstat-no" title="statement not covered" > extractionResult: null,</span>
<span class="cstat-no" title="statement not covered" > analysisResult: null,</span>
<span class="cstat-no" title="statement not covered" > contextResult: null,</span>
<span class="cstat-no" title="statement not covered" > conseilResult: null,</span>
<span class="cstat-no" title="statement not covered" > loading: false,</span>
<span class="cstat-no" title="statement not covered" > error: null,</span>
<span class="cstat-no" title="statement not covered" >}</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >export const uploadDocument = createAsyncThunk(</span>
<span class="cstat-no" title="statement not covered" > 'document/upload',</span>
<span class="cstat-no" title="statement not covered" > async (file: File) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > return await documentApi.upload(file)</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" >)</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >export const extractDocument = createAsyncThunk(</span>
<span class="cstat-no" title="statement not covered" > 'document/extract',</span>
<span class="cstat-no" title="statement not covered" > async (documentId: string) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > return await documentApi.extract(documentId)</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" >)</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >export const analyzeDocument = createAsyncThunk(</span>
<span class="cstat-no" title="statement not covered" > 'document/analyze',</span>
<span class="cstat-no" title="statement not covered" > async (documentId: string) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > return await documentApi.analyze(documentId)</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" >)</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >export const getContextData = createAsyncThunk(</span>
<span class="cstat-no" title="statement not covered" > 'document/context',</span>
<span class="cstat-no" title="statement not covered" > async (documentId: string) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > return await documentApi.getContext(documentId)</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" >)</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >export const getConseil = createAsyncThunk(</span>
<span class="cstat-no" title="statement not covered" > 'document/conseil',</span>
<span class="cstat-no" title="statement not covered" > async (documentId: string) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > return await documentApi.getConseil(documentId)</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" >)</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >const documentSlice = createSlice({</span>
<span class="cstat-no" title="statement not covered" > name: 'document',</span>
<span class="cstat-no" title="statement not covered" > initialState,</span>
<span class="cstat-no" title="statement not covered" > reducers: {</span>
<span class="cstat-no" title="statement not covered" > setCurrentDocument: (state, action: PayloadAction&lt;Document | null&gt;) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > state.currentDocument = action.payload</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" > clearResults: (state) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > state.extractionResult = null</span>
<span class="cstat-no" title="statement not covered" > state.analysisResult = null</span>
<span class="cstat-no" title="statement not covered" > state.contextResult = null</span>
<span class="cstat-no" title="statement not covered" > state.conseilResult = null</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" > extraReducers: (builder) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > builder</span>
<span class="cstat-no" title="statement not covered" > .addCase(uploadDocument.pending, (state) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > state.loading = true</span>
<span class="cstat-no" title="statement not covered" > state.error = null</span>
<span class="cstat-no" title="statement not covered" > })</span>
<span class="cstat-no" title="statement not covered" > .addCase(uploadDocument.fulfilled, (state, action) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > state.loading = false</span>
<span class="cstat-no" title="statement not covered" > state.documents.push(action.payload)</span>
<span class="cstat-no" title="statement not covered" > state.currentDocument = action.payload</span>
<span class="cstat-no" title="statement not covered" > })</span>
<span class="cstat-no" title="statement not covered" > .addCase(uploadDocument.rejected, (state, action) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > state.loading = false</span>
<span class="cstat-no" title="statement not covered" > state.error = action.error.message || 'Erreur lors du téléversement'</span>
<span class="cstat-no" title="statement not covered" > })</span>
<span class="cstat-no" title="statement not covered" > .addCase(extractDocument.fulfilled, (state, action) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > state.extractionResult = action.payload</span>
<span class="cstat-no" title="statement not covered" > })</span>
<span class="cstat-no" title="statement not covered" > .addCase(analyzeDocument.fulfilled, (state, action) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > state.analysisResult = action.payload</span>
<span class="cstat-no" title="statement not covered" > })</span>
<span class="cstat-no" title="statement not covered" > .addCase(getContextData.fulfilled, (state, action) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > state.contextResult = action.payload</span>
<span class="cstat-no" title="statement not covered" > })</span>
<span class="cstat-no" title="statement not covered" > .addCase(getConseil.fulfilled, (state, action) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > state.conseilResult = action.payload</span>
<span class="cstat-no" title="statement not covered" > })</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" >})</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >export const { setCurrentDocument, clearResults } = documentSlice.actions</span>
<span class="cstat-no" title="statement not covered" >export const documentReducer = documentSlice.reducer</span>
&nbsp;</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2025-09-11T09:40:00.754Z
</div>
<script src="../../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../../sorter.js"></script>
<script src="../../../block-navigation.js"></script>
</body>
</html>

View File

@ -0,0 +1,146 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for 4NK_IA_front/src/store</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../../prettify.css" />
<link rel="stylesheet" href="../../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../../index.html">All files</a> 4NK_IA_front/src/store</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/114</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/3</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/3</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/114</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
<td class="file low" data-value="appSlice.ts"><a href="appSlice.ts.html">appSlice.ts</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="10" class="abs low">0/10</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="10" class="abs low">0/10</td>
</tr>
<tr>
<td class="file low" data-value="documentSlice.ts"><a href="documentSlice.ts.html">documentSlice.ts</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="87" class="abs low">0/87</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="87" class="abs low">0/87</td>
</tr>
<tr>
<td class="file low" data-value="index.ts"><a href="index.ts.html">index.ts</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="17" class="abs low">0/17</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="17" class="abs low">0/17</td>
</tr>
</tbody>
</table>
</div>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2025-09-11T09:40:00.754Z
</div>
<script src="../../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../../sorter.js"></script>
<script src="../../../block-navigation.js"></script>
</body>
</html>

View File

@ -0,0 +1,154 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for 4NK_IA_front/src/store/index.ts</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../../prettify.css" />
<link rel="stylesheet" href="../../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../../index.html">All files</a> / <a href="index.html">4NK_IA_front/src/store</a> index.ts</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/17</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/17</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import { configureStore } from '@reduxjs/toolkit'<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
<span class="cstat-no" title="statement not covered" >import { useDispatch, useSelector } from 'react-redux'</span>
import type { TypedUseSelectorHook } from 'react-redux'
<span class="cstat-no" title="statement not covered" >import { appReducer } from './appSlice'</span>
<span class="cstat-no" title="statement not covered" >import { documentReducer } from './documentSlice'</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >export const store = configureStore({</span>
<span class="cstat-no" title="statement not covered" > reducer: {</span>
<span class="cstat-no" title="statement not covered" > app: appReducer,</span>
<span class="cstat-no" title="statement not covered" > document: documentReducer,</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" > middleware: (getDefaultMiddleware) =&gt; getDefaultMiddleware({</span>
<span class="cstat-no" title="statement not covered" > serializableCheck: false,</span>
<span class="cstat-no" title="statement not covered" > immutableCheck: true,</span>
<span class="cstat-no" title="statement not covered" > }),</span>
<span class="cstat-no" title="statement not covered" > devTools: true,</span>
<span class="cstat-no" title="statement not covered" >})</span>
&nbsp;
export type RootState = ReturnType&lt;typeof store.getState&gt;
export type AppDispatch = typeof store.dispatch
&nbsp;
<span class="cstat-no" title="statement not covered" >export const useAppDispatch: () =&gt; AppDispatch = useDispatch</span>
<span class="cstat-no" title="statement not covered" >export const useAppSelector: TypedUseSelectorHook&lt;RootState&gt; = useSelector</span>
&nbsp;</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2025-09-11T09:40:00.754Z
</div>
<script src="../../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../../sorter.js"></script>
<script src="../../../block-navigation.js"></script>
</body>
</html>

View File

@ -0,0 +1,116 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for 4NK_IA_front/src/theme</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../../prettify.css" />
<link rel="stylesheet" href="../../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../../index.html">All files</a> 4NK_IA_front/src/theme</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/64</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/64</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
<td class="file low" data-value="index.ts"><a href="index.ts.html">index.ts</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="64" class="abs low">0/64</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="64" class="abs low">0/64</td>
</tr>
</tbody>
</table>
</div>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2025-09-11T09:40:00.754Z
</div>
<script src="../../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../../sorter.js"></script>
<script src="../../../block-navigation.js"></script>
</body>
</html>

View File

@ -0,0 +1,280 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for 4NK_IA_front/src/theme/index.ts</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../../prettify.css" />
<link rel="stylesheet" href="../../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../../index.html">All files</a> / <a href="index.html">4NK_IA_front/src/theme</a> index.ts</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/64</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/64</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a>
<a name='L42'></a><a href='#L42'>42</a>
<a name='L43'></a><a href='#L43'>43</a>
<a name='L44'></a><a href='#L44'>44</a>
<a name='L45'></a><a href='#L45'>45</a>
<a name='L46'></a><a href='#L46'>46</a>
<a name='L47'></a><a href='#L47'>47</a>
<a name='L48'></a><a href='#L48'>48</a>
<a name='L49'></a><a href='#L49'>49</a>
<a name='L50'></a><a href='#L50'>50</a>
<a name='L51'></a><a href='#L51'>51</a>
<a name='L52'></a><a href='#L52'>52</a>
<a name='L53'></a><a href='#L53'>53</a>
<a name='L54'></a><a href='#L54'>54</a>
<a name='L55'></a><a href='#L55'>55</a>
<a name='L56'></a><a href='#L56'>56</a>
<a name='L57'></a><a href='#L57'>57</a>
<a name='L58'></a><a href='#L58'>58</a>
<a name='L59'></a><a href='#L59'>59</a>
<a name='L60'></a><a href='#L60'>60</a>
<a name='L61'></a><a href='#L61'>61</a>
<a name='L62'></a><a href='#L62'>62</a>
<a name='L63'></a><a href='#L63'>63</a>
<a name='L64'></a><a href='#L64'>64</a>
<a name='L65'></a><a href='#L65'>65</a>
<a name='L66'></a><a href='#L66'>66</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import { createTheme } from '@mui/material/styles'<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
&nbsp;
<span class="cstat-no" title="statement not covered" >export const theme = createTheme({</span>
<span class="cstat-no" title="statement not covered" > palette: {</span>
<span class="cstat-no" title="statement not covered" > mode: 'light',</span>
<span class="cstat-no" title="statement not covered" > background: {</span>
<span class="cstat-no" title="statement not covered" > default: '#ffffff',</span>
<span class="cstat-no" title="statement not covered" > paper: '#ffffff',</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" > primary: {</span>
<span class="cstat-no" title="statement not covered" > main: '#1976d2',</span>
<span class="cstat-no" title="statement not covered" > light: '#42a5f5',</span>
<span class="cstat-no" title="statement not covered" > dark: '#1565c0',</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" > secondary: {</span>
<span class="cstat-no" title="statement not covered" > main: '#dc004e',</span>
<span class="cstat-no" title="statement not covered" > light: '#ff5983',</span>
<span class="cstat-no" title="statement not covered" > dark: '#9a0036',</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" > error: {</span>
<span class="cstat-no" title="statement not covered" > main: '#f44336',</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" > warning: {</span>
<span class="cstat-no" title="statement not covered" > main: '#ff9800',</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" > info: {</span>
<span class="cstat-no" title="statement not covered" > main: '#2196f3',</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" > success: {</span>
<span class="cstat-no" title="statement not covered" > main: '#4caf50',</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" > typography: {</span>
<span class="cstat-no" title="statement not covered" > fontFamily: '"Roboto", "Helvetica", "Arial", sans-serif',</span>
<span class="cstat-no" title="statement not covered" > h4: {</span>
<span class="cstat-no" title="statement not covered" > fontWeight: 600,</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" > h6: {</span>
<span class="cstat-no" title="statement not covered" > fontWeight: 500,</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" > components: {</span>
<span class="cstat-no" title="statement not covered" > MuiCssBaseline: {</span>
<span class="cstat-no" title="statement not covered" > styleOverrides: {</span>
<span class="cstat-no" title="statement not covered" > body: {</span>
<span class="cstat-no" title="statement not covered" > backgroundColor: '#ffffff',</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" > MuiAppBar: {</span>
<span class="cstat-no" title="statement not covered" > styleOverrides: {</span>
<span class="cstat-no" title="statement not covered" > root: {</span>
<span class="cstat-no" title="statement not covered" > backgroundColor: '#1976d2',</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" > MuiPaper: {</span>
<span class="cstat-no" title="statement not covered" > styleOverrides: {</span>
<span class="cstat-no" title="statement not covered" > root: {</span>
<span class="cstat-no" title="statement not covered" > backgroundColor: '#ffffff',</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" >})</span>
&nbsp;</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2025-09-11T09:40:00.754Z
</div>
<script src="../../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../../sorter.js"></script>
<script src="../../../block-navigation.js"></script>
</body>
</html>

View File

@ -0,0 +1,116 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for 4NK_IA_front/src/types</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../../prettify.css" />
<link rel="stylesheet" href="../../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../../index.html">All files</a> 4NK_IA_front/src/types</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>1/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>1/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/0</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
<td class="file empty" data-value="index.ts"><a href="index.ts.html">index.ts</a></td>
<td data-value="0" class="pic empty">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct empty">0%</td>
<td data-value="0" class="abs empty">0/0</td>
<td data-value="0" class="pct empty">0%</td>
<td data-value="1" class="abs empty">1/1</td>
<td data-value="0" class="pct empty">0%</td>
<td data-value="1" class="abs empty">1/1</td>
<td data-value="0" class="pct empty">0%</td>
<td data-value="0" class="abs empty">0/0</td>
</tr>
</tbody>
</table>
</div>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2025-09-11T09:40:00.754Z
</div>
<script src="../../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../../sorter.js"></script>
<script src="../../../block-navigation.js"></script>
</body>
</html>

View File

@ -0,0 +1,373 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for 4NK_IA_front/src/types/index.ts</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../../prettify.css" />
<link rel="stylesheet" href="../../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../../index.html">All files</a> / <a href="index.html">4NK_IA_front/src/types</a> index.ts</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/0</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>1/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>1/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/0</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a>
<a name='L42'></a><a href='#L42'>42</a>
<a name='L43'></a><a href='#L43'>43</a>
<a name='L44'></a><a href='#L44'>44</a>
<a name='L45'></a><a href='#L45'>45</a>
<a name='L46'></a><a href='#L46'>46</a>
<a name='L47'></a><a href='#L47'>47</a>
<a name='L48'></a><a href='#L48'>48</a>
<a name='L49'></a><a href='#L49'>49</a>
<a name='L50'></a><a href='#L50'>50</a>
<a name='L51'></a><a href='#L51'>51</a>
<a name='L52'></a><a href='#L52'>52</a>
<a name='L53'></a><a href='#L53'>53</a>
<a name='L54'></a><a href='#L54'>54</a>
<a name='L55'></a><a href='#L55'>55</a>
<a name='L56'></a><a href='#L56'>56</a>
<a name='L57'></a><a href='#L57'>57</a>
<a name='L58'></a><a href='#L58'>58</a>
<a name='L59'></a><a href='#L59'>59</a>
<a name='L60'></a><a href='#L60'>60</a>
<a name='L61'></a><a href='#L61'>61</a>
<a name='L62'></a><a href='#L62'>62</a>
<a name='L63'></a><a href='#L63'>63</a>
<a name='L64'></a><a href='#L64'>64</a>
<a name='L65'></a><a href='#L65'>65</a>
<a name='L66'></a><a href='#L66'>66</a>
<a name='L67'></a><a href='#L67'>67</a>
<a name='L68'></a><a href='#L68'>68</a>
<a name='L69'></a><a href='#L69'>69</a>
<a name='L70'></a><a href='#L70'>70</a>
<a name='L71'></a><a href='#L71'>71</a>
<a name='L72'></a><a href='#L72'>72</a>
<a name='L73'></a><a href='#L73'>73</a>
<a name='L74'></a><a href='#L74'>74</a>
<a name='L75'></a><a href='#L75'>75</a>
<a name='L76'></a><a href='#L76'>76</a>
<a name='L77'></a><a href='#L77'>77</a>
<a name='L78'></a><a href='#L78'>78</a>
<a name='L79'></a><a href='#L79'>79</a>
<a name='L80'></a><a href='#L80'>80</a>
<a name='L81'></a><a href='#L81'>81</a>
<a name='L82'></a><a href='#L82'>82</a>
<a name='L83'></a><a href='#L83'>83</a>
<a name='L84'></a><a href='#L84'>84</a>
<a name='L85'></a><a href='#L85'>85</a>
<a name='L86'></a><a href='#L86'>86</a>
<a name='L87'></a><a href='#L87'>87</a>
<a name='L88'></a><a href='#L88'>88</a>
<a name='L89'></a><a href='#L89'>89</a>
<a name='L90'></a><a href='#L90'>90</a>
<a name='L91'></a><a href='#L91'>91</a>
<a name='L92'></a><a href='#L92'>92</a>
<a name='L93'></a><a href='#L93'>93</a>
<a name='L94'></a><a href='#L94'>94</a>
<a name='L95'></a><a href='#L95'>95</a>
<a name='L96'></a><a href='#L96'>96</a>
<a name='L97'></a><a href='#L97'>97</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">export interface Document {
id: string
name: string
type: string
size: number
uploadDate: Date
status: 'uploading' | 'processing' | 'completed' | 'error'
previewUrl?: string
content?: string
}
&nbsp;
export interface Identity {
id: string
type: 'person' | 'company'
firstName?: string
lastName?: string
companyName?: string
birthDate?: string
nationality?: string
address?: Address
confidence: number
}
&nbsp;
export interface Address {
street: string
city: string
postalCode: string
country: string
coordinates?: { lat: number; lng: number }
}
&nbsp;
export interface Property {
id: string
type: 'house' | 'apartment' | 'land' | 'commercial'
address: Address
surface?: number
cadastralReference?: string
value?: number
}
&nbsp;
export interface Contract {
id: string
type: 'sale' | 'rent' | 'inheritance' | 'donation'
parties: Identity[]
property?: Property
amount?: number
date?: string
clauses: string[]
}
&nbsp;
export interface ExtractionResult {
documentId: string
text: string
language: string
documentType: string
identities: Identity[]
addresses: Address[]
properties: Property[]
contracts: Contract[]
signatures: string[]
confidence: number
}
&nbsp;
export interface AnalysisResult {
documentId: string
documentType: string
isCNI: boolean
country?: string
verificationResult?: {
numberValid: boolean
formatValid: boolean
checksumValid: boolean
}
credibilityScore: number
summary: string
recommendations: string[]
}
&nbsp;
export interface ContextResult {
documentId: string
cadastreData?: Record&lt;string, unknown&gt;
georisquesData?: Record&lt;string, unknown&gt;
geofoncierData?: Record&lt;string, unknown&gt;
bodaccData?: Record&lt;string, unknown&gt;
infogreffeData?: Record&lt;string, unknown&gt;
lastUpdated: Date
}
&nbsp;
export interface ConseilResult {
documentId: string
analysis: string
recommendations: string[]
risks: string[]
nextSteps: string[]
generatedAt: Date
}
&nbsp;</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2025-09-11T09:40:00.754Z
</div>
<script src="../../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../../sorter.js"></script>
<script src="../../../block-navigation.js"></script>
</body>
</html>

View File

@ -0,0 +1,847 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for 4NK_IA_front/src/views/AnalyseView.tsx</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../../prettify.css" />
<link rel="stylesheet" href="../../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../../index.html">All files</a> / <a href="index.html">4NK_IA_front/src/views</a> AnalyseView.tsx</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/191</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/191</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a>
<a name='L42'></a><a href='#L42'>42</a>
<a name='L43'></a><a href='#L43'>43</a>
<a name='L44'></a><a href='#L44'>44</a>
<a name='L45'></a><a href='#L45'>45</a>
<a name='L46'></a><a href='#L46'>46</a>
<a name='L47'></a><a href='#L47'>47</a>
<a name='L48'></a><a href='#L48'>48</a>
<a name='L49'></a><a href='#L49'>49</a>
<a name='L50'></a><a href='#L50'>50</a>
<a name='L51'></a><a href='#L51'>51</a>
<a name='L52'></a><a href='#L52'>52</a>
<a name='L53'></a><a href='#L53'>53</a>
<a name='L54'></a><a href='#L54'>54</a>
<a name='L55'></a><a href='#L55'>55</a>
<a name='L56'></a><a href='#L56'>56</a>
<a name='L57'></a><a href='#L57'>57</a>
<a name='L58'></a><a href='#L58'>58</a>
<a name='L59'></a><a href='#L59'>59</a>
<a name='L60'></a><a href='#L60'>60</a>
<a name='L61'></a><a href='#L61'>61</a>
<a name='L62'></a><a href='#L62'>62</a>
<a name='L63'></a><a href='#L63'>63</a>
<a name='L64'></a><a href='#L64'>64</a>
<a name='L65'></a><a href='#L65'>65</a>
<a name='L66'></a><a href='#L66'>66</a>
<a name='L67'></a><a href='#L67'>67</a>
<a name='L68'></a><a href='#L68'>68</a>
<a name='L69'></a><a href='#L69'>69</a>
<a name='L70'></a><a href='#L70'>70</a>
<a name='L71'></a><a href='#L71'>71</a>
<a name='L72'></a><a href='#L72'>72</a>
<a name='L73'></a><a href='#L73'>73</a>
<a name='L74'></a><a href='#L74'>74</a>
<a name='L75'></a><a href='#L75'>75</a>
<a name='L76'></a><a href='#L76'>76</a>
<a name='L77'></a><a href='#L77'>77</a>
<a name='L78'></a><a href='#L78'>78</a>
<a name='L79'></a><a href='#L79'>79</a>
<a name='L80'></a><a href='#L80'>80</a>
<a name='L81'></a><a href='#L81'>81</a>
<a name='L82'></a><a href='#L82'>82</a>
<a name='L83'></a><a href='#L83'>83</a>
<a name='L84'></a><a href='#L84'>84</a>
<a name='L85'></a><a href='#L85'>85</a>
<a name='L86'></a><a href='#L86'>86</a>
<a name='L87'></a><a href='#L87'>87</a>
<a name='L88'></a><a href='#L88'>88</a>
<a name='L89'></a><a href='#L89'>89</a>
<a name='L90'></a><a href='#L90'>90</a>
<a name='L91'></a><a href='#L91'>91</a>
<a name='L92'></a><a href='#L92'>92</a>
<a name='L93'></a><a href='#L93'>93</a>
<a name='L94'></a><a href='#L94'>94</a>
<a name='L95'></a><a href='#L95'>95</a>
<a name='L96'></a><a href='#L96'>96</a>
<a name='L97'></a><a href='#L97'>97</a>
<a name='L98'></a><a href='#L98'>98</a>
<a name='L99'></a><a href='#L99'>99</a>
<a name='L100'></a><a href='#L100'>100</a>
<a name='L101'></a><a href='#L101'>101</a>
<a name='L102'></a><a href='#L102'>102</a>
<a name='L103'></a><a href='#L103'>103</a>
<a name='L104'></a><a href='#L104'>104</a>
<a name='L105'></a><a href='#L105'>105</a>
<a name='L106'></a><a href='#L106'>106</a>
<a name='L107'></a><a href='#L107'>107</a>
<a name='L108'></a><a href='#L108'>108</a>
<a name='L109'></a><a href='#L109'>109</a>
<a name='L110'></a><a href='#L110'>110</a>
<a name='L111'></a><a href='#L111'>111</a>
<a name='L112'></a><a href='#L112'>112</a>
<a name='L113'></a><a href='#L113'>113</a>
<a name='L114'></a><a href='#L114'>114</a>
<a name='L115'></a><a href='#L115'>115</a>
<a name='L116'></a><a href='#L116'>116</a>
<a name='L117'></a><a href='#L117'>117</a>
<a name='L118'></a><a href='#L118'>118</a>
<a name='L119'></a><a href='#L119'>119</a>
<a name='L120'></a><a href='#L120'>120</a>
<a name='L121'></a><a href='#L121'>121</a>
<a name='L122'></a><a href='#L122'>122</a>
<a name='L123'></a><a href='#L123'>123</a>
<a name='L124'></a><a href='#L124'>124</a>
<a name='L125'></a><a href='#L125'>125</a>
<a name='L126'></a><a href='#L126'>126</a>
<a name='L127'></a><a href='#L127'>127</a>
<a name='L128'></a><a href='#L128'>128</a>
<a name='L129'></a><a href='#L129'>129</a>
<a name='L130'></a><a href='#L130'>130</a>
<a name='L131'></a><a href='#L131'>131</a>
<a name='L132'></a><a href='#L132'>132</a>
<a name='L133'></a><a href='#L133'>133</a>
<a name='L134'></a><a href='#L134'>134</a>
<a name='L135'></a><a href='#L135'>135</a>
<a name='L136'></a><a href='#L136'>136</a>
<a name='L137'></a><a href='#L137'>137</a>
<a name='L138'></a><a href='#L138'>138</a>
<a name='L139'></a><a href='#L139'>139</a>
<a name='L140'></a><a href='#L140'>140</a>
<a name='L141'></a><a href='#L141'>141</a>
<a name='L142'></a><a href='#L142'>142</a>
<a name='L143'></a><a href='#L143'>143</a>
<a name='L144'></a><a href='#L144'>144</a>
<a name='L145'></a><a href='#L145'>145</a>
<a name='L146'></a><a href='#L146'>146</a>
<a name='L147'></a><a href='#L147'>147</a>
<a name='L148'></a><a href='#L148'>148</a>
<a name='L149'></a><a href='#L149'>149</a>
<a name='L150'></a><a href='#L150'>150</a>
<a name='L151'></a><a href='#L151'>151</a>
<a name='L152'></a><a href='#L152'>152</a>
<a name='L153'></a><a href='#L153'>153</a>
<a name='L154'></a><a href='#L154'>154</a>
<a name='L155'></a><a href='#L155'>155</a>
<a name='L156'></a><a href='#L156'>156</a>
<a name='L157'></a><a href='#L157'>157</a>
<a name='L158'></a><a href='#L158'>158</a>
<a name='L159'></a><a href='#L159'>159</a>
<a name='L160'></a><a href='#L160'>160</a>
<a name='L161'></a><a href='#L161'>161</a>
<a name='L162'></a><a href='#L162'>162</a>
<a name='L163'></a><a href='#L163'>163</a>
<a name='L164'></a><a href='#L164'>164</a>
<a name='L165'></a><a href='#L165'>165</a>
<a name='L166'></a><a href='#L166'>166</a>
<a name='L167'></a><a href='#L167'>167</a>
<a name='L168'></a><a href='#L168'>168</a>
<a name='L169'></a><a href='#L169'>169</a>
<a name='L170'></a><a href='#L170'>170</a>
<a name='L171'></a><a href='#L171'>171</a>
<a name='L172'></a><a href='#L172'>172</a>
<a name='L173'></a><a href='#L173'>173</a>
<a name='L174'></a><a href='#L174'>174</a>
<a name='L175'></a><a href='#L175'>175</a>
<a name='L176'></a><a href='#L176'>176</a>
<a name='L177'></a><a href='#L177'>177</a>
<a name='L178'></a><a href='#L178'>178</a>
<a name='L179'></a><a href='#L179'>179</a>
<a name='L180'></a><a href='#L180'>180</a>
<a name='L181'></a><a href='#L181'>181</a>
<a name='L182'></a><a href='#L182'>182</a>
<a name='L183'></a><a href='#L183'>183</a>
<a name='L184'></a><a href='#L184'>184</a>
<a name='L185'></a><a href='#L185'>185</a>
<a name='L186'></a><a href='#L186'>186</a>
<a name='L187'></a><a href='#L187'>187</a>
<a name='L188'></a><a href='#L188'>188</a>
<a name='L189'></a><a href='#L189'>189</a>
<a name='L190'></a><a href='#L190'>190</a>
<a name='L191'></a><a href='#L191'>191</a>
<a name='L192'></a><a href='#L192'>192</a>
<a name='L193'></a><a href='#L193'>193</a>
<a name='L194'></a><a href='#L194'>194</a>
<a name='L195'></a><a href='#L195'>195</a>
<a name='L196'></a><a href='#L196'>196</a>
<a name='L197'></a><a href='#L197'>197</a>
<a name='L198'></a><a href='#L198'>198</a>
<a name='L199'></a><a href='#L199'>199</a>
<a name='L200'></a><a href='#L200'>200</a>
<a name='L201'></a><a href='#L201'>201</a>
<a name='L202'></a><a href='#L202'>202</a>
<a name='L203'></a><a href='#L203'>203</a>
<a name='L204'></a><a href='#L204'>204</a>
<a name='L205'></a><a href='#L205'>205</a>
<a name='L206'></a><a href='#L206'>206</a>
<a name='L207'></a><a href='#L207'>207</a>
<a name='L208'></a><a href='#L208'>208</a>
<a name='L209'></a><a href='#L209'>209</a>
<a name='L210'></a><a href='#L210'>210</a>
<a name='L211'></a><a href='#L211'>211</a>
<a name='L212'></a><a href='#L212'>212</a>
<a name='L213'></a><a href='#L213'>213</a>
<a name='L214'></a><a href='#L214'>214</a>
<a name='L215'></a><a href='#L215'>215</a>
<a name='L216'></a><a href='#L216'>216</a>
<a name='L217'></a><a href='#L217'>217</a>
<a name='L218'></a><a href='#L218'>218</a>
<a name='L219'></a><a href='#L219'>219</a>
<a name='L220'></a><a href='#L220'>220</a>
<a name='L221'></a><a href='#L221'>221</a>
<a name='L222'></a><a href='#L222'>222</a>
<a name='L223'></a><a href='#L223'>223</a>
<a name='L224'></a><a href='#L224'>224</a>
<a name='L225'></a><a href='#L225'>225</a>
<a name='L226'></a><a href='#L226'>226</a>
<a name='L227'></a><a href='#L227'>227</a>
<a name='L228'></a><a href='#L228'>228</a>
<a name='L229'></a><a href='#L229'>229</a>
<a name='L230'></a><a href='#L230'>230</a>
<a name='L231'></a><a href='#L231'>231</a>
<a name='L232'></a><a href='#L232'>232</a>
<a name='L233'></a><a href='#L233'>233</a>
<a name='L234'></a><a href='#L234'>234</a>
<a name='L235'></a><a href='#L235'>235</a>
<a name='L236'></a><a href='#L236'>236</a>
<a name='L237'></a><a href='#L237'>237</a>
<a name='L238'></a><a href='#L238'>238</a>
<a name='L239'></a><a href='#L239'>239</a>
<a name='L240'></a><a href='#L240'>240</a>
<a name='L241'></a><a href='#L241'>241</a>
<a name='L242'></a><a href='#L242'>242</a>
<a name='L243'></a><a href='#L243'>243</a>
<a name='L244'></a><a href='#L244'>244</a>
<a name='L245'></a><a href='#L245'>245</a>
<a name='L246'></a><a href='#L246'>246</a>
<a name='L247'></a><a href='#L247'>247</a>
<a name='L248'></a><a href='#L248'>248</a>
<a name='L249'></a><a href='#L249'>249</a>
<a name='L250'></a><a href='#L250'>250</a>
<a name='L251'></a><a href='#L251'>251</a>
<a name='L252'></a><a href='#L252'>252</a>
<a name='L253'></a><a href='#L253'>253</a>
<a name='L254'></a><a href='#L254'>254</a>
<a name='L255'></a><a href='#L255'>255</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import { useEffect } from 'react'<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
<span class="cstat-no" title="statement not covered" >import {</span>
Box,
Typography,
Paper,
Card,
CardContent,
Chip,
List,
ListItem,
ListItemText,
ListItemIcon,
Alert,
LinearProgress,
} from '@mui/material'
<span class="cstat-no" title="statement not covered" >import {</span>
CheckCircle,
Error,
Warning,
Flag,
Security,
Assessment,
Info,
} from '@mui/icons-material'
import type { ChipProps, LinearProgressProps } from '@mui/material'
<span class="cstat-no" title="statement not covered" >import { useAppDispatch, useAppSelector } from '../store'</span>
<span class="cstat-no" title="statement not covered" >import { analyzeDocument } from '../store/documentSlice'</span>
<span class="cstat-no" title="statement not covered" >import { Layout } from '../components/Layout'</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >export default function AnalyseView() {</span>
<span class="cstat-no" title="statement not covered" > const dispatch = useAppDispatch()</span>
<span class="cstat-no" title="statement not covered" > const { currentDocument, analysisResult, loading } = useAppSelector(</span>
<span class="cstat-no" title="statement not covered" > (state) =&gt; state.document</span>
<span class="cstat-no" title="statement not covered" > )</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > useEffect(() =&gt; {</span>
<span class="cstat-no" title="statement not covered" > if (currentDocument &amp;&amp; !analysisResult) {</span>
<span class="cstat-no" title="statement not covered" > dispatch(analyzeDocument(currentDocument.id))</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" > }, [currentDocument, analysisResult, dispatch])</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > if (!currentDocument) {</span>
<span class="cstat-no" title="statement not covered" > return (</span>
<span class="cstat-no" title="statement not covered" > &lt;Layout&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Alert severity="info"&gt;</span>
Veuillez d'abord téléverser et sélectionner un document.
<span class="cstat-no" title="statement not covered" > &lt;/Alert&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Layout&gt;</span>
)
<span class="cstat-no" title="statement not covered" > }</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > if (loading) {</span>
<span class="cstat-no" title="statement not covered" > return (</span>
<span class="cstat-no" title="statement not covered" > &lt;Layout&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', mt: 4 }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;LinearProgress sx={{ width: '100%', mb: 2 }} /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography&gt;Analyse en cours...&lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Layout&gt;</span>
)
<span class="cstat-no" title="statement not covered" > }</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > if (!analysisResult) {</span>
<span class="cstat-no" title="statement not covered" > return (</span>
<span class="cstat-no" title="statement not covered" > &lt;Layout&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Alert severity="warning"&gt;</span>
Aucun résultat d'analyse disponible.
<span class="cstat-no" title="statement not covered" > &lt;/Alert&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Layout&gt;</span>
)
<span class="cstat-no" title="statement not covered" > }</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > const getScoreColor = (score: number): ChipProps['color'] =&gt; {</span>
<span class="cstat-no" title="statement not covered" > if (score &gt;= 0.8) return 'success'</span>
<span class="cstat-no" title="statement not covered" > if (score &gt;= 0.6) return 'warning'</span>
<span class="cstat-no" title="statement not covered" > return 'error'</span>
<span class="cstat-no" title="statement not covered" > }</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > const getScoreIcon = (score: number) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > if (score &gt;= 0.8) return &lt;CheckCircle color="success" /&gt;</span>
<span class="cstat-no" title="statement not covered" > if (score &gt;= 0.6) return &lt;Warning color="warning" /&gt;</span>
<span class="cstat-no" title="statement not covered" > return &lt;Error color="error" /&gt;</span>
<span class="cstat-no" title="statement not covered" > }</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > return (</span>
<span class="cstat-no" title="statement not covered" > &lt;Layout&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h4" gutterBottom&gt;</span>
Analyse du document
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}&gt;</span>
{/* Résumé général */}
<span class="cstat-no" title="statement not covered" > &lt;Paper sx={{ p: 2 }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6" gutterBottom&gt;</span>
Résumé de l'analyse
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ display: 'flex', gap: 2, flexWrap: 'wrap', alignItems: 'center' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Chip</span>
<span class="cstat-no" title="statement not covered" > icon={&lt;Assessment /&gt;}</span>
<span class="cstat-no" title="statement not covered" > label={`Score de vraisemblance: ${(analysisResult.credibilityScore * 100).toFixed(1)}%`}</span>
<span class="cstat-no" title="statement not covered" > color={getScoreColor(analysisResult.credibilityScore)}</span>
<span class="cstat-no" title="statement not covered" > variant="filled"</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Chip</span>
<span class="cstat-no" title="statement not covered" > icon={&lt;Info /&gt;}</span>
<span class="cstat-no" title="statement not covered" > label={`Type: ${analysisResult.documentType}`}</span>
<span class="cstat-no" title="statement not covered" > color="primary"</span>
<span class="cstat-no" title="statement not covered" > variant="outlined"</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > {analysisResult.isCNI &amp;&amp; (</span>
<span class="cstat-no" title="statement not covered" > &lt;Chip</span>
<span class="cstat-no" title="statement not covered" > icon={&lt;Flag /&gt;}</span>
<span class="cstat-no" title="statement not covered" > label={`Pays: ${analysisResult.country}`}</span>
<span class="cstat-no" title="statement not covered" > color="secondary"</span>
<span class="cstat-no" title="statement not covered" > variant="outlined"</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
)}
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Paper&gt;</span>
&nbsp;
{/* Cas CNI */}
<span class="cstat-no" title="statement not covered" > {analysisResult.isCNI &amp;&amp; (</span>
<span class="cstat-no" title="statement not covered" > &lt;Card&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6" gutterBottom&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Security sx={{ mr: 1, verticalAlign: 'middle' }} /&gt;</span>
Vérification CNI
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > {analysisResult.verificationResult &amp;&amp; (</span>
<span class="cstat-no" title="statement not covered" > &lt;List&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItem&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItemIcon&gt;</span>
<span class="cstat-no" title="statement not covered" > {analysisResult.verificationResult.numberValid ? (</span>
<span class="cstat-no" title="statement not covered" > &lt;CheckCircle color="success" /&gt;</span>
) : (
<span class="cstat-no" title="statement not covered" > &lt;Error color="error" /&gt;</span>
)}
<span class="cstat-no" title="statement not covered" > &lt;/ListItemIcon&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItemText</span>
<span class="cstat-no" title="statement not covered" > primary="Numéro valide"</span>
<span class="cstat-no" title="statement not covered" > secondary={</span>
<span class="cstat-no" title="statement not covered" > analysisResult.verificationResult.numberValid</span>
<span class="cstat-no" title="statement not covered" > ? 'Le numéro de CNI est valide'</span>
<span class="cstat-no" title="statement not covered" > : 'Le numéro de CNI est invalide'</span>
}
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/ListItem&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItem&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItemIcon&gt;</span>
<span class="cstat-no" title="statement not covered" > {analysisResult.verificationResult.formatValid ? (</span>
<span class="cstat-no" title="statement not covered" > &lt;CheckCircle color="success" /&gt;</span>
) : (
<span class="cstat-no" title="statement not covered" > &lt;Error color="error" /&gt;</span>
)}
<span class="cstat-no" title="statement not covered" > &lt;/ListItemIcon&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItemText</span>
<span class="cstat-no" title="statement not covered" > primary="Format valide"</span>
<span class="cstat-no" title="statement not covered" > secondary={</span>
<span class="cstat-no" title="statement not covered" > analysisResult.verificationResult.formatValid</span>
<span class="cstat-no" title="statement not covered" > ? 'Le format du numéro est correct'</span>
<span class="cstat-no" title="statement not covered" > : 'Le format du numéro est incorrect'</span>
}
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/ListItem&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItem&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItemIcon&gt;</span>
<span class="cstat-no" title="statement not covered" > {analysisResult.verificationResult.checksumValid ? (</span>
<span class="cstat-no" title="statement not covered" > &lt;CheckCircle color="success" /&gt;</span>
) : (
<span class="cstat-no" title="statement not covered" > &lt;Error color="error" /&gt;</span>
)}
<span class="cstat-no" title="statement not covered" > &lt;/ListItemIcon&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItemText</span>
<span class="cstat-no" title="statement not covered" > primary="Checksum valide"</span>
<span class="cstat-no" title="statement not covered" > secondary={</span>
<span class="cstat-no" title="statement not covered" > analysisResult.verificationResult.checksumValid</span>
<span class="cstat-no" title="statement not covered" > ? 'La somme de contrôle est correcte'</span>
<span class="cstat-no" title="statement not covered" > : 'La somme de contrôle est incorrecte'</span>
}
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/ListItem&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/List&gt;</span>
)}
<span class="cstat-no" title="statement not covered" > &lt;/CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Card&gt;</span>
)}
&nbsp;
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ display: 'flex', gap: 3, flexWrap: 'wrap' }}&gt;</span>
{/* Score de vraisemblance */}
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ flex: '1 1 300px' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Card&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6" gutterBottom&gt;</span>
Score de vraisemblance
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ display: 'flex', alignItems: 'center', mb: 2 }}&gt;</span>
<span class="cstat-no" title="statement not covered" > {getScoreIcon(analysisResult.credibilityScore)}</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h4" sx={{ ml: 2 }}&gt;</span>
<span class="cstat-no" title="statement not covered" > {(analysisResult.credibilityScore * 100).toFixed(1)}%</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;LinearProgress</span>
<span class="cstat-no" title="statement not covered" > variant="determinate"</span>
<span class="cstat-no" title="statement not covered" > value={analysisResult.credibilityScore * 100}</span>
<span class="cstat-no" title="statement not covered" > color={getScoreColor(analysisResult.credibilityScore) as LinearProgressProps['color']}</span>
<span class="cstat-no" title="statement not covered" > sx={{ height: 10, borderRadius: 5 }}</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="body2" color="text.secondary" sx={{ mt: 1 }}&gt;</span>
<span class="cstat-no" title="statement not covered" > {analysisResult.credibilityScore &gt;= 0.8</span>
<span class="cstat-no" title="statement not covered" > ? 'Document très fiable'</span>
<span class="cstat-no" title="statement not covered" > : analysisResult.credibilityScore &gt;= 0.6</span>
<span class="cstat-no" title="statement not covered" > ? 'Document moyennement fiable'</span>
<span class="cstat-no" title="statement not covered" > : 'Document peu fiable - vérification recommandée'}</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Card&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
&nbsp;
{/* Synthèse */}
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ flex: '1 1 300px' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Card&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6" gutterBottom&gt;</span>
Synthèse
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="body1" sx={{ whiteSpace: 'pre-wrap' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > {analysisResult.summary}</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Card&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
&nbsp;
{/* Recommandations */}
<span class="cstat-no" title="statement not covered" > &lt;Card&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6" gutterBottom&gt;</span>
Recommandations
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;List&gt;</span>
<span class="cstat-no" title="statement not covered" > {analysisResult.recommendations.map((recommendation, index) =&gt; (</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItem key={index}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItemIcon&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Info color="primary" /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/ListItemIcon&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItemText primary={recommendation} /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/ListItem&gt;</span>
<span class="cstat-no" title="statement not covered" > ))}</span>
<span class="cstat-no" title="statement not covered" > &lt;/List&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Card&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Layout&gt;</span>
)
<span class="cstat-no" title="statement not covered" >}</span></pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2025-09-11T09:40:00.754Z
</div>
<script src="../../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../../sorter.js"></script>
<script src="../../../block-navigation.js"></script>
</body>
</html>

View File

@ -0,0 +1,814 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for 4NK_IA_front/src/views/ConseilView.tsx</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../../prettify.css" />
<link rel="stylesheet" href="../../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../../index.html">All files</a> / <a href="index.html">4NK_IA_front/src/views</a> ConseilView.tsx</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/187</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/187</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a>
<a name='L42'></a><a href='#L42'>42</a>
<a name='L43'></a><a href='#L43'>43</a>
<a name='L44'></a><a href='#L44'>44</a>
<a name='L45'></a><a href='#L45'>45</a>
<a name='L46'></a><a href='#L46'>46</a>
<a name='L47'></a><a href='#L47'>47</a>
<a name='L48'></a><a href='#L48'>48</a>
<a name='L49'></a><a href='#L49'>49</a>
<a name='L50'></a><a href='#L50'>50</a>
<a name='L51'></a><a href='#L51'>51</a>
<a name='L52'></a><a href='#L52'>52</a>
<a name='L53'></a><a href='#L53'>53</a>
<a name='L54'></a><a href='#L54'>54</a>
<a name='L55'></a><a href='#L55'>55</a>
<a name='L56'></a><a href='#L56'>56</a>
<a name='L57'></a><a href='#L57'>57</a>
<a name='L58'></a><a href='#L58'>58</a>
<a name='L59'></a><a href='#L59'>59</a>
<a name='L60'></a><a href='#L60'>60</a>
<a name='L61'></a><a href='#L61'>61</a>
<a name='L62'></a><a href='#L62'>62</a>
<a name='L63'></a><a href='#L63'>63</a>
<a name='L64'></a><a href='#L64'>64</a>
<a name='L65'></a><a href='#L65'>65</a>
<a name='L66'></a><a href='#L66'>66</a>
<a name='L67'></a><a href='#L67'>67</a>
<a name='L68'></a><a href='#L68'>68</a>
<a name='L69'></a><a href='#L69'>69</a>
<a name='L70'></a><a href='#L70'>70</a>
<a name='L71'></a><a href='#L71'>71</a>
<a name='L72'></a><a href='#L72'>72</a>
<a name='L73'></a><a href='#L73'>73</a>
<a name='L74'></a><a href='#L74'>74</a>
<a name='L75'></a><a href='#L75'>75</a>
<a name='L76'></a><a href='#L76'>76</a>
<a name='L77'></a><a href='#L77'>77</a>
<a name='L78'></a><a href='#L78'>78</a>
<a name='L79'></a><a href='#L79'>79</a>
<a name='L80'></a><a href='#L80'>80</a>
<a name='L81'></a><a href='#L81'>81</a>
<a name='L82'></a><a href='#L82'>82</a>
<a name='L83'></a><a href='#L83'>83</a>
<a name='L84'></a><a href='#L84'>84</a>
<a name='L85'></a><a href='#L85'>85</a>
<a name='L86'></a><a href='#L86'>86</a>
<a name='L87'></a><a href='#L87'>87</a>
<a name='L88'></a><a href='#L88'>88</a>
<a name='L89'></a><a href='#L89'>89</a>
<a name='L90'></a><a href='#L90'>90</a>
<a name='L91'></a><a href='#L91'>91</a>
<a name='L92'></a><a href='#L92'>92</a>
<a name='L93'></a><a href='#L93'>93</a>
<a name='L94'></a><a href='#L94'>94</a>
<a name='L95'></a><a href='#L95'>95</a>
<a name='L96'></a><a href='#L96'>96</a>
<a name='L97'></a><a href='#L97'>97</a>
<a name='L98'></a><a href='#L98'>98</a>
<a name='L99'></a><a href='#L99'>99</a>
<a name='L100'></a><a href='#L100'>100</a>
<a name='L101'></a><a href='#L101'>101</a>
<a name='L102'></a><a href='#L102'>102</a>
<a name='L103'></a><a href='#L103'>103</a>
<a name='L104'></a><a href='#L104'>104</a>
<a name='L105'></a><a href='#L105'>105</a>
<a name='L106'></a><a href='#L106'>106</a>
<a name='L107'></a><a href='#L107'>107</a>
<a name='L108'></a><a href='#L108'>108</a>
<a name='L109'></a><a href='#L109'>109</a>
<a name='L110'></a><a href='#L110'>110</a>
<a name='L111'></a><a href='#L111'>111</a>
<a name='L112'></a><a href='#L112'>112</a>
<a name='L113'></a><a href='#L113'>113</a>
<a name='L114'></a><a href='#L114'>114</a>
<a name='L115'></a><a href='#L115'>115</a>
<a name='L116'></a><a href='#L116'>116</a>
<a name='L117'></a><a href='#L117'>117</a>
<a name='L118'></a><a href='#L118'>118</a>
<a name='L119'></a><a href='#L119'>119</a>
<a name='L120'></a><a href='#L120'>120</a>
<a name='L121'></a><a href='#L121'>121</a>
<a name='L122'></a><a href='#L122'>122</a>
<a name='L123'></a><a href='#L123'>123</a>
<a name='L124'></a><a href='#L124'>124</a>
<a name='L125'></a><a href='#L125'>125</a>
<a name='L126'></a><a href='#L126'>126</a>
<a name='L127'></a><a href='#L127'>127</a>
<a name='L128'></a><a href='#L128'>128</a>
<a name='L129'></a><a href='#L129'>129</a>
<a name='L130'></a><a href='#L130'>130</a>
<a name='L131'></a><a href='#L131'>131</a>
<a name='L132'></a><a href='#L132'>132</a>
<a name='L133'></a><a href='#L133'>133</a>
<a name='L134'></a><a href='#L134'>134</a>
<a name='L135'></a><a href='#L135'>135</a>
<a name='L136'></a><a href='#L136'>136</a>
<a name='L137'></a><a href='#L137'>137</a>
<a name='L138'></a><a href='#L138'>138</a>
<a name='L139'></a><a href='#L139'>139</a>
<a name='L140'></a><a href='#L140'>140</a>
<a name='L141'></a><a href='#L141'>141</a>
<a name='L142'></a><a href='#L142'>142</a>
<a name='L143'></a><a href='#L143'>143</a>
<a name='L144'></a><a href='#L144'>144</a>
<a name='L145'></a><a href='#L145'>145</a>
<a name='L146'></a><a href='#L146'>146</a>
<a name='L147'></a><a href='#L147'>147</a>
<a name='L148'></a><a href='#L148'>148</a>
<a name='L149'></a><a href='#L149'>149</a>
<a name='L150'></a><a href='#L150'>150</a>
<a name='L151'></a><a href='#L151'>151</a>
<a name='L152'></a><a href='#L152'>152</a>
<a name='L153'></a><a href='#L153'>153</a>
<a name='L154'></a><a href='#L154'>154</a>
<a name='L155'></a><a href='#L155'>155</a>
<a name='L156'></a><a href='#L156'>156</a>
<a name='L157'></a><a href='#L157'>157</a>
<a name='L158'></a><a href='#L158'>158</a>
<a name='L159'></a><a href='#L159'>159</a>
<a name='L160'></a><a href='#L160'>160</a>
<a name='L161'></a><a href='#L161'>161</a>
<a name='L162'></a><a href='#L162'>162</a>
<a name='L163'></a><a href='#L163'>163</a>
<a name='L164'></a><a href='#L164'>164</a>
<a name='L165'></a><a href='#L165'>165</a>
<a name='L166'></a><a href='#L166'>166</a>
<a name='L167'></a><a href='#L167'>167</a>
<a name='L168'></a><a href='#L168'>168</a>
<a name='L169'></a><a href='#L169'>169</a>
<a name='L170'></a><a href='#L170'>170</a>
<a name='L171'></a><a href='#L171'>171</a>
<a name='L172'></a><a href='#L172'>172</a>
<a name='L173'></a><a href='#L173'>173</a>
<a name='L174'></a><a href='#L174'>174</a>
<a name='L175'></a><a href='#L175'>175</a>
<a name='L176'></a><a href='#L176'>176</a>
<a name='L177'></a><a href='#L177'>177</a>
<a name='L178'></a><a href='#L178'>178</a>
<a name='L179'></a><a href='#L179'>179</a>
<a name='L180'></a><a href='#L180'>180</a>
<a name='L181'></a><a href='#L181'>181</a>
<a name='L182'></a><a href='#L182'>182</a>
<a name='L183'></a><a href='#L183'>183</a>
<a name='L184'></a><a href='#L184'>184</a>
<a name='L185'></a><a href='#L185'>185</a>
<a name='L186'></a><a href='#L186'>186</a>
<a name='L187'></a><a href='#L187'>187</a>
<a name='L188'></a><a href='#L188'>188</a>
<a name='L189'></a><a href='#L189'>189</a>
<a name='L190'></a><a href='#L190'>190</a>
<a name='L191'></a><a href='#L191'>191</a>
<a name='L192'></a><a href='#L192'>192</a>
<a name='L193'></a><a href='#L193'>193</a>
<a name='L194'></a><a href='#L194'>194</a>
<a name='L195'></a><a href='#L195'>195</a>
<a name='L196'></a><a href='#L196'>196</a>
<a name='L197'></a><a href='#L197'>197</a>
<a name='L198'></a><a href='#L198'>198</a>
<a name='L199'></a><a href='#L199'>199</a>
<a name='L200'></a><a href='#L200'>200</a>
<a name='L201'></a><a href='#L201'>201</a>
<a name='L202'></a><a href='#L202'>202</a>
<a name='L203'></a><a href='#L203'>203</a>
<a name='L204'></a><a href='#L204'>204</a>
<a name='L205'></a><a href='#L205'>205</a>
<a name='L206'></a><a href='#L206'>206</a>
<a name='L207'></a><a href='#L207'>207</a>
<a name='L208'></a><a href='#L208'>208</a>
<a name='L209'></a><a href='#L209'>209</a>
<a name='L210'></a><a href='#L210'>210</a>
<a name='L211'></a><a href='#L211'>211</a>
<a name='L212'></a><a href='#L212'>212</a>
<a name='L213'></a><a href='#L213'>213</a>
<a name='L214'></a><a href='#L214'>214</a>
<a name='L215'></a><a href='#L215'>215</a>
<a name='L216'></a><a href='#L216'>216</a>
<a name='L217'></a><a href='#L217'>217</a>
<a name='L218'></a><a href='#L218'>218</a>
<a name='L219'></a><a href='#L219'>219</a>
<a name='L220'></a><a href='#L220'>220</a>
<a name='L221'></a><a href='#L221'>221</a>
<a name='L222'></a><a href='#L222'>222</a>
<a name='L223'></a><a href='#L223'>223</a>
<a name='L224'></a><a href='#L224'>224</a>
<a name='L225'></a><a href='#L225'>225</a>
<a name='L226'></a><a href='#L226'>226</a>
<a name='L227'></a><a href='#L227'>227</a>
<a name='L228'></a><a href='#L228'>228</a>
<a name='L229'></a><a href='#L229'>229</a>
<a name='L230'></a><a href='#L230'>230</a>
<a name='L231'></a><a href='#L231'>231</a>
<a name='L232'></a><a href='#L232'>232</a>
<a name='L233'></a><a href='#L233'>233</a>
<a name='L234'></a><a href='#L234'>234</a>
<a name='L235'></a><a href='#L235'>235</a>
<a name='L236'></a><a href='#L236'>236</a>
<a name='L237'></a><a href='#L237'>237</a>
<a name='L238'></a><a href='#L238'>238</a>
<a name='L239'></a><a href='#L239'>239</a>
<a name='L240'></a><a href='#L240'>240</a>
<a name='L241'></a><a href='#L241'>241</a>
<a name='L242'></a><a href='#L242'>242</a>
<a name='L243'></a><a href='#L243'>243</a>
<a name='L244'></a><a href='#L244'>244</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import { useEffect } from 'react'<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
<span class="cstat-no" title="statement not covered" >import {</span>
Box,
Typography,
Paper,
Card,
CardContent,
List,
ListItem,
ListItemText,
ListItemIcon,
Alert,
Chip,
Button,
CircularProgress,
} from '@mui/material'
<span class="cstat-no" title="statement not covered" >import {</span>
Lightbulb,
Warning,
CheckCircle,
TrendingUp,
Schedule,
Psychology,
} from '@mui/icons-material'
import type { ChipProps } from '@mui/material'
<span class="cstat-no" title="statement not covered" >import { useAppDispatch, useAppSelector } from '../store'</span>
<span class="cstat-no" title="statement not covered" >import { getConseil } from '../store/documentSlice'</span>
<span class="cstat-no" title="statement not covered" >import { Layout } from '../components/Layout'</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >export default function ConseilView() {</span>
<span class="cstat-no" title="statement not covered" > const dispatch = useAppDispatch()</span>
<span class="cstat-no" title="statement not covered" > const { currentDocument, conseilResult, loading } = useAppSelector(</span>
<span class="cstat-no" title="statement not covered" > (state) =&gt; state.document</span>
<span class="cstat-no" title="statement not covered" > )</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > useEffect(() =&gt; {</span>
<span class="cstat-no" title="statement not covered" > if (currentDocument &amp;&amp; !conseilResult) {</span>
<span class="cstat-no" title="statement not covered" > dispatch(getConseil(currentDocument.id))</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" > }, [currentDocument, conseilResult, dispatch])</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > if (!currentDocument) {</span>
<span class="cstat-no" title="statement not covered" > return (</span>
<span class="cstat-no" title="statement not covered" > &lt;Layout&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Alert severity="info"&gt;</span>
Veuillez d'abord téléverser et sélectionner un document.
<span class="cstat-no" title="statement not covered" > &lt;/Alert&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Layout&gt;</span>
)
<span class="cstat-no" title="statement not covered" > }</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > if (loading) {</span>
<span class="cstat-no" title="statement not covered" > return (</span>
<span class="cstat-no" title="statement not covered" > &lt;Layout&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ display: 'flex', justifyContent: 'center', mt: 4 }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;CircularProgress /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography sx={{ ml: 2 }}&gt;Génération des conseils LLM...&lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Layout&gt;</span>
)
<span class="cstat-no" title="statement not covered" > }</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > if (!conseilResult) {</span>
<span class="cstat-no" title="statement not covered" > return (</span>
<span class="cstat-no" title="statement not covered" > &lt;Layout&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Alert severity="warning"&gt;</span>
Aucun conseil disponible.
<span class="cstat-no" title="statement not covered" > &lt;/Alert&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Layout&gt;</span>
)
<span class="cstat-no" title="statement not covered" > }</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > const getRiskColor = (risk: string): ChipProps['color'] =&gt; {</span>
<span class="cstat-no" title="statement not covered" > if (risk.toLowerCase().includes('élevé') || risk.toLowerCase().includes('critique')) {</span>
<span class="cstat-no" title="statement not covered" > return 'error'</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" > if (risk.toLowerCase().includes('moyen') || risk.toLowerCase().includes('modéré')) {</span>
<span class="cstat-no" title="statement not covered" > return 'warning'</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" > return 'info'</span>
<span class="cstat-no" title="statement not covered" > }</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > return (</span>
<span class="cstat-no" title="statement not covered" > &lt;Layout&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h4" gutterBottom&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Psychology sx={{ mr: 1, verticalAlign: 'middle' }} /&gt;</span>
Conseil LLM
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}&gt;</span>
{/* Analyse LLM */}
<span class="cstat-no" title="statement not covered" > &lt;Card&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6" gutterBottom&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Lightbulb sx={{ mr: 1, verticalAlign: 'middle' }} /&gt;</span>
Analyse LLM
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Paper</span>
<span class="cstat-no" title="statement not covered" > sx={{</span>
<span class="cstat-no" title="statement not covered" > p: 2,</span>
<span class="cstat-no" title="statement not covered" > bgcolor: 'grey.50',</span>
<span class="cstat-no" title="statement not covered" > border: '1px solid',</span>
<span class="cstat-no" title="statement not covered" > borderColor: 'grey.200',</span>
<span class="cstat-no" title="statement not covered" > }}</span>
&gt;
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="body1" sx={{ whiteSpace: 'pre-wrap' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > {conseilResult.analysis}</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Paper&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="caption" color="text.secondary" sx={{ mt: 1, display: 'block' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > Généré le {new Date(conseilResult.generatedAt).toLocaleString()}</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Card&gt;</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ display: 'flex', gap: 3, flexWrap: 'wrap' }}&gt;</span>
{/* Recommandations */}
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ flex: '1 1 300px' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Card&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6" gutterBottom&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;CheckCircle sx={{ mr: 1, verticalAlign: 'middle' }} /&gt;</span>
<span class="cstat-no" title="statement not covered" > Recommandations ({conseilResult.recommendations.length})</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;List dense&gt;</span>
<span class="cstat-no" title="statement not covered" > {conseilResult.recommendations.map((recommendation, index) =&gt; (</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItem key={index}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItemIcon&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;CheckCircle color="success" /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/ListItemIcon&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItemText primary={recommendation} /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/ListItem&gt;</span>
<span class="cstat-no" title="statement not covered" > ))}</span>
<span class="cstat-no" title="statement not covered" > &lt;/List&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Card&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
&nbsp;
{/* Risques identifiés */}
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ flex: '1 1 300px' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Card&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6" gutterBottom&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Warning sx={{ mr: 1, verticalAlign: 'middle' }} /&gt;</span>
<span class="cstat-no" title="statement not covered" > Risques identifiés ({conseilResult.risks.length})</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;List dense&gt;</span>
<span class="cstat-no" title="statement not covered" > {conseilResult.risks.map((risk, index) =&gt; (</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItem key={index}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItemIcon&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Warning color={getRiskColor(risk) as ChipProps['color']} /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/ListItemIcon&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItemText</span>
<span class="cstat-no" title="statement not covered" > primary={risk}</span>
<span class="cstat-no" title="statement not covered" > primaryTypographyProps={{</span>
<span class="cstat-no" title="statement not covered" > color: getRiskColor(risk) === 'error' ? 'error.main' :</span>
<span class="cstat-no" title="statement not covered" > getRiskColor(risk) === 'warning' ? 'warning.main' : 'info.main'</span>
<span class="cstat-no" title="statement not covered" > }}</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/ListItem&gt;</span>
<span class="cstat-no" title="statement not covered" > ))}</span>
<span class="cstat-no" title="statement not covered" > &lt;/List&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Card&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
&nbsp;
{/* Prochaines étapes */}
<span class="cstat-no" title="statement not covered" > &lt;Card&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6" gutterBottom&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;TrendingUp sx={{ mr: 1, verticalAlign: 'middle' }} /&gt;</span>
Prochaines étapes recommandées
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;List&gt;</span>
<span class="cstat-no" title="statement not covered" > {conseilResult.nextSteps.map((step, index) =&gt; (</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItem key={index}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItemIcon&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Schedule color="primary" /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/ListItemIcon&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItemText</span>
<span class="cstat-no" title="statement not covered" > primary={`Étape ${index + 1}`}</span>
<span class="cstat-no" title="statement not covered" > secondary={step}</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/ListItem&gt;</span>
<span class="cstat-no" title="statement not covered" > ))}</span>
<span class="cstat-no" title="statement not covered" > &lt;/List&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Card&gt;</span>
&nbsp;
{/* Actions */}
<span class="cstat-no" title="statement not covered" > &lt;Card&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6" gutterBottom&gt;</span>
Actions
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ display: 'flex', gap: 2, flexWrap: 'wrap' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Button</span>
<span class="cstat-no" title="statement not covered" > variant="contained"</span>
<span class="cstat-no" title="statement not covered" > onClick={() =&gt; dispatch(getConseil(currentDocument.id))}</span>
<span class="cstat-no" title="statement not covered" > disabled={loading}</span>
<span class="cstat-no" title="statement not covered" > &gt;</span>
Régénérer les conseils
<span class="cstat-no" title="statement not covered" > &lt;/Button&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Button variant="outlined"&gt;</span>
Exporter le rapport
<span class="cstat-no" title="statement not covered" > &lt;/Button&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Button variant="outlined"&gt;</span>
Partager avec l'équipe
<span class="cstat-no" title="statement not covered" > &lt;/Button&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Card&gt;</span>
&nbsp;
{/* Résumé exécutif */}
<span class="cstat-no" title="statement not covered" > &lt;Paper sx={{ p: 2, bgcolor: 'primary.50' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6" gutterBottom&gt;</span>
Résumé exécutif
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ display: 'flex', gap: 1, flexWrap: 'wrap', mb: 2 }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Chip</span>
<span class="cstat-no" title="statement not covered" > label={`${conseilResult.recommendations.length} recommandations`}</span>
<span class="cstat-no" title="statement not covered" > color="success"</span>
<span class="cstat-no" title="statement not covered" > variant="outlined"</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Chip</span>
<span class="cstat-no" title="statement not covered" > label={`${conseilResult.risks.length} risques identifiés`}</span>
<span class="cstat-no" title="statement not covered" > color="warning"</span>
<span class="cstat-no" title="statement not covered" > variant="outlined"</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Chip</span>
<span class="cstat-no" title="statement not covered" > label={`${conseilResult.nextSteps.length} étapes suivantes`}</span>
<span class="cstat-no" title="statement not covered" > color="info"</span>
<span class="cstat-no" title="statement not covered" > variant="outlined"</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="body2" color="text.secondary"&gt;</span>
Cette analyse LLM a été générée automatiquement et doit être validée par un expert notarial.
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Paper&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Layout&gt;</span>
)
<span class="cstat-no" title="statement not covered" >}</span></pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2025-09-11T09:40:00.754Z
</div>
<script src="../../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../../sorter.js"></script>
<script src="../../../block-navigation.js"></script>
</body>
</html>

View File

@ -0,0 +1,979 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for 4NK_IA_front/src/views/ContexteView.tsx</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../../prettify.css" />
<link rel="stylesheet" href="../../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../../index.html">All files</a> / <a href="index.html">4NK_IA_front/src/views</a> ContexteView.tsx</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/228</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/228</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a>
<a name='L42'></a><a href='#L42'>42</a>
<a name='L43'></a><a href='#L43'>43</a>
<a name='L44'></a><a href='#L44'>44</a>
<a name='L45'></a><a href='#L45'>45</a>
<a name='L46'></a><a href='#L46'>46</a>
<a name='L47'></a><a href='#L47'>47</a>
<a name='L48'></a><a href='#L48'>48</a>
<a name='L49'></a><a href='#L49'>49</a>
<a name='L50'></a><a href='#L50'>50</a>
<a name='L51'></a><a href='#L51'>51</a>
<a name='L52'></a><a href='#L52'>52</a>
<a name='L53'></a><a href='#L53'>53</a>
<a name='L54'></a><a href='#L54'>54</a>
<a name='L55'></a><a href='#L55'>55</a>
<a name='L56'></a><a href='#L56'>56</a>
<a name='L57'></a><a href='#L57'>57</a>
<a name='L58'></a><a href='#L58'>58</a>
<a name='L59'></a><a href='#L59'>59</a>
<a name='L60'></a><a href='#L60'>60</a>
<a name='L61'></a><a href='#L61'>61</a>
<a name='L62'></a><a href='#L62'>62</a>
<a name='L63'></a><a href='#L63'>63</a>
<a name='L64'></a><a href='#L64'>64</a>
<a name='L65'></a><a href='#L65'>65</a>
<a name='L66'></a><a href='#L66'>66</a>
<a name='L67'></a><a href='#L67'>67</a>
<a name='L68'></a><a href='#L68'>68</a>
<a name='L69'></a><a href='#L69'>69</a>
<a name='L70'></a><a href='#L70'>70</a>
<a name='L71'></a><a href='#L71'>71</a>
<a name='L72'></a><a href='#L72'>72</a>
<a name='L73'></a><a href='#L73'>73</a>
<a name='L74'></a><a href='#L74'>74</a>
<a name='L75'></a><a href='#L75'>75</a>
<a name='L76'></a><a href='#L76'>76</a>
<a name='L77'></a><a href='#L77'>77</a>
<a name='L78'></a><a href='#L78'>78</a>
<a name='L79'></a><a href='#L79'>79</a>
<a name='L80'></a><a href='#L80'>80</a>
<a name='L81'></a><a href='#L81'>81</a>
<a name='L82'></a><a href='#L82'>82</a>
<a name='L83'></a><a href='#L83'>83</a>
<a name='L84'></a><a href='#L84'>84</a>
<a name='L85'></a><a href='#L85'>85</a>
<a name='L86'></a><a href='#L86'>86</a>
<a name='L87'></a><a href='#L87'>87</a>
<a name='L88'></a><a href='#L88'>88</a>
<a name='L89'></a><a href='#L89'>89</a>
<a name='L90'></a><a href='#L90'>90</a>
<a name='L91'></a><a href='#L91'>91</a>
<a name='L92'></a><a href='#L92'>92</a>
<a name='L93'></a><a href='#L93'>93</a>
<a name='L94'></a><a href='#L94'>94</a>
<a name='L95'></a><a href='#L95'>95</a>
<a name='L96'></a><a href='#L96'>96</a>
<a name='L97'></a><a href='#L97'>97</a>
<a name='L98'></a><a href='#L98'>98</a>
<a name='L99'></a><a href='#L99'>99</a>
<a name='L100'></a><a href='#L100'>100</a>
<a name='L101'></a><a href='#L101'>101</a>
<a name='L102'></a><a href='#L102'>102</a>
<a name='L103'></a><a href='#L103'>103</a>
<a name='L104'></a><a href='#L104'>104</a>
<a name='L105'></a><a href='#L105'>105</a>
<a name='L106'></a><a href='#L106'>106</a>
<a name='L107'></a><a href='#L107'>107</a>
<a name='L108'></a><a href='#L108'>108</a>
<a name='L109'></a><a href='#L109'>109</a>
<a name='L110'></a><a href='#L110'>110</a>
<a name='L111'></a><a href='#L111'>111</a>
<a name='L112'></a><a href='#L112'>112</a>
<a name='L113'></a><a href='#L113'>113</a>
<a name='L114'></a><a href='#L114'>114</a>
<a name='L115'></a><a href='#L115'>115</a>
<a name='L116'></a><a href='#L116'>116</a>
<a name='L117'></a><a href='#L117'>117</a>
<a name='L118'></a><a href='#L118'>118</a>
<a name='L119'></a><a href='#L119'>119</a>
<a name='L120'></a><a href='#L120'>120</a>
<a name='L121'></a><a href='#L121'>121</a>
<a name='L122'></a><a href='#L122'>122</a>
<a name='L123'></a><a href='#L123'>123</a>
<a name='L124'></a><a href='#L124'>124</a>
<a name='L125'></a><a href='#L125'>125</a>
<a name='L126'></a><a href='#L126'>126</a>
<a name='L127'></a><a href='#L127'>127</a>
<a name='L128'></a><a href='#L128'>128</a>
<a name='L129'></a><a href='#L129'>129</a>
<a name='L130'></a><a href='#L130'>130</a>
<a name='L131'></a><a href='#L131'>131</a>
<a name='L132'></a><a href='#L132'>132</a>
<a name='L133'></a><a href='#L133'>133</a>
<a name='L134'></a><a href='#L134'>134</a>
<a name='L135'></a><a href='#L135'>135</a>
<a name='L136'></a><a href='#L136'>136</a>
<a name='L137'></a><a href='#L137'>137</a>
<a name='L138'></a><a href='#L138'>138</a>
<a name='L139'></a><a href='#L139'>139</a>
<a name='L140'></a><a href='#L140'>140</a>
<a name='L141'></a><a href='#L141'>141</a>
<a name='L142'></a><a href='#L142'>142</a>
<a name='L143'></a><a href='#L143'>143</a>
<a name='L144'></a><a href='#L144'>144</a>
<a name='L145'></a><a href='#L145'>145</a>
<a name='L146'></a><a href='#L146'>146</a>
<a name='L147'></a><a href='#L147'>147</a>
<a name='L148'></a><a href='#L148'>148</a>
<a name='L149'></a><a href='#L149'>149</a>
<a name='L150'></a><a href='#L150'>150</a>
<a name='L151'></a><a href='#L151'>151</a>
<a name='L152'></a><a href='#L152'>152</a>
<a name='L153'></a><a href='#L153'>153</a>
<a name='L154'></a><a href='#L154'>154</a>
<a name='L155'></a><a href='#L155'>155</a>
<a name='L156'></a><a href='#L156'>156</a>
<a name='L157'></a><a href='#L157'>157</a>
<a name='L158'></a><a href='#L158'>158</a>
<a name='L159'></a><a href='#L159'>159</a>
<a name='L160'></a><a href='#L160'>160</a>
<a name='L161'></a><a href='#L161'>161</a>
<a name='L162'></a><a href='#L162'>162</a>
<a name='L163'></a><a href='#L163'>163</a>
<a name='L164'></a><a href='#L164'>164</a>
<a name='L165'></a><a href='#L165'>165</a>
<a name='L166'></a><a href='#L166'>166</a>
<a name='L167'></a><a href='#L167'>167</a>
<a name='L168'></a><a href='#L168'>168</a>
<a name='L169'></a><a href='#L169'>169</a>
<a name='L170'></a><a href='#L170'>170</a>
<a name='L171'></a><a href='#L171'>171</a>
<a name='L172'></a><a href='#L172'>172</a>
<a name='L173'></a><a href='#L173'>173</a>
<a name='L174'></a><a href='#L174'>174</a>
<a name='L175'></a><a href='#L175'>175</a>
<a name='L176'></a><a href='#L176'>176</a>
<a name='L177'></a><a href='#L177'>177</a>
<a name='L178'></a><a href='#L178'>178</a>
<a name='L179'></a><a href='#L179'>179</a>
<a name='L180'></a><a href='#L180'>180</a>
<a name='L181'></a><a href='#L181'>181</a>
<a name='L182'></a><a href='#L182'>182</a>
<a name='L183'></a><a href='#L183'>183</a>
<a name='L184'></a><a href='#L184'>184</a>
<a name='L185'></a><a href='#L185'>185</a>
<a name='L186'></a><a href='#L186'>186</a>
<a name='L187'></a><a href='#L187'>187</a>
<a name='L188'></a><a href='#L188'>188</a>
<a name='L189'></a><a href='#L189'>189</a>
<a name='L190'></a><a href='#L190'>190</a>
<a name='L191'></a><a href='#L191'>191</a>
<a name='L192'></a><a href='#L192'>192</a>
<a name='L193'></a><a href='#L193'>193</a>
<a name='L194'></a><a href='#L194'>194</a>
<a name='L195'></a><a href='#L195'>195</a>
<a name='L196'></a><a href='#L196'>196</a>
<a name='L197'></a><a href='#L197'>197</a>
<a name='L198'></a><a href='#L198'>198</a>
<a name='L199'></a><a href='#L199'>199</a>
<a name='L200'></a><a href='#L200'>200</a>
<a name='L201'></a><a href='#L201'>201</a>
<a name='L202'></a><a href='#L202'>202</a>
<a name='L203'></a><a href='#L203'>203</a>
<a name='L204'></a><a href='#L204'>204</a>
<a name='L205'></a><a href='#L205'>205</a>
<a name='L206'></a><a href='#L206'>206</a>
<a name='L207'></a><a href='#L207'>207</a>
<a name='L208'></a><a href='#L208'>208</a>
<a name='L209'></a><a href='#L209'>209</a>
<a name='L210'></a><a href='#L210'>210</a>
<a name='L211'></a><a href='#L211'>211</a>
<a name='L212'></a><a href='#L212'>212</a>
<a name='L213'></a><a href='#L213'>213</a>
<a name='L214'></a><a href='#L214'>214</a>
<a name='L215'></a><a href='#L215'>215</a>
<a name='L216'></a><a href='#L216'>216</a>
<a name='L217'></a><a href='#L217'>217</a>
<a name='L218'></a><a href='#L218'>218</a>
<a name='L219'></a><a href='#L219'>219</a>
<a name='L220'></a><a href='#L220'>220</a>
<a name='L221'></a><a href='#L221'>221</a>
<a name='L222'></a><a href='#L222'>222</a>
<a name='L223'></a><a href='#L223'>223</a>
<a name='L224'></a><a href='#L224'>224</a>
<a name='L225'></a><a href='#L225'>225</a>
<a name='L226'></a><a href='#L226'>226</a>
<a name='L227'></a><a href='#L227'>227</a>
<a name='L228'></a><a href='#L228'>228</a>
<a name='L229'></a><a href='#L229'>229</a>
<a name='L230'></a><a href='#L230'>230</a>
<a name='L231'></a><a href='#L231'>231</a>
<a name='L232'></a><a href='#L232'>232</a>
<a name='L233'></a><a href='#L233'>233</a>
<a name='L234'></a><a href='#L234'>234</a>
<a name='L235'></a><a href='#L235'>235</a>
<a name='L236'></a><a href='#L236'>236</a>
<a name='L237'></a><a href='#L237'>237</a>
<a name='L238'></a><a href='#L238'>238</a>
<a name='L239'></a><a href='#L239'>239</a>
<a name='L240'></a><a href='#L240'>240</a>
<a name='L241'></a><a href='#L241'>241</a>
<a name='L242'></a><a href='#L242'>242</a>
<a name='L243'></a><a href='#L243'>243</a>
<a name='L244'></a><a href='#L244'>244</a>
<a name='L245'></a><a href='#L245'>245</a>
<a name='L246'></a><a href='#L246'>246</a>
<a name='L247'></a><a href='#L247'>247</a>
<a name='L248'></a><a href='#L248'>248</a>
<a name='L249'></a><a href='#L249'>249</a>
<a name='L250'></a><a href='#L250'>250</a>
<a name='L251'></a><a href='#L251'>251</a>
<a name='L252'></a><a href='#L252'>252</a>
<a name='L253'></a><a href='#L253'>253</a>
<a name='L254'></a><a href='#L254'>254</a>
<a name='L255'></a><a href='#L255'>255</a>
<a name='L256'></a><a href='#L256'>256</a>
<a name='L257'></a><a href='#L257'>257</a>
<a name='L258'></a><a href='#L258'>258</a>
<a name='L259'></a><a href='#L259'>259</a>
<a name='L260'></a><a href='#L260'>260</a>
<a name='L261'></a><a href='#L261'>261</a>
<a name='L262'></a><a href='#L262'>262</a>
<a name='L263'></a><a href='#L263'>263</a>
<a name='L264'></a><a href='#L264'>264</a>
<a name='L265'></a><a href='#L265'>265</a>
<a name='L266'></a><a href='#L266'>266</a>
<a name='L267'></a><a href='#L267'>267</a>
<a name='L268'></a><a href='#L268'>268</a>
<a name='L269'></a><a href='#L269'>269</a>
<a name='L270'></a><a href='#L270'>270</a>
<a name='L271'></a><a href='#L271'>271</a>
<a name='L272'></a><a href='#L272'>272</a>
<a name='L273'></a><a href='#L273'>273</a>
<a name='L274'></a><a href='#L274'>274</a>
<a name='L275'></a><a href='#L275'>275</a>
<a name='L276'></a><a href='#L276'>276</a>
<a name='L277'></a><a href='#L277'>277</a>
<a name='L278'></a><a href='#L278'>278</a>
<a name='L279'></a><a href='#L279'>279</a>
<a name='L280'></a><a href='#L280'>280</a>
<a name='L281'></a><a href='#L281'>281</a>
<a name='L282'></a><a href='#L282'>282</a>
<a name='L283'></a><a href='#L283'>283</a>
<a name='L284'></a><a href='#L284'>284</a>
<a name='L285'></a><a href='#L285'>285</a>
<a name='L286'></a><a href='#L286'>286</a>
<a name='L287'></a><a href='#L287'>287</a>
<a name='L288'></a><a href='#L288'>288</a>
<a name='L289'></a><a href='#L289'>289</a>
<a name='L290'></a><a href='#L290'>290</a>
<a name='L291'></a><a href='#L291'>291</a>
<a name='L292'></a><a href='#L292'>292</a>
<a name='L293'></a><a href='#L293'>293</a>
<a name='L294'></a><a href='#L294'>294</a>
<a name='L295'></a><a href='#L295'>295</a>
<a name='L296'></a><a href='#L296'>296</a>
<a name='L297'></a><a href='#L297'>297</a>
<a name='L298'></a><a href='#L298'>298</a>
<a name='L299'></a><a href='#L299'>299</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import { useEffect } from 'react'<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
<span class="cstat-no" title="statement not covered" >import {</span>
Box,
Typography,
Paper,
Card,
CardContent,
Chip,
Alert,
Button,
Accordion,
AccordionSummary,
AccordionDetails,
CircularProgress,
} from '@mui/material'
<span class="cstat-no" title="statement not covered" >import {</span>
ExpandMore,
LocationOn,
Warning,
CheckCircle,
Error,
Public,
Business,
Home,
} from '@mui/icons-material'
import type { ChipProps } from '@mui/material'
<span class="cstat-no" title="statement not covered" >import { useAppDispatch, useAppSelector } from '../store'</span>
<span class="cstat-no" title="statement not covered" >import { getContextData } from '../store/documentSlice'</span>
<span class="cstat-no" title="statement not covered" >import { Layout } from '../components/Layout'</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >export default function ContexteView() {</span>
<span class="cstat-no" title="statement not covered" > const dispatch = useAppDispatch()</span>
<span class="cstat-no" title="statement not covered" > const { currentDocument, contextResult, loading } = useAppSelector(</span>
<span class="cstat-no" title="statement not covered" > (state) =&gt; state.document</span>
<span class="cstat-no" title="statement not covered" > )</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > useEffect(() =&gt; {</span>
<span class="cstat-no" title="statement not covered" > if (currentDocument &amp;&amp; !contextResult) {</span>
<span class="cstat-no" title="statement not covered" > dispatch(getContextData(currentDocument.id))</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" > }, [currentDocument, contextResult, dispatch])</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > if (!currentDocument) {</span>
<span class="cstat-no" title="statement not covered" > return (</span>
<span class="cstat-no" title="statement not covered" > &lt;Layout&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Alert severity="info"&gt;</span>
Veuillez d'abord téléverser et sélectionner un document.
<span class="cstat-no" title="statement not covered" > &lt;/Alert&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Layout&gt;</span>
)
<span class="cstat-no" title="statement not covered" > }</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > if (loading) {</span>
<span class="cstat-no" title="statement not covered" > return (</span>
<span class="cstat-no" title="statement not covered" > &lt;Layout&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ display: 'flex', justifyContent: 'center', mt: 4 }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;CircularProgress /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography sx={{ ml: 2 }}&gt;Recherche d'informations contextuelles...&lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Layout&gt;</span>
)
<span class="cstat-no" title="statement not covered" > }</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > if (!contextResult) {</span>
<span class="cstat-no" title="statement not covered" > return (</span>
<span class="cstat-no" title="statement not covered" > &lt;Layout&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Alert severity="warning"&gt;</span>
Aucune donnée contextuelle disponible.
<span class="cstat-no" title="statement not covered" > &lt;/Alert&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Layout&gt;</span>
)
<span class="cstat-no" title="statement not covered" > }</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > const getStatusIcon = (hasData: boolean) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > return hasData ? &lt;CheckCircle color="success" /&gt; : &lt;Error color="error" /&gt;</span>
<span class="cstat-no" title="statement not covered" > }</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > const getStatusColor = (hasData: boolean): ChipProps['color'] =&gt; {</span>
<span class="cstat-no" title="statement not covered" > return hasData ? 'success' : 'error'</span>
<span class="cstat-no" title="statement not covered" > }</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > return (</span>
<span class="cstat-no" title="statement not covered" > &lt;Layout&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h4" gutterBottom&gt;</span>
Informations contextuelles
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}&gt;</span>
{/* Résumé des sources */}
<span class="cstat-no" title="statement not covered" > &lt;Paper sx={{ p: 2 }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6" gutterBottom&gt;</span>
Sources de données consultées
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ display: 'flex', gap: 1, flexWrap: 'wrap' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Chip</span>
<span class="cstat-no" title="statement not covered" > icon={getStatusIcon(!!contextResult.cadastreData)}</span>
<span class="cstat-no" title="statement not covered" > label="Cadastre"</span>
<span class="cstat-no" title="statement not covered" > color={getStatusColor(!!contextResult.cadastreData)}</span>
<span class="cstat-no" title="statement not covered" > variant="outlined"</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Chip</span>
<span class="cstat-no" title="statement not covered" > icon={getStatusIcon(!!contextResult.georisquesData)}</span>
<span class="cstat-no" title="statement not covered" > label="Géorisques"</span>
<span class="cstat-no" title="statement not covered" > color={getStatusColor(!!contextResult.georisquesData)}</span>
<span class="cstat-no" title="statement not covered" > variant="outlined"</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Chip</span>
<span class="cstat-no" title="statement not covered" > icon={getStatusIcon(!!contextResult.geofoncierData)}</span>
<span class="cstat-no" title="statement not covered" > label="Géofoncier"</span>
<span class="cstat-no" title="statement not covered" > color={getStatusColor(!!contextResult.geofoncierData)}</span>
<span class="cstat-no" title="statement not covered" > variant="outlined"</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Chip</span>
<span class="cstat-no" title="statement not covered" > icon={getStatusIcon(!!contextResult.bodaccData)}</span>
<span class="cstat-no" title="statement not covered" > label="BODACC"</span>
<span class="cstat-no" title="statement not covered" > color={getStatusColor(!!contextResult.bodaccData)}</span>
<span class="cstat-no" title="statement not covered" > variant="outlined"</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Chip</span>
<span class="cstat-no" title="statement not covered" > icon={getStatusIcon(!!contextResult.infogreffeData)}</span>
<span class="cstat-no" title="statement not covered" > label="Infogreffe"</span>
<span class="cstat-no" title="statement not covered" > color={getStatusColor(!!contextResult.infogreffeData)}</span>
<span class="cstat-no" title="statement not covered" > variant="outlined"</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="caption" color="text.secondary" sx={{ mt: 1, display: 'block' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > Dernière mise à jour: {new Date(contextResult.lastUpdated).toLocaleString()}</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Paper&gt;</span>
&nbsp;
{/* Données cadastrales */}
<span class="cstat-no" title="statement not covered" > &lt;Accordion&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;AccordionSummary expandIcon={&lt;ExpandMore /&gt;}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ display: 'flex', alignItems: 'center' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Home sx={{ mr: 1 }} /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6"&gt;Données cadastrales&lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Chip</span>
<span class="cstat-no" title="statement not covered" > label={contextResult.cadastreData ? 'Disponible' : 'Non disponible'}</span>
<span class="cstat-no" title="statement not covered" > color={getStatusColor(!!contextResult.cadastreData)}</span>
<span class="cstat-no" title="statement not covered" > size="small"</span>
<span class="cstat-no" title="statement not covered" > sx={{ ml: 2 }}</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/AccordionSummary&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;AccordionDetails&gt;</span>
<span class="cstat-no" title="statement not covered" > {contextResult.cadastreData ? (</span>
<span class="cstat-no" title="statement not covered" > &lt;Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="body2" sx={{ whiteSpace: 'pre-wrap' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > {JSON.stringify(contextResult.cadastreData, null, 2)}</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
) : (
<span class="cstat-no" title="statement not covered" > &lt;Alert severity="info"&gt;</span>
Aucune donnée cadastrale trouvée pour ce document.
<span class="cstat-no" title="statement not covered" > &lt;/Alert&gt;</span>
)}
<span class="cstat-no" title="statement not covered" > &lt;/AccordionDetails&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Accordion&gt;</span>
&nbsp;
{/* Données Géorisques */}
<span class="cstat-no" title="statement not covered" > &lt;Accordion&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;AccordionSummary expandIcon={&lt;ExpandMore /&gt;}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ display: 'flex', alignItems: 'center' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Warning sx={{ mr: 1 }} /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6"&gt;Données Géorisques&lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Chip</span>
<span class="cstat-no" title="statement not covered" > label={contextResult.georisquesData ? 'Disponible' : 'Non disponible'}</span>
<span class="cstat-no" title="statement not covered" > color={getStatusColor(!!contextResult.georisquesData)}</span>
<span class="cstat-no" title="statement not covered" > size="small"</span>
<span class="cstat-no" title="statement not covered" > sx={{ ml: 2 }}</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/AccordionSummary&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;AccordionDetails&gt;</span>
<span class="cstat-no" title="statement not covered" > {contextResult.georisquesData ? (</span>
<span class="cstat-no" title="statement not covered" > &lt;Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="body2" sx={{ whiteSpace: 'pre-wrap' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > {JSON.stringify(contextResult.georisquesData, null, 2)}</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
) : (
<span class="cstat-no" title="statement not covered" > &lt;Alert severity="info"&gt;</span>
Aucune donnée Géorisques trouvée pour ce document.
<span class="cstat-no" title="statement not covered" > &lt;/Alert&gt;</span>
)}
<span class="cstat-no" title="statement not covered" > &lt;/AccordionDetails&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Accordion&gt;</span>
&nbsp;
{/* Données Géofoncier */}
<span class="cstat-no" title="statement not covered" > &lt;Accordion&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;AccordionSummary expandIcon={&lt;ExpandMore /&gt;}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ display: 'flex', alignItems: 'center' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;LocationOn sx={{ mr: 1 }} /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6"&gt;Données Géofoncier&lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Chip</span>
<span class="cstat-no" title="statement not covered" > label={contextResult.geofoncierData ? 'Disponible' : 'Non disponible'}</span>
<span class="cstat-no" title="statement not covered" > color={getStatusColor(!!contextResult.geofoncierData)}</span>
<span class="cstat-no" title="statement not covered" > size="small"</span>
<span class="cstat-no" title="statement not covered" > sx={{ ml: 2 }}</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/AccordionSummary&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;AccordionDetails&gt;</span>
<span class="cstat-no" title="statement not covered" > {contextResult.geofoncierData ? (</span>
<span class="cstat-no" title="statement not covered" > &lt;Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="body2" sx={{ whiteSpace: 'pre-wrap' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > {JSON.stringify(contextResult.geofoncierData, null, 2)}</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
) : (
<span class="cstat-no" title="statement not covered" > &lt;Alert severity="info"&gt;</span>
Aucune donnée Géofoncier trouvée pour ce document.
<span class="cstat-no" title="statement not covered" > &lt;/Alert&gt;</span>
)}
<span class="cstat-no" title="statement not covered" > &lt;/AccordionDetails&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Accordion&gt;</span>
&nbsp;
{/* Données BODACC */}
<span class="cstat-no" title="statement not covered" > &lt;Accordion&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;AccordionSummary expandIcon={&lt;ExpandMore /&gt;}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ display: 'flex', alignItems: 'center' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Public sx={{ mr: 1 }} /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6"&gt;Données BODACC&lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Chip</span>
<span class="cstat-no" title="statement not covered" > label={contextResult.bodaccData ? 'Disponible' : 'Non disponible'}</span>
<span class="cstat-no" title="statement not covered" > color={getStatusColor(!!contextResult.bodaccData)}</span>
<span class="cstat-no" title="statement not covered" > size="small"</span>
<span class="cstat-no" title="statement not covered" > sx={{ ml: 2 }}</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/AccordionSummary&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;AccordionDetails&gt;</span>
<span class="cstat-no" title="statement not covered" > {contextResult.bodaccData ? (</span>
<span class="cstat-no" title="statement not covered" > &lt;Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="body2" sx={{ whiteSpace: 'pre-wrap' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > {JSON.stringify(contextResult.bodaccData, null, 2)}</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
) : (
<span class="cstat-no" title="statement not covered" > &lt;Alert severity="info"&gt;</span>
Aucune donnée BODACC trouvée pour ce document.
<span class="cstat-no" title="statement not covered" > &lt;/Alert&gt;</span>
)}
<span class="cstat-no" title="statement not covered" > &lt;/AccordionDetails&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Accordion&gt;</span>
&nbsp;
{/* Données Infogreffe */}
<span class="cstat-no" title="statement not covered" > &lt;Accordion&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;AccordionSummary expandIcon={&lt;ExpandMore /&gt;}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ display: 'flex', alignItems: 'center' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Business sx={{ mr: 1 }} /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6"&gt;Données Infogreffe&lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Chip</span>
<span class="cstat-no" title="statement not covered" > label={contextResult.infogreffeData ? 'Disponible' : 'Non disponible'}</span>
<span class="cstat-no" title="statement not covered" > color={getStatusColor(!!contextResult.infogreffeData)}</span>
<span class="cstat-no" title="statement not covered" > size="small"</span>
<span class="cstat-no" title="statement not covered" > sx={{ ml: 2 }}</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/AccordionSummary&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;AccordionDetails&gt;</span>
<span class="cstat-no" title="statement not covered" > {contextResult.infogreffeData ? (</span>
<span class="cstat-no" title="statement not covered" > &lt;Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="body2" sx={{ whiteSpace: 'pre-wrap' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > {JSON.stringify(contextResult.infogreffeData, null, 2)}</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
) : (
<span class="cstat-no" title="statement not covered" > &lt;Alert severity="info"&gt;</span>
Aucune donnée Infogreffe trouvée pour ce document.
<span class="cstat-no" title="statement not covered" > &lt;/Alert&gt;</span>
)}
<span class="cstat-no" title="statement not covered" > &lt;/AccordionDetails&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Accordion&gt;</span>
&nbsp;
{/* Actions */}
<span class="cstat-no" title="statement not covered" > &lt;Card&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6" gutterBottom&gt;</span>
Actions
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ display: 'flex', gap: 2 }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Button</span>
<span class="cstat-no" title="statement not covered" > variant="contained"</span>
<span class="cstat-no" title="statement not covered" > onClick={() =&gt; dispatch(getContextData(currentDocument.id))}</span>
<span class="cstat-no" title="statement not covered" > disabled={loading}</span>
<span class="cstat-no" title="statement not covered" > &gt;</span>
Actualiser les données
<span class="cstat-no" title="statement not covered" > &lt;/Button&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Button variant="outlined"&gt;</span>
Exporter le rapport
<span class="cstat-no" title="statement not covered" > &lt;/Button&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Card&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Layout&gt;</span>
)
<span class="cstat-no" title="statement not covered" >}</span></pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2025-09-11T09:40:00.754Z
</div>
<script src="../../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../../sorter.js"></script>
<script src="../../../block-navigation.js"></script>
</body>
</html>

View File

@ -0,0 +1,946 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for 4NK_IA_front/src/views/ExtractionView.tsx</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../../prettify.css" />
<link rel="stylesheet" href="../../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../../index.html">All files</a> / <a href="index.html">4NK_IA_front/src/views</a> ExtractionView.tsx</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/230</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/230</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a>
<a name='L42'></a><a href='#L42'>42</a>
<a name='L43'></a><a href='#L43'>43</a>
<a name='L44'></a><a href='#L44'>44</a>
<a name='L45'></a><a href='#L45'>45</a>
<a name='L46'></a><a href='#L46'>46</a>
<a name='L47'></a><a href='#L47'>47</a>
<a name='L48'></a><a href='#L48'>48</a>
<a name='L49'></a><a href='#L49'>49</a>
<a name='L50'></a><a href='#L50'>50</a>
<a name='L51'></a><a href='#L51'>51</a>
<a name='L52'></a><a href='#L52'>52</a>
<a name='L53'></a><a href='#L53'>53</a>
<a name='L54'></a><a href='#L54'>54</a>
<a name='L55'></a><a href='#L55'>55</a>
<a name='L56'></a><a href='#L56'>56</a>
<a name='L57'></a><a href='#L57'>57</a>
<a name='L58'></a><a href='#L58'>58</a>
<a name='L59'></a><a href='#L59'>59</a>
<a name='L60'></a><a href='#L60'>60</a>
<a name='L61'></a><a href='#L61'>61</a>
<a name='L62'></a><a href='#L62'>62</a>
<a name='L63'></a><a href='#L63'>63</a>
<a name='L64'></a><a href='#L64'>64</a>
<a name='L65'></a><a href='#L65'>65</a>
<a name='L66'></a><a href='#L66'>66</a>
<a name='L67'></a><a href='#L67'>67</a>
<a name='L68'></a><a href='#L68'>68</a>
<a name='L69'></a><a href='#L69'>69</a>
<a name='L70'></a><a href='#L70'>70</a>
<a name='L71'></a><a href='#L71'>71</a>
<a name='L72'></a><a href='#L72'>72</a>
<a name='L73'></a><a href='#L73'>73</a>
<a name='L74'></a><a href='#L74'>74</a>
<a name='L75'></a><a href='#L75'>75</a>
<a name='L76'></a><a href='#L76'>76</a>
<a name='L77'></a><a href='#L77'>77</a>
<a name='L78'></a><a href='#L78'>78</a>
<a name='L79'></a><a href='#L79'>79</a>
<a name='L80'></a><a href='#L80'>80</a>
<a name='L81'></a><a href='#L81'>81</a>
<a name='L82'></a><a href='#L82'>82</a>
<a name='L83'></a><a href='#L83'>83</a>
<a name='L84'></a><a href='#L84'>84</a>
<a name='L85'></a><a href='#L85'>85</a>
<a name='L86'></a><a href='#L86'>86</a>
<a name='L87'></a><a href='#L87'>87</a>
<a name='L88'></a><a href='#L88'>88</a>
<a name='L89'></a><a href='#L89'>89</a>
<a name='L90'></a><a href='#L90'>90</a>
<a name='L91'></a><a href='#L91'>91</a>
<a name='L92'></a><a href='#L92'>92</a>
<a name='L93'></a><a href='#L93'>93</a>
<a name='L94'></a><a href='#L94'>94</a>
<a name='L95'></a><a href='#L95'>95</a>
<a name='L96'></a><a href='#L96'>96</a>
<a name='L97'></a><a href='#L97'>97</a>
<a name='L98'></a><a href='#L98'>98</a>
<a name='L99'></a><a href='#L99'>99</a>
<a name='L100'></a><a href='#L100'>100</a>
<a name='L101'></a><a href='#L101'>101</a>
<a name='L102'></a><a href='#L102'>102</a>
<a name='L103'></a><a href='#L103'>103</a>
<a name='L104'></a><a href='#L104'>104</a>
<a name='L105'></a><a href='#L105'>105</a>
<a name='L106'></a><a href='#L106'>106</a>
<a name='L107'></a><a href='#L107'>107</a>
<a name='L108'></a><a href='#L108'>108</a>
<a name='L109'></a><a href='#L109'>109</a>
<a name='L110'></a><a href='#L110'>110</a>
<a name='L111'></a><a href='#L111'>111</a>
<a name='L112'></a><a href='#L112'>112</a>
<a name='L113'></a><a href='#L113'>113</a>
<a name='L114'></a><a href='#L114'>114</a>
<a name='L115'></a><a href='#L115'>115</a>
<a name='L116'></a><a href='#L116'>116</a>
<a name='L117'></a><a href='#L117'>117</a>
<a name='L118'></a><a href='#L118'>118</a>
<a name='L119'></a><a href='#L119'>119</a>
<a name='L120'></a><a href='#L120'>120</a>
<a name='L121'></a><a href='#L121'>121</a>
<a name='L122'></a><a href='#L122'>122</a>
<a name='L123'></a><a href='#L123'>123</a>
<a name='L124'></a><a href='#L124'>124</a>
<a name='L125'></a><a href='#L125'>125</a>
<a name='L126'></a><a href='#L126'>126</a>
<a name='L127'></a><a href='#L127'>127</a>
<a name='L128'></a><a href='#L128'>128</a>
<a name='L129'></a><a href='#L129'>129</a>
<a name='L130'></a><a href='#L130'>130</a>
<a name='L131'></a><a href='#L131'>131</a>
<a name='L132'></a><a href='#L132'>132</a>
<a name='L133'></a><a href='#L133'>133</a>
<a name='L134'></a><a href='#L134'>134</a>
<a name='L135'></a><a href='#L135'>135</a>
<a name='L136'></a><a href='#L136'>136</a>
<a name='L137'></a><a href='#L137'>137</a>
<a name='L138'></a><a href='#L138'>138</a>
<a name='L139'></a><a href='#L139'>139</a>
<a name='L140'></a><a href='#L140'>140</a>
<a name='L141'></a><a href='#L141'>141</a>
<a name='L142'></a><a href='#L142'>142</a>
<a name='L143'></a><a href='#L143'>143</a>
<a name='L144'></a><a href='#L144'>144</a>
<a name='L145'></a><a href='#L145'>145</a>
<a name='L146'></a><a href='#L146'>146</a>
<a name='L147'></a><a href='#L147'>147</a>
<a name='L148'></a><a href='#L148'>148</a>
<a name='L149'></a><a href='#L149'>149</a>
<a name='L150'></a><a href='#L150'>150</a>
<a name='L151'></a><a href='#L151'>151</a>
<a name='L152'></a><a href='#L152'>152</a>
<a name='L153'></a><a href='#L153'>153</a>
<a name='L154'></a><a href='#L154'>154</a>
<a name='L155'></a><a href='#L155'>155</a>
<a name='L156'></a><a href='#L156'>156</a>
<a name='L157'></a><a href='#L157'>157</a>
<a name='L158'></a><a href='#L158'>158</a>
<a name='L159'></a><a href='#L159'>159</a>
<a name='L160'></a><a href='#L160'>160</a>
<a name='L161'></a><a href='#L161'>161</a>
<a name='L162'></a><a href='#L162'>162</a>
<a name='L163'></a><a href='#L163'>163</a>
<a name='L164'></a><a href='#L164'>164</a>
<a name='L165'></a><a href='#L165'>165</a>
<a name='L166'></a><a href='#L166'>166</a>
<a name='L167'></a><a href='#L167'>167</a>
<a name='L168'></a><a href='#L168'>168</a>
<a name='L169'></a><a href='#L169'>169</a>
<a name='L170'></a><a href='#L170'>170</a>
<a name='L171'></a><a href='#L171'>171</a>
<a name='L172'></a><a href='#L172'>172</a>
<a name='L173'></a><a href='#L173'>173</a>
<a name='L174'></a><a href='#L174'>174</a>
<a name='L175'></a><a href='#L175'>175</a>
<a name='L176'></a><a href='#L176'>176</a>
<a name='L177'></a><a href='#L177'>177</a>
<a name='L178'></a><a href='#L178'>178</a>
<a name='L179'></a><a href='#L179'>179</a>
<a name='L180'></a><a href='#L180'>180</a>
<a name='L181'></a><a href='#L181'>181</a>
<a name='L182'></a><a href='#L182'>182</a>
<a name='L183'></a><a href='#L183'>183</a>
<a name='L184'></a><a href='#L184'>184</a>
<a name='L185'></a><a href='#L185'>185</a>
<a name='L186'></a><a href='#L186'>186</a>
<a name='L187'></a><a href='#L187'>187</a>
<a name='L188'></a><a href='#L188'>188</a>
<a name='L189'></a><a href='#L189'>189</a>
<a name='L190'></a><a href='#L190'>190</a>
<a name='L191'></a><a href='#L191'>191</a>
<a name='L192'></a><a href='#L192'>192</a>
<a name='L193'></a><a href='#L193'>193</a>
<a name='L194'></a><a href='#L194'>194</a>
<a name='L195'></a><a href='#L195'>195</a>
<a name='L196'></a><a href='#L196'>196</a>
<a name='L197'></a><a href='#L197'>197</a>
<a name='L198'></a><a href='#L198'>198</a>
<a name='L199'></a><a href='#L199'>199</a>
<a name='L200'></a><a href='#L200'>200</a>
<a name='L201'></a><a href='#L201'>201</a>
<a name='L202'></a><a href='#L202'>202</a>
<a name='L203'></a><a href='#L203'>203</a>
<a name='L204'></a><a href='#L204'>204</a>
<a name='L205'></a><a href='#L205'>205</a>
<a name='L206'></a><a href='#L206'>206</a>
<a name='L207'></a><a href='#L207'>207</a>
<a name='L208'></a><a href='#L208'>208</a>
<a name='L209'></a><a href='#L209'>209</a>
<a name='L210'></a><a href='#L210'>210</a>
<a name='L211'></a><a href='#L211'>211</a>
<a name='L212'></a><a href='#L212'>212</a>
<a name='L213'></a><a href='#L213'>213</a>
<a name='L214'></a><a href='#L214'>214</a>
<a name='L215'></a><a href='#L215'>215</a>
<a name='L216'></a><a href='#L216'>216</a>
<a name='L217'></a><a href='#L217'>217</a>
<a name='L218'></a><a href='#L218'>218</a>
<a name='L219'></a><a href='#L219'>219</a>
<a name='L220'></a><a href='#L220'>220</a>
<a name='L221'></a><a href='#L221'>221</a>
<a name='L222'></a><a href='#L222'>222</a>
<a name='L223'></a><a href='#L223'>223</a>
<a name='L224'></a><a href='#L224'>224</a>
<a name='L225'></a><a href='#L225'>225</a>
<a name='L226'></a><a href='#L226'>226</a>
<a name='L227'></a><a href='#L227'>227</a>
<a name='L228'></a><a href='#L228'>228</a>
<a name='L229'></a><a href='#L229'>229</a>
<a name='L230'></a><a href='#L230'>230</a>
<a name='L231'></a><a href='#L231'>231</a>
<a name='L232'></a><a href='#L232'>232</a>
<a name='L233'></a><a href='#L233'>233</a>
<a name='L234'></a><a href='#L234'>234</a>
<a name='L235'></a><a href='#L235'>235</a>
<a name='L236'></a><a href='#L236'>236</a>
<a name='L237'></a><a href='#L237'>237</a>
<a name='L238'></a><a href='#L238'>238</a>
<a name='L239'></a><a href='#L239'>239</a>
<a name='L240'></a><a href='#L240'>240</a>
<a name='L241'></a><a href='#L241'>241</a>
<a name='L242'></a><a href='#L242'>242</a>
<a name='L243'></a><a href='#L243'>243</a>
<a name='L244'></a><a href='#L244'>244</a>
<a name='L245'></a><a href='#L245'>245</a>
<a name='L246'></a><a href='#L246'>246</a>
<a name='L247'></a><a href='#L247'>247</a>
<a name='L248'></a><a href='#L248'>248</a>
<a name='L249'></a><a href='#L249'>249</a>
<a name='L250'></a><a href='#L250'>250</a>
<a name='L251'></a><a href='#L251'>251</a>
<a name='L252'></a><a href='#L252'>252</a>
<a name='L253'></a><a href='#L253'>253</a>
<a name='L254'></a><a href='#L254'>254</a>
<a name='L255'></a><a href='#L255'>255</a>
<a name='L256'></a><a href='#L256'>256</a>
<a name='L257'></a><a href='#L257'>257</a>
<a name='L258'></a><a href='#L258'>258</a>
<a name='L259'></a><a href='#L259'>259</a>
<a name='L260'></a><a href='#L260'>260</a>
<a name='L261'></a><a href='#L261'>261</a>
<a name='L262'></a><a href='#L262'>262</a>
<a name='L263'></a><a href='#L263'>263</a>
<a name='L264'></a><a href='#L264'>264</a>
<a name='L265'></a><a href='#L265'>265</a>
<a name='L266'></a><a href='#L266'>266</a>
<a name='L267'></a><a href='#L267'>267</a>
<a name='L268'></a><a href='#L268'>268</a>
<a name='L269'></a><a href='#L269'>269</a>
<a name='L270'></a><a href='#L270'>270</a>
<a name='L271'></a><a href='#L271'>271</a>
<a name='L272'></a><a href='#L272'>272</a>
<a name='L273'></a><a href='#L273'>273</a>
<a name='L274'></a><a href='#L274'>274</a>
<a name='L275'></a><a href='#L275'>275</a>
<a name='L276'></a><a href='#L276'>276</a>
<a name='L277'></a><a href='#L277'>277</a>
<a name='L278'></a><a href='#L278'>278</a>
<a name='L279'></a><a href='#L279'>279</a>
<a name='L280'></a><a href='#L280'>280</a>
<a name='L281'></a><a href='#L281'>281</a>
<a name='L282'></a><a href='#L282'>282</a>
<a name='L283'></a><a href='#L283'>283</a>
<a name='L284'></a><a href='#L284'>284</a>
<a name='L285'></a><a href='#L285'>285</a>
<a name='L286'></a><a href='#L286'>286</a>
<a name='L287'></a><a href='#L287'>287</a>
<a name='L288'></a><a href='#L288'>288</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import { useEffect } from 'react'<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
<span class="cstat-no" title="statement not covered" >import {</span>
Box,
Typography,
Paper,
Card,
CardContent,
Chip,
List,
ListItem,
ListItemText,
Alert,
CircularProgress,
} from '@mui/material'
<span class="cstat-no" title="statement not covered" >import {</span>
Person,
LocationOn,
Home,
Description,
Language,
Verified,
} from '@mui/icons-material'
<span class="cstat-no" title="statement not covered" >import { useAppDispatch, useAppSelector } from '../store'</span>
<span class="cstat-no" title="statement not covered" >import { extractDocument } from '../store/documentSlice'</span>
<span class="cstat-no" title="statement not covered" >import { Layout } from '../components/Layout'</span>
&nbsp;
<span class="cstat-no" title="statement not covered" >export default function ExtractionView() {</span>
<span class="cstat-no" title="statement not covered" > const dispatch = useAppDispatch()</span>
<span class="cstat-no" title="statement not covered" > const { currentDocument, extractionResult, loading } = useAppSelector(</span>
<span class="cstat-no" title="statement not covered" > (state) =&gt; state.document</span>
<span class="cstat-no" title="statement not covered" > )</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > useEffect(() =&gt; {</span>
<span class="cstat-no" title="statement not covered" > if (currentDocument &amp;&amp; !extractionResult) {</span>
<span class="cstat-no" title="statement not covered" > dispatch(extractDocument(currentDocument.id))</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" > }, [currentDocument, extractionResult, dispatch])</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > if (!currentDocument) {</span>
<span class="cstat-no" title="statement not covered" > return (</span>
<span class="cstat-no" title="statement not covered" > &lt;Layout&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Alert severity="info"&gt;</span>
Veuillez d'abord téléverser et sélectionner un document.
<span class="cstat-no" title="statement not covered" > &lt;/Alert&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Layout&gt;</span>
)
<span class="cstat-no" title="statement not covered" > }</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > if (loading) {</span>
<span class="cstat-no" title="statement not covered" > return (</span>
<span class="cstat-no" title="statement not covered" > &lt;Layout&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ display: 'flex', justifyContent: 'center', mt: 4 }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;CircularProgress /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography sx={{ ml: 2 }}&gt;Extraction en cours...&lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Layout&gt;</span>
)
<span class="cstat-no" title="statement not covered" > }</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > if (!extractionResult) {</span>
<span class="cstat-no" title="statement not covered" > return (</span>
<span class="cstat-no" title="statement not covered" > &lt;Layout&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Alert severity="warning"&gt;</span>
Aucun résultat d'extraction disponible.
<span class="cstat-no" title="statement not covered" > &lt;/Alert&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Layout&gt;</span>
)
<span class="cstat-no" title="statement not covered" > }</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > return (</span>
<span class="cstat-no" title="statement not covered" > &lt;Layout&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h4" gutterBottom&gt;</span>
Extraction des données
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}&gt;</span>
{/* Informations générales */}
<span class="cstat-no" title="statement not covered" > &lt;Paper sx={{ p: 2 }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6" gutterBottom&gt;</span>
Informations générales
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ display: 'flex', gap: 1, flexWrap: 'wrap' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Chip</span>
<span class="cstat-no" title="statement not covered" > icon={&lt;Language /&gt;}</span>
<span class="cstat-no" title="statement not covered" > label={`Langue: ${extractionResult.language}`}</span>
<span class="cstat-no" title="statement not covered" > color="primary"</span>
<span class="cstat-no" title="statement not covered" > variant="outlined"</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Chip</span>
<span class="cstat-no" title="statement not covered" > icon={&lt;Description /&gt;}</span>
<span class="cstat-no" title="statement not covered" > label={`Type: ${extractionResult.documentType}`}</span>
<span class="cstat-no" title="statement not covered" > color="secondary"</span>
<span class="cstat-no" title="statement not covered" > variant="outlined"</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Chip</span>
<span class="cstat-no" title="statement not covered" > icon={&lt;Verified /&gt;}</span>
<span class="cstat-no" title="statement not covered" > label={`Confiance: ${(extractionResult.confidence * 100).toFixed(1)}%`}</span>
<span class="cstat-no" title="statement not covered" > color={extractionResult.confidence &gt; 0.8 ? 'success' : 'warning'}</span>
<span class="cstat-no" title="statement not covered" > variant="outlined"</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Paper&gt;</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ display: 'flex', gap: 3, flexWrap: 'wrap' }}&gt;</span>
{/* Identités */}
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ flex: '1 1 300px' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Card&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6" gutterBottom&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Person sx={{ mr: 1, verticalAlign: 'middle' }} /&gt;</span>
<span class="cstat-no" title="statement not covered" > Identités ({extractionResult.identities?.length || 0})</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;List dense&gt;</span>
<span class="cstat-no" title="statement not covered" > {(extractionResult.identities || []).map((identity, index) =&gt; (</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItem key={index}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItemText</span>
<span class="cstat-no" title="statement not covered" > primary={</span>
<span class="cstat-no" title="statement not covered" > identity.type === 'person'</span>
<span class="cstat-no" title="statement not covered" > ? `${identity.firstName} ${identity.lastName}`</span>
<span class="cstat-no" title="statement not covered" > : identity.companyName</span>
}
<span class="cstat-no" title="statement not covered" > secondary={</span>
<span class="cstat-no" title="statement not covered" > &lt;Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="caption" display="block"&gt;</span>
<span class="cstat-no" title="statement not covered" > Type: {identity.type}</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > {identity.birthDate &amp;&amp; (</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="caption" display="block"&gt;</span>
<span class="cstat-no" title="statement not covered" > Naissance: {identity.birthDate}</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
)}
<span class="cstat-no" title="statement not covered" > {identity.nationality &amp;&amp; (</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="caption" display="block"&gt;</span>
<span class="cstat-no" title="statement not covered" > Nationalité: {identity.nationality}</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
)}
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="caption" display="block"&gt;</span>
<span class="cstat-no" title="statement not covered" > Confiance: {(identity.confidence * 100).toFixed(1)}%</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
}
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/ListItem&gt;</span>
<span class="cstat-no" title="statement not covered" > ))}</span>
<span class="cstat-no" title="statement not covered" > &lt;/List&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Card&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
&nbsp;
{/* Adresses */}
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ flex: '1 1 300px' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Card&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6" gutterBottom&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;LocationOn sx={{ mr: 1, verticalAlign: 'middle' }} /&gt;</span>
<span class="cstat-no" title="statement not covered" > Adresses ({extractionResult.addresses?.length || 0})</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;List dense&gt;</span>
<span class="cstat-no" title="statement not covered" > {(extractionResult.addresses || []).map((address, index) =&gt; (</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItem key={index}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItemText</span>
<span class="cstat-no" title="statement not covered" > primary={`${address.street}, ${address.city}`}</span>
<span class="cstat-no" title="statement not covered" > secondary={`${address.postalCode} ${address.country}`}</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/ListItem&gt;</span>
<span class="cstat-no" title="statement not covered" > ))}</span>
<span class="cstat-no" title="statement not covered" > &lt;/List&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Card&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ display: 'flex', gap: 3, flexWrap: 'wrap' }}&gt;</span>
{/* Biens */}
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ flex: '1 1 300px' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Card&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6" gutterBottom&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Home sx={{ mr: 1, verticalAlign: 'middle' }} /&gt;</span>
<span class="cstat-no" title="statement not covered" > Biens ({extractionResult.properties?.length || 0})</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;List dense&gt;</span>
<span class="cstat-no" title="statement not covered" > {(extractionResult.properties || []).map((property, index) =&gt; (</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItem key={index}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItemText</span>
<span class="cstat-no" title="statement not covered" > primary={`${property.type} - ${property.address.city}`}</span>
<span class="cstat-no" title="statement not covered" > secondary={</span>
<span class="cstat-no" title="statement not covered" > &lt;Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="caption" display="block"&gt;</span>
<span class="cstat-no" title="statement not covered" > {property.address.street}</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > {property.surface &amp;&amp; (</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="caption" display="block"&gt;</span>
<span class="cstat-no" title="statement not covered" > Surface: {property.surface} m²</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
)}
<span class="cstat-no" title="statement not covered" > {property.cadastralReference &amp;&amp; (</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="caption" display="block"&gt;</span>
<span class="cstat-no" title="statement not covered" > Cadastre: {property.cadastralReference}</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
)}
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
}
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/ListItem&gt;</span>
<span class="cstat-no" title="statement not covered" > ))}</span>
<span class="cstat-no" title="statement not covered" > &lt;/List&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Card&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
&nbsp;
{/* Contrats */}
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ flex: '1 1 300px' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Card&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6" gutterBottom&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Description sx={{ mr: 1, verticalAlign: 'middle' }} /&gt;</span>
<span class="cstat-no" title="statement not covered" > Contrats ({extractionResult.contracts?.length || 0})</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;List dense&gt;</span>
<span class="cstat-no" title="statement not covered" > {(extractionResult.contracts || []).map((contract, index) =&gt; (</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItem key={index}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItemText</span>
<span class="cstat-no" title="statement not covered" > primary={`${contract.type} - ${contract.amount ? `${contract.amount}€` : 'Montant non spécifié'}`}</span>
<span class="cstat-no" title="statement not covered" > secondary={</span>
<span class="cstat-no" title="statement not covered" > &lt;Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="caption" display="block"&gt;</span>
<span class="cstat-no" title="statement not covered" > Parties: {contract.parties.length}</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > {contract.date &amp;&amp; (</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="caption" display="block"&gt;</span>
<span class="cstat-no" title="statement not covered" > Date: {contract.date}</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
)}
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="caption" display="block"&gt;</span>
<span class="cstat-no" title="statement not covered" > Clauses: {contract.clauses.length}</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
}
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/ListItem&gt;</span>
<span class="cstat-no" title="statement not covered" > ))}</span>
<span class="cstat-no" title="statement not covered" > &lt;/List&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Card&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
&nbsp;
{/* Signatures */}
<span class="cstat-no" title="statement not covered" > &lt;Card&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6" gutterBottom&gt;</span>
<span class="cstat-no" title="statement not covered" > Signatures détectées ({extractionResult.signatures?.length || 0})</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;List dense&gt;</span>
<span class="cstat-no" title="statement not covered" > {(extractionResult.signatures || []).map((signature, index) =&gt; (</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItem key={index}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;ListItemText primary={signature} /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/ListItem&gt;</span>
<span class="cstat-no" title="statement not covered" > ))}</span>
<span class="cstat-no" title="statement not covered" > &lt;/List&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Card&gt;</span>
&nbsp;
{/* Texte extrait */}
<span class="cstat-no" title="statement not covered" > &lt;Card&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6" gutterBottom&gt;</span>
Texte extrait
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Paper</span>
<span class="cstat-no" title="statement not covered" > sx={{</span>
<span class="cstat-no" title="statement not covered" > p: 2,</span>
<span class="cstat-no" title="statement not covered" > bgcolor: 'grey.50',</span>
<span class="cstat-no" title="statement not covered" > maxHeight: 300,</span>
<span class="cstat-no" title="statement not covered" > overflow: 'auto',</span>
<span class="cstat-no" title="statement not covered" > }}</span>
&gt;
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="body2" sx={{ whiteSpace: 'pre-wrap' }}&gt;</span>
<span class="cstat-no" title="statement not covered" > {extractionResult.text}</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Paper&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/CardContent&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Card&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Layout&gt;</span>
)
<span class="cstat-no" title="statement not covered" >}</span></pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2025-09-11T09:40:00.754Z
</div>
<script src="../../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../../sorter.js"></script>
<script src="../../../block-navigation.js"></script>
</body>
</html>

View File

@ -0,0 +1,595 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for 4NK_IA_front/src/views/UploadView.tsx</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../../prettify.css" />
<link rel="stylesheet" href="../../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../../index.html">All files</a> / <a href="index.html">4NK_IA_front/src/views</a> UploadView.tsx</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/142</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/1</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/142</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
<a name='L2'></a><a href='#L2'>2</a>
<a name='L3'></a><a href='#L3'>3</a>
<a name='L4'></a><a href='#L4'>4</a>
<a name='L5'></a><a href='#L5'>5</a>
<a name='L6'></a><a href='#L6'>6</a>
<a name='L7'></a><a href='#L7'>7</a>
<a name='L8'></a><a href='#L8'>8</a>
<a name='L9'></a><a href='#L9'>9</a>
<a name='L10'></a><a href='#L10'>10</a>
<a name='L11'></a><a href='#L11'>11</a>
<a name='L12'></a><a href='#L12'>12</a>
<a name='L13'></a><a href='#L13'>13</a>
<a name='L14'></a><a href='#L14'>14</a>
<a name='L15'></a><a href='#L15'>15</a>
<a name='L16'></a><a href='#L16'>16</a>
<a name='L17'></a><a href='#L17'>17</a>
<a name='L18'></a><a href='#L18'>18</a>
<a name='L19'></a><a href='#L19'>19</a>
<a name='L20'></a><a href='#L20'>20</a>
<a name='L21'></a><a href='#L21'>21</a>
<a name='L22'></a><a href='#L22'>22</a>
<a name='L23'></a><a href='#L23'>23</a>
<a name='L24'></a><a href='#L24'>24</a>
<a name='L25'></a><a href='#L25'>25</a>
<a name='L26'></a><a href='#L26'>26</a>
<a name='L27'></a><a href='#L27'>27</a>
<a name='L28'></a><a href='#L28'>28</a>
<a name='L29'></a><a href='#L29'>29</a>
<a name='L30'></a><a href='#L30'>30</a>
<a name='L31'></a><a href='#L31'>31</a>
<a name='L32'></a><a href='#L32'>32</a>
<a name='L33'></a><a href='#L33'>33</a>
<a name='L34'></a><a href='#L34'>34</a>
<a name='L35'></a><a href='#L35'>35</a>
<a name='L36'></a><a href='#L36'>36</a>
<a name='L37'></a><a href='#L37'>37</a>
<a name='L38'></a><a href='#L38'>38</a>
<a name='L39'></a><a href='#L39'>39</a>
<a name='L40'></a><a href='#L40'>40</a>
<a name='L41'></a><a href='#L41'>41</a>
<a name='L42'></a><a href='#L42'>42</a>
<a name='L43'></a><a href='#L43'>43</a>
<a name='L44'></a><a href='#L44'>44</a>
<a name='L45'></a><a href='#L45'>45</a>
<a name='L46'></a><a href='#L46'>46</a>
<a name='L47'></a><a href='#L47'>47</a>
<a name='L48'></a><a href='#L48'>48</a>
<a name='L49'></a><a href='#L49'>49</a>
<a name='L50'></a><a href='#L50'>50</a>
<a name='L51'></a><a href='#L51'>51</a>
<a name='L52'></a><a href='#L52'>52</a>
<a name='L53'></a><a href='#L53'>53</a>
<a name='L54'></a><a href='#L54'>54</a>
<a name='L55'></a><a href='#L55'>55</a>
<a name='L56'></a><a href='#L56'>56</a>
<a name='L57'></a><a href='#L57'>57</a>
<a name='L58'></a><a href='#L58'>58</a>
<a name='L59'></a><a href='#L59'>59</a>
<a name='L60'></a><a href='#L60'>60</a>
<a name='L61'></a><a href='#L61'>61</a>
<a name='L62'></a><a href='#L62'>62</a>
<a name='L63'></a><a href='#L63'>63</a>
<a name='L64'></a><a href='#L64'>64</a>
<a name='L65'></a><a href='#L65'>65</a>
<a name='L66'></a><a href='#L66'>66</a>
<a name='L67'></a><a href='#L67'>67</a>
<a name='L68'></a><a href='#L68'>68</a>
<a name='L69'></a><a href='#L69'>69</a>
<a name='L70'></a><a href='#L70'>70</a>
<a name='L71'></a><a href='#L71'>71</a>
<a name='L72'></a><a href='#L72'>72</a>
<a name='L73'></a><a href='#L73'>73</a>
<a name='L74'></a><a href='#L74'>74</a>
<a name='L75'></a><a href='#L75'>75</a>
<a name='L76'></a><a href='#L76'>76</a>
<a name='L77'></a><a href='#L77'>77</a>
<a name='L78'></a><a href='#L78'>78</a>
<a name='L79'></a><a href='#L79'>79</a>
<a name='L80'></a><a href='#L80'>80</a>
<a name='L81'></a><a href='#L81'>81</a>
<a name='L82'></a><a href='#L82'>82</a>
<a name='L83'></a><a href='#L83'>83</a>
<a name='L84'></a><a href='#L84'>84</a>
<a name='L85'></a><a href='#L85'>85</a>
<a name='L86'></a><a href='#L86'>86</a>
<a name='L87'></a><a href='#L87'>87</a>
<a name='L88'></a><a href='#L88'>88</a>
<a name='L89'></a><a href='#L89'>89</a>
<a name='L90'></a><a href='#L90'>90</a>
<a name='L91'></a><a href='#L91'>91</a>
<a name='L92'></a><a href='#L92'>92</a>
<a name='L93'></a><a href='#L93'>93</a>
<a name='L94'></a><a href='#L94'>94</a>
<a name='L95'></a><a href='#L95'>95</a>
<a name='L96'></a><a href='#L96'>96</a>
<a name='L97'></a><a href='#L97'>97</a>
<a name='L98'></a><a href='#L98'>98</a>
<a name='L99'></a><a href='#L99'>99</a>
<a name='L100'></a><a href='#L100'>100</a>
<a name='L101'></a><a href='#L101'>101</a>
<a name='L102'></a><a href='#L102'>102</a>
<a name='L103'></a><a href='#L103'>103</a>
<a name='L104'></a><a href='#L104'>104</a>
<a name='L105'></a><a href='#L105'>105</a>
<a name='L106'></a><a href='#L106'>106</a>
<a name='L107'></a><a href='#L107'>107</a>
<a name='L108'></a><a href='#L108'>108</a>
<a name='L109'></a><a href='#L109'>109</a>
<a name='L110'></a><a href='#L110'>110</a>
<a name='L111'></a><a href='#L111'>111</a>
<a name='L112'></a><a href='#L112'>112</a>
<a name='L113'></a><a href='#L113'>113</a>
<a name='L114'></a><a href='#L114'>114</a>
<a name='L115'></a><a href='#L115'>115</a>
<a name='L116'></a><a href='#L116'>116</a>
<a name='L117'></a><a href='#L117'>117</a>
<a name='L118'></a><a href='#L118'>118</a>
<a name='L119'></a><a href='#L119'>119</a>
<a name='L120'></a><a href='#L120'>120</a>
<a name='L121'></a><a href='#L121'>121</a>
<a name='L122'></a><a href='#L122'>122</a>
<a name='L123'></a><a href='#L123'>123</a>
<a name='L124'></a><a href='#L124'>124</a>
<a name='L125'></a><a href='#L125'>125</a>
<a name='L126'></a><a href='#L126'>126</a>
<a name='L127'></a><a href='#L127'>127</a>
<a name='L128'></a><a href='#L128'>128</a>
<a name='L129'></a><a href='#L129'>129</a>
<a name='L130'></a><a href='#L130'>130</a>
<a name='L131'></a><a href='#L131'>131</a>
<a name='L132'></a><a href='#L132'>132</a>
<a name='L133'></a><a href='#L133'>133</a>
<a name='L134'></a><a href='#L134'>134</a>
<a name='L135'></a><a href='#L135'>135</a>
<a name='L136'></a><a href='#L136'>136</a>
<a name='L137'></a><a href='#L137'>137</a>
<a name='L138'></a><a href='#L138'>138</a>
<a name='L139'></a><a href='#L139'>139</a>
<a name='L140'></a><a href='#L140'>140</a>
<a name='L141'></a><a href='#L141'>141</a>
<a name='L142'></a><a href='#L142'>142</a>
<a name='L143'></a><a href='#L143'>143</a>
<a name='L144'></a><a href='#L144'>144</a>
<a name='L145'></a><a href='#L145'>145</a>
<a name='L146'></a><a href='#L146'>146</a>
<a name='L147'></a><a href='#L147'>147</a>
<a name='L148'></a><a href='#L148'>148</a>
<a name='L149'></a><a href='#L149'>149</a>
<a name='L150'></a><a href='#L150'>150</a>
<a name='L151'></a><a href='#L151'>151</a>
<a name='L152'></a><a href='#L152'>152</a>
<a name='L153'></a><a href='#L153'>153</a>
<a name='L154'></a><a href='#L154'>154</a>
<a name='L155'></a><a href='#L155'>155</a>
<a name='L156'></a><a href='#L156'>156</a>
<a name='L157'></a><a href='#L157'>157</a>
<a name='L158'></a><a href='#L158'>158</a>
<a name='L159'></a><a href='#L159'>159</a>
<a name='L160'></a><a href='#L160'>160</a>
<a name='L161'></a><a href='#L161'>161</a>
<a name='L162'></a><a href='#L162'>162</a>
<a name='L163'></a><a href='#L163'>163</a>
<a name='L164'></a><a href='#L164'>164</a>
<a name='L165'></a><a href='#L165'>165</a>
<a name='L166'></a><a href='#L166'>166</a>
<a name='L167'></a><a href='#L167'>167</a>
<a name='L168'></a><a href='#L168'>168</a>
<a name='L169'></a><a href='#L169'>169</a>
<a name='L170'></a><a href='#L170'>170</a>
<a name='L171'></a><a href='#L171'>171</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >import { useCallback, useState } from 'react'<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
<span class="cstat-no" title="statement not covered" >import { useDropzone } from 'react-dropzone'</span>
<span class="cstat-no" title="statement not covered" >import { Box, Typography, Paper, CircularProgress, Alert, Button, Chip, Grid } from '@mui/material'</span>
<span class="cstat-no" title="statement not covered" >import {</span>
CloudUpload,
CheckCircle,
Error,
HourglassEmpty,
Visibility,
} from '@mui/icons-material'
<span class="cstat-no" title="statement not covered" >import { useAppDispatch, useAppSelector } from '../store'</span>
<span class="cstat-no" title="statement not covered" >import { uploadDocument } from '../store/documentSlice'</span>
<span class="cstat-no" title="statement not covered" >import { Layout } from '../components/Layout'</span>
<span class="cstat-no" title="statement not covered" >import { FilePreview } from '../components/FilePreview'</span>
import type { Document } from '../types'
&nbsp;
<span class="cstat-no" title="statement not covered" >export default function UploadView() {</span>
<span class="cstat-no" title="statement not covered" > const dispatch = useAppDispatch()</span>
<span class="cstat-no" title="statement not covered" > const { documents, error } = useAppSelector((state) =&gt; state.document)</span>
<span class="cstat-no" title="statement not covered" > const [previewDocument, setPreviewDocument] = useState&lt;Document | null&gt;(null)</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > const onDrop = useCallback(</span>
<span class="cstat-no" title="statement not covered" > (acceptedFiles: File[]) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > acceptedFiles.forEach((file) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > dispatch(uploadDocument(file))</span>
<span class="cstat-no" title="statement not covered" > })</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" > [dispatch]</span>
<span class="cstat-no" title="statement not covered" > )</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > const { getRootProps, getInputProps, isDragActive } = useDropzone({</span>
<span class="cstat-no" title="statement not covered" > onDrop,</span>
<span class="cstat-no" title="statement not covered" > accept: {</span>
<span class="cstat-no" title="statement not covered" > 'application/pdf': ['.pdf'],</span>
<span class="cstat-no" title="statement not covered" > 'image/*': ['.png', '.jpg', '.jpeg', '.tiff'],</span>
<span class="cstat-no" title="statement not covered" > 'text/plain': ['.txt'],</span>
<span class="cstat-no" title="statement not covered" > 'text/markdown': ['.md'],</span>
<span class="cstat-no" title="statement not covered" > 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': ['.docx'],</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" > multiple: true,</span>
<span class="cstat-no" title="statement not covered" > })</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > const getStatusIcon = (status: string) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > switch (status) {</span>
<span class="cstat-no" title="statement not covered" > case 'completed':</span>
<span class="cstat-no" title="statement not covered" > return &lt;CheckCircle color="success" /&gt;</span>
<span class="cstat-no" title="statement not covered" > case 'error':</span>
<span class="cstat-no" title="statement not covered" > return &lt;Error color="error" /&gt;</span>
<span class="cstat-no" title="statement not covered" > case 'processing':</span>
<span class="cstat-no" title="statement not covered" > return &lt;CircularProgress size={20} /&gt;</span>
<span class="cstat-no" title="statement not covered" > default:</span>
<span class="cstat-no" title="statement not covered" > return &lt;HourglassEmpty color="action" /&gt;</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" > }</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > const getStatusColor = (status: string) =&gt; {</span>
<span class="cstat-no" title="statement not covered" > switch (status) {</span>
<span class="cstat-no" title="statement not covered" > case 'completed':</span>
<span class="cstat-no" title="statement not covered" > return 'success'</span>
<span class="cstat-no" title="statement not covered" > case 'error':</span>
<span class="cstat-no" title="statement not covered" > return 'error'</span>
<span class="cstat-no" title="statement not covered" > case 'processing':</span>
<span class="cstat-no" title="statement not covered" > return 'warning'</span>
<span class="cstat-no" title="statement not covered" > default:</span>
<span class="cstat-no" title="statement not covered" > return 'default'</span>
<span class="cstat-no" title="statement not covered" > }</span>
<span class="cstat-no" title="statement not covered" > }</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > return (</span>
<span class="cstat-no" title="statement not covered" > &lt;Layout&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h4" gutterBottom&gt;</span>
Téléversement de documents
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > &lt;Paper</span>
<span class="cstat-no" title="statement not covered" > {...getRootProps()}</span>
<span class="cstat-no" title="statement not covered" > sx={{</span>
<span class="cstat-no" title="statement not covered" > p: 4,</span>
<span class="cstat-no" title="statement not covered" > textAlign: 'center',</span>
<span class="cstat-no" title="statement not covered" > cursor: 'pointer',</span>
<span class="cstat-no" title="statement not covered" > border: '2px dashed',</span>
<span class="cstat-no" title="statement not covered" > borderColor: isDragActive ? 'primary.main' : 'grey.300',</span>
<span class="cstat-no" title="statement not covered" > bgcolor: isDragActive ? 'action.hover' : 'background.paper',</span>
<span class="cstat-no" title="statement not covered" > '&amp;:hover': {</span>
<span class="cstat-no" title="statement not covered" > borderColor: 'primary.main',</span>
<span class="cstat-no" title="statement not covered" > bgcolor: 'action.hover',</span>
<span class="cstat-no" title="statement not covered" > },</span>
<span class="cstat-no" title="statement not covered" > }}</span>
&gt;
<span class="cstat-no" title="statement not covered" > &lt;input {...getInputProps()} /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;CloudUpload sx={{ fontSize: 48, color: 'primary.main', mb: 2 }} /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6" gutterBottom&gt;</span>
<span class="cstat-no" title="statement not covered" > {isDragActive</span>
<span class="cstat-no" title="statement not covered" > ? 'Déposez les fichiers ici...'</span>
<span class="cstat-no" title="statement not covered" > : 'Glissez-déposez vos documents ou cliquez pour sélectionner'}</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="body2" color="text.secondary"&gt;</span>
Formats acceptés: PDF, PNG, JPG, JPEG, TIFF, TXT, MD, DOCX
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Paper&gt;</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > {error &amp;&amp; (</span>
<span class="cstat-no" title="statement not covered" > &lt;Alert severity="error" sx={{ mt: 2 }}&gt;</span>
<span class="cstat-no" title="statement not covered" > {error}</span>
<span class="cstat-no" title="statement not covered" > &lt;/Alert&gt;</span>
)}
&nbsp;
<span class="cstat-no" title="statement not covered" > {documents.length &gt; 0 &amp;&amp; (</span>
<span class="cstat-no" title="statement not covered" > &lt;Box sx={{ mt: 3 }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="h6" gutterBottom&gt;</span>
<span class="cstat-no" title="statement not covered" > Documents téléversés ({documents.length})</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > &lt;Grid container spacing={2}&gt;</span>
<span class="cstat-no" title="statement not covered" > {documents.map((doc, index) =&gt; (</span>
<span class="cstat-no" title="statement not covered" > &lt;Grid size={{ xs: 12, md: 6 }} key={`${doc.id}-${index}`}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Paper sx={{ p: 2 }}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Box display="flex" justifyContent="space-between" alignItems="center" mb={2}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Box display="flex" alignItems="center" gap={1}&gt;</span>
<span class="cstat-no" title="statement not covered" > {getStatusIcon(doc.status)}</span>
<span class="cstat-no" title="statement not covered" > &lt;Typography variant="subtitle1" noWrap&gt;</span>
<span class="cstat-no" title="statement not covered" > {doc.name}</span>
<span class="cstat-no" title="statement not covered" > &lt;/Typography&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Box display="flex" gap={1}&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Button</span>
<span class="cstat-no" title="statement not covered" > size="small"</span>
<span class="cstat-no" title="statement not covered" > startIcon={&lt;Visibility /&gt;}</span>
<span class="cstat-no" title="statement not covered" > onClick={() =&gt; setPreviewDocument(doc)}</span>
<span class="cstat-no" title="statement not covered" > disabled={doc.status !== 'completed'}</span>
<span class="cstat-no" title="statement not covered" > &gt;</span>
Aperçu
<span class="cstat-no" title="statement not covered" > &lt;/Button&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
&nbsp;
<span class="cstat-no" title="statement not covered" > &lt;Box display="flex" gap={1} flexWrap="wrap"&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Chip</span>
<span class="cstat-no" title="statement not covered" > label={doc.type}</span>
<span class="cstat-no" title="statement not covered" > size="small"</span>
<span class="cstat-no" title="statement not covered" > variant="outlined"</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Chip</span>
<span class="cstat-no" title="statement not covered" > label={doc.status}</span>
<span class="cstat-no" title="statement not covered" > size="small"</span>
<span class="cstat-no" title="statement not covered" > color={getStatusColor(doc.status) as 'success' | 'error' | 'warning' | 'default'}</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;Chip</span>
<span class="cstat-no" title="statement not covered" > label={`${(doc.size / 1024 / 1024).toFixed(2)} MB`}</span>
<span class="cstat-no" title="statement not covered" > size="small"</span>
<span class="cstat-no" title="statement not covered" > variant="outlined"</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Paper&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Grid&gt;</span>
<span class="cstat-no" title="statement not covered" > ))}</span>
<span class="cstat-no" title="statement not covered" > &lt;/Grid&gt;</span>
<span class="cstat-no" title="statement not covered" > &lt;/Box&gt;</span>
)}
&nbsp;
{/* Aperçu du document */}
<span class="cstat-no" title="statement not covered" > {previewDocument &amp;&amp; (</span>
<span class="cstat-no" title="statement not covered" > &lt;FilePreview</span>
<span class="cstat-no" title="statement not covered" > document={previewDocument}</span>
<span class="cstat-no" title="statement not covered" > onClose={() =&gt; setPreviewDocument(null)}</span>
<span class="cstat-no" title="statement not covered" > /&gt;</span>
)}
<span class="cstat-no" title="statement not covered" > &lt;/Layout&gt;</span>
)
<span class="cstat-no" title="statement not covered" >}</span>
&nbsp;</pre></td></tr></table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2025-09-11T09:40:00.754Z
</div>
<script src="../../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../../sorter.js"></script>
<script src="../../../block-navigation.js"></script>
</body>
</html>

View File

@ -0,0 +1,176 @@
<!doctype html>
<html lang="en">
<head>
<title>Code coverage report for 4NK_IA_front/src/views</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../../prettify.css" />
<link rel="stylesheet" href="../../../base.css" />
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1><a href="../../../index.html">All files</a> 4NK_IA_front/src/views</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Statements</span>
<span class='fraction'>0/978</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/5</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/5</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Lines</span>
<span class='fraction'>0/978</span>
</div>
</div>
<p class="quiet">
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
</p>
<template id="filterTemplate">
<div class="quiet">
Filter:
<input type="search" id="fileSearch">
</div>
</template>
</div>
<div class='status-line low'></div>
<div class="pad1">
<table class="coverage-summary">
<thead>
<tr>
<th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
<th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
<th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
<th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
<th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
<th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
<th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
<th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
</tr>
</thead>
<tbody><tr>
<td class="file low" data-value="AnalyseView.tsx"><a href="AnalyseView.tsx.html">AnalyseView.tsx</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="191" class="abs low">0/191</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="191" class="abs low">0/191</td>
</tr>
<tr>
<td class="file low" data-value="ConseilView.tsx"><a href="ConseilView.tsx.html">ConseilView.tsx</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="187" class="abs low">0/187</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="187" class="abs low">0/187</td>
</tr>
<tr>
<td class="file low" data-value="ContexteView.tsx"><a href="ContexteView.tsx.html">ContexteView.tsx</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="228" class="abs low">0/228</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="228" class="abs low">0/228</td>
</tr>
<tr>
<td class="file low" data-value="ExtractionView.tsx"><a href="ExtractionView.tsx.html">ExtractionView.tsx</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="230" class="abs low">0/230</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="230" class="abs low">0/230</td>
</tr>
<tr>
<td class="file low" data-value="UploadView.tsx"><a href="UploadView.tsx.html">UploadView.tsx</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="142" class="abs low">0/142</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="142" class="abs low">0/142</td>
</tr>
</tbody>
</table>
</div>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2025-09-11T09:40:00.754Z
</div>
<script src="../../../prettify.js"></script>
<script>
window.onload = function () {
prettyPrint();
};
</script>
<script src="../../../sorter.js"></script>
<script src="../../../block-navigation.js"></script>
</body>
</html>

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -25,28 +25,28 @@
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">0% </span> <span class="strong">0% </span>
<span class="quiet">Statements</span> <span class="quiet">Statements</span>
<span class='fraction'>0/36</span> <span class='fraction'>0/1753</span>
</div> </div>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">0% </span> <span class="strong">5.55% </span>
<span class="quiet">Branches</span> <span class="quiet">Branches</span>
<span class='fraction'>0/2</span> <span class='fraction'>1/18</span>
</div> </div>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">0% </span> <span class="strong">5.55% </span>
<span class="quiet">Functions</span> <span class="quiet">Functions</span>
<span class='fraction'>0/2</span> <span class='fraction'>1/18</span>
</div> </div>
<div class='fl pad1y space-right2'> <div class='fl pad1y space-right2'>
<span class="strong">0% </span> <span class="strong">0% </span>
<span class="quiet">Lines</span> <span class="quiet">Lines</span>
<span class='fraction'>0/36</span> <span class='fraction'>0/1753</span>
</div> </div>
@ -79,33 +79,138 @@
</tr> </tr>
</thead> </thead>
<tbody><tr> <tbody><tr>
<td class="file low" data-value="App.tsx"><a href="App.tsx.html">App.tsx</a></td> <td class="file low" data-value="4NK_IA_front"><a href="4NK_IA_front/index.html">4NK_IA_front</a></td>
<td data-value="0" class="pic low"> <td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div> <div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td> </td>
<td data-value="0" class="pct low">0%</td> <td data-value="0" class="pct low">0%</td>
<td data-value="27" class="abs low">0/27</td> <td data-value="57" class="abs low">0/57</td>
<td data-value="0" class="pct low">0%</td> <td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td> <td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td> <td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td> <td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td> <td data-value="0" class="pct low">0%</td>
<td data-value="27" class="abs low">0/27</td> <td data-value="57" class="abs low">0/57</td>
</tr> </tr>
<tr> <tr>
<td class="file low" data-value="main.tsx"><a href="main.tsx.html">main.tsx</a></td> <td class="file low" data-value="4NK_IA_front/src"><a href="4NK_IA_front/src/index.html">4NK_IA_front/src</a></td>
<td data-value="0" class="pic low"> <td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div> <div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td> </td>
<td data-value="0" class="pct low">0%</td> <td data-value="0" class="pct low">0%</td>
<td data-value="9" class="abs low">0/9</td> <td data-value="24" class="abs low">0/24</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="2" class="abs low">0/2</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="2" class="abs low">0/2</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="24" class="abs low">0/24</td>
</tr>
<tr>
<td class="file low" data-value="4NK_IA_front/src/components"><a href="4NK_IA_front/src/components/index.html">4NK_IA_front/src/components</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="227" class="abs low">0/227</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="3" class="abs low">0/3</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="3" class="abs low">0/3</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="227" class="abs low">0/227</td>
</tr>
<tr>
<td class="file low" data-value="4NK_IA_front/src/router"><a href="4NK_IA_front/src/router/index.html">4NK_IA_front/src/router</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="23" class="abs low">0/23</td>
<td data-value="0" class="pct low">0%</td> <td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td> <td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td> <td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td> <td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td> <td data-value="0" class="pct low">0%</td>
<td data-value="9" class="abs low">0/9</td> <td data-value="23" class="abs low">0/23</td>
</tr>
<tr>
<td class="file low" data-value="4NK_IA_front/src/services"><a href="4NK_IA_front/src/services/index.html">4NK_IA_front/src/services</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="266" class="abs low">0/266</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="266" class="abs low">0/266</td>
</tr>
<tr>
<td class="file low" data-value="4NK_IA_front/src/store"><a href="4NK_IA_front/src/store/index.html">4NK_IA_front/src/store</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="114" class="abs low">0/114</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="3" class="abs low">0/3</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="3" class="abs low">0/3</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="114" class="abs low">0/114</td>
</tr>
<tr>
<td class="file low" data-value="4NK_IA_front/src/theme"><a href="4NK_IA_front/src/theme/index.html">4NK_IA_front/src/theme</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="64" class="abs low">0/64</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="1" class="abs low">0/1</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="64" class="abs low">0/64</td>
</tr>
<tr>
<td class="file empty" data-value="4NK_IA_front/src/types"><a href="4NK_IA_front/src/types/index.html">4NK_IA_front/src/types</a></td>
<td data-value="0" class="pic empty">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct empty">0%</td>
<td data-value="0" class="abs empty">0/0</td>
<td data-value="0" class="pct empty">0%</td>
<td data-value="1" class="abs empty">1/1</td>
<td data-value="0" class="pct empty">0%</td>
<td data-value="1" class="abs empty">1/1</td>
<td data-value="0" class="pct empty">0%</td>
<td data-value="0" class="abs empty">0/0</td>
</tr>
<tr>
<td class="file low" data-value="4NK_IA_front/src/views"><a href="4NK_IA_front/src/views/index.html">4NK_IA_front/src/views</a></td>
<td data-value="0" class="pic low">
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="978" class="abs low">0/978</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="5" class="abs low">0/5</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="5" class="abs low">0/5</td>
<td data-value="0" class="pct low">0%</td>
<td data-value="978" class="abs low">0/978</td>
</tr> </tr>
</tbody> </tbody>
@ -116,7 +221,7 @@
<div class='footer quiet pad2 space-top1 center small'> <div class='footer quiet pad2 space-top1 center small'>
Code coverage generated by Code coverage generated by
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2025-09-10T15:15:07.789Z at 2025-09-11T09:40:00.754Z
</div> </div>
<script src="prettify.js"></script> <script src="prettify.js"></script>
<script> <script>

View File

@ -6,7 +6,7 @@ import tseslint from 'typescript-eslint'
import { globalIgnores } from 'eslint/config' import { globalIgnores } from 'eslint/config'
export default tseslint.config([ export default tseslint.config([
globalIgnores(['dist']), globalIgnores(['dist', 'coverage']),
{ {
files: ['**/*.{ts,tsx}'], files: ['**/*.{ts,tsx}'],
extends: [ extends: [

4
package-lock.json generated
View File

@ -1,12 +1,12 @@
{ {
"name": "4nk-ia-front4nk", "name": "4nk-ia-front4nk",
"version": "0.1.0", "version": "0.1.1",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "4nk-ia-front4nk", "name": "4nk-ia-front4nk",
"version": "0.1.0", "version": "0.1.1",
"dependencies": { "dependencies": {
"@emotion/react": "^11.14.0", "@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.1", "@emotion/styled": "^11.14.1",

View File

@ -1,7 +1,7 @@
{ {
"name": "4nk-ia-front4nk", "name": "4nk-ia-front4nk",
"private": true, "private": true,
"version": "0.1.0", "version": "0.1.1",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",

View File

@ -52,7 +52,7 @@ export const FilePreview: React.FC<FilePreviewProps> = ({ document, onClose }) =
const handleDownload = () => { const handleDownload = () => {
if (document.previewUrl) { if (document.previewUrl) {
const link = document.createElement('a') const link = window.document.createElement('a')
link.href = document.previewUrl link.href = document.previewUrl
link.download = document.name link.download = document.name
link.click() link.click()

View File

@ -105,7 +105,7 @@ export const documentApi = {
postalCode: "75001", postalCode: "75001",
country: "France" country: "France"
})) || [], })) || [],
properties: results.entities?.properties?.map((prop: string, index: number) => ({ properties: results.entities?.properties?.map((_propertyName: string, index: number) => ({
id: `prop-${index}`, id: `prop-${index}`,
type: "apartment" as const, type: "apartment" as const,
address: { address: {
@ -129,7 +129,7 @@ export const documentApi = {
signatures: results.entities?.persons || [], signatures: results.entities?.persons || [],
confidence: results.verification_score || 0.85 confidence: results.verification_score || 0.85
} }
} catch (error) { } catch {
// Données de démonstration // Données de démonstration
return { return {
documentId, documentId,
@ -191,7 +191,7 @@ export const documentApi = {
try { try {
const { data } = await apiClient.get<AnalysisResult>(`/api/documents/${documentId}/analyze`) const { data } = await apiClient.get<AnalysisResult>(`/api/documents/${documentId}/analyze`)
return data return data
} catch (error) { } catch {
// Données de démonstration // Données de démonstration
return { return {
documentId, documentId,
@ -213,7 +213,7 @@ export const documentApi = {
try { try {
const { data } = await apiClient.get<ContextResult>(`/api/documents/${documentId}/context`) const { data } = await apiClient.get<ContextResult>(`/api/documents/${documentId}/context`)
return data return data
} catch (error) { } catch {
// Données de démonstration // Données de démonstration
return { return {
documentId, documentId,
@ -232,7 +232,7 @@ export const documentApi = {
try { try {
const { data } = await apiClient.get<ConseilResult>(`/api/documents/${documentId}/conseil`) const { data } = await apiClient.get<ConseilResult>(`/api/documents/${documentId}/conseil`)
return data return data
} catch (error) { } catch {
// Données de démonstration // Données de démonstration
return { return {
documentId, documentId,

View File

@ -78,11 +78,11 @@ export interface AnalysisResult {
export interface ContextResult { export interface ContextResult {
documentId: string documentId: string
cadastreData?: any cadastreData?: Record<string, unknown>
georisquesData?: any georisquesData?: Record<string, unknown>
geofoncierData?: any geofoncierData?: Record<string, unknown>
bodaccData?: any bodaccData?: Record<string, unknown>
infogreffeData?: any infogreffeData?: Record<string, unknown>
lastUpdated: Date lastUpdated: Date
} }

View File

@ -22,6 +22,7 @@ import {
Assessment, Assessment,
Info, Info,
} from '@mui/icons-material' } from '@mui/icons-material'
import type { ChipProps, LinearProgressProps } from '@mui/material'
import { useAppDispatch, useAppSelector } from '../store' import { useAppDispatch, useAppSelector } from '../store'
import { analyzeDocument } from '../store/documentSlice' import { analyzeDocument } from '../store/documentSlice'
import { Layout } from '../components/Layout' import { Layout } from '../components/Layout'
@ -69,7 +70,7 @@ export default function AnalyseView() {
) )
} }
const getScoreColor = (score: number) => { const getScoreColor = (score: number): ChipProps['color'] => {
if (score >= 0.8) return 'success' if (score >= 0.8) return 'success'
if (score >= 0.6) return 'warning' if (score >= 0.6) return 'warning'
return 'error' return 'error'
@ -97,7 +98,7 @@ export default function AnalyseView() {
<Chip <Chip
icon={<Assessment />} icon={<Assessment />}
label={`Score de vraisemblance: ${(analysisResult.credibilityScore * 100).toFixed(1)}%`} label={`Score de vraisemblance: ${(analysisResult.credibilityScore * 100).toFixed(1)}%`}
color={getScoreColor(analysisResult.credibilityScore) as any} color={getScoreColor(analysisResult.credibilityScore)}
variant="filled" variant="filled"
/> />
<Chip <Chip
@ -201,7 +202,7 @@ export default function AnalyseView() {
<LinearProgress <LinearProgress
variant="determinate" variant="determinate"
value={analysisResult.credibilityScore * 100} value={analysisResult.credibilityScore * 100}
color={getScoreColor(analysisResult.credibilityScore) as any} color={getScoreColor(analysisResult.credibilityScore) as LinearProgressProps['color']}
sx={{ height: 10, borderRadius: 5 }} sx={{ height: 10, borderRadius: 5 }}
/> />
<Typography variant="body2" color="text.secondary" sx={{ mt: 1 }}> <Typography variant="body2" color="text.secondary" sx={{ mt: 1 }}>

View File

@ -22,6 +22,7 @@ import {
Schedule, Schedule,
Psychology, Psychology,
} from '@mui/icons-material' } from '@mui/icons-material'
import type { SvgIconProps } from '@mui/material'
import { useAppDispatch, useAppSelector } from '../store' import { useAppDispatch, useAppSelector } from '../store'
import { getConseil } from '../store/documentSlice' import { getConseil } from '../store/documentSlice'
import { Layout } from '../components/Layout' import { Layout } from '../components/Layout'
@ -69,7 +70,7 @@ export default function ConseilView() {
) )
} }
const getRiskColor = (risk: string) => { const getRiskColor = (risk: string): SvgIconProps['color'] => {
if (risk.toLowerCase().includes('élevé') || risk.toLowerCase().includes('critique')) { if (risk.toLowerCase().includes('élevé') || risk.toLowerCase().includes('critique')) {
return 'error' return 'error'
} }
@ -147,7 +148,7 @@ export default function ConseilView() {
{conseilResult.risks.map((risk, index) => ( {conseilResult.risks.map((risk, index) => (
<ListItem key={index}> <ListItem key={index}>
<ListItemIcon> <ListItemIcon>
<Warning color={getRiskColor(risk) as any} /> <Warning color={getRiskColor(risk)} />
</ListItemIcon> </ListItemIcon>
<ListItemText <ListItemText
primary={risk} primary={risk}

View File

@ -23,6 +23,7 @@ import {
Business, Business,
Home, Home,
} from '@mui/icons-material' } from '@mui/icons-material'
import type { ChipProps } from '@mui/material'
import { useAppDispatch, useAppSelector } from '../store' import { useAppDispatch, useAppSelector } from '../store'
import { getContextData } from '../store/documentSlice' import { getContextData } from '../store/documentSlice'
import { Layout } from '../components/Layout' import { Layout } from '../components/Layout'
@ -74,7 +75,7 @@ export default function ContexteView() {
return hasData ? <CheckCircle color="success" /> : <Error color="error" /> return hasData ? <CheckCircle color="success" /> : <Error color="error" />
} }
const getStatusColor = (hasData: boolean) => { const getStatusColor = (hasData: boolean): ChipProps['color'] => {
return hasData ? 'success' : 'error' return hasData ? 'success' : 'error'
} }
@ -94,31 +95,31 @@ export default function ContexteView() {
<Chip <Chip
icon={getStatusIcon(!!contextResult.cadastreData)} icon={getStatusIcon(!!contextResult.cadastreData)}
label="Cadastre" label="Cadastre"
color={getStatusColor(!!contextResult.cadastreData) as any} color={getStatusColor(!!contextResult.cadastreData)}
variant="outlined" variant="outlined"
/> />
<Chip <Chip
icon={getStatusIcon(!!contextResult.georisquesData)} icon={getStatusIcon(!!contextResult.georisquesData)}
label="Géorisques" label="Géorisques"
color={getStatusColor(!!contextResult.georisquesData) as any} color={getStatusColor(!!contextResult.georisquesData)}
variant="outlined" variant="outlined"
/> />
<Chip <Chip
icon={getStatusIcon(!!contextResult.geofoncierData)} icon={getStatusIcon(!!contextResult.geofoncierData)}
label="Géofoncier" label="Géofoncier"
color={getStatusColor(!!contextResult.geofoncierData) as any} color={getStatusColor(!!contextResult.geofoncierData)}
variant="outlined" variant="outlined"
/> />
<Chip <Chip
icon={getStatusIcon(!!contextResult.bodaccData)} icon={getStatusIcon(!!contextResult.bodaccData)}
label="BODACC" label="BODACC"
color={getStatusColor(!!contextResult.bodaccData) as any} color={getStatusColor(!!contextResult.bodaccData)}
variant="outlined" variant="outlined"
/> />
<Chip <Chip
icon={getStatusIcon(!!contextResult.infogreffeData)} icon={getStatusIcon(!!contextResult.infogreffeData)}
label="Infogreffe" label="Infogreffe"
color={getStatusColor(!!contextResult.infogreffeData) as any} color={getStatusColor(!!contextResult.infogreffeData)}
variant="outlined" variant="outlined"
/> />
</Box> </Box>
@ -135,7 +136,7 @@ export default function ContexteView() {
<Typography variant="h6">Données cadastrales</Typography> <Typography variant="h6">Données cadastrales</Typography>
<Chip <Chip
label={contextResult.cadastreData ? 'Disponible' : 'Non disponible'} label={contextResult.cadastreData ? 'Disponible' : 'Non disponible'}
color={getStatusColor(!!contextResult.cadastreData) as any} color={getStatusColor(!!contextResult.cadastreData)}
size="small" size="small"
sx={{ ml: 2 }} sx={{ ml: 2 }}
/> />
@ -164,7 +165,7 @@ export default function ContexteView() {
<Typography variant="h6">Données Géorisques</Typography> <Typography variant="h6">Données Géorisques</Typography>
<Chip <Chip
label={contextResult.georisquesData ? 'Disponible' : 'Non disponible'} label={contextResult.georisquesData ? 'Disponible' : 'Non disponible'}
color={getStatusColor(!!contextResult.georisquesData) as any} color={getStatusColor(!!contextResult.georisquesData)}
size="small" size="small"
sx={{ ml: 2 }} sx={{ ml: 2 }}
/> />
@ -193,7 +194,7 @@ export default function ContexteView() {
<Typography variant="h6">Données Géofoncier</Typography> <Typography variant="h6">Données Géofoncier</Typography>
<Chip <Chip
label={contextResult.geofoncierData ? 'Disponible' : 'Non disponible'} label={contextResult.geofoncierData ? 'Disponible' : 'Non disponible'}
color={getStatusColor(!!contextResult.geofoncierData) as any} color={getStatusColor(!!contextResult.geofoncierData)}
size="small" size="small"
sx={{ ml: 2 }} sx={{ ml: 2 }}
/> />
@ -222,7 +223,7 @@ export default function ContexteView() {
<Typography variant="h6">Données BODACC</Typography> <Typography variant="h6">Données BODACC</Typography>
<Chip <Chip
label={contextResult.bodaccData ? 'Disponible' : 'Non disponible'} label={contextResult.bodaccData ? 'Disponible' : 'Non disponible'}
color={getStatusColor(!!contextResult.bodaccData) as any} color={getStatusColor(!!contextResult.bodaccData)}
size="small" size="small"
sx={{ ml: 2 }} sx={{ ml: 2 }}
/> />
@ -251,7 +252,7 @@ export default function ContexteView() {
<Typography variant="h6">Données Infogreffe</Typography> <Typography variant="h6">Données Infogreffe</Typography>
<Chip <Chip
label={contextResult.infogreffeData ? 'Disponible' : 'Non disponible'} label={contextResult.infogreffeData ? 'Disponible' : 'Non disponible'}
color={getStatusColor(!!contextResult.infogreffeData) as any} color={getStatusColor(!!contextResult.infogreffeData)}
size="small" size="small"
sx={{ ml: 2 }} sx={{ ml: 2 }}
/> />

View File

@ -1,19 +1,6 @@
import { useCallback, useState } from 'react' import { useCallback, useState } from 'react'
import { useDropzone } from 'react-dropzone' import { useDropzone } from 'react-dropzone'
import { import { Box, Typography, Paper, CircularProgress, Alert, Button, Chip, Grid } from '@mui/material'
Box,
Typography,
Paper,
List,
ListItem,
ListItemText,
ListItemIcon,
CircularProgress,
Alert,
Button,
Chip,
Grid,
} from '@mui/material'
import { import {
CloudUpload, CloudUpload,
CheckCircle, CheckCircle,
@ -22,7 +9,7 @@ import {
Visibility, Visibility,
} from '@mui/icons-material' } from '@mui/icons-material'
import { useAppDispatch, useAppSelector } from '../store' import { useAppDispatch, useAppSelector } from '../store'
import { uploadDocument, setCurrentDocument } from '../store/documentSlice' import { uploadDocument } from '../store/documentSlice'
import { Layout } from '../components/Layout' import { Layout } from '../components/Layout'
import { FilePreview } from '../components/FilePreview' import { FilePreview } from '../components/FilePreview'
import type { Document } from '../types' import type { Document } from '../types'
@ -156,7 +143,7 @@ export default function UploadView() {
<Chip <Chip
label={doc.status} label={doc.status}
size="small" size="small"
color={getStatusColor(doc.status) as any} color={getStatusColor(doc.status) as 'success' | 'error' | 'warning' | 'default'}
/> />
<Chip <Chip
label={`${(doc.size / 1024 / 1024).toFixed(2)} MB`} label={`${(doc.size / 1024 / 1024).toFixed(2)} MB`}

View File

@ -1,25 +1,30 @@
# Acte de Vente Immobilière # Acte de Vente Immobilière
## Informations générales ## Informations générales
- **Type** : Acte de vente - **Type** : Acte de vente
- **Date** : 15 janvier 2024 - **Date** : 15 janvier 2024
- **Lieu** : Paris - **Lieu** : Paris
## Parties contractantes ## Parties contractantes
- **Vendeur** : Jean Dupont - **Vendeur** : Jean Dupont
- **Acheteur** : Marie Martin - **Acheteur** : Marie Martin
## Objet de la vente ## Objet de la vente
- **Bien** : Appartement - **Bien** : Appartement
- **Adresse** : 123 Rue de la Paix, 75001 Paris - **Adresse** : 123 Rue de la Paix, 75001 Paris
- **Surface** : 75 m² - **Surface** : 75 m²
- **Prix** : 250 000 € - **Prix** : 250 000 €
## Clauses particulières ## Clauses particulières
1. Clause de garantie des vices cachés 1. Clause de garantie des vices cachés
2. Clause de condition suspensive 2. Clause de condition suspensive
3. Clause de garantie d'éviction 3. Clause de garantie d'éviction
## Signatures ## Signatures
- Jean Dupont : [Signature] - Jean Dupont : [Signature]
- Marie Martin : [Signature] - Marie Martin : [Signature]