// Tableau global JavaScript pour stocker les données let indicesData = []; function chargerDonnees() { fetch("./php/api_indices.php") .then((response) => response.json()) .then((result) => { if (result.status === "success") { indicesData = result.data; // Mise à jour de l'affichage afficherSyntheseCartes(); afficherTableauDetails(); alimenterBandeauxTicker(); // Mise à jour du statut document.getElementById("statut").innerText = `Dernière mise à jour : ${new Date().toLocaleTimeString()}`; document.getElementById("counter").innerText = `${indicesData.length} enregistrements`; } else { console.error("Erreur API :", result.message); } }) .catch((error) => console.error("Erreur réseau :", error)); } function afficherSyntheseCartes() { const container = document.getElementById("cards-container"); container.innerHTML = ""; const indicesUniques = [...new Set(indicesData.map((item) => item.indice))]; indicesUniques.forEach((nomIndice) => { const dernier = indicesData.find((item) => item.indice === nomIndice); if (!dernier) return; const isPositive = parseFloat(dernier.variation_pct) >= 0; const badgeColor = isPositive ? "bg-emerald-500/10 text-emerald-400 border-emerald-500/20" : "bg-rose-500/10 text-rose-400 border-rose-500/20"; const sign = isPositive ? "+" : ""; container.innerHTML += `
${dernier.indice} ${sign}${parseFloat(dernier.variation_pct).toFixed(2)}%

${dernier.nom || dernier.indice}

${parseFloat(dernier.cours).toLocaleString("fr-FR")} ${dernier.date_cours}
`; }); } function afficherTableauDetails() { const tbody = document.getElementById("table-body"); tbody.innerHTML = ""; if (indicesData.length === 0) { tbody.innerHTML = `Aucune donnée disponible`; return; } indicesData.forEach((row) => { const isPositive = parseFloat(row.variation_pct) >= 0; const textColor = isPositive ? "text-emerald-400" : "text-rose-400"; const sign = isPositive ? "+" : ""; tbody.innerHTML += ` ${row.indice} ${row.nom || "-"} ${parseFloat(row.cours).toLocaleString("fr-FR")} ${sign}${parseFloat(row.variation_pct).toFixed(2)}% ${row.date_cours} `; }); } function alimenterBandeauxTicker() { // Filtrer et trier par ordre alphabétique sur le champ 'nom' (ou 'indice' si 'nom' est vide) const preparerDonneesTicker = (nomIndice) => { let liste = indicesData.filter((item) => item.indice === nomIndice); // Tri alphabétique liste.sort((a, b) => { let valA = (a.nom || a.indice).toLowerCase(); let valB = (b.nom || b.indice).toLowerCase(); return valA.localeCompare(valB); }); return liste; }; remplirUnBandeau("ticker-cac40", preparerDonneesTicker("CAC40")); remplirUnBandeau("ticker-ibex35", preparerDonneesTicker("IBEX35")); remplirUnBandeau("ticker-dowjones", preparerDonneesTicker("DOWJONES")); } function remplirUnBandeau(elementId, donneesTriees) { const container = document.getElementById(elementId); if (!container) return; if (donneesTriees.length === 0) { container.innerHTML = `Aucune donnée disponible`; return; } let htmlContent = ""; // On génère une séquence d'éléments const genererBlocs = () => { let blocs = ""; donneesTriees.forEach((item) => { const isPositive = parseFloat(item.variation_pct) >= 0; const colorClass = isPositive ? "text-emerald-400" : "text-rose-400"; const sign = isPositive ? "+" : ""; const nomAffichage = item.nom || item.indice; const coursFormate = parseFloat(item.cours).toLocaleString("fr-FR"); const variationFormatee = parseFloat(item.variation_pct).toFixed(2); blocs += `
${nomAffichage} ${coursFormate} ${sign}${variationFormatee}%
`; }); return blocs; }; // On duplique le contenu pour assurer un effet de défilement infini fluide sans saccade htmlContent = genererBlocs() + genererBlocs(); container.innerHTML = htmlContent; } // Lancer au chargement initial chargerDonnees(); // Rafraîchir automatiquement toutes les 60 secondes setInterval(chargerDonnees, 60000);