Ir para conteúdo

POWERED BY:

Artes Ussler

Editar registro com menu select

Recommended Posts

Boa tarde

 

Achei um código na web que permite definir quais itens que aparecem em um menu select através do que é selecionado em outro menu select. Seria como na imagem:

select.png.2ce0d407110245d315ff5827beb58f3b.png

 

Eis o código completo e funcionando:

<form method="post" action="">
    <select name="categoria" id="sel1" onchange="giveSelection(this.value)">
        <option value="1">Item 1</option>
        <option value="2">Item 2</option>
        <option value="3">Item 3</option>
    </select>

    <select name="subcategoria" id="sel2">
        <option data-option="1" value="1">Subitem 1</option>
        <option data-option="1" value="2">Subitem 2</option>
        <option data-option="2" value="3">Subitem 3</option>
        <option data-option="2" value="4">Subitem 4</option>
        <option data-option="3" value="5">Subitem 5</option>
        <option data-option="3" value="6">Subitem 6</option>
    </select>
</form>
<script type="text/javascript">
    var sel1 = document.querySelector('#sel1');
    var sel2 = document.querySelector('#sel2');
    var options2 = sel2.querySelectorAll('option');

    function giveSelection(selValue) {
        sel2.innerHTML = '';
        for (var i = 0; i < options2.length; i++) {
            if (options2[i].dataset.option === selValue) {
                sel2.appendChild(options2[i]);
            }
        }
    }
    giveSelection(sel1.value);
</script>

Testei este código em um sistema de cadastro de produtos, e funciona muito bem. Esse sistema também possui uma página para a edição dos dados destes produtos, e é aí que surgiu o problema.

Ao abrir a página de edição, eu uso esse mesmo código select , mas acrescento nele selected="selected" para então exibir o item correspondente ao produto editado.

O problema está no segundo select, que ao invés de imediatamente mostrar o subitem correspondente ao que está marcado no primeiro select, ele mostra sempre o último subitem da lista.

 

Não sei se conseguiram entender tudo isso, mas se alguém puder ajudar, fico grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia!

 

Gostaria de rever essa dúvida que postei em abril desse ano. Faz tempo, mas ainda estou precisando disso.


Será que alguém sabe como me ajudar a resolver? Eu já tentei, sério, mas infelizmente sem sucesso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deixa eu ver se entendi....

O seletor "categoria"  tem lá suas opções, mas o seletor "subcategoria" não.

Ao alterar "categoria" obtemos seu value, então "subcategoria" terá as opções correspondentes ao atributo "data"

Resumo: "seletor" no valor for 1, as opções  de "subcategoria" só vão existir as que forem data-option="1"

É isso?

 

Se for, de onde e como vão ser as opções do segundo seletor?

Porque essas opções devem ser criadas e injetadas dentro do segundo seletor, mas criar-las com qual informação?

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, Omar~ disse:

Resumo: "seletor" no valor for 1, as opções  de "subcategoria" só vão existir as que forem data-option="1"

É isso?

Correto, mas no processo de CADASTRO do item, como mencionei, funciona perfeitamente. Minha dificuldade está no processo de EDIÇÃO do registro.

 

Vamos supor a situação: eu fiz um cadastro usando ITEM 2 (categoria) e o SUBITEM 4 (subcategoria). No momento que abro a página de edição desse registro, no menu de categoria deverá aparecer então o ITEM 2 selecionado (o qual consegui fazer) e no menu das subcategorias deveria aparecer então o SUBITEM 4 selecionado, mas acaba aparecendo como selecionado o item 1 e todos os demais itens da lista.

 

Fiz uma representação abaixo:

 menus.png.a3d5e3259077bf21cb85f9177c4201a6.png

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como eu disse:

- De onde vem a informação da sub-categoria e como isso é obtido?

Pois bem, independente dessa minha pergunta, qualquer dados deve está presente o javascript para que quando alterar o valor de categoria temos algo para preencher as subcategorias.

Optei por um JSON com os dados para subcategoria, onde apenas tenho um índice para saber que sub-categoria pertence a cada categoria.

Usei o PHP, para criar o json, mas a abordagem fica só com o javascript mesmo.

No mais o exemplo eu escrevi em cada linha o que é feito (espero que seja algo como isso)

Spoiler

