Après plusieurs jours de tractations intenses, les choix sont désormais arrêtés. Maintien, fusion ou désistement stratégique : les listes qualifiées pour le second tour des élections municipales, qui aura lieu dimanche 22 mars, sont à présent connues.
Au total, les préfectures ont enregistré, en deux jours, environ 500 désistements et près de 400 fusions de listes, selon le décompte des Décodeurs. Le nombre de listes en lice pour le second tour est ainsi passé de 5 100 à 4 300. Quels accords ont été conclus à gauche entre les « insoumis », les socialistes et les Ecologistes ? Quelles alliances se sont formées entre la droite et le centre ? Des candidats de droite ont-ils franchi le cordon sanitaire en rejoignant les listes du Rassemblement national ? Et que s’est-il passé dans votre commune ?
Découvrez-le dans notre tableau, qui recense les configurations de second tour dans toutes les communes françaises.
${d.ordre}
${d.tete_prenom} ${d.tete_nom}
${nuance2 ? `(${mdm_html(nuances[nuance2].nom_court)})` : « }
· ${pointToComma(Number.parseFloat(d.pct_exprimes).toFixed(1))} %
${d.qualifie == « Fusionnable » ? `
` : « »}
showDecision
? `${decisions[d.decision_officielle2].icon} ${d.tete_civ == « M. » ? decisions[d.decision_officielle2].label_h : decisions[d.decision_officielle2].label_f}
${
d.texte_viz
? `
`
: « »
}`
: « »
}
`;
// TODO : vérifier si on a les fusionnables
if ([« Désistement »].indexOf(d.decision_officielle2) > -1) {
h_candidats_out += h;
} else {
h_candidats_t2 += h;
}
}
html = `
${h_candidats_t2}
${
h_candidats_out.length > 0
? `
${h_candidats_out}
`
: «
}
`;
let newRow = document.createElement(« div »);
newRow.setAttribute(« id », `commune_${code_circo}`);
newRow.classList.add(« suiviDesistements__table__row »);
newRow.setAttribute(« data-countCandidates », data.countCandidates);
newRow.innerHTML = html;
communesContainer.append(newRow);
// Déplacer les listes fusionnées vers leur liste absorbante
newRow2 = document.querySelector(`#commune_${code_circo}`);
newRow2.querySelectorAll(« .candidat[data-fusion-target] »).forEach((item) => {
target = newRow2.querySelector(`.candidat–absorbes[data-master= »${item.getAttribute(« id »)} »]`);
absorbes = item.getAttribute(« data-fusion-target »).split(« ; »);
absorbes.forEach((absorbe) => {
liste = newRow2.querySelector(`.candidat[data-npanneau= »${absorbe} »]`);
if (liste) target.append(liste);
});
});
}
let dicoData = {};
for (const [i, d] of donneesDesistements.entries()) {
// On filtre par seuil de population, on élimine les listes qui n’ont pas de décision officielle cohérent, et les listes fusionnables qui ne sont pas absorbées
if (d.population >= seuil_population && decisions[d.decision_officielle2] && !(d.qualifie == « Fusionnable » && d.decision_officielle2 !== « Fusion (absorbée) »)) {
if (!dicoData[d.code_circo]) {
dicoData[d.code_circo] = {
lib: d.lib,
population: d.population,
candidats: [],
configuration: d.configuration,
};
}
dicoData[d.code_circo][« candidats »].push(d);
}
}
// Sort dicoData by decreasing population and generate the rows
Object.entries(dicoData)
.sort(([, a], [, b]) => b.population – a.population)
.forEach(([code_circo, data]) => {
// On compte le nombre de candidats maintenus
countCandidates = 0;
data[« candidats »].forEach((c) => {
if (decisions[c.decision_officielle2].label_h == « Maintenue ») countCandidates++;
});
data.countCandidates = countCandidates;
// On génère les lignes
genererLigne(code_circo, data);
});
// Générer les filtres
Object.entries(configs).forEach(([key, val]) => {
document.querySelector(« .suiviDesistements__filters »).innerHTML += `
${key} (${val.count})
`;
});
function filterRows(min, max) {
rows = document.querySelectorAll(« .suiviDesistements__table__row »);
rows.forEach((row) => {
countCandidates = parseInt(row.getAttribute(« data-countCandidates »));
if (countCandidates >= min && countCandidates <= max) {
row.classList.remove(« suiviDesistements__table__row–hidden »);
} else {
row.classList.add(« suiviDesistements__table__row–hidden »);
}
});
}
// Clic sur les filtres (Duels, Triangulaires)
filters = document.querySelectorAll(« .suiviDesistements__filter »);
filters.forEach((item) => {
item.addEventListener(« click », (e) => {
filters.forEach((item) => {
item.classList.remove(« suiviDesistements__filter–active »);
});
e.target.classList.add(« suiviDesistements__filter–active »);
choice = item.getAttribute(« data-choice »).split(« -« );
filterRows(+choice[0], +choice[1]);
});
});
// Sur mobile, empêcher le clic sur le lien icône au profit du tooltip
if (isMobile) {
document.querySelectorAll(« .candidat__decision__lien »).forEach((item) => {
item.addEventListener(« click », (event) => {
event.preventDefault();
});
});
}
make_tooltip_desist(« .candidat__decision__lien, .candidat__precision img », window.self !== window.top);
// Search input
document.querySelector(« .suiviDesistements__search__input »).addEventListener(« input », function () {
const search = cleanValue(this.value);
let rows = document.querySelectorAll(« .suiviDesistements__table__row »);
rows.forEach((row) => {
if (!search.length) {
row.classList.remove(« suiviDesistements__table__row–hidden »);
} else {
const targetText =
cleanValue(row.querySelector(« .suiviDesistements__table__row__communeLib »).textContent.replace(/s+/g, » « ).trim()) +
cleanValue(row.querySelector(« .suiviDesistements__table__row__candidats »).textContent.replace(/s+/g, » « ).trim());
row.classList.toggle(« suiviDesistements__table__row–hidden », !targetText.includes(search));
}
});
if (document.querySelectorAll(« .suiviDesistements__table__row–hidden »).length === rows.length) {
// No results
document.querySelector(« .suiviDesistements__table__noResults »).style.display = « flex »;
} else {
document.querySelector(« .suiviDesistements__table__noResults »).style.display = « none »;
}
});
// Reset search input
function remiseAZero() {
input = document.querySelector(« .suiviDesistements__search__input »);
input.value = null;
input.dispatchEvent(new Event(« input », { bubbles: true }));
}
document.querySelector(« .suiviDesistements__search__reset »).addEventListener(« click », remiseAZero);
document.onkeydown = function (evt) {
evt = evt || window.event;
if (evt.key === « Escape » || evt.key === « Esc » || evt.keyCode === 27) remiseAZero();
};
}
// UTILS
// Couleurs
// fonction qui convertit la recherche
function cleanValue(input) {
return input
.toLowerCase()
.replace(« st « , « saint « )
.trim()
.replace(/[àâä]/g, « a »)
.replace(/[æ]/g, « ae »)
.replace(/[ç]/g, « c »)
.replace(/[éèêë]/g, « e »)
.replace(/[îï]/g, « i »)
.replace(/[ô]/g, « o »)
.replace(/[œ]/g, « oe »)
.replace(/[ùûü]/g, « u »)
.replace(/-/g, » « )
.replace(/’/g, » « );
}
// une fonction qui passe la première lettre de tous les mots d’une string en cap
function capitalizeTxt(str) {
// ma fonction de détection
const estToutEnCap = (t) => […t].every((c) => c === c.toUpperCase());
if (!estToutEnCap(str)) return str;
const cap = (s) => `${s.charAt(0).toUpperCase().replace(« É », « E »).replace(« È », « E »)}${s.slice(1)}`;
let out = str.toLowerCase().split( » « ).map(cap).join( » « );
if (out.includes(« -« )) out = out.split(« -« ).map(cap).join(« -« );
return out.replace(« De La « , « de la « ).replace(« De « , « de « ).replace( » – « , « -« );
}
function pointToComma(num) {
return String(num).replace(« . », « , »);
}
function thousandSep(num) {
return String(num).replace(/B(?=(d{3})+(?!d))/g, » « );
}
function make_tooltip_desist(selector, is_live = false) {
let tooltipTriggers = getA(selector);
forEach(tooltipTriggers, function (elmt) {
elmt.addEventListener(« mouseover », function () {
display_tooltip_desist(elmt, is_live);
});
if (!isMobile) {
elmt.addEventListener(« mouseout », function () {
document.querySelectorAll(« .tooltipdecodeurs »).forEach((tooltipElem) => {
tooltipElem.remove();
});
});
}
if (is_live) {
// click outside is closing the tooltip
document.addEventListener(« click », function (event) {
const tooltipElem = document.querySelector(« .tooltipdecodeurs »);
if (tooltipElem && !tooltipElem.contains(event.target)) {
tooltipElem.remove();
}
});
}
});
}
// TODO : permettre de cliquer le lien sur le tooltip
function display_tooltip_desist(elmt, is_live = false) {
document.querySelectorAll(« .tooltipdecodeurs »).forEach((tooltipElem) => {
tooltipElem.remove();
});
let tooltipElem = document.createElement(« div »);
tooltipElem.classList.add(« tooltipdecodeurs »);
tooltipElem.classList.add(« lmui-tooltip »);
let tt_html = ``;
if (elmt.hasAttribute(« data-tt-supertitle ») && elmt.getAttribute(« data-tt-supertitle ») != « ») {
tt_html += `
${elmt.getAttribute(« data-tt-supertitle »)}
`;
}
if (elmt.hasAttribute(« data-tt-title ») && elmt.getAttribute(« data-tt-title ») != « ») {
tt_html += « ;
}
if (elmt.hasAttribute(« data-tt-desc ») && elmt.getAttribute(« data-tt-desc ») != « ») {
tt_html += `
${elmt.getAttribute(« data-tt-desc »)}
`;
}
if (elmt.hasAttribute(« data-tt-source ») && elmt.getAttribute(« data-tt-source ») != « ») {
tt_html += `
${elmt.getAttribute(« data-tt-source »)}
`;
}
tooltipElem.innerHTML = tt_html;
document.body.appendChild(tooltipElem);
/* le 14 c’est le décalage qui va bien */
const tt_top = elmt.getBoundingClientRect().top – 14 + window.scrollY – tooltipElem.offsetHeight;
tooltipElem.style.top = tt_top + « px »;
let tt_left;
if (is_live && tt_top < 0) {
tooltipElem.style.top = « 0px »;
tt_left = elmt.getBoundingClientRect().left + elmt.getBoundingClientRect().width + 2;
if (tt_left + tooltipElem.offsetWidth > window.innerWidth) {
tt_left = elmt.getBoundingClientRect().left – tooltipElem.offsetWidth – 2;
}
} else {
tt_left = elmt.getBoundingClientRect().left + elmt.getBoundingClientRect().width / 2 – tooltipElem.getBoundingClientRect().width / 2 + 2;
}
tooltipElem.style.left = tt_left + « px »;
if (is_live && tt_left < 0) {
tooltipElem.style.left = « 0px »;
} else if (is_live && tt_left + tooltipElem.offsetWidth > window.innerWidth) {
tooltipElem.style.left = window.innerWidth – tooltipElem.offsetWidth + « px »;
}
// tooltipElem.addEventListener(« click », function (event) {
// event.stopImmediatePropagation();
// });
tooltipElem.querySelector(« .lmui-tooltip__close »).addEventListener(« click », () => {
tooltipElem.remove();
});
}
async function initViz() {
//console.warn(« >>> initViz »);
nuances_ministere = await fetchNuances(nuances_ministereURL);
nuances_lemonde = await fetchNuances(nuances_lemondeURL);
nuances = { …nuances_ministere, …nuances_lemonde };
drawTable();
//console.warn(« <<<<« );
}
initViz();




