Rss

  • youtube
  • linkedin
  • google

Archives for : Javascript

Codigo de validação de CPF para Javascript

O código abaixo é de uma função em Javascript otimizada para ter o menor numero de complexidade ciclomática linhas que consegui baseado na explicação presente no artigo Algoritimo de validação de CPF brasileiro – Cadastro de Pessoa Física. Ele tem uma ligeira alteração no momento do cálculo do segundo digitido verificador. Ao invés de começar pelo segundo algarismo, o codigo começa pelo primeiro e usa o valor 11 como multiplicador. Outra alteração visivel é que para evitar a necessidade de comparação para saber se estamos no nono e decimo digitos, atribuo o valor zero ao ultimo elemento (indice 10) para reduzir mais uma comparação.

O algoritmo utilizado é o método 1 explicado no artigo e há um pequeno truque para evitar a comparação com o resto igual a 10 que é fazer o módulo de 10 do resto.

   // Codigo que valida um CPF informado quanto a validade de seus dígitos verificadores.

const validarCpf = (cpf) => {
  if (cpf.length !== 11) { // Supõe-se já vir filtrado o valor
    return false;
  }
  let elementos = cpf.split(''); // convertendo a string em array
  elementos[10] = 0; // Forçando ao valor da ultima multiplicacao ser zero
  let somaA = 0;
  let somaB = 0;

  elementos.reduce(function(i, valor, indice) {
    let multiplicador = 11 - indice;
    somaB += (valor * multiplicador);
    somaA += (valor * (multiplicador > 2 ? multiplicador - 1 : 0));
  }, somaA);
  let moduloA = ((somaA * 10) % 11) % 10;
  let moduloB = ((somaB * 10) % 11) % 10;
  return cpf.replace(/\d{9}(\d{2})$/g, '$1') == ("" + moduloA + moduloB);
}

Você pode testar esse código aqui.

DataTables + HTML 5 Botões de exportação + Laravel-Mix (Webpack)

Nos últimos dias, Eu experimentei um problema ao tentar usar DataTables e Bootstrap 4 com suporte para exportar os resultados para Excel e PDF usando Laravel-Mix. Após horas e horas tentando colocar todos os scripts para trabalharem juntos, Eu finalmente consegui. Então, decidi escrever este pequeno Como Fazer para aqueles com o mesmo tipo de problemas.



Continue lendo >>

Usando jQueryMask Plugin para formatar datas em diferentes padrões

jQuery Mask Plugin é uma grande biblioteca de Javascript para formatar campos para apresentação e/ou para forçar uma entrada corretamente pelos utilizadores.

Aqui, Eu Mostro como lidar com INPUT ou outro elemento HTML para exibir datas quando a data de origem tem um formato diferente do elemento de destino.

Exemplo:

  • Temos um data-hora com Ano-mês-dia hora:Minuto:Segundos e é preciso mostrar apenas o fragmento Ano/Mês/Dia (sem hora:minuto:segundo).
  • Temos da data em Ano-mês-dia e é preciso formatar para Dia/mês/ano.

jQueryMask é muito simples de usar. Ele não precisa muito para mascarar o que você precisar. Veja exemplos em seu site.

Se você precisa formatar um campo de data simples (mesmo em um elemento não INPUT), Basta usar o código abaixo.

jQuery('[dados-papel ="Data"]).máscara("TC99/M9/D9", {
        espaço reservado: "____/__/__",
        Tradução: {
            "D": {padrão: /[0-3]/, opcional: falso, recursiva: true},
            "M": {padrão: /[01]/, opcional: falso, recursiva: true},
            "T": {padrão: /[12]/, opcional: falso, recursiva: true},
            "C": {padrão: /[09]/, opcional: falso, recursiva: true}
        }
    });

O código acima pode mascarar e pre-validar datas no formato ANO/MÊS/DIA ..

Com um INPUT como

<;tipo de entrada ="texto" dados-papel ="Data" valor ="2018-06-11 15:47" />;

teria alterado seu valor para 2018/06/11.

Se você tentar digitar outra data (depois de limpar, é claro) Você não pode começar com um número diferente de 1 ou 2. Por esta razão é que a nossa máscara tem um translation para ser feito quando permitindo caracteres. Se não coincide com o padrão, o caractere é apagado.

The meaning of “;TC99/M9/D9; é:

  • Deve começar com 1 ou 2 (Tradução T: /[12]/ ; Formato personalizado)
  • Deve ter número 0 ou 9 (Tradução de C: /[09]/ ; Formato personalizado)
  • Deve ter um número (qualquer) (Tradução 9 ; Formato do Core MaskPlugin)
  • Deve ter um número (qualquer) (Tradução 9 ; Formato do Core MaskPlugin)
  • Uma barra será adicionada automaticamente ( / )
  • Deve ter número 0 ou 1 (Tradução M: /[01]/ ; Formato personalizado)
  • Deve ter um número (qualquer) (Tradução 9: Formato do Core MaskPlugin)
  • Uma barra será adicionada automaticamente ( / )
  • Deve ter número 0, 1, 2 ou 3 (Tradução D: /[0-3]/ ; Formato personalizado)
  • Deve ter um número (qualquer) (Tradução 9: Formato do Core MaskPlugin)

É claro, Não há nenhuma validação real. You can type “;2999/19/39; e isto não é uma data válida, Mas está quase pronto.

Então, para Formatar de outra maneira, Basta alterar a ordem de parâmetro de máscara.

