您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Ajouter des boutons pour aider à l'utilisation de la plateforme
当前为
// ==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(); })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址