<?php
$categorias = [
    ['id' => 1, 'nome' => 'Categoria 1'],
    ['id' => 2, 'nome' => 'Categoria 2'],
    ['id' => 3, 'nome' => 'Categoria 3'],
    ['id' => 4, 'nome' => 'Categoria 4']
];
$subcategoria = [
    ['id' => 1, 'relacao' => 1, 'nome' => 'Sub-Categoria 1'],
    ['id' => 2, 'relacao' => 1, 'nome' => 'Sub-Categoria 2'],
    ['id' => 3, 'relacao' => 2, 'nome' => 'Sub-Categoria 3'],
    ['id' => 4, 'relacao' => 2, 'nome' => 'Sub-Categoria 4'],
    ['id' => 5, 'relacao' => 3, 'nome' => 'Sub-Categoria 5'],
    ['id' => 6, 'relacao' => 3, 'nome' => 'Sub-Categoria 6'],
    ['id' => 7, 'relacao' => 4, 'nome' => 'Sub-Categoria 7'],
    ['id' => 8, 'relacao' => 4, 'nome' => 'Sub-Categoria 8'],
    ['id' => 9, 'relacao' => 4, 'nome' => 'Sub-Categoria 9'],
    ['id' => 10, 'relacao' => 4, 'nome' => 'Sub-Categoria 10']
];
$dados = json_encode($subcategoria);
?>

<select name="categoria" id="categoria">
    <option value="">Selecione a Categoria...</option>
    <?php
    foreach ($categorias as $value) {
        echo ("<option value=\"{$value['id']}\">{$value['nome']}</option>");
    }
    ?>
</select>

<select name="subcategoria" id="subcategoria"></select>

<script>
    var valoresEmJson = JSON.parse('<?= $dados ?>'), // Então aqui eu tenho o JSON com todas sub-categorias
        categoria = document.getElementById('categoria'),
        subcategoria = document.getElementById('subcategoria');

    function subValor(e) {
        var valor = e.target.value; // Obtenho o valor da "categoria"
        if (valor) { // Vejo se "categoria" tem mesmo algum valor
            removeOpcao(); // Primeiro limpar todas opções inseridas
            valoresEmJson.forEach(function (indice) { // Pecorro o JSON
                if (indice.relacao == valor) { // Quando a relação dos índices em "subcategoria" for igual ao valor selecionado
                    // Mando criar novas opções em "subcategoria"
                    // Enviando como parâmetro o id e o nome, no índice do JSON
                    criarOpcao(indice.id, indice.nome);
                }
            });
        }
    }

    function removeOpcao() { // Apenas limpa as opções do seletor "subcategoria"
        while (subcategoria.childNodes.length) {
            subcategoria.removeChild(subcategoria.firstChild);
        }
    }

    function criarOpcao(id, nome) {
        var novoOption = document.createElement('option'); // Crio a tag <option>
        novoOption.value = id; // Seu valor é o "id" do índice obtido por parâmetro
        novoOption.innerText = nome; // O texto é o nome do índice obtido por parâmetro
        subcategoria.appendChild(novoOption); // Anexo a opção dentro do seletor subcategoria
    }

    categoria.addEventListener('change', subValor, false); // Quando o seletor categoria é alterado

    if (categoria.selectedIndex) { // Se algum valor no seletor "categoria" estiver como a propriedade "selected"
        var evento = new Event('change'); // Crio o evento "change"
        categoria.dispatchEvent(evento); // Despacho o evento sem mesmo o usuário alterar o seletor
    }
</script>

 

