Zendesk Tag Comparison

Generates a more human readable tag comparison in the events menu.

Você precisará instalar uma extensão como Tampermonkey, Greasemonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Userscripts para instalar este script.

Você precisará instalar uma extensão como o Tampermonkey para instalar este script.

Você precisará instalar um gerenciador de scripts de usuário para instalar este script.

(Eu já tenho um gerenciador de scripts de usuário, me deixe instalá-lo!)

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

(Eu já possuo um gerenciador de estilos de usuário, me deixar fazer a instalação!)

// ==UserScript==
// @name         Zendesk Tag Comparison
// @namespace    http://tampermonkey.net/
// @version      1.1.3
// @description  Generates a more human readable tag comparison in the events menu.
// @author       You
// @match        https://*.zendesk.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    function compareTags(previous_tags_string, current_tags_string) {
        let previous_tags = previous_tags_string.split(" ");
        let current_tags = current_tags_string.split(" ");

        let matching_tags = new Set();

        let new_tags = new Set();
        let lost_tags = new Set();

        if (previous_tags_string != "" && current_tags_string != "") {
            for (const previous_tag of previous_tags) {
                for (const current_tag of current_tags) {
                    if (previous_tag == current_tag) {
                        matching_tags.add(previous_tag);
                    }
                }
            }

            for (const current_tag of current_tags) {
                if (!matching_tags.has(current_tag)) {
                    new_tags.add(current_tag);
                }
            }

            for (const previous_tag of previous_tags) {
                if (!matching_tags.has(previous_tag)) {
                    lost_tags.add(previous_tag);
                }
            }
        }

        return {
            matching: matching_tags,
            new: new_tags,
            lost: lost_tags
        }
    }

    function replaceTags() {
        let xpath = "//li[@class='Change']/div/label[text()='Tags']/..";
        let result = document.evaluate(xpath, document, null, XPathResult.ANY_TYPE, null);

        let found_node;
        let found_nodes = [];
        while (found_node = result.iterateNext()) {
            found_nodes.push(found_node);
        }

        for (let node of found_nodes) {
            let previous_tags = node.childNodes[9].innerText;
            let current_tags = node.childNodes[3].textContent;

            let comparison_data = compareTags(previous_tags, current_tags);
            let save_via = node.querySelector(".via");

            node.innerHTML = "<label>Tag Changes</label>";

            for (const tag of comparison_data.new) {
                node.innerHTML += "<div style=\"color:green;\">➕ " + tag + "</div>";
            }

            for (const tag of comparison_data.lost) {
                node.innerHTML += "<div style=\"color:red;\">➖ " + tag + "</div>";
            }
            node.innerHTML += "<div>" + current_tags + "</div>";
            node.innerHTML += "<div><del>" + previous_tags + "</del></div>";

            node.appendChild(save_via);
        }
    }

    setInterval(replaceTags, 1000);
})();