JS Module

Y2Table DataTables-like

Tabelas interativas com paginação, busca, ordenação, exportação, visibilidade de colunas e modo server-side AJAX — tudo via atributos HTML, zero dependências. Funciona com HTML estático ou com foreach PHP.

1. Demo completo

Todos os recursos ativos: busca, ordenação, paginação, exportação CSV/Copiar e visibilidade de colunas.

Nome Cargo Departamento Cidade Salário Status
Ana Carolina Silva UX Designer Criativo São Paulo R$ 8.500 Ativo
Bruno Henrique Santos Dev Frontend TI Curitiba R$ 11.200 Ativo
Carla Mendes Oliveira Product Manager Produto São Paulo R$ 15.800 Férias
Diego Costa Ferreira Dev Backend TI Belo Horizonte R$ 12.400 Ativo
Elena Rodrigues Lima QA Engineer TI Porto Alegre R$ 9.300 Inativo
Felipe Araújo Lima DevOps Engineer TI Recife R$ 13.700 Ativo
Gabriela Ferraz Duarte UX Writer Criativo São Paulo R$ 7.900 Ativo
Hugo Almeida Prado Analista Financeiro Financeiro Brasília R$ 10.100 Férias
Isabela Nunes Carvalho Dev Full Stack TI Florianópolis R$ 14.200 Ativo
João Vitor Nascimento CEO Diretoria São Paulo R$ 42.000 Ativo
Karen Duarte Moreira Gestora de RH Pessoas Campinas R$ 11.500 Ativo
Lucas Prado Batista Dev Mobile TI Manaus R$ 10.800 Inativo
Mariana Torres Gomes Data Analyst Dados São Paulo R$ 13.000 Ativo
Nicolas Souza Ribeiro Scrum Master Produto Curitiba R$ 12.900 Ativo
Olivia Castro Pereira Marketing Lead Marketing Rio de Janeiro R$ 11.100 Férias
Pedro Henrique Luz Infra Engineer TI Goiânia R$ 10.400 Ativo
Rafaela Netto Viana Business Analyst Produto São Paulo R$ 12.200 Ativo

2. Uso básico

Adicione y2table em qualquer <table> existente. Busca, sort e paginação são ativados por padrão.

Desativar recursos individuais:

4. Exportação

O atributo y2table-export aceita csv e copy separados por vírgula. A exportação respeita o filtro de busca atual e as colunas visíveis.

// Exportar programaticamente
const tabela = document.querySelector('#minha-tabela');

Y2Table.export(tabela, 'csv');   // baixa arquivo tabela.csv
Y2Table.export(tabela, 'copy');  // copia para clipboard

Nota: O CSV — gerado com BOM UTF-8 para compatibilidade com Excel. O Copiar usa tab como separador (compatível com Excel/Sheets).

5. Seleção de linhas

O atributo y2table-select adiciona uma coluna de checkboxes com "Selecionar tudo". O evento yd:table:select dispara ao mudar a seleção.

const tabela = document.querySelector('#minha-tabela');

tabela.addEventListener('yd:table:select', e => {
    const selecionados = e.detail.selected; // array de índices
    console.log(`${selecionados.length} linha(s) selecionada(s)`);
    console.log('índices:', selecionados);
});

6. Visibilidade de colunas

O atributo y2table-colvis adiciona um botão "Colunas" que permite mostrar/ocultar colunas. Use y2table-novis no <th> para impedir que uma coluna seja ocultada.

Persistência: Combine com y2table-state para salvar as colunas visíveis no localStorage.

7. Server-side AJAX

Use y2table-url para buscar dados do servidor. Paginação, busca e ordenação são delegadas ao servidor. O thead pode ser definido no HTML ou auto-gerado a partir de y2table-cols.

Request enviado ao servidor:

// GET /api/funcionarios?page=1&per=10&search=ana&sort=nome&dir=asc

Response esperado do servidor:

// Mínimo — array simples (sem paginação)
["dado1", "dado2"]

// Completo — com total e filtrado
{
  "data": [
    { "nome": "Ana Silva", "cargo": "Designer", "cidade": "São Paulo" },
    { "nome": "Bruno Santos", "cargo": "Dev Frontend", "cidade": "Curitiba" }
  ],
  "total": 150,      // total de registros sem filtro
  "filtered": 23     // total após filtro de busca
}

Exemplo em PHP (Laravel):

// Route::get('/api/funcionarios', function(Request $r) {
//     $q = Funcionario::query();
//     if ($r->search) $q->where('nome', 'like', "%{$r->search}%");
//     $total    = $q->count();
//     if ($r->sort) $q->orderBy($r->sort, $r->dir ?? 'asc');
//     $filtered = $q->count();
//     $data     = $q->skip(($r->page - 1) * $r->per)->take($r->per)->get();
//     return response()->json(compact('data', 'total', 'filtered'));
// });

8. API JavaScript

Métodos estáticos disponíveis em Y2Table para controle e população programática.

Y2Table.fromData() — popular com dados JS