Note que a categoria 4 possui 4 sub categorias e as demais somente 2, pois o que interessa é saber a relação, pois é isso de determina a qual categoria um sub pertence.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por violin101
      Caros amigos, saudações.

      Estou com uma dúvida, referente cálculo de valores em tempo real.

      Tenho uma rotina, que faz o cálculo, o problema é mostrar o resultado.

      Quero mostrar o RESULTADO assim: 0,00  ou  0.00

      Abaixo posto o código.
      jQuery('input').on('keyup',function(){ //Remover ponto e trocar a virgula por ponto var m = document.getElementById("pgRest").value; while (m.indexOf(".") >= 0) { m = m.replace(".", ""); } m = m.replace(",","."); //Remover ponto e trocar a virgula por ponto var j = document.getElementById("pgDsct").value; while (j.indexOf(".") >= 0) { j = j.replace(".", ""); } j = j.replace(",","."); m = parseFloat(jQuery('#pgRest').val() != '' ? jQuery('#pgRest').val() : 0); j = parseFloat(jQuery('#pgDsct').val() != '' ? jQuery('#pgDsct').val() : 0); //Mostra o Resultado em Tempo Real jQuery('#pgTroco').val(m - j); <<=== aqui estou errando })  
       
      Grato,
       
      Cesar
       
       
    • Por violin101
      Caro amigos, saudações.

      Tenho uma tabela escrita em JS que funciona corretamente.
       
      Minha dúvida:
      - como devo fazer para quando a Tabela HTML estiver vazia, exibir o LOGO da Empresa ?

      Abaixo posto o script:
      document.addEventListener( 'keydown', evt => { if (!evt.ctrlKey || evt.key !== 'i' ) return;// Não é Ctrl+A, portanto interrompemos o script evt.preventDefault(); //Chama a Função Calcular Qtde X Valor Venda calcvda(); var idProdutos = document.getElementById("idProdutos").value; var descricao = document.getElementById("descricao").value; var prd_unid = document.getElementById("prd_unid").value; var estoque_atual = document.getElementById("estoque_atual").value; var qtde = document.getElementById("qtde").value; var vlrunit = document.getElementById("vlrunit").value; var vlrtotals = document.getElementById("vlrtotal").value; var vlrtotal = vlrtotals.toLocaleString('pt-br', {minimumFractionDigits: 2}); if(validarConsumo(estoque_atual)){ //Chama a Modal com Alerta. $("#modal_qtdemaior").modal(); } else { if(qtde == "" || vlrunit == "" || vlrtotal == ""){ //Chama a Modal com Alerta. $("#modal_quantidade").modal(); } else { //Monta a Tabela com os Itens html = "<tr style='font-size:13px;'>"; html += "<td width='10%' height='10' style='text-align:center;'>"+ "<input type='hidden' name='id_prds[]' value='"+idProdutos+"'>"+idProdutos+"</td>"; html += "<td width='47%' height='10'>"+ "<input type='hidden' name='descricao[]' value='"+descricao+"'>"+descricao+ "<input type='hidden' name='esp[]' value='"+prd_unid+"'> - ESP:"+prd_unid+ "<input type='hidden' name='estoq[]' value='"+estoque_atual+"'></td>"; html += "<td width='10%' height='10' style='text-align:center;'>"+ "<input type='hidden' name='qtde[]' value='"+qtde+"'>"+qtde+"</td>"; html += "<td width='12%' height='10' style='text-align:right;'>"+ "<input type='hidden' name='vlrunit[]' value='"+vlrunit+"'>"+vlrunit+"</td>"; html += "<td width='14%' height='10' style='text-align:right;'>"+ "<input type='hidden' name='vlrtotal[]' value='"+vlrtotal+"'>"+vlrtotal+"</td>"; html += "<td width='12%' height='10' style='text-align:center;'>"+ "<button type='button' class='btn btn-uvas btn-remove-produto' style='margin-right:1%; padding:1px 3px; font-size:12px;' title='Remover Item da Lista'>"+ "<span class='fa fa-minus' style='font-size:12px;'></span></button></td>"; html += "</tr>"; $("#tbventas tbody").append(html); //Função para Somar os Itens do Lançamento somar(); $("#idProdutos").val(null); $("#descricao").val(null); $("#prd_unid").val(null); $("#qtde").val(null); $("#vlrunit").val(null); $("#vlrtotal").val(null); $("#idProdutos").focus(); //Se INCLUIR NOVO produto - Limpa a Forma de Pagamento $("#pgSoma").val(null); $("#pgRest").val(null); $("#pgDsct").val(null); $("#pgTroco").val(null); $("#tbpagar tbody").empty(); }//Fim do IF-qtde }//Fim do Validar Consumo });//Fim da Função btn-agregar  
      Grato,

      Cesar
       
    • Por violin101
      Caros amigos, saudações.

      Estou com uma pequena dúvida se é possível ser realizado.

      Preciso passar 2 IDs para o Sistema executar a função, estou utilizando desta forma e gostaria de saber como faço via JS para passar os parâmetro que preciso.

      Observação:
      Dentro da TABELA utilizei 2 Forms, para passar os IDS que preciso, funcionou conforme código abaixo.
      <div class="card-body"> <table id="tab_clie" class="table table-bordered table-hover"> <thead> <tr> <th style="text-align:center; width:10%;">Pedido Nº</th> <th style="text-align:center; width:10%;">Data Pedido</th> <th style="text-align:center; width:32%;">Fornecedor</th> <th style="text-align:center; width:10%;">Status</th> <th style="text-align:center; width:5%;">Ação</th> </tr> </thead> <tbody> <?php foreach ($results as $r) { $dta_ped = date(('d/m/Y'), strtotime($r->dataPedido)); switch ($r->pd_status) { case '1': $status = '&nbsp;&nbsp;Aberto&nbsp;&nbsp;'; $txt = '#FFFFFF'; //Cor: Branco $cor = '#000000'; //Cor: Preta break; case '2': $status = 'Atendido Total'; $txt = '#FFFFFF'; //Cor: Branco $cor = '#086108'; //Cor: Verde break; case '3': $status = 'Atendido Parcial'; $txt = '#000000'; //Cor: Branco $cor = '#FEA118'; //Cor: Amarelo break; default: $status = 'Cancelado'; $txt = '#FFFFFF'; //Cor: Branco $cor = '#D20101'; //Cor: Vermelho break; } echo '<tr>'; echo '<td width="10%" height="10" style="text-align:center;">'.$r->pd_numero.'</td>'; echo '<td width="10%" height="10" style="text-align:center;">'.$dta_ped.'</td>'; echo '<td width="32%" height="10" style="text-align:left;">'.$r->nome.'</td>'; echo '<td width="10%" height="10" style="text-align:left;"><span class="badge" style="color:'.$txt.'; background-color:'.$cor.'; border-color:'.$cor.'">'.$status.'</span></td>'; echo '<td width="5%" style="text-align:center;">'; ?> <div class="row"> <?php if($this->permission->checkPermission($this->session->userdata('permissao'), 'vPedido')){ ?> <form action="<?= base_url() ?>compras/pedidos/visualizar" method="POST" > <input type="hidden" name="idPedido" value="<?php echo $r->idPedidos; ?>"> <input type="hidden" name="nrPedido" value="<?php echo $r->pd_numero; ?>"> <button class="btn btn-warning" title="Visualizar" style="margin-left:50%; padding: 1px 3px;"><i class="fa fa-search icon-white"></i></button> </form> <?php } if($this->permission->checkPermission($this->session->userdata('permissao'), 'ePedido')){ ?> <form action="<?= base_url() ?>compras/pedidos/editar" method="POST" > <input type="hidden" name="idPedido" value="<?php echo $r->idPedidos; ?>"> <input type="hidden" name="nrPedido" value="<?php echo $r->pd_numero; ?>"> <button class="btn btn-primary" title="Editar" style="margin-left:50%; padding: 1px 3px;"><i class="fa fa-edit icon-white"></i></button> </form> <?php } ?> </div> <?php echo '</td>'; echo '</tr>'; } ?> </tbody> </table> </div>
      Grato,

      Cesar.
    • Por belann
      Olá!
       
      Estou usando o editor quill em uma página html, sem fazer a instalação com npm, mas usando as api´s via internet com http, no entanto não consigo fazer a tecla enter funcionar para mudança de linha, tentei essa configuração abaixo, mas não funcionou.
       
      modules: {       syntax: true,       toolbar: '#toolbar-container',       keyboard: {         bindings: {           enter: {             key: 13,             handler: function(range, context) {                       quill.formatLine(range.index, range.length, { 'align': '' });             }           }  
       
    • Por violin101
      Caros amigos, saudações.
       
      Gostaria de poder tirar uma dúvida com os amigos.
       
      Como faço uma função para Comparar a Data Digitada pelo o Usuário com a Data Atual ?

      Data Digitada:  01/09/2024
       
      Exemplo:
      25/09/2024 é menor que DATA Atual  ====> mensagem: informe uma data válida.
      25/09/2024 é igual DATA Atual ===> o sistema libera os INPUT's.
       
      Como faço uma comparação com a Data Atual, para não Deixar Gravar Data retroativa a data Atual.
       
      Grato,
       
      Cesar
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.