Files

83 lines
3.4 KiB
Plaintext
Raw Permalink Normal View History

<result-list>
2026-04-02 14:15:26 +02:00
<!--
==========================================================================
COMPOSANT <result-list>
RÔLE : afficher la liste des formations retournées par l'API sous forme de cartes.
PROPS reçues depuis <app> :
- results : tableau de formations (objets creerFormation)
- hasSearched: boolean → true si l'utilisateur a lancé au moins une recherche
- loading : boolean → true pendant un appel API
- ondetail : callback(index) → ouvrir la fiche détail de la formation
- onselect : callback(index) → ajouter la formation au comparateur
Ce composant est "passif" : il ne fait aucun appel API, il affiche
uniquement les données transmises par le parent.
==========================================================================
-->
<div class="results">
2026-03-21 13:47:09 +01:00
2026-04-02 14:15:26 +02:00
<!-- Message "aucun résultat" : affiché si la recherche est terminée et vide -->
<div class="message" if={ props.results.length === 0 && props.hasSearched && !props.loading }>
Aucun résultat trouvé
</div>
2026-04-02 14:15:26 +02:00
<!-- Message de chargement : affiché pendant l'appel API -->
<div class="message" if={ props.loading }>
Chargement...
</div>
2026-04-02 14:15:26 +02:00
<!-- Boucle sur les formations : "each" est la directive de boucle de Riot -->
<!-- key={ formation.id } permet à Riot d'optimiser le rendu (évite les re-rendus inutiles) -->
2026-03-21 13:47:09 +01:00
<div each={ (formation, index) in props.results } key={ formation.id } class="card">
<h3>{ formation.nom }</h3>
<p><b>Établissement :</b> { formation.etablissement }</p>
<p><b>Ville :</b> { formation.ville } ({ formation.departement })</p>
<p><b>Filière :</b> { formation.filiere }</p>
<p><b>Taux d'accès :</b> { formation.tauxAcces }%</p>
2026-04-02 14:15:26 +02:00
<!-- bind(this, index) : passe l'index en argument au handler sans créer de closure -->
2026-03-21 13:47:09 +01:00
<button onclick={ afficherDetail.bind(this, index) }>Voir détail</button>
<button onclick={ ajouterALaSelection.bind(this, index) }>Ajouter à la sélection</button>
2026-04-02 14:15:26 +02:00
<!-- Bouton "Localiser" : affiché uniquement si la formation a des coordonnées GPS -->
2026-03-21 13:47:09 +01:00
<button onclick={ localiserSurCarte.bind(this, formation) } if={ formation.latitude != null }>Localiser</button>
</div>
2026-03-21 13:47:09 +01:00
</div>
2026-03-20 01:51:08 +01:00
<script>
export default {
2026-03-21 13:47:09 +01:00
2026-04-02 14:15:26 +02:00
// Demande au parent d'afficher la vue détail pour la formation à cet index
2026-03-21 13:47:09 +01:00
afficherDetail(index) {
2026-03-30 16:33:11 +02:00
this.props.ondetail(index);
2026-03-21 13:47:09 +01:00
},
2026-04-02 14:15:26 +02:00
// Demande au parent d'ajouter la formation à la sélection du comparateur
2026-03-21 13:47:09 +01:00
ajouterALaSelection(index) {
2026-03-30 16:33:11 +02:00
this.props.onselect(index);
2026-03-21 13:47:09 +01:00
},
2026-04-02 14:15:26 +02:00
// ========================================================================
// localiserSurCarte(formation)
// RÔLE : centrer la carte Leaflet sur cette formation.
//
// Communication avec <map-view> via window.mapFocus :
// Les composants Riot ne peuvent pas communiquer directement entre eux
// (ils ne sont pas parent/enfant ici). On utilise donc une fonction globale
// window.mapFocus définie par <map-view> dans son onMounted.
// ========================================================================
2026-03-21 13:47:09 +01:00
localiserSurCarte(formation) {
2026-03-20 01:51:08 +01:00
if (window.mapFocus) {
2026-04-02 14:15:26 +02:00
window.mapFocus(formation.id); // <map-view> centre la carte sur ce marqueur
2026-03-20 01:51:08 +01:00
}
}
2026-03-21 13:47:09 +01:00
2026-03-30 16:33:11 +02:00
};
2026-03-20 01:51:08 +01:00
</script>
2026-03-21 13:47:09 +01:00
2026-03-20 01:51:08 +01:00
</result-list>