Cria ou re-popula uma tabela a partir de arrays JS puros. HTML nas células — permitido. Chamadas subsequentes atualizam os dados sem recriar a UI.

// ?"—? 1. Arrays posicionais — mais simples
Y2Table.fromData('#tabela',
    ['Nome', 'Cargo', 'Cidade'],
    [
        ['Ana Silva',    'Designer',  'São Paulo'],
        ['Bruno Santos', 'Dev Front', 'Curitiba'],
        ['Carla Mendes', 'PM',        'São Paulo'],
    ]
);

// ?"—? 2. Objetos com field mapping
Y2Table.fromData('#tabela',
    [
        { label: 'Nome',  field: 'nome'  },
        { label: 'Cargo', field: 'cargo' },
        { label: 'Status', field: 'status', nosort: true },
    ],
    [
        { nome: 'Ana Silva',    cargo: 'Designer',  status: '<span class="bdg is-suc is-sm">Ativo</span>' },
        { nome: 'Bruno Santos', cargo: 'Dev Front', status: '<span class="bdg is-err is-sm">Inativo</span>' },
    ]
);

// ?"—? 3. Com fetch() — carrega JSON e popula
fetch('/api/produtos')
    .then(r => r.json())
    .then(data => {
        Y2Table.fromData('#tabela',
            [
                { label: 'Produto', field: 'nome' },
                { label: 'Preço',   field: 'preco' },
                { label: 'Estoque', field: 'qtd' },
            ],
            data
        );
    });

// ?"—? 4. Re-popular tabela existente (atualiza sem recriar a UI)
// A segunda chamada reutiliza busca, paginação e colunas já configuradas
Y2Table.fromData('#tabela', cols, novosDados);

// ?"—? 5. Opções na primeira chamada (opts ignorados em chamadas seguintes)
Y2Table.fromData('#tabela', cols, rows, {
    per:    10,
    export: 'csv,copy',
    colvis: true,
    stripe: true,
    state:  true,   // salva estado no localStorage (requer id na tabela)
});

HTML nas células

Badges, links e botões funcionam normalmente. O sort e a busca usam o textContent visível — marque colunas de ação com nosort: true para evitar ordenação por HTML.

Outros métodos

const tabela = document.querySelector('#tabela');

Y2Table.reload(tabela);           // recarrega (útil após mutação externa)
Y2Table.search(tabela, 'SP');     // busca programática (atualiza o campo)
Y2Table.export(tabela, 'csv');    // baixa tabela.csv
Y2Table.export(tabela, 'copy');   // copia para clipboard

// Acesso direto — instância
const inst = tabela._y2TabInst;
console.log(inst.cur);      // página atual
console.log(inst._hidden);  // Set de índices de colunas ocultas

Eventos

tabela.addEventListener('yd:table:page',   e => console.log('Página:', e.detail.page));
tabela.addEventListener('yd:table:sort',   e => console.log('Sort:', e.detail.col, e.detail.dir));
tabela.addEventListener('yd:table:search', e => console.log('Busca:', e.detail.query));

9. PHP — foreach com HTML

O Y2Table lê o conteúdo de cada <td> preservando o HTML interno. Badges, botões de ação, links e qualquer elemento renderizado pelo PHP funcionam normalmente — inclusive no sort e na busca (que usa o texto visível, não o HTML).

Básico — foreach simples:

Com busca e sort respeitando os botões:

Colunas com HTML (badges, botões) devem ter y2table-nosort — o sort usa o textContent visível, que pode ser vazio em colunas só com ícones. A busca global ignora essas colunas automaticamente se não houver texto visível.

Estilo para botões de ação nas células:

10. Quick Reference

Atributo Padrão Descrição
y2table Ativa o Y2Table no elemento <table>
y2table-per="N" 10 Linhas por página
y2table-per-opts="5,10,25" 10,25,50,100 Opções do seletor de linhas por página
y2table-search="false" true Desativa o campo de busca
y2table-sort="false" true Desativa a ordenação por colunas
y2table-stripe="false" true Desativa linhas alternadas (zebra)
y2table-export="csv,copy" Habilita botões de exportação (CSV e/ou Copiar)
y2table-select Adiciona coluna de checkboxes para seleção de linhas
y2table-colvis Adiciona botão para mostrar/ocultar colunas
y2table-state Salva estado (per, sort, busca, colunas ocultas) no localStorage
y2table-url="/api/..." Endpoint para modo server-side AJAX
y2table-cols='[...]' Definição de colunas JSON para modo AJAX [{"label":"Nome","field":"nome"}]
y2table-nosort (no <th>) Desabilita ordenação nesta coluna específica
y2table-novis (no <th>) Impede que esta coluna seja ocultada pelo colvis
yd:table:page Evento ao mudar de página — detail: { page }
yd:table:sort Evento ao ordenar — detail: { col, dir }
yd:table:search Evento ao buscar — detail: { query }
yd:table:select Evento ao selecionar linhas — detail: { selected }