/**
* Application de comparaison des KPIs COP régionales
*/
// ============================================================
// Initialisation
// ============================================================
document.addEventListener("DOMContentLoaded", () => {
renderTiles();
renderTable();
});
// ============================================================
// Tuiles de synthèse
// ============================================================
function renderTiles() {
const container = document.getElementById("tiles-container");
container.innerHTML = "";
for (const [catName, catInfo] of Object.entries(CATEGORIES)) {
const catKpis = KPI_DATA.filter(k => k.categorie === catName);
const comparableCount = catKpis.filter(k => k.comparable).length;
const total = catKpis.length;
const pct = total > 0 ? Math.round((comparableCount / total) * 100) : 0;
const col = document.createElement("div");
col.className = "fr-col-12 fr-col-sm-6 fr-col-md-4 fr-col-lg-3";
col.innerHTML = `
${catInfo.icon}
${catName}
${total} KPI${total > 1 ? 's' : ''} —
${comparableCount} comparable${comparableCount > 1 ? 's' : ''}
`;
container.appendChild(col);
}
}
// ============================================================
// Tableau de comparaison
// ============================================================
function renderTable(filteredData = null) {
const tbody = document.getElementById("kpi-tbody");
tbody.innerHTML = "";
const data = filteredData || KPI_DATA;
let currentCategory = "";
data.forEach(kpi => {
// Ligne catégorie
if (kpi.categorie !== currentCategory) {
currentCategory = kpi.categorie;
const catRow = document.createElement("tr");
catRow.className = "category-row";
catRow.dataset.category = currentCategory;
const catInfo = CATEGORIES[currentCategory] || { icon: "📋" };
catRow.innerHTML = `
${catInfo.icon} ${currentCategory}
|
`;
tbody.appendChild(catRow);
}
// Ligne KPI
const row = document.createElement("tr");
row.dataset.category = kpi.categorie;
row.dataset.comparable = kpi.comparable ? "true" : "false";
const comparableTag = getComparableTag(kpi);
row.innerHTML = `
${kpi.indicateur}
${kpi.unite}
|
${formatValueWithSource(kpi.grand_est, "grand_est", kpi.grand_est_page)} |
${formatValueWithSource(kpi.occitanie, "occitanie", kpi.occitanie_page)} |
${formatValueWithSource(kpi.aura, "aura", kpi.aura_page)} |
${formatValueWithSource(kpi.normandie, "normandie", kpi.normandie_page)} |
${comparableTag} |
`;
tbody.appendChild(row);
});
// Compteur
updateCounter(data);
}
function formatValueWithSource(val, regionKey, page) {
if (!val || val === "Non chiffré" || val === "Non chiffré spécifiquement" || val === "Non traité" || val.startsWith("Non traité") || val.startsWith("Non chiffré") || val.startsWith("Non détaillé")) {
const na = `${val || '—'}`;
return na;
}
// Mettre en avant les chiffres
let formatted = val.replace(/(\d[\d\s,.×÷%]*(?:\s*(?:ktCO2eq|MtCO2eq|TWh|GWh|MW|MWc|km|ha|%|millions?|milliards?|M€|Mm3))?)/g,
'$1');
// Ajouter le lien source avec page
if (page && SOURCES[regionKey]) {
const link = `${SOURCES[regionKey].url}#page=${page}`;
formatted += ` p.${page}`;
}
return formatted;
}
function getComparableTag(kpi) {
if (kpi.comparable) {
return `
✓ Oui
`;
}
// Check if at least 2 regions have data
const regions = [kpi.grand_est, kpi.occitanie, kpi.aura, kpi.normandie];
const withData = regions.filter(v => v && !v.startsWith("Non") && !v.includes("N/D")).length;
if (withData >= 2) {
return `
~ Partiel
`;
}
return `
— Non
`;
}
// ============================================================
// Filtrage
// ============================================================
function filterTable() {
const category = document.getElementById("filter-category").value;
const search = document.getElementById("search-input").value.toLowerCase().trim();
const onlyComparable = document.getElementById("toggle-comparable").checked;
let filtered = KPI_DATA;
if (category !== "all") {
filtered = filtered.filter(k => k.categorie === category);
}
if (search) {
filtered = filtered.filter(k =>
k.indicateur.toLowerCase().includes(search) ||
k.categorie.toLowerCase().includes(search) ||
k.grand_est.toLowerCase().includes(search) ||
k.occitanie.toLowerCase().includes(search) ||
k.aura.toLowerCase().includes(search) ||
k.normandie.toLowerCase().includes(search) ||
k.unite.toLowerCase().includes(search)
);
}
if (onlyComparable) {
filtered = filtered.filter(k => k.comparable);
}
renderTable(filtered);
}
function filterByCategory(catName) {
const select = document.getElementById("filter-category");
if (select.value === catName) {
select.value = "all";
} else {
select.value = catName;
}
filterTable();
// Scroll to table
document.getElementById("comparaison").scrollIntoView({ behavior: "smooth" });
}
// ============================================================
// Compteur de résultats
// ============================================================
function updateCounter(data) {
const tableTitle = document.querySelector("#comparaison h2");
const total = data.length;
const comparable = data.filter(k => k.comparable).length;
tableTitle.innerHTML = `Comparaison détaillée des KPIs (${total} KPI${total > 1 ? 's' : ''}, dont ${comparable} comparable${comparable > 1 ? 's' : ''})`;
}