melhorias de simulação
This commit is contained in:
parent
eee275877d
commit
ba0e116a92
3 changed files with 567 additions and 402 deletions
|
|
@ -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",
|
||||
|
|
|
|||
419
src/playground/api_simulador.ts
Normal file
419
src/playground/api_simulador.ts
Normal file
|
|
@ -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<Linha>,
|
||||
): Promise<tipoResposta<Linha>> {
|
||||
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<Linha>,
|
||||
): Promise<tipoResposta<Linha>> {
|
||||
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<tipoResposta<string>> {
|
||||
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")
|
||||
}
|
||||
|
|
@ -8,6 +8,56 @@
|
|||
<EliTabela :tabela="tabelaVazia" />
|
||||
|
||||
<EliTabela :tabela="tabelaErro" />
|
||||
|
||||
<!-- Modal de simulação de cadastro -->
|
||||
<v-dialog v-model="mostrarModalCadastro" max-width="500px">
|
||||
<v-card>
|
||||
<v-card-title>Novo Cadastro</v-card-title>
|
||||
<v-card-text>
|
||||
<v-alert
|
||||
v-if="erroCadastro"
|
||||
type="error"
|
||||
variant="tonal"
|
||||
density="compact"
|
||||
class="mb-4"
|
||||
>
|
||||
{{ erroCadastro }}
|
||||
</v-alert>
|
||||
<v-text-field
|
||||
v-model="novoCadastro.empreendedor"
|
||||
label="Empreendedor"
|
||||
variant="outlined"
|
||||
density="compact"
|
||||
class="mb-2"
|
||||
></v-text-field>
|
||||
<v-text-field
|
||||
v-model="novoCadastro.empreendimento"
|
||||
label="Empreendimento"
|
||||
variant="outlined"
|
||||
density="compact"
|
||||
></v-text-field>
|
||||
</v-card-text>
|
||||
<v-card-actions>
|
||||
<v-spacer></v-spacer>
|
||||
<v-btn
|
||||
color="grey-darken-1"
|
||||
variant="text"
|
||||
@click="mostrarModalCadastro = false"
|
||||
:disabled="salvando"
|
||||
>
|
||||
Cancelar
|
||||
</v-btn>
|
||||
<v-btn
|
||||
color="primary"
|
||||
variant="elevated"
|
||||
@click="salvarNovoCadastro"
|
||||
:loading="salvando"
|
||||
>
|
||||
Salvar
|
||||
</v-btn>
|
||||
</v-card-actions>
|
||||
</v-card>
|
||||
</v-dialog>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
|
|
@ -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<Linha[]>([
|
||||
{
|
||||
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<string | undefined>(undefined)
|
||||
|
||||
// Armazena a função de atualização da tabela atual (vinda da ação do cabeçalho)
|
||||
let atualizarTabelaCallback: (() => Promise<void>) | 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<Linha> = {
|
||||
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<Linha> = {
|
||||
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,
|
||||
}
|
||||
},
|
||||
})
|
||||
</script>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue