Mostrar Senha Dealernet

Adiciona um botão que enquanto pressionado, mostra a senha digitada.

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Mostrar Senha Dealernet
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Adiciona um botão que enquanto pressionado, mostra a senha digitada.
// @match        http*://*.dealernetworkflow.com.br/LoginAux.aspx*
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    // Função para adicionar o botão de alternância
    function adicionarAlternadorSenha() {
        // Encontra o campo de senha específico
        let campoSenha = document.getElementById('vUSUARIOSENHA_SENHA');

        // Se o campo não existir nesta página, saia
        if (!campoSenha) return;

        // Criar o ícone do olho usando SVG
        const iconeOlho = document.createElement('span');
        iconeOlho.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512" width="18" height="18">
            <path d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM144 256a144 144 0 1 1 288 0 144 144 0 1 1 -288 0zm144-64c0 35.3-28.7 64-64 64c-7.1 0-13.9-1.2-20.3-3.3c-5.5-1.8-11.9 1.6-11.7 7.4c.3 6.9 1.3 13.8 3.2 20.7c13.7 51.2 66.4 81.6 117.6 67.9s81.6-66.4 67.9-117.6c-11.1-41.5-47.8-69.4-88.6-71.1c-5.8-.2-9.2 6.1-7.4 11.7c2.1 6.4 3.3 13.2 3.3 20.3z"/>
        </svg>`;
        iconeOlho.style.cssText = `
            position: absolute;
            right: 10px;
            top: 52%;
            transform: translateY(-50%);
            cursor: pointer;
            user-select: none;
            z-index: 1000;
            display: flex;
            align-items: center;
        `;

        // Obter o elemento TD pai
        const tdPai = campoSenha.parentElement;

        // Definir o TD para posicionamento relativo
        tdPai.style.position = 'relative';

        // Adicionar o ícone do olho ao TD
        tdPai.appendChild(iconeOlho);

        // Armazenar estado original
        let tipoOriginal = campoSenha.type;
        let classesOriginais = campoSenha.className;

        // Rastrear estado de visibilidade
        let estaVisivel = false;

        // Função para mostrar a senha
        function mostrarSenha() {
            if (estaVisivel) return;
            estaVisivel = true;

            // Armazenar valor atual
            const valorAtual = campoSenha.value;

            // Armazenar propriedades do campo
            const propriedadesCampo = {
                id: campoSenha.id,
                nome: campoSenha.name,
                tamanho: campoSenha.size,
                comprimentoMaximo: campoSenha.maxLength,
                estilo: campoSenha.style.cssText,
                aoFocar: campoSenha.onfocus,
                aoDesfocar: campoSenha.onblur,
                aoMudar: campoSenha.onchange
            };

            // Remover campo antigo
            campoSenha.remove();

            // Criar novo campo
            const novoCampo = document.createElement('input');
            novoCampo.type = 'text';
            novoCampo.id = propriedadesCampo.id;
            novoCampo.name = propriedadesCampo.nome;
            novoCampo.value = valorAtual;
            novoCampo.size = propriedadesCampo.tamanho;
            novoCampo.maxLength = propriedadesCampo.comprimentoMaximo;
            novoCampo.className = classesOriginais.replace('InputPassword', 'InputText');
            novoCampo.style.cssText = propriedadesCampo.estilo;
            novoCampo.onfocus = propriedadesCampo.aoFocar;
            novoCampo.onblur = propriedadesCampo.aoDesfocar;
            novoCampo.onchange = propriedadesCampo.aoMudar;

            // Inserir novo campo
            tdPai.insertBefore(novoCampo, iconeOlho);

            // Atualizar referência
            campoSenha = novoCampo;

            // Estilizar o ícone do olho
            iconeOlho.style.opacity = '0.7';
            iconeOlho.title = 'Solte para esconder a senha';

            // Reaplicar atributo autocomplete="off"
            if (typeof gx !== 'undefined' && gx.dom) {
                gx.dom.setAttribute(campoSenha.id, "autocomplete", "off");
            }
        }

        // Função para esconder a senha
        function esconderSenha() {
            if (!estaVisivel) return;
            estaVisivel = false;

            // Armazenar valor atual
            const valorAtual = campoSenha.value;

            // Armazenar propriedades do campo
            const propriedadesCampo = {
                id: campoSenha.id,
                nome: campoSenha.name,
                tamanho: campoSenha.size,
                comprimentoMaximo: campoSenha.maxLength,
                estilo: campoSenha.style.cssText,
                aoFocar: campoSenha.onfocus,
                aoDesfocar: campoSenha.onblur,
                aoMudar: campoSenha.onchange
            };

            // Remover campo antigo
            campoSenha.remove();

            // Criar novo campo
            const novoCampo = document.createElement('input');
            novoCampo.type = 'password';
            novoCampo.id = propriedadesCampo.id;
            novoCampo.name = propriedadesCampo.nome;
            novoCampo.value = valorAtual;
            novoCampo.size = propriedadesCampo.tamanho;
            novoCampo.maxLength = propriedadesCampo.comprimentoMaximo;
            novoCampo.className = classesOriginais;
            novoCampo.style.cssText = propriedadesCampo.estilo;
            novoCampo.onfocus = propriedadesCampo.aoFocar;
            novoCampo.onblur = propriedadesCampo.aoDesfocar;
            novoCampo.onchange = propriedadesCampo.aoMudar;

            // Inserir novo campo
            tdPai.insertBefore(novoCampo, iconeOlho);

            // Atualizar referência
            campoSenha = novoCampo;

            // Estilizar o ícone do olho
            iconeOlho.style.opacity = '1';
            iconeOlho.title = 'Mantenha pressionado para ver a senha';

            // Reaplicar atributo autocomplete="off"
            if (typeof gx !== 'undefined' && gx.dom) {
                gx.dom.setAttribute(campoSenha.id, "autocomplete", "off");
            }
        }

        // Adicionar event listeners de mousedown e mouseup ao ícone do olho
        iconeOlho.addEventListener('mousedown', function(e) {
            e.preventDefault(); // Prevenir seleção de texto
            mostrarSenha();
        });

        iconeOlho.addEventListener('mouseup', esconderSenha);
        iconeOlho.addEventListener('mouseleave', esconderSenha);

        // Para dispositivos touch
        iconeOlho.addEventListener('touchstart', function(e) {
            e.preventDefault();
            mostrarSenha();
        });

        iconeOlho.addEventListener('touchend', esconderSenha);
        iconeOlho.addEventListener('touchcancel', esconderSenha);

        // Definir título inicial
        iconeOlho.title = 'Mantenha pressionado para ver a senha';
    }

    // Função para verificar e adicionar o alternador repetidamente
    function verificarEAdicionarAlternador() {
        const campoSenha = document.getElementById('vUSUARIOSENHA_SENHA');
        if (campoSenha) {
            // Verificar se já adicionamos o ícone do olho
            const tdPai = campoSenha.parentElement;
            if (tdPai && !tdPai.querySelector('span[title="Mantenha pressionado para ver a senha"]') &&
                !tdPai.querySelector('span[title="Solte para esconder a senha"]')) {
                adicionarAlternadorSenha();
            }
        }
    }

    // Executar o script após a página ser carregada
    window.addEventListener('load', verificarEAdicionarAlternador);

    // Também tentar executá-lo quando o DOM estiver pronto
    document.addEventListener('DOMContentLoaded', verificarEAdicionarAlternador);

    // Para páginas que carregam conteúdo dinamicamente, verificar periodicamente
    setInterval(verificarEAdicionarAlternador, 1000);
})();