// ==UserScript==
// @name Bouton pour créer une nouvelle fiche
// @namespace bouton_fiche.js
// @version 1.6.0
// @description Ajouter des boutons pour aider à l'utilisation de la plateforme
// @match https://procuration-front-populaire.fr/console/*
// @grant window.onurlchange
// @grant GM_openInTab
// ==/UserScript==
(function () {
"use strict";
const DEBUG = false;
const regexAddr = new RegExp("^[^]*[0-9]{5} [^]{2,}$");
function createUsefullButton(url, text) {
const button = document.createElement("button");
button.innerText = text;
button.className = "btn btn-primary";
button.style.margin = "10px";
button.addEventListener("click", () => {
window.open(`${url}`, "_blank");
});
return button;
}
// Fonction pour créer un bouton avec les query params
function createFormButton(type, contactInfo) {
const button = document.createElement("button");
button.innerText = "Créer une nouvelle fiche";
button.className = "btn btn-primary";
button.style.marginTop = "10px";
button.addEventListener("click", () => {
const baseUrl =
type === "demandeur"
? "https://procuration-front-populaire.fr/request"
: "https://procuration-front-populaire.fr/proposal";
const queryParams = new URLSearchParams(contactInfo).toString();
window.open(`${baseUrl}?${queryParams}`, "_blank");
});
return button;
}
function createSearchButtons(contactInfo) {
const container = document.createElement("div");
// Extraire la première chaîne jusqu'à un caractère différent d'une lettre
const firstNameMatch = decodeURIComponent(
contactInfo.user_details_firstNames
).match(/^[a-zA-Z\u00C0-\u024F]+/);
const firstName = firstNameMatch
? firstNameMatch[0]
: contactInfo.user_details_firstNames;
// Bouton 1 : Recherche avec prénom et nom
const button1 = document.createElement("button");
button1.innerText = "Rechercher avec le prénom et nom";
button1.className = "btn btn-primary";
button1.style.marginTop = "10px";
button1.addEventListener("click", () => {
const query = `${firstName} ${contactInfo.user_details_lastName}`;
const urls = [
`https://www.google.com/search?q=${query}`,
`https://www.linkedin.com/search/results/people/?keywords=${query}`,
`https://www.facebook.com/search/people/?q=${query}`,
`https://twitter.com/search?q=${query}&f=user`,
];
urls.forEach((url) => GM_openInTab(url, { active: true, insert: true }));
});
// Bouton 2 : Recherche avec prénom, nom et ville
const button2 = document.createElement("button");
button2.innerText = "Rechercher avec le prénom, nom et ville";
button2.className = "btn btn-primary";
button2.style.marginTop = "10px";
button2.addEventListener("click", () => {
const query = `${firstName} ${contactInfo.user_details_lastName} ${contactInfo.user_details_electoralListCityName}`;
const urls = [
`https://www.google.com/search?q=${query}`,
];
urls.forEach((url) => GM_openInTab(url, { active: true, insert: true }));
});
container.appendChild(button2);
container.appendChild(button1);
return container;
}
// Fonction pour mapper les mois en texte vers les valeurs numériques
function mapMonthTextToValue(monthText) {
switch (monthText) {
case "janv.":
return "1";
case "févr.":
return "2";
case "mars":
return "3";
case "avr.":
return "4";
case "mai":
return "5";
case "juin":
return "6";
case "juil.":
return "7";
case "août":
return "8";
case "sept.":
return "9";
case "oct.":
return "10";
case "nov.":
return "11";
case "déc.":
return "12";
default:
return "";
}
}
// Fonction pour extraire les informations du demandeur
function extractInfo(element) {
const info = {};
// Nom et prénom
const nameElement = element.querySelector("h3");
if (nameElement) {
const name = nameElement.innerText.trim().split(" ");
info.user_details_lastName = name.pop();
info.user_details_firstNames = encodeURIComponent(name.join(" "));
}
// Adresse
const addressElement = Array.from(element.querySelectorAll("div")).find(
(el) => el.textContent.trim() === "Addresse postale"
);
if (addressElement) {
const address = addressElement.nextElementSibling
? addressElement.nextElementSibling.innerText.trim()
: "";
info.user_details_addressParentElement = addressElement.parentElement.parentElement;
info.user_details_rawAddress = address;
info.user_details_address = encodeURIComponent(
address.replace(/\s+/g, " ").trim()
);
}
// Bureau de vote
const votePlaceElement = Array.from(element.querySelectorAll("div")).find(
(el) => el.textContent.trim() === "Bureau de vote"
);
if (votePlaceElement) {
const votePlace = votePlaceElement.nextElementSibling
.querySelector(".flex-1")
.textContent.trim();
let lignes = votePlace.split("\n");
const ville = lignes[1].split("(")[0].trim();
const departement = lignes[1].match(/\(([^)]+)\)/)[1];
info.user_details_rawVotePlace = lignes[0].trim();
info.user_details_votePlace = encodeURIComponent(lignes[0].trim());
info.user_details_electoralListCityName = encodeURIComponent(ville);
info.user_details_electoralListCityDepartment =
encodeURIComponent(departement);
}
// Numéro d'électeur
const voterNumberElement = Array.from(element.querySelectorAll("div")).find(
(el) => el.textContent.trim() === "Numéro d'électeur"
);
if (voterNumberElement) {
const voterNumber = voterNumberElement.nextElementSibling
? voterNumberElement.nextElementSibling
.querySelector(".flex-1")
.textContent.trim()
: "";
info.user_details_voterNumber = voterNumber;
}
// Email
const emailLink = element.querySelector('a[href^="mailto:"]');
if (emailLink) {
info.user_details_email = encodeURIComponent(emailLink.innerText.trim());
}
// Téléphone
const phoneLink = element.querySelector('a[href^="tel:"]');
if (phoneLink) {
info.user_details_phone = phoneLink.innerText.trim();
}
// Date de naissance
const birthdateElement = Array.from(element.querySelectorAll("div")).find(
(el) => el.textContent.trim() === "Date de naissance"
);
if (birthdateElement) {
const birthdateText = birthdateElement.nextElementSibling
? birthdateElement.nextElementSibling.innerText.trim()
: "";
const birthdateParts = birthdateText.split(" ");
info.user_details_birthdate_day = birthdateParts[0];
info.user_details_birthdate_month = mapMonthTextToValue(
birthdateParts[1]
);
info.user_details_birthdate_year = birthdateParts[2];
}
// Disponibilités
const availabilityElement = Array.from(
element.querySelectorAll("div")
).find((el) => el.textContent.trim() === "Disponibilités");
if (availabilityElement) {
const availabilityText = availabilityElement.nextElementSibling
? availabilityElement.nextElementSibling.innerText.trim()
: "";
info.user_details_electionsDates_0 =
availabilityText.includes("2024-06-30");
info.user_details_electionsDates_1 =
availabilityText.includes("2024-07-07");
}
// Contact Citipo
const contactElement = Array.from(element.querySelectorAll("div")).find(
(el) => el.textContent.trim() === "Contact Citipo/OpenAction"
);
if (contactElement) {
info.contact = contactElement.nextElementSibling
? contactElement.nextElementSibling.innerText
.trim()
.includes("Confiance")
? "Confiance"
: ""
: "";
}
// Commentaire
const commentElement = Array.from(element.querySelectorAll("div")).find(
(el) => el.textContent.trim() === "Commentaire"
);
if (commentElement) {
const comment = commentElement.nextElementSibling
? commentElement.nextElementSibling.innerText.trim()
: "";
info.user_details_comment = encodeURIComponent(comment);
}
return info;
}
// Fonction pour extraire les informations du demandeur
function extractFromMatchRequestInfo(requestElement) {
const info = {};
// Nom et prénom
const nameElement = requestElement.querySelector("h3");
if (nameElement) {
const name = nameElement.innerText.trim().split(" ");
info.user_details_lastName = name.pop();
info.user_details_firstNames = encodeURIComponent(name.join(" "));
}
// Adresse
const addressElement = Array.from(
requestElement.querySelectorAll("div")
).find((el) => el.textContent.trim() === "Addresse postale");
if (addressElement) {
const address = addressElement.nextElementSibling
? addressElement.nextElementSibling.innerText.trim()
: "";
info.user_details_addressParentElement = addressElement.parentElement.parentElement;
info.user_details_rawAddress = address;
info.user_details_address = encodeURIComponent(
address.replace(/\s+/g, " ").trim()
);
}
// Bureau de vote
const votePlaceElement = Array.from(
requestElement.querySelectorAll("div")
).find((el) => el.textContent.trim() === "Bureau de vote");
if (votePlaceElement) {
const votePlace = votePlaceElement.nextElementSibling
.querySelector(".flex-1")
.textContent.trim();
let lignes = votePlace.split("\n");
const ville = lignes[1].split("(")[0].trim();
const departement = lignes[1].match(/\(([^)]+)\)/)[1];
info.user_details_rawVotePlace = lignes[0].trim();
info.user_details_votePlace = encodeURIComponent(lignes[0].trim());
info.user_details_electoralListCityName = encodeURIComponent(ville);
info.user_details_electoralListCityDepartment =
encodeURIComponent(departement);
}
// Numéro d'électeur
const voterNumberElement = Array.from(
requestElement.querySelectorAll("div")
).find((el) => el.textContent.trim() === "Numéro d'électeur");
if (voterNumberElement) {
const voterNumber = voterNumberElement.nextElementSibling
? voterNumberElement.nextElementSibling
.querySelector(".flex-1")
.textContent.trim()
: "";
info.user_details_voterNumber = voterNumber;
}
// Email
const emailLink = requestElement.querySelector('a[href^="mailto:"]');
if (emailLink) {
info.user_details_email = encodeURIComponent(emailLink.innerText.trim());
}
// Téléphone
const phoneLink = requestElement.querySelector('a[href^="tel:"]');
if (phoneLink) {
info.user_details_phone = phoneLink.innerText.trim();
}
// Date de naissance
const birthdateElement = Array.from(
requestElement.querySelectorAll("div")
).find((el) => el.textContent.trim() === "Date de naissance");
if (birthdateElement) {
const birthdateText = birthdateElement.nextElementSibling
? birthdateElement.nextElementSibling.innerText.trim()
: "";
const birthdateParts = birthdateText.split(" ");
info.user_details_birthdate_day = birthdateParts[0];
info.user_details_birthdate_month = mapMonthTextToValue(
birthdateParts[1]
);
info.user_details_birthdate_year = birthdateParts[2];
}
// Disponibilités
const availabilityElement = Array.from(
requestElement.querySelectorAll("div")
).find((el) => el.textContent.trim() === "Disponibilités");
if (availabilityElement) {
const availabilityText = availabilityElement.nextElementSibling
? availabilityElement.nextElementSibling.innerText.trim()
: "";
info.user_details_electionsDates_0 =
availabilityText.includes("2024-06-30");
info.user_details_electionsDates_1 =
availabilityText.includes("2024-07-07");
}
// Contact Citipo
const contactElement = Array.from(
requestElement.querySelectorAll("div")
).find((el) => el.textContent.trim() === "Contact Citipo/OpenAction");
if (contactElement) {
info.contact = contactElement.nextElementSibling
? contactElement.nextElementSibling.innerText
.trim()
.includes("Confiance")
? "Confiance"
: ""
: "";
}
// Commentaire
const commentElement = Array.from(
requestElement
.querySelector(".text-xs.my-2.space-y-2")
.querySelectorAll("div")
).find((el) => el.textContent.trim() === "Commentaire");
if (commentElement) {
const comment = commentElement.nextElementSibling
? commentElement.nextElementSibling.innerText.trim()
: "";
info.user_details_comment = encodeURIComponent(comment);
}
return info;
}
// Fonction pour extraire les informations du proposant
function extractFromMatchProposalInfo(proposalElement) {
const info = {};
// Nom et prénom
const nameElement = proposalElement.querySelector(".font-bold");
if (nameElement) {
const name = nameElement.innerText.trim().split(" ");
info.user_details_lastName = name.pop();
info.user_details_firstNames = encodeURIComponent(name.join(" "));
}
// Adresse
const addressElement = proposalElement.querySelector(
".text-xs.my-2.space-y-2"
);
if (addressElement) {
const address = addressElement.children[0].children[1]
? addressElement.children[0].children[1].innerText.trim()
: "";
info.user_details_addressParentElement = addressElement;
info.user_details_rawAddress = address;
info.user_details_address = encodeURIComponent(
address.replace(/\s+/g, " ").trim()
);
}
// Bureau de vote
const votePlaceElement = Array.from(
proposalElement.querySelectorAll("div")
).find((el) => el.textContent.trim() === "Bureau de vote");
if (votePlaceElement) {
const votePlace = votePlaceElement.nextElementSibling.textContent.trim();
let lignes = votePlace.split("\n");
const ville = lignes[1].split("(")[0].trim();
const departement = lignes[1].match(/\(([^)]+)\)/)[1];
info.user_details_rawVotePlace = lignes[0].trim();
info.user_details_votePlace = encodeURIComponent(lignes[0].trim());
info.user_details_electoralListCityName = encodeURIComponent(ville);
info.user_details_electoralListCityDepartment =
encodeURIComponent(departement);
}
// Numéro d'électeur
const voterNumberElement = Array.from(
proposalElement.querySelectorAll("div")
).find((el) => el.textContent.trim() === "Numéro d'électeur");
if (voterNumberElement) {
const voterNumber = voterNumberElement.nextElementSibling
? voterNumberElement.nextElementSibling.innerText.trim()
: "";
info.user_details_voterNumber = voterNumber;
}
// Email
const emailLink = proposalElement.querySelector('a[href^="mailto:"]');
if (emailLink) {
info.user_details_email = encodeURIComponent(emailLink.innerText.trim());
}
// Téléphone
const phoneLink = proposalElement.querySelector('a[href^="tel:"]');
if (phoneLink) {
info.user_details_phone = phoneLink.innerText.trim();
}
// Date de naissance
const birthdateElement = Array.from(
proposalElement.querySelectorAll("div")
).find((el) => el.textContent.trim() === "Date de naissance");
if (birthdateElement) {
const birthdateText = birthdateElement.nextElementSibling
? birthdateElement.nextElementSibling.innerText.trim()
: "";
const birthdateParts = birthdateText.split(" ");
info.user_details_birthdate_day = birthdateParts[0];
info.user_details_birthdate_month = mapMonthTextToValue(
birthdateParts[1]
);
info.user_details_birthdate_year = birthdateParts[2];
}
// Disponibilités
const availabilityElement = Array.from(
proposalElement.querySelectorAll("div")
).find((el) => el.textContent.trim() === "Disponibilités");
if (availabilityElement) {
const availabilityText = availabilityElement.nextElementSibling
? availabilityElement.nextElementSibling.innerText.trim()
: "";
info.user_details_electionsDates_0 =
availabilityText.includes("2024-06-30");
info.user_details_electionsDates_1 =
availabilityText.includes("2024-07-07");
}
// Contact Citipo
const contactElement = Array.from(
proposalElement.querySelectorAll("div")
).find((el) => el.textContent.trim() === "Contact Citipo/OpenAction");
if (contactElement) {
info.contact = contactElement.nextElementSibling
? contactElement.nextElementSibling.innerText
.trim()
.includes("Confiance")
? "Confiance"
: ""
: "";
}
// Commentaire
const commentElement = Array.from(
proposalElement.querySelectorAll("div")
).find((el) => el.textContent.trim() === "Commentaire");
if (commentElement) {
const comment = commentElement.nextElementSibling
? commentElement.nextElementSibling.innerText.trim()
: "";
info.user_details_comment = encodeURIComponent(comment);
}
return info;
}
// Liste des scripts à exécuter pour chaque chemin
const scripts = {
"/console/proposals": scriptForProposals,
"/console/requests": scriptForRequests,
"/console/matches": scriptForMatches,
};
function scriptForProposals() {
// Ajouter les boutons aux demandeurs
const proposalElements = document.querySelectorAll('div[id^="proposal-"]');
proposalElements.forEach((element) => {
const contactInfo = extractInfo(element);
const formButton = createFormButton("proposant", contactInfo);
element.querySelector(".text-xs.my-2.space-y-2").appendChild(formButton);
const searchButton = createSearchButtons(contactInfo);
element
.querySelector(".text-xs.my-2.space-y-2")
.appendChild(searchButton);
checkWarningAddress(contactInfo);
});
}
function scriptForRequests() {
// Ajouter les boutons aux demandeurs
const requestElements = document.querySelectorAll('div[id^="request-"]');
requestElements.forEach((element) => {
const contactInfo = extractInfo(element);
const button = createFormButton("demandeur", contactInfo);
element.querySelector(".text-xs.my-2.space-y-2").appendChild(button);
checkWarningAddress(contactInfo);
});
}
function scriptForMatches() {
// Ajouter les boutons aux demandeurs
const requestElements = document.querySelectorAll('div[id^="request-"]');
requestElements.forEach((element) => {
const contactInfo = extractFromMatchRequestInfo(element);
const button = createFormButton("demandeur", contactInfo);
element.querySelector(".text-xs.my-2.space-y-2").appendChild(button);
checkWarningAddress(contactInfo);
});
// Ajouter les boutons aux proposants
const proposalElements = document.querySelectorAll('div[id^="match-"]');
proposalElements.forEach((element) => {
const contactInfo = extractFromMatchProposalInfo(element);
const button = createFormButton("proposant", contactInfo);
element.appendChild(button);
checkWarningAddress(contactInfo);
});
const links = document.querySelectorAll("a");
links.forEach((link) => {
const href = link.getAttribute("href");
// Vérifier si le lien correspond au modèle spécifié
if (
href &&
href.startsWith("/console/matches/") &&
href.includes("/reject")
) {
link.style.display = "none";
}
});
}
function addButtonsFirstDiv(buttonDataArray) {
const divs = document.querySelectorAll("div");
if (divs.length === 0) {
return;
}
const firstChildDiv = divs[0].querySelector("div");
if (firstChildDiv) {
buttonDataArray.forEach((buttonData) => {
const button = createUsefullButton(buttonData.url, buttonData.text);
firstChildDiv.appendChild(button);
});
}
}
// Exemple de données pour les boutons
const buttonDataArray = [
{
url: "https://docs.google.com/spreadsheets/d/15AlV23fz-w8uzp0XQRW2E96uu04wdgJYG_zYJopdBYw/edit?gid=423634231#gid=423634231",
text: "Calendrier SAV + demandes",
},
{
url: "https://docs.google.com/spreadsheets/d/15AlV23fz-w8uzp0XQRW2E96uu04wdgJYG_zYJopdBYw/edit?gid=926737610#gid=926737610",
text: "Calendrier Propositions",
},
{
url: "https://docs.google.com/spreadsheets/d/15AlV23fz-w8uzp0XQRW2E96uu04wdgJYG_zYJopdBYw/edit?gid=2025753569#gid=2025753569",
text: "Calendrier Mises en relation",
},
{
url: "https://www.notion.so/Plateforme-de-procuration-Front-Populaire-cbda3768fbad45d9bb389adadeb68223?pvs=4",
text: "Notion (FAQ)",
},
];
function warningAssigned() {
const assignedPeolpe = document.querySelectorAll(
'turbo-frame[id^="proposal-assigned-"], turbo-frame[id^="request-assigned-"], turbo-frame[id^="match-assigned-"]'
);
assignedPeolpe.forEach((element) => {
const email = element.querySelector("div.flex-1").textContent.trim();
if (email != "Aucun") {
const alertDiv = document.createElement("div");
alertDiv.className = "custom-alert"; // Classe pour le style personnalisé
alertDiv.innerHTML =
"<strong>Attention ! En cours de traitement possible</strong> ";
alertDiv.style.padding = "15px";
alertDiv.style.backgroundColor = "orange";
alertDiv.style.color = "black";
alertDiv.style.fontWeight = "bold";
alertDiv.style.borderRadius = "10px";
alertDiv.style.marginBottom = "10px";
element.parentElement.parentElement.insertBefore(
alertDiv,
element.parentElement.parentElement.firstChild
);
}
});
}
function checkWarningAddress(contactInfo) {
DEBUG && console.log("Check address:", contactInfo.user_details_rawAddress );
// On cherche zip et ville, si c'est en France (" FR")
if (contactInfo.user_details_rawAddress
&& ! regexAddr.test(contactInfo.user_details_rawAddress)
&& contactInfo.user_details_rawAddress.includes(" FR")) {
DEBUG && console.log("Bad Address:", contactInfo.user_details_rawAddress);
// console.log(contactInfo.user_details_addressParentElement);
const alertDiv = document.createElement("div");
alertDiv.className = "custom-alert"; // Classe pour le style personnalisé
alertDiv.innerHTML =
"<strong>Attention ! Addresse imprécise, ajouter le CP</strong> ";
alertDiv.style.padding = "15px";
alertDiv.style.backgroundColor = "orange";
alertDiv.style.color = "black";
alertDiv.style.fontWeight = "bold";
alertDiv.style.borderRadius = "10px";
alertDiv.style.marginBottom = "10px";
contactInfo.user_details_addressParentElement.insertBefore(
alertDiv,
contactInfo.user_details_addressParentElement.firstChild
);
}
}
// Fonction pour exécuter le script en fonction du chemin
function executeScript() {
const path = window.location.pathname;
addButtonsFirstDiv(buttonDataArray);
if (scripts[path]) {
scripts[path]();
} else {
console.log("No script defined for this path");
}
warningAssigned();
}
// Observer les changements d'URL
if (window.onurlchange === null) {
window.addEventListener("urlchange", (info) => {
executeScript();
});
}
// Exécuter le script lors du chargement initial
executeScript();
})();