vue-componentes/src/playground/tabela.playground.vue
2026-01-27 13:25:09 -03:00

341 lines
9.4 KiB
Vue

<template>
<section class="stack">
<h2>EliTabela</h2>
<EliTabela :tabela="tabelaOk" />
<EliTabela :tabela="tabelaVazia" />
<EliTabela :tabela="tabelaErro" />
</section>
</template>
<script lang="ts">
import { defineComponent } from "vue";
import { codigosResposta } from "p-respostas";
import { Eye, Trash2 } from "lucide-vue-next";
import { EliTabela } from "@/components/eli/EliTabela";
import type { EliTabelaConsulta } from "@/components/eli/EliTabela";
type Linha = {
empreendedor: string;
empreendimento: string;
documento: string;
email: string;
telefone: string;
};
export default defineComponent({
name: "TabelaPlayground",
components: { EliTabela },
setup() {
const acoesTabela: EliTabelaConsulta<Linha>["acoes"] = [
{
icone: Eye,
cor: "#2563eb",
rotulo: "Detalhes",
acao: (linha) => {
console.log("Visualizar detalhes de", linha.empreendedor);
},
},
{
icone: Trash2,
cor: "#dc2626",
rotulo: "Remover",
acao: (linha) => {
console.log("Remover cadastro de", linha.empreendedor);
},
exibir: (linha) => !linha.empreendimento.toLowerCase().includes("café"),
},
];
const linhasPadrao: Linha[] = [
{
empreendedor: "Maria Silva",
empreendimento: "Doces da Maria",
documento: "12.345.678/0001-90",
email: "contato@docesdamaria.com",
telefone: "(11) 91234-5678",
},
{
empreendedor: "João Pereira",
empreendimento: "Café Peregrino",
documento: "98.765.432/0001-12",
email: "contato@cafeperegrino.com",
telefone: "(11) 93456-7810",
},
{
empreendedor: "Ana Costa",
empreendimento: "Flor de Sal Gastronomia",
documento: "45.678.912/0001-55",
email: "ana@flordesal.com",
telefone: "(21) 99876-5432",
},
{
empreendedor: "Rafael Lima",
empreendimento: "Tech Agro Solutions",
documento: "07.654.321/0001-00",
email: "rafael@techagro.com",
telefone: "(31) 94567-8899",
},
{
empreendedor: "Juliana Torres",
empreendimento: "Torres Moda Sustentável",
documento: "33.210.987/0001-44",
email: "juliana@torresmoda.com",
telefone: "(71) 97766-5544",
},
{
empreendedor: "Marcos Vieira",
empreendimento: "Padaria Pão Quentinho",
documento: "21.109.876/0001-32",
email: "marcos@paoquentinho.com",
telefone: "(48) 99654-3210",
},
{
empreendedor: "Bianca Rocha",
empreendimento: "Studio Beleza em Casa",
documento: "54.321.098/0001-21",
email: "contato@belezaemcasa.com",
telefone: "(85) 98877-1122",
},
{
empreendedor: "Caio Albuquerque",
empreendimento: "Albuquerque Engenharia Verde",
documento: "65.432.109/0001-09",
email: "caio@engenhariaverde.com",
telefone: "(61) 98123-4567",
},
{
empreendedor: "Fernanda Almeida",
empreendimento: "Faz Bem Produtos Naturais",
documento: "87.654.210/0001-98",
email: "fernanda@fazbem.com",
telefone: "(41) 99777-6655",
},
{
empreendedor: "Gabriel Martins",
empreendimento: "Martins Tech Repair",
documento: "19.876.543/0001-76",
email: "suporte@martinstech.com",
telefone: "(19) 98888-9090",
},
{
empreendedor: "Helena Duarte",
empreendimento: "Ateliê Costura Criativa",
documento: "23.456.789/0001-65",
email: "helena@costuracriativa.com",
telefone: "(51) 98765-4433",
},
{
empreendedor: "Igor Santos",
empreendimento: "Santos Consultoria Financeira",
documento: "43.219.876/0001-54",
email: "igor@santosconsultoria.com",
telefone: "(31) 99332-1100",
},
{
empreendedor: "Jéssica Nunes",
empreendimento: "Nunes Eventos & Decoração",
documento: "09.876.543/0001-33",
email: "jessica@nunesdecora.com",
telefone: "(62) 99922-3344",
},
{
empreendedor: "Leonardo Prado",
empreendimento: "Prado Bike Courier",
documento: "72.345.098/0001-27",
email: "contato@pradobike.com",
telefone: "(47) 98444-6677",
},
{
empreendedor: "Marina Lopes",
empreendimento: "Lopes Design Digital",
documento: "56.789.012/0001-11",
email: "marina@lopesdesign.com",
telefone: "(27) 99911-2233",
},
{
empreendedor: "Nicolas Teixeira",
empreendimento: "QualiVida Fitness",
documento: "34.567.890/0001-02",
email: "nicolas@qualivida.com",
telefone: "(92) 99456-7788",
},
{
empreendedor: "Olívia Azevedo",
empreendimento: "Azevedo Pet Care",
documento: "88.901.234/0001-45",
email: "olivia@petcare.com",
telefone: "(16) 99788-6655",
},
{
empreendedor: "Paulo Henrique",
empreendimento: "Henrique Soluções Elétricas",
documento: "44.556.778/0001-90",
email: "paulo@solucoeseletricas.com",
telefone: "(13) 98810-2020",
},
{
empreendedor: "Renata Souza",
empreendimento: "Souza Traduções Especializadas",
documento: "11.223.344/0001-08",
email: "renata@souzatraducoes.com",
telefone: "(24) 99661-7788",
},
{
empreendedor: "Tiago Moura",
empreendimento: "Moura Agro Sustentável",
documento: "78.912.345/0001-67",
email: "tiago@mouraagro.com",
telefone: "(68) 99999-4545",
},
{
empreendedor: "Viviane Castro",
empreendimento: "Castro Arte & Cerâmica",
documento: "32.165.498/0001-87",
email: "viviane@castroarte.com",
telefone: "(81) 98787-1212",
},
];
const ordenarLinhas = (
linhas: Linha[],
parametros?: { coluna_ordem?: keyof Linha; direcao_ordem?: "asc" | "desc" }
) => {
if (!parametros?.coluna_ordem) {
return [...linhas];
}
const direcao = parametros.direcao_ordem ?? "asc";
const chave = parametros.coluna_ordem;
const multiplicador = direcao === "asc" ? 1 : -1;
return [...linhas].sort((a, b) => {
const valorA = a[chave];
const valorB = b[chave];
return (
multiplicador *
String(valorA ?? "").localeCompare(String(valorB ?? ""), "pt-BR", {
sensitivity: "base",
})
);
});
};
const aplicarPaginacao = (
linhas: Linha[],
parametros?: { offSet?: number; limit?: number }
) => {
const offset = Math.max(0, parametros?.offSet ?? 0);
const limit = parametros?.limit ?? linhas.length;
if (limit === undefined || limit <= 0) {
return linhas.slice(offset);
}
return linhas.slice(offset, offset + limit);
};
const tabelaOk: EliTabelaConsulta<Linha> = {
registros_por_consulta: 10,
colunas: [
{
rotulo: "Empreendedor",
celula: (l) => l.empreendedor,
coluna_ordem: "empreendedor",
},
{
rotulo: "Empreendimento",
celula: (l) => l.empreendimento,
coluna_ordem: "empreendimento",
},
{
rotulo: "Documento",
celula: (l) => l.documento,
coluna_ordem: "documento",
},
{
rotulo: "E-mail",
celula: (l) => l.email,
coluna_ordem: "email",
acao: () => {
// Exemplo de ação: poderia abrir detalhes
console.log("Clicou na coluna e-mail");
},
},
{
rotulo: "Telefone",
celula: (l) => l.telefone,
coluna_ordem: "telefone",
},
],
acoes: acoesTabela,
consulta: async (parametrosConsulta) => {
const ordenadas = ordenarLinhas(linhasPadrao, parametrosConsulta);
const valores = aplicarPaginacao(ordenadas, parametrosConsulta);
return {
cod: codigosResposta.sucesso,
eCerto: true,
eErro: false,
mensagem: undefined,
valor: {
quantidade: linhasPadrao.length,
valores,
},
};
},
};
const tabelaVazia: EliTabelaConsulta<Linha> = {
registros_por_consulta: tabelaOk.registros_por_consulta,
colunas: tabelaOk.colunas,
consulta: async (_parametrosConsulta) => {
return {
cod: codigosResposta.sucesso,
eCerto: true,
eErro: false,
mensagem: undefined,
valor: {
quantidade: 0,
valores: [],
},
};
},
mensagemVazio: "Nada para mostrar aqui.",
acoes: acoesTabela,
};
const tabelaErro: EliTabelaConsulta<Linha> = {
registros_por_consulta: tabelaOk.registros_por_consulta,
colunas: tabelaOk.colunas,
acoes: acoesTabela,
consulta: async (_parametrosConsulta) => {
return {
cod: codigosResposta.erroConhecido,
eCerto: false,
eErro: true,
mensagem: "Falha ao buscar dados",
valor: undefined,
};
},
};
return { tabelaOk, tabelaVazia, tabelaErro };
},
});
</script>
<style scoped>
.stack {
display: grid;
gap: 16px;
}
.stack :deep(.eli-tabela) {
max-width: 900px;
}
</style>