Visões salvas e carregamento contínuo
Duas opções de tabela que nascem desligadas e se ligam na aba Tabelas de
/admin/configuracoes-da-aplicacao, sem deploy:
| Opção | O que faz | Pacote |
|---|---|---|
| Visões salvas | o usuário grava o recorte da listagem (filtros, busca, ordenação, agrupamento e colunas) com um nome e volta a ele num clique | sehsah/filament-remember-table |
| Carregamento da tabela | em vez de páginas numeradas, a tabela cresce por rolagem ou por um botão Carregar mais | asignua/filament-infinite-scroll |
Os dois saíram da terceira rodada de estudo de pacotes do kit, que avaliou cinco plugins e adotou três — o terceiro é a extensão de PHPStan descrita em Qualidade de código. Os dois que ficaram de fora, e por quê, estão em Pacotes instalados.

A mesma animação em tema escuro

Visões salvas
Com a opção ligada, toda listagem do kit (usuários, organizações, convites, agentes de IA, papéis, projetos, execuções de IA e pacotes do Composer, nos três painéis) ganha o botão Visões no cabeçalho, antes de Criar.
O que uma visão guarda
Filtros, busca, buscas por coluna, ordenação, agrupamento, as colunas visíveis e a ordem delas, e a
aba ativa da listagem. Não guarda dados: é um recorte, aplicado sobre o que o usuário já pode
ver. A largura das colunas continua sendo do resized-column, e o último recorte usado continua
sendo lembrado na sessão (opção Lembrar filtro, busca e ordenação) — as visões são vários
recortes, com nome, no banco.
Para quem
Salvar, atualizar, gerenciar e limpar exigem a permissão Usar:VisoesDeTabela, concedida a
papéis na tela de papéis. Numa instalação nova, os papéis de administração dos três painéis a
recebem; o usuário comum (panel_user) não — o administrador concede, se quiser. Aplicar uma
visão que o usuário já vê não exige permissão.
De quem é cada visão
| Regra | O que acontece |
|---|---|
| Dono | uma visão pertence a quem a gravou e à listagem em que foi gravada; só o dono atualiza, renomeia, reordena ou apaga |
| Organização | no painel de organização, a visão pertence à organização aberta: não aparece em outra, nem para o mesmo usuário |
| Padrão | o usuário marca uma visão como padrão e ela abre sozinha com a listagem (a menos que a URL já traga filtro, busca, ordenação, agrupamento ou aba) |
| Compartilhada | com a opção Compartilhar com todos ligada nas configurações, o dono pode marcar a visão como compartilhada: todo usuário do painel (na organização, todo membro dela) a vê e aplica, com o rótulo Compartilhada; só o dono a altera |
| Link | a visão aplicada vai na URL (?view=12): o link abre a listagem já naquele recorte para quem puder vê-la |
| Modificada | mudou o filtro depois de aplicar uma visão? O botão passa a mostrar Nome (modificada) e oferece Atualizar visão atual ao dono |
| Robustez | filtro, coluna, agrupamento ou aba que deixou de existir é ignorado ao aplicar; coluna nova aparece normalmente |
| Limite | até 50 visões por usuário em cada listagem |
| Tema claro | Tema escuro |
|---|---|
Desligar não apaga
Desligar a opção esconde o botão e as ações em toda listagem; as visões gravadas ficam no banco e voltam quando a opção é religada. Com a opção desligada, nenhuma consulta de visão é feita.
Numa listagem sua
Resource novo criado no seu projeto entra com duas linhas na página de listagem, como manda Depois de criar resources:
use App\Filament\Concerns\VisoesDeTabela;
class ListProdutos extends ListRecords{ use VisoesDeTabela;
protected function getHeaderActions(): array { return [ ...$this->getTableViewActions(), CreateAction::make(), ]; }}Visões pré-definidas em código (filtros fixos que todo mundo vê, sem poder editar) são um
recurso do pacote que o kit não embarca: implemente getPresetTableViews() na sua página, conforme a
documentação do remember-table. Resource de plugin de terceiro fica sem o botão — não há como
editar a página dele.
Carregamento da tabela
Um campo de três valores, que vale para toda tabela dos três painéis, inclusive as dos plugins:
| Valor | Como a tabela carrega |
|---|---|
| Paginação (o padrão) | as páginas numeradas de hoje; nada muda |
| Rolagem infinita | o próximo bloco carrega sozinho quando o fim da tabela entra na tela |
| Botão “Carregar mais” | o próximo bloco carrega no clique |
Em qualquer um dos dois modos contínuos:
- cada bloco tem o tamanho de Linhas por página (a opção ao lado, na mesma aba);
- o rodapé mostra Mostrando 10 de 120 enquanto há mais, e Todos os 120 registros foram carregados no fim;
- busca, filtro, ordenação, agrupamento ou troca de aba reiniciam no primeiro bloco;
- há um teto de 500 linhas na tela: ao chegar nele o rodapé pede busca ou filtro para restringir a lista;
- o seletor “registros por página” some, porque é o modo que decide o tamanho;
- seleção, ações em massa e agrupamento continuam funcionando — a tabela continua sendo uma só consulta, com mais linhas.

