// Fonction pour rendre les URL cliquables dans un élément function renderClickableLinks(element, isSpan) { // Récupérer le texte de l'élément var text = isSpan ? element.textContent : element.value ? element.value : false; // Vérifier si le texte commence par l'URL spécifiée if (text && text.startsWith('https://api.owner-academy.com')) { // Créer un élément de lien var link = document.createElement('a'); // Définir l'URL du lien link.href = text; // Définir le texte du lien link.textContent = text; link.setAttribute('target', '_blank'); // Remplacer le contenu de l'élément par le lien element.innerHTML = ''; if(isSpan) { element.appendChild(link); } else { element.after(link); element.hidden = true; } } }; // Fonction pour observer les mutations dans le DOM function observeDOM() { // Sélectionner le nœud racine pour observer les mutations var targetNode = document.body; // Vous pouvez changer cela pour correspondre à votre modal // Options pour l'observateur (qui mutations observer) var config = { childList: true, subtree: true }; // Créer un nouvel observateur de mutations var observer = new MutationObserver(function(mutationsList, observer) { // Parcourir les mutations for(var mutation of mutationsList) { // Vérifier si des nœuds ont été ajoutés if (mutation.type === 'childList') { // Parcourir les nœuds ajoutés mutation.addedNodes.forEach(function(addedNode) { // Vérifier si le nœud ajouté est un élément avec la classe text-xs if (addedNode instanceof Element && addedNode.classList.contains('text-xs')) { // Rendre les URL cliquables dans cet élément renderClickableLinks(addedNode, true); } if(addedNode.classList && addedNode.classList.contains('n-input__input-el') && addedNode.attr('placeholder').contains('lien bilan sport et santé')) { renderClickableLinks(addedNode, false); } // Vérifier les nœuds enfants de l'élément ajouté if (addedNode instanceof Element) { var childSpans = addedNode.querySelectorAll('.text-xs'); let childInputs = addedNode.querySelectorAll('input.n-input__input-el[placeholder="lien bilan sport et santé"]'); childSpans.forEach(function(childSpan) { renderClickableLinks(childSpan, true); }); childInputs.forEach(function(childInput) { renderClickableLinks(childInput, false); }); } }); } } }); // Commencer à observer le nœud cible pour les mutations spécifiées dans la configuration observer.observe(targetNode, config); }; // Appeler la fonction pour observer les mutations dans le DOM observeDOM(); // Sélectionner l'élément à déplacer const elementToMove = document.getElementById("dfa5daf9-b016-41b4-9e32-88a700dec281"); // Sélectionner l'élément après lequel vous voulez déplacer elementToMove const referenceElement = document.getElementById("sb_opportunities"); // Vérifier si les éléments existent if (elementToMove && referenceElement) { // Insérer elementToMove après referenceElement referenceElement.parentNode.insertBefore(elementToMove, referenceElement.nextSibling); } // Fonction pour exécuter lorsque des mutations sont détectées dans le DOM function handleMutations(mutationsList, observer) { executeWhenPageChanged(); } // Fonction pour exécuter le code une fois que la page est modifiée function executeWhenPageChanged() { var smsTab = document.getElementById("sms-tab"); // Vérification si l'élément a la classe active if (smsTab && smsTab.classList.contains("active")) { // Sélection de tous les éléments avec la classe tab-content var tabContents = document.querySelectorAll(".tab-content"); // Parcours de chaque élément tab-content et masquage tabContents.forEach(function(tabContent) { tabContent.style.display = "none"; }); } else { var tabContents = document.querySelectorAll(".tab-content"); // Parcours de chaque élément tab-content et masquage tabContents.forEach(function(tabContent) { tabContent.style.display = "block"; }); } // Définition du tableau de remplacement let motsAChanger = [ {mot: "All courses", equivalent: "Tous les cours"}, {mot: "Appointments Report", equivalent: "Rapport de rendez-vous"}, {mot: "Send", equivalent: "Envoyer"}, {mot: "Clear", equivalent: "Effacer"}, {mot: "There has been no message initiated from user in past 24hrs. Please use a", equivalent: "Aucun message n'a été envoyé par le prospect depuis 24h."}, {mot: "template to initiate a chat", equivalent: "Clique ici pour sélectionner le modèle 'lancer conversation' "}, {mot: "Use Template", equivalent: "Utiliser modèle"}, {mot: " Marketing ", equivalent: " Réseaux sociaux"}, {mot: " Sites ", equivalent: " Widgets"}, {mot: "Booked by lead", equivalent: "Réservé par prospect"}, {mot: "Booked", equivalent: "Réservé"}, {mot: "Feb", equivalent: "Fév"}, {mot: "Apr", equivalent: "Avr"}, {mot: "May", equivalent: "Mai"}, {mot: "Jun", equivalent: "Juin"}, {mot: "Jul", equivalent: "Juil."}, {mot: "Aug", equivalent: "Août"}, {mot: "Confirmed", equivalent: "Confirmé"}, {mot: "Showed", equivalent: "Venu"}, {mot: "No Show", equivalent: "Non venu"}, {mot: "Cancelled", equivalent: "Annulé"}, {mot: "Cancel", equivalent: "Annuler"}, {mot: "Outcomes", equivalent: "Résultats"}, {mot: "Outcome", equivalent: "Résultat"}, {mot: "Requested Time", equivalent: "Date du RDV"}, {mot: "Date Added", equivalent: "Date d'ajout du RDV"}, {mot: "Contact Name", equivalent: "Nom du contact"}, {mot: "Funnels", equivalent: "Qualification clients"}, {mot: "Funnel", equivalent: "Qualification clients"}, {mot: "Listes intelligentes", equivalent: "Liste contacts"}, {mot: "Le client dépense", equivalent: "Dépense"}, {mot: "Il marque un but!", equivalent: "Score"}, {mot: "1 Les étoiles", equivalent: "1 Étoile"}, {mot: "Les étoiles", equivalent: "Étoiles"}, {mot: "Inviter les tendances", equivalent: "Demandes d’avis"}, {mot: "Dernières critiques", equivalent: "Derniers avis"}, {mot: "Dernières demandes de révision", equivalent: "Dernières demandes de révision"}, {mot: "Analyse des tendances", equivalent: "Analyse des avis"}, {mot: "Prochain", equivalent: "Suivant"}, {mot: "In Library", equivalent: "Accéder"}, {mot: "Resume Course", equivalent: "Reprendre mon cours"}, {mot: "Lessons Completed", equivalent: "Cours complété(s)"}, {mot: "Start Quiz", equivalent: "Commencer"}, {mot: "Previous", equivalent: "Précédent"}, {mot: "Next", equivalent: "Suivant"}, {mot: "Lesson", equivalent: "Cours"}, {mot: " of ", equivalent: " de "}, {mot: "Mark As Complete", equivalent: "Marquer terminé"}, {mot: "My Courses", equivalent: "Mes cours"}, {mot: "Google Business Profile", equivalent: "Profil Google Business"}, {mot: "(Last 30 Days)", equivalent: "(30 derniers jours)"}, {mot: "Total views", equivalent: "Vues totales"}, {mot: "Bookings", equivalent: "Réservations"}, {mot: "Website visits", equivalent: "Visites site web"}, {mot: "Calls", equivalent: "Appels"}, {mot: "(Last 12 months)", equivalent: "(12 derniers mois)"}, {mot: "Tasks", equivalent: "Tâches"}, {mot: "Pending", equivalent: "En attente"}, {mot: "No data found", equivalent: "Aucune donnée disponible"}, {mot: "Google Ads Report", equivalent: "Rapport Google Ads"}, {mot: "Facebook Ads Report", equivalent: "Rapport Facebook Ads"}, {mot: "Total Visitors", equivalent: "Total visiteurs"}, {mot: "Total Page Views", equivalent: "Total pages vues"}, {mot: "Direct Views", equivalent: "Vues directes"}, {mot: "Paid Views", equivalent: "Vues sponsorisées"}, {mot: "Social Views", equivalent: "Vues réseaux sociaux"}, {mot: "Organic Views", equivalent: "Vue organiques"}, {mot: "Stage Distribution", equivalent: "Résultats des appels"}, {mot: "Win%", equivalent: "Signé%"}, {mot: "Won", equivalent: "Signé"}, {mot: "won", equivalent: "signé"}, {mot: "Open", equivalent: "En cours"}, {mot: "open", equivalent: "en cours"}, {mot: "Lost", equivalent: "Perdu"}, {mot: "lost", equivalent: "perdu"}, {mot: "Abandoned", equivalent: "Abandonné"}, {mot: "abandoned", equivalent: "abandonné"}, {mot: "Total Values", equivalent: "Valeur totale"}, {mot: "Switch to Sub-Account", equivalent: "Passer au sous-compte"}, {mot: "All", equivalent: "Tous"}, {mot:"Active services", equivalent:"Services actifs"}, {mot:"Day", equivalent:"Jour"}, {mot:"Add New Service", equivalent:"Ajouter nouveau service"}, {mot:"Month", equivalent:"Mois"}, {mot:"Social Profiles", equivalent:"Profils réseaux sociaux"}, {mot:"Week", equivalent:"Semaine"}, {mot:"Task", equivalent:"Tâches"}, {mot:"Calendars", equivalent:"Calendriers"}, {mot:"Account Details", equivalent:"Détails du compte"}, {mot:"Today", equivalent:"Aujourd'hui"}, {mot:"January", equivalent:"Janvier"}, {mot:"February", equivalent:"Février"}, {mot:"March", equivalent:"Mars"}, {mot:"April", equivalent:"Avril"}, {mot:"May", equivalent:"May"}, {mot:"June", equivalent:"Juin"}, {mot:"July", equivalent:"Juillet"}, {mot:"August", equivalent:"Août"}, {mot:"September", equivalent:"Septembre"}, {mot:"October", equivalent:"Octobre"}, {mot:"November", equivalent:"Novembre"}, {mot:"December", equivalent:"Décembre"}, {mot:"Users", equivalent:"Utilisateurs"}, {mot:"User ", equivalent:"Utilisateur"}, {mot:"Search for", equivalent:"Rechercher"}, {mot:"Updates", equivalent:"Mises à jour "}, {mot:"Update ", equivalent:"Actualiser"}, {mot:"Confirmed", equivalent:"Confirmé"}, {mot:"Name", equivalent:"Nom"}, {mot:"Status", equivalent:"Statut"}, {mot:"Title", equivalent:"Titre"}, {mot:"Requested time", equivalent:"Temps requis"}, {mot:"Date added", equivalent:"Date ajoutée"}, {mot:"Appointment owner", equivalent:"Responsable du RDV"}, {mot:"Load more", equivalent:"Charger plus"}, {mot:"Latest - all", equivalent:"Tous les derniers"}, {mot:"Unread", equivalent:"Non lu"}, {mot:"Appointments", equivalent:"Rendez-vous"}, {mot:"All", equivalent:"Tous "}, {mot:"Type a message", equivalent:"Rédiger un message"}, {mot:"Clear", equivalent:"Effacer"}, {mot:"Send", equivalent:"Envoyer"}, {mot:"No conversation selected", equivalent:"Aucune discussion sélectionnée"}, {mot:"No contact selected", equivalent:"Aucun contact sélectionné"}, {mot:"No unread conversation", equivalent:"Aucune discussion non lue"}, {mot:"First name", equivalent:"Prénom"}, {mot:"Last name", equivalent:"Nom "}, {mot:"Phone", equivalent:"Téléphone"}, {mot:"Date of birth", equivalent:"Date de naissance"}, {mot:"Contact type", equivalent:"Type de contact"}, {mot:"Sex", equivalent:"Sexe"}, {mot:"General info", equivalent:"Infos générales"}, {mot:"Additional info", equivalent:"Infos supplémentaires"}, {mot:"Business name", equivalent:"Nom de l'entreprise"}, {mot:"Street address", equivalent:"Adresse postale"}, {mot:"City", equivalent:"Ville"}, {mot:"Country", equivalent:"Pays"}, {mot:"State", equivalent:"Etat"}, {mot:"Postal code", equivalent:"Code postal"}, {mot:"Website", equivalent:"Site Web"}, {mot:"Time zone", equivalent:"Fuseau horaire"}, {mot:"Alert", equivalent:"Alerte"}, {mot:"Report", equivalent:"Rapport"}, {mot:"Channel", equivalent:"Réseau "}, {mot:"Booked by lead", equivalent:"Réservé par le prospect"}, {mot:"Other", equivalent:"Autre"}, {mot:"Lost connection, make sure you are connected to the internet and refresh the page.", equivalent:"Connexion perdue, assurez-vous que vous êtes connecté à Internet"}, ]; // Sélectionne tous les éléments de la page let elements = document.getElementsByTagName('*'); // Parcourt tous les éléments pour remplacer le texte for (let i = 0; i < elements.length; i++) { let element = elements[i]; // Vérifie si l'élément est un noeud de texte if (element.nodeType === 3) { let texte = element.nodeValue; // Remplace toutes les occurrences des mots spécifiés par leurs équivalents motsAChanger.forEach(obj => { texte = texte.replace(new RegExp(obj.mot, 'g'), obj.equivalent); }); // Assigne le nouveau texte à l'élément if (texte !== element.nodeValue) { element.nodeValue = texte; } } else if (element.hasChildNodes()) { // Récursivement, parcourt les enfants de l'élément for (let j = 0; j < element.childNodes.length; j++) { let childNode = element.childNodes[j]; // Vérifie si le noeud enfant est un noeud de texte if (childNode.nodeType === 3) { let texte = childNode.nodeValue; // Remplace toutes les occurrences des mots spécifiés par leurs équivalents motsAChanger.forEach(obj => { texte = texte.replace(new RegExp(obj.mot, 'g'), obj.equivalent); }); // Assigne le nouveau texte au noeud enfant if (texte !== childNode.nodeValue) { childNode.nodeValue = texte; } } } } } } // Création d'un observateur de mutations pour surveiller les changements dans le DOM const observer = new MutationObserver(handleMutations); // Configuration de l'observateur pour observer les changements dans les nœuds enfants, les attributs et le texte des nœuds const observerConfig = { childList: true, subtree: true, characterData: true }; // Démarrage de l'observation du DOM avec la configuration spécifiée observer.observe(document.body, observerConfig); // Exécuter la fonction initiale pour traiter les éléments existants lors de l'initialisation executeWhenPageChanged(); function gup( name ) { name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); var regexS = "[\\?&]"+name+"=([^&#]*)"; var regex = new RegExp( regexS ); var results = regex.exec( window.location.href ); if( results == null ) return ""; else return results[1]; } if(gup("popup") == "confirm"){ alert("Merci d'avoir mis votre contact à jour"); }