Amélioration de l'affichage des titres d'épisodes¶
Issue associée: #29 - Corriger les titres dans la liste déroulante de selection des episodes
Problème résolu¶
L'affichage des titres d'épisodes dans la liste déroulante de sélection n'était pas optimal :
- Format numérique de la date : 24/08/2025 au lieu de 24 août 2025
- Affichage du type [livres] non désiré
- Utilisation du titre original au lieu du titre corrigé par l'utilisateur
- Absence de mise à jour dynamique lors de la modification des titres
Solution implémentée¶
1. Nouveau format d'affichage¶
Avant : 24/08/2025 [livres] - Titre original
Après : 24 août 2025 - Titre corrigé par l'utilisateur
2. Correction critique backend¶
Problème découvert : L'API backend ne transmettait pas le champ titre_corrige dans la méthode to_summary_dict(), causant l'affichage des titres originaux malgré les corrections frontend.
Solution : Modification du modèle Episode pour inclure titre_corrige dans les données de résumé :
def to_summary_dict(self) -> dict[str, Any]:
return {
"id": self.id,
"titre": self.titre,
"titre_corrige": self.titre_corrige, # AJOUT CRITIQUE
"date": self.date.isoformat() if self.date else None,
"type": self.type,
}
3. Composants modifiés¶
EpisodeSelector.vue¶
- Méthode
formatEpisodeOption(): Mise à jour du format d'affichage - Méthode
formatDateLitteraire(): Nouvelle méthode pour formater les dates au format littéraire français - Méthode
refreshEpisodesList(): Nouvelle méthode publique pour permettre le rechargement de la liste
formatEpisodeOption(episode) {
const date = episode.date ? this.formatDateLitteraire(episode.date) : 'Date inconnue';
const titre = episode.titre_corrige || episode.titre;
return `${date} - ${titre}`;
}
formatDateLitteraire(dateStr) {
const date = new Date(dateStr);
const options = {
day: 'numeric',
month: 'long',
year: 'numeric'
};
return date.toLocaleDateString('fr-FR', options);
}
EpisodeEditor.vue¶
- Nouvel événement
title-updated: Émis lors de la sauvegarde réussie d'un titre - Section
emits: Ajout de la déclaration de l'événement
// Dans la méthode saveTitle() après succès
this.$emit('title-updated', {
episodeId: this.episode.id,
newTitle: this.correctedTitle
});
HomePage.vue¶
- Réference
episodeSelector: Ajout d'une ref pour accéder au composant EpisodeSelector - Méthode
onTitleUpdated(): Gestion de l'événement de mise à jour de titre - Écoute de l'événement :
@title-updated="onTitleUpdated"
async onTitleUpdated(data) {
// Recharger la liste des épisodes dans le sélecteur
if (this.$refs.episodeSelector) {
await this.$refs.episodeSelector.refreshEpisodesList();
}
}
4. Tests ajoutés¶
Tests Backend (Episode Model)¶
- Nouveau test critique :
test_episode_to_summary_dict_with_titre_corrige()danstests/test_models_validation.py - Vérification que
titre_corrigeest inclus dansto_summary_dict() - Mise à jour des tests existants pour valider le nouveau champ
- Test de régression : Empêche la répétition du bug où
titre_corrigeétait absent
Tests Frontend (EpisodeSelector)¶
- Test du nouveau format d'affichage avec date littéraire
- Test de l'utilisation du titre corrigé vs titre original
- Mise à jour des tests existants pour le nouveau format
Test Frontend (HomePage)¶
- Test de la mise à jour dynamique lors de la modification d'un titre
- Vérification que
refreshEpisodesList()est appelé correctement
5. Flux de mise à jour dynamique¶
1. Utilisateur modifie un titre dans EpisodeEditor
2. EpisodeEditor.saveTitle() sauvegarde via API
3. Émission de l'événement 'title-updated' → HomePage
4. HomePage.onTitleUpdated() appelle refreshEpisodesList() → EpisodeSelector
5. EpisodeSelector recharge la liste avec les titres mis à jour
6. L'utilisateur voit immédiatement le changement dans la liste déroulante
Impact utilisateur¶
Avant¶
- Date difficile à lire :
15/01/2024 - Type superflu :
[livres] - Titre original même si corrigé
- Pas de mise à jour après modification
Après¶
- Date lisible :
15 janvier 2024 - Pas d'encombrement visuel
- Titre corrigé affiché en priorité
- Mise à jour immédiate et automatique
Exemple concret¶
Format demandé : 24 août 2025 - Justine Lévy, Antoine Wauters, Alice Ferney, Percival Everett, Anthony Passeron à la page ;)
Données :
{
"id": "...",
"date": "2025-08-24T09:00:00Z",
"type": "livres",
"titre": "Episode automatiquement transcrit...",
"titre_corrige": "Justine Lévy, Antoine Wauters, Alice Ferney, Percival Everett, Anthony Passeron à la page ;)"
}
Résultat : 24 août 2025 - Justine Lévy, Antoine Wauters, Alice Ferney, Percival Everett, Anthony Passeron à la page ;)
Compatibilité¶
- ✅ Backward compatible : Fonctionne avec les épisodes sans
titre_corrige - ✅ Fallback graceful : Utilise le titre original si pas de titre corrigé
- ✅ Gestion des dates invalides : Affiche "Date inconnue"
- ✅ Tests existants préservés : Pas de régression détectée
Performance¶
- Impact minimal : Une seule requête API supplémentaire lors de la mise à jour d'un titre
- Optimisation : Le rechargement se fait seulement lors des modifications, pas en continu
- Réactivité : Mise à jour immédiate visible par l'utilisateur
- Test Coverage : Couverture totale avec 165 tests (117 backend + 48 frontend)
Maintenance¶
- Code lisible et documenté
- Séparation des responsabilités respectée
- Tests complets couvrant tous les cas d'usage
- Événements Vue.js standards pour la communication inter-composants