A mesma animação em tema escuro

| Rolagem infinita (claro) | Rolagem infinita (escuro) |
|---|---|
| Botão “Carregar mais” (claro) | Botão “Carregar mais” (escuro) |
|---|---|
O modo contínuo só vale para a paginação padrão do Filament. Uma tabela que troque para paginação
simples ou por cursor (paginationMode() no table() do recurso) não ganha o rodapé e, com o
carregamento em rolagem ou botão, fica presa na primeira página: o hook do pacote reinicia a página
em todo request. Nenhuma tabela do kit usa esses modos; se o seu projeto precisar deles, mantenha o
carregamento em paginacao.
Configuração
Na aba Tabelas de /admin/configuracoes-da-aplicacao:
| Opção | O que define | Nasce |
|---|---|---|
| Carregamento da tabela | Paginação, Rolagem infinita ou Botão "Carregar mais" |
Paginação |
| Visões salvas | o botão Visões nas listagens do kit | desligado |
| Compartilhar visões com todos | a opção Compartilhar com todos ao salvar e ao gerenciar (só aparece com as visões ligadas) | desligado |
As três existem no .env como semente e plano B — KIT_TABELA_CARREGAMENTO
(paginacao, rolagem ou botao; outro valor cai em paginacao), KIT_TABELA_VISOES_SALVAS e
KIT_TABELA_VISOES_COMPARTILHADAS — e, como no restante da aba, o banco vence o .env. Mais
detalhes em Configurações do kit.
| Aba Tabelas (claro) | Aba Tabelas (escuro) |
|---|---|
Os cinco pacotes avaliados e o critério
O critério da rodada foi um só: o pacote agrega valor ao kit se entrega uma capacidade que o kit não tem, cabe no que o kit já é (multi-organização, sem tema customizado do Filament, PHPStan nível 8, toda opção desligável nas configurações) e pode ser embrulhado num ponto só do código. Veredito por pacote, com o motivo e o que reabriria a decisão:
sehsah/filament-remember-table— ADOTAR: visões salvas com escopo por organização e sem blade própria.asignua/filament-infinite-scroll— ADOTAR: um macro noconfigureUsing()global, governado pela aba Tabelas.happenv-com/filament-phpstan-macros— ADOTAR (só em desenvolvimento): o macro novo é tipado sem exceção nophpstan.neon.spiggle/list-view— RECUSAR. Motivo: o modo lista reconstrói as colunas (badge, lightbox e colunas custom do kit não sobrevivem), a preferência fica na sessão sem organização e o kit já empilha linha em cartão no celular. Reabrir quando: um projeto do kit pedir lista alfabética com iniciais no desktop.happenv-com/filament-saved-views— RECUSAR. Motivo: o mesmo requisito doremember-table, sem escopo por organização e com blade própria em utilitárias Tailwind que exige tema customizado do Filament. Reabrir quando: oremember-tablefor abandonado, ou o kit adotar tema customizado e o pacote ganhar escopo por organização.
Tema escuro
Os dois recursos acompanham o tema do painel sem configuração: o botão, os modais e as badges das visões são componentes do Filament, e o rodapé do carregamento contínuo tem a cor escura na folha do próprio pacote. As imagens desta página mostram os dois temas.
Custo por requisição
- Visões desligadas: zero consulta a mais em qualquer listagem.
- Visões ligadas: quatro consultas pequenas na abertura da listagem (a lista de visões do usuário, a visão padrão e duas verificações de “tem visão própria?” que decidem se Gerenciar aparece) e três a cada atualização seguinte da tabela. Todas filtram por tabela e usuário, com índice.
- Carregamento contínuo: cada bloco é um request que reexecuta a consulta da tabela com um
LIMITmaior, mais a contagem total — é assim que o pacote mantém seleção e agrupamento numa consulta só. O bloco redesenha todas as linhas já carregadas, não só as novas: numa listagem que consulta algo por linha (papéis, avatar), esse custo cresce com o total na tela, e é por isso que o teto de 500 linhas existe. ComPaginação, nada muda.