Como Criar campo zoom passando valores em constraints

Como Criar campo zoom passando valores em constraints

Olá.

Tenta explicar um pouco melhor a sua necessidade.

Criar, on the fly, um campo no formulário não dá muito certo. Mas ter um zoom oculto, exibir no momento certo e trocar seus filtros é possível.

Tenho um select que passo duas constraints para o dataset e ele me devolve os resultados, queria de alguma forma fazer isso com o zoom.

Atualmente uso essa função

function carregarSelect() {
    var coligada = $("#CODCOLIGADA").val();
    var secao = $("#CODSECAO").val();

    var constraints = [];
    if (coligada) {
        constraints.push(DatasetFactory.createConstraint("coligada", coligada, coligada, ConstraintType.MUST));
    }
    if (secao) {
        constraints.push(DatasetFactory.createConstraint("secao", secao, secao, ConstraintType.MUST));
    }

    // Salvar o valor selecionado antes de limpar o select
    var selectedValue = $("#inputFUNCAO").val();

    // Chama o dataset para buscar os dados
    DatasetFactory.getDataset("meuDS", null, constraints, null, {
        success: function(data) {
            var select = $("#inputFUNCAO");
            select.empty();
            select.append('<option value="">Selecione uma função</option>');
            
            // Popula o select com os dados retornados
            for (var i = 0; i < data.values.length; i++) {
                var funcao = data.values[i];
                select.append('<option value="' + funcao.CODFUNCAO + '">' + funcao.NOME + '</option>');
            }

            // Define o valor selecionado novamente
            select.val(selectedValue);
        },
        error: function(err) {
            console.error("Erro ao buscar dados do dataset:", err);
        }
    });

    
}

Um zoom simples seria assim:

<input type="zoom" class="form-control" id="exemplo" name="exemplo" data-zoom="{
    'datasetId':'exemploDs',
    'displayKey':'exemplo_campo',
    'maximumSelectionLength':'1',
    'placeholder':'Um Simples exemplo',
    'fields':[
        {
            'field':'exemplo_campo',
            'label':'Nome do Exemplo',
            'standard':'true'
        }
    ]
}">

Se quiser você já pode chamar o dataset passando filtros pra ele, que chegarão como constraints no dataset:

<input type="zoom" class="form-control" id="exemplo" name="exemplo" data-zoom="{
    'datasetId':'exemploDs',
    'filterValues':'ATIVO,1',
    'displayKey':'exemplo_campo',
    'maximumSelectionLength':'1',
    'placeholder':'Um Simples exemplo',
    'fields':[
        {
            'field':'exemplo_campo',
            'label':'Nome do Exemplo',
            'standard':'true'
        }
    ]
}">

No exemplo acima estou chamando o Dataset passando a Constraint com nome ATIVO e valor 1.

E você pode, no JS, alterar esse filtro e recarregar os valores. Normalmente faço isso após o usuário interagir com algum outro campo do formulário, mas se quiser fazer isso ao carregar a página é necessário dar um tempo para que o Fluig consiga carregar o Zoom antes.

Um exemplo de como faria isso:

// Função para recarregar o zoom com os valores corretos
function carregaFiltroDataset() {
    // Caso ainda não tenha o zoom carregado aguarde mais 200 ms
    if (!window["exemplo"]) {
        setTimeout(carregaFiltroDataset, 200);
        return;
    }

    const filtros = [];

    const codColigada = $("#CODCOLIGADA").val();
    const codSecao = $("#CODSECAO").val();

    if (codColigada) {
        filtros.push("coligada", codColigada);
    }

    if (codSecao) {
        filtros.push("secao", codSecao);
    }

    if (!filtros.length) {
        return;
    }

    window["exemplo"].clear();
    reloadZoomFilterValues("exemplo", filtros.join(","));
}

// Chama a função 300ms após o DOM carregar
$(() => carregaFiltroDataset, 300);

Você só precisa se preocupar com a lógica do carregamento inicial.

Se ao declarar o zoom não colocar nenhum filtro inicial o Fluig trará todos os resultados do Dataset, então se não for comportamento desejado teria que trabalhar esse detalhe passando um filtro que impeça esse carregamento inicial. Mas como o CODCOLIGADA e CODSECAO parecem ser opcionais não teria problema com isso.

1 curtida

Muito Obrigado, irei testar essa semana
na verdade o constraint eh obrigatório, caso nao passe ele não traz nada.

Ótimo, assim não tem perigo de ficar trazendo dados desnecessários logo no início.

E também dá pra melhorar a função pra só recarregar o dataset se houver os valores.

Vou editar pra deixar um if já validando isso.

Dessa forma ja deu certo também, muito obrigado pelo auxilio.