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.
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.