Bouton pour créer une nouvelle fiche

Ajouter des boutons pour aider à l'utilisation de la plateforme

目前為 2024-06-28 提交的版本,檢視 最新版本

// ==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或关注我们的公众号极客氢云获取最新地址