Mas, se a data de origem estiver em um padrão diferente, como dia/mês/ano, a máscara não funciona. The date output for “;06/11/2018 15:40; will be weird “;1018/15/0;.

Para manipular data diferente formatos serão necessários mais do que simples máscara. Vamos precisar de uma função.

Veja o código abaixo

        var maskBehaviorDateTime = função (Val, e, campo) { // Esta função deve retornar uma máscara var msk = "TC99/M9/D9"; // Nosso formato desejado var v = field.is('entrada') ? Field.Val() : Field.Text(); // é uma entrada ou outro elemento html??
                    v = v.replace(/\D/g, ''); // listra de dígitos não se (v != '') { // tem valor?
                        se ((/^[01]\d[0-3]\dd{4}$/).teste(v)) { //testar se o padrão corresponde a v único dia/mês/ano = v.replace(/^(\d{4})(\d{2})(\d{2})$/, ' $3 / $2 / $1 ');
                        } senão se ((/^[01]\d[0-3]\dd{4}[012]\d[0-5]\d$ /).teste(v)) { //teste se o padrão corresponde a hora do dia/mês/ano:Minuto v = v.replace(/^(\d{2})(\d{2})(\d{4})(\d{2})(\d{2})$/, ' $3 / $2 / $1 ');
                            // Se nós precisamos mostrar a hora e minuto, máscara retornada deve ser também mudou
                            // v = v.replace(/^(\d{2})(\d{2})(\d{4})(\d{2})(\d{2})$/, ' $3 / $2 / $1 $4:$5');
                            // MSK = ' TC99/M9/D9 h9:M9'; // h e m devem ser existe em opções de tradução
                        }
                        Field.is('entrada') ? Field.Val(v) : Field.Text(v);
                    }
                    retornar a msk;
                },
                optionsDateTime = {
                    espaço reservado: "____/__/__",
                    Tradução: {
                        "D": {padrão: /[0-3]/, opcional: falso, recursiva: true},
                        "M": {padrão: /[01]/, opcional: falso, recursiva: true},
                        "T": {padrão: /[12]/, opcional: falso, recursiva: true},
                        "C": {padrão: /[09]/, opcional: falso, recursiva: true},
                        "h": {padrão: /[0-2]/, opcional: true, recursiva: true},
                        "m": {padrão: /[0-5]/, opcional: true, recursiva: true}
                    }
                };
        jQuery('[dados-papel ="Data"]').máscara(maskBehaviorDateTime,  optionsDateTime);

Agora temos mais dois Translation Pattern (h e m). h significa que a posição n-índice deverá ter números 0, 1 ou 2 e m números entre 0 e 5. Tenha em mente que o CASO importa.

Com o código acima, Podemos Formatar e mostrar data de várias maneiras. Apenas mude .teste() e .Substitua() padrão para preencher seu padrão desejado.

Este é o código que estou usando para formatar os campos datetime do banco de dados com ANO-MÊS-DIA HORA:MINUTO:SEGUNDO em elementos html com dia/mês/ano hora:MINUTO

    var maskBehaviorDateTime = função (Val, e, campo) {
            // Caso já exista um valor, o formata no padrão dd/mm/yyyy com o opcional hh:mm:SS var msk = "TC99/M9/D9 h9:M9:S9";
            se (field.attr("data-original-value") == undefined) {
                var o = field.is('entrada') ? Field.Val() : Field.Text();
            } else {
                var o = field.attr("data-original-value");
            }
            v = o.replace(/\D/g, '');
            se (v != '') {
                field.attr("data-original-value") == undefined &;&; field.attr("data-original-value", o);
                se ((/^[12][09]\d{2}[01]\d[0123]\d$ /).teste(v)) { // ano/mês/dia v = v.replace(/^(\d{4})(\d{2})(\d{2})$/, ' $3 / $2 / $1 ');
                    MSK = "D9/M9/TC99";
                } else  if ((/^[12][09]\d{2}[01]\d[0123]\d[012]\d[0-5]\d$ /).teste(v)) { // ano/mês/dia/hora:minuto v = v.replace(/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})$/, ' $3 / $2 / $1 $4:$5');
                    MSK = "D9/M9/TC99 h9:M9";
                } senão se ((/^[12][09]\d{2}[01]\d[0123]\d[012]\d[0-5]\d[0-5]\d$ /).teste(v)) { // ano/mês/dia/hora:minuto:segundo v = v.replace(/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/, ' $3 / $2 / $1 $4:$5:$6');
                    MSK = "D9/M9/TC99 h9:M9:S9";
                }
                Field.is('entrada') ? Field.Val(v) : Field.Text(v);
            }

            retornar a msk;
        },
        optionsDateTime = {
            espaço reservado: "__/__/____",
            Tradução: {
                "D": {padrão: /[0-3]/, opcional: falso, recursiva: true},
                "M": {padrão: /[01]/, opcional: falso, recursiva: true},
                "T": {padrão: /[12]/, opcional: falso, recursiva: true},
                "C": {padrão: /[09]/, opcional: falso, recursiva: true},
                "h": {padrão: /[0-2]/, opcional: true, recursiva: true},
                "m": {padrão: /[0-5]/, opcional: true, recursiva: true},
                "s": {padrão: /[0-5]/, opcional: true, recursiva: true}
            },
        };
    jQuery('[dados-papel ="Data"]').máscara(maskBehaviorDateTime,  optionsDateTime);

Com um INPUT como

<;tipo de entrada ="texto" dados-papel ="Data" valor ="2018-06-11 15:40">;

Saída será

11/06/2018 15:40

Espero que isto ajude a!