您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Améliore l'interface Zendesk et ajoute des fonctionnalités supplémentaires
- // ==UserScript==
- // @name Zendesk Enhancements
- // @namespace http://tampermonkey.net/
- // @version 1.3.3
- // @description Améliore l'interface Zendesk et ajoute des fonctionnalités supplémentaires
- // @author Morgan & gann
- // @match https://*.zendesk.com/*
- // @grant GM_addStyle
- // @license MIT
- // ==/UserScript==
- (function() {
- 'use strict';
- // Définition d'un style commun pour les éléments personnalisés
- var customCSS = `
- .custom-button, .djm-task-link, .copy-conversation-button {
- padding: 5px 10px;
- background-color: limegreen;
- font-size: 16px;
- color: black;
- border: 1px solid transparent;
- border-radius: 4px;
- cursor: pointer;
- text-align: center;
- text-decoration: none;
- display: inline-block;
- margin: 5px;
- transition: background-color 0.15s ease, color 0.15s ease;
- &:hover {
- background-color: darkgreen; /* Couleur de fond au survol */
- color: white; /* Couleur du texte au survol */
- }
- }
- .sc-1oduqug-0.jdCBDY {
- margin-top: 30px;
- }
- iframe#web-messenger-container {
- display: none;
- }
- .app_view.app-1019154.apps_ticket_sidebar iframe {
- height: 80vh!important;
- }
- /* Enhence copy conversation btn */
- .sc-1nvv38f-3.cjpyOe {
- flex: unset;
- }
- /*Enhence next conversation btn */
- .jGrowl-notification {
- top: 30px;
- }
- `;
- GM_addStyle(customCSS);
- // Initialisation des fonctions personnalisées
- setTimeout(function() {
- customFunction()
- }, 500);
- function customFunction(message) {
- setTimeout(function() {
- checkUrlAndRunScriptInitializeInputLinks();
- checkUrlAndRunScriptTransformUrlsToLinks();
- }, 500);
- }
- // Écoute les changements de navigation
- window.addEventListener('popstate', function() {
- customFunction('Chemin changé: ' + window.location.pathname);
- });
- // Surcharge des méthodes d'historique
- function overrideHistoryMethod(methodName) {
- var originalMethod = history[methodName];
- history[methodName] = function(state) {
- if (typeof history['on' + methodName] == "function") {
- history['on' + methodName]({state: state});
- }
- customFunction('Chemin changé par ' + methodName + ': ' + window.location.pathname);
- return originalMethod.apply(history, arguments);
- };
- }
- overrideHistoryMethod('pushState');
- overrideHistoryMethod('replaceState');
- window.history.onpushstate = function(e) {
- window.dispatchEvent(new CustomEvent('pushstate', e));
- };
- window.history.onreplacestate = function(e) {
- window.dispatchEvent(new CustomEvent('replacestate', e));
- };
- // Événements sur les en-têtes de tableau
- var theads = document.querySelectorAll('thead');
- theads.forEach(function(thead) {
- thead.addEventListener('click', function(event) {
- customFunction('Un thead a été cliqué' + event.target);
- });
- });
- function transformUrlsToLinks() {
- const cells = document.querySelectorAll('.beWvMU');
- const urlRegex = /(https?:\/\/[^\s]+)/g;
- if (cells.length > 0) {
- cells.forEach((cell, index) => {
- const textContent = cell.textContent;
- if (urlRegex.test(textContent)) {
- const link = document.createElement('a');
- link.setAttribute('href', textContent.match(urlRegex)[0]);
- link.textContent = textContent.match(urlRegex)[0];
- link.classList.add('custom-button');
- cell.textContent = '';
- cell.appendChild(link);
- }
- });
- }
- }
- function checkUrlAndRunScriptTransformUrlsToLinks() {
- if (window.location.pathname.startsWith('/agent/filters/')) {
- transformUrlsToLinks();
- }
- }
- function initializeInputLinks() {
- var inputElements = document.querySelectorAll('.custom_field_14504424601628 input');
- inputElements.forEach(function(inputElement) {
- var existingLink = inputElement.parentNode.parentNode.querySelector('.djm-task-link');
- if (existingLink) {
- existingLink.remove();
- }
- var linkElement = document.createElement('a');
- linkElement.textContent = 'Tâche';
- linkElement.style.display = 'none';
- linkElement.classList.add('djm-task-link');
- inputElement.parentNode.parentNode.insertBefore(linkElement, inputElement.nextSibling);
- checkForUrl(inputElement, linkElement);
- inputElement.addEventListener('input', function() {
- console.log('Événement input détecté.');
- checkForUrl(inputElement, linkElement);
- });
- });
- }
- function checkForUrl(inputElement, linkElement) {
- if (inputElement.value.match(/(https?:\/\/[^\s]+)/g)) {
- linkElement.href = inputElement.value;
- linkElement.style.display = 'inline-block';
- } else {
- linkElement.style.display = 'none';
- }
- }
- function checkUrlAndRunScriptInitializeInputLinks() {
- if (window.location.pathname.startsWith('/agent/tickets/')) {
- initializeInputLinks();
- }
- }
- // Fonction pour fermer tous les onglets inactifs
- function closeInactiveTabs() {
- const closeButtons = [...document.querySelectorAll('div[role="tab"][data-selected="false"] button[data-test-id="close-button"]')];
- closeButtons.forEach(btn => btn.click());
- }
- // Fonction pour ajouter le bouton "Close All"
- function addCloseAllButton() {
- const toolbar = document.querySelector('div[data-test-id="header-tablist"] > div.sc-19uji9v-0');
- if (toolbar && !document.getElementById('close-all-button')) {
- const closeButton = document.createElement('button');
- closeButton.id = 'close-all-button';
- closeButton.textContent = 'X Close all';
- closeButton.className = 'custom-button';
- closeButton.addEventListener('click', closeInactiveTabs);
- toolbar.appendChild(closeButton);
- }
- }
- // Ajout du bouton "Close All" au chargement de la page
- window.addEventListener('load', addCloseAllButton);
- // Observer les changements dans le DOM pour charger dynamiquement le bouton
- const observer = new MutationObserver(addCloseAllButton);
- observer.observe(document.body, { childList: true, subtree: true });
- function addCopyButtons() {
- // Get all 'ember-view workspace has-play' elements
- const workspaces = document.querySelectorAll('.ember-view.workspace');
- workspaces.forEach((workspace, index) => {
- // Find the 'sc-1nvv38f-3 cjpyOe' element within each workspace
- const headerElement = workspace.querySelector('.sc-1nvv38f-3.cjpyOe');
- if (headerElement) {
- // Check if the button already exists to avoid duplicates
- if (!headerElement.querySelector('.copy-conversation-button')) {
- // Create a new button
- const button = document.createElement('button');
- button.innerText = 'Copy Conversation';
- button.style.marginLeft = '10px';
- button.classList.add('copy-conversation-button'); // Add a class for easy selection
- // Add the click event to copy conversation text
- button.addEventListener('click', () => {
- // Find the conversation text container
- const conversationContainer = workspace.querySelector('.sc-175iuw8-0.ecaNtR.conversation-polaris.polaris-react-component.rich_text');
- if (conversationContainer) {
- const textToCopy = conversationContainer.innerText;
- // Append "[Ma réponse au client]" to the text
- const modifiedText = textToCopy + '\n[Ma réponse au client]\n';
- // Copy the modified text to clipboard
- copyToClipboard(modifiedText);
- }
- });
- // Append the button to the header element
- headerElement.appendChild(button);
- }
- }
- });
- }
- // Function to copy text to clipboard
- function copyToClipboard(text) {
- navigator.clipboard.writeText(text).catch(err => {
- console.error('Failed to copy text: ', err);
- });
- }
- // Run the function every second
- setInterval(addCopyButtons, 1000);
- })();