// 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}
${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);