From ba0e116a925903723274a62ca8cb14e4eec4fdb9 Mon Sep 17 00:00:00 2001 From: Luiz Silva Date: Mon, 16 Feb 2026 12:05:05 -0300 Subject: [PATCH] =?UTF-8?q?melhorias=20de=20simula=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- src/playground/api_simulador.ts | 419 ++++++++++++++++++++ src/playground/tabela.playground.vue | 548 +++++++-------------------- 3 files changed, 567 insertions(+), 402 deletions(-) create mode 100644 src/playground/api_simulador.ts diff --git a/package.json b/package.json index 369a1e3..f083269 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "eli-vue", - "version": "0.1.98", + "version": "0.1.102", "private": false, "main": "./dist/eli-vue.umd.js", "module": "./dist/eli-vue.es.js", diff --git a/src/playground/api_simulador.ts b/src/playground/api_simulador.ts new file mode 100644 index 0000000..3176677 --- /dev/null +++ b/src/playground/api_simulador.ts @@ -0,0 +1,419 @@ +import { respostaComuns, type tipoResposta } from "p-respostas" +import type { tipoFiltro } from "@/componentes/EliTabela/types-eli-tabela" + +export type Linha = { + codigo: string + empreendedor: string + empreendimento: string + documento: string + email: string + telefone: string + faturamento: number + peso_kg: number + criado_em: string + atualizado_em: string +} + +// == SIMULAÇÃO DE API (CRUD) == +// Dados isolados (simulando um banco de dados no servidor) +const _bancoDeDados: Linha[] = [ + { + codigo: String(Math.random()), + empreendedor: "Maria Silva", + empreendimento: "Doces da Maria", + documento: "12.345.678/0001-90", + email: + "contato.comercial.super.longo@doces-da-maria-exemplo-muito-grande.com.br", + telefone: "(11) 91234-5678", + faturamento: 12500.5, + peso_kg: 12.4, + criado_em: "2026-01-09T16:15:00Z", + atualizado_em: "2026-01-29T15:30:00-03:00", + }, + { + codigo: String(Math.random()), + empreendedor: "João Pereira", + empreendimento: "Café Peregrino", + documento: "98.765.432/0001-12", + email: "contato@cafeperegrino.com", + telefone: "(11) 93456-7810", + faturamento: 8000, + peso_kg: 6.2, + criado_em: "2026-01-02T10:00:00-03:00", + atualizado_em: "2026-01-20T08:10:00-03:00", + }, + { + codigo: String(Math.random()), + empreendedor: "Ana Costa", + empreendimento: "Flor de Sal Gastronomia", + documento: "45.678.912/0001-55", + email: "ana@flordesal.com", + telefone: "(21) 99876-5432", + faturamento: 3200.75, + peso_kg: 4.8, + criado_em: "2025-12-10T09:30:00-03:00", + atualizado_em: "2026-01-15T19:20:00-03:00", + }, + { + codigo: String(Math.random()), + empreendedor: "Rafael Lima", + empreendimento: "Tech Agro Solutions", + documento: "07.654.321/0001-00", + email: "rafael@techagro.com", + telefone: "(31) 94567-8899", + faturamento: 15999.9, + peso_kg: 9.1, + criado_em: "2026-01-12T12:00:00-03:00", + atualizado_em: "2026-01-28T11:00:00-03:00", + }, + { + codigo: String(Math.random()), + empreendedor: "Juliana Torres", + empreendimento: "Torres Moda Sustentável", + documento: "33.210.987/0001-44", + email: "juliana@torresmoda.com", + telefone: "(71) 97766-5544", + faturamento: 4500, + peso_kg: 3.3, + criado_em: "2026-01-01T00:00:00Z", + atualizado_em: "2026-01-10T13:45:00-03:00", + }, + { + codigo: String(Math.random()), + empreendedor: "Marcos Vieira", + empreendimento: "Padaria Pão Quentinho", + documento: "21.109.876/0001-32", + email: "marcos@paoquentinho.com", + telefone: "(48) 99654-3210", + faturamento: 2200.4, + peso_kg: 15.7, + criado_em: "2026-01-05T07:25:00-03:00", + atualizado_em: "2026-01-23T20:15:00-03:00", + }, + { + codigo: String(Math.random()), + empreendedor: "Bianca Rocha", + empreendimento: "Studio Beleza em Casa", + documento: "54.321.098/0001-21", + email: "contato@belezaemcasa.com", + telefone: "(85) 98877-1122", + faturamento: 990, + peso_kg: 1.9, + criado_em: "2026-01-03T14:00:00-03:00", + atualizado_em: "2026-01-29T09:00:00-03:00", + }, + { + codigo: String(Math.random()), + empreendedor: "Caio Albuquerque", + empreendimento: "Albuquerque Engenharia Verde", + documento: "65.432.109/0001-09", + email: "caio@engenhariaverde.com", + telefone: "(61) 98123-4567", + faturamento: 100000, + peso_kg: 21.3, + criado_em: "2025-11-18T16:10:00-03:00", + atualizado_em: "2026-01-25T10:40:00-03:00", + }, + { + codigo: String(Math.random()), + empreendedor: "Fernanda Almeida", + empreendimento: "Faz Bem Produtos Naturais", + documento: "87.654.210/0001-98", + email: "fernanda@fazbem.com", + telefone: "(41) 99777-6655", + faturamento: 5600.2, + peso_kg: 8.6, + criado_em: "2026-01-08T12:12:00-03:00", + atualizado_em: "2026-01-21T17:55:00-03:00", + }, + { + codigo: String(Math.random()), + empreendedor: "Gabriel Martins", + empreendimento: "Martins Tech Repair", + documento: "19.876.543/0001-76", + email: "suporte@martinstech.com", + telefone: "(19) 98888-9090", + faturamento: 7550, + peso_kg: 7.7, + criado_em: "2026-01-11T11:00:00-03:00", + atualizado_em: "2026-01-18T11:30:00-03:00", + }, + { + codigo: String(Math.random()), + empreendedor: "Helena Duarte", + empreendimento: "Ateliê Costura Criativa", + documento: "23.456.789/0001-65", + email: "helena@costuracriativa.com", + telefone: "(51) 98765-4433", + faturamento: 2700, + peso_kg: 2.5, + criado_em: "2026-01-07T08:00:00-03:00", + atualizado_em: "2026-01-16T14:10:00-03:00", + }, + { + codigo: String(Math.random()), + empreendedor: "Igor Santos", + empreendimento: "Santos Consultoria Financeira", + documento: "43.219.876/0001-54", + email: "igor@santosconsultoria.com", + telefone: "(31) 99332-1100", + faturamento: 12000, + peso_kg: 5.4, + criado_em: "2026-01-06T10:30:00-03:00", + atualizado_em: "2026-01-22T18:30:00-03:00", + }, + { + codigo: String(Math.random()), + empreendedor: "Jéssica Nunes", + empreendimento: "Nunes Eventos & Decoração", + documento: "09.876.543/0001-33", + email: "jessica@nunesdecora.com", + telefone: "(62) 99922-3344", + faturamento: 3300.1, + peso_kg: 4.1, + criado_em: "2026-01-04T13:30:00-03:00", + atualizado_em: "2026-01-26T09:20:00-03:00", + }, + { + codigo: String(Math.random()), + empreendedor: "Leonardo Prado", + empreendimento: "Prado Bike Courier", + documento: "72.345.098/0001-27", + email: "contato@pradobike.com", + telefone: "(47) 98444-6677", + faturamento: 4100, + peso_kg: 6.8, + criado_em: "2026-01-02T18:40:00-03:00", + atualizado_em: "2026-01-27T12:00:00-03:00", + }, + { + codigo: String(Math.random()), + empreendedor: "Marina Lopes", + empreendimento: "Lopes Design Digital", + documento: "56.789.012/0001-11", + email: "marina@lopesdesign.com", + telefone: "(27) 99911-2233", + faturamento: 2100, + peso_kg: 3.7, + criado_em: "2026-01-09T09:00:00-03:00", + atualizado_em: "2026-01-19T15:35:00-03:00", + }, + { + codigo: String(Math.random()), + empreendedor: "Nicolas Teixeira", + empreendimento: "QualiVida Fitness", + documento: "34.567.890/0001-02", + email: "nicolas@qualivida.com", + telefone: "(92) 99456-7788", + faturamento: 8600.9, + peso_kg: 11.2, + criado_em: "2026-01-12T19:15:00-03:00", + atualizado_em: "2026-01-29T10:50:00-03:00", + }, + { + codigo: String(Math.random()), + empreendedor: "Olívia Azevedo", + empreendimento: "Azevedo Pet Care", + documento: "88.901.234/0001-45", + email: "olivia@petcare.com", + telefone: "(16) 99788-6655", + faturamento: 1900.3, + peso_kg: 2.2, + criado_em: "2026-01-10T15:00:00-03:00", + atualizado_em: "2026-01-14T16:00:00-03:00", + }, + { + codigo: String(Math.random()), + empreendedor: "Paulo Henrique", + empreendimento: "Henrique Soluções Elétricas", + documento: "44.556.778/0001-90", + email: "paulo@solucoeseletricas.com", + telefone: "(13) 98810-2020", + faturamento: 50000, + peso_kg: 17.9, + criado_em: "2026-01-13T10:10:00-03:00", + atualizado_em: "2026-01-24T21:00:00-03:00", + }, + { + codigo: String(Math.random()), + empreendedor: "Renata Souza", + empreendimento: "Souza Traduções Especializadas", + documento: "11.223.344/0001-08", + email: "renata@souzatraducoes.com", + telefone: "(24) 99661-7788", + faturamento: 6400, + peso_kg: 9.9, + criado_em: "2026-01-08T07:00:00-03:00", + atualizado_em: "2026-01-28T09:05:00-03:00", + }, + { + codigo: String(Math.random()), + empreendedor: "Tiago Moura", + empreendimento: "Moura Agro Sustentável", + documento: "78.912.345/0001-67", + email: "tiago@mouraagro.com", + telefone: "(68) 99999-4545", + faturamento: 7200, + peso_kg: 13.5, + criado_em: "2026-01-03T12:00:00-03:00", + atualizado_em: "2026-01-23T12:45:00-03:00", + }, + { + codigo: String(Math.random()), + empreendedor: "Viviane Castro", + empreendimento: "Castro Arte & Cerâmica", + documento: "32.165.498/0001-87", + email: "viviane@castroarte.com", + telefone: "(81) 98787-1212", + faturamento: 2800, + peso_kg: 4.6, + criado_em: "2026-01-01T09:00:00-03:00", + atualizado_em: "2026-01-17T09:30:00-03:00", + }, +] + +// Helpers internos da API (não expostos) +const _filtrarPorBusca = (lista: Linha[], texto?: string) => { + const termo = texto?.trim().toLowerCase() + if (!termo) return [...lista] + return lista.filter((linha) => + [linha.empreendedor, linha.empreendimento].some((v) => + v.toLowerCase().includes(termo), + ), + ) +} + +// biome-ignore lint/suspicious/noExplicitAny: playground +const _comparar = (op: string, valLine: any, valFiltro: any): boolean => { + switch (op) { + case "=": + return valLine == valFiltro + case "!=": + return valLine != valFiltro + case ">": + return Number(valLine) > Number(valFiltro) + case ">=": + return Number(valLine) >= Number(valFiltro) + case "<": + return Number(valLine) < Number(valFiltro) + case "<=": + return Number(valLine) <= Number(valFiltro) + case "like": + return String(valLine ?? "") + .toLowerCase() + .includes(String(valFiltro ?? "").toLowerCase()) + case "in": { + const arr = Array.isArray(valFiltro) + ? valFiltro + : String(valFiltro ?? "") + .split(",") + .map((s) => s.trim()) + .filter(Boolean) + return arr.includes(String(valLine)) + } + case "isNull": + return valLine === null || valLine === undefined || valLine === "" + default: + return true + } +} + +const _filtrarAvancado = (lista: Linha[], filtros?: tipoFiltro[]) => { + if (!filtros?.length) return [...lista] + // biome-ignore lint/suspicious/noExplicitAny: playground + return lista.filter((linha: any) => + filtros.every((f) => + _comparar(String(f.operador), linha?.[String(f.coluna)], f.valor), + ), + ) +} + +const _ordenar = ( + lista: Linha[], + p?: { coluna_ordem?: keyof Linha; direcao_ordem?: "asc" | "desc" }, +) => { + if (!p?.coluna_ordem) return [...lista] + const dir = p.direcao_ordem === "desc" ? -1 : 1 + const key = p.coluna_ordem + return [...lista].sort((a, b) => { + const va = String(a[key] ?? "") + const vb = String(b[key] ?? "") + return dir * va.localeCompare(vb, "pt-BR", { sensitivity: "base" }) + }) +} + +const delay = (ms: number) => + new Promise((r) => setTimeout(r, ms * Math.random() + 2000)) + +// -- API PÚBLICA SIMULADA -- + +// biome-ignore lint/suspicious/noExplicitAny: playground +export async function api_ler(params: any) { + await delay(600) // simula latência de rede + + // 1. Filtro + let resultado = params.texto_busca + ? _filtrarPorBusca(_bancoDeDados, params.texto_busca) + : _filtrarAvancado(_bancoDeDados, params.filtros) + + // 2. Ordenação + resultado = _ordenar(resultado, params) + + // 3. Paginação + const limit = Math.max(1, Number(params.limit ?? 10)) + const offset = Math.max(0, Number(params.offSet ?? 0)) + const paginado = resultado.slice(offset, offset + limit) + + return { + total: resultado.length, + dados: paginado, + } +} + +export async function api_criar( + dados: Partial, +): Promise> { + await delay(1500) // simula tempo de salvar + + if (!dados.empreendedor) { + return respostaComuns.erro("Empreendedor é obrigatório") + } + + const novo: Linha = { + codigo: Math.random().toString(), + empreendedor: dados.empreendedor || "Novo", + empreendimento: dados.empreendimento || "Novo Emp", + documento: dados.documento || "00.000.000/0000-00", + email: dados.email || "novo@email.com", + telefone: dados.telefone || "(00) 0000-0000", + faturamento: dados.faturamento || 0, + peso_kg: dados.peso_kg || 0, + criado_em: new Date().toISOString(), + atualizado_em: new Date().toISOString(), + } + _bancoDeDados.unshift(novo) + return respostaComuns.valor(novo) +} + +export async function api_editar( + codigo: string, + novosDados: Partial, +): Promise> { + await delay(1000) + const idx = _bancoDeDados.find((l) => l.codigo === codigo) + if (!idx) return respostaComuns.erro("Registro não encontrado") + Object.assign(idx, novosDados) + return respostaComuns.valor(idx) +} + +export async function api_deletar( + codigo: string, +): Promise> { + await delay(800) + const idx = _bancoDeDados.findIndex((l) => l.codigo === codigo) + if (idx !== -1) { + _bancoDeDados.splice(idx, 1) + return respostaComuns.valor("Registro deletado com sucesso") + } + return respostaComuns.erro("Registro não encontrado") +} diff --git a/src/playground/tabela.playground.vue b/src/playground/tabela.playground.vue index e28f653..d4706c5 100644 --- a/src/playground/tabela.playground.vue +++ b/src/playground/tabela.playground.vue @@ -8,6 +8,56 @@ + + + + + Novo Cadastro + + + {{ erroCadastro }} + + + + + + + + Cancelar + + + Salvar + + + + @@ -18,19 +68,8 @@ import { defineComponent, ref } from "vue" import type { ComponenteEntrada } from "@/componentes/EliEntrada/tiposEntradas" import type { tipoEliTabelaConsulta } from "@/componentes/EliTabela" import { celulaTabela, EliTabela } from "@/componentes/EliTabela" -import type { tipoFiltro } from "@/componentes/EliTabela/types-eli-tabela" -type Linha = { - empreendedor: string - empreendimento: string - documento: string - email: string - telefone: string - faturamento: number - peso_kg: number - criado_em: string - atualizado_em: string -} +import { api_criar, api_deletar, api_ler, type Linha } from "./api_simulador" export default defineComponent({ name: "TabelaPlayground", @@ -50,377 +89,89 @@ export default defineComponent({ cor: "#dc2626", rotulo: "Remover", acao: (linha) => { - console.log("Remover cadastro de", linha.empreendedor) + removerCadastro(linha) }, exibir: (linha) => !linha.empreendimento.toLowerCase().includes("café"), }, ] - const linhasPadrao = ref([ - { - empreendedor: "Maria Silva", - empreendimento: "Doces da Maria", - documento: "12.345.678/0001-90", - email: - "contato.comercial.super.longo@doces-da-maria-exemplo-muito-grande.com.br", - telefone: "(11) 91234-5678", - faturamento: 12500.5, - peso_kg: 12.4, - criado_em: "2026-01-09T16:15:00Z", - atualizado_em: "2026-01-29T15:30:00-03:00", - }, - { - empreendedor: "João Pereira", - empreendimento: "Café Peregrino", - documento: "98.765.432/0001-12", - email: "contato@cafeperegrino.com", - telefone: "(11) 93456-7810", - faturamento: 8000, - peso_kg: 6.2, - criado_em: "2026-01-02T10:00:00-03:00", - atualizado_em: "2026-01-20T08:10:00-03:00", - }, - { - empreendedor: "Ana Costa", - empreendimento: "Flor de Sal Gastronomia", - documento: "45.678.912/0001-55", - email: "ana@flordesal.com", - telefone: "(21) 99876-5432", - faturamento: 3200.75, - peso_kg: 4.8, - criado_em: "2025-12-10T09:30:00-03:00", - atualizado_em: "2026-01-15T19:20:00-03:00", - }, - { - empreendedor: "Rafael Lima", - empreendimento: "Tech Agro Solutions", - documento: "07.654.321/0001-00", - email: "rafael@techagro.com", - telefone: "(31) 94567-8899", - faturamento: 15999.9, - peso_kg: 9.1, - criado_em: "2026-01-12T12:00:00-03:00", - atualizado_em: "2026-01-28T11:00:00-03:00", - }, - { - empreendedor: "Juliana Torres", - empreendimento: "Torres Moda Sustentável", - documento: "33.210.987/0001-44", - email: "juliana@torresmoda.com", - telefone: "(71) 97766-5544", - faturamento: 4500, - peso_kg: 3.3, - criado_em: "2026-01-01T00:00:00Z", - atualizado_em: "2026-01-10T13:45:00-03:00", - }, - { - empreendedor: "Marcos Vieira", - empreendimento: "Padaria Pão Quentinho", - documento: "21.109.876/0001-32", - email: "marcos@paoquentinho.com", - telefone: "(48) 99654-3210", - faturamento: 2200.4, - peso_kg: 15.7, - criado_em: "2026-01-05T07:25:00-03:00", - atualizado_em: "2026-01-23T20:15:00-03:00", - }, - { - empreendedor: "Bianca Rocha", - empreendimento: "Studio Beleza em Casa", - documento: "54.321.098/0001-21", - email: "contato@belezaemcasa.com", - telefone: "(85) 98877-1122", - faturamento: 990, - peso_kg: 1.9, - criado_em: "2026-01-03T14:00:00-03:00", - atualizado_em: "2026-01-29T09:00:00-03:00", - }, - { - empreendedor: "Caio Albuquerque", - empreendimento: "Albuquerque Engenharia Verde", - documento: "65.432.109/0001-09", - email: "caio@engenhariaverde.com", - telefone: "(61) 98123-4567", - faturamento: 100000, - peso_kg: 21.3, - criado_em: "2025-11-18T16:10:00-03:00", - atualizado_em: "2026-01-25T10:40:00-03:00", - }, - { - empreendedor: "Fernanda Almeida", - empreendimento: "Faz Bem Produtos Naturais", - documento: "87.654.210/0001-98", - email: "fernanda@fazbem.com", - telefone: "(41) 99777-6655", - faturamento: 5600.2, - peso_kg: 8.6, - criado_em: "2026-01-08T12:12:00-03:00", - atualizado_em: "2026-01-21T17:55:00-03:00", - }, - { - empreendedor: "Gabriel Martins", - empreendimento: "Martins Tech Repair", - documento: "19.876.543/0001-76", - email: "suporte@martinstech.com", - telefone: "(19) 98888-9090", - faturamento: 7550, - peso_kg: 7.7, - criado_em: "2026-01-11T11:00:00-03:00", - atualizado_em: "2026-01-18T11:30:00-03:00", - }, - { - empreendedor: "Helena Duarte", - empreendimento: "Ateliê Costura Criativa", - documento: "23.456.789/0001-65", - email: "helena@costuracriativa.com", - telefone: "(51) 98765-4433", - faturamento: 2700, - peso_kg: 2.5, - criado_em: "2026-01-07T08:00:00-03:00", - atualizado_em: "2026-01-16T14:10:00-03:00", - }, - { - empreendedor: "Igor Santos", - empreendimento: "Santos Consultoria Financeira", - documento: "43.219.876/0001-54", - email: "igor@santosconsultoria.com", - telefone: "(31) 99332-1100", - faturamento: 12000, - peso_kg: 5.4, - criado_em: "2026-01-06T10:30:00-03:00", - atualizado_em: "2026-01-22T18:30:00-03:00", - }, - { - empreendedor: "Jéssica Nunes", - empreendimento: "Nunes Eventos & Decoração", - documento: "09.876.543/0001-33", - email: "jessica@nunesdecora.com", - telefone: "(62) 99922-3344", - faturamento: 3300.1, - peso_kg: 4.1, - criado_em: "2026-01-04T13:30:00-03:00", - atualizado_em: "2026-01-26T09:20:00-03:00", - }, - { - empreendedor: "Leonardo Prado", - empreendimento: "Prado Bike Courier", - documento: "72.345.098/0001-27", - email: "contato@pradobike.com", - telefone: "(47) 98444-6677", - faturamento: 4100, - peso_kg: 6.8, - criado_em: "2026-01-02T18:40:00-03:00", - atualizado_em: "2026-01-27T12:00:00-03:00", - }, - { - empreendedor: "Marina Lopes", - empreendimento: "Lopes Design Digital", - documento: "56.789.012/0001-11", - email: "marina@lopesdesign.com", - telefone: "(27) 99911-2233", - faturamento: 2100, - peso_kg: 3.7, - criado_em: "2026-01-09T09:00:00-03:00", - atualizado_em: "2026-01-19T15:35:00-03:00", - }, - { - empreendedor: "Nicolas Teixeira", - empreendimento: "QualiVida Fitness", - documento: "34.567.890/0001-02", - email: "nicolas@qualivida.com", - telefone: "(92) 99456-7788", - faturamento: 8600.9, - peso_kg: 11.2, - criado_em: "2026-01-12T19:15:00-03:00", - atualizado_em: "2026-01-29T10:50:00-03:00", - }, - { - empreendedor: "Olívia Azevedo", - empreendimento: "Azevedo Pet Care", - documento: "88.901.234/0001-45", - email: "olivia@petcare.com", - telefone: "(16) 99788-6655", - faturamento: 1900.3, - peso_kg: 2.2, - criado_em: "2026-01-10T15:00:00-03:00", - atualizado_em: "2026-01-14T16:00:00-03:00", - }, - { - empreendedor: "Paulo Henrique", - empreendimento: "Henrique Soluções Elétricas", - documento: "44.556.778/0001-90", - email: "paulo@solucoeseletricas.com", - telefone: "(13) 98810-2020", - faturamento: 50000, - peso_kg: 17.9, - criado_em: "2026-01-13T10:10:00-03:00", - atualizado_em: "2026-01-24T21:00:00-03:00", - }, - { - empreendedor: "Renata Souza", - empreendimento: "Souza Traduções Especializadas", - documento: "11.223.344/0001-08", - email: "renata@souzatraducoes.com", - telefone: "(24) 99661-7788", - faturamento: 6400, - peso_kg: 9.9, - criado_em: "2026-01-08T07:00:00-03:00", - atualizado_em: "2026-01-28T09:05:00-03:00", - }, - { - empreendedor: "Tiago Moura", - empreendimento: "Moura Agro Sustentável", - documento: "78.912.345/0001-67", - email: "tiago@mouraagro.com", - telefone: "(68) 99999-4545", - faturamento: 7200, - peso_kg: 13.5, - criado_em: "2026-01-03T12:00:00-03:00", - atualizado_em: "2026-01-23T12:45:00-03:00", - }, - { - empreendedor: "Viviane Castro", - empreendimento: "Castro Arte & Cerâmica", - documento: "32.165.498/0001-87", - email: "viviane@castroarte.com", - telefone: "(81) 98787-1212", - faturamento: 2800, - peso_kg: 4.6, - criado_em: "2026-01-01T09:00:00-03:00", - atualizado_em: "2026-01-17T09:30:00-03:00", - }, - ]) - - // Incrementamos a chave para forçar o EliTabela a recarregar a consulta. - // (Como o componente não expõe um método público de refresh) const versaoTabelaOk = ref(0) + const mostrarModalCadastro = ref(false) + const salvando = ref(false) + const novoCadastro = ref({ + empreendedor: "", + empreendimento: "", + documento: "", + email: "", + telefone: "", + faturamento: 0, + peso_kg: 0, + }) + const erroCadastro = ref(undefined) + // Armazena a função de atualização da tabela atual (vinda da ação do cabeçalho) + let atualizarTabelaCallback: (() => Promise) | undefined + + // A ação do cabeçalho recebe { atualizarConsulta, editarLista, ... } // biome-ignore lint/suspicious/noExplicitAny: playground - function adicionarLinha(params?: any) { - if (params) console.log("Adicionar Linha, parametros:", params) - const proximo = linhasPadrao.value.length + 1 + function abrirModalCadastro(params?: any) { + if (params?.atualizarConsulta) { + atualizarTabelaCallback = params.atualizarConsulta + } - linhasPadrao.value.unshift({ - empreendedor: `Novo Empreendedor ${proximo}`, - empreendimento: `Novo Empreendimento ${proximo}`, - documento: "00.000.000/0000-00", - email: `novo${proximo}@exemplo.com`, - telefone: "(00) 90000-0000", + novoCadastro.value = { + empreendedor: "", + empreendimento: "", + documento: "", + email: "", + telefone: "", faturamento: 0, peso_kg: 0, - criado_em: new Date().toISOString(), - atualizado_em: new Date().toISOString(), - }) - - versaoTabelaOk.value++ - } - - const filtrarPorBusca = (linhas: Linha[], texto?: string) => { - const termo = texto?.trim().toLowerCase() - if (!termo) { - return [...linhas] } - - return linhas.filter((linha) => { - const campos = [linha.empreendedor, linha.empreendimento] - return campos.some((valor) => valor.toLowerCase().includes(termo)) - }) + erroCadastro.value = undefined + mostrarModalCadastro.value = true } - const compararOperador = ( - operador: string, - // biome-ignore lint/suspicious/noExplicitAny: playground - valorLinha: any, - // biome-ignore lint/suspicious/noExplicitAny: playground - valorFiltro: any, - ): boolean => { - switch (operador) { - case "=": - return valorLinha == valorFiltro - case "!=": - return valorLinha != valorFiltro - case ">": - return Number(valorLinha) > Number(valorFiltro) - case ">=": - return Number(valorLinha) >= Number(valorFiltro) - case "<": - return Number(valorLinha) < Number(valorFiltro) - case "<=": - return Number(valorLinha) <= Number(valorFiltro) - case "like": { - const a = String(valorLinha ?? "").toLowerCase() - const b = String(valorFiltro ?? "").toLowerCase() - return a.includes(b) + async function salvarNovoCadastro() { + salvando.value = true + erroCadastro.value = undefined + try { + const resposta = await api_criar(novoCadastro.value) + if (resposta.eErro) { + erroCadastro.value = resposta.mensagem + return } - case "in": { - const arr = Array.isArray(valorFiltro) - ? valorFiltro - : String(valorFiltro ?? "") - .split(",") - .map((s) => s.trim()) - .filter(Boolean) - return arr.includes(String(valorLinha)) + + // PADRÃO RECOMENDADO: + // Se temos o callback de atualização, usamos ele para recarregar os dados na tabela + // sem precisar remontar o componente (sem alterar key). + if (atualizarTabelaCallback) { + await atualizarTabelaCallback() + } else { + // Fallback (caso não tenha vindo pela ação da tabela): força re-render + versaoTabelaOk.value++ } - case "isNull": - return ( - valorLinha === null || valorLinha === undefined || valorLinha === "" - ) - default: - return true + + mostrarModalCadastro.value = false + } catch (e) { + erroCadastro.value = String(e) + } finally { + salvando.value = false } } - const filtrarPorFiltrosAvancados = ( - linhas: Linha[], - filtros?: tipoFiltro[], - ) => { - const lista = [...linhas] - if (!filtros?.length) return lista - - // biome-ignore lint/suspicious/noExplicitAny: playground - return lista.filter((linha: any) => { - return filtros.every((f) => { - // biome-ignore lint/suspicious/noExplicitAny: playground - const vLinha = linha?.[String((f as any).coluna)] - return compararOperador( - // biome-ignore lint/suspicious/noExplicitAny: playground - String((f as any).operador), - vLinha, - // biome-ignore lint/suspicious/noExplicitAny: playground - (f as any).valor, - ) + function removerCadastro(linha: Linha) { + // Exemplo de uso do api_deletar + // Não temos um ID único confiável além das propriedades, vamos usar empreendedor como chave neste exemplo simples + if (confirm(`Tem certeza que deseja remover ${linha.empreendedor}?`)) { + api_deletar("empreendedor", linha.empreendedor).then(() => { + versaoTabelaOk.value++ }) - }) - } - - 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 tabelaOk: tipoEliTabelaConsulta = { - nome: "Exemplo", + nome: "ExemploPlaygroundData", registros_por_consulta: 10, mostrarCaixaDeBusca: true, acoesTabela: [ @@ -429,18 +180,14 @@ export default defineComponent({ icone: Plus, cor: "#16a34a", rotulo: "Novo (Superior)", - acao: adicionarLinha, + acao: abrirModalCadastro, }, { posicao: "inferior", icone: Plus, cor: "#2563eb", rotulo: "Novo (Inferior)", - // biome-ignore lint/suspicious/noExplicitAny: playground - acao: (params: any) => { - console.log("Ação inferior clicada com params:", params) - adicionarLinha(params) - }, + acao: abrirModalCadastro, }, ], @@ -572,45 +319,34 @@ export default defineComponent({ }, ], consulta: async (parametrosConsulta) => { - // Agora a EliTabela envia paginação/ordenação/busca OU filtros avançados para a consulta. - // (busca tem prioridade; quando existe texto_busca, filtros não vêm no payload) - - const limite = Math.max(1, Number(parametrosConsulta?.limit ?? 10)) - const offset = Math.max(0, Number(parametrosConsulta?.offSet ?? 0)) - - // 1) filtra (busca OU filtro avançado) - const base = [...linhasPadrao.value] - const filtradas = parametrosConsulta?.texto_busca - ? filtrarPorBusca(base, parametrosConsulta.texto_busca) - : filtrarPorFiltrosAvancados( - base, - // biome-ignore lint/suspicious/noExplicitAny: playground - (parametrosConsulta as any)?.filtros, - ) - - // 2) ordena - const ordenadas = ordenarLinhas(filtradas, parametrosConsulta) - - // 3) pagina - const valores = ordenadas.slice(offset, offset + limite) - - return { - cod: codigosResposta.sucesso, - eCerto: true, - eErro: false, - mensagem: undefined, - valor: { - quantidade: ordenadas.length, - valores, - }, + try { + const resposta = await api_ler(parametrosConsulta) + return { + cod: codigosResposta.sucesso, + eCerto: true, + eErro: false, + mensagem: undefined, + valor: { + quantidade: resposta.total, + valores: resposta.dados, + }, + } + } catch (error) { + return { + cod: codigosResposta.erroConhecido, + eCerto: false, + eErro: true, + mensagem: String(error), + valor: undefined, + } } }, } const tabelaVazia: tipoEliTabelaConsulta = { - nome: "Exemplo", - registros_por_consulta: tabelaOk.registros_por_consulta, - mostrarCaixaDeBusca: tabelaOk.mostrarCaixaDeBusca, + nome: "Exemplo Vazio", + registros_por_consulta: 10, + mostrarCaixaDeBusca: true, colunas: tabelaOk.colunas, consulta: async (_parametrosConsulta) => { return { @@ -645,7 +381,17 @@ export default defineComponent({ }, } - return { tabelaOk, tabelaVazia, tabelaErro, versaoTabelaOk } + return { + tabelaOk, + tabelaVazia, + tabelaErro, + versaoTabelaOk, + mostrarModalCadastro, + salvando, + novoCadastro, + salvarNovoCadastro, + erroCadastro, + } }, })