2026-03-18 12:49:28 +01:00
|
|
|
<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.
|
|
|
|
|
==========================================================================
|
|
|
|
|
-->
|
|
|
|
|
|
2026-03-18 13:21:19 +01:00
|
|
|
<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 -->
|
2026-03-18 13:21:19 +01:00
|
|
|
<div class="message" if={ props.results.length === 0 && props.hasSearched && !props.loading }>
|
2026-03-18 12:49:28 +01:00
|
|
|
Aucun résultat trouvé
|
|
|
|
|
</div>
|
|
|
|
|
|
2026-04-02 14:15:26 +02:00
|
|
|
<!-- Message de chargement : affiché pendant l'appel API -->
|
2026-03-18 13:21:19 +01:00
|
|
|
<div class="message" if={ props.loading }>
|
2026-03-18 12:49:28 +01:00
|
|
|
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-03-18 13:54:33 +01:00
|
|
|
|
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>
|
2026-03-18 12:49:28 +01:00
|
|
|
</div>
|
2026-03-21 13:47:09 +01:00
|
|
|
|
2026-03-18 12:49:28 +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>
|