adicionado gestão de colunas

This commit is contained in:
Luiz Silva 2026-01-28 19:12:20 -03:00
parent 2afa99512e
commit 51c3808a7f
14 changed files with 1910 additions and 929 deletions

View file

@ -16,11 +16,20 @@
:valorBusca="valorBusca"
:acoesCabecalho="acoesCabecalho"
@buscar="atualizarBusca"
@colunas="abrirModalColunas"
/>
<EliTabelaModalColunas
:aberto="modalColunasAberto"
:rotulosColunas="rotulosColunas"
:configInicial="configColunas"
@fechar="fecharModalColunas"
@salvar="salvarModalColunas"
/>
<table class="eli-tabela__table">
<EliTabelaHead
:colunas="tabela.colunas"
:colunas="colunasEfetivas"
:temAcoes="temAcoes"
:colunaOrdenacao="colunaOrdenacao"
:direcaoOrdenacao="direcaoOrdenacao"
@ -28,7 +37,7 @@
/>
<EliTabelaBody
:colunas="tabela.colunas"
:colunas="colunasEfetivas"
:linhas="linhas"
:temAcoes="temAcoes"
:menuAberto="menuAberto"
@ -83,8 +92,14 @@ import EliTabelaHead from "./EliTabelaHead.vue";
import EliTabelaBody from "./EliTabelaBody.vue";
import EliTabelaMenuAcoes from "./EliTabelaMenuAcoes.vue";
import EliTabelaPaginacao from "./EliTabelaPaginacao.vue";
import EliTabelaModalColunas from "./EliTabelaModalColunas.vue";
/** Tipos da configuração/contrato da tabela */
import type { EliTabelaConsulta } from "./types-eli-tabela";
import {
carregarConfigColunas,
salvarConfigColunas,
type EliTabelaColunasConfig,
} from "./colunasStorage";
export default defineComponent({
name: "EliTabela",
@ -97,6 +112,7 @@ export default defineComponent({
EliTabelaBody,
EliTabelaMenuAcoes,
EliTabelaPaginacao,
EliTabelaModalColunas,
},
props: {
/** Configuração principal da tabela (colunas, consulta e ações) */
@ -136,6 +152,58 @@ export default defineComponent({
const acoesCabecalho = computed(() => props.tabela.acoesTabela ?? []);
const temAcoesCabecalho = computed(() => acoesCabecalho.value.length > 0);
/** Colunas: visibilidade/ordem com persistência */
const modalColunasAberto = ref(false);
const configColunas = ref<EliTabelaColunasConfig>(
carregarConfigColunas(props.tabela.nome)
);
const rotulosColunas = computed(() => props.tabela.colunas.map((c) => c.rotulo));
const colunasEfetivas = computed(() => {
const colunas = props.tabela.colunas;
const todosRotulos = rotulosColunas.value;
const invisiveisSet = new Set(configColunas.value.invisiveis ?? []);
// default: todas visiveis; so some se estiver explicitamente em invisiveis
const visiveisBaseRotulos = todosRotulos.filter((r) => !invisiveisSet.has(r));
const visiveisSet = new Set(visiveisBaseRotulos);
// aplica ordem salva; novas (sem definicao) entram no fim, respeitando ordem original
const ordemSalva = configColunas.value.visiveis ?? [];
const ordemFinal: string[] = [];
for (const r of ordemSalva) {
if (visiveisSet.has(r)) ordemFinal.push(r);
}
for (const r of visiveisBaseRotulos) {
if (!ordemFinal.includes(r)) ordemFinal.push(r);
}
// mapeia rótulo -> coluna, preservando duplicatas (se existirem) pelo primeiro match.
// OBS: pressupoe rotulo unico; se repetir, comportamento fica indefinido.
const mapa = new Map<string, any>();
for (const c of colunas) {
if (!mapa.has(c.rotulo)) mapa.set(c.rotulo, c);
}
return ordemFinal.map((r) => mapa.get(r)).filter(Boolean);
});
function abrirModalColunas() {
modalColunasAberto.value = true;
}
function fecharModalColunas() {
modalColunasAberto.value = false;
}
function salvarModalColunas(cfg: EliTabelaColunasConfig) {
configColunas.value = cfg;
salvarConfigColunas(props.tabela.nome, cfg);
modalColunasAberto.value = false;
}
/** Registros por consulta (normaliza para inteiro positivo) */
const registrosPorConsulta = computed(() => {
const valor = props.tabela.registros_por_consulta;
@ -453,6 +521,8 @@ export default defineComponent({
colunaOrdenacao.value = null;
direcaoOrdenacao.value = "asc";
valorBusca.value = "";
modalColunasAberto.value = false;
configColunas.value = carregarConfigColunas(props.tabela.nome);
if (paginaAtual.value !== 1) {
paginaAtual.value = 1;
} else {
@ -499,6 +569,14 @@ export default defineComponent({
acoesCabecalho,
temAcoesCabecalho,
temAcoes,
colunasEfetivas,
rotulosColunas,
modalColunasAberto,
configColunas,
abrirModalColunas,
fecharModalColunas,
salvarModalColunas,
// actions
alternarOrdenacao,